Умножение матрицы на вектор
int a[m][n], i, j, s, b[n], c[m];
….
for (i=0; i<m; i++)
{ s=0;
for (j=0; j<n; j++)
s=s+a[i][j]*b[j];
c[i]=s;
}
Удаление строки из матрицы
Требуется удалить строку с заданным номером k. Решение задачи аналогично удалению элемента из одномерного массива. Все строки, начиная с (k+1)-й, нужно переместить вверх. Число строк уменьшается на 1.
for (i=k; i<m; i++)
for (j=0; j<n; j++)
b[i][j]=b[i+1][j];
Удаление столбца осуществляется аналогично.
Перестановка строк матрицы
1-й способ.
С использованием вспомогательной переменной P (того же типа, что и элементы массива) перестановка осуществляется во всех столбцах двух строк.
for ( k=0; k<n; k++)
{ P=A[i][k]; A[i][k]=A[j][k]; A[j][k]=P; }
2-й способ
С использованием вспомогательного массива, в который целиком пересылается одна из строк для временного хранения.
for ( k=0; k<n; k++)
c[k]=a[i][k];
for ( k=0; k<n; k++)
a[i][k]= a[j][k];
for ( k=0; k<n; k++)
a[j][k]=c[k];
Примеры решения
1. Вычисление и вывод на экран таблицы умножения в форме матрицы Пифагора.
#include <stdio.h>
#include<conio.h>
void main()
{ const int n=10;
int a[n][n], i, j;
clrscr();
for (i=1; i<n; i++)
{ for ( j=1; j<n; j++)
{ a[i][j]=i*j;
printf ("%5d", a[i][j] );
}
printf ("\n");
}
getch();
}
По данной программе в двумерном массиве не будут заполнены нулевая строка и нулевой столбец.
2. Заполнение матрицы случайными числами в диапазоне от 0 до 99 и поиск в ней максимального значения.
#include <stdio.h>
#include<conio.h>
#include <stdlib.h>
#define n 5
void main()
{
int a[n][n], i, j, imax, jmax;
clrscr();
randomize();
for (i=0; i<n; i++)
{ for ( j=0; j<n; j++)
{ a[i][j]=rand() % 100;
printf (“%d\t”, a[i][j]);
}
printf (“\n”);
}
imax=jmax=0; // начало поиска
for (i=0; i<n; i++)
for ( j=0; j<n; j++)
if (a[i][j]>a[imax][jmax])
{ imax=i; jmax=j; }
printf (“max=a[%d][%d]=%d\n”, imax, jmax, a[imax][jmax]);
getch();
}
3. Дан двумерный массив различных вещественных чисел, содержащий 5 строк и 4 столбца. Строку, содержащую максимальный элемент массива, поменять местами со строкой, содержащей минимальный элемент:
#include <stdio.h>
void main()
{ float m1[5][4], max, min, m2[4];
int maxi, mini, i, j;
puts("Введите исходный массив: \n");
for(i=0;i<5;i++)
for(j=0;j<4;j++)
scanf("%f", &m1[i][j]);
max=m1[0][0];
min=m1[0][0];
for(i=0;i<5;i++)
for(j=0;j<4;j++)
if(max<=m1[i][j])
{max=m1[i][j];
maxi=i;}
for(i=0;i<5;i++)
for(j=0;j<4;j++)
if(min>=m1[i][j])
{min=m1[i][j];
mini=i;}
for(j=0;j<4;j++)
m2[j]=m1[maxi][j];
for(j=0;j<4;j++)
m1[maxi][j]=m1[mini][j];
for(j=0;j<4;j++)
m1[mini][j]=m2[j];
puts("Массив после перестановки строк:\n");
for(i=0;i<5;i++)
{for(j=0;j<4;j++)
printf("%f ", m1[i][j]);
printf("\n");}
}
Порядок выполнения работы
1. Изучить теоретические сведения.
2. Ответить на контрольные вопросы.
3. Выполнить задание.
Контрольные вопросы
1. Что такое двумерный массив?
2. Сколько индексов требуется для обращения к элементу двумерного массива и что определяет каждый из индексов?
3.Как хранятся в памяти ЭВМ двумерные массивы?
4.Какими способами может быть описан двумерный массив?
5.Как производится ввод элементов двумерного массива?
6.Как производится вывод элементов двумерного массива?
Задания для выполнения
Часть 1.
1. Ввести двумерный массив размером m на n. Вычислить среднее арифметическое значение элементов массива, имеющих четные отрицательные значения,или вывести сообщение об отсутствии в массиве таких значений.
2. Ввести двумерный массив размером m на n. Вычислить произведение и количество элементов, находящихся в интервале от AдоB,или вывести сообщение об отсутствии в массиве таких значений.
3. Ввести двумерный массив размером m на n. Вычислить среднее арифметическое значение элементов, являющихся нечётными числами, или вывести сообщение «Таких значений нет».
4. Ввести двумерный массив размером m на n. Вычислить произведение и количество элементов, кратных 3 и некратных 5, или вывести сообщение «Таких значений нет».
5. Ввести двумерный массив размером m на n. Найти и вывести те элементы, которые при делении на 7 дают остаток 2 или 5, или вывести сообщение «Таких значений нет».
6. Ввести двумерный массив размером m на n. Найти количество и сумму тех элементов, которые делятся на 5 и не делятся на 7, или вывести сообщение «Таких значений нет».
7. Ввести двумерный массив размером m на n. Вычислить произведение элементов, кратных заданному числу k(ввести с клавиатуры), или вывести сообщение «Таких значений нет».
8. Ввести двумерный массив размером m на n. Получить сумму и количество элементов, принадлежащих отрезку [3,17], или вывести сообщение «Таких значений нет».
9. Ввести двумерный массив размером m на n. Найти и вывести минимальное из А0, А2, А4, … и максимальное из А1, А3, А5, …
10. Ввести двумерный массив размером m на n. Получить сумму тех членов массива, которые нечётны и положительны, или вывести сообщение «Таких значений нет».
11. Ввести двумерный массив размером m на n. Вычислить среднее арифметическое значение элементов, кратных сумме их индексов (i+j), или вывести сообщение «Таких значений нет».
12. Ввести двумерный массив размером m на n. Вывести те значения, которые заканчиваются заданной цифрой (ввести с клавиатуры), или вывести сообщение «Таких значений нет».
13. Ввести двумерный массив размером m на n. Найти сумму тех из них, которые являются квадратами некоторого заданного числа k, или вывести сообщение «Таких значений нет».
14. Ввести двумерный массив размером m на n и некоторое число P. Вывести номера тех элементов, модуль значений которых больше этого числа, или вывести сообщение «Таких значений нет».
15. Ввести двумерный массив размером m на n, в котором есть по крайней мере два отрицательных числа. Вычислить произведение и количество элементов, находящихся между первым и последним отрицательным значениями.
Часть 2.
Написать программу по обработке двумерного массива.
1. Определить количество строк, не содержащих ни одного нулевого элемента.
2. Определить количество столбцов, не содержащих ни одного нулевого элемента.
3. Определить количество столбцов, содержащих хотя бы один нулевой элемент.
4. Определить произведение элементов в тех строках, которые не содержат отрицательных элементов.
5. Определить сумму элементов в тех столбцах, которые не содержат отрицательных элементов.
6. Определить сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент.
7. Найти сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент.
8. Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент.
9. Найти сумму модулей элементов, расположенных ниже главной диагонали.
10. Найти сумму модулей элементов, расположенных выше главной диагонали.
11. Найти количество строк, среднее арифметическое элементов которых меньше введенной с клавиатуры величины.
12. Найти номер первой из строк, содержащих хотя бы один положительный элемент.
13. Определить номер первого из столбцов, содержащих хотя бы один нулевой элемент.
14. Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента.
15. Найти номер первой из строк, не содержащих ни одного положительного элемента.
ЛАБОРАТОРНАЯ РАБОТА № 15