IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> помогите найти ошибку,плз, прога с файлом
сообщение
Сообщение #1


Гость






народ, пожалуйста помогите вот с чем...
вот задание:
(-----------------------------------------------------------------------------)
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.



Сообщение отредактировано: klem4 -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Во-первых, ты в процедуре 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;



И вообще неплохо было бы избавиться от массива, у тебя работа с файлом, а не с массивом, все-таки...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






просто, я сначала сделал без массива, но тоже с ошибкой, мне мои знакомые сказали, что так с массивом легче, я переписал на массив, ну, лан, спасибо большое, ща попробую сделать без массива
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 17.10.2021 11:15
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name