Помощь - Поиск - Пользователи - Календарь
Полная версия: Прошу помощи. (тип данных запись)
Форум «Всё о Паскале» > 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(c) 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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.