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