Другие языки программирования и технологии

нужно создать на паскале программу которая будет находить повторяющиеся слова в массиве

тема такая: нужно с клавиатуры заполнить массив фамилиями учеников, а программа должна найти однофамильцев

вот что у меня вышло
var
a:array[1..5]of string;
f:string;
i,k:integer;

begin
k:=0;
for i:=1 to 5 do
read( a[ i ]);
writeln('Фамилии учеников: ');
for i:=1 to 5 do
write(a[i],' ');
writeln;
f:=a[1];
for i:=1 to 5 do
if f=a[i] then f:=a[i];
for i:=1 to 5 do
if f=a[i] then k:=k+1;

if k=1 then writeln('v klasse net odnofomilcev') else
writeln('повторяющ. фамилия: ',f,' повторяется ' ,k,' raz.');
readln;
end.
программа определяет только повторение первой строки, а если повторяются другие не работает
АИ
Андрей Ильдыбаев
63 085
Лучший ответ
вместо
f:=a[1];
заверни все в цикл
Ержан Жанбырбаев как это сделать?, я не могу разобраться
1. В программе не хватает комментариев
2. Используется прямое указание количества фамилий в алгоритме. Правильнее использовать переменную (это я не исправлял в алгоритме)
3. Требуется вывести для каждой фамилии количество повторений, а значит, нужно хранить сведения, что эта фамилия уже обрабатывалась и при повторном попадании её в цикл её пропускать. Это заметно усложняет программу.
Удобнее сначала отсортировать фамилии, а затем пройтись циклом и посчитать количество повторений для фамилий, которые идут подряд

(* Сортируем фамилии в массиве (Пузырьковая сортировка) *)
i,j:integer;
tmp:string;
for i:=1 downto 5 do
for j:=1 to i do
if a[j]>a[j+1] then
begin
tmp:= a[j];
a[j]:= a[j+1];
a[j+1]:= tmp;
end;

(* Перебор по фамилиям Подсчёт количества идущих подряд фамилий Вывод количества совпадений*)
k=1;
(* Флаг что фамилию нужно отобразить *)
flagWriteFamile=false
(* Флаг что вообще не найдены повторяющиеся фамилии *)
flagNOExistRepeat=true

for i:=1 to 5-1 do
begin
(* Если текущая фамилия совпадает со следующей- увеличить счётчик *)
(* Если не совпадает- поставить флаг, что нужно проверять, следует-ли выводить фамилию*)
if a[i]=a[i+1] and i<4 then
k:=k+1;
else
begin
flagWriteFamile=true;
end

(* проверить, что пора выводить фамилию по флагу или потому, что закончился список *)
if flagWriteFamile or i=5-1 then
begin
(* если было найдено больше 1 фамилии *)
if k>1 then
begin
writeln('Повторяется фамилия: ',a[i],', найдено ',k,' повторений');
flagWriteFamile=false
flagNoExistRepeat=false;
k=1
end
end
end

if flagNOExistRepeat then
writeln('В классе нет одноофамильцев')

Похожие вопросы