Лабораторна робота №5 Програмування задач по обробці послідовності символів
Мета роботи
Одержання знань і навиків, необхідних для роботи з символьною інформацією
Завдання на лабораторну роботу
1. Ознайомитися з теоретичними відомостями даної лабораторної роботи.
2. Скласти та виконати на ПЕОМ програми з таблиці 5.1 відповідно до варіанту.
3. Оформити звіт та захистити роботу.
Таблиця 5.1 – Індивідуальні завдання до лабораторної роботи №5
№ варіанта | Номери задач | № варіанта | Номери задач |
251, 265, 361, 802 | 257г, 270г, 421б, 811 | ||
252а, 266, 362, 803 | 257д, 270д, 421в, 812а | ||
252б, 267, 363, 804а | 257е, 312а, 421г, 812б | ||
253а, 268, 364, 804б | 258, 312б, 546а, 812в | ||
253б, 269а, 365а, 805 | 259, 313, 546б, 812г | ||
253в, 269б, 365б, 806а | 260а, 314, 546в, 812д | ||
253г, 269в, 365в, 806б | 260б, 315а, 549, 813 | ||
254, 269г, 365г, 807 | 260в, 315б, 548, 812ж | ||
255, 269д, 366(1), 808а | 261а, 316а, 549, 813 | ||
256а, 269е, 366(2), 808б | 261б, 316б, 550, 814а | ||
256б, 269ж,366(3), 808в | 262а, 316в, 551а, 814б | ||
257а, 270а, 419, 808г | 262б, 316г, 551б, 814в | ||
257б, 270б, 420, 809 | 263, 316д, 551в, 815 | ||
257в, 270в, 421а, 810 | 264, 547а, 552а, 816 |
Основні теоретичні відомості
В мовах С та С++ існують достатньо розвинені засоби для обробки символьної інформації, такі як введення/виведення окремих символів та рядків, функції для визначення належності символів та рядків, об'єднання рядків, перетворення їх.
Рядок - це послідовність символів, що заключенні у подвійні лапки. Транслятор додає в кінець кожного рядка нульовий байт ‘\0’, так що програма, що переглядає рядок, може знайти її кінець.
Приклад:
cout<<“This is character string”;
Кожна рядкова константа, навіть якщо вона ідентична іншій рядковій константі, зберігається в окремому місці пам'яті.
Рядкова константа – це масив символів. Вона має тип char[]. Символьна константа уявляє собою деякий символ в лапках.
Приклад :
‘a’, ‘A’,’7’,’*’.
Символьні константи вважаються данними типу int.
Існує декілька способів визначення рядків: використання рядкових констант, масивів типу char, покажчиків на тип char та масивів, що складаються з символьних рядків.
Приклади :
1. Ініціалізація масива за допомогою рядкової константи:
char m[]=”string”;
Даний оператор ініціалізував зовнішній масив m для вказаного рядка. Аналогічно
char m[]={‘s’,’t’,’r’,’i’,’n’,’g’,’\0’};
ім'я m - покажчик на нульвий елемент масиву:
m = =&m [0]; *m = = ‘s’, *(m+1) = = m [1] = = ‘t’.
2. a) char *l = “string”;
б) static char l[] = “string”;
Опис з масивом б) визиває створення масиву з сьоми елементів (кількість символів у слові string+1 символ, що завершує ‘\0’). Кожний елемент ініціалізується сумісним символом. Компілятор розглядає ім'я l як синонім адреси першого елемента масиву, де l - константа покажчика. Можно використовувати операциї l+1 для ідентифікації наступного елемента маcиву (‘t’). Але не можна використовувати вираз ++l .
Форма з покажчиком а) також визиває створення в статичній пам'яті сім елементів для зберігання рядка. Окрім того, виділяється ще одна чарунка пам'яти для змінної l, яка є покажчиком. Спочатку ця змінна вказує на початок рядка, але її значення може змінюватися. В даному випадку, використовуючи операції збільшення, ++l можно посилатися на елемент ‘t’. Таким чином, у випадку а) ініціалізовано одну змінну типу покажчик.
Приведемо приклад явного задання розміру пам'яти.
Приклад :
char l[7] = “string”;
char name [81];
Масив name буде заповнюватись у процесі роботи, саме тому резервується 80 символів. Якщо кількість елементів в name буде менш ніж 80, то невикористані елементи автоматично ініціалізуються символом нуль.
Введення-виведення рядків
Розглянемо найбільш розповсюдженні бібліотечні функції gets() та puts( ).
Функція gets( ) отримує рядок з буфера клавіатури. Вона зчитує символи до тих пір, поки не зустріне символ нового рядка (‘\n’). Функція бере вcі символи до знака ‘\n’, приєднує до них нуль-символ та передає рядок програмі, що її визиває.
Приклад:
/* отримання імені * /
main ( )
{ char name [81]; /* виділення пам'яти*/
printf ("Як вас звуть? \n");
gets(name); /* ім'я поміщується до масиву name */
cout<<”Гарне ім’я”<<name<<”\n”;
Функція puts( ) виводить рядок символів на консоль виводу, у неї є тільки один аргумент - покажчик на рядок.
Приклад:
void main ( ) {
char str[]=”Приклад”;
puts (str);
}
Операції над рядками
Для використання наведених далі функцій необхідно додати до програми файл string.h:
#include <string.h>
Таблиця 5.2 – Функції для роботи з рядками
№ | Функція | Опис |
char *strcat (st1, st2); char *st1, *st2; | Використовується для злиття рядків символів. В результаті st2 заповнюється символами st1 та st2. | |
char *strnkat (st1, st2, n); char *st1, *st2; int n; | Виконує злиття двох рядків так, що з другого рядка копіює не больш за n символів. | |
int strcmp (st1, st2); char *st1, *st2; | Порівнює два рядка у лексикографічному порядку. Повертає 0, якщо st1=st2 -1, якщо st1<st2 1, якщо st1>st2 | |
int strncmp (st1, st2, n); char *st1, *st2; int n; | Порівнює перші n символів двох рядків. | |
char *strcpy (st1, st2); char *st1, *st2; | Копіює рядок st2 в st1. | |
char *strncpy (st1, st2, n); char *st1, *st2; int n; | Копіює не більш ніж n символів рядка st2. | |
int strlen (str); char *str; | Визначає довжину рядка, тобто кількість символів у рядку без завершаючого ‘0’. | |
char *strchr (str, c); char *str; int c; | Знаходить у вказаному рядку перші входження символа с. | |
char *strrchr (str, c); char *str; int c; | Знаходить у рядку останнє входження символа с. |
Продовження таблиці 5.2
char *strpbrk (st1, st2); char *st1, *st2; | Знаходить у рядку st1 деякий із множини символів, що входять до рядка st2. | |
char *strspn (st1, st2); char *st1, *st2; | Визначає довжину відрізка рядка st1, що містить символи зі множини символів, що входять до рядка st2. | |
char *strtok (st1, st2); char *st1, *st2; | Виділяє з рядка st1 лексеми, разподілені любим із множини символів, що входять до рядка st2. |
Приклад:
/* використання функцій strcat( ) и strcpy( )*/
main ( )
{
static char name [80];
static char cpname [80];
static char add [] = “додано до кількості користувачів системи”;
printf(“Вкажіть ваше прізвище.\n”);
gets(name);
strcpy(cpname, name); /*копія прізвища*/
strcat(name, add);
puts(name);
puts(cpname);
puts(add);
}
Результати роботи програми:
Вкажіть ваше прізвище.
Іванов
Іванов додано до кількості користувачів системи
Іванов
додано до кількості користувачів системи