Упр. 8. Стр. 47

1. В программу из примера 8.3 внесли следующие изменения:

for var i := 1 to n do
begin
write(s[i]);
if i mod 2 = 0 then
writeln;
end;

Как теперь выводится слово? Объясните почему.

Слово теперь выводится по 2 буквы в каждую строку, поскольку в программу добавлено условие if i mod 2 = 0 then для переноса строки. Таким образом, перенос строки происходит только каждую вторую букву.

2. Измените программу из примера 8.3 так, как указано ниже.

1. Каждая буква должна выводиться своим цветом (можно использовать случайное задание цветов).

В цикле for будем задавать случайный цвет для буквы с помощью SetFontColor(), rgba() и random(255).

uses GraphABC;
var
s: string; n: integer;
begin
writeln('Введи слово');
readln(s); writeln(s);
n := length(s);
for var i := 1 to n do
begin
SetFontColor(rgb(random(255), random(255), random(255)));
writeln(s[i]);
end;
end.

2. Буквы, стоящие на четных местах, должны выводиться одним цветом, а на нечетных — другим.

Изменим программу, чтобы буквы на чётных местах выводились красным цветом, а на нечётных — синим:

uses GraphABC;
var
s: string; n: integer;
begin
writeln('Введи слово');
readln(s); writeln(s);
n := length(s);
for var i := 1 to n do
begin
if i mod 2 = 0 then
begin
SetFontColor(clRed);
end
else
begin

SetFontColor(clBlue);
end;
writeln(s[i]);
end;
end.

3.  Измените программу из примера 8.4 так, чтобы на экран выводился символ введенного слова, стоящий посередине (для слов с четным количеством букв — символ справа от середины).

Определим позицию середины с помощью целочисленного деления и прибавления единицы c := n div 2 + 1;.

var s: string; n, c: integer;
begin
writeln('Введи слово');
readln(s); n := length(s);
writeln('Символов: ', n);
c := n div 2 + 1;
writeln('Позиция середины: ', c);
writeln('Средний символ - ', s[c]);
end.

1-2. Проверьте правильность работы своей программы на предложенных примерах. Откройте файл с таблицей и запишите результаты. Допишите в таблицу два своих примера.

Слово Результат
Школа о
гимназия а
форма р
Интернет р
клавиатура а
Деревня е

3. Что будет выведено, если ничего не вводить, просто нажать Enter?

Произойдёт ошибка, т.к. мы не сделали проверку ввода.

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

Проверка на существование ещё одного символа из примера 8.4 нам не подходит, т.к. в примере искался последний символ, а у нас нужно найти средний. Это значит, что для проверки существования ещё одного символа нужно проверить первой вхождение символа Pos() и последнее LastPos(), а потом сравнить полученные два значения: если они равны — значит мы нашли только наш средний символ и больше он не встречается в слове, если не равны — значит где-то существует ещё один символ.

var s: string; n, k, l, c, m: integer;
begin
writeln('Введи слово');
readln(s); n := length(s);
writeln('Символов: ', n);
c := n div 2 + 1;
writeln('Позиция середины: ', c);
writeln('Средний символ - ', s[c]);
k := Pos(s[c], s);
l := LastPos(s[c], s);
if k <> l then
writeln('Средний символ встречается ещё раз ')
else
writeln('Символ один')
end.

5. Выведите позиции всех символов, совпадающих с символом слова, находящимся посередине.

Будем записывать количество встречающихся символов в переменную m, не учитывая среднюю позицию — её записывать не будем. При каждой встрече нашего символа будем выводить соответствующее сообщение, а в конце, если символов не было найдено, т.е. если m = 0, то выводим сообщение «Символ один».

var s: string; n, k, c, m: integer;
begin
writeln('Введи слово');
readln(s); n := length(s);
writeln('Символов: ', n);
c := n div 2 + 1;
writeln('Позиция середины: ', c);
writeln('Средний символ - ', s[c]);
for var i := 1 to n do
begin
if s[i] = s[c] then
begin
if c <> i then
begin
m := m + 1;
writeln('Символ встречается ещё раз на позиции ', i);
end
end
end;
if m = 0 then
writeln('Символ один')
end.

4. Измените программу из примера 8.4 так, чтобы строчные и заглавные буквы анализировались программой одинаково (например, для слова «Анна» ответ должен быть следующим: «Последний символ — а, символ встретился на месте 1»).

Слегка изменим нашу программу из примера 8.4 и при поиске других вхождение последнего символа обернём сам символ и строку в функцию LowerCase(), которая всегда возвращает строку в нижнем регистре (без больших букв). Таким образом, при поиске регистр букв для нас не будет иметь значения. Вместо функции LowerCase() можно использовать и UpperCase(), которая возвращает строку в верхнем регистре (заглавные буквы) — разницы нет.

var s: string; n, k: integer;
begin
writeln('Введи слово');
readln(s); n := length(s);
write('Последний символ - ', s[n], ', ');
k := pos(LowerCase(s[n]), LowerCase(s));
if k = n then
writeln('символ один')
else
writeln('символ встретился на месте ', k)
end.

5. Даны два слова. Верно ли, что одно из слов начинается на ту же букву, на которую заканчивается другое? (Первая буква одного из слов может быть заглавной.) Если да, то вывести букву, иначе — соответствующее сообщение.

Будем сравнивать последний символ первого слова с первым символом второго и наоборот.

var s1, s2: string; n1, n2: integer;
begin
writeln('Введи первое слово');
readln(s1); n1 := length(s1);
writeln('Введи второе слово');
readln(s2); n2 := length(s2);
if LowerCase(s1[n1]) = LowerCase(s2[1]) then
writeln('Второе слово начинается на ту же букву, на которую заканчивается первое: ', s2[1])
else if LowerCase(s1[1]) = LowerCase(s2[n2]) then
writeln('Первое слово начинается на ту же букву, на которую заканчивается второе: ', s1[1])
else
writeln('Неверно');
end.

1-2. Проверьте правильность работы своей программы на предложенных примерах. Откройте файл с таблицей и запишите результаты. Допишите в таблицу два своих значения.

Слово 1 Слово 2 Результат
array yellow y
apple auto неверно
Рыба Арбуз а
школа академия а
Дом комод д

3*. Если ответ «верно», указать, принадлежат ли буквы одному регистру.

Для выполнения этого задания нам нужно дополнительно сравнивать буквы без использования LowerCase() или UpperCase().

var s1, s2: string; n1, n2: integer;
begin
writeln('Введи первое слово');
readln(s1); n1 := length(s1);
writeln('Введи второе слово');
readln(s2); n2 := length(s2);
if LowerCase(s1[n1]) = LowerCase(s2[1]) then
begin
writeln('Второе слово начинается на ту же букву, на которую заканчивается первое: ', s2[1]);
if s1[n1] = s2[1] then
writeln('Буквы принадлежат одинаковым регистрам')
else
writeln('Буквы принадлежат разным регистрам')
end
else if LowerCase(s1[1]) = LowerCase(s2[n2]) then
begin
writeln('Первое слово начинается на ту же букву, на которую заканчивается второе: ', s1[1]);
if s1[1] = s2[n2] then
writeln('Буквы принадлежат одинаковым регистрам')
else
writeln('Буквы принадлежат разным регистрам')
end
else
writeln('Неверно');
end.

6. Измените программу из примера 8.8 так, чтобы при k = 0 выводилось сообщение 'Подстрока в строке не встречается'.

Для решения задачи добавим ещё одно условие для k = 0.

var s, p, t: string;
n1, n2, k: integer;
begin
writeln('Cтрока s');
readln(s);
writeln('Подстрока p');
readln(p);
n1 := length(s);
n2 := length(p);
k := 0;
for var i := 1 to n1 - n2 + 1 do
begin
t := copy(s, i, n2);
if t = p then
k := k + 1;
end;
if k > 0 then
writeln('Встречается ', k, ' раз(-а)')
else
writeln('Подстрока в строке не встречается')
end.

7.  Программу из примера 8.8 записали следующим образом:

var s, p, t: string;
k, i: integer;
begin
writeln('Строка s');
readln(s);
writeln('Подстрока p');
readln(p);
k := 0; i := 1;
while PosEx(p, s, i) <> 0 do
begin
i := PosEx(p, s, i) + 1; k := k + 1;
end;
writeln('Встречается', k, 'раз(-а)');
end.

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

  1. Строка s := "Не слово хозяин хозяину, а хозяин слову хозяин", подстрока p := "хозяин".
  2. Строка s := "Не слово хозяин хозяину, а хозяин слову хозяин", подстрока p := "хозяйка".

В первом случае цикл выполняется 41 раз в программе из примера 8.8, а в изменённой программе — всего 4 раза. Во втором случае цикл выполняется 40 раз в программе из примера 8.8, а в изменённой — ни одного раза.

*Можно ли подобрать тест, для которого количество выполнений цикла будет одинаковым для обеих программ? Если да, то какой?

Можно. Для этого нужно, чтобы строка s состояла только из подстрок p, например s := "ааааа", подстрока p := "а" или s := "ааааа", подстрока p := "аа" и т.д.

8. Получите из слова «ТЕСТИРОВАНИЕ» указанные слова. Для этого используйте команды: copy, delete, insert и операцию сложения строк.

var s, s1, s2, s3, s4, s5, s6: string;
begin
s := 'ТЕСТИРОВАНИЕ';
s1 := copy(s, 6, 2) + copy(s, 3, 2);
s2 := copy(s, 10, 2) + copy(s, 8, 2);
insert(s[3], s, 8);
insert(s[4], s, 9);
insert(s[2], s, 10);
insert(s[6], s, 11);
delete(s, 2, 5);
delete(s, 7, 6);
s4 := s;
s3 := copy(s, 1, 2) + copy(s2, 3, 2) + copy(s1, 1, 1);
delete(s, 10, 3);
insert(s[6], s, 10);
delete(s, 2, 5);
s5 := copy(s1, 2, 1) + copy(s1, 4, 1) + copy(s2, 3, 1) + copy(s4, 5, 2) + copy(s1, 3, 2) + copy(s2, 2, 1) + copy(s4, 5, 1);
s6 := copy(s3, 1, 2) + copy(s1, 3, 2);
writeln('1. ', s1);
writeln('2. ', s2);
writeln('3. ', s3);
writeln('4. ', s4);
writeln('5. ', s5);
writeln('6. ', s6);
end.