тема такая: нужно с клавиатуры заполнить массив фамилиями учеников, а программа должна найти однофамильцев
вот что у меня вышло
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.
программа определяет только повторение первой строки, а если повторяются другие не работает
Другие языки программирования и технологии
нужно создать на паскале программу которая будет находить повторяющиеся слова в массиве

вместо
f:=a[1];
заверни все в цикл
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('В классе нет одноофамильцев')
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('В классе нет одноофамильцев')
Похожие вопросы
- Написать на языке Паскаля программу, которая находит сумму и произведение первых 5 элементов массива.
- нужна программа!! ! нужна программа!! ! которая выговаривает правильно английские слова!! ! Подскажите!!!
- Дано два натуральных числа а и б . Написать программу, которая будет находить и распечатывать все общие делители этих чи
- Создать список из повторяющихся слов текста из файла. Первый элемент-наиб. часто повторяющееся слово/ Паскаль. (+)
- Напишите программу, которая находит в массиве количество элементов, равных заданному значению X .
- Написать программу, которая формирует два массива чисел
- В двух массивах строковых констант хранятся слова:существительные и глаголы. Составте программу, которая выводит:
- 1. Написать программу, которая заполняет массив целых чисел размеров 20 элементов значениями роста учащихся (случайные ч
- Удаление повторяющихся элементов из массива С++
- Дан двумерный динамический массив, надо составить программу, которая меняет местами две любые строки