Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

МЕТОДИЧКА_С++_Ч2

.pdf
Скачиваний:
49
Добавлен:
15.02.2015
Размер:
876 Кб
Скачать

правила використання прийомів програмування в структурах з вкладеними циклами;

способи введення-виведення матриць, які є в мові програмування С++.

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

5.Скласти програму рішення задачі.

6.Оформити звіт по парктичній роботі. Звіт повинен містити: тему, мету,

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

Завдання до практичної роботи

Обробити матрицю у відповідності з варіантом індивідуального завдання

(Таблиця 8.1). Вивести на екран результати і початкову матрицю в загальноприйнятому вигляді.

Таблиця 8.1. Варіанти індивідуальних завдань.

Варіант завдання

 

Завдання

 

 

 

 

 

 

 

 

1

Перевірити, чи є задана квадратна матриця одиничною.

2

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

3

Перетворити початкову матрицю так, щоб перший елемент кожного рядка

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

4

Помножити матрицю на число введене з клавіатури.

 

5

Написати програму множення двох матриць A(n,m) і B(m,l).

6

Знайти суму всіх додатніх елементів, які лежать нижче головної діагоналі.

 

Дана квадратна матриця N*N, що складається з натуральних чисел.

 

Повернути її на 90 градусів проти годинникової стрілки і вивести результат

7

на екран.

 

 

 

а11 а12 а13

а13

а23

а33

 

 

а21 а22 а23

а12

а22

а32

 

а31 а32 а33

а11

а21

а31

 

Дана матриця N*M, що складається з натуральних чисел. Знайти в ній

8

найменший елемент і визначити його місцеположення. Якщо таких

 

елементів декілька, то вивести на екран положення кожного з них.

9

Поміняти місцями n-й і 1-й стовпці матриці А(k,m).

 

 

Дано масив чисел М*М. Визначити, скільки в ньому пар сусідніх однакових

10

елементів. Елементи вважаються сусідніми, якщо їх індекси в стовпцях і/або

 

в рядках розрізняються не більше ніж на одиницю.

 

21

Продовження таблиці 8.1.

Варіант завдання

 

 

Завдання

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11

Перетворити

матрицю

A(m,n) так

чином,щоб

кожен

стовпець був

впорядкований по убуванню.

 

 

 

 

 

 

 

Дана квадратна матриця N*N, що складається з натуральних чисел.

 

Дзеркально відобразити її елементи щодо вертикальної осі симетрії і вивести

12

результат на екран.

 

 

 

 

 

 

 

 

а11 а12 а13

 

а13

а12

 

а11

 

 

 

 

 

 

 

 

а21 а22 а23

а23

а22

 

а21

 

 

 

а31 а32 а33

 

а33 а23 а31

 

13

Знайти кількість від’ємних елементів що знаходяться вище за побічну

діагональ.

 

 

 

 

 

 

 

 

14

Дано масив цілих чисел М*М. Знайти всі самі нижні максимальні елементи

по стовпцях і вивести на екран їх значення і місцеположення.

 

Дана квадратна матриця N*N, що складається з натуральних чисел.

 

Дзеркально відобразити її елементи щодо горизонтальної осі симетрії.

15

Вивести результат на екран.

 

 

 

 

 

 

 

 

а11 а12 а13

 

а31

а32

а33

 

 

 

 

 

 

 

 

 

а21 а22 а23

а21

а22

а23

 

 

 

 

а31 а32 а33

 

а11

а12

а13

 

16

Знайти добуток елементів, які лежать на головній діагоналі.

 

 

Дана квадратна матриця N*N, що складається з натуральних чисел.

 

Повернути її на 90 градусів за годинниковою стрілкою і вивести результат

17

на екран.

 

а11 а12 а13

 

а31

а21

а11

 

 

 

 

 

 

 

 

 

 

а21 а22 а23

а32

а22

а12

 

 

 

а31 а32 а33

 

а33 а23 а13

 

Дана квадратна матриця N*N, що складається з натуральних чисел.

 

Дзеркально відобразити її елементи щодо головної діагоналі. Вивести

18

результат на екран.

а11 а12 а13

 

а11 а21 а31

 

 

 

 

 

 

 

 

 

 

 

 

 

а21 а22 а23

а12 а22 а32

 

 

 

 

а31 а32 а33

 

а13 а23 а33

 

 

Дана матриця N*M, що складається з натуральних чисел. Знайти в ній

19

найбільший

елемент і

визначити

його місцеположення. Якщо таких

 

елементів декілька, то вивести на екран положення кожного з них.

20

Знайти добуток всіх додатніх елементів, які лежать

нижче головної

діагоналі.

 

 

 

 

 

 

 

 

21

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

22

Знайти кількість додатніх елементів, лежачих нижче

побічної діагоналі.

22

Продовження таблиці 8.1.

Варіант завдання

Завдання

 

 

Дана квадратна матриця N*N, що складається з натуральних чисел.

 

Дзеркально відобразити її елементи щодо побічної діагоналі. Вивести

23

результат на екран.

 

 

а11 а12 а13

а33

а23 а13

 

 

а21 а22 а23

а32

а22 а12

 

а31 а32 а33

а31

а21 а11

24

Перетворити матрицю A(m,n) так, щоб рядки непарними індексами були

впорядковані по убуванню, з парними за збільшенням.

25

Знайти добуток модулів від’ємних елементів що знаходяться вище за

побічну діагональ.

 

 

26

Знайти кількість додатніх та від’ємних елементів що знаходяться нижче за

побічну діагональ і порівняти їх.

 

 

Приклад виконання роботи:

Написати програму, яка для цілочисельної матриці 10 * 10 визначає середнє арифметичне її елементів і кількість додатніх елементів в кожному рядку.

Для обчислення середнього арифметичного елементів масиву потрібно знайти їх загальну суму, після чого розділити її на кількість елементів. Порядок проглядання масиву (по рядках або по стовпцях) ролі не грає. Визначення кількості позитивних елементів кожного рядка вимагає проглядання матриці по рядках.

Обидві величини обчислюються при одному перегляді матриці.

Розробка текста програми

#include <iostream.h> #include <iomanip.h> #include<conio.h> void main(){

const int nrow = 10, ncol = 10; int a[nrow][ncol];

int i, j;

cout << "Enter elements of massive:" << endl; for (i = 0; i < nrow; i++)

for (j = 0; j < ncol; j++) cin >> a[i][j];

for (i= 0; i < nrow; i++) {

23

for (j= 0; j < ncol; j++) cout << setw(4) << a[i][j] <<

"";

cout << endl;

}

int n_pos_el; float s=0;

for (i = 0; i < nrow; i++) { n_pos_el = 0;

for (j = 0; j < ncol; j++) { s +=a[i][j];

if (a[i][j] > 0) n_pos_el++;

}

cout << " String: " << i<< " Kilkist: " << n_pos_el << endl;

}

s /= nrow * ncol;

cout << "Seredne arifmetichne: " << s << endl; getch();

}

Звіт

1.Тема практичної роботи.

2.Мета практичної роботи.

3.Умови завдання.

4.Намалюваний алгоритм у вигляді блок-схеми програми.

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

6.Відповіді на контрольні питання.

7.Висновки.

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

1.Що таке двовимірний масив в С++?

2.Як розташовується масив в пам’яті комп’ютера?

3.Яка конструкція застосовується для доступу до окремого елементу масиву?

Які Ви знаєте інші способи звернення?

4.Як ініціалізуються масиви?

5.Як організувати введення матриці розміром m*n елементів?

6.Які властивості елементів матриці Ви знаєте?

24

Практична робота № 9

Тема: Обробка символьних даних в мові С++.

Мета роботи: Оволодіння навичками алгоритмізації і програмування задач, які обробляють символьні дані, їх обробки;

використання функцій обробки символьних даних.

Теоретичні відомості

У мовах С/С++ немає спеціального певного рядкового типу даних, як в мові Паскаль. Символьні рядки організовуються як масиви символів, останнім з яких є символ \0, внутрішній код якого дорівнює нулю. Звідси слідує одна важлива перевага перед рядками в Паскалі, де розмір рядка не може перевищувати 255 (довжина указується в першому байті), — на довжину символьного масиву в мові С немає обмеження.

Рядок описується як символьний масив. Наприклад:

char STR[20];

Одночасно з описом рядок може ініціалізуватися. Можливі два способи ініціалізації рядка — за допомогою строкової константи і у вигляді списку символів:

char S[10]="рядок";

char S[]="рядок";

char S[10]={'р','я','д','o','к','\0'};

По результату першого опису під рядок s буде виділено 10 байт пам'яті, з них перші 6 набудуть значень при ініціалізації (шостий — нульовий символ). Другий опис сформує рядок з шести символів. Третій опис по результату рівнозначно першому. Звичайно, можна визначити символьний масив і так:

char S[10]={'р','я','д','о','к'};

тобто без нульового символу в кінці. Але це приведе до проблем з обробкою такого рядка, оскільки буде відсутній орієнтир на його закінчення.

Окремі символи рядка ідентифікуються індексованими іменами. Наприклад, в

описаному вище рядку s [0] ='р', S[4]='к'.

25

Обробка рядків зазвичай пов'язана з перебором всіх символів від початку до кінця. Ознакою кінця такого перебору є виявлення нульового символу. У наступній програмі проводяться послідовна заміна всіх символів рядка на зірочки і підрахунок довжини рядка.

Пример 9.1.

//Заміна символів на зірочки

#include <stdio.h> #include <conio.h> void main() { char S[]="fh5j"; int i=0; clrscr();

puts(S) ; while(S[i]) {S[i++]='*'; puts(S);}

printf("\n Довжина рядка=",i); getch(); }

В результаті виконання програми на екрані отримаємо: fh5j

*h5j

**5j

****

Довжина рядка=4

У цій програмі цикл повторює своє виконання, поки s[і] не набуде значення нульового символу.

Для виведення рядка на екран в стандартній бібліотеці stdio є функція puts(). Аргументом цієї функції указується ім'я рядка. У цій же бібліотеці є функція введення рядка з клавіатури з ім'ям gets(). Як аргумент вказується ім'я

рядка, в який проводиться введення.

Серед стандартних бібліотек С/С++ існує бібліотека функцій для обробки рядків. Її заголовний файл — string.h (Таблиця 9.1).

26

Таблиця 9.1 Функції для роботи з рядками - файл <string.h> (<cstring.h>).

Функція

Призначення

 

 

 

void *memchr(const void *p, int ch, size_t n);

memchr

Функція повертає покажчик на перше входження байта,

 

представленого молодшим байтом аргументу ch в блоці пам'яті р

 

довжиною n.

 

int memcmp(const void *p1, const void *p2,

memcmp

size_t n);

Функція порівнює два блоки пам'яті і повертає значення: менше

 

нуля, рівне нулю або більше нуля — аналогічно кодам

 

повернення функції strcmp.

 

void *memcpy(void *dest,const void *src,

memcpy

size_t n);

 

Функція копіює блок пам'яті завдовжки n байт з адреси src за

 

адресою dest.

 

void *memmove( void *dest, const void *src,

memmove

size_t n);

 

Функція аналогічна memcpy, але блоки dest і src можуть

 

перекриватися.

memset

void *memset(const void *p, int ch, size_t n);

Функція заповнює блок пам'яті символом, узятим з молодшого

 

байта ch.

strcat

char *strcat(char *s1, char *s2);

Функція додає s2 до s1 і повертає s1. У кінець результуючого

 

рядка додається нуль-символ.

strchr

char *strchr(char *s, int ch);

Функція повертає вказівник на перше входження символу ch в

 

рядок s, якщо його немає, то повертається NULL.

 

int *strcmp(char *s1, char *s2);

strcmр

Функція порівнює рядки і повертає негативне (якщо s1 менше

 

s2), нульове (якщо s1 рівне s2) або позитивне (якщо s1 більше s2)

 

значення.

strcoll

char *strcoll(char *s1, char *s2);

Функція порівнює рядки аналогічно strcmp, але враховує

 

установки локалізації (див. функцію setlocale).

strlen

size_t strlen(char *s);

Функція повертає довжину рядка (без урахування символу

 

завершення рядка).

strcpy

char *strcpy(char *sl, char *s2);

Функція копіює s2 в s1 і повертає s1.

 

 

strcspn

size_t strcspn(char *s1, char *s2);

Функція повертає значення індексу будь-якого з символів з s2 в

 

рядку s1.

strerror

char *strerror(size_t n);

 

Функція повертає вказівник на рядок з описом помилки номер n.

27

Продовження таблиці 9.1

Функція

Призначення

 

 

 

char *strncat(char *s1, char *s2, size_t n);

 

Функція додає не більш за n символів з s2 до s1 і повертає s1.

strncat

Перший символ s2 пишеться на місце завершуючого нуль-

 

символа рядка s1. Якщо довжина рядка s2 менше n,

 

переписуються всі символи s2. До рядка s1 додається нуль-

 

символ. Якщо рядки перекриваються, поведінка не визначена.

 

int strncmp(char *s1, char *s2, size_t n);

strncmp

Функція порівнює перший рядок і перші n символів другого

 

рядка і повертає негативне (якщо s1 менше s2), нульове (якщо s1

 

рівне s2) або позитивне (якщо s1 більше s2) значення.

 

char *strncpy(char *s1, char *s2, size_t n);

 

Функція копіює не більш за n символи з s2 в s1 і повертає s1.

strncpy

Якщо довжина початкового рядка перевищує або рівна n, нуль-

 

символ в кінець рядка s1 не додається. Інакше рядок

 

доповнюється нуль-символами до n-го символу. Якщо рядки

 

перекриваються, поведінка не визначена.

 

char *strpbrk(char *s1, char *s2);

strpbrk

Функція повертає вказівник на символ, що є першим входженням

 

будь-якого з символів з s2 в рядок s1, якщо його немає,

 

повертається NULL.

strrchr

char *strrchr(char *s,int ch);

Функція повертає вказівник на перше входження символу ch в

 

рядок s справа, якщо його немає, повертає NULL.

strspn

size_t strspn(char *sl, char *s2);

Функція повертає індекс першого символу в s1, відсутнього в s2.

 

 

 

char *strstr(char *s1, char *s2);

strstr

Функція виконує пошук першого входження підрядка s2 в рядок

 

s1. У разі вдалого пошуку, повертає вказівник на елемент з s1, з

 

якого починається s2, і NULL інакше.

strtok

char *strtok(char *s1, char *s2);

Функція повертає наступну лексему з s1, відокремлену будь-

 

яким з символів з набору s2.

strxfrm

size_t strxfrm(char *s1, char *s2, size_t n);

Функція перетворює рядок з s2 і розміщє її в s1 на основі

 

поточної локалізації. Перетвориться не більш за n символів.

У наступному прикладі використовується функція визначення довжини рядка з

цієї бібліотеки. Ім'я функції — strlen(). Як аргумент вказується ім'я рядка.

Приклад 9.2. Ввести символьний рядок. Перевернути (обернути) цей рядок. Наприклад, якщо ввели рядок «abcdef», то в результаті в ній повинні отримати

«fedcba».

28

//Обернення рядка

#include <stdio.h> #include <string.h> #include <conio.h> void main() {

char C,S[10]; int i; clrscr () ;

printf("Введіть рядок"); gets(S) ;

for(i=0; i<=(strlen(S)-1)/2; i + + )

{ C=S[i]; S[i]=S[strlen(S) -i-l]; S[strlen(S)-i-1]=C;} printf("\nОбернений рядок:");

puts (S) ; }

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

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

— 0, а індекс останнього на одиницю менше довжини рядка.

Рядки, як параметри функцій.

Рядки як фактичні параметри можуть бути специфіковані або як одновимірні масиви типу char [ ], або як вказівники типу char *. У обох випадках за допомогою параметра у функцію передається адреса початку символьного масиву, що містить рядок. На відміну від звичайних масивів для параметрів-рядків немає необхідності явно вказувати їх довжину. Ознака '\0', що розміщується в кінці кожного рядка,

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

Рекомендації по обробці рядків

1. Визначення символьного масиву фіксованого розміру:

char Array [25];

Не можна розмір масиву задавати за допомогою змінної, тобто буде помилкою визначення (якщо N - непрепроцесорний ідентифікатор):

char Array [N]

2. Визначення динамічного масиву:

char *p;

29

int N = 25;

р =(char*)malloc(N);

3.Звернення до елементу масиву:

вирази Array[0] і *Аrrау - еквівалентні.

Також еквівалентні вирази:

Array[i] *(Array+i), *(i+Array)

Для динамічного масиву, адресованого вказівником р, еквівалентні вирази:

р[0] *р; p[i] *(p+i), *(i+p)

4. Перехід до сусіднього (i+l) -го елементу динамічного масиву:

наступні вирази еквівалентні: p[i+l], p++[i] *(p++ +i)

Невірно: Array++[i] - ім'я масиву є константа, за визначенням її не можна змінювати. 5. Варіанти перебору елементів масиву.

int i ;

for(i=0;i< 25;i++){Array[i]...} for (i=0;i< 25;i++){*(Array+i)...} for (i=0;i< 25;i++){*(p+i)...} for (i =0;i< 25;i++){p[i]...}

Небезпечний варіант (можна забути початок масиву):

for (i = 0; i < 25; i++) { *p++...}

6. Рядки "розміщуються" в символьних масивах. Ознакою закінчення рядка служить

'\0'.

Якщо визначений масив

char string[25] = "це рядок";

то в масиві string[ ] довжиною 25 байт буде розміщений рядок завдовжки в 11 байт і string[10]= = '\0'.

Рядки можуть бути задані в програмі і так:

Char *ps ="строка"; // Длина строки 7 байт ;

ps[6]=='\0';

*(ps+6)== '\0'

char str[]= "это строка"; // Строка и массив одинаковой

длины

30