
- •Лабораторна робота №1 Тема: створення та обробка динамічних масивів
- •Короткі теоретичні відомості
- •Приклади до виконання лабораторної роботи
- •Варіанти індивідуальних завдань
- •Лабораторна робота №2 Тема: створення та обробка рядків
- •Короткі теоретичні відомості
- •Приклад до виконання лабораторної роботи
Лабораторна робота №2 Тема: створення та обробка рядків
Мета: отримати навики в розробці програмних кодів, які виконують операції з рядками (масивами рядків), за необхідністю застосовуючи функції з файлу string.h
Короткі теоретичні відомості
Для аналізу символів у мові С використовуються наступні функції з файлу<ctype.h>:
isalnum(int c) – функція повертає не нуль, якщо c – код букви або
цифри, і нуль – в іншому випадку;
isalpha(int c) – функція повертає не нуль, якщо c – код букви ,
і нуль – в іншому випадку;
isascii(int c) – функція повертає не нуль, якщо c - код ASCII, тобто
код приймає значення від 0 до 127;
isdigit(int c) – функція повертає не нуль, якщо c – цифра (0–9),
і нуль – в іншому випадку;
ispunct(int c) – функція повертає не нуль, якщо c – розділовий символ, і нуль – в іншому випадку.
Приклад до виконання лабораторної роботи
Завдання 1. Задано символьний рядок, який може містити однакові слова, розділені пропусками. Необхідно сформувати новий рядок, який буде містити слова вихідного рядка без їх повторень.
Для розв’язання цієї задачі використаємо стандартні функції модуля string.h:
strtok((char* p,char separator) – під час першого виклику відділяє з рядка, адресу якого містить покажчик p, підрядок, який обмежено справа символом separator.
Для подальшого відокремлення наступних слів у тому самому рядку необхідно перший параметр указувати нульовим (NULL);
strcpy(char* s1,char* s2) – дозволяє скопіювати значення рядка s2 у рядок s1;
strcat(char* s1,char*s2) – дозволяє приєднати до рядка s1 рядок s2. При цьому символ закінчення рядка s1 - “\0” ігнорується і замінюється початковим символом рядка s2;
strstr(char* s1,char* s2) – перевіряє входження рядка s2 у рядок s1. Якщо таке входження є, функція повертає адресу того символа рядка, з якого починається входження, у протилежному випадку повертає нульове значення.
Розв’язання поставленої задачі містить декілька етапів: визначення вихідного та результуючого рядків, завдання значень вихідного рядка, відокремлення слова у заданому рядку, перевірка його наявності у результуючому рядку, а також додання знайденого слова у результат у разі необхідності.
Приклад визначення рядків:
char inp[80], //вихідний рядок
rez[80]=" ", //рядок - результат
p1[80]; //допоміжний рядок
Приклад введення вихідного рядка слів:
printf("\nInput string\n");
gets(inp);
Приклад відокремлення слів у заданому рядку
char *p; /*за допомогою покажчика p здійснюватиметься перехід за елементами рядка */
int k=1; /*прапорець, який дозволить відрізнити перший та подальші виклики функції strtok */
do
{p = strtok((k?inp:NULL), " ");
/*відділити слово вихідного рядка inp, його адресу занести у покажчик p. Першим параметром функції strtok стоїть умовний оператор ?:. Оскільки спочатку k=1, результатом дії умовного оператора буде inp, що відповідатиме першому виклику функції, */
k=0;
/*після першого виклику k змінює значення на 0, результатом дії умовного оператора як параметра функції буде NULL, що відповідатиме всім наступним викликам цієї функції. Таким чином здійснюватиметься перехід по всьому рядку inp */
if (p) printf(" %s",p); /*вивести на екран відокремлене слово*/
}while(p); /*виконувати, поки можливо відокремити слово */
Приклад перевірки наявності слова у рядку результату. Поставлену задачу можна розв’язувати декількома способами, але слід враховувати, що, виходячи, з умов послідовності однакових символів, слова які мають різну довжину також вважаються і різними словами. Наприклад, слова «ААА» і «АА» є різними, оскільки мають різну довжину. Щоб відрізнити такі слова можна визначати їх довжину, а можна з обох боків додати сигнальні символи, наприклад пропуски.
if (p) //якщо покажчик p не нульовий, тобто вдалося відділити слово
{ printf(" \n%s",p);
strcpy(p1," ");//починаємо формувати слово, обмежене пропусками
strcat(p1,p); /*додаємо до допоміжного рядка відокремлене слово з адресою p*/
if(!strstr(rez,p1)) //якщо слово p1не входить в рядок результату rez
{strcat(rez,p); //додати до рядка результату відокремлене слово з адресою p
strcat(rez," ");//додати пропуск для відокремлення доданих слів
} }
Необхідність додавання пропусків на етапі перевірки наявності відокремленого слова в рядку результату викликана дією функції strstr. Наприклад, задано рядок «чсм чс см». Першим до рядка результату буде занесено слово «чсм». В заданому рядку всі слова різні й всі мають бути занесені в результат, але слово «чс» міститься в слові «чсм». В цьому випадку функція поверне ненульовий результат і слово «чс» не буде враховано, так само, як не буде враховано і слово «см». Якщо для перевірки входження всі слова рядка обмежити пропусками, то матимемо: « чсм », « чс », « см ». Це вже зовсім різні послідовності символів, і жодна з них цілком не містить іншої. Саме з цією метою в наведеному фрагменті програми використано допоміжний рядок p1
Загальний текст програми, що дозволяє розв’язати поставлену задачу.
#include <string.h>
#include <stdio.h>
int main()
{ char inp[80],rez[80]=" ",p1[80];
char *p;
printf("\nInput string\n");
gets(inp);
int k=1;
do
{p = strtok((k?inp:NULL), " ");
k=0;
if (p)
{ printf("\n%s ",p);
strcpy(p1," ");
strcat(p1,p);
if(!strstr(rez,p1)) {strcat(rez,p);
strcat(rez," ");}
}
}while(p);
printf("\nrez = %s",rez);
getch();
return 0;
}
Зміст|вміст,утримання| звіту щодо лабораторної роботи №2
Назва, тема та мета лабораторної роботи.
Індивідуальне завдання до лабораторної роботи|задачі|.
Визначення основних змінних і функцій з|із| коментарями.
Реалізація функцій.
Лістинг основної програми, де має бути вказано, в якому місці і яка функція викликається|спричиняються|.
Варіанти завдань до лабораторної роботи №2
Ввести рядок символів. Підрахувати кількість слів у рядку. Створити новий рядок зі слів введеного рядка, у яких перший символ співпадає з останнім.
Підрахувати|полічити| частоту появи букв|літер| в рядку, якщо вважати|лічити| рівними букви|літери| у верхньому і нижньому регістрах|реєстрі|.
У рядку слів всі слова, що складаються з чотирьох букв|літер|, видалити|знищити,віддалити|, а слова, що складаються з п'яти букв|літер|, замінити словом “комп’ютер”.
Створити масив з 5 рядків символів. Побудувати новий рядок зі слів масиву рядків, які розпочинаються з символу ‘a’.
Задано масив рядків, що складаються з трьох символів. Відсортувати рядки за першою буквою|літері| у спадному порядку|ладі|.
Вводити|запроваджувати| масив рядків, довжина яких не більше певного числа. Знайти рядок найменшої довжини і вирівняти всі рядки до довжини найменшого рядка.
Уводять|запроваджується| рядок символів. Символи, які оточені пропусками|прогалинами|, називаються словами. Необхідно знайти в рядку слова, які починаються з однієї і тієї ж самої букви|літери|, і поміняти їх місцями.
Вводять|запроваджується| рядок слів (слово - рядок символів, які оточені пропусками|прогалинами|). Відсортувати слова за першою буквою|літері|.
Вводиться|запроваджується| рядок символів, в якому можуть бути символи верхнього і нижнього регістрів|реєстру|. Необхідно символи верхнього регістра|реєстру| замінити символом " * ".
Вводять|запроваджується| масив рядків символів. Необхідно знайти рядок найбільшої довжини і збільшити всю решту рядків в масиві до довжини найбільшого рядка, використовуючи символ " ! ".
У рядку слів з|із| букв|літер| латинського алфавіту знайти слова, в яких немає букв|літер|, що повторюються.
У рядку слів з|із| букв|літер| латинського алфавіту знайти слова, в яких перша буква|літера| слова входить ще хоча б раз.
У рядку слів з|із| букв|літер| латинського алфавіту знайти найкоротше симетричне слово.
Уводять|запроваджується| рядок символів, серед яких є хоча б один символ " : ". Необхідно записати в зворотному порядку|ладі| символи, які зустрінуться до першого " : " і підрахувати|підсумувати| кількість символів між символами " :", якщо таких декілька.
Уводять|запроваджується| рядок слів (слово - рядок символів, які оточено пропусками|прогалинами|). Необхідно знайти слова, що складаються тільки|лише| з букв|літер| і лише з|із| цифр.
Уводять|запроваджується| масив рядків довільної довжини (не більше заданого числа). Необхідно відсортувати слова в неспадному порядку|ладі| за останнім символом в рядках і за довжиною рядків.
Використовуючи послідовність рядків (кожний рядок – деяке число в двійковій системі числення|обчислення|), скласти рядок з|із| чисел десяткової системи числення|обчислення| (і-е число відповідає і-му рядку початкової|вихідної| послідовності).
Ввести рядок символів, який складається зі слів відокремлених одне від одного або пробілом або ‘,’. Створити новий рядок, в якому біля кожного слова вихідного рядка буде стояти довжина рядка. Наприклад: введено рядок "пишу код,який виконує обробку рядків", отримано рядок "пишу4 код3,який4 виконує7 обробку7 рядків6 " .
Задано масив слів. Необхідно визначити, чи можна у введеній|запровадженій| послідовності символів виділити слова зі|із| словника.
У вигляді рядка символів задано арифметичний вираз із цілих чисел|вираження|. Обчислити|обчисляти,вичислити| значення виразу і додати до рядка символів після символу ’=’.
Написати функції додавання|добавки| підрядка і видалення|віддалення| підрядка в будь-якому вказаному місці заданого рядка.
Задано два рядки слів. Перетворити їх на один за принципом: Задано: рядок1:{слово1, слово2, слово3 ...} рядок2:{слово1, слово2, слово3 ...} Одержати|отримати|: ряд1слово1 ряд2слово1 ряд1слово2 ряд2слово2 ….
Задано словник-перекладач у вигляді двовимірного масиву рядків. Написати програму, що дозволяє отримати|отримати| переклад|переведення,переказ| введеного|запровадженого| рядка слів.
Скласти програму, яка підраховує|підсумовує| частоту повторення двобуквених поєднань в заданому тексті. Вивести тільки|лише| ті з|із| них, частота повторення яких не менше ніж 10%.
Задано масив рядків довільної довжини. Визначити, чи є|з'являється,являється| симетричною матриця символів, побудованих|споруджених| з|із| рядків.
Написати програму “демовірус|”: уводять|запроваджується| рядок символів,|розпочинаючи,зачинаючи| з|із| середини рядка букви|літери| починають|розпочинають,зачинають| “падати вниз” - спочатку одна, потім дві й т.д. При цьому рядок, поступово стискаючись|стискуючись|, в кінці|у кінці,наприкінці| зовсім зникає.
Задано масив слів – словник. Користувач вводить|запроваджує| слово пошуку по одній букві|літері|. Після|потім| кожної введеної|запровадженої| букви|літери| слова на екрані відображається|відображується| список всіх можливих слів продовжень зі|із| словника, або з'являється|появляється| повідомлення|сполучення| про відсутність дан ого слова.
Задано рядок слів довільної довжини. Сформувати динамічний масив рядків слів певної довжини. Упорядкувати отриманий|отриманий| масив.
Задано масив рядків довільної довжини. Відформатувати даний масив рядків за шириною поля і посторінково.
Задано масив рядків і словник. Визначити входження слів словника до заданого масиву як по вертикалі, так і по горизонталі.
Деякі функції роботи з рядками із файлу string.h
Тип ф-ції |
Ім’я функції |
Формальні аргументи |
Опис |
Int |
strcmp() |
(const char * s1, const char * s2) |
Порівнює два рядки. Повертає від’ємне значення, якщо перший рядок менший за другий, таке що дорівнює нулю, якщо рядки рівні, й додатне значення, якщо перший рядок більше, ніж другий. |
size_t |
strcspn() |
(const char * s1, const char * s2) |
Шукає підрядок у рядку. |
char * |
strcpy() |
(const char * s1, const char * s2) |
Копіює рядок s2 у рядок s1 |
char * |
strerror() |
(int ernum) |
Повідомлення про помилку за номером помилки |
char * |
_sterror() |
(const char * s) |
Призначене для користувача повідомлення про помилку |
size_t |
strlen() |
(const char * s) |
Визначає довжину рядка без урахування нульового символа – обмежувача |
char * |
strlwr() |
(const char * s) |
Перетворює символи рядка у нижній регістр |
char * |
strncat() |
(const char * s1, const char * s2, size_t n ) |
Додає n символів рядка s2 до s1 |
int |
strncmp() |
(const char * s1, const char * s2, size_t n ) |
Порівнює перші n символів двох рядків |
int |
strnicmp() |
(const char * s1, const char * s2, size_t n ) |
Порівнює перші n символів двох рядків, ігноруючи регістр |
char * |
strncpy() |
(const char * s1, const char * s2, size_t n ) |
Копіює n символів з s2 в s1 |
char* |
strnset() |
(const char * s, int ch, size_t n ) |
Заповнює перші n символів рядка кодом ch |
char * |
strpbrk() |
(const char * s1, const char * s2) |
Визначає позицію символів з s2 у s1 |
char * |
strrchr() |
(const char * s, int ch ) |
Визначає позицію останнього входження ch в s |
char * |
strrev() |
(const char * s) |
Повертає рядок у зворотному порядку |
char * |
strset() |
(const char * s, int ch ) |
Заповнює рядок кодом ch |
size_t |
strcpn() |
(const char * s1, const char * s2) |
Повертає номер першого символа рядка s1, що не входить до s2 |
char * |
strstr() |
(const char * s1, const char * s2) |
Повертає адресу першого входження рядка s2 до рядка s1 |
char * |
strtok() |
(const char * s1, const char * s2) |
Шукає в рядку s1 перший фрагмент з обмежувачами s2 |
char * |
strupr() |
(const char * s) |
Перетворює символи рядка у верхній регістр |