Удалить все знаки препинания из строки - Free Pascal
Формулировка задачи:
1. С клавиатуры, или из самой программы, или из файла в строковую переменную вносится некоторый текст. Это предложение на английском языке. Программа редактирует английское предложение так, что не оставляет в нем ни одного знака препинания. Ни точки, ни запятой, и тире, ни прочих знаков не должно быть. Мало того, между двумя соседними словами должно быть не более одного пробела.
2. Эта программа берет уже отредактированную строку из первой задачи и делает из полученной строки массив английских слов в том порядке, как они расположены в предложении. В возвращаемом массиве слов пробелов быть не должно.
3. Небольшая программа получает массив слов из предыдущей задачи и делает так, чтобы все слова начинались со строчных букв.
4. Эта программа на входе имеет «очищенный» массив слов предложения, заданного в первой задаче. Однако в исходном массиве могут встречаться повторяющиеся слова. Задача программы – из исходного массива сделать массив неповторяющихся слов.
5. Наконец, эта программа должна сортировать массив слов по алфавиту.
Все программы можно попробовать реализовать в модуле как методы строкового объекта. Значение всех этих программ – облегчение перевода английского текста путем создания небольшого вспомогательного словаря. Не секрет, что современные автоматические переводчики не всегда улавливают семантику текста, его смысл.
Решение задачи: «Удалить все знаки препинания из строки»
textual
Листинг программы
type sar=array of string;
var
s:string;
a,b:sar;
i,j,k:integer;
ok:boolean;
procedure split(delimeter:string;s:string;var sr:sar);
var
cnt, i:integer;
t:string;
procedure additem;
begin
if t<>'' then begin
inc(cnt);
SetLength(sr,cnt);
sr[cnt-1]:=t;
t:='';
end;
end;
begin
cnt:=0;t:='';
for i:=1 to length(s) do
if pos(s[i],delimeter)=0 then t:=t+s[i] else additem;
additem;
end;
procedure printarray(s:string;t:sar);
var
i:integer;
begin
writeln(s);
for i:=low(t) to high(t) do writeln(t[i]);
readln;
end;
begin
write('Введите строку:');readln(s);
Split('.,- :;',s,a);
s:='';
for i:=low(a) to high(a) do s:=s+a[i]+' ';
writeln('1)',#10,#13,s); readln;
printarray('2)',a);
writeln('3)');
for i:=low(a) to High(a) do writeln(lowercase(a[i][1])+copy(a[i],2,length(a[i])));
readln;
k:=0;
for i:=low(a) to high(a) do begin
for j:=i to high(a) do
if (upcase(a[i])>upcase(a[j])) then begin
s:=a[i];
a[i]:=a[j];
a[j]:=s;
end;
if (k=0) or (a[i]<>b[k-1]) then begin
k:=k+1;
setlength(b,k);
b[k-1]:=a[i];
end;
end;
printarray('4)',b);
printarray('5)',a);
end.
Объяснение кода листинга программы
- В первой процедуре
splitмы разделяем строкуsна массив строкsrпо указанному разделителюdelimeter. - Во второй процедуре
printarrayмы выводим каждый элемент массиваtна новой строке. - В основной части программы мы сначала разделяем введенную пользователем строку на массив строк
aпо разделителю.,- :;. - Затем мы объединяем все элементы массива
aв одну строкуsбез разделителей. - Выводим на экран эту строку.
- Затем мы выводим каждый элемент массива
aв нижнем регистре. - Мы сортируем элементы массива
aв порядке возрастания верхнего регистра. - Затем мы выводим отсортированный массив
aи запрашиваем у пользователя ввод. - Мы повторяем шаги 3-8 для массива
b, который является копией массиваaдо первого прохода цикла.