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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2014, 18:34   #1
Тетрадь
Пользователь
 
Регистрация: 03.11.2013
Сообщений: 37
По умолчанию Типизированный файл. Помогите доработать. Паскаль

Программу написал, но нужно написать с типизированным файлом. Постоянно какие то ошибки. Да и сам как работать с файлом. Можете доработать, и если не сложно дать пояснения, что да как. Паскаль АВС

Опишите, используя структуру данных запись, школьный класс (фамилия и инициалы, дата рождения, месяц рождения, год рождения). Составьте программу, выдающую "День рождения класса" (среднее арифметическое дат и месяцев).
Код:
unit op;
interface
const maxk=10;
type klass = record
             secname:string[20];
             io:string[5];
                        day:1..31;
                        month:1..12;
                        year:1995..2007;
             end;
type school=array[1..maxk] of klass;
klas = file of klass;
implementation
end.
Код:
unit obrabotki;
interface
uses op;
 
procedure vvod(var f:klas);
procedure vivod(var sd:school; var f:klas);
procedure count(var sd:school);
implementation
 
procedure vvod(var f:klas);
var
sd:school;
i,n:integer;
d:klass;
begin
rewrite(f);
repeat
writeln('Введите количество учеников:');
readln(n);
until n in [1..maxk];
for i := 1 to n do
                begin
                writeln('Ученик:',i);
                with sd[i] do
                            begin
                            write('Фамиия ученика: ');
                            readln (secname);
                            write('Инициалы: ');
                            readln(io);
                            write('Введите день: ');
                            readln(sd[i].day);
                            write('Введите месяц: ');
                            readln(sd[i].month);
                            write('Введите год рождения:');
                            readln(sd[i].year);
                            write(f,d);
end;
end;
close(f);
end;
procedure vivod(var sd:school; var f:klas);
var i,n:integer;
d:klass;
begin
reset(f);
writeln('-----------------------------');
writeln('Ученик':10,'Дата':10);
writeln('-----------------------------');
for i:=1 to n do
begin
read(f,d);
write(sd[i].secname:5);
write(' ',sd[i].io:3);
write('  ',sd[i].day:2);
write('.',sd[i].month:2);
writeln('.',sd[i].year:4);
end;
write('--------------------------------');
end;
procedure count(var sd:school);
var q,w,i,n:integer; z,x:real;
begin
q:=0;
w:=0;
     begin
q:= q+sd[i].day;
w:= w+sd[i].month;
  end;
z := q/10;
x := w/10;
write(z);
write(' ',x);
end;
end.
Код:
unit op;
interface
const maxk=10;
type klass = record
             secname:string[20];
             io:string[5];
                        day:1..31;
                        month:1..12;
                        year:1995..2007;
             end;
type school=array[1..maxk] of klass;
klas = file of klass;
implementation
end.
Тетрадь вне форума Ответить с цитированием
Старый 07.04.2014, 20:35   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

позволил себе чуть подправить ваш код

op.pas
Код:
unit op;
interface
const maxk=10;
type klass = record
             secname:string[20];
             io:string[5];
                        day:1..31;
                        month:1..12;
                        year:1995..2007;
             end;
type
  school = array[1..maxk] of klass;
  klas = file of klass;

var
  NRecord : integer;
implementation
begin
  NRecord := 0;
end.
obrabotki.pas
Код:
unit obrabotki;
interface
uses op;

procedure vvod(const FileName: string);
procedure ReadFromFile(var sd: school; const FileName: string);
procedure vivod(var sd: school);
procedure count(var sd: school);
implementation

procedure vvod(const FileName: string);
var f: klas;
  i, n: integer;
  d: klass;
begin
  Assign(f, FileName);
  repeat
    writeln('Введите количество учеников:');
    readln(n);
  until n in [1..maxk];
  rewrite(f);
  for i := 1 to n do
  begin
    writeln(i, '-й ученик: ');
    with d do begin
      write('Фамиия ученика: ');
      readln(secname);
      write('Инициалы: ');
      readln(io);
      write('Введите день: ');
      readln(day);
      write('Введите месяц: ');
      readln(month);
      write('Введите год рождения:');
      readln(year);
      write(f, d);
    end;
  end;
  close(f);
end;

procedure ReadFromFile(var sd: school; const FileName: string);
var f: klas;
  i: integer;
begin
  Assign(f, FileName);
  Reset(f);
  NRecord := FileSize(f);
  for i := 1 to NRecord do Read(f, sd[i]);
  Close(f);
end;

procedure vivod(var sd: school);
var
  i: integer;
begin
  writeln('-----------------------------');
  writeln('Ученик': 10, 'Дата': 10);
  writeln('-----------------------------');
  for i := 1 to NRecord do
  begin
    write(sd[i].secname: 5);
    write(' ', sd[i].io: 3);
    write('  ', sd[i].day: 2);
    write('.', sd[i].month: 2);
    writeln('.', sd[i].year: 4);
  end;
  write('--------------------------------');
end;

procedure count(var sd: school);
var q, w, i, n: integer; z, x: real;
begin
  if NRecord < 1 then Exit;
  WriteLn;
  q := 0;
  w := 0;
  for i:=1 to NRecord do
  begin
    q := q + sd[i].day;
    w := w + sd[i].month;
  end;
  z := q / NRecord;
  x := w / NRecord;
  WriteLn(' Average date: ',z:0:0, ' ', x:0:0);
end;
end.
KlassMain.pas
Код:
program KlassMain;

uses op, obrabotki;

const
  MyDateFileName = 'FileKlas.dat';
  
var
  sh : school;
  
begin
  if Not FileExists(MyDateFileName) then  vvod( MyDateFileName );
  ReadFromFile( sh, MyDateFileName );
  vivod( sh );
  count( sh );
end.
Если есть вопросы - спрашивайте...

Последний раз редактировалось Serge_Bliznykov; 07.04.2014 в 20:39.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.04.2014, 08:25   #3
Тетрадь
Пользователь
 
Регистрация: 03.11.2013
Сообщений: 37
По умолчанию

Не совсем понял для чего "procedure ReadFromFile" можете дать пояснения, для чего и что в ней? Можно ли без нее?
Тетрадь вне форума Ответить с цитированием
Старый 08.04.2014, 09:35   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Тетрадь Посмотреть сообщение
Не совсем понял для чего "procedure ReadFromFile" можете дать пояснения, для чего и что в ней? Можно ли без нее?
Цитата:
Код:
procedure ReadFromFile(var sd: school; const FileName: string);
процедура ReadFromFile читает из файла с именем FileName (имя передаётся в процедуру) все записи в массив sd (первый параметр процедуры).
И эта же процедура заносит количество прочитанных записей в глобальную переменную NRecord (эта переменная определена в модуле OP.PAS). Чтобы мы знали, сколько у нас реально записей в массиве sd


Без этой процедуры можно обойтись. Но где-то всё равно нужно прочитать записи в массив sd.
Ну, или отказаться вообще от использования данного массива.
Никто не мешает каждый раз, когда нужны записи открывать файл, читать от туда по одной записи и обрабатывать.
Я же решил, что раз Вы описали массив записей и вывод информации на экран происходит не из файла, а из массива, значит, Вам нужен этот массив...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.04.2014, 15:59   #5
Тетрадь
Пользователь
 
Регистрация: 03.11.2013
Сообщений: 37
По умолчанию

Попробовал написать без массива, но почему то выдал ошибку, можете взглянуть.
Код:
program pro1;

uses op, obrabotki;

var
sved:klass;

begin
vvod(sved);
vivod(sved);
  count(sved);
end.
Код:
unit obrabotki;
interface
uses op;

procedure vvod(var sved:svedd);
procedure vivod(var sved:svedd);
procedure count(var sved:svedd);
implementation

procedure vvod(var sved:svedd);
var
  i, n: integer;
  lepsved: svedd;
begin
     rewrite(sved);
  repeat
    writeln('Введите количество учеников:');
    readln(n);
  until n in [1..maxk];
  for i := 1 to n do
  begin
    writeln(i, '-й ученик: ');
    with lepsved do begin
      write('Фамиия ученика: ');
      readln(secname);
      write('Инициалы: ');
      readln(io);
      write('Введите день: ');
      readln(day);
      write('Введите месяц: ');
      readln(month);
      write('Введите год рождения:');
      readln(year);
      write(sved, lepsved);
    end;
  end;
  close(sved);
end;


procedure vivod(var sved:svedd);
var
  i,n: integer;
  lepsved:svedd;
begin
reset(sved);
  writeln('-----------------------------');
  writeln('Ученик': 10, 'Дата': 10);
  writeln('-----------------------------');
  read(sved,lepsved);
  with lepsved do begin

    write(lepsved.secname: 5);
    write(' ', lepsved.io: 3);
    write('  ', lepsved.day: 2);
    write('.', lepsved.month: 2);
    writeln('.',lepsved.year: 4);
  end;
  write('--------------------------------');
  close(sved);
end;

procedure count(var sved:svedd);
var q, w, i, n: integer; z, x: real;
lepsved:svedd;
begin
reset(sved);
read(sved,lepsved);
  WriteLn;
  q := 0;
  w := 0;
  for i:=1 to n do
  begin
    q := q + lepsved.day;
    w := w + lepsved.month;
  end;
  z := q / n;
  x := w / n;
  WriteLn(' Average date: ',z:0:0, ' ', x:0:0);
  close(sved); assign(sved,'lep_zar');
  end;
end.
Код:
unit op;
interface
const maxk=10;
type klass = record
             secname:string[20];
             io:string[5];
                        day:1..31;
                        month:1..12;
                        year:1995..2007;
             end;
svedd = file of klass;
implementation
end.
Тетрадь вне форума Ответить с цитированием
Старый 08.04.2014, 16:28   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

сейчас под рукой нет компилятора PascalABC.
Какую ошибку выдал компилятор и на какой строке?
(можно словами, можно скриншот)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.04.2014, 16:41   #7
Тетрадь
Пользователь
 
Регистрация: 03.11.2013
Сообщений: 37
По умолчанию

вот эта ошибкаСнимок.PNG
Тетрадь вне форума Ответить с цитированием
Старый 08.04.2014, 17:46   #8
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Var
Lepsved:klass;
А не
Lepsved:svedd;
Запись у вас klass, a svedd это file of klass
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 08.04.2014, 18:34   #9
Тетрадь
Пользователь
 
Регистрация: 03.11.2013
Сообщений: 37
По умолчанию

Спасибо, а почему когда выводит таблицу о учениках, он выводит только первого ученика? дальше не идет
Тетрадь вне форума Ответить с цитированием
Старый 08.04.2014, 19:51   #10
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

А вы одного и выводите.
Код:
Reset(sved);
While not eof(sved) do
  Begin
     //здесь вывод таблицы
  End;
Close(sved);
ZX Spectrum-128 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать типизированный файл (Паскаль АВС) kushnir-lena Паскаль, Turbo Pascal, PascalABC.NET 0 31.05.2012 19:46
Типизированный файл с анкетами студентов (Паскаль) Pyxy Помощь студентам 2 23.12.2011 10:08
Типизированный файл. Паскаль Iskorka92 Паскаль, Turbo Pascal, PascalABC.NET 2 28.11.2011 09:41
Типизированный файл с натуральными числами. Числа, встречающиеся 1 раз переписать в другой файл [Паскаль] mifomen Помощь студентам 7 16.12.2010 22:00