Задача 188.188. Знайти, яке з двох введених слів більше.
Розв’язання: Всі розглянуті раніше операції порівняння двох величин, які ми застосовували до числових змінних, можна застосовувати і до літерних величин. Тобто можна говорити, що одна величина дорівнює іншій, або величина А більша (менша) за величину В. Тут необхідно зробити відповідні роз’яснення.
По–перше, зрозуміло, що «мама» = «мама», але тільки у тому випадку, коли всі літери в обох словах написані одними й тими ж символами, тобто літерами одного і того ж алфавіту. Якщо ж ми у першому слові літери «а» напишемо літерами англійського алфавіту, а у другому – на перший погляд ті ж самі літери «а» напишемо у російському (українському) алфавіті, то ці слова вже не будуть однаковими. Це пов’язано з тим, що, як ми вже вказували, тип string описано як масив типу char, а останній тип є впорядкованим і однакові на вигляд літери різних алфавітів не є однаковими, оскільки їм відповідають різні порядкові номери відповідних символів.
По–друге, як бути у випадках, коли слова мають різну кількість літер («мама» – «мам»), або ж відрізняються одним символом («мама» – «Мама»)? У даному випадку (як і всіх інших) ПЕОМ діє наступним чином: порівнюються попарно відповідні літери двох слів і як тільки виявляється, що два чергові символи в слові відмінні, то більшим вважається те слово, у якого код даного символу більший.
Все вищесказане демонструє наступна програма:
program poriwn_stroki;
var st1, st2 : string;
i,s: integer;
begin
write('Введiть переше слово: ');readln(st1);
write('Введiть друге слово: ');readln(st2);
s := 0;
for i := 1 to length(st1) do
begin
write(ord(st1[i]):3,' ');
s := s + ord(st1[i]);
end;
writeln('s = ',s);
s := 0;
for i := 1 to length(st2) do
begin
write(ord(st2[i]):3,' ');
s := s + ord(st2[i]);
end;
writeln('s = ',s);
if st1 = st2 then writeln('Слова однаковi')
else if st1 > st2 then writeln('Переше слово бiльше')
else writeln('Друге слово бiльше');
readln;
end.
Приклади розв’язування задач з використанням основних операцій для роботи з літерними величинами
Задача 189.189. Підрахувати, скільки разів в реченні зустрічається задана літера.
Розв’язання: Задача є досить простою і її розв’язок не становить труднощів. Єдине, що потрібно пам’ятати, так це те, що для комп’ютера є принципово важливим той факт, у якому алфавіті вводились всі літери. Тобто і у реченні і в зразку, розглядувана літера повинні вводитись в одному алфавіті. Крім того, великі і маленькі літери також є різними літерами. Ми будемо для простоти вважати, що всі літери вводяться в одному алфавіті (наприклад, українському) і маленькими літерами. Випадок використання різних алфавітів рекомендуємо розв’язати самостійно.
program kolbukw;
var St : string; { Для вводу речення }
obrazec : char; { Для вводу зразку літери }
i, kol : byte; { i – для циклу, kol – для кількості введеної літери }
begin
write('Введiть речення: '); readln(St);
write('Яку лiтеру пiдраховувати: ');readln(obrazec);
kol := 0;
for i := 1 to length(St) do
if St[i] = obrazec then inc(kol);
writeln('Шуканих лiтер в текстi -> ',kol);
readln
end.
Задача 190.190. Підрахувати кількість слів в реченні.
Розв’язання: Для підрахунку кількості слів у реченні нам потрібно згадати, як ми самі рахуємо слова і навчити цій справі ПЕОМ. Звичайними словами пояснити спосіб для комп’ютера можна так: Якщо під час перегляду всіх символів у реченні ви зустріли підряд два символи, перший з яких не є пропуском, а другий – є пропуском, то це кінець слова. Даний алгоритм врахує і той факт, коли ми будемо вводити між словами не один пропуск, а два і більше. Для універсальності і 100% точності про всяк випадок перед початком аналізу до кінця нашого речення «приклеїмо» пропуск.
Program kol_slow;
Var St : String;
i, k : Integer;
Begin
Write(‘Введіть текст: ’);Readln(St);
k := 0; St := St+ ‘ ’;
For i:=1 to length(St) – 1 do
if (St[i] <> ‘ ’) and (St[i+1] = ‘ ’) then inc(k);
writeln(‘У введеному тексті ’, k, ‘ слів.’); Readln
end.
Задача 191.191. У заданому діапазоні натуральних чисел підрахувати кількість таких чисел, у запису яких останні цифри квадратів чисел співпадають з самим числом (6 і 36, 25 і 125).
Розв’язання: Задачу можна розв’язати і без використання літерних величин, але саме такий спосіб, коли при розв’язанні числових задач використовуються операції з літерними величинами, досить часто спрощує процес розв’язку задачі. У цьому ви можете переконатись, коли спробуєте розв’язати деякі з приведених раніше задач. Алгоритм розв’язання даної задачі буде полягати у тому, що ми будемо перетворювати числа і їх квадрати у літерні величини і перевіряти, чи співпадають посимвольно ці величини, якщо рахувати з кінця. Як тільки знайдемо перше неспівпадання, переходимо до розгляду наступного числа з заданого інтервалу. З тим обмеженням, що квадрат розглядуваних чисел не перевищуватиме тип longint, програма, що реалізує описаний алгоритм, може бути такою:
program kolbukw;
uses crt;
var St1, St2: string;
a, b, i, k, k1,k2,kol : longint;
flag : boolean;
begin
write(‘Введiть початок iнтервалу: ’); readln(a);
write(‘Ведiть кiнець iнтервалу: ’);readln(b);
kol := 0;
for i := a to b do
begin
Str(i, st1);
k1 := i*i;
Str(k1, st2);
k := length(st1);
k1 := k; { почнемо порiвнювати з кiнця }
flag := true; { припускаємо, що розглядуване число нам пiдходить }
while k > 0 do { поки не порiвняли всi цифри }
begin
if St1[k] <> St2[length(St2) - (k1-k)] then
begin { якщо цифри не однаковi }
flag := false; { то число не пiдходить }
k := 0; { i тому виходимо з циклу }
end;
dec(k); { iнакше порiвнюємо наступнi цифри }
end;
if flag = true then begin
inc(kol);
writeln(st1, ‘ -> ’,st2);
end;
end;
writeln(‘Шуканих чисел у заданому iнтервалi = ’,kol);
readln
end.