Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции 2021 / OIT_lek_sem_20_10_2021

.docx
Скачиваний:
2
Добавлен:
14.12.2023
Размер:
28.07 Кб
Скачать

Задачи к контрольной работе №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].

61

Соседние файлы в папке Лекции 2021