Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Posobie_Programmirovanie_1_Kurs_1_Sem_Anosov_Yu...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.2 Mб
Скачать

4.4 Лабораторная работа №4 «Обработка символьной и строковой информации в языке Паскаль»

При выполнении данной работы требуется написать и отладить программу, реализующую ввод с клавиатуры произвольной текстовой строки, выполняющей заданную в варианте задания обработку этой строки, и выдающую соответствующие результаты этой обработки.

Темы, которые необходимо знать для выполнения и защиты данной работы:

  • Понятие символьной информации. Тип данных «char» в языке Паскаль.

  • Символ и код символа. Преобразование кода в символ и символа в код (функции «Ord» и «Chr»).

  • Понятие таблицы кодировки символов.

  • Понятие строковой информации. Тип данных «string» в языке Паскаль.

  • Специальные функции языка Паскаль для обработки строк.

Выполнение данной работы должно проходить в 6 этапов:

  1. Этап первый. Предварительный анализ предметной области задачи.

  2. Этап второй. Разработка алгоритма, осуществляющего обработку, определённую в первой части задания.

  3. Этап третий. Разработка алгоритма, осуществляющего обработку, определённую во второй части задания.

  4. Этап четвёртый. Разработка алгоритма, осуществляющего обработку, определённую в третьей части задания.

  5. Этап пятый. Оптимизация разработанных алгоритмов.

  6. Этап шестой. Тестирование и доработка программы, если это необходимо.

Общие требования к работе (минимальный уровень, оценка «удовлетворительно»):

  • Определить в программе необходимые переменные.

  • Организовать ввод произвольной текстовой строки с клавиатуры.

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

  • Вывести результат обработки на экран.

Для защиты на оценку «хорошо»:

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

  • Вывести результат обработки на экран.

Для защиты на оценку «отлично»:

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

  • Вывести результат обработки на экран.

  • Оптимизировать алгоритмы и код программы.

Варианты заданий на лабораторную работу № 4.

Во всех вариантах необходимо:

  • Организовать ввод текстовой строки с клавиатуры.

  • Осуществить контрольный вывод на экран введенной строки.

Вариант 1.

Базовый уровень (на3 балла).

Подсчитать и вывести на экран количество пробелов во введенной строке.

Уровень 2 (на 4 балла). Дополнительные условия:

Ввести с клавиатуры число N.

Перевести исходную строку в другую строку так, чтоб количество всех пробелов между всеми словами увеличилось в N раз. Вывести на экран новую строку.

Уровень 3 (на 5 баллов). Дополнительные условия:

Заменить все пробелы в «увеличенной» строке так, чтоб между каждым словом вместо пробелов стояли символы 1-2-3-4-5 и т.д. Вывести на экран третью строку.

Пример полной обработки:

«Привет всем тут»

В строке 2 пробела

N=5

«Привет всем тут»

«Привет12345всем12345тут»

Вариант 2.

Базовый уровень (на 3 балла).

Подсчитать и вывести на экран количество слов во введенной строке.

Уровень 2 (на 4 балла). Дополнительные условия:

Перевести исходную строку в другую строку так, чтоб все повторяющиеся символы были заменены одним соответствующим символом. Вывести на экран новую строку.

Уровень 3 (на 5 баллов). Дополнительные условия:

Перечень удаленных символов поместить в третью строку, и вывести её на экран.

Пример полной обработки:

«Прррривет всеееем туттттт»

В строке 3 слова

«Привет всем тут»

«ррреее ттттт»

Вариант 3.

Базовый уровень (на 3 балла).

Подсчитать и вывести на экран количество символов-цифр во введенной строке.

Уровень 2 (на 4 балла). Дополнительные условия:

Перевести исходную строку в другую строку так, чтоб все найденные цифры были заменены символом «0». Вывести на экран новую строку.

Уровень 3 (на 5 баллов). Дополнительные условия:

Сформировать третью строку, в которой суммируются найденные цифры, и результат суммирования. Вывести на экран третью строку.

Пример полной обработки:

«Сегодня 5 октября 2009 года»

Во введённой строке 5 цифр

«Сегодня 0 октября 0000 года»

«5+2+0+0+9=16»

Вариант 4.

Базовый уровень (на 3 балла).

Подсчитать во введённой строке и вывести на экран количество символов, не являющихся цифрами (включая пробелы).

Уровень 2 (на 4 балла). Дополнительные условия:

Перевести исходную строку в другую строку так, чтоб все найденные символы, не являющихся цифрами, были заменены символом «пробел». Вывести на экран новую строку.

Уровень 3 (на 5 баллов). Дополнительные условия:

Сформировать третью строку так, чтоб все найденные цифры располагались через 1 пробел и не повторялись. Вывести на экран третью строку.

Пример полной обработки:

«Сегодня 5 октября 2009 года»

В строке 22 символа, не являющегося цифрами

« 5 2009 »

«5 2 0 9»

Вариант 5.

Базовый уровень (на 3 балла).

Организовать ввод с клавиатуры одного произвольного символа.

Подсчитать сколько раз данный символ встречается в строке.

Уровень 2 (на 4 балла). Дополнительные условия:

Перевести исходную строку в другую строку так, чтоб из неё были удалены все вхождения указанного символа. Вывести на экран новую строку.

Уровень 3 (на 5 баллов). Дополнительные условия:

Разбить исходную строку на слова, и напечатать их в столбик (сохранять в отдельных строках не обязательно).

Пример полной обработки:

«Сегодня 5 октября 2009 года»

Символ «о»

Указанный символ входит в строку 3 раза

«Сегдня 5 ктября 2009 гда»

«Сегодня»

«5»

«октября»

«2009»

«года»

Вариант 6.

Базовый уровень (на 3 балла).

Подсчитать и вывести на экран количество символов «тире» во введенной строке.

Уровень 2 (на 4 балла). Дополнительные условия:

Перевести исходную строку в другую строку так, чтоб из неё были удалены все цифры.

Вывести на экран новую строку.

Уровень 3 (на 5 баллов). Дополнительные условия:

Найти и напечатать длину всех слов в исходной строке.

Пример полной обработки:

«Сегодня – 5 – октября – 2009 – года»

В строке 4 тире

«Сегодня – – октября – – года»

7, 1, 7, 4, 4

Вариант 7.

Базовый уровень (на 3 балла).

Определить, есть ли в строке цифры.

Напечатать ответ: «Да, в строке есть цифры» или «Нет, в строке нет цифр».

Уровень 2 (на 4 балла). Дополнительные условия:

Не просто напечатать ответ «Да, в строке есть цифры» или «Нет, в строке нет цифр», а сначала сформировать специальную строку с ответом, а потом вывести её на экран.

Уровень 3 (на 5 баллов). Дополнительные условия:

Найти в строке самое длинное слово, и напечатать его, и число символов в нём (сохранять его в отдельной строке не обязательно).

Пример полной обработки:

«2 умножить на 2 будет 4»

Да. В строке есть цифры

Самое длинное слово «умножить»

В нём 8 символов

Вариант 8.

Базовый уровень (на 3 балла).

Определить, есть ли в строке пробелы.

Напечатать ответ: «Да, в строке есть пробелы» или «Нет, в строке нет пробелов».

Уровень 2 (на 4 балла). Дополнительные условия:

Перевести исходную строку в другую строку так, чтоб первый пробел повторялся 1 раз, второй пробел 2 раза, и т.д. Вывести на экран новую строку.

Уровень 3 (на 5 баллов). Дополнительные условия:

Найти в строке самое короткое слово, и напечатать его и число символов в нём (сохранять его в отдельной строке не обязательно).

Пример полной обработки:

«Шестью восемь – сорок восемь»

Да. В строке есть пробелы

Самое короткое слово «сорок»

В нём 5 символов

Вариант 9.

Базовый уровень (на 3 балла).

Подсчитать и вывести на экран количество заглавных букв во введенной строке.

Уровень 2 (на 4 балла). Дополнительные условия:

Перевести исходную строку в другую строку так, чтоб все найденные заглавные буквы были заменены строчными. Вывести на экран новую строку.

Уровень 3 (на 5 баллов). Дополнительные условия:

Сформировать третью строку так, чтоб каждое слово исходной строки было написано в обратном порядке. Вывести на экран третью строку.

Пример полной обработки:

«Вот Такие Пироги, ТОВАРИЩИ»

Во введённой строке 11 заглавных букв

«вот такие пироги, товарищи»

«тоВ иекаТ игориП, ИЩИРАВОТ»

Вариант 10.

Базовый уровень (на 3 балла).

Определить, есть ли в строке точки и запятые.

Напечатать ответ: «Да, в строке есть точки и запятые» или «Нет, в строке нет ни точек, ни запятых».

Уровень 2 (на 4 балла). Дополнительные условия:

Перевести исходную строку в другую строку так, чтоб все точки были заменены знаком «*», а запятые знаком «+». Вывести на экран новую строку.

Уровень 3 (на 5 баллов). Дополнительные условия:

Напечатать только те слова исходной строки, число символов в которых четное. Учитывать то, что знаки «.» и «,» не входят в слово, а являются разделителями так же как и пробел. (сохранять эти слова в отдельных строках не обязательно).

Пример полной обработки:

«Проверка .. ,,, .. свя…зи ….., .. ,,,»

В строке есть точки и запятые

«Проверка * +++ ** свя***зи *****+ **+++»

«Проверка»

«зи»

Вариант 11.

Базовый уровень (на 3 балла).

Подсчитать число вхождений символов «+» и «-» .

Выдать два полученных числа.

Уровень 2 (на 4 балла). Дополнительные условия:

Определить, является данная строка корректным арифметическим выражением, содержащим цифры и операции «+» и «-». Количество пробелов и символов «+» и «-» при проверке несущественно. Например:

«123 ++-+ 45 - 23» – считается корректным выражением.

«123 + привет - 18» – считается некорректным выражением.

Уровень 3 (на 5 баллов). Дополнительные условия:

Если введенное выражение корректно – то вычислить его. (В случае повторяющихся символов операций выполнять операцию, определяемую первым символом)

Пример полной обработки:

«123 +-++ 45 - 23»

В строке три символа «+» и два символа «–»

Выражение корректно

145

Пояснение: вычислялось 123+45-23

Вариант 12.

Базовый уровень (на 3 балла).

Вычислить длину введенной строки НЕ ИСПОЛЬЗУЯ функцию «length». И выдать соответствующий ответ.

Уровень 2 (на 4 балла). Дополнительные условия:

Перевести исходную строку в другую строку так, чтоб все соседние символы (включая пробелы) попарно поменялись местами. Вывести на экран новую строку.

Уровень 3 (на 5 баллов). Дополнительные условия:

Проверить, является ли исходная строка палиндромом (симметричным перевертышем).

Предусмотреть варианты для четного и нечетного числа символов в строке.

Пример полной обработки:

«12345 абв 2002 вба 54321»

Длина введённой строки 24 символа

«2143 5ба в0220в аб5 3412»

Да исходная строка является палиндромом

Вариант 13.

Базовый уровень (на 3 балла).

Определить, есть ли в строке восклицательные знаки, и подсчитать их количество.

Уровень 2 (на 4 балла). Дополнительные условия:

Перевести исходную строку в другую строку, удалив каждый первый и последний символ в каждом слове. Вывести на экран новую строку.

Уровень 3 (на 5 баллов). Дополнительные условия:

Напечатать только те слова исходной строки, число символов в которых нечетное. Учитывать то, что знаки «.» и «,» не входят в слово, а являются разделителями так же как и пробел. (сохранять эти слова в отдельных строках не обязательно).

Пример полной обработки:

«Вот Такие Пироги, ТОВАРИЩИ»

В строке нет восклицательных знаков

«о аки ирог, ОВАРИЩ»

«Вот»

«Такие»

Вариант 14.

Базовый уровень (на 3 балла).

Определить, чего в строке больше, цифр или не цифр.

Уровень 2 (на 4 балла). Дополнительные условия:

Перевести исходную строку в другую строку, разбавив все не цифры пробелами.

Вывести на экран новую строку.

Уровень 3 (на 5 баллов). Дополнительные условия:

Сгруппировать в третьей строке все символы исходной строки, разделив группы пробелами. Группировать символы в порядке их первого появления. Пробелы не учитывать. Вывести на экран третью строку.

Пример полной обработки:

«Сегодня 5 октября 2009 года»

В строке больше символов не цифр

«С е го д н я 5 о к т я б р я 2009 г о д а»

«С е гг ооо дд н яяя 5 к т б р 2 00 9»

Вариант 15.

Базовый уровень (на 3 балла).

Определить, сколько во введенной строке предложений.

Уровень 2 (на 4 балла). Дополнительные условия:

Перевести исходную строку в другую строку так, чтоб в неё попало только второе предложение из исходной строки (если такое есть). Вывести на экран новую строку.

Уровень 3 (на 5 баллов). Дополнительные условия:

Сформировать третью строку так, чтоб все предложения в ней шли в обратном порядке.

Вывести на экран третью строку.

Пример полной обработки:

«Желтый лимон. Красное яблоко. Зеленый огурец.»

Во введённой строке 3 предложения

«Красное яблоко.»

«Зеленый огурец. Красное яблоко. Желтый лимон.»

Пример решения типовой задачи лабораторной работы № 4.

Рассмотрим решение поставленной в четвёртой лабораторной работе задачи на примере следующего варианта задания:

Базовый уровень (на3 балла).

Подсчитать и вывести на экран количество символов «=» во введенной строке.

Уровень 2 (на 4 балла). Дополнительные условия:

Ввести с клавиатуры число N, не превышающее 32.

Перевести исходную строку в другую строку так, что бы после каждого символа «=» в строку было вставлено «N» символов русского алфавита, последовательно, начиная с буквы «а». Вывести на экран новую строку.

Уровень 3 (на 5 баллов). Дополнительные условия:

Перевести сформированную строку в третью строку так, чтобы все символы этой строки (кроме символов «=» и вновь вставленных символов) были заменены на символ «пробел». Вывести на экран третью строку.

Пример полной обработки:

«Два*3=2+два+два=1*шесть=6»

В этой строке три символа «=»

N=5

«Два*3=абвгд2+два+два=абвгд1*шесть=абвгд6»

« =абвгд =абвгд =абвгд »

Этап первый. Предварительный анализ предметной области задачи.

По условию задачи нам необходимо обрабатывать строковую информацию. Следовательно, нам потребуются переменные типа «string». Одна для исходной строки, и две для преобразованных строк.

Для подсчёта числа вхождений символа «=» нам потребуется одна целочисленная переменная.

Кроме того, для перебора символов в строке, необходим целочисленный счётчик номеров символов.

Во второй части программы дополнительно потребуется переменная для ввода пользователем числа «N». Кроме того потребуется ещё один счётчик вставляемых символов русского алфавита.

В третьей части программы никаких дополнительны переменных не потребуется.

В результате, описание переменных в нашей программе будет выглядеть так:

Var S1,S2,S3 : string ; // Строки

Np : integer; // Переменная для подсчёта числа

// символов «=»

i,j : integer; // Счётчики символов строках

N : integer; // Дополнительная переменная – вводимая

// пользователем

Этап второй. Разработка алгоритма, осуществляющего обработку, определённую в первой части задания.

Ввод текстовых строк в языке «Паскаль» осуществляется так же, как и ввод значений числовых переменных. Т.е. при помощи команд «Read» и «Readln»

Строковый тип данных позволяет обращаться как ко всей строке целиком, так и к отдельным символам строки по их номеру (аналогично элементам массивов).

Символы в языке «Паскаль» можно сравнивать между собой, так же как и обычные числовые данные.

Общее число символов в строке определяется функцией «length».

Следовательно, для определения числа вхождений в строку символов «=» нам достаточно перебрать все символы в строке и сравнить их с символом «=». Это будет выглядеть так:

// Ввод строки

Writeln('Введите строку');

Readln(S1);

// Контрольная печать

Writeln('Вы ввели строку: ', S1);

// Подсчёт числа символов '=' в строке

Np:=0;

for i:=1 to length(S1) do if S1[i] = '=' then Np:=Np+1;

Writeln('В строке ', Np, ' символов "="');

Результат работы этого фрагмента программы:

Этап третий. Разработка алгоритма, осуществляющего обработку, определённую во второй части задания.

Согласно условию задачи, во второй части работы нужно организовать ввод числа пользователем и преобразование строки в другую строку, в которой после каждого символа «=» добавляется N символов русского алфавита.

Для реализации данных действий нам потребуется (так же, как и в первой части программы) организовать перебор всех символов в исходной строке и проверку их на равенство символу «=».

При этом, если проверяемый символ не равен символу «=», то он должен просто добавляться к новой строке, а если равен, то к новой строке должны добавляться ещё и «N» символов русского алфавита. Для этого потребуется организовать дополнительный вложенный цикл, добавляющий эти символы ко второй строке.

Для того, что бы определить символ русского алфавита по его номеру в алфавите нам потребуются функции «ord» и «chr». Функция «ord» выдаёт код любого символа, а функция «chr» выдаёт символ по указанному коду.

Так как все символы в таблице кодировки расположены в естественном порядке, то для определения символа по его номеру в алфавите, достаточно:

  • к коду символа «а», уменьшенному на 1, прибавить номер нужного символа в алфавите;

  • получить символ по вычисленному коду.

При этом нам совсем не обязательно знать сами коды символов!

Действительно. Предположим, что:

  • код символа «а» равен 224

  • код символа «б» равен 225

  • код символа «в» равен 226

  • код символа «г» равен 227

Тогда, для определения кода буквы «г», четвёртой в алфавите, достаточно из кода буквы «а» вычесть 1 и прибавить 4. Т.е. 224-1+4=227.

Код символа «а» можно получить так: ord('a'), а символ «г» - как chr( код ).

Полностью команда будет выглядеть так: chr( ord(‘a’) – 1 + 4 )

В итоге, вторая часть программы будет выглядеть так:

// Формирование второй строки

for i:=1 to length(S1) do

if S1[i]<>'='

then S2:=S2+S1[i]

else begin S2:=S2+S1[i];

for j:=1 to N do S2:=S2+chr(ord('а')-1+j);

end;

Writeln('Дополненная строка');

Writeln(S2);

И это работает!

Этап четвёртый. Разработка алгоритма, осуществляющего обработку, определённую в третьей части задания.

Преобразование второй строки в третью, в соответствии с условием третьей части задания – первоначально представляется весьма сложной задачей, так как при этом возникает необходимость отслеживания букв русского алфавита, идущих в строке сразу за каждым из символов «=», и, при этом, расположенных в естественном (алфавитном) порядке.

Для некоторых случаев исходной строки – данная задача будет и вовсе неразрешима. Например, для строки «еёжз=еёжз=еёжз» и введённом N=5, после первого преобразования мы получим строку «еёжз=абвгдеёжз=абвгдеёжз». Попытка отслеживания и замены пробелами всех букв русского алфавита, идущих в строке сразу за каждым из символов «=», и расположенных в естественном (алфавитном) порядке, приведёт к результату « = = ». Т.е. из строки будут удалены все русские буквы.

Однако, если вспомнить, что мы вставляли в строку точное, равное «N» число символов, то задача значительно упростится:

  • Пока нет символа «=» – заменяем все символы на «пробелы».

  • Сразу после символа «=» – оставляем в строке «N» символов.

  • Далее опять заменяем все символы в строке на пробелы. Пока не встретим очередной символ «=».

На языке «Паскаль» это будет выглядеть так:

// Формирование третьей строки

i:=1;

while i<=length(S2) do

begin if S2[i]<>'='

then begin S3:=S3+' ';

i:=i+1;

end

else Begin S3:=S3+'=';

i:=i+1;

for j:=1 to N do

begin S3:=S3+S2[i];

i:=i+1;

end;

end;

end;

Writeln('Третья строка');

Writeln(S3);

В итоге, полный текст нашей программы примет следующий вид:

Var S1,S2,S3 : string ; // Строки

Np : integer; // Переменная для подсчёта числа

// символов "="

i,j : integer; // Счётчики символов строках

N : integer; // Дополнительная переменная - вводимая

// пользователем

Begin

// Ввод строки

Writeln('Введите строку');

Readln(S1);

// Контрольная печать

Writeln('Вы ввели строку: ', S1);

// Подсчёт числа символов '=' в строке

Np:=0;

for i:=1 to length(S1) do if S1[i]='=' then Np:=Np+1;

Writeln('В этой строке ', Np, ' символов "="');

// Ввод числа N

Write('Введите N. N=');

Readln(N);

// Формирование второй строки

for i:=1 to length(S1) do

if S1[i]<>'='

then S2:=S2+S1[i]

else begin S2:=S2+S1[i];

for j:=1 to N do S2:=S2+chr(ord('а')-1+j);

end;

Writeln('Дополненная строка');

Writeln(S2);

// Формирование третьей строки

i:=1;

while i<=length(S2) do

begin if S2[i]<>'='

then begin S3:=S3+' ';

i:=i+1;

end

else Begin S3:=S3+'=';

i:=i+1;

for j:=1 to N do

begin S3:=S3+S2[i];

i:=i+1;

end;

end;

end;

Writeln('Третья строка');

Writeln(S3);

End.

Этап пятый. Оптимизация разработанных алгоритмов.

Первая часть нашей программы достаточно проста и оптимизации не требует.

Вторая часть программы несколько сложнее. Формирование второй строки осуществляется так:

for i:=1 to length(S1) do

if S1[i]<>'='

then S2:=S2+S1[i]

else begin S2:=S2+S1[i];

for j:=1 to N do S2:=S2+chr(ord('а')-1+j);

end;

Writeln('Дополненная строка');

Writeln(S2);

Если внимательно посмотреть на этот код, то можно заметить, что независимо от того, выполнено условие или нет, символ первой строки копируется во вторую строку. Следовательно, это копирование можно вынести из условного оператора «if». При этом, в операторе «if» останется только одна альтернатива «else». Значит, мы можем использовать неполный оператор «if», изменив условие на противоположное! В результате таких изменений код формирования второй строки примет следующий вид:

for i:=1 to length(S1) do

begin S2:=S2+S1[i];

if S1[i] = '='

then for j:=1 to N do S2:=S2+chr(ord('а')-1+j);

end;

Writeln('Дополненная строка');

Writeln(S2);

Третья часть программы, с точки зрения оптимизации, вызывает наибольший интерес. Посмотрим, чем отличается формирование третьей строки от формирования второй строки?

Легко заметить, что если заменить во второй части программы: команду «S2:=S2+S1[i]» на команду «S3:=S3+' '», а команду «S2:=S2+chr(ord('а')-1+j)» на команду «S3:=S3+chr(ord('а')-1+j)», то мы получим почти готовую третью строку, непосредственно из первой! Единственным отличием будет то, что в полученной таким способом третьей строке будут отсутствовать символы «=». Они, так же, как и остальные символы исходной строки, будут заменены на «пробел».

Для того, что бы символы «=» не заменялись пробелами достаточно:

  • добавить к условному оператору «if» ветку «else»

  • перенести туда команду «S3:=S3+' '»

  • а в ветку «then» добавить команду S3:=S3+'=';

Следовательно формирование третьей может быть реализовано так:

for i:=1 to length(S1) do

begin if S1[i] = '='

then Begin S3:=S3+’=’;

for j:=1 to N do S3:=S3+chr(ord('а')-1+j);

end

else S3:=S3+' ';

end;

Этот код уже вдвое компактнее предыдущего варианта кода.

Далее. Так как вторая и третья строки теперь формируются практически одинаковым кодом, мы можем совместить их формирование в одном блоке!

for i:=1 to length(S1) do

begin S2:=S2+S1[i];

if S1[i] = '='

then Begin S3:=S3+’=’;

for j:=1 to N do

begin S2:=S2+chr(ord('а')-1+j);

S3:=S3+chr(ord('а')-1+j);

end;

end

else S3:=S3+' ';

end;

В результате всех, проделанных нами действий по оптимизации программного кода, наша программа уменьшилась почти в два раза!

Begin

// Ввод строки и контрольная печать

Writeln('Введите строку');

Readln(S1);

// Контрольная печать

Writeln('Вы ввели строку: ', S1);

// Подсчёт числа символов '=' в строке

Np:=0;

for i:=1 to length(S1) do if S1[i]='=' then Np:=Np+1;

Writeln('В этой строке ', Np, ' символов "="');

// Ввод числа N

Write('Введите N. N=');

Readln(N);

// Формирование второй и третьей строки одновременно

for i:=1 to length(S1) do

begin S2:=S2+S1[i];

if S1[i] = '='

then Begin S3:=S3+'=';

for j:=1 to N do

begin S2:=S2+chr(ord('а')-1+j);

S3:=S3+chr(ord('а')-1+j);

end;

end

else S3:=S3+' ';

end;

Writeln('Дополненная строка');

Writeln(S2);

Writeln('Третья строка');

Writeln(S3);

End.

Полный результат работы этой программы представлен на следующем рисунке:

Этап шестой. Тестирование и доработка программы, если это необходимо.

На первый взгляд наша программа абсолютно корректна. Однако всестороннее тестирование позволяет выявить случаи, при которых программа завершается с ошибкой периода выполнения.

Это происходит, например, при вводе таких исходных данных:

Строка = «==================================================»

N=10

Чем вызвана данная ошибка в работе программы?

Ошибка вызвана тем, что мы не учли особенности использования в языке «Паскаль» типа данных «string». Тип «string» позволяет хранить любые текстовые строки, не превышающие в длину 255 символов. В нашей же программе, при вводе указанных исходных данных, в процессе построения второй и третьей строк, количество символов увеличивается до 50+50*10=550 символов! (50 символов – это собственно символы «=» и ещё 50*10 это вставляемые символы «абвгдеёжзи»)

Заставить программу обрабатывать строки любой длины можно. Но для нас это пока достаточно сложная задача. Поэтому доработаем нашу программу таким образом, чтобы она не завершалась аварийно с выдачей ошибки, а сама проверяла, возможно ли вычисление, и если невозможно, то выдавала бы пользователю корректное сообщение об этом.

Для такой доработки программы нам потребуется заранее, до начала построения второй и третьей строк (сразу после ввода числа «N») вычислить длину будущих строк. Для этого нам потребуется к длине исходной строки прибавить произведение числа найденных символов «=» на введённое пользователем число «N». И если полученное значение окажется больше 255, то выдать об этом сообщение.

В итоге, окончательный, отлаженный, оптимизированный и протестированный код программы примет следующий вид:

Begin

// Ввод строки и контрольная печать

Writeln('Введите строку');

Readln(S1);

// Контрольная печать

Writeln('Вы ввели строку: ', S1);

// Подсчёт числа символов '=' в строке

Np:=0;

for i:=1 to length(S1) do if S1[i]='=' then Np:=Np+1;

Writeln('В этой строке ', Np, ' символов "="');

// Ввод числа N

Write('Введите N. N=');

Readln(N);

if ((length(S1) + Np*N) > 255)

then begin

Writeln(‘Формирование строк S2 и S3 невозможно’);

Writeln(‘так как их длина будет больше 255 символов’);

end

else begin // Формирование второй и третьей строки

for i:=1 to length(S1) do

begin S2:=S2+S1[i];

if S1[i] = '='

then Begin S3:=S3+'=';

for j:=1 to N do

begin S2:=S2+chr(ord('а')-1+j);

S3:=S3+chr(ord('а')-1+j);

end;

end

else S3:=S3+' ';

end;

Writeln('Дополненная строка');

Writeln(S2);

Writeln('Третья строка');

Writeln(S3);

End;

End.

Данная программа уже не будет завершаться аварийно при вводе некорректных данных, а выдаст соответствующее сообщение пользователю.