Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка С++ BIKS-12 (Любченко).doc
Скачиваний:
38
Добавлен:
13.04.2015
Размер:
820.74 Кб
Скачать

2Розв’язання задач з використанням масивів

2.1 Мета роботи

Навчитися складати та реалізовувати у середовищі Visual C++ програми обробки масивів.

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

При роботі з масивами треба звернути увагу на введення та виведення даних. При програмуванні обов'язково треба використовувати покажчики. Покажчик — особливий тип даних, призначений для збереження адреси в пам'яті.

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

Тісний зв'язок з покажчиками має визначений у мові C++ тип даних – масив, або вектор. Масиви — це структурований тип даних, які представляють собою безупинні блоки пам'яті, що містять безліч елементів того самого типу. Ознакою масиву при описі є наявність парних дужок — “[ ]”. Елементи масива нумеруються з 0. Наприклад:

int mas1[21]; char mas2[67];

де оголошені вектор mas1, що містить 21 елемента типу int і вектор mas2, що містить 67 елементів типу char.

У C++ дозволені два способи доступу до елементів вектора: з використанням механізму покажчиків і класичний — за допомогою індексу.

Застосування механізму покажчиків засновано на використанні факту, що ім'я вектора є покажчиком – константою, що дорівнює адресі початку вектора - першого байта першого елемента вектора (mas1==&mas1[0]). У результаті цього, використовуючи операцію разіменування «*» можна забезпечити доступ до будь – якого елемента вектора. Так, еквівалентними будуть звертання до i-го елементу вектора з використанням індексу — mas1[i] і посилання *(mas1+i), оскільки (mas1+i)==& mas1[i].

Багатомірні масиви в С++ представляються у виді векторів покажчиків на вектори - багатомірні вектора.

Використання механізму покажчиків для доступу до деякого і,j,k-го елементу тривимірного вектора може бути таким:

b[і][j][k]= = *(b[і][j]+k)= =*(*(b[і]+j)+k)= =*(*(*(b+і)+j)+k) .

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

Приклад 2.1 Знайти у масиві mas найменший елемент та його індекс.

#include <iostream>

#include <conio.h>

int main()

{

const int n=5;

int mas[n];

std::cout<<"Vvedit "<<n<<" elemetiv massivu "<<std::endl;

int i;

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

{

std::cin>>mas[i];

}

int imin=0;

for(i=1;i<n;i++)

{

if (mas[imin]>mas[i])

imin=i;

}

std::cout<<"min="<<mas[imin]<<"\tindex="<<imin<<std::endl;

getch();//задержка экрана

return 0;

}

Приклад 2.2Відсортувати масив mas дійсних чисел розміром 10 елементів за зменшенням.

#include <iostream>

#include <conio.h>

int main()

{

int i, j;

const int n = 10;

float mas [n], rab;

std::cout<<"Vvеdі 10 elem \n";

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

std::cin>>mas[i]; // cin>>*(mas+i);

std::cout<< " Isxodnik\n";

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

std::cout<<mas[i]<<" "; // cout<<*(mas+i)<<" ";

std::cout<<"\n"; // cout<<endl;

// Сортировка по убыванию

for (i=0; i<n-1; i++)

for (j=0;j<n-1-i;j++)

if(mas[j]<mas[j+1]) // if(*(mas+j) <*(mas+j+1))

{

rab= mas[j]; // rab=*(mas+j);

mas[j] =mas[j+1];// *(mas+j)=*(mas+j+1);

mas[j+1]=rab;

} // *(mas+j+1)=rab;

// Вывод результата

std::cout<< " Otsort massiv\n"<<"\n";

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

std::cout<< mas[i]<<" "; // cout<<*(mas+i)<<" ";

getch();//задержка экрана

return 0;

}

Приклад 2.3 В багатовимірному масиві matr розміром 5*6 знайти суму елементів кожного рядка. Отриманий масив відсортувати за зростанням.

#include <iostream>

#include <conio.h>

int main()

{

int i,j,sum,stk;

const int n =5, m=6;

int matr[n][m], mas[n];

std::cout<<"Input matr\n";

// Ввод матрицы

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

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

std::cin>> *(*(matr+i)+j);

// Определение суммы элементов строк

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

{

sum=0;

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

{

sum+=*(*(matr+i)+j);

}

*(mas+i)=sum;

}

std::cout<< "Result mas\n";

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

std::cout<< *(mas+i)<<" ";

// Сортировка вектора mas по возрастанию

for( i=0; i < n-1; i++)

for( j=0; j < n-1-i; j ++)

if (*(mas+j)> *(mas+j+1))

{

stk=*(mas+j);

*(mas+j)= *(mas+j+1);

*(mas+j+1)=stk;

}

// Вывод отсортированного массива

std::cout<< "\nResult otsortirov mas\n";

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

std::cout<< *(mas+i)<<" ";

getch();//задержка экрана

return 0;

}

Приклад 2.4 Створити динамічний масив з n елементів (значення n ввести с клавіатури). Знайти кількість від’ємних елементів масиву.

#include <iostream>

#include <conio.h>

int main()

{

int n,i;

int *mas;

std::cout<<"Vvedit kilkist' strok (n)\n";

std::cin>>n;

mas=new int[n];//створюємо динамічний масив

//Введення масиву

std::cout<<"Vvedit "<<n<<" elementiv massivu\n";

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

std::cin>>mas[i];

int kil(0);

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

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

if(mas[i]<0)

kil++;

std::cout<<"kil="<<kil<<"\n";

delete [] mas;//вивільнюємо пам’ять

getch();//задержка экрана

return 0;

}

Приклад 2.5 Створити динамічний масив з n строк та m стовпців (значення n та m ввести с клавіатури). Знайти суму парних елементів масиву.

#include <iostream>

#include <conio.h>

int main()

{

int n,m,i;

int **mas;

std::cout<<"Vveditе kilkist' strok (n) i stolbcov (m)"<<std::endl;

std::cin>>n>>m;

//створюємо динамічний масив

mas=new int*[n]; //створюємо масив покажчиків

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

mas[i]=new int[m]; //створюємо динамічні строки

std::cout<<"Vveditе "<<n<<"x"<<m <<" elementi massiva"<<std::endl;

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

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

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

std::cin>>mas[i][j];

// Виведення на экран вихідного мисиву

for(i=0;i<n;i++,std::cout<<std::endl)

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

std::cout<<mas[i][j]<<"\t";

int sum(0);

//Підраховуємо суму парних елементів

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

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

if(mas[i][j]%2==0)

sum+=mas[i][j];

std::cout<<"sum=="<<sum<<std::endl;

// вивільнюємо пам’ять

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

delete[]mas[i];//вивільнюємо строки

delete []mas; //вивільнюємо масив покажчиків

getch();//задержка экрана

return 0;

}