
- •Загальні положення
- •1.1 Мета роботи
- •1.2 Методичні вказівки до організації самостійної роботи студентів
- •1.2.2 Структура програми
- •If (а) оператор 1 ;
- •1.3 Контрольні запитання
- •1.4 Варіанти індивідуальних завдань
- •2 Розв’язання задач з використанням масивів
- •2.1 Мета роботи
- •2.2 Методичні вказівки до організації самостійної роботи студентів
- •Приклад 2.1 Знайти у масиві mas найменший елемент та його індекс.
- •Приклад 2.2Відсортувати масив mas дійсних чисел розміром 10 елементів за зменшенням.
- •2.3 Контрольні запитання а завдання
- •3.4 Варіанти індивідуальних завдань
- •3Робота з рядками
- •3.1 Мета роботи
- •3.2 Методичні вказівки до організації самостійної роботи студентів
- •3.3 Контрольні запитання та завдання
- •4Робота зі структурами
- •4.1 Мета роботи
- •4.2 Методичні вказівки до організації самостійної роботи студентів
- •4.3 Контрольні запитання та завдання
- •4.4 Варіанти індивідуальних завдань
- •5Використання функцій при розробці програм
- •5.1 Мета роботи
- •5.2 Методичні вказівки по організації самостійної роботи студентів
- •5.3 Контрольні запитання та завдання
- •5.4 Варіанти індивідуальних завдань
- •6 Пространства имен (поименованные области)
- •6.1 Мета роботи
- •6.2 Вказівки щодо організації самостійної роботи студентів
- •6.3 Порядок виконання роботи
- •2.7 Контрольний приклад
- •7 Пошук і сортування
- •7.1 Мета роботи
- •7.2 Методичні вказівки до організації самостійної роботи студентів
- •7.2.1 Лінійний пошук
- •7.2.2 Пошук розподілом навпіл (двійковий пошук)
- •7.2.3 Сортування вставками
- •7.2.4 Метод пухирця
- •7.2.5 Сортування перерахуванням
- •7.2.6 Швидке сортування
- •7.2.7 Сортування злиттям
- •7.3 Контрольні запитання
- •Перелік посилань
3Робота з рядками
3.1 Мета роботи
Отримати практичні навички програмування на С++ задач, де використовується символьна інформація.
3.2 Методичні вказівки до організації самостійної роботи студентів
У мові С++ є кілька можливостей роботи з символьними даними. Класична робота зводиться до використання масива символів. Для того, щоб скористуватися стандартними функціями С++ для роботи з рядками, треба їх файли підключити в директиві #include <string.h>. Основні функції з цього пакету наведено нижче.
— char*strcat (char*_dest, const char*_src); — функція реалізує сціплення рядка dest з рядком src. Функція вертає покажчик на початок отриманого рядка (dest). Проміжний символ‘\0’ рядка dest гаситься.
— char*strncat (char*_dest, const char*_src, size_t_maxlen); — функція приєднує maxlen символів з рядка, на який вказує src, до рядка, на який вказує dest. Рядок dest повинен містити не менше maxlen вільних байтів. Якщо maxlen більше рядка src, виконується проста конкатенація.
— char*strchr (const char*_, int_c); — функція вертає покажчик на позицію першого входження символу “c” в рядок, на який вказує s. В рядок s включається і символ ‘\0’.
— int strcmp (const char*_s1, const char*_s2); — функція виконує порівняння двох рядків, на початок яких вказують s1 і s2. Функція вертає значення: менш нуля, якщо s1<s2; рівне нулю, якщо s1==s2; більше нуля, якщо s1>s2.
— int strnсmp (const char*_s1, const char*_s2, size_t_maxlen); —функція, що аналогічна функції strcmp () і відрізняється тим, що виконується порівняння перших maxlen байтів.
— int stricmp (const char *_s1, const char *_s2); —функція виконує порівняння двох рядків, на що вказуютьs1 іs2. Перед порівнянням символи перетворюються в малі. Функція вертає значення: більше нуля, якщоs1>s2; рівно нулю, якщоs1==s2; менш нуля, якщоs1<s2.
— int strlen (const char*_s); — функція вертає довжину рядка в байтах, на який вказує s. Нуль-терминатор не враховується.
— char*stpcpy (char *_dest, const char *_src);—функція копіює рядок, на котрий вказуєsrc, в інше місце в пам'яті, на що вказуєest. Функція вертає покажчик на кінець рядка, що скопіювався вdest.
— char*strncpy (char*_dest, const char*_src, size_t_maxlen); —функція копіює maxlen байт з рядка, на який вказує src, в інше місце в пам'яті, на що вказує dest. Нуль-термінатор теж копіюється. Якщо maxlen менш довжини рядка src, до рядка src не приєднується символ“\0”.І якщо більше, то рядок src переноситься повністю, а символи, що залишалися, заповнюються символом “\0”. Функція вертає покажчик dest.
— char *strlwr (char *_s); —функція перетворює всі символи рядка, на початок якого вказує s, в малі літери. Функція повертає покажчик на початок цього рядка.
— char *strups (char *_s);—функція перетворює всі символи рядка, на початок якої вказуєs, в великі літери. Функція вертає покажчик на отриманий рядок.
— char *strset (char *_s, int_ch); —функція заповнює рядок, на початок якого вказуєs, символомch. Функція вертає покажчик на отриманий рядок.
— char *strtok (char *_s1, char *_s2); —функція вертає наступну лексему ізs1, яка відділена любим символом з набораs2.
Приклад 3.1
Підрахувати кількість слів у рядку, враховуючи те, що пробілів, а також інших розділових знаків між словами може бути скількі завгодно.
1-ий варіант вирішення поставленої задачі
#include <iostream>
#include <conio.h>
#include <string.h>
int main()
{
char s[]=" Repetitio est , mater studiorum !";
int i=0, col=0;
char spes[]=" ;!,.?\t";
int strLen = strlen(s);
while (i<strLen)
{
if ( !strchr(spes, s[i]) )
{
col++;
while (!strchr(spes, s[i]) && i<strLen)
i++;
}
else
{
while (strchr(spes, s[i]) && i<strLen)
i++;
}
}
std::cout<<"\nKilkist sliv="<<col<<'\n';
getch();//задержка экрана
return 0;
}
2-ий варіант вирішення поставленої задачі з використанням функції strtok
#include <iostream>
#include <conio.h>
#include <string.h>
int main()
{
int col=0;
char str[] = "Repetitio est mater studiorum. Help.";
char seps[] = " ;,\t\n";//знаки препинания
std::cout<<str<<std::endl;
char *token = strtok(str, seps);//поиск первого слова
while( token != NULL )
{
col++;
token = strtok(NULL, seps );//поиск следующего слова
}
std::cout<<"\nKilkist sliv="<<col<<std::endl;
getch();//задержка экрана
return 0;
}
Приклад 3.2
Знайти в тексті всі слова, що починаються та закінчуються буквою a, та скопіювати їх в нову рядок через пробіл. Під новий рядок необхідно виділити рівно стільки пам’яті, скільки необхідно для запису знайдений слів.
Розв’язок. Поставлено задачу вирішимо у два етапи: спочатку підрахуємо кількість необхідної пам’яті, а за тим запишемо у новий рядок необхідні слова.
#include <iostream>
#include <conio.h>
#include <string.h>
int main()
{
char str[] = "test word 1: asdda. Test word 2: asdfg, word 3: Awea";
char strCopy[sizeof(str)];
strcpy(strCopy,str);//створюємо копію рядка
char seps[] = " :?!;,.\t\n";//знаки препинания
std::cout<<str<<std::endl;
char *token = strtok(str, seps);//пошук першого слова
int lenResult=0;
int countWord=0; //кількість слів
//Підрахуємо кількість необхідної пам'яты для рядка-результата
while( token != NULL )
{
int last = strlen(token)-1;
if (
(token[0] == 'a' || token[0] == 'A')
&& (token[last] == 'a' || token[last] == 'A')
)
{
lenResult+= strlen(token)+1;
++countWord;
}
token = strtok(NULL, seps );//пошук наступного слова
}
char* resString = new char [lenResult];
resString[0]='\0'; //створюєму пустий рядок
strcpy(str,strCopy);//відновлюємо рядок
token = strtok(str, seps);//пошук першого слова
int curentNumberWord=0;
while( token != NULL )
{
int last = strlen(token)-1;
if (
(token[0] == 'a' || token[0] == 'A')
&& (token[last] == 'a' || token[last] == 'A')
)
{
strcat(resString,token);
++curentNumberWord;
if (countWord!=curentNumberWord)//Якщо не останнє слово
{
strcat(resString," ");
}
}
token = strtok(NULL, seps );//пошук наступного слова
}
std::cout<<"\nResult:\n"<<resString<<std::endl;
delete[]resString;
getch();//задержка экрана
return 0;
}