2 Робота з масивами за допомогою вказівників
.docЛабораторна робота № 2
Тема: «Робота з масивами за допомогою вказівників»
Загальне завдання:
-
розробити алгоритм вирішення завдання. Алгоритм представити за допомогою блок-схем або схем Насси-шнейдермана;
-
написати програму на мові програмування С++ для виконання завдання.
-
при завданні масиву спочатку необхідно задати з клавіатури кількість елементів масиву, а потім ввести самі елементи;
-
набрати програму з коментарями на комп'ютері, відладити, виконати.
Індивідуальне завдання:
№ п\ п |
Тип елементу масиву |
№ п\ п |
Тип елементу масиву |
|
float |
|
char |
|
int |
|
unsigned int |
|
char |
|
float |
|
unsigned int |
|
long int |
|
long int |
|
float |
|
float |
|
int |
|
int |
|
float |
|
char |
|
|
-
Написати програму, яка дозволяє визначити чи є квадратна матриця ортонормованою, тобто такий, в якій скалярний твір кожної пари різних рядків рівний 0, а скалярний твір кожного рядка на себе рівний 1.
-
Написати програму, яка дозволяє визначити, чи є задана квадратна матриця магічним квадратом, тобто такий, в якої суми елементів у всіх рядках і стовпцях однакові.
-
Написати програму, яка дозволяє визначити чи є квадратна матриця симетричною щодо головної діагоналі.
-
Написати програму, яка виводить на друк всі седловые точки матриці і їх індекси. Елемент матриці називається седловой крапкою, якщо він є найменшим в рядку і найбільшим в стовпці або, навпаки, є найбільшим в рядку і найменшим в стовпці.
-
Дана речова квадратна матриця, всі елементи якої різні. Знайти скалярний твір рядка, в якому знаходиться найбільший елемент, на стовпець з найменшим елементом.
-
Написати програму, яка виконує сортування рядків речової матриці по неубуванню суми їх елементів.
-
Написати програму, яка виконує сортування рядків речової матриці по неубуванню їх найбільших елементів.
-
Написати програму. Дана речова матриця. Переставляючи її рядки і стовпці добитися того, щоб найбільший елемент (один з них) опинився у верхньому лівому кутку.
-
Написати програму, яка виконує множення двох матриць (матриці не квадратні).
-
Написати програму. Вміст квадратної матриці повернути на 90 градусів за годинниковою стрілкою, вважаючи центром повороту центр симетрії матриці.
-
Написати програму. У кожному стовпці і кожному рядку матриці міститься строго поодинці нульовому елементу. Перестановкою рядків добитися розташування всіх нулів по головній діагоналі матриці.
-
Написати програму. У неквадратній матриці кожен елемент (окрім граничних) замінити сумою елементів, що безпосередньо примикають до нього, по вертикалі, горизонталі і діагоналям.
-
Написати програму. Потрібний кожен елемент заданої матриці замінити мінімальним елементом, вибираним серед елементів, що стоять не нижче і не правіше за цей елемент, включаючи його значення.
-
Написати програму. Неквадратну матрицю заповнити таким чином: елементам, що знаходяться по периметру матриці, привласнити значення 1; периметру підматриці, що залишилася, – значення 2 і так до заповнення всієї матриці.
-
Написати програму. Кожен елемент матриці (окрім крайніх) замінити виразом:
i = 2, 3 ., n-1, а крайні елементи – виразами:
Зміст звіту:
-
тема;
-
завдання;
-
схеми алгоритмів функцій і головної програми;
-
текст програми;
-
приклад виконання програми.
Приклад виконання завдання:
Завдання: Знайти суму мінімального і максимального елементів масиву. Тип елементів масиву float.
Алгоритм програми:
Оскільки в завданні сказано, що обробку масиву необхідно проводити за допомогою функцій, тоді необхідно виконати декомпозицію завдання.
У завданні сказано, що розмір масив і елементи масиву задаються з клавіатури, тоді можна написати відповідну функцію для виконання цієї підзадачі.
Схема Насси-шнейдермана для функції завдання масиву
Почало |
|
|
Виведення повідомлення «Введіть кількість елементів» |
Введення значення n |
|
n<=0 або n>=size |
|
i = 0 |
|
i < n |
|
|
Вивід на екран номера i-го елементу |
Введення значення i-го елементу |
|
i = i+1 |
|
Кінець |
Для перегляду і аналізу результатів виконання програми необхідно, щоб на екран виводився масив. Значить, також для друку масиву слід написати функцію.
Схема Насси-шнейдермана для функції друку масиву
Почало |
|
i = 0 |
|
i < n |
|
|
Виведення i-го елементу на екран |
i = i+1 |
|
Кінець |
У завданні сказано, що необхідно обчислити сума мінімального і максимального елементів масиву. Для цього необхідно знайти або значення мінімального і максимального елементів, або індекси мінімального і максимального елементів. Виберемо другий варіант.
Схема Насси-шнейдермана для функції пошуку індексу мінімального елементу масиву
Почало |
||
imin = 0 |
||
i =1 |
||
i < n |
||
|
mas[i]< + |
mas[imin] - |
imin = i |
|
|
i = i+1 |
||
Кінець |
Схема Насси-шнейдермана для функції пошуку індексу максимального елементу масиву
Почало |
||
imax = 0 |
||
i =1 |
||
i < n |
||
|
mas[i]> + |
mas[imax] - |
imax = i |
|
|
i = i+1 |
||
Кінець |
Для організації простого меню також можна написати функцію для виводу і вибору користувачем пункту меню. Це дозволить скоротити розмір функції main.
Схема Насси-Шнейдермана для функції вибору пункту меню
Почало |
|
|
Очищення екрану |
Виведення пунктів меню |
|
Повідомлення «Виберіть пункт меню» |
|
Введення номера пункту меню punkt |
|
punkt<1 або punkt>4 |
|
Кінець |
У функції main необхідно організувати виконання кожного з пунктів меню, за винятком пункту «Вихід». Також слід передбачити, що обов'язково спочатку виконався пункт «Введення масиву», а потім вже інші пункти меню, пов'язані з обробкою і друком масиву. Оскільки неможливо виконувати дії над масивом, поки не заданий його розмір і самі елементи масиву.
Схема Насси-Шнейдермана для головної функції програми
Почало |
|
|||||
|
|
punkt = menu() |
|
|||
punkt |
= |
|||||
1 |
2 |
3 |
|
|||
Введення масиву |
Друк масиву |
Обробка масиву |
||||
punkt < > 4 |
||||||
Кінець |
Текст програми:
/*Програма для пошуку суми максимального і мінімального елементів масиву.
Виконав(а) студент(но) групи №
ФІО, дата.*/
#include <iostream.h> //подключение бібліотеки введення/виводу
#include <conio.h> // підключення бібліотеки для обробки екрану
#include <iomanip.h> // підключення бібліотеки маніпуляторів для форматованого виводу
const size = 30; //максимальное кількість елементів в масиві
/*Функція введення масиву з клавіатури.
Вх.данниє:
mas – масив (не заданий);
n – кількість елементів в масиві (не задано)
Вих.данниє:
mas – масив заданий;
n – кількість елементів в масиві (від 1 до size-1)
Спосіб передачі параметрів:
Масив передається за допомогою покажчика на нульовий елемент масиву.
n передається по посиланню.
*/
void vvod(float *mas, int &n)
{ //цикл введення кількості елементів масиву
do
{
cout<<"Введите кількість елементів масиву ->";
cin>>n;
}while((n<=0)||(n>=size));
//введення елементів масиву з клавіатури
for (int i=0;i<n;i++)
{
cout<<"#"<<i<<" = "; //вывод індексу елементу, який вводиться з клавіатури
cin>>mas[i]; //ввод i-го елементу масиву з клавіатури
}
}
/*Функція друку масиву.
Вх.данниє:
mas – масив;
n – кількість елементів в масиві (від 1 до size-1)
Спосіб передачі параметрів:
Масив передається за допомогою покажчика на нульовий елемент масиву.
n передається за значенням.
*/
void print(float *mas, int n)
{
for(int i=0;i<n;i++)
cout<<setprecision(2) <<setw(10) <<mas[i]; //два знаку після коми
//для одного числа виділяється 10 позицій на екрані
}
/*Функція пошуку індексу мінімального елементу масиву.
Вх.данниє:
mas – масив;
n – кількість елементів в масиві (від 1 до size-1)
Вих.данниє:
Індекс мінімального елементу масиву */
int min(float *mas, int n)
{ int imin = 0; //пусть елемент з номером 0 буде мінімальним
for(int i=1;i<n;i++) //цикл перегляду елементів масиву від 1 до n-1
if (mas[i]<mas[imin]) imin = i; //поиск мінімального з двох чисел
return imin; //возврат індексу мінімального елементу масиву
}
/*Функція пошуку індексу максимального елементу масиву.
Вх.данниє:
mas – масив;
n – кількість елементів в масиві (від 1 до size-1)
Вих.данниє:
Індекс максимального елементу массива*/
int max(float *mas, int n)
{ int imax = 0; //пусть елемент з номером 0 буде максимальним
for(int i=1;i<n;i++) //цикл перегляду елементів масиву від 1 до n-1
if (mas[i]>mas[imax]) imax = i; //поиск максимального з двох чисел
return imax; //возврат індексу максимального елементу масиву
}
/*Функція для виведення меню на екран і вибору одного з пунктів меню.
Вих.данниє: номер пункту меню від 1 до 4*/int menu()
{ int number; //номер вибраного пункту меню
do //цикл виконується поки користувач не вибере пункт від 1 до 4
{
clrscr();
cout<<" Меню\n";
cout<<"1. Введення массива\n";
cout<<"2. Друк массива\n";
cout<<"3. Обробка массива\n";
cout<<"4. Виход\n";
cout<<"\nВыберите пункт меню -> ";
cin>>number;
}while ((number<1) || (number>4));
return number; //возврат номери пункту меню
}
void main() //главная функція програми
{
float а[size]; //массив
int m; //количество елементів в масиві
int punkt; //номер пункту меню
int isvvod=0; //признак, що масив заданий: isvvod=0 – масив не заданий, isvvod=1 – масив заданий
//цикл виконується поки користувач не вибере пункт «Вихід»
do
{ punkt = menu(); //выбор пункту меню
switch (punkt) //выполнение дій залежно від номер пункту меню
{
case 1: //пункт 1 «Введення масиву»
{
clrscr();
cout<<" --= Введення масиву =--\n";
vvod(а,m); //вызов функції для завдання розміру і елементів масиву
isvvod=1; //признак, що масив заданий
};break;
case 2: //пункт 2 «Друк масиву»
{
if (isvvod) //если масив заданий, то його можна роздрукувати
{
clrscr();
cout<<" --= Друк масиву =--\n";
print(а,m); //вызов функції для друку масиву
}
else //массив не заданий, необхідно спочатку задати масив
cout <<"Необходимо спочатку задати масив. Виберіть пункт 1.";
getch(); //задержка екрану до натиснення клавіші
};break;
case 3: //пункт 3 «Обробка масиву»
{
if (isvvod) //если масив заданий, то його можна роздрукувати
{
clrscr();
cout<<" --= Обробка масиву =--\n";
int imin = min(а,m); //вызов функції для визначення номера мин.элемента
int imax = max(а,m); //вызов функції для визначення номера макс.элемента
cout<<setprecision(2) <<"Минимальный елемент = "<<a[imin]<<"\n"; cout<<setprecision(2) <<"Максимальный елемент = "<<a[imax]<<"\n";
cout<<"Индекс мінімального елементу = "<<imin<<"\n";
cout<<"Индекс максимального елементу = "<<imax<<"\n";
cout<<setprecision(2) <<"Сумма мінімального і максимального елементів =<<
а[imin]+a[imax];
cout<<"\nМассив\n";
print(а,m); //вызов функції для друку масиву
}
else //массив не заданий, необхідно спочатку задати масив
cout <<"Необходимо спочатку задати масив. Виберіть пункт 1.";
getch(); //задержка екрану до натиснення клавіші
};break;
};
}while(punkt!=4); //цикл виконується поки не вибраний пункт 4 «Вихід»
}
Приклад виконання програми:
МЕНЮ 1. Введення масиву 2. Друк масиву 3. Обробка масиву 4. Вихід
Виберіть пункт меню -> 1
|
МЕНЮ 1. Введення масиву 2. Друк масиву 3. Обробка масиву 4. Вихід
Виберіть пункт меню -> 3
|
--= Введення масиву =-- Введіть кількість елементів масиву -> 5 # 0 = -5 # 1 = -6 # 2 = 2 # 3 = 15 # 4 = 8
|
--= Обробка масиву =-- Мінімальний елемент = -6 Максимальний елемент = 15 Індекс мінімального елементу = 1 Індекс максимального елементу = 3 Сума мінімального і максимального елементів = 9 Масив -5 -6 2 15 8
|
МЕНЮ 1. Введення масиву 2. Друк масиву 3. Обробка масиву 4. Вихід Виберіть пункт меню -> 2
|
МЕНЮ 1. Введення масиву 2. Друк масиву 3. Обробка масиву 4. Вихід Виберіть пункт меню -> 4
|
--= Друк масиву =-- -5 -6 2 15 8
|
|
Питання до захисту завдання:
-
поняття масиву;
-
оголошення масиву;
-
оголошення констант;
-
оператор множинного вибору switch;
-
логічні змінні;
-
використання маніпуляторів при виведенні даних на екран.