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

Тренувальні вправи

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

Алгоритм розв’язання: _______________

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Код програми:

2. Написати програму, яка рахує кількість введених символів.

Алгоритм розв’язання: _______________

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Код програми:

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

Питання

Відповідь

1

Методи ініціалізації рядкового типу даних.

2

Способи введення та виведення рядків.

Завдання та методичні вказівки для самостійної роботи студента

  1. Вивчити теоретичний матеріал лекції, дати відповіді на контрольні запитання.

  2. Розв’язати задачі №9.5 [1, ст. 109]

Лекція 6

Тема. Основні функції роботи з рядковим типом даних

Мета. Отримати знання про рядковий тип даних, навчитися створювати найпростіші програми з рядковим типом даних.

ОПОРНИЙ КОНСПЕКТ

Для опрацювання масивів символів у мові С++ є стандартні функції, які описані у модулі string.h. Розглянемо деякі з них.

strlen(<рядок>) – визначає фактичну кількість символів у рядку, застосовується у виразах;

strcat(r1, r2) – команда з’єднання рядків r1, r2 в один рядок, результат присвоює змінній r1;

strncat(r1, r2, n) – до змінної r1 додає перших п символів рядка r2, команда;

strcpy(r1, r2) – копіює символи з рядка r2 в рядок r1, команда;

strncpy(r1, r2, n) – копіює перших n символів рядка r2 в рядок r1, команда;

strchr(r1, <символ>) – визначає перше входження деякого символу у рядок r1 так: повертає рядок, який починається від першого входження заданого символу до кінця рядка r1, застосовується у виразах;

strrchr(r1, <символ>) – визначає останнє входження заданого символу у рядок, застосовується у виразах;

strspn(r1, r2) – визначає номер першого символу, який входить у рядок r1, але не входить у рядок r2, застосовується у виразах;

strstr(r1, r2) – визначає в рядку r1 підрядок, що починається з першого входження рядка r2 у рядок r1, застосовується у виразах;

strtok(r1, r2) – визначає частину рядка r1, яка закінчується перед першим однаковим символом рядків r1 та r2;

strnset(r1, <символ>, n) – вставляє n разів заданий символ перед рядком r1, застосовується у виразах;

strupr(r1) – перетворює усі малі літери рядка у великі;

strlwr(r1) – перетворює усі великі літери рядка у малі;

strrev(r1) – записує рядок у зворотному порядку.

Приклад 2. Розглянемо результати застосування функцій до таких змінних:

char Lviv[] = “Львівська політехніка”,

Un[30] = “НУ”,

r1[30] = “”;

char *p; int n;

Застосування функцій

Результат

n = strlen(Lviv)

strcat(Un, Lviv)

strncat(Un, Lviv, 10)

strcpy(r1, Lviv)

strncpy(r1, Lviv, 10)

p = strchr(Lviv, ‘П’)

p = strrchr(Lviv, ‘i’)

n = strspn(Lviv, “Львів”)

p = strstr(Lviv, “тех”)

p = strtok(Lviv, “кс”)

p = strnset(Lviv, ‘x’, 10)

p = strupr(“I Love You”)

p = strlwr(“I Love You”)

p = strrev(“техніка”)

Зауваження 2. Функції перетворення літер strlwr і strupr діють лише для латинського алфавіту. Крім того, у деяких версіях мови С++ ці функції можуть записуватись інакше: _strlwr, _strupr.

У бібліотеці stdlib.h є стандартні функції перетворення типів даних. Зокрема, функція atoi(r1) перетворює рядок символів r1 у дане цілого типу int, а функція іtoа(<числове дане>, r1, <система числення>) – дане цілого типу int у рядок r1. Для перетворення даних типу double у рядок символів визначена функція gcvt(<числове дане>, <кількість знаків у числі>, r1), а обернену дію виконує функція strtod.

Приклад 3. Розглянемо результати дії цих функцій для оголошених нижче змінних.

int n;

double f;

char r1[5], *p;

Застосування функції

Результат

n = atoi(“12”)

itoa(12, r1, 10)

gcvt(-3.14, 4, r1)

f = strtod(“-3.1415”, &p)

Рядки символів можна порівнювати між собою. Два рядки порівнюють зліва направо посимвольно, причому ‘А’ < ’В’, ‘В’ < ‘С’ тощо. Більшим вважається символ, який розміщений в алфавіті далі (він має більший номер у таблиці кодів ASCII, див. далі). Для порівняння рядків у модулі string.h надані такі функції:

  • strcmp (r1, r2) – порівнює рядки символів r1 і r2 з урахуванням регістра для латинського алфавіту;

  • stricmp (r1, r2) – порівнює рядки r1 і r2, не розрізняючи великих і малих літер латинського алфавіту.

Результатом виконання цих функцій є від’ємне число (якщо рядок r1 менший від рядка r2), 0 (якщо рядки однакові) або додатне число (рядок r1 менший від рядка r2).

Приклад 4. Розглянемо результат дії функцій

Функція

Результат

n = strcmp(“Весна”, “весна”)

n = strcmp(“весна”, “Весна”)

n = strcmp(“Весна”, “Весна”)

n = strіcmp(“Весна”, “весна”)

n = strіcmp(“Vesna”, “vesna”)

Задача 1 (про довжину фрази). Увести рядок символів та визначити його довжину.

Зробимо це двома способами:

  1. за допомогою вказівника типу char і виділення динамічної пам’яті:

    #include <iostream.h> // Довжина рядка символів

    void main()

    {

    char *s; // Оголошуємо вказівник на рядок

    s = new char[50]; // Виділяємо пам’ять для введення рядка

    cin >> s;

    int d = 0;

    while (*s++) d++;

    cout << d;

    }

  2. визначивши різницю адрес першого й останнього символів:

#include <iostream.h> // Довжина рядка символів

void main()

{

char *s, *p; // Оголошуємо вказівник на рядок

s = new char[50]; // Виділяємо пам’ять для введення рядка

cin >> s;

p = s; // Вказівник р вказує на перший символ рядка

// Вказівник s тепер вказуватиме

while (*s++); // на останній символ рядка

int d;

// Визначаємо довжину рядка як різницю адрес

d = s – p + 1;

cout << d;

}

Задача 2 (про пошук слова у фразі). Нехай задано рядок "Скоро будуть канікули". Визначити довжину рядка. Вивести на екран друге слово цього рядка.

#include <iostream.h> // Пошук другого слова за допомогою функцій

#include <string.h>

void main()

{

char r1[] = “Скоро будуть канікули”;

char *p;

cout << r1 << “\n”;

cout << “Довжина рядка r1 = ” << strlen(r1) << “\n”;

// Встановлюємо вказівник р на перший пропуск

p = strchr(r1, ‘ ‘); // у рядку r1

// З рядка р вилучаємо всі символи після його

strtok(p, “ “); // першого пропуску

cout << p;

}

Подамо ще один спосіб розв’язання задачі 2, в якому рядок розглядається як масив символів і функції для роботи з рядками не використовуються.

#include <iostream.h> // Рядок як масив символів

#include <conio.h>

#include <string.h>

void main()

{

clrscr();

char r1[] = “Скоро будуть канікули”;

char *p;

int n1, n2, k, m;

m = 0;

k = strlen(r1);

cout << “Довжина рядка r1 = ” << k << “\n”;

for (int i = 0; i < k; i++) // Переглядаємо всі символи рядка

if (r1[i] == ‘’) // Шукаємо пропуск

{

m++; // Визначаємо номери першого

if (m == 1) n1 = i; // та другого

if (m == 2) n2 = i; // пропусків

}

// Виводимо слово між двома пропусками

for (i = n1 + 1; i < n2 – 1; i++) cout << r1[i];

getch();

}