ДВУМЕРНЫЕ МАССИВЫ
/* ДВУМЕРНЫЕ МАССИВЫ */
/* Двумерный массив представляет собой двумерную прямоугольную таблицу из нумерованных переменных.
Он объявляется так:
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