Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Не могу найти ошибку

Автор: Zundell 22.01.2007 4:13

I. Удалить из внешнего файла все записи, удовлетворяющие условию, заданному в варианте, и распечатать информацию, оставшуюся в файле.
II. Добавить N записей в конец внешнего файла

я так понял,что добавить необходимо в первоначальный вариант введенных данных,а не в тот файл,где находятся записи подходящие нашему условию.
Условие такого:удалить тех у кого отличные оценки и в аттестате и при вступительных экзаменах,а добавить например 2-х человек,а затем распечатать тех,кто сдал вступительные экзамены на 4 и 5(я так понял из все вообще введенных студентов,т.е изначальные+добавленные)!Заранее всем огромное спасибо! yes2.gif

вот мой код:

uses crt;
type abit=record
fio:string[20];
godrow:integer;
godokon:integer;
at_mat:integer;
at_rus:integer;
at_fiz:integer;
Obwaga:char;
ab_mat:integer;
ab_rus:integer;
ab_fiz:integer;
end;
var
f,f1:file of abit;
s,r1,r:abit;
ch:char;
i,k,n,m:integer;
key1,key2:boolean;

procedure Vvod;
begin
with s do
begin
writeln;
writeln('______');
writeln('Vvedite dannue o ',i,'-m abiture:');
writeln('_______');
writeln('vvedite FIO:');
readln(Fio);
writeln('Vvedite God rowd:');
readln(godrow);
writeln('Vvedite god okonch wkolu:');
readln(godokon);
writeln;
writeln('Vvedite ozenki attestata:');
writeln('matematika:');
readln(at_mat);
writeln('Russkij:');
readln(at_rus);
writeln('fizika');
readln(at_fiz);
writeln;
key1:=false;
writeln('Nuwna obwaga:[y/n]');
readln(obwaga);
if (obwaga in ['Y','y','N','n']) then key1:=true;
writeln;
writeln('Vvedite ozenki vstupit ekzov:');
writeln('matematika');
readln(ab_mat);
writeln('Russkij');
readln(ab_rus);
writeln('fizika');
readln(ab_fiz);
write(f1,r);
end;
end;

procedure udal;
var
i,j:integer;
begin
reset(f1);
for i:=1 to filesize(f1) do
with r do begin
if (at_mat<>5) and (at_rus<>5) and (at_fiz<>5) and (ab_mat<>5) and (ab_rus<>5)
and (ab_fiz<>5) then
write(f,s);
end;
end;


procedure Vivod;
begin
reset(f);
while not eof(f) do
begin
read(f,s);
with s do begin
writeln('|',fio,'|',godrow,'|',godokon,'|',at_mat,'|',at_rus,'|',at_fiz,'|',ab_mat,'|',ab_rus,'|',ab_fiz,'|',obwaga,'|');
end;
end;
close(f);
end;

Procedure sortirovka;
var
i,j,n:integer;
f:text;
begin
reset(f1);
n:=filesize(f1)-1;
for i:=0 to n do begin
for j:=0 to n-1 do begin
seek(f1,j);
read(f1,r);
read(f1,r1);
with s do begin
if r.at_fiz>r1.at_fiz then
begin
seek(f1,j);
write(f1,r1);
write(f1,r);
end;
end;
end;
end;
close(f1)
end;

procedure dobav;
var
j,i,k:integer;
c:char;
l:boolean;
begin
reset(f1);
writeln('Dobavit tovar?,Esli da,to nawmite Y,esli net to lubuju knopko');
readln©;
i:=0;
while c='y' do
begin
i:=i+1;
with r1 do
begin
writeln('vvedite FIO:');
readln(Fio);
writeln('Vvedite God rowd:');
readln(godrow);
writeln('Vvedite god okonch wkolu:');
readln(godokon);
writeln;
writeln('Vvedite ozenki attestata:');
writeln('matematika:');
readln(at_mat);
writeln('Russkij:');
readln(at_rus);
writeln('fizika');
readln(at_fiz);
writeln;
key1:=false;
writeln('Nuwna obwaga:[y/n]');
readln(obwaga);
if (obwaga in ['Y','y','N','n']) then key1:=true;
writeln;
writeln('Vvedite ozenki vstupit ekzov:');
writeln('matematika');
readln(ab_mat);
writeln('Russkij');
readln(ab_rus);
writeln('fizika');
readln(ab_fiz);

end;
k:=0;
reset(f1);
l:=false;
while (not eof(f1)) do
begin
read(f1,r);
k:=k+1;
if r.at_fiz=r1.at_fiz then
begin
seek(f1,k-1);
for j:=(k-1) to filesize(f)-2 do
begin
seek(f1,j+1);
read(f1,r);
seek(f1,j);
write(f1,r);
end;
seek(f1,filesize(f1)-1);
truncate(f1);
write(f1,r1);
l:=true;
end;
end;
if l=false then
begin
seek(f1,filesize(f1));
write(f1,r1);
end;
writeln('Dobavit tovar?Ecli da,to nawmite Y,esli net to lubuju knopku');
readln©;
end;
clrscr;
close(f1);
end;

procedure Vivod2;
begin
reset(f1);
while not eof(f1) do
begin
read(f1,r);
with r do begin
writeln('|',fio,'|',godrow,'|',godokon,'|',at_mat,'|',at_rus,'|',at_fiz,'|',ab_mat,'|',ab_rus,'|',ab_fiz,'|',obwaga,'|');
end;
end;
close(f1);
end;





begin
clrscr;
assign(f1,'zad8.dat');
rewrite(f1);
writeln('Programmu vupolnyal student 1-ogo kursa Zimin Egor');
writeln('_____________________________________________________');
writeln(' ');
writeln('vvedite kol tovarov-');
readln(n);
for i:=1 to n do
begin
vvod;
end;
close(f1);
assign(f,'zad8.dat');
rewrite(f);
udal;
vivod;
dobav;
vivod2;
readln;
end.









Автор: мисс_граффити 22.01.2007 4:25

Цитата
удалить тех у кого отличные оценки и в аттестате и при вступительных экзаменах

а ты пытаешься удалять что-то совсем не то:
with r do begin   if (at_mat<>5) and (at_rus<>5) and (at_fiz<>5) and (ab_mat<>5) and (ab_rus<>5)  and (ab_fiz<>5) then  write(f,s);

по идее, после этого могли бы остаться только те, кто не имеет ни одной пятерки.
"могли бы остаться" - потому что я не понимаю, как может работать udal.
ты хочешь читать из одного файла, а при необходимости писать в другой? можешь ткнуть пальцем в место, где ты читаешь запись? (где пишешь - сама вижу).
З.Ы. на будущее - форматированием кода не пренебрегай. сильно облегчает чтение.
З.З.Ы. и тестовый файлик хорошо бы... rolleyes.gif zad8.dat... заполненный....

Автор: volvo 22.01.2007 4:26

В чем глубинный смысл вот этой процедуры:

procedure udal;
var
i,j:integer;
begin
reset(f1);
for i:=1 to filesize(f1) do
with r do begin { <--- Вроде проверяем R }
if (at_mat<>5) and (at_rus<>5) and (at_fiz<>5) and (ab_mat<>5) and (ab_rus<>5)
and (ab_fiz<>5) then
write(f,s); { <--- Но записываем в файл S }
end;
end;
?

Автор: мисс_граффити 22.01.2007 4:27

только заметила.
как думаешь, что после

assign(f,'zad8.dat');  rewrite(f);
останется в файле?

Автор: Zundell 22.01.2007 4:35

To Volvo, я хотел так сделать...сначала я вводил информацию и записывал ее в (f1,r)!далее мысль в том,чтобы в файле (f1,r) проверить на условие все находящиеся там записи,те которые не удовлетворяют записать в другой файл,который уже вывести на печать!а далее уже добавлять че нам там нада.

To мисс,да,эт я лохонулся...файл ведь очиститься полностью((Мне нужно удалить тех кто удовлетворяет условию,а вывести кто остался неудволетворенным smile.gif

Автор: мисс_граффити 22.01.2007 5:23

ну, в общем, разбирайся с условием, которое я тебе выделила.
и с чтением из первого файла...

Автор: Zundell 22.01.2007 20:35

Можно вопрос?Вот например я ввел нное колличество записей в файл,так...далее я проверяю на какое-либо условие...если данная запись удовлетворяет условию,то она записывается в другой файл!Теперь вопрос,а запись записанная в другой файл,останется в изначальном файле?или безвозвратно перепишется?Заранее спасибо

Автор: мисс_граффити 22.01.2007 22:01

Останется, конечно.
Представь: ты взял учебник и некоторые параграфы (удовлетворяющие определенным условиям) переписываешь в тетрадку....

Автор: Zundell 22.01.2007 22:16

А можно подругому удалить удовлетворяющее условие?не способом переписывания в другой файл!

Автор: мисс_граффити 22.01.2007 22:38

Можно. Например, если порядок не критичен, можно на место удаляемой записи написать последнюю из файла, а последнюю отсечь...

Автор: Zundell 22.01.2007 22:54

Панятна,ааа нет...но ведь мне еще нужно ко ВСЕМ записям первоначальным добавить еще новые,но как я добавлю,если я перепишу?извиняюсь за занудство

Автор: мисс_граффити 22.01.2007 22:59

blink.gif

Цитата
I. Удалить из внешнего файла все записи, удовлетворяющие условию, заданному в варианте, и распечатать информацию, оставшуюся в файле. II. Добавить N записей в конец внешнего файла

Я так понимаю, удаляем лишнее, а потом к результату добавляем N записей.
Соответственно, алгоритм может быть такой: открываем старый файл для чтения, новый для записи. Переписываем нужное.
Удаляем старый. Переименовываем новый.
Начинаем добавлять N записей.

Автор: Zundell 22.01.2007 23:35

нет..нада вывести файл с удаленным лишним!а добавить нада к нетронотому файлу..первоначально введенному и его тоже вывести!

Автор: мисс_граффити 23.01.2007 1:20

ну тогда так:
все, что не надо удалять, пишешь в новый файл. в итоге имеешь 2 файла - один - неизменный старый, к которому будешь добавлять, а второй новый - содержащий только подходящие записи.

или, если не хочешь с 2 файлами возиться, то так:

type abit=record  
fio:string[20];
godrow,godokon,at_mat,{все старые поля}:integer;
delete: boolean;
end;

то есть каждая запись будет содержать метку - удалена она или нет. соответственно, ты, с одной стороны, можешь к ней обратиться - а с другой, понятно, что она удалена и в новый файл не входит.

Автор: Zundell 23.01.2007 1:36

панятна..спасибо!Щя все сделаю