Задача 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.