Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема6_Массивы.doc
Скачиваний:
2
Добавлен:
07.09.2019
Размер:
155.65 Кб
Скачать

Особенности обработки матриц

При обработке матриц нужно учитывать ряд особенностей, некоторые из которых мы рассмотрим на примерах. Рассмотрим задачу вывода элементов, расположенных на главной диагонали. Главная диагональ матрицы определяется тем, что на ней находятся элементы, оба индекса которых одинаковы: A1,1, A2,2, A3,3 и т.д. Способ, который может показаться наиболее очевидным – это проверить индексы массива на равенство:

for (int i=0; i<n; i++) {

for (int j=0; j<n; j++) {

if (i==j) {

printf("%d ", matrix[i][j]);

}

}

printf("\n");

}

Однако почему бы не использовать это условие по-другому. Мы можем избавиться от одного цикла, взяв одинаковые индексы:

for (int i=0; i<n; i++) {

printf("%5d\n", numbers[i][i]);

}

Такое усовершенствование не повлияет на результат, но сокращает объем программного кода и улучшает производительность.

Рассмотрим еще один пример, в котором методы работы с одномерным массивом распространяются на двумерный. Пусть требуется определить столбец матрицы, сумма элементов в котором максимальная среди всех столбцов. Необходимо вычислить сумму у каждого столбца, а затем найти максимум. Причем, сделать это можно сразу, а не отдельно.

//Переменная, которая будет хранить

//индекс столбца с максимальной суммой

int max_index = 0;

//Переменная, которая будет хранить

//максимальную среди всех столбцов сумму

int max_sum = 0;

//Пробегаем по всем столбцам

for (int j=0; j<n; j++) {

//Вычисляем сумму в столбце с индексом j

int sum = 0;

for (int i=0; i<n; i++) {

sum += numbers[i][j];

}

//Если полученная сумма больше,

//то переприсваиваем

if (sum > max_sum) {

max_sum = sum;

max_index = j;

}

}

printf("Макс. сумма равна %d\n", max_sum);

printf("Столбец с индексом %d\n", max_index);

Обработка данных «на лету» Примеры решения задач

Задача 1. Написать программу, которая принимает с клавиатуры число N, задает массив из N случайных целых чисел и выводит его на экран. Затем необходимо вывести элементы этого массива, которые не принадлежат отрезку [5,15].

#include <stdio.h>

#include <stdlib.h>

int main() {

int N;

printf("Введите число N:\n");

scanf("%d", &N);

int numbers[100];

for (int i=0; i<N; i++) {

numbers[i] = rand()%50;

}

for (int i=0; i<N; i++) {

printf("%d ", numbers[i]);

}

printf("\nЭлементы из отрезка [5,15]:\n");

for (int i=0; i<N; i++) {

if (5<=numbers[i] && numbers[i]<=15) {

printf("%d ", numbers[i]);

}

}

printf("\n");

return 0;

}

Задача 2. Написать программу, которая принимает с клавиатуры число N, задает массив из N случайных целых чисел и выводит его. Затем необходимо подсчитать количество трехзначных элементов этого массива.

#include <stdio.h>

#include <stdlib.h>

int main() {

int N;

printf("Введите число N:\n");

scanf("%d", &N);

int numbers[100];

for (int i=0; i<N; i++) {

numbers[i] = rand()%2000;

}

for (int i=0; i<N; i++) {

printf("%d ", numbers[i]);

}

printf("\n");

int digits3 = 0;

for (int i=0; i<N; i++) {

if (100<=numbers[i] && numbers[i]<=999) {

digits3++;

}

}

printf("Число трехзначных чисел = %d\n",

digits3);

return 0;

}

Задача 4. Написать программу, которая принимает с клавиатуры число N, задает массив из N случайных целых чисел и выводит его. Затем необходимо отсортировать его методом прямого выбора по убыванию.

#include <stdio.h>

#include <stdlib.h>

int main() {

int N;

printf("Введите число N:\n");

scanf("%d", &N);

int numbers[100];

for (int i=0; i<N; i++) {

numbers[i] = rand()%100;

}

printf("\nИсходный массив:\n");

for (int i=0; i<N; i++) {

printf("%d ", numbers[i]);

}

for (int i=0; i<N-1; i++) {

int max_index = i;

for (int j=i+1; j<N; j++) {

if (numbers[max_index]<numbers[j]) {

max_index = j;

}

}

int temp = numbers[i];

numbers[i] = numbers[max_index];

numbers[max_index] = temp;

}

printf("\nОтсортированный массив:\n");

for (int i=0; i<N; i++) {

printf("%d ", numbers[i]);

}

return 0;

}

Задача 4. След матрицы – это сумма ее диагональных элементов. Написать программу, которая вычисляет след матрицы.

#include <stdio.h>

#include <stdlib.h>

int main() {

int N;

printf("Введите число N:\n");

scanf("%d", &N);

int numbers[100][100];

for (int i=0; i<N; i++) {

for (int j=0; j<N; j++) {

numbers[i][j] = rand()%10;

}

}

printf("\nМатрица:\n");

for (int i=0; i<N; i++) {

for (int j=0; j<N; j++) {

printf("%d ", numbers[i][j]);

}

printf("\n");

}

int trace = 0;

for (int i=0; i<N; i++) {

trace += numbers[i][i];

}

printf("След матрицы равен %d\n", trace);

return 0;

}

ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ

  1. Объясните своими словами, зачем нужны массивы.

  2. Опишите алгоритм поиска максимального (минимального) элемента в массиве.

  3. Объясните своими словами, зачем сортировать данные.

  4. Опишите алгоритм метода прямого выбора.

  5. Опишите алгоритм пузырьковой сортировки.

  6. Опишите алгоритм сортировки вставками.

  7. Описать алгоритм последовательного поиска.

  8. Опишите алгоритм двоичного поиска. Каким должен быть массив для его применения?

  9. Как вывести матрицу на экран, чтобы столбцы были ровными.

  10. Как вывести на экран диагональные элементы матрицы?

ТРЕНИРОВОЧНЫЕ ЗАДАНИЯ

  1. Заполнить массив случайными числами и вывести его.

  2. Вычислить сумму элементов массива.

  3. Подсчитать количество четных элементов в массиве.

  4. Заполнить матрицу случайными числами и вывести ее.

  5. Найти максимальный (минимальный) элемент массива.

  6. Заменить числом 10 все элементы массива большие 10.

  7. Отсортировать массив.

  8. Вывести элементы, которые расположены на главной и на побочной диагонали матрицы.

  9. Подсчитать количество столбцов матрицы, сумма элементов которых не превосходит число 100.

  10. Сложить две матрицы поэлементно.