Консультация № 177885
17.04.2010, 12:16
0.00 руб.
0 8 1
Здравствуйте, уважаемые эксперты. Помогите, пожалуйста, решить задачу на Delphi.


Составить две программы с использованием типов "запись" и "файл" для решения задачи.

Телефонный справочник содержит данные об абонентах: фамилия, номер телефона (число формата xxyy), годе установки телефона (формат аабб). Вывести данные об абонентах, у которых yy=бб.



Заранее спасибо.

Обсуждение

Неизвестный
17.04.2010, 13:03
общий
Пятаев Алексей Иванович:
Что такое "типы "запись" и "файл""? Что обозначают форматы xxyy и аабб? Можно немного поподробнее.
Неизвестный
17.04.2010, 16:06
общий
Нужно решить эту задачу, используя типы запись и файл:
Тип записи - Record
Тип файла - AssignFile

Данные об абонентах даны в массиве. В другой массив нужно вывести данные об абонентах, у которых yy=бб.

Форматы "xxyy" и "аабб" означают числа:
xxyy - номер телефона (например, 1523);
аабб - год установки телефона (например, 2001).

Нужно вывести данные об абонентах в другой массив (фамилию, номер телефона, год установки телефона), у которых yy=бб (т.е., вывести данные об абонентах, у которых 23=01).
Неизвестный
17.04.2010, 16:39
общий
Пятаев Алексей Иванович:
как в массиве будут разделены данные? (например, фамилия через запятую номер телефона еще запятая год установки)
Неизвестный
17.04.2010, 16:46
общий
Массив состоит из 3 столбцов (фамилия, номер телефона, год установки телефона).
Неизвестный
17.04.2010, 18:33
общий
Пятаев Алексей Иванович:
Цитата: 327615
Нужно вывести данные об абонентах в другой массив

Вывод должен производится тоже файл или на экран?
Неизвестный
17.04.2010, 18:42
общий
на экран.
Неизвестный
18.04.2010, 05:10
общий
это ответ
Здравствуйте, Пятаев Алексей Иванович.
Решение в приложении. Входной файл должен содержать данные типа:

Name1 1234 1234
Name2 4321 5678
Name3 3456 1256

и тп.

Приложение:
program rf5;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
Tel = record
sn: String;
num: String;
year: String;
end;
TelAr = array[1..1] of Tel;
var
inpFile: TextFile;
pTelAr, pTelAr2: ^TelAr;
telArLen, telArLen2: byte;
i: Byte;
cBuf: char;

procedure er1(line: Byte);
begin
Write('Incorrect file structure at line ', line);
FreeMem(pTelAr, telArLen * SizeOf(Tel));
Readln;
Halt;
end;

procedure er2(line: Byte);
begin
Write('Incorrect file data at line ', line);
FreeMem(pTelAr, telArLen * SizeOf(Tel));
Readln;
Halt;
end;

begin
Assign(inpFile, 'Input.txt');
try Reset(inpFile);
except
Writeln('File "Input.txt not found"');
Readln;
Exit;
end;

telArLen := 0;
while not Eof(inpFile) do begin
Readln(inpFile);
Inc(telArLen);
end;
if telArLen = 0 then begin
Write('File is empty');
Readln;
Exit;
end
else Reset(inpFile);

GetMem(pTelAr, telArLen * SizeOf(Tel));

telArLen := 0;
while not Eof(inpFile) do begin
Inc(telArLen);
pTelAr[telArLen].sn := '';
Read(inpFile, cBuf);
while cBuf <> ' ' do begin
if (cBuf = #13) or (cBuf = #10) or Eof(inpFile) then er1(telArLen);
pTelAr[telArLen].sn := pTelAr[telArLen].sn + cbuf;
Read(inpFile, cBuf);
end;
if pTelAr[telArLen].sn = '' then er1(telArLen);

pTelAr[telArLen].num := '';
Read(inpFile, cBuf);
while cBuf <> ' ' do begin
if (cBuf = #13) or (cBuf = #10) or Eof(inpFile) then er1(telArLen);
pTelAr[telArLen].num := pTelAr[telArLen].num + cBuf;
Read(inpFile, cBuf);
end;
if pTelAr[telArLen].num = '' then er1(telArLen);

pTelAr[telArLen].year := '';
Read(inpFile, cBuf);
while (cBuf <> #13) and (cBuf <> #10) do begin
if cBuf = ' ' then er1(telArLen);
pTelAr[telArLen].year := pTelAr[telArLen].year + cbuf;
if Eof(inpFile) then break;
Read(inpFile, cBuf);
end;
if pTelAr[telArLen].year = '' then er1(telArLen);
Readln(inpFile)
end;

for i := 1 to telArLen do
if (Length(pTelAr[telArLen].num) <> 4) or
(Length(pTelAr[telArLen].year) <> 4) then er2(i);

telArLen2 := 0;
for i := 1 to telArLen do
if (pTelAr[i].num[3] = pTelAr[i].year[3]) and
(pTelAr[i].num[4] = pTelAr[i].year[4]) then Inc(telArLen2);
if telArLen2 = 0 then begin
Write('Matching records not found');
FreeMem(pTelAr, telArLen * SizeOf(Tel));
Readln;
Exit;
end;

GetMem(pTelAr2, telArLen2);
telArLen2 := 0;
for i := 1 to telArLen do
if (pTelAr[i].num[3] = pTelAr[i].year[3]) and
(pTelAr[i].num[4] = pTelAr[i].year[4]) then begin
Inc(telArLen2);
pTelAr2[telArLen2].sn := pTelAr[i].sn;
pTelAr2[telArLen2].num := pTelAr[i].num;
pTelAr2[telArLen2].year := pTelAr[i].year;
end;

FreeMem(pTelAr, telArLen * SizeOf(Tel));

for i := 1 to telArLen2 do begin
Write(pTelAr2[i].sn, ' ');
Write(pTelAr2[i].num, ' ');
Writeln(pTelAr2[i].year);
end;

FreeMem(pTelAr2, telArLen2 * SizeOf(Tel));

Readln;
end.
Неизвестный
19.04.2010, 13:50
общий
Спасибо
Форма ответа