Помощь - Поиск - Пользователи - Календарь
Полная версия: Прошу помощи. (тип данных запись)
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
CormiX
Очень прошу помочь с решением даной задачи:

Багаж пассажира характеризуется количеством и общим весом вещей. Создать файл f, содержащий информацию о багаже n пассажиров. Информацию о багаже вывести на экран в виде таблицы. Выяснить пассажира багаж которого состоит из 1-го чемодана весом менее z килограмм.
CormiX
Ну вот я кое что сделал, но как видите это еще нужно внести в файл и сделать так чтоб инфо о пасажирах виводилась на экран в виде таблицы.
program avia;
uses crt;
type
dani=record
imya:string;
vaga_re4ej:byte;
kiljkistj_re4ej:integer;
end;
pasazhur=array [0..100] of dani;
var
vaga_re4ej:byte;
Q:pasazhur;
k:byte;
f:file of dani;
n,m,i,j,z :integer;
begin
textcolor(yellow);
textbackground(black);
clrscr;
k:=0;
writeln('vveditj kiljkistj pasagyriv'); readln(n);
for i:=1 to n do
with q[i] do
begin
writeln('Vveditj dani pro ',i,'-go pasazhura');
writeln('Imja');
readln(imya);
writeln('Kiljkistj re4ej');
readln(kiljkistj_re4ej);
writeln('Vaga');
readln(vaga_re4ej);
end;

writeln('vvedu vagu valizy'); readln(m);
for i:=1 to n do
if q[i].vaga_re4ej>m
then writeln( q[i].imya) ;

readln;

end.
Ozzя
Цитата
нужно внести в файл

Assign(f,'data.dat');
ReWrite(f);
for i:=1 to n do
begin
with q[i] do
begin
writeln('Vveditj dani pro ',i,'-go pasazhura');
writeln('Imja');
readln(imya);
writeln('Kiljkistj re4ej');
readln(kiljkistj_re4ej);
writeln('Vaga');
readln(vaga_re4ej);
end;
write(f,q[i]);
end;
close(f);

CormiX
Disc read error....:
program Sumki;
uses crt;
type
dani=record
imya:string;
vaga_re4ej:byte;
kiljkistj_re4ej:integer;
end;
pasazhur=array [0..100] of dani;
var
vaga_re4ej:byte;
Q:pasazhur;
f:file of dani;
n,m,i,j,z :integer;
BEGIN
textcolor(yellow);
textbackground(black);
clrscr;
assign(f,'data.dat');
rewrite(f);
for i:=1 to n do
begin with q[i] do begin
writeln('Vveditj dani pro ',i,'-go pasazhura');
writeln('Imja');
readln(imya);
writeln('Kiljkistj re4ej');
readln(kiljkistj_re4ej);
writeln('Vaga');
readln(vaga_re4ej);
end;
write(f,q[i]);
end;
reset(f);
read(f,q[i]);
writeln('Vvedu vagu re4ey jaku tobi potribno znaty:'); readln(m);
for i:=1 to n do
if q[i].vaga_re4ej=m
then writeln( q[i].imya);
readln;
repeat until keypressed;
END.
volvo
У тебя элементарно N = 0, файл остается пустым, ты его переоткрываешь и хочешь что-то прочесть. И что будет? Ошибка, как положено...
CormiX
Аммм....А что надос сделать? Присвоить N значение и записать в файл?
Lapp
Цитата(CormiX @ 24.03.2010 21:44) *
Аммм....А что надос сделать? Присвоить N значение и записать в файл?
Это на твое усмотрение. Можешь, например, запрашивать количество пассажиров перед вводом данных. Или же можно определять конец ввода, например, по пустому имени. В последнем случае FOR следует заменить на REPEAT, а n тогда просто не нужно (при вводе).

Еще у тебя ошибка при чтении: ты считываешь только одну запись. Следует читать в цикле while not EoF(f) do , тогда прочтешь все записи. В процессе чтения увеличивай n, начав с 0.

И еще: дай пользователю возможность выбрать, что он будет делать: вводить данные в файл или читать файл и обрабатывать данные. Иначе выходит, что программа действительно создает файл и оставляет его на диске, но потом при новом запуске СРАЗУ его стирает. Где смысл?..
CormiX
Спасибо всем! Сделал!
CormiX
Простите за беспокойство но мне б еще с табличкой помочь.
Я сделал таблицу, ну не совсем с помошью gotoxy. А теперь не знаю как запустить цыкл, чтоб в таблицу входил не тролько 1-ый пассажир.
program Operation Valiza;
uses crt;
type
dani=record
imya:string;
vaga_re4ej:byte;
kiljkistj_re4ej:integer;
end;
pasazhur=array [0..100] of dani;
var
vaga_re4ej:byte;
Q:pasazhur;
f:file of dani;
n,m,i,j,z :integer;
BEGIN
textcolor(yellow);
textbackground(black);
clrscr;
writeln('Vveditj kiljkistj pasagiriv:');
readln(n);
assign(f,'data.dat');
rewrite(f);
for i:=1 to n do with q[i] do
begin
writeln('Vveditj dani pro ',i,'-go pasazhura');
writeln('Imja:');
readln(imya);
writeln('Kiljkistj valiz:');
readln(kiljkistj_re4ej);
writeln('Vaga:');
readln(vaga_re4ej);
write(f,q[i]);
end;
reset(f);
while not EoF(f) do begin
read(f,q[i]);
end;
for i:=1 to n do begin
textcolor(0);
textbackground(5);
clrscr;
gotoxy(32,1); writeln('Tablica Informacji:');
gotoxy(20,4); writeln('Imja:');
gotoxy(37,4); writeln('Valizy:');
gotoxy(54,4); writeln('Vaga Valiz:');
textcolor(white);
gotoxy(20,i*+4+6); write(q[i].imya);
gotoxy(37,i*+4+6); write(q[i].kiljkistj_re4ej);
gotoxy(54,i*+4+6); write(q[i].vaga_re4ej);
repeat until keypressed;
end;
begin
clrscr;
writeln('Vvedu vagu re4ey jaku tobi potribno znaty:'); readln(m);
for i:=1 to n do
if q[i].vaga_re4ej=m
then writeln(q[i].imya);
readln;
end;
END.
Lapp
Цитата(CormiX @ 25.03.2010 19:04) *
Простите за беспокойство но мне б еще с табличкой помочь.
Я сделал таблицу, ну не совсем с помошью gotoxy. А теперь не знаю как запустить цыкл, чтоб в таблицу входил не тролько 1-ый пассажир.
Беспокойства нет никакого, для того и форум )).
Послушай, ты чересчур увлекся модулем CRT с его малиновыми цветами, позиционным выводом и - главное! - очисткой экрана. Тебе она ТАК понравилась, что ты как только что-то выведешь - так сразу и стираешь! smile.gif Зачем ты вставил clrscr в цикл вывода? Убери.

Я тебе больше скажу, только ты не обижайся smile.gif. Забудь пока (на время) вообще про всякие TextColor и GoToXY. Позаботься о ЛОГИКЕ программы. Красивости (если не расхочется) будешь наводить потом. CRT - это ЗЛО, и зло немалое.. За этими глупостями ты не видишь главного. Я тебе в прошлый писал, что НЕТ СМЫСЛА записывать файл, если ты его СТИРАЕШЬ СРАЗУ после входа в программу. Ну, сам посуди - кому такой файл нужен?? Но ты не счел нужным обратить внимание на мои слова ((.

Я тебе набросал образец, как приблизительно надо делать. К сожалению, совсем без CRT обойтись не удается, поскольку в этом модуле по какой-то странной причине еще и управление клавиатурой. Но я использую только ReadKey из него, обрати на это внимание. Сначала тебе, может быть, покажется, что это не очень красиво, но потом (немного поигравши с этой простейшей прогой) ты поймешь, что так гораздо лучше. Стирать экран нецелессобразно иногда, лучше его проматывать. Представь себе, что у тебя число пассажиров превышает количество строк на экране - что ты будешь делать? Если ты сейчас ответил "листать постранично", то, извини, с того и следует начинать, что делать всю эту кухню. И за ней ты забудешь про основную задачу.. А тем не менее, простейшими средствами типа Write и WriteLn можно добиться очень неплохих результатов. И обычная промотка окна командной строки позволит просмотреть таблицу любого размера.

Постарайся разобраться с моим кодом. Если что-то неясно - спрашивай. Тут есть начальная функциональность. Что еще нужно - можно добавить.

И еще: обрати МАКСИМАЛЬНОЕ ВНИМАНИЕ на форматирование (сдвиги). Вникни в то, как у меня сделано - там КАЖДАЯ строчка и каждое слово на СВОЕМ месте. Будешь соблюдать эти простые правила - будешь находить свои ошибки (типа той же очистки экрана в цикле) в несколько раз быстрее.

Давай, успехов тебе.
uses
crt;

const
c1= 10;
c2= 20;
c3= 15;
c4= 20;
Filename= 'passazh.dat';

type
tPassazhir=record
imya: string;
vaga: byte;
kilkist: integer;
end;

var
f: file of tPassazhir;
pass: array [1..100] of tPassazhir;
n: integer;


procedure AddRecord;
BEGIN
Inc(n);
with pass[n] do begin
write('Imja: ');
readln(imya);
write('Kiljkistj valiz: ');
readln(kilkist);
write('Vaga: ');
readln(vaga);
end
end;


procedure DelRecord;
var
i: integer;
begin
Write('Vvedite nomer zapisi dlya udaleniya (0 dlya otkaza): ');
ReadLn(i);
if i>0 then begin
for i:=i to n-1 do pass[i]:=pass[i+1];
Dec(n);
WriteLn('Zapis udalena')
end
end;


procedure ClearBase;
begin
n:=0;
WriteLn('Vse zapisi udaleny');
end;


function IStr(i: integer): string;
begin
Str(i,IStr)
end;


function FillStr(c: char; i: integer): string;
var
s: string;
begin
s:='';
while Length(s)<i do Insert(c,s,1);
FillStr:=s
end;


procedure FillStr(c: char; s1,s2,s3,s4: string);
begin
WriteLn(c,s1:c1,c,s2:c2,c,s3:c3,c,s4:c4)
end;


function CenterStr(s: string; l: integer):string;
begin
CenterStr:= s+FillStr(' ',(l-Length(s))div 2)
end;


procedure ShowBase;
var
i: integer;
begin
WriteLn;
WriteLn('+',FillStr('=',c1+c2+c3+c4+3),'+');
WriteLn('|',CenterStr('Baza Dannyh Bagazha Passazhirov',c1+c2+c3+c4+3):c1+c2+c3+c4+3,'|');
WriteLn('+',FillStr('-',c1+c2+c3+c4+3),'+');
Write('|',CenterStr('Nomer',c1):c1);
Write('|',CenterStr('Imja',c2):c2);
Write('|',CenterStr('Valizy',c3):c3);
Write('|',CenterStr('Vaga Valiz, kg',c4):c4);
WriteLn('|');
Write('|',FillStr('-',c1));
Write('+',FillStr('-',c2));
Write('+',FillStr('-',c3));
Write('+',FillStr('-',c4));
WriteLn('|');
for i:=1 to n do with pass[i] do begin
Write('|',CenterStr(IStr(i),c1):c1);
Write('|',CenterStr(imya,c2):c2);
Write('|',CenterStr(IStr(kilkist),c3):c3);
Write('|',CenterStr(IStr(vaga),c4):c4);
WriteLn('|');
end;
WriteLn('+',FillStr('-',c1+c2+c3+c4+3),'+');
end;


procedure ReadFile;
begin
assign(f,FileName);
ReSet(f);
while not EoF(f) do begin
Inc(n);
read(f,pass[n])
end;
Close(f);
WriteLn('File '+FileName+' prochitan');
end;


procedure WriteFile;
var
i: integer;
begin
assign(f,Filename);
rewrite(f);
for i:=1 to n do write(f,pass[i]);
Close(f);
WriteLn('File '+FileName+' zapisan');
end;

var
c: char;

begin
n:=0;
repeat
WriteLn('Dobavitj Udalitj Ochistitj Pokazatj Read Write Exit');
c:=ReadKey;
case UpCase© of
'D': AddRecord;
'U': DelRecord;
'O': ClearBase;
'P': ShowBase;
'R': ReadFile;
'W': WriteFile;
'E',#27: begin
WriteLn('Rabota s programmoi zavershena');
Exit
end;
else WriteLn('Nevernyi vybor')
end
until false
END.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.