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

Задание_Кто соображает в программировании на паскале? Надо написать небольшую программу, а я в предмете плохо понимаю))

Вводится строка текста. Строка может быть пустая или из одних пробелов. Разделители представляют собой множество символов – ‘ /?.,<;>:”!’*%’. Слово- любая последовательность символов, ограниченная с одной или двух сторон разделителями.Составить вектор номеров позиций начал слов, являющихся анаграммой первого слова. Анаграмма – слово той же длины, состоящее из тех же букв в любом порядке, что и оригинал.
Доброго времени суток.

Александр, в задаче требуется найти анаграммы, а не подсчитать число слов. Да и число слов не подсчитается, если будет идти подряд несколько разделителей. Впрочем, ладно.. .

Задача не то, чтобы из элементарных, но и не запредельной сложности. Совсем не запредельной.. . Все что требуется, это выделять слова из предложения используя информацию о разделителях слов и, собственно, поиск анаграмм. Проверку слова на анаграмму можно делать разными способами, я решил не мудрствуя сравнивать отсортированные символы у первого слова и претендента. Для этого объявлена функция SortChars. В общем, программка получилать такой.

program Anagram;
uses Crt;
const
WordDelim : set of Char = [' ',',','.']; {разделители слов, поставьте свои}

var
s, s1, s0 : String;
j, k, N, L : Integer;
A : array[1..100] of Byte;
Anagr : Boolean;

{сортирует символы слова}
function SortChars(S: String): String;
var
i, j, Len : Integer;
Ch : Char;
begin
Len := Length(S);
for i := 1 to Len do
for j := 1 to Len - i do
if S[j] < S[j + 1] then begin {если текущий элемент меньше следующего переставим их}
Ch := S[j]; {сначала сохраним в промежуточной переменной}
S[j] := S[j + 1]; {переставляем элементы}
S[j + 1] := Ch; {восстанавливаем значение}
end;
SortChars := S;
end;

begin
ClrScr;
Write('Введите предложение: ');
ReadLn(s);
s := s + ' ';

s1 := '';
j := 1; {индекс символа}
N := 0; {номер слова}
L := 0; {длина первого слова}
while j <= Length(s) do begin
if not (s[j] in WordDelim) then s1 := s1 + s[j]; {накапливаем, если не разделитель}
if (s[j] in WordDelim) or (j = Length(s)) then {разделитель или последний символ}
if s1 <> '' then begin {очередное слово не пустое}
if L = 0 then begin {это первое слово}
s0 := s1; {запомним его}
L := Length(s1); {и его длину}
end
else begin
if L = Length(s1) then begin {длины равны, возможно анаграмма}
if SortChars(s0) = SortChars(s1) then begin {точно, анаграмма}
N := N + 1;
A[N] := j - L;
end;
end;
end;

s1 := ''; {очищаем накопитель}
end;
Inc(j);
end;

for j:=1 to N do Write(A[j]:4); {вывод вектора}

ReadLn;
end.

Удачи!
Карик Карик
Карик Карик
59 612
Лучший ответ
Ну ты дал тоже!.. Кому ж захочется за так мозг себе морщить,... Тем более задача не из элементарных.. Стучи в агент поговорим...
Oz Az
Oz Az
14 004
даю алгоритм давно паскаль не юзал не помню тонкости
под рукой счас нету и времени нету

const s_razd="/?.,<;>:”!’*%";
Var
i,j:integer;
col_word:byte;

Begin
так вот запрос строки
inputln(s);

for i:=1 to len(s) dв
if s in s_razd then inc(col_word);

writeln(s);
writeln ("количество слов в строке ",col_word);

end.

синтакси по помощи в pascakt доведешь до ума
Evro 2012
Evro 2012
2 236