Опубликован: 14.12.2010 | Доступ: свободный | Студентов: 3137 / 738 | Оценка: 4.53 / 4.12 | Длительность: 26:28:00
Лекция 9:

Указатели и массивы в языке С

< Лекция 8 || Лекция 9: 1234 || Лекция 10 >

Задание 3

  1. Проверьте программу при размерности матрицы от 3 до 19 и более.
  2. Выведите на дисплей матрицу M[n][n]. Объясните результат.
  3. Дополните программу: создайте матрицу и заполните ее по спирали натуральными числами с помощью массива указателей, который использовался для взятия адресов элементов исходной матрицы М[n][n]. Объявите матрицу с начальной буквой вашей фамилии (с латинским написанием). Выведите на дисплей матрицу.
  4. Напишите программу заполнения матрицы по спирали и против часовой стрелки натуральными числами с помощью массива указателей.
  5. Дополните программу расчетом количества четных элементов выше главной диагонали матрицы и количества нечетных элементов ниже главной диагонали, не включая саму диагональ, с помощью указателей.
  6. Дополните программу подсчетом суммы элементов каждого столбца матрицы. Осуществите вывод результата на дисплей.
  7. Дополните программу подсчетом суммы элементов каждой строки матрицы. Осуществите вывод результата на дисплей.
  8. Дополните программу подсчетом суммы элементов диагонали матрицы. Осуществите вывод результата на дисплей.

Примечание. Сумма диагональных элементов квадратной матрицы называется следом (шпуром) матрицы.

Пример 4. Напишите программу заполнения целочисленной прямоугольной матрицы размером не более 15 \times 14 из интервала [–12; 12] с помощью операции разыменования.

Программный код решения примера:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

#define N 15
#define M 14
const int Left = -12;
const int Right = 12;

int main(void) {
int i, j, n, m;
int matr[N][M];
time_t t; //переменная системного времени

srand((unsigned)time(&t));

printf("\n Enter the number of lines of the matrix is not more than %d: ", N);
scanf_s("%d", &n);
printf(" Enter the number of columns of the matrix is not more than %d: ", M);
scanf_s("%d", &m);

// Контроль ввода допустимой размерности
if (n > N || m > M || n < 1 || m < 1)
{ printf("\n\t Data error! Repeat please.\n");
printf("\n Press any key: ");
_getch(); return 0; }

for (i = 0; i < n; ++i)
for (j = 0; j < m; ++j)
*(*(matr + i) + j) = 0;

for (i = 0; i < n; ++i)
for (j = 0; j < m; ++j)
*(*(matr + i) + j) = (rand() % (2*Right+1)) + Left;

printf("\n The matrix of random whole numbers from the entire [%d, %d]:\n", Left, Right);

for (i = 0; i < n; ++i) {
printf("\n ");
   for (j = 0; j < m; ++j)
printf("%5d", *(*(matr + i) + j));
}
  printf("\n\n Press any key: ");
     _getch();
     return 0; 
}

В программе использованы спецификаторы const для объявления неизменяемых переменных. Функция srand() устанавливает начальное значение программного генератора псевдослучайных чисел, т.е. осуществляет рандомизацию последовательности псевдослучайных чисел. С этой целью определена системная переменная time(&t), которая практически всегда различна.

Возможный результат выполнения программы показан на рис. 8.4.

Матрица случайных целых чисел

Рис. 8.4. Матрица случайных целых чисел

Задание 4

  1. Проверьте режим ошибочного ввода размерности матрицы.
  2. Осуществите перевод значений сформированной матрицы n \times m на новую строку на основе оператора условия ?.
  3. Подсчитайте количество отрицательных и положительных чисел. Учтите также подсчет количества нулей.
  4. Предусмотрите изменение интервала последовательности случайных чисел, генерируемой функцией rand(), для чего предусмотрите ввод границ интервала с клавиатуры.
  5. В сформированной матрице найдите минимальные и максимальные числа с определением их индексов расположения в матрице.

Пример 5. Напишите программу умножения целочисленных матриц с использованием указателей [8.5].

Условием перемножения двух матриц А и В является равенство числа столбцов матрицы А и числа строк матрицы В. Если первая матрица А имеет размер n \times k, то вторая матрица В должна иметь размер k \times m. В результате перемножения получим матрицу С размера n \times m. Приведем следующую схему по размерностям:


Поэлементное перемножение двух матриц в стандартной математической форме:

C_{i j}=\sum^{n}_{k=1}a_{jk}*b_{kj},  i=1,2\cdots,n, j =1,2,\cdots,m.

С учетом синтаксиса формирования массивов в языке С индексация должна начинаться с нуля, поэтому формулу перепишем в следующем виде:

C_{i j}=\sum^{n-1}_{k=0}a_{jk}*b_{kj},  i=0,1,2\cdots,n-1, j =0,1,2,\cdots,m-1.

Программный код решения примера:

#include <stdio.h>
#include <conio.h>
#define n 7
#define k 12
#define m 4

int main(void) {
int i, j, p;
int A[n*k], B[k*m];
long int *C[n*m];

//Обнуление матриц
for (i = 0; i < n; ++i)
for(j = 0; j < m; ++j)
C[i*m + j] = 0;

for (i = 0; i < n; ++i)
for (j = 0; j < k; ++j)
A[i*k + j] = 0; 

for (i = 0; i < k; ++i)
for (j = 0; j < m; ++j)
B[i*m + j] = 0; 

// Заполнение матриц целыми числами
for (i = 0; i < n; ++i)
for (j = 0; j < k; ++j)
A[i*k + j] = i + j - 6;

for (i = 0; i < k; ++i)
for (j = 0; j < m; ++j)
B[i*m + j] =  i + j - 11;

// Циклы перемножения с накоплением суммы
for (i = 0; i < n; ++i)
for (j = 0; j < m; ++j) { C[i*m + j] = 0;
for (p = 0; p < k; ++p)
C[i*m + j] += (A[i*k + p] * B[p*m + j]);
}
printf("\n\t The result of multiplying the two matrices:\n\t\t C = A*B (%dx%d = %dx%d * %dx%d)\n", n, m, n, k, k, m);
for (i = 0; i < n; ++i) {
printf("\n\t");
for (j = 0; j < m; ++j)
printf("%6ld", C[i*m + j]); } 
     printf("\n\n Press any key: ");
     _getch();
     return 0; }

Обнуление матриц и массива указателей позволяет заранее выделить память. Для вывода результата перемножения предусмотрен спецификатор ld.

Результат выполнения программы показан на рис. 8.5.

Матрица случайных целых чисел

Рис. 8.5. Матрица случайных целых чисел
< Лекция 8 || Лекция 9: 1234 || Лекция 10 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов