
- •Лабораторная работа №1 Линейные и разветвляющиеся алгоритмы
- •Арифметические выражения
- •Операции с целыми числами
- •Логические выражения
- •Организация ветвлений в алгоритмах
- •Лабораторная работа №2 Циклические алгоритмы
- •Рекуррентные последовательности
- •Вычисление характеристик числовой последовательности
- •Определение свойства числовой последовательности
- •Формирование массива Пример
- •Вычисление характеристик массива
- •Модификация массивов
- •I часть
- •II часть Пример
- •III часть
- •Лабораторная работа №4 «Двумерные массивы»
- •Вывод элементов
- •Вычисление характеристик матриц
- •Модификация
- •Литература
Вычисление характеристик матриц
Пример
Дана квадратная матрица порядка M. Найти среднее арифметическое элементов каждой ее диагонали, параллельной главной .
Вариант программы на языке С
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <time.h>
int main()
{ int n, i, j, k;
int **a;
setlocale(LC_ALL, "");
srand(time(0));
printf("Введите n: ");
scanf("%d", &n);
// Выделяем память для массива.
a = (int **) malloc(sizeof(int *) * n);
for(i = 0; i < n; i++)
a[i] = (int *) malloc(sizeof(int) * n);
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
a[i][j] = rand() % 10;
printf("Матрица:\n");
for(i = 0; i < n; i++)
{ for(j = 0; j < n; j++)
printf(" %d", a[i][j]);
printf("\n");
}
printf("\n");
printf("Среднее арифметическое элементов каждой ее диагонали,\n");
printf("параллельной главной, начиная с левой нижней диагонали:\n");
//Всего 2*n+1 диагоналей: n-1 ниже главной, столько же - выше неё.
// %g - спецификатор для вывода "короткой записи" вещественных чисел (float)
for(k = n - 1; k >= 0; k--)
{ int s = 0;
for(i = k, j = 0; i < n; i++, j++)
s += a[i][j];
printf("%g ", (float) s / (n - k));
}
for(k = 1; k < n; k++)
{ int s = 0;
for(i = 0, j = k; j < n; i++, j++)
s += a[i][j];
printf("%g ", (float) s / (n - k));
}
printf("\n");
// Освобождаем память.
for(i = 0; i < n; i++)
free(a[i]);
free(a);
return 0;
}
Дана квадратная матрица порядка M. Вычислить сумму элементов матрицы, лежащих одновременно выше главной диагонали и выше побочной диагонали. Условный оператор не использовать.
Дана квадратная матрица порядка M. Найти минимальный среди элементов матрицы, лежащие выше побочной диагонали. Условный оператор не использовать
Дана квадратная матрица порядка M. Найти сумму элементов каждой ее диагонали, параллельной побочной.
Дана квадратная матрица порядка M Найти максимальный среди элементов матрицы, лежащие на побочной диагонали и ниже нее. Условный оператор не использовать
Дана матрица размера MxN. Вывести номера строк, содержащих минимальное значение матрицы
Дана матрица размера MxN. Подсчитать количество столбцов, в которых отрицательных элементов больше, чем положительных
Дана матрица размера MxN . Вывести номера строк с максимальной суммой элементов
Дана матрица размера MxN. В каждой строке найти минимальный элемент, затем среди этих чисел выбрать наибольшее. Вывести индексы элемента с найденным значением
Дана матрица размера MxN . Вывести номера строк, элементы которых образуют неубывающую последовательность.
Дана матрица размера MxN. Найти наименьшее из значений элементов столбца, который обладает наибольшей суммой модулей элементов. Если таких столбцов несколько, то взять первый из них
Модификация
Пример 1
Транспонировать заданную матрицу
Вариант программы на языке С++
#include <iostream>
#include <locale>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
int n, m;
int **a, **at;
setlocale(LC_ALL, "");
srand(time(0));
cout << "Введите n: ";
cin >> n;
cout << "Введите m: ";
cin >> m;
// Выделяем память для массива.
a = new int*[n];
at = new int*[m];
for(int i = 0; i < n; i++)
a[i] = new int[m];
for(int i = 0; i < m; i++)
at[i] = new int[n];
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
a[i][j] = rand() % 10;
cout << "Матрица:" << endl;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
cout << " " << a[i][j];
cout << endl;
}
cout << endl;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
at[j][i] = a[i][j];
cout << "Транспонированная матрица:" << endl;
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
cout << " " << at[i][j];
cout << endl;
}
cout << endl;
// Освобождаем память.
for(int i = 0; i < n; i++)
delete[] a[i];
delete[] a;
for(int i = 0; i < m; i++)
delete[] at[i];
delete[] at;
return 0;
}
Пример 2
Дана матрица размера MxN.. Удалить строку и столбец, на пересечении которых находится максимальный элемент матрицы
Вариант программы на языке С++
#include <iostream>
#include <locale>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{ int n, m;
int **a;
setlocale(LC_ALL, "");
srand(time(0));
cout << "Введите n: ";
cin >> n;
cout << "Введите m: ";
cin >> m;
// Выделяем память для массива.
a = new int*[n];
for(int i = 0; i < n; i++)
a[i] = new int[m];
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
a[i][j] = rand() % 90 + 10;
cout << "Матрица:" << endl;
for(int i = 0; i < n; i++)
{ for(int j = 0; j < m; j++)
cout << " " << a[i][j];
cout << endl;
}
cout << endl;
// Ищем максимальный элемент.
int imax = 0, jmax = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
if(a[i][j] > a[imax][jmax])
{ imax = i;
jmax = j;
}
cout << "Наибольший элемент - a[" << imax << "]["
<< jmax << "] = " << a[imax][jmax] << endl;
// Удаляем строку и столбец.
// На самом деле мы просто сдвигаем некоторые
// элементы и уменьшаем на 1 n и m.
for(int i = 0; i < n; i++)
for(int j = jmax; j < m - 1; j++)
a[i][j] = a[i][j + 1];
m--;
for(int j = 0; j < m; j++)
for(int i = imax; i < n - 1; i++)
a[i][j] = a[i + 1][j];
n--;
cout << "Изменённая матрица:" << endl;
for(int i = 0; i < n; i++)
{ for(int j = 0; j < m; j++)
cout << " " << a[i][j];
cout << endl;
}
cout << endl;
// Освобождаем память.
for(int i = 0; i < n; i++)
delete[] a[i];
delete[] a;
return 0;
}
Дана матрица размера MxN. Поменять местами столбцы, содержащие минимальный и максимальный элементы матрицы.
Дана матрица размера MxN. Продублировать столбец матрицы, содержащий ее минимальный элемент.
Дана матрица размера MxN. Продублировать строку матрицы, содержащую ее максимальный элемент
Дана матрица размера MxN и целые числа K1 и K2 (1 <= K1 < K2 <= M). Поменять местами строки матрицы с номерами K1 и K2.
Дана матрица размера MxN (N – четное число). Поменять местами левую и правую половины матрицы
Дана матрица размера MxN Преобразовать матрицу, поменяв местами минимальный и максимальный элемент в каждой строке.
Дана матрица размера MxN (M и N — четные числа). Поменять местами левую верхнюю и правую нижнюю четверти матрицы.
Дана матрица размера MxN. Преобразовать матрицу, поменяв местами строки, содержащие минимальный и максимальный элемент матрицы
Дана матрица размера MxN. Поменять местами столбцы, содержащие минимальный и максимальный элементы матрицы.
Дана матрица размера MxN, содержащая как положительные, так и отрицательные элементы. Удалить все ее столбцы, содержащие только положительные элементы. Если требуемых столбцов нет, то вывести матрицу без изменений.