Приклади розв’язування задач з використанням основних операцій для роботи з літерними величинами

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

Задача 192. 192. У введеному тексті замінити всі пропуски, що йдуть підряд одним єдиним пропуском.

Розв’язання: Дана задача є однією з великої кількості невеликих підзадач, які доводиться розв’язувати при написанні «нормальних» текстових редакторів і відноситься вона до задач з категорії форматування тексту. Уточнимо умову задачі, тобто накладемо обмеження, що наше речення повинно починатись і закінчуватись символом, відмінним від пропуску (Задачу, в якій речення може починатись з пропусків і закінчуватись пропусками ми рекомендуємо розв’язати вам самостійно після аналізу розв’язку цієї задачі). Зверніть увагу, що ми досить часто уточнюємо формулювання завдань. Робимо ми це для того, щоб привчити вас до уважного аналізу умови кожної задачі. Адже іноді саме на таких «дрібницях» ви можете отримати нижчу від очікуваної оцінку, і особливо це стосується задач, що пропонуються на різних олімпіадах.

Суть пропонованого вам алгоритму розв’язку полягає в тому що ми в нову літерну величину St1 будемо копіювати всі символи літерної величини St, які відмінні від пропуску. Пропуск скопіюємо лише тоді, коли розглядуваний символ припуск і наступний за ним – не пропуск. Якщо ви уважно розібрались з розглянутою вище задачею про підрахунок кількості слів у реченні, то мабуть помітили, що запропонований спосіб майже схожий на той, що ми використали при підрахунку кількості слів у реченні (з точністю «навпаки»).

Після цього написання програми не становить труднощів:

program del_space;

var St, St1: string;

i: integer;

begin

write(‘Введiть текст: ’);readln(St);

St1:= ‘[’+St[1];

for i:= 2 to length(St) do

if st[i] <> ‘ ’ then st1:=st1+st[i]

else if (st[i] = ‘ ’) and (st[i+1] <> ‘ ’) then

st1:= St1 + st[i]

St1:= St1 + ‘]’;

writeln(St1);

readln

end.

Задача 193. 193. Підрахувати кількість літер, які зустрічаються найчастіше.

Розв’язання: Одна з досить цікавих задач, яку можна розв’язувати багатьма способами. Але найцікавішим, на наш погляд, є спосіб, коли ми поступимо досить несподіваним чином: враховуючи, що символів, які ми можемо вводити з клавіатури є небагато – всього 255, ми утворимо масив з 255 елементів типу integer (при вводі з клавіатури нам з головою вистачило б і byte), обнулимо масив і просто будемо збільшувати елементи масиву з порядковим номером, що відповідає черговому введеному символу. По закінченню розгляду введеного тексту знайдемо в масиві найбільше число і виведемо на екран і його (число) і символ (літеру), що йому відповідає. Програма, що реалізує даний алгоритм буде такою:

program max_simbol;

var st: string;

i: integer;

simvol: array[1..255] of integer;

k, max: integer;

begin

write(‘Введiть текст: ’); readln(St);

for i:= 1 to 255 do simvol [ i ]:= 0;

for i:= 1 to length(st) do inc(simvol [ ord (st [ i ]) ]);

max:= 0;

for i:= 1 to 255 do if simvol [ i ] > max then

begin

max:= simvol [ i];

k:= i;

end;

writeln(‘Найчастiше зустрiчається символ: «’, chr(k), ‘» -> ’,max);

readln

end.

Використання операцій з літерними величинами при розробці програм будь–якого типу є важливим, хоча б з точку зору розширення кількості способів розв’язання задачі. Розглянемо задачу, яка вже розглядалась раніше.

Задача 194. 194. Перевірити чи є задане число «поліндромом».

Розв’язання: Спосіб, запропонований нижче підходить і до розв’язку задачі, сформулюваної у одному з попередніх розділів, а саме: перевірити чи є задане слово «поліндромом». Саме у такому формулюванні ми і розв’яжемо цю задачу. Для розв’язання задачі у першому формулюванні достатньо модифікувати описаний нижче алгоритм, змінивши в ньому типу величини, що вводиться з клавіатури з літерного на числовий, а потім добавити блок переводу числової величини у літерну. Цю модифікацію радимо вам здійснити самостійно, після знайомства з запропонованим способом.

Власне кажучи, перейдемо до опису алгоритму розв’язку. Ми будемо порівнювати першу літеру (а точніше, символ) слова з останньою, потім другу з передостанньою і т.д. Причому дійшовши до середини, ми на цьому зупинимось. Якщо до середини всі порівнювані літери однакові, то слово – «поліндромом», інакше – «не поліндромом». Вже одним цим ми зменшили кількість перевірок вдвічі, крім того, ми можемо з впевненістю сказати, що наш спосіб розв’язання більш універсальний, ніж довільний з числових способів. Це пов’язано з тим, що кількість цифр у довільному числовому типі у мові Паскаль є обмеженою, тому дати відповідь на запитання чи є ціле число виду 53432157498051233215089475123435 поліндромом з застосуванням числових методів дуже важко, в той же час дати відповідь на запитання сформульоване так: чи є слово 53432157498051233215089475123435 поліндромом з використанням описаного методу не становить абсолютно ніяких труднощів, можете переконатись у цьому при тестуванні приведеної нижче програмної реалізації розв’язання поставленої задачі, ввівши дане число як слово для перевірки. Крім того рекомендуємо доповнити дану програму перевірки одного слова фрагментами для вилучення можливих початкових та кінцевих пропусків, це вам знадобиться при розв’язуванні задач, запропонованих для самостійного розв’язання.

program polindrom_string;

var st: string;

i, k: integer;

Ok: boolean;

begin

write(‘ Введiть слово: ’); readln(st);

k:= length(st); { щоб у циклі кожен раз не виконувати обчислення }

Ok:= true; { вважаємо, що слово - поліндром }

i:=1;

while (i <= (k div 2)) and (Ok = true) do { поки не середина слова }

begin { і припущення вірне }

if st[i] <> st [k-i+1] then Ok:= false; { якщо ж відповідні символи не

однакові, то припущення хибне }

inc(i); { збільшили номер порівнюваних літер }

end;

if Ok = true then writeln(‘ Введене слово - полiндром.’)

else writeln (‘ Введене слово - не полiндром.’);

readln

end.

Протестували запропоноване вище число? Якщо ні, то протестуйте, а ми відмітимо той важливий факт, що спосіб зведення розв’язку числових задач до розв’язання з застосуванням операцій з літерними величинами є досить поширеним і часто значно спрощує алгоритм розв’язку. Це особливо чітко проявляється у матеріалі наступного параграфу.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: