Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2018, 21:11   #1
Topse
Пользователь
 
Регистрация: 24.10.2017
Сообщений: 10
По умолчанию Поправить программу - поправить процедуры и сделать из глобальных переменных - локальные

Код:
Type
  rec=record
   FIO:string[30];
   Vozr:integer;
   adress:string[30];
  end;
 mas=array[1..10] of rec;
 
Var
 f:text;
 e1,j,Min_age,k:integer;
 m:mas;
 
Procedure inp(var a:mas);
var i:integer;
begin
  readln(f,a[i].FIO);
  readln(f,a[i].Vozr);
  readln(f,a[i].adress);
end;
Procedure output(var a:mas);
var i:integer;
begin
  Inc(i);
  writeln(f,a[i].FIO);
  writeln(f,a[i].Vozr);
  writeln(f,a[i].adress);
end;
procedure find (var a:mas);
var i:integer;
begin
 Min_age:=100;
 for i:=j to e1 do
  With m[j] do
   if (Vozr<Min_age) and (Vozr>=20) and (Vozr<=30) then
    begin
     k:=j;
     Min_Age:=Vozr;
    end;
    end;
Begin
 assign(f,'file.txt');
 reset(f);
 close(f);
 inp(m,e1);
 output(m,e1);
 find(m,e1);
 
 Writeln('Результат:');
 Writeln(m[k].FIO);
 Writeln(m[k].Vozr);
 Writeln(m[k].adress);
 Readln
End.
Нужно поправить процедуры и сделать из глобальных переменных - локальные. (из-за этого программа не работает, не знаю в чем проблема)
p.s из списка file.txt должен выводиться работник с мин.возрастом, который попадает в диапазон 20-30 лет.
Пожалуйста. Буду благодарен.file.txt

Последний раз редактировалось Topse; 11.03.2018 в 21:13.
Topse вне форума Ответить с цитированием
Старый 11.03.2018, 21:58   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Например - у вас объявлено:
Код:
Procedure inp(var a:mas);
а вызывается -
Код:
 inp(m,e1);
Так сколько же на самом деле агрументов(параметров) у inp ?
Либо 1 - если весь массив вводится, либо 2 - если одна запись.
И чему у вас равно e1 ?
type_Oleg вне форума Ответить с цитированием
Старый 12.03.2018, 10:10   #3
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Вообще каша какая-то, а не программа. Вот
Код:
Procedure inp(var a:mas);
var i:integer;
begin
  readln(f,a[i].FIO);
 .....

Procedure output(var a:mas);
var i:integer;
begin
  Inc(i);
- локальная переменная i с хрен знает каким значением начинает активно использоваться.
digitalis вне форума Ответить с цитированием
Старый 13.03.2018, 13:54   #4
Topse
Пользователь
 
Регистрация: 24.10.2017
Сообщений: 10
По умолчанию

Чуть внятней объясню что должна делать программа и содержать в себе:
Что должна делать программа: Из прикрепленного списка "File.txt" должен выводиться работник с мин.возрастом, который попадает в диапазон 20-30 лет.
Что должна содержать в себе программа:
1. На каждое действие должна быть процедура, т.е процедура Входная, выходная, поиска.
2. Переменные должны быть НЕ глобальные, а локальные..
Как-то так..буду благодарен за помощь.
Topse вне форума Ответить с цитированием
Старый 13.03.2018, 14:50   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

проблема в том, что Вы и без процедур рабочую программу не написали.
а теперь из нерабочего кода пытаетесь выделить отдельные процедуры.
естественно, что у Вас не получается.

1. Какой у Вас компилятор Паскаля? (просто файл file.txt в виндузовской кодировке, поэтому, можно предположить, что речь идёт о Pascal ABC или Pascal ABC.NET)

2. Куда должен выводиться результат поиска?
что должна делать процедура Output ?

3. Почему Вы не хотите написать программу? Поверьте, это азбука.
Если это не освоите, дальше программировать будет намного сложнее. или вообще невозможно.
кому эта ваша учёба нужна - нам или Вам?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.03.2018, 15:44   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

ну, молчите, значит, ответить нечего.
ну и ладно.
я чуток развлёкся.

держите код:
Код:

const
  MaxArraySize = 10;
Type
  rec=record
   FIO:string[30];
   Vozr:integer;
   adress:string[30];
  end;
  TMas=array[1..MaxArraySize] of rec;


Procedure ReadFromTextFile(const FName : string;var a: Tmas; var n : integer);
var
 f:text;
begin
  n := 0;
  assign(f, FName);
  reset(f);
  while Not Eof(f) and (n<MaxArraySize) do begin
    inc(n);
    readln(f,a[n].FIO);
    if Not Eof(f) then readln(f,a[n].Vozr) else  a[n].Vozr := 0;
    if Not Eof(f) then readln(f,a[n].adress) else a[n].adress := '';
  end;
  if (n=MaxArraySize) and Not Eof(f) then
    WriteLn('Предупреждение! В файле больше строк, чем размер массива ( записей больше ',MaxArraySize,')');
  Close(f)
end;

Procedure OutputArrayToScreen(a: Tmas; n : integer);
var i:integer;
begin
  WriteLn('Содержимое:');
  for i:=1 to 77 do Write('-'); WriteLn;
  for i:=1 to n do
    writeln('|',i:2,'| ',a[i].FIO:30,' | ',a[i].Vozr:3,' | ',a[i].adress:30,' | ');
  for i:=1 to 77 do Write('-'); WriteLn;
end;

procedure find (a: Tmas; n : integer; var indexMinAge_20_30 : integer );
var i:integer;
begin
 indexMinAge_20_30 := -1;
 for i:=1 to n do
   if (a[i].Vozr>=20) and (a[i].Vozr<=30) then begin
      if indexMinAge_20_30<0 then indexMinAge_20_30 := i
      else
         if a[indexMinAge_20_30].Vozr>a[i].Vozr
            then indexMinAge_20_30 := i

   end;
end;

const
  TextFileName = 'file_w.txt';
Var
 m: Tmas;
 Count : integer;
 indexMinAge:integer;

Begin
 ReadFromTextFile(TextFileName, m, Count);

 OutputArrayToScreen(m, Count );

 find(m, Count, indexMinAge);

 if indexMinAge<0 then WriteLn('Нет подходящих данных - нет работников в диапазоне 20-30 лет.')
 else begin
   Writeln('Результат - работник с мин.возрастом из диапазона 20-30 лет:');
   Writeln(m[indexMinAge].FIO);
   Writeln(m[indexMinAge].Vozr);
   Writeln(m[indexMinAge].adress);
 end;

 WriteLn('Для выхода нажмите ENTER');
 Readln
End.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.03.2018, 18:42   #7
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Как сказал бы Serge_Bliznykov, "здесь вам не решатель задач"
digitalis вне форума Ответить с цитированием
Старый 13.03.2018, 18:45   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
"здесь вам не решатель задач"
точно.

Повезло кому-то...
Но хочу отметить, что тут исходно какой-никакой код от ТС был, я его только переставил в правильном порядке и чуток подправил
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.03.2018, 19:44   #9
Topse
Пользователь
 
Регистрация: 24.10.2017
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Почему Вы не хотите написать программу? Поверьте, это азбука.
Кто сказал что я не хочу? Как видите выше по коду - пытался..
Topse вне форума Ответить с цитированием
Старый 15.03.2018, 20:01   #10
Topse
Пользователь
 
Регистрация: 24.10.2017
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Если это не освоите, дальше программировать будет намного сложнее. или вообще невозможно.
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ну, молчите, значит, ответить нечего.
ну и ладно.
я чуток развлёкся.

держите код:
Код:

const
  MaxArraySize = 10;
Type
  rec=record
   FIO:string[30];
   Vozr:integer;
   adress:string[30];
  end;
  TMas=array[1..MaxArraySize] of rec;


Procedure ReadFromTextFile(const FName : string;var a: Tmas; var n : integer);
var
 f:text;
begin
  n := 0;
  assign(f, FName);
  reset(f);
  while Not Eof(f) and (n<MaxArraySize) do begin
    inc(n);
    readln(f,a[n].FIO);
    if Not Eof(f) then readln(f,a[n].Vozr) else  a[n].Vozr := 0;
    if Not Eof(f) then readln(f,a[n].adress) else a[n].adress := '';
  end;
  if (n=MaxArraySize) and Not Eof(f) then
    WriteLn('Предупреждение! В файле больше строк, чем размер массива ( записей больше ',MaxArraySize,')');
  Close(f)
end;

Procedure OutputArrayToScreen(a: Tmas; n : integer);
var i:integer;
begin
  WriteLn('Содержимое:');
  for i:=1 to 77 do Write('-'); WriteLn;
  for i:=1 to n do
    writeln('|',i:2,'| ',a[i].FIO:30,' | ',a[i].Vozr:3,' | ',a[i].adress:30,' | ');
  for i:=1 to 77 do Write('-'); WriteLn;
end;

procedure find (a: Tmas; n : integer; var indexMinAge_20_30 : integer );
var i:integer;
begin
 indexMinAge_20_30 := -1;
 for i:=1 to n do
   if (a[i].Vozr>=20) and (a[i].Vozr<=30) then begin
      if indexMinAge_20_30<0 then indexMinAge_20_30 := i
      else
         if a[indexMinAge_20_30].Vozr>a[i].Vozr
            then indexMinAge_20_30 := i

   end;
end;

const
  TextFileName = 'file_w.txt';
Var
 m: Tmas;
 Count : integer;
 indexMinAge:integer;

Begin
 ReadFromTextFile(TextFileName, m, Count);

 OutputArrayToScreen(m, Count );

 find(m, Count, indexMinAge);

 if indexMinAge<0 then WriteLn('Нет подходящих данных - нет работников в диапазоне 20-30 лет.')
 else begin
   Writeln('Результат - работник с мин.возрастом из диапазона 20-30 лет:');
   Writeln(m[indexMinAge].FIO);
   Writeln(m[indexMinAge].Vozr);
   Writeln(m[indexMinAge].adress);
 end;

 WriteLn('Для выхода нажмите ENTER');
 Readln
End.
Благодарю Вас.
Topse вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поправить программу. kartez25-17 Паскаль, Turbo Pascal, PascalABC.NET 4 16.12.2014 21:42
Помогите поправить программу пожалуйста GrafVir Фриланс 4 05.06.2014 13:49
я написал помогите поправить программу с++ Оег Помощь студентам 0 14.04.2014 02:25
Поправить программу для загрузки файлов. Klychkov Свободное общение 11 14.10.2009 22:36
Помогите поправить программу! Массивы в С++ progser_ua Помощь студентам 1 03.02.2009 14:07