Помощь - Поиск - Пользователи - Календарь
Полная версия: помогите найти ошибку,плз, прога с файлом
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Гость
народ, пожалуйста помогите вот с чем...
вот задание:
(-----------------------------------------------------------------------------)
1. Создать на диске типизированный файл произвольного доступа с записями заданной структуры.
2. Для созданного файла предусмотреть возможность:
– изменения выбранного поля некоторой записи;
– удаления выбранной записи с последующим уменьшением размеров файла;
– добавления записи в произвольное место файла;
– вывода содержимого файла в виде таблицы;
– выполнения указанного в варианте задания;
– удаления всего файла при завершении работы программы.
Структура записи:
- отделение банка;
- фамилия вкладчика;
- номер счета;
- сумма вклада.
Определить вкладчика заданного отделения банка с наибольшей суммой вклада
(---------------------------------------------------------------------------------)

у меня что-то не работает вот это: "Определить вкладчика заданного отделения банка с наибольшей суммой вклада" помогите испарвить или найти ошибку плз


program file13;
uses crt;
type bank = record
otdelenie: integer;
surname : string[20];
Number: integer;
summa :integer;
end;

var f : file of bank;mass: array[1..5] of bank;
end_menu: boolean; vid: byte;
Name : string [20]; num_array: 1..5;

procedure Name_File;
begin
write ('enter name of file...');
readln (Name);
end;
{------------}
procedure AddRec;
begin
writeln ('VVod zapisi', Filepos(f)+1);
with mass[Num_array] do
begin write ('vvedite nomer otdeleniya banka:');
readln (otdelenie);
write ('vvedite surname:');
readln (surname);
write ('vvedite nomer s4eta:');
readln (Number);
write ('vvedite summy vklada:');
readln (summa);
write (f, mass[Num_array]);
end;
end;
{------------}
procedure Create_bank_file;
var
ind :integer;
begin
Name_File;
Assign (f,Name );
rewrite (f);
writeln ('sozdanie zapisej fajla',Name);
for ind:= 1 to 5 do
addRec;
writeln ('sozdanie Fajla zaverweno');
writeln ('file have ', FileSize (f),' records');
close (f);
end;
{------------}
procedure OutputRec;
begin
read (f,mass[num_array]);
with mass[Num_array] do
begin
writeln ('|',filepos(f):7,' |',otdelenie:8,' |',surname:8,' |',number:5,' |',summa:6,' |');
end;
end;
{------------}
procedure outputALLRec;
begin
Name_File;
assign (f,Name);
Reset (f);
if IOresult = 0 then begin
seek (f,0);
writeln ('*** Vivod infi o vklad4ikah iz fajla ', Name,'***');
writeln ('| Nomer zapisi | otdelenie | surname | Number | summa |');
while (not Eof (f)) do outputRec;
end
else writeln (' Fajla s imenem ',Name,' na diske net');
end;
{------------}
procedure UpdateRec;
var NumRec: Longint;
begin
Name_File;
assign (f, name);
reset (f);
if IOresult = 0 then
begin
write ('ykagite nomer izmenyaemoj zapisi:');
readln (Numrec);
seek (f,Numrec-1);
writeln ('..staroe zna4enie zapisi.. :');
outputRec;
seek (f, Numrec-1);
writeln ('zadaem novoe zna4enie ' , Numrec,' zapisi');
addrec;
close (f);
end
else
writeln ('Fajla s imenem ', Name, ' na diske net');
end;
{------------}
procedure AddrecToEnd;
begin
Name_File;
assign (F,Name);
reset (f);
if IOresult = 0 then
begin
seek( f, Filesize (f));
Addrec;
writeln ('izmenennij file dannih imeet vid ' ,Filesize(f), ' zapisi');
close (f);
end
else writeln ('fajla s imenem ' , Name,' na diske net');
end;
{------------}
procedure max_summ;
var otdelenie: byte; max :integer;
begin
Name_file;
assign(f,name);
reset(f);
if IOresult = 0 then begin
writeln ('vvedite nomer otdeleniya banka:');
readln (otdelenie);
max:= mass[1].summa;
for num_array:=1 to 5 do
if mass[num_array].otdelenie = otdelenie then begin
if mass[num_array].summa>max then max:=mass[num_array].summa;
end;
end;
writeln ('vklad4ik s naibolwej summoj:');
writeln (max);
end;
{------------}
procedure exitpr;
begin
erase (f);
end_menu := true;
end;
{------------}
begin
clrscr;
end_menu:= false;
repeat
writeln ('***Menu banka***');
writeln ('viberete pynkt');
writeln ('1- create new file');
writeln ('2- prosmotr');
writeln ('3- izmenenie zapisi');
writeln ('4- dopolnenie zapisi');
writeln ('5- vklad4ik zadannogo otdeleniya s naibolwej summoj vklada');
writeln ('0- exit and delete file');
writeln ('BaIII Bbl6op:');
readln (vid);
case vid of
1: Create_bank_file;
2: outputallRec;
3: updaterec;
4: addrectoend;
5: max_summ;
0: exitpr;
end;
writeln ('Dlya prodolgeniya nagmite "ENTER"');
readln;
clrscr;
until End_Menu
end.

volvo
Во-первых, ты в процедуре outputALLRec не закрываешь файл, то есть, если после ее вызова попытаться вызвать max_summ, то программа скорее всего вылетит.

Ну, а во-вторых - логическая ошибка. Ты делаешь:
writeln ('vvedite nomer otdeleniya banka:');
readln (otdelenie);
max:= mass[1].summa; { <--- !!! }

По какому праву? Ты что, уверен, что в первом элементе массива содержится клиент с заданным тобой номером отделения? Я бы вообще переписал эту процедуру, чтоб она работала с файлом, а не с массивом:

procedure max_summ;
var
otdelenie: integer; { <--- Описал в типе Bank как Integer - вот и пусть будет Integer }
max :integer;
R: bank;
begin
Name_file;
assign(f,name);
{$i-}
reset(f);
{$i+}
if IOresult = 0 then begin
writeln ('vvedite nomer otdeleniya banka:');
readln (otdelenie);
max:= 0;
while not eof(f) do begin
read(f, R);
if R.otdelenie = otdelenie then
if R.summa > max then max := R.summa;
end;
close(f);
end;
writeln ('vklad4ik s naibolwej summoj:');
writeln (max);
end;



И вообще неплохо было бы избавиться от массива, у тебя работа с файлом, а не с массивом, все-таки...
Гость
просто, я сначала сделал без массива, но тоже с ошибкой, мне мои знакомые сказали, что так с массивом легче, я переписал на массив, ну, лан, спасибо большое, ща попробую сделать без массива
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.