Лекции 2021 / OIT_lek_sem_20_10_2021
.docxЗадачи к контрольной работе №1
Дана целочисленная матрица a(4,4). Найти строку с наибольшей суммой элементов. Вывести на печать сумму её элементов.
#include "stdafx.h"
#include <iostream>
using namespace std;
void main()
{ const int n = 4;
int a[n][n] = { 5, 2, 6, 1,
1, 10, 3, 2,
7, 3, 2, 5,
1, 2, 3, 4 },
s[n], i, j, t, max, imax;
cout << "*****a*****";
cout << "\n";
for (i = 0;i < n;i++){
for (j = 0;j < n;j++)
cout << a[i][j]<< ' ';
cout << endl;
}// вывод матрицы a
//суммы элементов по строкам запишем в вектор s
for (i = 0;i < n;i++) {
t = 0;
for (j = 0;j < n;j++)
t += a[i][j]; //t =t+a[i][j];
s[i] = t;
}
cout << "\n";
for (i = 0;i < n;i++)
cout << s[i] << ' ';// вывод вектора s
cout << endl;
/* в векторе s найдём наибольший элемент, выведем на печать значение и индекс (таким образом, определим
строку матрицы a с наибольшей суммой элементов
и выведем на печать сумму её элементов)*/
max = s[0]; imax = 0;
for (i = 1;i < n;i++)
if (s[i] > max) { max = s[i]; imax = i; }
cout << max << ' ' << imax;
}// конец функции main
Дана целочисленная матрица a(5,5). Найти сумму положительных элементов, расположенных выше главной и выше побочной диагоналей. Вывести на печать полученное значение.
#include "stdafx.h"
#include <iostream>
using namespace std;
void main()
{ const int n = 5;
int a[n][n] = { 5, 2, 6, -1, 4,
1, 10, 3, 2, 5,
7, 3, 2, 5, 8,
1, 2, 3, 4, 5,
6, 7, 8, 9, 10},
i, j, t=0;
cout << "*****a*****";
cout << "\n";
for (i = 0;i < n;i++) {
for (j = 0;j < n;j++)
cout << a[i][j] << ' ';
cout << endl;
}// вывод матрицы a
cout << endl;
/*сумма положительных элементов, расположенных выше главной и выше побочной диагоналей*/
for (i = 0;i < n;i++)
for (j = 0;j < n;j++)
if (a[i][j]>0 && i<j && i+j<n-1) t += a[i][j];
cout << t;
}// конец функции main
Составить программу для нахождения нечётных элементов целочисленной матрицы d(5,5). Для проверки нечётности организовать вспомогательную функцию.
#include "stdafx.h"
#include <iostream>
using namespace std;
void odd(int x) {
if (x % 2 != 0) cout << "\nelement odd=" << x;
}
void main()
{ int d[5][5], i, j;
for (i = 0;i < 5;i++)
for (j = 0;j < 5;j++)
cin >> d[i][j];
for (i = 0;i < 5;i++)
for (j = 0;j < 5;j++)
odd(d[i][j]);
}
Файл 15.09.2021 стр.17 (для вычислений с матрицей).
Файл 06.10.2021 Пример 17 (стр.41).
Передача двухмерного массива в функцию также может быть оформлена с помощью указателя. Все элементы матрицы хранятся в одномерном массиве размером n*m элементов (n ‒ количество строк, m ‒ количество столбцов). Сначала в этом массиве расположена строка с индексом 0, затем ‒ с индексом 1 и т.д. Поэтому для обращения к элементу x[i][j] необходимо по номеру строки i и номеру столбца j вычислить номер k этого элемента:
k=i*m+j.
Обращение к элементу x[i][j] в программе оформляется как операция разыменования указателя:
*(x+i*m+j),
где x ‒ указатель-имя на элемент x[0][0], т.е. адрес ячейки памяти, в которой хранится значение x[0][0]; произведение i*m обеспечивает перемещение к новой строке матрицы, при этом отсчёт всегда ведётся от ячейки &x[0][0]; j ‒ формирует движение в пределах каждой строки.
Рассмотрим следующую задачу (пример 22). Заданы целочисленные матрицы a[3][3], b[4][4]. Вычислить для каждой из них суммы элементов по столбцам. Результат сохранить в векторе.
Для решения поставленной задачи в коде программы будем использовать вспомогательную функцию sumst с тремя аргументами:
int* x ‒ целочисленный указатель;
int n ‒ количество строк в матрице;
int m ‒ количество столбцов в матрице.
А также глобальную переменную int s[4] для сохранения и передачи результата из функции sumst в основную ‒ main.
Пример 22.
#include "stdafx.h"
#include <iostream>
using namespace std;
// описание глобальной переменной s
int s[4];
// описание вспомогательной функции sumst
void sumst(int* x, int n, int m) {
int i, j;
for (j = 0; j < m; j++) {// внешний цикл
s[j] = 0;
for (i = 0; i < n; i++) // внутренний цикл
s[j]+= *(x + i*m + j); // конец внутреннего цикла
}// конец внешнего цикла
}// конец функции sumst
// основная функция main
void main() {
int i, j, a[3][3], b[4][4];
cout << "*****a*****";
cout << "\n";
// ввод матрицы a с клавиатуры
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
cin >> a[i][j];
cout << "\n";
sumst(&a[0][0], 3, 3);
for (i = 0; i < 3; i++)
cout << s[i] << ' ';// вывод вектора s
cout << "\n";
cout << "*****b*****";
cout << "\n";
// ввод матрицы b с клавиатуры
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
cin >> b[i][j];
cout << "\n";
sumst(&b[0][0], 4, 4);
for (i = 0; i < 4; i++)
cout << s[i] << ' ';// вывод вектора s
}// конец функции main
В функции sumst вычисление оформлено в виде конструкции из вложенных циклов: внешний ‒ по столбцам, внутренний ‒ по строкам матрицы. Для каждого столбца j глобальная переменная s принимает значение 0 (s[j] = 0;) и далее в цикле по строкам обеспечивает формирование суммы элементов в пределах столбца (s[j]+= *(x + i*m + j);)
В основной функции сначала выполняется ввод матрицы a[3][3] во вложенных циклах, далее ‒ обращение к функции sumst, при этом формальные параметры (int* x, int n, int m) заменяются фактическими (&a[0][0], 3, 3), затем ‒ вывод результирующего вектора s в цикле (s[i]). Перечисленные операции реализуются в коде программы и для матрицы b[4][4].