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

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

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

нижнього елементу масиву mas[9]. При другому проході друге найбільше значення гарантовано опуститися на місце mas[8]. При дев'ятому проході дев'яте найбільше значення опуститися на місце mas[1]. Це залишає найменшому значенню місце mas[0], так що для сортування масиву з 10 елементів потрібно тільки дев'ять проходів. Сортування проводиться за допомогою вкладеного циклу for. Якщо необхідна перестановка, вона виконується трьома привласненнями

hold=mas[i];

mas[i]=mas[i+1];

mas[i+1]=hold;

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

mas[i]=mas[i+1];

mas[i+1]=mas[i];

Якщо, наприклад, mas[i] дорівнює 7, а mas[i+1] дорівнює 5, то після

першого привласнення обидва значення будуть 5, а значення 7 буде загублено.

Отже, необхідна додаткова змінна hold.

Приклад 7.1 Впорядкування елементів масиву за збільшенням.

#include<iostream.h>

#include<conio.h> int main(){

int mas[50]; int n,hold;

cout<<"Enter razmer n= "; cin>>n;

cout<<"Enter "<<n<<" elementov"<<endl; for(int i=0;i<n;i++) cin>>mas[i]; cout<<endl; for(int pass=1;pass<n;pass++)//prohod

for(int i=0;i<n-1;i++) //odin prohod if(mas[i]>mas[i+1]){ //odno sravnenie

hold=mas[i];

//odna perestanovka

mas[i]=mas[i+1];

}

mas[i+1]=hold;

cout<<"ELEMENTI DANNIH V PORYADKE VOZRASTANIYA:"<<endl; for(int i=0;i<n;i++) cout <<mas[i]<<" ";

cout<<endl;

getch(); return 0; }

11

Приклад 7.2 Обчислити середнє і оцінку дисперсії значень введеннх елементів масиву

#include<iostream.h>

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

int i,j,n; //n-kolichestvo elementov //b-sedne,d-ocenka dispersii.a,e-допоміжні змінні float a,b,d,x[100],e;

while(1){

cout<<"Enter znachenie n ="; cin>>n;

if(n>0 && n<=100) break; cout<<"\n Error! Nuzhno 0<n<100";

}

cout<<"Enter znacheniya elementov:\n"; for (b=0.0,i=0; i<n; i++){

cout<<"x["<<i<<"]=";

cin>>x[i];

b+=x[i];//vichislenie summi elementov

}

b/=n; //vichislenie srednego for(j=0,d=0.0;j<n;j++)

{a=x[j]-b; d+=a*a;

}//ocenka dispersii d/=n;

cout<<"Srednee= "<<b<<endl; cout<<"Dispersiya= "<<d; getch();

}

Послідовність виконання роботи

1.Уважно ознайомтися з теоретичним матеріалом щодо виконання практичної роботи.

2.Вивчити :

способи опису розмірів масивів на мові програмування;

способи введення-виведення масивів;

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

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

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

12

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

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

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

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

7.1) скласти алгоритм та написати програму з використанням одномірних масивів.

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

вар.

Завдання

 

 

 

1

Підрахувати кількість додатніх елементів в масиві та визначити їх

 

індекси.

2

Підрахувати кількість від’ємних елементів в масиві та визначити їх

 

індекси.

3

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

4

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

5

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

6

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

7

Обчислити добуток елементів, які не дорівнюють нулю.

8

Обчислити добуток елементів, які не дорівнюють нулю і стоять на

 

непарних місцях.

9

Знайти суму модулів елементів масиву, які кратні 3.

10

Знайти суми перших п’яти та останніх п’яти елементів і порівняти їх.

11

Обчислити добуток елементів, які не дорівнюють нулю і стоять на

 

парних місцях.

12

Визначити, яких елементів в масиві більше – додатніх чи від’ємних.

13

Знайти добуток модулів елементів масиву, які кратні 2.

14

Впорядкувати масив по зпаданню

15

Визначити, яких елементів в масиві більше – парних чи непарних.

 

 

16

Підрахувати суму та кількість елементів, що не перевищують а.

17

Обчислити суму елементів, що стоять на парних місцях і відмінні від

 

нуля.

18

Знайти суму додатніх та суму модулів від’ємних елементів масиву і

 

порівняти їх.

19

Всі елементи масиву, які розміщені перед максимальним елементом,

 

замінити їх кубами.

20

Всі елементи масиву, які розміщені перед мінімальним елементом,

 

замінити їх квадратами.

21

Підрахувати кількість та вивести індекси нульових елементів.

22

Обчислити кількість та суму елементів, які перевищують значення a.

23

Знайти максимальний та мінімальний елементи масиву і поміняти їх

 

місцями.

13

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

.вар Завдання №

24Знайти добутки перших п’яти та останніх п’яти елементів, відмінних від 0 і порівняти їх.

25Знайти середнє арифметичне від’ємних елементів масиву.

26Знайти середнє арифметичне додатніх елементів масиву.

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

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

Розробка алгоритма рішення.

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

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

#include<iostream.h>

#include<conio.h> int main(){

float x[50]; int n,i,imax; float xmax;

cout<<"Enter razmer n= "; cin>>n;

cout<<"Enter "<<n<<" elementov"<<endl; for(int i=0;i<n;i++) cin>>x[i]; cout<<endl; xmax=x[0];

imax=0;

14

for(int i=1;i<n;i++) if(x[i]>xmax){

xmax=x[i];

imax=i+1;}

cout<<"Maksimalniy element "<< xmax<<" "<<" poryadkoviy nomer "<< imax<<endl;

getch(); return 0; }

Звіт

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

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

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

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

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

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

7.Висновки.

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

1.Що таке масив?

2.Які аргументи повинно містити об’явлення масиву?

3.Яка загальна форма для об’явлення масиву?

4.Як зарезервувати пам’ять для 25 елементів масиву, що складається з дійсних чисел?

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

6.Назвіть базові операції обробки масивів .

7.Який номер індексу має перший елемент масиву в мові С++?

8.Які способи ініціалізації масивів в мові С++ Ви знаєте?

9.В чому полягає алгоритм бульбашкового сортування масивів?

15

Практична робота №8 Тема: Обробка двовимірних масивів в мові С++.

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

Зміст роботи: Використання двомірного масиву для розрахунків математичних матриць. Використання математичних розрахунків з квадратними матрицями.

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

Двовимірний масив представляється в C++ як масив, що складається з масивів.

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

int a[3][5];

// Цілочислена матриця з 3 рядків і 5

стовбців

Масив зберігається по рядках в безперервній області пам'яті:

a00

a01

a02

a03

a04

a10

a11

a12

a13

a14

a20

a21

a22

a23

 

a24

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

|------------

 

0-й

рядок

--------

|---------

 

1-рядок-----------

|--------

 

2-й рядок------

|

Рядки масиву нічим не відокремлені одна від одної, тобто прямокутною матрицею двовимірний масив є тільки в нашій уяві. У пам'яті спочатку розташовується масив а[0], що є нульовим рядком масиву а, потім — масив а[1],

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

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

а[i][j], де i (номер рядка) і j (номер стовпця) — вирази цілочисельного типу.

16

Кожен індекс може змінюватися від 0 до значення відповідної розмірності,

зменшеної на одиницю.

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

Можна звернутися до елементу масиву і іншими способами: *(*(а+i)+j) або

*(а[i]+j). Вони приведені для кращого розуміння механізму індексації, оскільки тут в явному вигляді записані ті ж дії, які генеруються комплятором при звичайному зверненні до масиву. Розглянемо їх .

Припустимо, потрібно звернутися до елементу, розташованого на перетині другого рядка і третього стовпця, — а[2][3]. Як і для масивів, ім'я масиву а є константним вказівником на початок масиву. У даному випадку це масив, що складається з трьох масивів.

Спочатку потрібно звернутися до другого рядка масиву, тобто масиву а[2].

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

виконати розадресацію: *(а+2). Нагадаємо, що при складанні покажчика з константою враховується довжина елементу, що адресується, тому насправді додається число 2, помножене на довжину елементу, тобто 2*(5*sizeof(int)),

оскільки елементом є рядок, що складається з 5 елементів типу int.

Далі потрібно звернутися до третього елементу отриманого масиву. Для отримання його адреси знову застосовується складання покажчика з константою 3 (насправді додається 3*sizeof(int)),а потім застосовується операція розіменування для набуття значення елементу: *(*(а+2)+3).

При описі масиву можна задати початкові значення його елементів. Їх записують у фігурних дужках. Елементи масиву ініціалізуються в порядку їх розташування в пам'яті. Наприклад, оператор:

int а[3][5]={ 1, 2, 1, 3, 5, 2, 3, 4, 5, 1, 1, 3, 2, 6, 1 };

визначає матрицю з наступними значеннями елементів:

1 2 1 3 5

2 3 4 5 1

1 3 2 6 1

17

Якщо кількість значень у фігурних дужках перевищує кількість елементів в масиві,

при компіляції буде видано повідомлення про помилку. Якщо значень меньше,

елементи масиву, що залишилися, ініціалізувалися значенням по замовченню (для основних типів це 0). Можна задавати початкові значення не для всіх елементів масиву. Для цього список значень констант для кожного рядка заключається в додаткові фігурні дужки. Ось, наприклад, як заповнити одиницями нульовий і перший стовпці приведеного вище масиву:

int а[3][5]= {{1, 1},{1, 1},{1, 1}};

Решта елементів масиву обнуляється.

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

int а[][5] = {{1,1,7,7,7}, {1,1,0}, {1,1,2,2,2}};

Матриці, як і масиви, треба вводити (виводити) по-елементно. Блок схема введення елементів матриці зображена на рисунку 8.1. Виведення матриці організується аналогічно введенню. На рисунку 8.2 показані властивості елементів матриці відносно головної і побічної діагоналі.

Введення n,m

ні

i=0, n-1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

так

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ні

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

j=0, m-1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

так

 

 

 

 

i<j

 

 

 

i+j+1<n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Введен-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i=j

 

 

 

 

i+j+1=n

 

 

ня

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i>j

 

 

 

 

 

 

 

 

 

 

 

 

n,m

 

 

 

 

 

 

 

 

 

i+j+1>n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рисунок 8.1 Введення елементів матриці

Рисунок 8.2 Властивості елементів матриці

18

// Фрагмент програми введення/виведення елементів масиву

int a[10][10];//оголошення двовимірного масиву a int i,j,n,m;

//введення розмірності масиву n * m cout<<"Enter kol strok:";

cin>>n;

cout<<"\nEnter kol stolbcov:"; cin>>m;

//введення елементів масиву for(i=0;i<n;i++) {

cout<<"Enter "<<m<<" chisel"<<endl; for(j=0;j<m;j++) cin>>a[i][j];}

//обробка масиву

. . . . . . . .

//виведення масиву на екран cout<<"Poluchem matrix: \n"; for(i=0;i<m;i++){

for(j=0;j<m;j++){ cout<<b[i][j]<<" ";

}

cout<<"\n";

}

Приклад 8.1 Знайти суму 2-х матриць

#include<iostream.h>

#include<conio.h>

main(){

int n,i,m,j,k,el; int mas[10][10]; clrscr();

cout<<"Enter size of matrix (m*n)"<<endl; cin>>n;

cin>>m;

for(j=0;j<m;j++)

{

for(i=0;i<n;i++) { mas[i][j]=0; }

}

for(k=0;k<2;k++){

cout<<"Enter "<<k+1<<" matrix"<<endl; for(j=0;j<m;j++){

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

19

cin>>el;

mas[i][j]+=el;

}

}

}

cout<<"Poluchem matrix: \n"; for(j=0;j<m;j++){

for(i=0;i<n;i++) cout<<mas[i][j]<<" "; cout<<endl; }

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

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

 

а11

а12

а13

а33

а32

а31

а21

а22

а23

а23

а22

а21

а31

а32

а33

а13

а12

а11

#include<iostream.h>

#include<conio.h>

#include<iomanip.h> int main(){

int a[4][4],b[4][4]; int k,m,i,j;

cout<<"Enter razmer matrix:"; cin>>m;

for(i=0;i<m;i++) { for(j=0;j<m;j++){

cin>>a[i][j];}} cout<<"Poluchem matrix: \n"; for(i=0;i<m;i++){ for(j=0;j<m;j++){ b[i][j]=a[m-1-i][m-1-j];

cout<<b[i][j]<<" ";

}

 

cout<<"\n";

 

}

 

getch();

}

return 0;

Послідовність виконання роботи

1.Уважно ознайомитися з теоретичним матеріалом щодо виконання практичної роботи.

2.Вивчити :

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

20