В каждом 5-символьном слове переставить литеры так, чтобы одинаковые находились рядом (например, сосна – ссона) - Turbo Pascal
Формулировка задачи:
Доброго времени суток. Прошу помощи с решением этой задачки.
Задан текст, состоящий из слов, записанных через пробелы или запятые. Длина текста не больше 255 символов. В тексте могут быть использованы любые символы. Словом считать последовательность символов, не содержащую пробел. Необходимо введенный текст вывести на экран до и после его преобразования.
В каждом 5-символьном слове переставить литеры так, чтобы одинаковые находились рядом (например, сосна – ссона). Найти первое цифровое слово и увеличить его значение на 23.
Нашел на форуме похожую задачу, только с другим заданием. Подскажите пожалуйста что подредактировать.
Решение задачи: «В каждом 5-символьном слове переставить литеры так, чтобы одинаковые находились рядом (например, сосна – ссона)»
textual
Листинг программы
uses crt; const rz=[' ',','];{символы, разделители слов, можно добавить} var s,s1,s2:string; n,i,j,k,p,i1:integer; c:char; begin clrscr; writeln('Введите текст из слов, в том числе 5-символьных и чисел,'); writeln('разделенных пробелами и запятыми:'); readln(s); s2:='';{новая строка} i:=1; {сначала} i1:=0;{нет пока чисел} while i<=length(s) do if not(s[i] in rz)and ((s[i-1] in rz)or(i=1)) then{если не разделитель и первый или перед ним разделитель, то начало слова*} begin k:=i; s1:=''; while not(s[k] in rz)and(k<=length(s))do {пока не разделитель и не конец строки} begin s1:=s1+s[k];{составляем очередное слово} k:=k+1; end; val(s1,n,k);{проверяем на число} if k=0 then{если да} begin i1:=i1+1;{считаем} if i1=1 then {если первое} begin n:=n+23; str(n,s1);{преобразуем строку} end; end else if length(s1)=5 then{если не число и 5 симолов} begin k:=1; while k<5 do begin c:=s1[k];{смотрим все симолы с первого до предпоследнего} p:=0;{количество одинаковых} for j:=5 downto k do{идем с конца} if s1[j]=s1[k] then{если такой же} begin delete(s1,j,1);{удаляем} p:=p+1;{считаем} end; for j:=1 to p do insert(c,s1,k);{вставляем их на место проверяемого} k:=k+p+1;{к следующему символу} end; end; s2:=s2+s1; {пишем новую строку} i:=i+length(s1);{перешагиваем через слово} end else begin s2:=s2+s[i]; i:=i+1;{пропускаем разделители} end; write(s2); readln end.
Объяснение кода листинга программы
- В каждой 5-символьном слове переставить литеры так, чтобы одинаковые находились рядом.
- Объявить переменные: s, s1, s2: string; n, i, j, k, p, i1: integer; c: char;
- Вывести сообщение для ввода текста.
- Прочитать текст из слов, в том числе 5-символьных и чисел, разделенных пробелами и запятыми.
- Инициализировать переменные: i := 1; i1 := 0; c := ''; s1 := ''; s2 := ''; n := 0; p := 0;
- Пока i <= длине(s)...
- Если символ в текущей позиции не является разделителем и не является первым символом или последним символом слова, то начинаем новое слово.
- Для нового слова: пока символ в текущей позиции не является разделителем и длина оставшейся части слова равна 5,...
- Если символ в текущей позиции равен символу предыдущего слова, то удалить этот символ из нового слова и увеличить счетчик одинаковых символов на 1.
- Если символ в текущей позиции не равен символу предыдущего слова, то вставить символ перед текущим символом в новое слово.
- Увеличить значение счетчика i1 на 1, если новое слово состоит только из чисел.
- Если новое слово состоит из чисел, то преобразовать его в строку и добавить к предыдущему слову.
- Увеличить значение счетчика i на 1, если новое слово состоит из чисел и имеет длину 5.
- Если новое слово состоит из чисел и имеет длину более 5, то пропустить его и перейти к следующему символу.
- Добавить новое слово к предыдущему слову и перейти к следующей позиции.
- Повторять шаги 7-15 до тех пор, пока не будет обработано все слова.
- Записать результат в переменную s2.
- Вывести сообщение с результатом.
- Ожидать ввода.
- Завершить работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д