Руководство полного чайника по программированию на языке Си

       

ДВУМЕРНЫЕ МАССИВЫ


/* ДВУМЕРНЫЕ МАССИВЫ */

/* Двумерный массив представляет собой двумерную прямоугольную таблицу из нумерованных переменных.

Он объявляется так:

int array[LINES][COLUMNS];

А индексируется так:

array[y][x]

где 0 <= y <= LINES - 1 0 <= x <= COLUMNS - 1

+-------------+-------------+-------------+------> ось x | array[0][0] | array[0][1] | array[0][2] | ... +-------------+-------------+-------------+ | array[1][0] | array[1][1] | array[1][2] | ... +-------------+-------------+-------------+ | array[2][0] | array[2][1] | array[2][2] | ... +-------------+-------------+-------------+ | ... ... ... V ось y

Пока, на данной стадии знания Си, я рекомендую вам объявлять двумерные массивы как глобальные и не пытаться передавать их имена в функции как аргументы. */

/* Приведем пример, который заводит двумерный массив букв, рисует в нем некую геометрическую фигуру, и печатает этот массив.

Здесь мы приводим алгоритм Брезенхема для рисования прямых, объяснения КАК он это делает мы опустим. Пардон. */

#define LINES 31 /* число строк */ #define COLUMNS 79 /* число столбцов */

char field[LINES][COLUMNS];



/* В данной программе массив НЕ является параметром, мы работаем с ним как с глобальной переменной. Функция рисования прямой линии, алгоритм Брезенхема. */ void line(int x1, int y1, int x2, int y2, char sym){ int dx, dy, i1, i2, i, kx, ky; int d; /* "отклонение" */ int x, y; int flag;

dy = y2 - y1; dx = x2 - x1; if (dx == 0 && dy == 0){ field[y1][x1] = sym; /* единственная точка */ return; } kx = 1; /* шаг по x */ ky = 1; /* шаг по y */

/* Выбор тактовой оси */ if( dx < 0 ){ dx = -dx; kx = -1; } /* Y */ else if(dx == 0) kx = 0; /* X */

if(dy < 0) { dy = -dy; ky = -1; }

if(dx < dy){ flag = 0; d = dx; dx = dy; dy = d; } else flag = 1;

i1 = dy + dy; d = i1 - dx; i2 = d - dx; x = x1; y = y1;

for(i=0; i < dx; i++){ field[y][x] = sym; /* нарисовать точку */

if(flag) x += kx; /* шаг по такт. оси */ else y += ky;

if( d < 0 ) /* горизонтальный шаг */ d += i1; else{ /* диагональный шаг */ d += i2; if(flag) y += ky; /* прирост высоты */ else x += kx; } } field[y][x] = sym; /* последняя точка */ }

int main(){ int x, y;

/* Заполнить поле пробелами */ for(y=0; y < LINES; y++) for(x=0; x < COLUMNS; x++) field[y][x] = ' ';

/* Нарисовать картинку */ line(0,0, 0, LINES-1, '*'); line(0,0, COLUMNS-1, 0, '*'); line(COLUMNS-1, 0, COLUMNS-1, LINES-1, '*'); line(0, LINES-1, COLUMNS-1, LINES-1, '*');

line(0,0, COLUMNS-1, LINES-1, '\\'); line(COLUMNS-1,0, 0,LINES-1, '/');

/* Распечатать массив */ for(y=0; y < LINES; y++){ for(x=0; x < COLUMNS; x++) putchar(field[y][x]); putchar('\n'); } return 0; }

Last-modified: Mon, 31 Mar 1997 04:51:37 GMT



Содержание раздела