Помощь - Поиск - Пользователи - Календарь
Полная версия: В чем ошибка?
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Wild_klas
Дан файл F, содержащий сведенья об игрушках: название, стоимость в копейках, и возрастные границы детей, для которых игрушка предназначена. Нужно получить цену самого дорогого конструктора по образцу руб. коп.

Я делал так:
Type Game = Record
       Name:String[20];
       Price:0..1000000;
       AgeMin:0..4;
       AgeMax:5..12;
     End;
     PriceList=Array [1..7] of Game;
Const
     a:PriceList=((Name:'Kykla';Price:150000;AgeMin:2;AgeMax:7;),
                  (Name:'Konstryktor';Price:195000;AgeMin:2;AgeMax:11;),
                  (Name:'Kybuku';Price:9000;AgeMin:1;AgeMax:11;),
                  (Name:'Konstryktor';Price:210000;AgeMin:2;AgeMax:12;),
                  (Name:'M`yach';Price:250000;AgeMin:2;AgeMax:12;),
                  (Name:'Konstryktor';Price:190000;AgeMin:2;AgeMax:10;),
                  (Name:'Pazlu';Price:8000;AgeMin:2;AgeMax:12;));
Var myFile:File of Game;
    G:game;
    i:integer;
    max:integer;
begin
  Assign(myFile,'f.txt');
  ReWrite(myFile);
    For i:=0 to 7 Do
       Write(MyFile,a[i]);
  CloseFile(myFile);
  FileMode:=fmOpenRead;
     Writeln('-------------------------------------------------------') ;
   Writeln('Name':25,'|','Price':20,'|','AgeMin':4,'|','Agemax':4);
   For i:=1 to 7 do
     Writeln(a[i].Name:25,'|',a[i].Price:20,'|',a[i].AgeMin:7,'|',a[i].Agemax:4);
     Writeln('-------------------------------------------------------') ;
  Reset(MyFile);
  Read(myFile,G);
  CloseFile(myFile);

  max:=0;
    For i:=0 to 7 Do
Begin
       If (G.Name='Konstryktor') and (G.Price > max) Then max:=G.Price;
       End;
     For i:=1 to 7 do
     Writeln(G.Name:25,'|',g.Price:20,'|');
     Writeln('-------------------------------------------------------') ;
   readln;

end.

В итоге у меня вместо вывода самого дорогого конструктора выходит такое:
Изображение
В чем заключается моя ошибка?
volvo
Во-первых, у тебя
Цитата
  ReWrite(myFile);
    For i:=0 to 7 Do
       Write(MyFile,a[i]);
вот тут уже ошибка. Включи, наконец, режим {$R+} (или Range-Check в настройках компилятора) !!! Ты программу отлаживаешь, а не просто так пишешь, чтоб тут же задать вопрос, "а почему оно у меня не работает?". Вылетела бы программа с ошибкой - понял бы, что обращаться к нулевому индексу там, где описано с первого - нельзя.

Второе:

Цитата
  Reset(MyFile);
  Read(myFile,G);
  CloseFile(myFile);


Вот тут ты как раз этот мусор, несуществующий элемент, ранее записанный в файл, считал из файла в переменную G...

Цитата
    For i:=0 to 7 Do
Begin
       If (G.Name='Konstryktor') and (G.Price > max) Then max:=G.Price;
       End;
     For i:=1 to 7 do
     Writeln(G.Name:25,'|',g.Price:20,'|');
И что тут делается? Зачем 8 раз по одной и тей же переменной делать проверку? Для надежности, что-ли? Тебе вообще-то надо читать из файла ВСЕ данные, в массив, и потом идти по всему массиву и проверять каждый элемент подобным образом, конструктор ли это, и какова его цена. А прочесть одну переменную, 8 раз ее проверить и потом 7 раз напечатать - это никому не нужно.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.