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



 

1. Як розуміти вираз *( c+i ), де c — ім’я масиву?

2. Що таке розадресування у мові С++?

3. Які дії можна виконувати над покажчиками?

4. Напишіть програму сортування масиву по правилу зростання з використанням покажчиків.

5. Як задати змінний розмір масиву?

 

Варіанти індивідуальних завдань

 

1. Знайти найменші елементи у кожному рядку матриці та номер максимального з них.

2. Відсортувати по зростанню перший рядок та другий стовпець матриці.

3. Знайти найбільші елементи у кожному стовпці матриці та номер найменшого серед них.

4. Знайти суми кожного рядка матриці та найменшу серед них.

5. Серед елементів матриці, що знаходяться вище головної діагоналі, знайти добуток парних елементів.

6. Знайти суму додатніх непарних елементів матриці, що стоять нижче побічної діагоналі.

7. Визначити, скільки елементів матриці в рядках з парними номерами перевищують відношення максимального елемента до мінімального?

8. Відсортувати за зростанням добутки від’ємних елементів рядків матриці.

9. Відсортувати по зменшенню масив максимальних елементів стовпців матриці.

    10. У матриці знайти суму парних елементів, що лежать вище головної діагоналі. Якщо вона ділиться на 3, обнулити побічну діагональ.

11.У матриці відсортувати за зростанням елементи головної діагоналі та поміняти місцями максимальний елемент з мінімальним.

12. Переставити рядки матриці відповідно до зростання елементів другого стовпця.

13. Знайти мінімальний елемент матриці, і якщо він парний та парна строка його розташування — відсортувати третій стовпець матриці.

    14. Переставити стовпці матриці у відповідності до зростання елементів третього рядка.

    15. У кожному рядку матриці знайти кількість елементів, що діляться на 3, та відсортувати ці значення з находженням екстремумів.

    16. У матриці в рядках з від’ємним елементом на головній діагоналі знайти найбільший елемент рядка та мінімум серед них.

    17. У матриці замінити нулями всі від’ємні елементи над головною діагоналлю. Знайти місце максимуму серед елементів нижче побічної діагоналі.

    18. Переписати до масиву В всі елементи матриці А, більші значення  x. Якщо в черговому рядку таких немає, записувати до В значення 0.

    19. Переписати до масиву С всі значення матриці D, менші заданого у та знайти добуток цих елементів і розташувати їх за зростанням.

    20. У вигляді матриці задано таблицю футбольного чемпіонату. Визначити, у скількох команд кількість виграшів перевищує кількість поразок.

    21. Написати програму сортування команд за зменшенням кількості перемог, використовуючи таблицю футбольного чемпіонату.

    22. Знайти максимальний елемент матриці, і якщо його номер стовпця непарний, то відсортувати цей стовпець.

    23. Вихідну матрицю відсортувати за зростанням кількісті додатних елементів у стовпцях.

    24. Серед елементів матриці нижче побічної діагоналі відібрати ті, що перевищують максимум у другому стовпці матриці.

    25. У квадратній матриці провести сортування тих рядків, у яких на побічній діагоналі стоїть парне число.

    26. У стовпцях матриці знайти максимуми та відсортувати стовпці за зменшенням.

    27. Переставити стовпці матриці відповідно до зростання елементів другого рядка.

    28. Знайти добутки діагоналей квадратної матриці. Відсортувати перший рядок за зростанням.

    29. Задано дві матриці розміром 3*3. Перемножити їх за правилом "рядок на стовпець".

    30. Знайти скалярні добутки першого рядка матриці на всі інші.

 


Робота з рядками

Мета роботи

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

 

 

Методичні вказівки до організації самостійної роботи студентів

 

У мові С++ є кілька можливостей роботи з символьними даними. Класична робота зводиться до використання масива символів. Для того, щоб скористуватися стандартними функціями С++ для роботи з рядками, треба їх файли підключити в директиві #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;

}

 


Дата добавления: 2018-04-15; просмотров: 570; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!