Поиск повторяющихся символов в строках - Pascal
Формулировка задачи:
Ребята помогите пожалуйста вот такую задачку решить:
Выбрать из каждой символьной строки исходного массива только те символы, которые встречаются в ней более одного раза и сформировать результирующий массив, не включая строки, в которых не оказалось повторяющихся символов. (пробелы не учитывать).
Я сам пробовал но пока безрезультатно...
Решение задачи: «Поиск повторяющихся символов в строках»
textual
Листинг программы
uses crt;
const nmax=20;
var m1,m2:array[1..nmax]of string;
n,i,j,k,p,l:byte;
mn:set of char;
begin
clrscr;
writeln('Vvedite stroki simvolov, okoncanie vvoda *');
n:=0;
repeat
inc(n);
write('Stroka ',n,': ');
readln(m1[n]);
until (m1[n]='*')or (n=nmax);
writeln;
writeln('Simvoly > 1 raza:');
p:=0;
for i:=1 to n do {идем по массиву}
begin
while pos(' ',m1[i])>0 do {пока в текущей строке есть пробелы}
delete(m1[i],pos(' ',m1[i]),1);{удаляем из нее пробелы}
write('stroka ',i,': ');
k:=0;mn:=[];{счетчик совпадений символа=0, множество символов пустое}
for j:=1 to length(m1[i])-1 do{идем по очередной строке}
for l:=j+1 to length(m1[i]) do{по ее "клону" со следующего символа}
if (m1[i][j]=m1[i][l])and not(m1[i][j] in mn) then{если символ совпал и его еще нет в множестве}
begin
k:=1;{фиксируем}
write(m1[i][j],' ');{выводим в строку}
mn:=mn+[m1[i][j]];{включаем в множество}
end;
if k=0 then write('Takih simvolov net!'){если нет таких, сообщаем}
else if k=1 then{если есть}
begin
inc(p);{увеличиваем счетчик нового массива}
m2[p]:=m1[i];{заносим в него строку}
end;
writeln;
end;
Writeln('Massiv m2:');{}
for i:=1 to p do
writeln(m2[i]);
readln
end.
Объяснение кода листинга программы
- Создается массив
m1типаarray[1..nmax]of string, который будет хранить введенные пользователем строки. - Создается переменная
nтипаbyte, которая будет отслеживать количество введенных строк. - Создается цикл
repeat, который будет продолжаться до тех пор, пока введенная пользователем строка не будет содержать символ*. - Внутри цикла
repeatкаждая строка вводится в переменнуюm1[n]. - После выхода из цикла
repeatвыводится сообщение о том, что введено более 1 символа. - Создается переменная
pтипаbyte, которая будет отслеживать количество уникальных символов во всех введенных строках. - Запускается цикл
for, который будет проходить по всем символам в каждой строке. - Внутри цикла
forпроверяется, есть ли в текущей строке пробелы. Если есть, то они удаляются. - Выводится текущая строка.
- Создается множество
mnтипаset of char, которое будет использоваться для отслеживания уникальных символов. - Запускается внутренний цикл
for, который будет проходить по всем символам в текущей строке. - Если текущий символ совпадает с символом в следующей строке и его еще нет в множестве
mn, то он добавляется в множество и выводится. - Если после прохождения всех символов в текущей строке не было найдено совпадений, выводится сообщение об этом.
- Если было найдено хотя бы одно совпадение, то увеличивается счетчик
pи текущая строка добавляется в массивm2. - После выхода из цикла
forвыводится сообщение о том, что был получен массивm2. - Выводится массив
m2.