Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Паскаль. Работа со списками (http://www.tehnari.ru/f41/t94048/)

Kimster 25.01.2014 00:21

Паскаль. Работа со списками
 
Доброго времени суток.
Имеется задача:
------
Цитата:

4)В банке данных о получении пособий на детей находятся три поля:
1-ое поле: ФИО рабочих
2-ое поле: количество детей
3-е поле: даты рождения (год, месяц, число) детей.
Определить, сколько пособий на своих детей получает каждый рабочий (дети старше 18 лет пособие не получают). Определить рабочего, получающего максимальное пособие.
Выполнено.
Цитата:

13. Запрограммировать следующие процедуры и функции:
а) перезапись из файла в массив,
б) поиск записи по двум полям в массиве с занесением найденных записей в новый файл,
в) добавление записи в конец файла,
г) поиск записи с изменением одного из полей записи в файле,
д) вывод файла,
е) построение диаграммы по одному из полей записи.
Вывод файла организован, добавление записи в конец файла не работает почему-то (ошибка записи).
-----
Прошу помощи с этой темой tehno036

Код:

uses crt;

const
 nowadays = 2013;
 n = 10;

type
 datar = record
          den: 1..31;
          mes: 1..12;
          god: 1900..nowadays;
        end;
 rabotnic = record
            fio: string;
            koldet: 1..10;
            data: array [1..10] of datar;
            end;

var
 ftext: text;
 ftip: file of rabotnic;
 j,i,pMax: Byte;
 p: boolean;
 c:Char;

procedure Vvod;
var t:rabotnic;
begin
 reset(ftext);
 rewrite(ftip);
 while not eof(ftext) do
  with t do
  begin
    readln(ftext, fio);
    read(ftext,koldet);
    for i:=1 to koldet do
    read(ftext, data[i].god, data[i].mes, data[i].den);
    readln(ftext);
    write(ftip, t);
  end;
 close(ftext);
 close(ftip);
end;

procedure WrInf(t:rabotnic);
begin
 writeln('FIO: ',t.fio);
 writeln('Kolichestvo detey: ',t.koldet);
 write('data: ');
 for i:=1 to t.koldet do
  write(t.data[i].den,'.',t.data[i].mes,'.',t.data[i].god,' ');
 writeln;
end;

Procedure LOG3;
var j ,i:integer;
t:rabotnic;
begin
writeln ('Vvedite novuyu zapis  fio , rost, god');
t.fio:='';
Readln(t.fio);
for i:=1 to 30-length(t.fio) do
t.fio:=t.fio+' ';
readln(t.koldet);
{readln(t.data[i].den,t.data[i].mes,t.data[i].god); }
reset(ftip);
for j:=0 to  filesize(ftip)-1 do begin
      seek(ftip,j);
      read(ftip,t);
      write(ftip,t);
      end;
seek(ftip,j);
write(ftip,t);
end;

Procedure MaxPos;
var
 t:rabotnic;
 k:Byte;
 NameMax: string;

begin
 reset(ftip);
 pMax:=0;
 repeat
  read(ftip,t);
  k:=0;
  for i:=1 to t.koldet do
    if (nowadays - t.data[i].god)<18 then inc(k);
  writeln('Rabochiy ', t.fio:40,' ',k, ' posobiy(a)');
  if k>pMax then
  begin
    pMax:=k;
    NameMax:=t.fio;
  end;
 until EoF(ftip);
 Close(ftip);
 writeln('Max kol posobij = ',pMax,' u ', NameMax);
end;

begin
 ClrScr;
 assign(ftext, 'record.txt');
 assign(ftip, 'ftip.rec');
 Vvod;
 MaxPos;
 LOG3;
end.


Vladimir_S 25.01.2014 09:08

Во-первых, попрошу поаккуратнее с терминологией: в Паскале "список" - это вполне определенная динамическая структура в виде массива (стека) записей, одно из полей которых есть указатель с адресацией следующего элемента, а во-вторых, эта задача уже разбиралась здесь: http://www.tehnari.ru/f41/t92738/ и повторно впрягаться в нее у меня как-то вот желания нет.
P.S. Между прочим, в приведенном здесь коде я без труда узнал перекатанные фрагменты своей же программы, выложенной по ссылке, правда, с добавлением некоей процедуры LOG3 взамен моей (работающей!) AddRec. Ну что же, если Вас не устраивает то, как эта часть задачи была решена у меня и Вы хотите по-своему - в добрый путь! Только мы-то тут при чем?

Kimster 25.01.2014 13:03

Я не вижу, чтобы я выдал это за свою программу, и да, я в курсе о той теме, и также в курсе, что это ваша программа, в которую я добавил свою попытку записи файла. В любом случае спасибо за ответ.


Часовой пояс GMT +4, время: 03:27.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.