Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C20 лаба.doc
Скачиваний:
3
Добавлен:
12.09.2019
Размер:
100.86 Кб
Скачать

Лабораторна робота «Основи програмування та алгоритмічні мови»

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

Тема: «Обробка рядків»

Мета завдання:

  1. Отримання практичних навиків при роботі з масивами символів, їх оголошенням, ініціалізацією, введенням та виведенням, використання вказівників на рядки

  2. Закріплення вмінь та навичок по організації програм з використанням стандартних функцій обробки рядків і символів.

Теоретична частина:

Особливості обробки тексту в С/С++.

Динамічні символьня рядки.

Постановка завдання:

  1. Виконати завдання, пов’язане з посимвольною обробкою масиву символів.

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

  3. Організувати функцію для пословної обробки рядка відповідно до завдання свого варіанту.

Зміст звіту:

  1. Постановка завдання для конкретного варіанту.

  2. Блок-схема алгоритму рішення задачі.

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

  4. Результати тестів.

  5. Роздрук результатів роботи програми.

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

Завдання №1

Розберіть уважно приклади приведені нижче. Скомпілюйте програми проаналізуйте результати.

Завдання 1а. Дано рядок символів, підрахувати скільки разів серед символів рядка зустрічається буква x.

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

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

#include <iostream.h>

void main(void)

{

char str[100]; // об’ява рядка символів

// прохання користувачеві ввести рядок

cout << "\nInput a string: ";

cin >> str; // введення рядка

int count = 0; /* об’ява змінної-лічильника, в якій буде зберігатися кількість входжень х в рядок */

// в циклі порівнюємо кожний символ з х-ом,

// у випадку співпадання збільшуємо змінну-лічильник на 1.

int i = 0;

while(str[i] != '\0')

{

if (str[i] == 'x') count++;

i++;

}

// виведення результату на екран

cout << "\n Number of x is " << count;

}

Завдання 1б. Написати програму порівняння двох рядків.

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

Перш ніж перейти безпосередньо до програми, зробимо ще одну примітку. В деяких випадках бажано вводити в масив повний рядок тексту. З цією метою C++ забезпечений функцією cin.getline. Функція cin.getline вимагає три аргументи - масив символів, в якому повинен зберігатися рядок тексту, довжина і символ обмежувач. Наприклад, фрагмент програми

char sentence[80];

cin.getline(sentence, 80, '\n');

оголошує масив sentence з 80 символів, потім прочитує рядок тексту з клавіатури в цей масив. Функція припиняє прочитування символів у випадках, якщо зустрічається символ-обмежувач '\n', якщо вводиться покажчик кінця файлу або якщо кількість лічених символів виявляється на один менше, ніж вказано в другому аргументі (останній символ в масиві резервується для завершуючого нульового символу). Якщо зустрічається символ обмежувач, він прочитується і відкидається. Третій аргумент cin.getline має '\n' як значення за умовчанням, так що попередній виклик функції міг бути написаний в наступному вигляді:

cin.getline(sentence, 80);

#include<iostream.h>

#include<string.h>

void main()

{

int len; // довдина рядка, що вводиться

char s[81]; // місце зберігання рядка, що вводиться

char *s1,*s2;

cout << "Input the first string: ";

cin.getline(s, 80); // введення першого рядка

len = strlen(s); // визначення довжини рядка

s1 = new char[ len + 1]; // динамічне виділення памяті під рядок s1

strcpy(s1, s); // копіювання введеного рядка в рядок s1

cout << "Input the second string: ";

cin.getline(s, 80); // введення другого рядка

len = strlen(s);

s2 = new char[len + 1]; // динамічне виділення памяті під рядок s2

strcpy(s2, s);

// який з введених рядків більший?

if(strcmp(s1, s2) > 0)

cout << "String s1:\t" << s1 << "\n\t > \n"

<< "String s2:\t"

<< s2 << endl;

else if(strcmp(s1, s2) == 0)

cout << "String s1:\t" << s1 << "\n\t=\n"

<< "String s2:\t"

<< s2 << endl;

else

cout << "String s1:\t" << s1 << "\n\t < \n"

<< "String s2:\t"

<< s2 << endl;

// звільнення динамічної пам’яті, відведеної під рядки

delete []s1;

delete []s2;

}

Завдання 1в. Написати програму, яка отримує від користувача набір символів, виключаючи пропуск, і видаляє з цього набору всі входження символів S і s.

Розбір завдання. Рішення задачі складатиметься з трьох блоків:

1 - отримання даних від користувача (тобто користувач повинен ввести рядок для обробки), 2 - аналіз рядка на наявність символів S і s, 3 - виведення результату.

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

#include <iostream.h>

void main()

{

const int CharCount=10; //розмірність масиву

char arr[CharCount]; //об’ява символьного масиву

//Попередимо користувача, що введення обмежене розмірністю масиву

cout << "\nDo enter any string but no more then "

<< CharCount-1 << " symbols\n";

cin >> arr; // введення рядка

int i=0;

while (arr[i]!='\0') /* цикл працює, доки не зустрінеться ознака кінця рядка */

if (arr[i]=='S'||arr[i]=='s') //перевірка, знайдено елемент чи ні

{ /*якщо знайшли потрібний символ, то перемістимо частину, що залишилася на один елемент ліворуч ...*/

for (int j=i;arr[j]!='\0';j++)

arr[j]=arr[j+1];

}

else i++; /*..., інакше будемо зміщуватися по масиву далі */

cout << endl << arr << endl

}

Завдання №2

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

  2. Розробити алгоритм і програму для визначення кількості слів у введеному тексті, що починаються із заданого символу. Вважати, що слова в тексті розділені пропусками.

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

  4. Розробити алгоритм і програму для визначення щонайдовшого слова в тексті.

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

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

  7. Розробити алгоритм і програму для видалення в заданому тексті частини тексту, взятої в дужки (разом з дужками).

  8. Розробити алгоритм і програму для визначення мінімальної кількості перших символів, по яких можна розрізняти слова із заданого тексту.

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

  10. Розробити алгоритм і програму для визначення відсотка слів в тексті, що починаються із заданого символу.

  11. Розробити алгоритм і програму для визначення відсотка повторення заданого слова в тексті (як роздільники слів може використовуватися символи пропуск, кома). В кінці речення – крапка.

  12. Розробити алгоритм і програму для видалення зайвих пропусків в тексті (зайвими вважати > 1 пропуску).

  13. Розробити алгоритм і програму для зашифровуваної тексту (не більше 255 символів), використовуючи заміну наступних символів: а на о, о на у, у на а.

Завдання №3

  1. Розробити алгоритм і програму для видалення в тексті всіх слів, що містять символи-цифри.

  2. Розробити алгоритм і програму для визначення найкоротшого слова в тексті.

  3. Розробити алгоритм і програму для визначення в тексті щонайдовшого слова, в якому немає цифр.

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

  5. Розробити алгоритм і програму для зашифровуваної тексту (не більше 255 символів), записуючи всі слова навпаки.

  6. Розробити алгоритм і програму для визначення відсотка слів в тексті, що містять подвоєну приголосну (вважати роздільником слів пропуск, в кінці речення - крапка).

  7. Розробити алгоритм і програму для розбиття тексту на рядки (як ознака кінця рядка в тексті використовувати символ @).

  8. Розробити алгоритм і програму для розбиття тексту на рядки завдовжки не більше 50 символів. Перенесення слів на новий рядок здійснювати на місці пропуску.

  9. Розробити алгоритм і програму для рівномірної вставки пропусків в початковий рядок (завдовжки менше 50 символів) так, щоб її довжина стала рівною 50 символам. Перенесення слів на новий рядок здійснювати на місці пропуску.

  10. Розробити алгоритм і програму для вибору із заданого тексту всіх слів, що містять задану комбінацію символів.

  11. Розробити алгоритм і програму для визначення "складності" речення. Під складністю речення розуміти суму кількості слів і розділових знаків.

  12. Поміняти місцями в рядку перше і останнє слова. Вважати, що слова відокремлені один від одного пропуском.

  13. Середнє слово рядка поставити перед останнім словом.

Контрольні питання:

  1. Який вид даних називається символьним рядком? Яке призначення символу ‘\n’?

  2. Для чого призначенні бібліотечні функції, оголошені у <ctype.h>?

  3. Яке значення повертають стандартні бібліотечні функції getchar() та gets()?

  4. Який заголовний файл необхідно підключити до програми для роботи з бібліотечними функціями опрацювання символьних рядків?

  5. Коли доцільніше формувати масиви символьних рядків, а коли – масиви вказівників на перші символи рядків?

  6. Чому групи символьних рядків доцільно зберігати в динамічній пам’яті?

Література:

[1] Стивен Прата «Язык программирования С++. Лекции и упражнения». Учебник.- СПб: ООО «ДиаСофтЮП», 2003.

[2] Шпак З.Я. Програмування мовою С.– Львів: Оріяна-Нова, 2006.

[3] Л.М.Климова. Си++. Практическое программирование. Решение типовых задач. – М.: КУДИЦ-ОБРАЗ, 2001.

[4] Е.Л.Романов.Практикум по программированию на С++. Уч. пособие. – СПб: БХВ-Петербург; Новосибирск: Изд-во НГТУ, 2004.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]