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

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

Форум «Всё о Паскале» _ Задачи _ Файлы

Автор: Zundell 20.12.2006 19:32

Дали нам домой 5 задач,4 сделал,а вот одна не получается...по всякому пробовал,но ниче не получилось(
Текст задания:Создать файли из N целых чисел.Найти число повторяющееся максимальное колличество раз.Если таких несколько то все из них.Записать эти числа в другой файл и там отсортировать(без разницы как).

вот мои попытки нахождения maxимальных:


Var
f,:f1file of integer;
a:real;
i,n,k,b,c,j:integer;
begin
assign(f,'abs.dat');assign(f1,'absd.dat');
rewrite(f);
read(n);
for i:=1 to n do
begin
write('a=');
read(a);
write(f,a);
end;
close(f);
end;
reset(f);rewrite(f1);
k:=0;
for i:=0 to fileseze(f)-1 do
begin
seek(f,i);
read(f,c);
for j:=i+1 to filesize(f)-1 do
begin
seek(f,j);
read(f,b);
if b=c then do
inc(k);
end;
write(f1);
end;
close(f1);


помогите пожалуйста

Автор: мисс_граффити 20.12.2006 22:09

есть такая идея (код писать не стала, потому что она мне не очень нравится - должен быть способ лучше).

пока не конец первого файла
считали элемент, запомнили его номер, пошли вниз до конца файла считать его количество.

если количество больше запомненного ранее максимума, то
begin
максимум присвоить это количество
очистка второго файла
запись в него найденного числа
end
если количество равно максимуму
дописываем число в файл

переход на след. элемент

сортировка.

например:
у нас есть файл 1 2 3 2 5 6 2
считали 1. дошли до конца файла - встречается один раз. записали во второй файл единичку, максимум:=1
2 встречается 3 раза. очистили файл, записали в него двоечку. максимум:=3
3 - один раз. ничего не делаем
2 - два раза (идем только вниз!). ничего не делаем. вот это место мне и не нравится - лишний подсчет.
5 - один раз
6 - один раз
2 - один раз

Автор: Zundell 20.12.2006 22:43

да...казалось бы простенькая задача((

Автор: мисс_граффити 20.12.2006 22:54

да она в таком варианте по алгоритму и несложная получается.
мне не нравятся лишние затраты по времени...

Автор: Zundell 20.12.2006 23:03

так нет...как ты написала,мы запоминаем число повторений,а как теперь связать это число повторений с числом которое повторяется(ведь нам его(их) отсортировать нужно.

Автор: мисс_граффити 20.12.2006 23:11

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

Автор: Zundell 20.12.2006 23:16

unsure.gif не особо понял!немоглабы ты написать пожалуйста нахождение этого максимального и его запись,а сортировку я знаю как делать..100раз делал это и сложностей там не возникает((а вот с первой частью ступор..((

Автор: мисс_граффити 20.12.2006 23:46

как-то так

assign(f,'fail.in');
{zapolnenie ishodnogo faila}
rewrite(f);
for i:=1 to n do
begin
max:=random(10);
write(f,max);
write(max:3);
end;
close(f);

assign(f1,'fail.out');
rewrite(f1);
reset(f);
max:=0;
while not(EOF(f)) do
begin
read(f,i);
kolvo:=1;
posicion:=filepos(f);
while not(EOF(f)) do
begin
read(f,tek);
if tek=i then
inc(kolvo);
end;
if kolvo>max then
begin
close(f1);
rewrite(f1);
write(f1,i);
max:=kolvo;
end
else
if kolvo=max then
write(f1,i);
seek(f,posicion);
end;
close(f);
close(f1);

иногда даже работает

Автор: Zundell 21.12.2006 0:07

как я понимаю,прога должна рандомно вводить значения,но она ниче не вводит,попросту не заполняет((пачмуэт может быть?все переменные задал,все как нада

Автор: мисс_граффити 21.12.2006 0:12

выложи полный код, как это у тебя выглядит.

Автор: Zundell 21.12.2006 0:15

Никакой сортировки еще не делал,то,что ты написала:


var
f,f1:file of integer;
a:integer;
i,n,max,kolvo,posicion,tek:integer;
begin
assign(f,'fail.in');
rewrite(f);
for i:=1 to n do
begin
max:=random(10);
write(f,max);
writeln(max:3);
write(f,a);
end;
close(f);
assign(f1,'fail.out');
rewrite(f1);
reset(f);
max:=0;
while not(EOF(f)) do
begin
read(f,i);
kolvo:=1;
posicion:=filepos(f);
while not(EOF(f)) do
begin
read(f,tek);
if tek=i then
inc(kolvo);
end;
if kolvo>max then
begin
close(f1);
rewrite(f1);
write(f1,i);
max:=kolvo;
end
else
if kolvo=max then
write(f1,i);
seek(f,posicion);
end;
close(f);
close(f1);
readln;
end.



Автор: мисс_граффити 21.12.2006 0:29

вот лишь бы меня обвинить dry.gif
1) что за а левое появилось?
2) и чему у тебя n равно к моменту запуска цикла

for i:=1 to n do
?
скорее всего 0, цикл и не срабатывает.

Автор: Zundell 21.12.2006 0:31

извиняюсь извиняюсь..полностью моя ошибка))

Автор: Zundell 21.12.2006 0:44

вот...я прально говорил,при выводе на печать он показывает сколько раз каждое число повторялось!вот:
0 2
0 1
8 выводит 1
2 2
2 1

а как же терь переписать в другой файл,что именон 0 и 2 повторяется max число раз и в том файле находились только они?нипанятна((извиняюсь за тупость и надоедливость..но оч хочется разобраться

ввожу 00822 выводит 21121

Автор: мисс_граффити 21.12.2006 0:47

что ты с ней сотворил???
исходная последовательность: 9 8 9 7 7 9 7 8 3 5
в файле получаю 9 7

не знаю, что, где и главное - зачем ты выводишь на печать.

Автор: Zundell 21.12.2006 0:50

чтобы посмотреть,что получается....а если не выводить,то как узнать,что там находится 7,9 или чтото другое?

Автор: мисс_граффити 21.12.2006 0:55

выводить.
но уже из файла...
то есть ПОСЛЕ выполнения всех действий, описанных мной, а не внутри цикла

Автор: Zundell 21.12.2006 1:09

что ты воводишь,что у тебя показывает эти числа?

Автор: мисс_граффити 21.12.2006 1:12

я ничего не ввожу.
исходная последовательность генерируется рэндомно... какая получилась при том запуске - я написала.

Автор: Zundell 21.12.2006 1:20

неет..чтоб показывало числа,которые мы отобрали(повторяющиеся max число раз)

Автор: мисс_граффити 21.12.2006 1:24

не поняла, чего ты от меня добиваешься.
я вот так тестировала (код полностью)

program chisla;
uses crt;
const n=10;
var
f,f1: file of integer;
i,tek,posicion,max,kolvo: integer;
begin
clrscr;
randomize;
assign(f,'fail.in');
{zapolnenie ishodnogo faila}
rewrite(f);
for i:=1 to n do
begin
max:=random(10);
write(f,max);
write(max:3);
end;
close(f);

assign(f1,'fail.out');
rewrite(f1);
reset(f);
max:=0;
while not(EOF(f)) do
begin
read(f,i);
kolvo:=1;
posicion:=filepos(f);
while not(EOF(f)) do
begin
read(f,tek);
if tek=i then
inc(kolvo);
end;
if kolvo>max then
begin
close(f1);
rewrite(f1);
write(f1,i);
max:=kolvo;
end
else
if kolvo=max then
write(f1,i);
seek(f,posicion);
end;

close(f);
close(f1);
writeln;
writeln(max);
reset(f1);
while not(EOF(f1)) do
begin
read(f1,i);
write(i:3);
end;
end.

Автор: Zundell 21.12.2006 1:38

Спасибо тебе большое,readln над было паставить))все, я все 5 задач сделал,сортировку вообще элементарна!Завтра препод проверит,выложу все 5 задач,может кому пригодяться! give_rose.gif