Помощь - Поиск - Пользователи - Календарь
Полная версия: Файлы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Zundell
Дали нам домой 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);


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

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

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

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

сортировка.

например:
у нас есть файл 1 2 3 2 5 6 2
считали 1. дошли до конца файла - встречается один раз. записали во второй файл единичку, максимум:=1
2 встречается 3 раза. очистили файл, записали в него двоечку. максимум:=3
3 - один раз. ничего не делаем
2 - два раза (идем только вниз!). ничего не делаем. вот это место мне и не нравится - лишний подсчет.
5 - один раз
6 - один раз
2 - один раз
Zundell
да...казалось бы простенькая задача((
мисс_граффити
да она в таком варианте по алгоритму и несложная получается.
мне не нравятся лишние затраты по времени...
Zundell
так нет...как ты написала,мы запоминаем число повторений,а как теперь связать это число повторений с числом которое повторяется(ведь нам его(их) отсортировать нужно.
мисс_граффити
мы число повторений для каждого числа не будем запоминать! мы будем запоминать только максимальное на данный момент число повторений.
а в файл писать только сами числа (которые потом сортировать). то есть в каждый момент в файле будет находиться либо ни одного числа (самое начало), либо одно число - самое частоповторяющееся, либо несколько чисел - если они повторяются одинаковое число раз.
Zundell
unsure.gif не особо понял!немоглабы ты написать пожалуйста нахождение этого максимального и его запись,а сортировку я знаю как делать..100раз делал это и сложностей там не возникает((а вот с первой частью ступор..((
мисс_граффити
как-то так
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
как я понимаю,прога должна рандомно вводить значения,но она ниче не вводит,попросту не заполняет((пачмуэт может быть?все переменные задал,все как нада
мисс_граффити
выложи полный код, как это у тебя выглядит.
Zundell
Никакой сортировки еще не делал,то,что ты написала:

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.


мисс_граффити
вот лишь бы меня обвинить dry.gif
1) что за а левое появилось?
2) и чему у тебя n равно к моменту запуска цикла
for i:=1 to n do
?
скорее всего 0, цикл и не срабатывает.
Zundell
извиняюсь извиняюсь..полностью моя ошибка))
Zundell
вот...я прально говорил,при выводе на печать он показывает сколько раз каждое число повторялось!вот:
0 2
0 1
8 выводит 1
2 2
2 1

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

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

не знаю, что, где и главное - зачем ты выводишь на печать.
Zundell
чтобы посмотреть,что получается....а если не выводить,то как узнать,что там находится 7,9 или чтото другое?
мисс_граффити
выводить.
но уже из файла...
то есть ПОСЛЕ выполнения всех действий, описанных мной, а не внутри цикла
Zundell
что ты воводишь,что у тебя показывает эти числа?
мисс_граффити
я ничего не ввожу.
исходная последовательность генерируется рэндомно... какая получилась при том запуске - я написала.
Zundell
неет..чтоб показывало числа,которые мы отобрали(повторяющиеся max число раз)
мисс_граффити
не поняла, чего ты от меня добиваешься.
я вот так тестировала (код полностью)
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
Спасибо тебе большое,readln над было паставить))все, я все 5 задач сделал,сортировку вообще элементарна!Завтра препод проверит,выложу все 5 задач,может кому пригодяться! give_rose.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.