Дали нам домой 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:=1to n dobegin
write('a=');
read(a);
write(f,a);
end;
close(f);
end;
reset(f);rewrite(f1);
k:=0;
for i:=0to fileseze(f)-1dobegin
seek(f,i);
read(f,c);
for j:=i+1to filesize(f)-1dobegin
seek(f,j);
read(f,b);
if b=c thendo
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
не особо понял!немоглабы ты написать пожалуйста нахождение этого максимального и его запись,а сортировку я знаю как делать..100раз делал это и сложностей там не возникает((а вот с первой частью ступор..((
мисс_граффити
20.12.2006 23:46
как-то так
assign(f,'fail.in');
{zapolnenie ishodnogo faila}
rewrite(f);
for i:=1to n dobegin
max:=random(10);
write(f,max);
write(max:3);
end;
close(f);
assign(f1,'fail.out');
rewrite(f1);
reset(f);
max:=0;
whilenot(EOF(f)) dobegin
read(f,i);
kolvo:=1;
posicion:=filepos(f);
whilenot(EOF(f)) dobegin
read(f,tek);
if tek=i then
inc(kolvo);
end;
if kolvo>max thenbegin
close(f1);
rewrite(f1);
write(f1,i);
max:=kolvo;
endelseif 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:fileof integer;
a:integer;
i,n,max,kolvo,posicion,tek:integer;
begin
assign(f,'fail.in');
rewrite(f);
for i:=1to n dobegin
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;
whilenot(EOF(f)) dobegin
read(f,i);
kolvo:=1;
posicion:=filepos(f);
whilenot(EOF(f)) dobegin
read(f,tek);
if tek=i then
inc(kolvo);
end;
if kolvo>max thenbegin
close(f1);
rewrite(f1);
write(f1,i);
max:=kolvo;
endelseif kolvo=max then
write(f1,i);
seek(f,posicion);
end;
close(f);
close(f1);
readln;
end.
мисс_граффити
21.12.2006 0:29
вот лишь бы меня обвинить 1) что за а левое появилось? 2) и чему у тебя n равно к моменту запуска цикла
for i:=1to 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: fileof integer;
i,tek,posicion,max,kolvo: integer;
begin
clrscr;
randomize;
assign(f,'fail.in');
{zapolnenie ishodnogo faila}
rewrite(f);
for i:=1to n dobegin
max:=random(10);
write(f,max);
write(max:3);
end;
close(f);
assign(f1,'fail.out');
rewrite(f1);
reset(f);
max:=0;
whilenot(EOF(f)) dobegin
read(f,i);
kolvo:=1;
posicion:=filepos(f);
whilenot(EOF(f)) dobegin
read(f,tek);
if tek=i then
inc(kolvo);
end;
if kolvo>max thenbegin
close(f1);
rewrite(f1);
write(f1,i);
max:=kolvo;
endelseif kolvo=max then
write(f1,i);
seek(f,posicion);
end;
close(f);
close(f1);
writeln;
writeln(max);
reset(f1);
whilenot(EOF(f1)) dobegin
read(f1,i);
write(i:3);
end;
end.
Zundell
21.12.2006 1:38
Спасибо тебе большое,readln над было паставить))все, я все 5 задач сделал,сортировку вообще элементарна!Завтра препод проверит,выложу все 5 задач,может кому пригодяться!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.