Начальные значения элементов

При объявлении можно сразу задать все или часть ее элементов, например так

float X[2][3] = {{1., 2., 3.},{4., 5., 6.}};

Как видно из примера, элементы каждой строки заключаются в отдельные фигурные скобки.Если задать не все элементы, то остальные заполнятся нулями:

float X[2][3] = {{1., 3.},{6.}};

Здесь элементы X[1][2], X[2][1] и X[2][2] будут нулевыми.

Расположение матриц в памяти

Иногда бывает полезно знать, как матрицы располагаются в памяти ЭВМ. Оказывается во

всех современных языках программирования (кроме Фортрана) элементы матрицы располагаются по строкам, то есть сначала изменяется последний индекс. Объявленная выше матрица

X расположена так:

X[0][0] X[0][1] X[0][2] X[1][0] X[1][1] X[1][2]

Стандартный ввод и вывод

Как и для одномерных массивов, матрицы могут быть введены с клавиатуры, из файла, и

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

Ввод с клавиатуры

Единственная проблема состоит в том, чтобы не перепутать переменные в двух циклах и

пределы их изменения.

#include<stdio.h>

const int M = 5; // числострок

const int N = 4; // числостолбцов

Main()

{

int i, j, A[M][N];

for (i = 0; i < M; i ++) // циклпострокам

for (j = 0; j < N; j ++) // цикл по столбцам строки

{

printf ("A[%d][%d]=", i, j); // подсказка для ввода

scanf ("%d", & A[i][j]); // ввод A[i][j]

}

// работа с матрицей

}

Заметьте, что при изменении порядка циклов (если поменять местами два оператора for) изменится и порядок ввода элементов в память.

Заполнение случайными числами

Выполняется также в двойном цикле аналогично одномерным массивам. В примере пока-

зано заполнение целой матрицы случайными числами в интервале [a,b] (для вещественных чисел формула изменится – см. одномерные массивы). Функция

int random (int N) { return rand() % N; }

возвращающая случайное целое число в интервале [0,N-1], была рассмотрена выше, когда

мы говорили о массивах (ее нужно добавить в программу).В этой и следующей программах мы будем считать, что объявлена целая матрица M на N,

где M и N — целые константы (объявленные через const), а также целые переменные i и j.

for (i = 0; i < M; i ++)

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

A[i][j] = random(b-a+1) + a;

Вывод на экран

При выводе матрицы ее элементы желательно расположить в привычном виде – по стро-

кам. Напрашивается такой прием: вывели одну строку матрицы, перешли на новую строку экрана, и т.д. Надо учитывать, что для красивого вывода на каждый элемент матрицы надо отвести равное количество символов (иначе столбцы будут неровные). Делается это с помощью форматирования – цифра после знака процента задает количество символов, отводимое на данное число.

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

for (i = 0; i < M; i ++) { // циклпострокам

for (j = 0; j < N; j ++) // вывод одной строки (в цикле)

printf ("%4d", A[i][j]); // 4 символа на число

printf("\n"); // переход на другую строку

}

Работа с файлами

􀀗 Текстовые файлы

При вводе из текстового файла надо читать последовательно все элементы, обрабатывая

(так же, как и для линейных массивов) ошибки отсутствия или недостатка данных в файле.

#include <stdio.h>

const int M = 5; // числострок

const int N = 4; // числостолбцов

Main()

{

int i, j, A[M][N];

FILE *fp;

fp = fopen("input.dat", "r");

for (i = 0; i < M; i ++) // циклпострокам

for (j = 0; j < N; j ++) // цикл по столбцам

if (0 == fscanf(fp,"%d",&A[i][j])) // ввод A[i][j]

{

puts("Не хватает данных");


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: