МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
Інститут ІКНІ
Кафедра ІСМ
ЗВІТ
про виконання лабораторної роботи №7
на тему: «Робота з динамічними масивами»
з предмету «Програмування та алгоритмічні мови»
Мета роботи: навчитися виділяти та використовувати динамічні масиви даних.
Хід роботи
Завдання 1.
Пишу програму для виконання дій над динамічним двовимірним масивом згідно з своїм варіантом
(Варіант 1).
Написати програму, яка впорядковує за спаданням елементи головниї діагоналі квадратної матриці.
Реалізую доступ до елементів масива двома способами: за допомогою індексів та вказівників. Кожний спосіб реалізую окремою функцією. Алгоритм формування початкового масива реалізую двома способами: за допомогою введення даних з клавіатури та випадкової генерації чисел. В окремій фнкції передбачаю виділення пам’яті під динамічний масив функціями malloc, calloc та new.Кожний спосіб реалізую окремою функцією. Також вивожу на екран елементи початкового масива, а також змінений. В підпрограмі не використовую глобальні змінні. Інформація у підпрограмі передається лише за допомогою параметрів. Введення даних, виведення даних і виконання дій над масивами реалізую в окремих функціях. У головній програмі виконую їхній виклик. Введення-виведення даний супроводжуються відповідними повідомленнями.
Код програми першого завдання:
#include<conio.h>
#include<math.h>
#include <clocale>
#include<iostream>
#include <time.h>
#include <iomanip>
using namespace std;
void newMemoryAllocation(int**&a, int rowCount)
{
a = new int*[rowCount];
for (int i = 0; i < rowCount; i++)
a[i] = new int[rowCount];
}
void mallocMemoryAllocation(int**&a, int rowCount)
{
a = (int**)calloc(rowCount,sizeof(int*));
for (int i = 0; i < rowCount; i++)
a[i] = (int*)calloc(rowCount,sizeof(int));
}
void callocMemoryAllocation(int**&a, int rowCount)
{
a = (int**)malloc(rowCount*sizeof(int*));
for (int i = 0; i < rowCount; i++)
a[i] = (int*)malloc(rowCount*sizeof(int));
}
void input(int**&a, int rowCount)
{
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < rowCount; j++)
{
std::cout << "a[" << i << "][" << j << "] = ";
std::cin >> a[i][j];
}
}
}
void random(int**&a, int rowCount)
{
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < rowCount; j++)
{
a[i][j] = rand() % 200 - 100;
}
}
}
void output(int**a, int rowCount)
{
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < rowCount; j++)
std::cout << a[i][j] << "\t";
std::cout << std::endl;
}
}
void sort(int**&a, int rowCount)
{
int s = 0;
for (int i = 0; i < rowCount; i++)
for (int j = 0; j < rowCount-1; j++)
if (a[j][j]<a[j+1][j+1])
{
int temp = a[j+1][j+1];
a[j + 1][j + 1] = a[j][j];
a[j][j] = temp;
}
}
int main() {
setlocale(LC_CTYPE, "ukr");
srand(time(NULL));
char check = 0;
char check1 = 0;
int **a=NULL;
int rowCount;
cout << "Введіть кільість рядків: ";
cin >> rowCount;
int choice = 0;
std::cout << "введiть 1, якщо хочете викликати calloc, 2 якщо malloc, 3 якщо new \n";
std::cin >> check;
if (check == '1')
callocMemoryAllocation(a, rowCount);
else if (check == '2')
mallocMemoryAllocation(a, rowCount);
else
newMemoryAllocation(a, rowCount);
std::cout << "введiть 1, якщо хочете вводити власноруч, якщо нi то будь-який інший символ \n";
std::cin >> check1;
if (check1 == '1')
input(a, rowCount);
else
random(a, rowCount);
output(a, rowCount);
sort(a, rowCount);
cout << "\n\n";
output(a, rowCount);
_getch();
}
Рис 1. Результат виконання першої програми
Блок-схема до першого завдання:
Рис 2. Алгоритм виконання програми
Завдання 2.
Пишу програму для виконання дій над динамічним двовимірним масивом згідно з своїм варіантом
(Варіант 1).
Задано двовимірний масив цілих числез діапазону (-16,…,22). Знайти всі елементи кратні 3 або всі, крім від’ємних.
Реалізую доступ до елементів масива двома способами: за допомогою індексів та вказівників. Кожний спосіб реалізую окремою функцією. Алгоритм формування початкового масива реалізую двома способами: за допомогою введення даних з клавіатури та випадкової генерації чисел. В окремій фнкції передбачаю виділення пам’яті під динамічний масив функціями malloc, calloc та new.Кожний спосіб реалізую окремою функцією. Також вивожу на екран елементи початкового масива, а також змінений. В підпрограмі не використовую глобальні змінні. Інформація у підпрограмі передається лише за допомогою параметрів. Введення даних, виведення даних і виконання дій над масивами реалізую в окремих функціях. У головній програмі виконую їхній виклик. Введення-виведення даний супроводжуються відповідними повідомленнями.
.
Код програми до другого завдання:
#include<conio.h>
#include<math.h>
#include <clocale>
#include<iostream>
#include <time.h>
#include <iomanip>
using namespace std;
void newMemoryAllocation(int**&a, int rowCount, int columnCount)
{
a = new int*[rowCount];
for (int i = 0; i < rowCount; i++)
a[i] = new int[columnCount];
}
void mallocMemoryAllocation(int**&a, int rowCount, int columnCount)
{
a = (int**)calloc(rowCount, sizeof(int*));
for (int i = 0; i < rowCount; i++)
a[i] = (int*)calloc(columnCount, sizeof(int));
}
void callocMemoryAllocation(int**&a, int rowCount, int columnCount)
{
a = (int**)malloc(rowCount*sizeof(int*));
for (int i = 0; i < rowCount; i++)
a[i] = (int*)malloc(columnCount*sizeof(int));
}
void input(int**&a, int rowCount, int columnCount)
{
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < columnCount; j++)
{
std::cout << "a[" << i << "][" << j << "] = ";
std::cin >> a[i][j];
}
}
}
void random(int**&a, int rowCount, int columnCount)
{
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < columnCount; j++)
{
a[i][j] = rand() % 200 - 100;
}
}
}
void output(int**a, int rowCount, int columnCount)
{
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < columnCount; j++)
std::cout << a[i][j] << "\t";
std::cout << std::endl;
}
}
void outputCondition(int**&a, int rowCount, int columnCount)
{
cout << "Елементи масиву, що більші нуля або кратні 3: ";
for (int i = 0; i < rowCount; i++)
for (int j = 0; j < columnCount; j++)
if (a[i][j]>=0||a[i][j]%3==0)
cout << a[i][j]<<" ";
}
int main() {
setlocale(LC_CTYPE, "ukr");
srand(time(NULL));
char check = 0;
char check1 = 0;
int **a = NULL;
int rowCount, columnCount;
cout << "Введіть кільість рядків: ";
cin >> rowCount;
cout << "Введіть кільість стовпців: ";
cin >> columnCount;
int choice = 0;
std::cout << "введiть 1, якщо хочете викликати calloc, 2 якщо malloc, 3 якщо new \n";
std::cin >> check;
if (check == '1')
callocMemoryAllocation(a, rowCount, columnCount);
else if (check == '2')
mallocMemoryAllocation(a, rowCount, columnCount);
else
newMemoryAllocation(a, rowCount, columnCount);
std::cout << "введiть 1, якщо хочете вводити власноруч, якщо нi то будь-який інший символ \n";
std::cin >> check1;
if (check1 == '1')
input(a, rowCount,columnCount);
else
random(a, rowCount, columnCount);
output(a, rowCount, columnCount);
cout << "\n\n";
outputCondition(a, rowCount, columnCount);
_getch();
}
/
Рис 3. Результат виконання другого завдання
Блок-схема до другого завдання:
Рис 4. Блок-схема до завдання 2
Завдання 3.
Пишу програму для виконання дій над динамічним двовимірним масивом згідно з своїм варіантом
(Варіант 1).
Задано двовимірний масив цілих числез діапазону (-16,…,22). Знайти всі елементи кратні 3 або всі, крім від’ємних.
Реалізую доступ до елементів масива двома способами: за допомогою індексів та вказівників. Кожний спосіб реалізую окремою функцією. Алгоритм формування початкового масива реалізую двома способами: за допомогою введення даних з клавіатури та випадкової генерації чисел. В окремій фнкції передбачаю виділення пам’яті під динамічний масив функціями malloc, calloc та new.Кожний спосіб реалізую окремою функцією. Також вивожу на екран елементи початкового масива, а також змінений. В підпрограмі не використовую глобальні змінні. Інформація у підпрограмі передається лише за допомогою параметрів. Введення даних, виведення даних і виконання дій над масивами реалізую в окремих функціях. У головній програмі виконую їхній виклик. Введення-виведення даний супроводжуються відповідними повідомленнями.
Код програми третього завдання:
#include<conio.h>
#include<math.h>
#include <clocale>
#include<iostream>
#include <time.h>
#include <iomanip>
using namespace std;
void newMemoryAllocation(int**&a, int rowCount, int columnCount)
{
a = new int*[rowCount];
for (int i = 0; i < rowCount; i++)
a[i] = new int[columnCount];
}
void mallocMemoryAllocation(int**&a, int rowCount, int columnCount)
{
a = (int**)calloc(rowCount, sizeof(int*));
for (int i = 0; i < rowCount; i++)
a[i] = (int*)calloc(columnCount, sizeof(int));
}
void callocMemoryAllocation(int**&a, int rowCount, int columnCount)
{
a = (int**)malloc(rowCount*sizeof(int*));
for (int i = 0; i < rowCount; i++)
a[i] = (int*)malloc(columnCount*sizeof(int));
}
void input(int**&a, int rowCount, int columnCount)
{
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < columnCount; j++)
{
std::cout << "a[" << i << "][" << j << "] = ";
std::cin >> a[i][j];
}
}
}
void random(int**&a, int rowCount, int columnCount)
{
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < columnCount; j++)
{
a[i][j] = rand() % 20 - 10;
}
}
}
void output(int**a, int rowCount, int columnCount)
{
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < columnCount; j++)
std::cout << a[i][j] << "\t";
std::cout << std::endl;
}
}
void outputCondition1(int**&a, int rowCount, int columnCount)
{
int count = 0;
for (int i = 0; i < rowCount; i++)
{
bool check = 1;
for (int j = 0; j < columnCount; j++)
if (a[i][j] == 0) check = 0;
if (check == 1)
count++;
}
cout << "> 0 cont: " << count;
}
void outputCondition2(int**&a, int rowCount, int columnCount)
{
int max = -9999999;
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < columnCount; j++)
{
if (a[i][j] > max)
{
for (int i2 = 0; i2 <= i; i2++)
for (int j2 = 0; j2 < (i2==i?j:rowCount); j2++)
if (a[i][j] == a[i2][j2])
max = a[i][j];
}
}
}
if (max == -9999999)
cout << "жодне з чисел не повторюється";
else
cout << "max: " << max;
}
int main() {
setlocale(LC_CTYPE, "ukr");
srand(time(NULL));
char check = 0;
char check1 = 0;
int **a = NULL;
int rowCount, columnCount;
cout << "Введіть кільість рядків: ";
cin >> rowCount;
cout << "Введіть кільість стовпців: ";
cin >> columnCount;
int choice = 0;
std::cout << "введiть 1, якщо хочете викликати calloc, 2 якщо malloc, 3 якщо new \n";
std::cin >> check;
if (check == '1')
callocMemoryAllocation(a, rowCount, columnCount);
else if (check == '2')
mallocMemoryAllocation(a, rowCount, columnCount);
else
newMemoryAllocation(a, rowCount, columnCount);
std::cout << "введiть 1, якщо хочете вводити власноруч, якщо нi то будь-який інший символ \n";
std::cin >> check1;
if (check1 == '1')
input(a, rowCount, columnCount);
else
random(a, rowCount, columnCount);
output(a, rowCount, columnCount);
cout << "\n\n";
outputCondition1(a, rowCount, columnCount);
cout << "\n\n";
outputCondition2(a, rowCount, columnCount);
_getch();
}
Рис 5. Результат обчислення програми, написаної відповідно 3 завдання.
Блок-схема до третього завдання:
Рис 8. Алгоритм виконання третього завдання.
Висновок:
На даній лабораторній роботі я вивчила засоби мови C для оголошення та ініціалізації динамічних двовимірних масивів, звернення до їх елементів за допомогою індексів та вказівників, введення масивів з клавіатури, генерування випадкових значень елементів та виведення їх на екран.
Також навчилася, як правильно сортувати елементи двовимірного масива, а також за допомогою яких обмежень можна обчислити тільки додатні елементи будь-якого масива. Дізналася в чому полягає відмінність одновимірного масива від двовимірного. Також навчилася правильно будувати блок-схеми для програм з використанням масивів. Також оволоділа новим навиком – випадковим генеруванням елементів масива.