Роздрукувати сторінку
Главная \ Методичні вказівки \ Методичні вказівки \ 1771 Лабораторна робота 5 на тему Обробка символьної інформації

Лабораторна робота 5 на тему Обробка символьної інформації

« Назад

Лабораторна робота № 5

Обробка символьної інформації

Мета роботи: Оволодіти методами та функціями обробки символьної інформації

5.1. Теоретичні відомості

Символьна константа складається з одного символа ASCII між апострофами (''). Приклади спеціальних символів:

Новий рядок

'\n'

Горизонтальна табуляція

'\t'

Повернення каретки

'\r'

Апостроф

'\''

Лапки

'\"'

Нульовий символ

'\0'

Зворотний слеш

'\\'

Стринги є одним з найбільш корисних та важливих типів даних мови С. Символьний рядок (стринг) — це масив символів, замкнений у лапки ("). Він має тип char. Нульовий символ (\0) автоматично додається останнім байтом символьного рядка та виконує роль ознаки його кінця. Кількість елементів у масиві дорівнює кількості символів у стрингу плюс один, оскільки нульовий символ також є елементом масива. Кожна стрингова константа, навіть у випадку, коли вона ідентична іншій стринговій константі, зберігається у окремому місці пам'яті.  Якщо необхідно ввести у рядок символ лапок ("), то перед ним треба поставити символ зворотного слешу (\). У стринг можуть бути введені будь-які спеціальні символьні константи, перед якими стоїть символ \.

Прототипи всіх функцій, що працюють з рядками символів, містяться у файлі string.h. Всі функції працюють з рядками, що закінчуються нульовим символом. Ось деякі з них: 

int strcat( char *, char *) — з'єднати два стринги;

int strcpy(char *s1, char *s2) — копіювати рядок s2 у рядок s1;

int strlen(char *s) — визначити довжину рядку (кількість символів без нульового символа).

Для роботи з масивом символів, що не має у кінці нульового байта, можна користуватися функціями перетворення буферів. Протипи цих функцій знаходяться у файлі mem.h. Ці функції дозволяють присвоювати кожному байту в межах вказаного буфера задане значення, а також використовуються для порівняння вмісту двох буферів. Наприклад:

memcpy() — копіювання символів з одного буфера у другий, поки не буде скопійований заданий символ або не буде скопійовано визначену кількість символів

memcmp() — порівнює вказану кількість символів з двох буферів

У файлі ctype.h описано прототипи функцій, що призначені для перевірки літер. Ці функції повертають ненульове значення (істина), коли її аргумент задовольняє заданій умові або належить вказаному класу літер, та нуль в іншому випадку. Наприклад:

int islower(int с) — символ с  є малою літерою;

int isupper(int c) — символ с  є великою літерою;

int isalnum(int c) — символ с є буквою або цифрою;

int isalpha(int c) — символ с є буквою;

int tolower(int c) — перетворення літери у нижній регістр;

int strtol(int c) — перетворення стрингу у довге ціле число;

5.2. Приклад

Обчислити вираз з дужками, десятковими цифрами та знаками +, -, *, /.

#include <ctype.h>

#include <math.h> 

isdig(char c) {return ((isdigit(c)) || 'с'=='.');} 

double val(char **); 

double getdig(char ** s)

{

double res;

if(**s=='(') res=val(++*s);

else {res=atof(*s); while(isdig(*++*s));};

return res;

} 

double multi(char** s)

{

double res=getdig(s);

while((**s=='*') || (**s=='/'))

if(**s=='*') res*=getdig(++*s);

else res/=getdig(++*s);

}

double val(char** s)

{

double res=multi(s);

while((**s!=')') && (**s!='\0'))

if(**s=='+') res+=multi(++*s);

else res-=*(++*s);

if(**s==')') ++*s;

return res;

} 

double getsvalue(char* s) {char** l; *l=s;

return val(l);} 

main()

{

char* s="2-4/2+25/(2+3)/5+(-1)*(2*4/8-2)*(-1)+5";

printf("%g\n", getsvalue(s));

}

5.3. Порядок виконання роботи

5.3.1. Проаналізувати умову задачі.

5.3.2. Розробити алгоритм та створити програму розв’язання задачі згідно з номером варіанту.

5.3.3. Результати роботи оформити протоколом.

5.4. Варіанти завдань

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

2. Дано натуральне число n, символи . Визначити число входжень у послідовність  групи літер abc, aba.

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

4. Скласти процедуру "стиснення" вхідної послідовності символів: кожна підпослідовність, що складається з декількох входжень одного і того ж символа, замінюється на текст , де  — символ, а  — рядок, що є записом числа входжень символа  у вхідну послідовність.

5. Скласти процедуру побудови рядка символів, що є записом заданого дійсного числа у десятковій, двоїчній  та 16-ричній системах числення. Рядок повинен містити вказану кількість цифр після коми.

6. Скласти процедуру обчислення значення цілого числа за заданим рядком символів, що є записом цього числа у десятковій, 16-ричній та двоїчній системах числення. У випадку вводу числа у 16-ричній та двоїчній системах счислення необхідно скласти функцію їх переводу  у десяткову систему.

7. Зафіксуємо натуральне число  та перестановку чисел  (її можна задати за допомогою послідовності натуральних чисел , в яку входить кожне з чисел). Під час шифровки у вхідному тексті до кожної з послідовних груп по символів застосовується зафіксована перестановка. Нехай =4 та перестановкою є 3,2,4,1. Тоді група символів  замінюється на . Якщо в останній групі менше чотирьох символів, то до неї добавляються пробіли. Користуючись наведеним способом, зашифрувати та розшифрувати заданий текст.

8. Ввести з клавіатури стрингову константу, переводячи малі літери у великі. Виділити 16-річні константи, перемножити їх. Представити виділені числа та їх добутки у десятковій системі счислення.

9. Ввести  послідовностей стрингових констант різної довжини. Представити їх у вигляді символьної матриці розмірності , де  — змінна, що задається з клавіатури. Перевести кожний символ у відповідний код ASCII.

10. Ввести  послідовностей стрингових констант різної довжини. Вирівняти їх у відповідності з довжиною найбільш короткої. Представити їх у вигляді символьної матриці. Виконати:

1) установку заданих елементів матриці у задане значення;

2) Визначити номери ідентичних рядків.

11. Ввести символьну матрицю. Інвертувати її відносно середини рядку. Перетворити матрицю у стринг. Знайти довжину стринга.

12. Ввести стрингову константу. Перетворити її у трьохдіагональну матрицю, присвоївши для цього нулі відповідним елементам. Транспонувати отриману матрицю відносно середини (середнього рядку). Конкатенувати два рядки отриманої матриці. Вивести всі проміжні та кінцеві результати.

13. Ввести стрингові константи. Знайти найбільше слово серед слів, друга літера яких є літерою а; якщо слів з найбільною довжиною є декілька, то знайти останнє. (Словом будемо називати групи символів, що поділені пробілами (одним або декількома), а також що не містять в собі пробілів.) Якщо таких слів нема, то повідомити про це. Розв'язати цю задачу, якщо:

1) слова складаються не більш як із 10 символів;

2) не накладено обмежень на кількість символів у слові.

14. Ввести  послідовностей символьних констант. Покладаючи, що кількість символів у слові не перевищує 20:

1) визначити, скільки є слів, що складаються з одного, двох, трьох і т.п. символів;

2) визначити загальну кількість слів.

15. Ввести дві стрингові константи. Визначити співпадання їх компонент. У випадку розходженнь отримати номери не співпадаючих компонент. У результаті отримати перетин стрингів.

16. Для того щоб зашифрувати текст з 121 літери, його можна записати у квадратну матрицю порядку 11 по рядках, після чого прочитати його по спіралі, починаючи з центра (елемента, що має індекси 6,6). Зашифрувати та розшифрувати заданий текст. Текст вводиться з клавіатури.

17. Наступний спосіб призначений для шифровки послідовностей нулів та одиниць (або крапок та тире). Нехай  — така послідовність. Послідовність  — результат шифрування, що створено за допомогою наступного закону. 

Використовуючи наведений спосіб, зашифрувати та розшифрувати задану послідовність.

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

19. Реалізувати спосіб шифрування, який полягає у табличній заміні кожного символа другим символом — його шифром. Вибрати деяку таблицю, розробити спосіб її представлення. Зашифрувати та розшифрувати текст.

20. Задано символьну матрицю розмірністю .

1) Транспонувати її відносно головної діагоналі.

2) Представити верхню діагональну матрицю  стрингами.

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

22. Ввести з клавіатури стрингову константу, не відрізняючи малі та великі літери. Визначити кількість входжень в неї 16-ричних чисел. Подати знайдені числа у двоїчній та десятковій системах числення.

23. Нехай по деякому каналу зв'язку передається повідомлення, що має вигляд послідовності нулів та одиниць (або крапок та тире). Із-за завад можливий помилковий прийом деяких сигналів: нуль може бути прийнятий як одиниця та навпаки. Можна передавати кожний сигнал тричі, замінюючи, наприклад, послідовність 1,0,1  послідовністю 111 000 111. Три послідовні цифри під час розшифровки замінюються тією цифрою, яка зустрічається серед них найчастіше. Таке шифрування підвищує стійкість до помилок. Написати программу розшифровки.

24. Групи символів, що розмежовані пробілами (одним або декількома) та не містять пробілів у середині себе, називаються словами. Порахувати кількість слів у заданій послідовності, що починаються з літери b. Розташувати слова у алфавітному порядку.

25. Знайти у заданій послідовності кількість слів, у яких перший та останній символ співпадають. Знайти довжину найкоротшого слова.

26. Знайти у заданій послідовності слова, що містять групи літер ba, ma. Замінити малі літери в цих словах одноіменними великими.

5.5. Контрольні запитання

1. Чим відрізняється рядок від буфера?

2. Які ви знаєте класи функцій для обробки символьної інформації?

3. Наведіть приклади функцій:

- для роботи з буферами;

- для роботи зі стрингами;

- визначення класу символів та перетворення символів.

- перетворення даних.

3. Що таке псевдографика?

З повагою ІЦ "KURSOVIKS"!