double arrow

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


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

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("Не хватает данных");


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