1 9ЛР инфа
.docxЛабораторная работа №9
Динамические массивы
Цель лабораторной работы: изучение структурной организации динамических массивов и способов доступа к их элементам с использованием указателей; совершенствование навыков процедурного программирования на языке C/C++ при решении задач обработки динамических массивов.
Задание на программирование: используя технологию процедурного программирования, разработать программу обработки одномерных и двумерных (матриц) динамических массивов в соответствии с индивидуальным заданием.
Порядок выполнения работы:
1) Получить у преподавателя индивидуальное задание и выполнить постановку задачи: сформулировать условие, определить входные и выходные данные, их ограничения.
2) Разработать математическую модель: описать с помощью формул и рисунков структуру массивов и процесс их преобразования.
3) Построить схему алгоритма решения задачи.
4) Составить программу на языке C/C++.
5) Входные данные на этапах тестирования и демонстрации работы преподавателю должны задаваться либо с использованием специально подобранных арифметических формул, либо вводиться с клавиатуры по запросу. Датчики псевдослучайных чисел использовать запрещается.
Выходные данные должны выводиться на экран с пояснениями.
6) Проверить и продемонстрировать преподавателю работу программы на полном наборе тестов, в том числе с ошибочными входными данными. Входные и выходные массивы должны выводиться в одном и том же формате.
7) Использовать стандартные потоковые объекты ввода/вывода cin и cout.
8) Оформить отчет о лабораторной работе в составе: постановка задачи, математическая модель, схема алгоритма решения, текст программы, контрольные примеры.
Формулировка задания:
(вариант №22)
1) Дан массив c0, c1, c2,…, cn-1. Определить количество и сумму абсолютных значений элементов массива с чётными номерами, лежащих между минимальным элементом среди элементов с положительным значением и первым элементом с отрицательным значением, имеющим номер больше, чем n/2.
2) В заданной квадратной матрице размера 2n*2n поменять местами значения элементов строк области 6 и элементов столбцов области 4 (см. рисунок) с одинаковыми номерами.
Текст программы:
1)
#include<iostream>
#include<math.h>
#include <locale.h>
using std::cout;
using std::cin;
using std::endl;
typedef int telem ;
typedef int *tmas ;
int nomer(tmas a, int &chet, int n, telem &sum) ;
void inputmas(tmas a, int n) ;
int main()
{int i, n ;
setlocale(LC_ALL,"Russian") ;
cout << "\nВведите количество элементов массива: " ;
cin >> n ;
tmas a = new telem [n] ;
telem sum ;
int chet ;
inputmas(a, n) ;
chet = nomer(a, chet, n, sum) ;
cout << "\nКолличество чётных номеров: " << chet << endl ;
cout << "Сумма чётных элементов: " << sum ;
delete [] a;
return 0 ;
}
int nomer(tmas a, int &chet, int n, telem &sum)
{telem min = a[0] ;
int otr = 0 ;
int b,c;
for(int i = 1 ; i < n ; i++)
if((min > *(a +i)) && (*(a +i) > 0 ))
{min = i ;
}
for(int i = n/2 ; i < n ; i++)
if (*(a +i)<0)
{otr = i;
i = n;
}
if (otr > min)
{c = otr;
b = min;
}
else
{b = otr;
c = min;
}
sum = 0;
for(int i = (b+1) ; i < c ; i++)
if((i % 2) == 0 && (i != c))
{ chet++;
sum = sum + *(a +i);
}
return chet ;
}
void inputmas(tmas a, int n)
{cout << endl <<"Введите в одной строке элементы массива, состоящего из";
cout << endl << n << " чисел (положительных и отрицательных), и нажмите <Enter>" << endl;
for(int i = 0 ; i < n ; i++)
cin >> *(a +i) ;
}
Скриншот контрольного примера выполнения программы
Текст программы:
2)
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
typedef int telem;
typedef telem *tstr;
typedef tstr *tmatr;
void input(tmatr, int, int);
void change(tmatr, int, int);
void output(tmatr, int, int);
int main() {
int i, j;
int n;
tmatr a;
cout << "\nВведите размер матрицы 2n*2n: n = ";
cin >> n;
a = new tstr[2 * n];
for (i = 0; i < 2 * n; i++)
*(a + i) = new telem[2 * n];
input(a, 2 * n, 2 * n);
change(a, n, n);
output(a, 2 * n, 2 * n);
for (i = 0; i < 2 * n; i++)
delete a[i];
delete a;
return 0;
}
void input(tmatr a, int str, int n) {
cout << "Введите построчно через пробел элементы";
cout << "\nдвумерного массива размера " << str << "x" << str << endl;
cout << "После ввода строки нажимайте <Enter>" << endl;
for (int i = 0; i < str; i++)
for (int j = 0; j < str; j++)
cin >> *(*(a + i) + j);
}
void output(tmatr a, int str, int n) {
cout << "\nПреобразованная матрица:" << endl;
for (int i = 0; i < str; i++) {
for (int j = 0; j < str; j++)
cout << *(*(a + i) + j) << ' ';
cout << endl;
}
}
void change(tmatr a, int str, int n) {
int i, j, k, l;
tmatr b;
b = new tstr[2 * str];
for (int z = 0; z < 2 * str; z++)
*(b + z) = new telem[2 * str];
l = 0;
for (i = 0; i < str; i++) {
for (j = 0; j <= i; j++) {
*(*(b + i) + j) = *(*(a + j+n) + i+n);
}
j = 0;
for (k = (2 * str - 1); k >= (2 * str - 1) - l; k--) {
*(*(a + j+n) + i+n) = *(*(a + k) + l);
*(*(a + k) + l) = *(*(b + i) + j);
j++;
}
l++;
}
for (int z = 0; z < 2 * str; z++)
delete b[z];
delete b;
}
Скриншот контрольного примера выполнения программы