Помощь - Поиск - Пользователи - Календарь
Полная версия: файлы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
marwell
Пусть дан файл целых чисел с диапазоном значений от a и до b.
Определите, сколько раз встречается каждое значение в файле.
 var f:text;
n,i,x,a,b:integer;
name:string;
w:word;
begin
x:=0;
writeln ('укажите путь к файлу');
readln (name);
writeln ('введите a');
readln (a);
writeln ('введите b');
readln (b);
assign(f, name);
reset (f);
for i:=a to b do begin
while not eof(f) do begin
readln (f,n);
if n=i then x:=x+1;
end;
writeln (i,'->',x);
x:=0;
end;
close (f);
readln;
end.

программа почему-то считает только первое число, остальные выводит по нулям sad.gif буду рад помощи
volvo
Цитата
программа почему-то считает только первое число
Потому что при первой же итерации цикла For (при i = a) ты дошел до конца файла, и при последующих итерациях у тебя из файла вообще ничего не читается, и ни с чем не сравнивается.

Если уж ты хочешь делать так, как начал - то надо Reset(f) перенести внутрь цикла For...
marwell
Цитата(volvo @ 31.03.2010 17:15) *

Потому что при первой же итерации цикла For (при i = a) ты дошел до конца файла, и при последующих итерациях у тебя из файла вообще ничего не читается, и ни с чем не сравнивается.

Если уж ты хочешь делать так, как начал - то надо Reset(f) перенести внутрь цикла For...

спасибо, получилось smile.gif

Добавлено через 2 мин.
Цитата(volvo @ 31.03.2010 17:15) *

Если уж ты хочешь делать так, как начал - то надо Reset(f) перенести внутрь цикла For...

а есть способ попроще?
volvo
Попроще-то он попроще, но памяти будет требовать побольше.

"Золотое правило" - где-то выиграл - значит, где-то проиграл. В твоем случае - выигрыш: только один проход по файлу, проигрыш: необходимость хранения счетчиков в массиве. Описываешь массив достаточного размера, чтобы он мог хранить B-A элементов. Проходишь по файлу, читаешь число, и увеличиваешь соответствующий элемент массива.
marwell
Цитата(volvo @ 31.03.2010 17:22) *

Попроще-то он попроще, но памяти будет требовать побольше.

"Золотое правило" - где-то выиграл - значит, где-то проиграл. В твоем случае - выигрыш: только один проход по файлу, проигрыш: необходимость хранения счетчиков в массиве. Описываешь массив достаточного размера, чтобы он мог хранить B-A элементов. Проходишь по файлу, читаешь число, и увеличиваешь соответствующий элемент массива.

блин, что-то не получается у меня второй способ sad.gif
Client
ну что не получается?
массив описал? по файлу пробежать и нужный элемент увеличить в массиве или что не смог?
marwell
Цитата(Client @ 2.04.2010 11:33) *

ну что не получается?
массив описал? по файлу пробежать и нужный элемент увеличить в массиве или что не смог?

кажется я не понял самого алгоритма
Client
описываешь массив:
mas: array[a..b] of integer;
Проходишь по файлу, читаешь, например
read(f,x);
В Х у тебя будет число. Теперь надо увеличить значение элемента в массиве с индексом Х
inc(mas[x])
Осталось только вывести массив, где ненулевые значения. Вроде все
marwell
Цитата(Client @ 2.04.2010 11:38) *

описываешь массив:
mas: array[a..b] of integer;
Проходишь по файлу, читаешь, например
read(f,x);
В Х у тебя будет число. Теперь надо увеличить значение элемента в массиве с индексом Х
inc(mas[x])
Осталось только вывести массив, где ненулевые значения. Вроде все

компилятор ругается на эту строку
 mas:array [a..b] of integer; 
Client
это для примера только. Границы массива должны быть константами. Вот и не компилится.
Цитата
проигрыш: необходимость хранения счетчиков в массиве. Описываешь массив достаточного размера, чтобы он мог хранить B-A элементов
marwell
Цитата(Client @ 2.04.2010 11:55) *

это для примера только. Границы массива должны быть константами. Вот и не компилится.

а что делать, если а и b должны ввводиться пользователем? делать по-другому? или описать массив с достаточно большим запасом?
Client
какие значения a и b ?
например, опиши массив от 0 до сколько-нибудь. пусть а=100, b=200.
Сделай аналогию - сотый это как нулевой и т.д.
Получится, нужный индекс - mas[x-a].
Пробуй
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.