Пошук

неділю, 10 січня 2010 р.

XI. Рядкові величини

ЗАДАЧА № 58

Постановка задачі:

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

Аналіз алгоритму:

Для розв’язання задачі, по-перше, необхідна рядкова величина для зберігання тексту (для зберігання великого тексту можна зарезервувати масив). Для спрощення задачі будемо вважати, що текст має довжину не більше 255 символів, тобто для його зберігання достатньо одного рядка. Крім цього, нам необхідна змінна символьного типу для зберігання заданого символу а, кількість яких ми будемо обчислювати.

Оскільки рядок фактично можна вважати масивом символьних величин, для його обробки необхідно організувати цикл від першого до останнього символу рядка (length(St)), що буде переглядати кожен елемент рядка та порівнювати його з шуканим символом. У випадку збігу елементів, що порівнюються, лічильник збільшується на одиницю.

Текст програми:

Program Task_58;

Uses crt;

Var і, count:word;

{і – змінна циклу, count – кількість знайдених символів}

a:char; {a – шуканий символ}

St:string; {St – даний текст}

Begin

Clrscr;

Write(‘Введіть текст: ‘);

Readln(St);

Write(‘Введіть шуканий символ: ‘);

Readln(a);

Count:=0; (Початкове значення лічильника}

For i:=1 to length(St) do

If St[i] = a Then count:=count+l;

Writeln(‘Шуканих символів в тексті: ‘, count);

Readkey;

End.

ЗАДАЧА № 59

Постановка задачі:

У даному тексті замінити всі символи «:» на символи «–» і навпаки.

Аналіз алгоритму:

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

У результаті текст після закінчення роботи програми відтвориться у початковому вигляді.

Текст програми:

Program Task_59;

Uses crt;

Var і:word; {і – змінна циклу}

St:string; {St – даний текст}

Begin

Clrscr;

Write(‘Введіть текст: ‘);

Readln(St);

For i:=1 to length(St) do

If St[i] = ‘:’ Then

Begin Delete (St, i, 1) ; Insert (‘–’St, 1) ; End

Else

If St[i]=‘–’ Then

Begin Delete(St, i, 1); Insert(‘:’, St, 1); End;

Writeln(‘Результуючий рядок: ‘, St);

Readkey;

End.

ЗАДАЧА № 60

Постановка задачі:

У даному тексті замінити всі символи « . » на послідовність символів « … ». Якщо у тексті зустрічаються підряд три крапки, то залишати їх без змін.

Аналіз алгоритму:

У цій задачі після виконання замін збільшується довжина рядка, причому після шуканого символу становиться такий самий. Тому, якщо цикл організувати, як і в попередньому випадку, весь текст, починаючи з першої крапки, заміниться на крапки (подумайте чому). Отже, доцільно скористатися циклом з передумовою, що дозволяє змінну циклу змінювати на будь–який крок (а не тільки на одиницю, як в циклі з параметром). Для того, щоб не виконувати заміну у випадку наявності трьох крапок в тексті, будемо перевіряти не тільки поточну, а й наступну за нею позицію (не забудьте при цьому про можливість виходу за межі рядка!!!). Останній символ рядка тут перевірятиметься окремо.

Зверніть увагу, що у випадку, коли довжина результуючого рядка буде складати більш ніж 255 символів, зайві символи будуть втрачатися. Для спрощення задачі ми їх не враховуємо, але для сильних учнів можна запропонувати організувати збереження цих символів у додатковому рядочку.


Текст програми:

Program Task_60;

Uses crt;

Var i:word; {i – змінна циклу}

St: string; {St – даний текст}

Begin

Clrscr;

Write(‘Введіть текст: ‘);

Readln(St); i:=1;

While i

Begin

If (St[i]=‘.‘) and (St[i+1]<>‘.‘) Then

Begin Insert(..‘, St, i+l); i:=i+2; End;

i:=i+1;

End;

If St[length(St)]=‘.‘ Then St:=St+’..‘;

Writeln(‘Результуючий рядок: ‘, St);

Readkey;

End.

ЗАДАЧА № 61

Постановка задачі:

Перевірити, чи однаково читається дане слово зліва направо і навпаки.

Аналіз алгоритму:

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

Текст програми:

Program Task_61;

Var і:byte; {і – змінна циклу}

St, Rez:string;

{St – даний текст, Rez – результуючий (перегорнутий) рядок}

Begin

Clrscr;

Write(‘Введіть текст: ‘);

Readln(St);

Rez:= ‘‘; {Очищення рядка}

For і:– length(St) downto 1 do

Rez := Rez+St[i]; {Перегортання рядка}

If Rez = St Then Writeln(‘Слово є паліндромом. ‘)

Else Writeln("Слово не є паліндромом. ‘);

Readkey;

End.


ЗАДАЧА № 62

Постановка задачі:

Визначити, скільки разів у даному тексті зустрічається послідовність символів «абв».

Аналіз алгоритму:

Організовуємо прохід по рядку за допомогою циклу з параметром, причому враховуємо, що слід перевірити три послідовно розташованих символи (зверніть увагу на можливість виходу за межі рядка!). Один з методів вибору кількох послідовних символів уже розглядався раніше (і–ий, і+1–ий та і+2–ий елементи), тому розглянемо інший метод, що полягає у використанні функції копіювання Copy. Нагадуємо, що ця функція містить у якості параметрів вихідний рядок, номер початку копіювання (виділення) та кількість вибраних символів, тобто для вибору трьох символів з будь–якого місця рядка ця функція буде мати вигляд:

Cоpy(St, i, 3)

Порівнюючи виділені (скопійовані) символи з еталоном, нарощуємо лічильник при виконанні поставлених умов.

Текст програми:

Program Task_62;

Uses crt;

Var і:byte; {і – змінна циклу}

St:string; {St – даний текст}

Count:byte; {Count – лічильник послідовностей}

Begin

Clrscr;

Write(‘Введіть текст: ‘);

Readln(St);

Count:=0; {Початкове значення лічильника}

For i:=1 to length(St)– 2 do

If Copy(St, i, 3) = ‘абв’ Then count:=count+1;

Writeln(‘Кількість шуканих послідовностей: ‘, count);

Readkey;

End.

ЗАДАЧА № 63

Постановка задачі:

Нехай дано формулу. Визначити коректність формули щодо кількості відкритих та закритих дужок. Вважається, що закриті дужки не стоять перед відкритими. Якщо дужки у формулі відсутні – повідомити про це.

Аналіз алгоритму:

Для визначення коректності формули слід підрахувати кількість відкритих та закритих дужок, причому баланс дужок вважається вірним не тільки якщо ці значення дорівнюють одне одному, а й якщо відкрита дужка передує закритій. Останнє перевіряється тим, що кількість відкритих дужок має завжди бути більшою або рівною кількості закритих.

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

Щоб визначити, чи є в формулі дужки взагалі, достатньо перевірити на нуль кількість одних чи других дужок. Визначимо змінні count–left та count–right як кількість відповідно лівих (відкритих) та правих (закритих) дужок.

Текст програми:

Program Task_63;

Var і:byte; {і – змінна циклу}

St:string; {St – даний текст}

count_left, count_right:byte;

{count_left – лічильник лівих дужок,

 count_right – лічильник правих дужок}

Begin

Clrscr;

Write(‘Введіть формулу: ‘);

Readln(St);

Count_left:=0; {Початкове значення лічильника)

Count_right:=0;

і:= 1;

While (i<=length(St)) and (Count_left>=Count_right)) do

Begin

If St[i] = ‘(‘ Then count_left:=count_left+1;

If St[i] = ‘)’ Then count_right:=count right+1;

і: =i+l ;

End;

If (count_left=0) and (count_right=0)

Then wrіteln(‘Формула не має дужок. ‘)

Else

If count_left=count_right Then Writeln( ‘Формула коректна’)

else writeln(‘Формула не коректна. ‘);

Readkey;

End.

Немає коментарів:

Дописати коментар