Кафедра інформатики

Харківський національний педагогічний університет імені Г.С. Сковороди

Кафедра інформатики

Харківський національний педагогічний університет імені Г.С. Сковороди

Задача тижня 2011

Задача тижня 23.04.12 – 29.04.12

Zadacha_tyzhnya_khopka_zadacha_tyzhnyaZadacha_tyzhnya_khopka_2_analiz_rezultativZadacha_tyzhnya_khopka_3_reytyngZadacha_tyzhnya_khopka_4_arhiv

 

Дужки

 

Комп’ютерна обробка виразів (арифметичних, логічних) розпочинається з перевірки того, чи є запис виразу правильним – лексично, синтаксично, семантично.

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

Семантичний аналіз (від грецького semantikos – означаючий) полягає у перевірці змісту та сутності лексем і елементів виразу. Зокрема він відповідає за виявлення явних спроб ділення на нуль, обчислення квадратного кореня з від’ємного числа і тому подібних випадків.

Одна з вимог синтаксичної правильності полягає у формальній правильності розстановки дужок.

1. Створіть програму, що перевіряє правильність розстановки дужок у заданому виразі.

Вхідні дані

V –  рядок, у якому подано вираз, вводиться з клавіатури або з файлу.

Вихідні дані

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

2. Заповніть тестову таблицю за результатами роботи програми:

 

V R
1(((А)*(В-C)-D)/2)так
2(А+В*(C-D)ні
3X-((А-В)*С)+(D/(E+F))/Y
4А-(X/(В*С)+D/(E+F)
5(D+(F-(А-В)*С)+D/(E+F)))(
6)((А-В)*С)+(D/(E+F)))
7D+(F-(А-В)/F+(K))*С+(D/(E+F)
8D+(F-(А-В/F)+K)*С)/D/(E+F)
9(А+(C+B))/K-D)*(B+F/(A+B*C)

 

Аналіз розв’язку задачі «Дужки»

 

Рішення матиме вигляд:

Введемо змінні:

V – заданий рядок;

n – ціле число, довжина рядка V;

k – ціле число, «лічильник» дужок;

R – рядок, який має значення «так» або «ні» – результат перевірки рядка V;

i – ціле число, допоміжна змінна.

початок
вводимо рядок V;
n: = довжина рядка V;
k: = 0; {встановлюємо початкове значення лічильника}
i: = 1;
поки (i ≤ n) та (k ≥ 0)
початок циклу
якщо i-символом рядка V є ‘(‘ то k:= k + 1; {збільшуємо значення лічильника на 1}
якщо i-символом рядка V є ‘)‘ то k:= k – 1; {зменшуємо значення лічильника на 1}
i:= i + 1;
кінець циклу
якщо (k дорівнює нулю) то R:=’так’ інакше R:=’ні’;
вивести рядок R на екран;

кінець.

 

Тестова таблиця за результатами роботи програми:

 

VR
1(((А)*(В-C)-D)/2)так
2(А+В*(C-D)ні
3X-((А-В)*С)+(D/(E+F))/Yтак
4А-(X/(В*С)+D/(E+F)ні
5(D+(F-(А-В)*С)+D/(E+F)))(ні
6)((А-В)*С)+(D/(E+F)))ні
7D+(F-(А-В)/F+(K))*С+(D/(E+F)ні
8D+(F-(А-В/F)+K)*С)/D/(E+F)ні
9(А+(C+B))/K-D)*(B+F/(A+B*C)ні

 

Журі оцінило надіслані розв’язки наступним чином:

 

Учасник Кількість балів
1Kolgatin Andrey4
2forsh34
3SERGEY4