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

       

написать функцию для распечатки массива целых чисел


/* Задача: написать функцию для распечатки массива целых чисел в виде таблицы в columns столбцов. При этом порядок элементов должен быть таков:

0 4 8 1 5 9 2 6 10 3 7 */

/* Пусть в массиве n элементов. Если n < columns, то мы получаем такую ситуацию (n=2, columns=4)

0 1 пусто пусто

Поэтому

if(n < columns) columns = n;

Далее, прямоугольная таблица с columns столбцами и lines строками может содержать максимум columns*lines элементов. Поэтому:

columns*lines >= n

Вычислим число строк. Нам нужно минимальное целое число строк, такое что

lines >= n/columns

Такое число вычисляется по формуле

lines = (n + (columns - 1)) / columns;

где деление целочисленное.



Далее надо только вывести формулу для индекса элемента в массиве в зависимости от номера строки (y) и столбца (x).

index(x, y) = (x * lines + y); причем если index >= n, то ничего не выводить */

#include

int array[100];

void printArray(int a[], int n, int columns){ int lines; /* число строк */

int x, y; /* номер колонки, номер строки - с нуля */ int index; /* индекс элемента в массиве */

if(n < columns) columns = n; lines = (n + (columns-1)) / columns;

/* Используем вложенные циклы: по строкам, а внутри - по столбцам */ for(y=0; y < lines; y++){ for(x=0; x < columns; x++){ index = x * lines + y; if(index >= n) /* элемент за концом массива */ break; /* прервать строку */

/* break выводит только из внутреннего цикла (по столбцам) */

/* сделать отступ в следующую колонку */ if(x != 0) putchar('\t');

printf("%02d|%d", index, a[index]); /* Формат %02d заставляет печатать целое число с использованием ДВУХ цифр, причем если число состоит из одной цифры, то спереди приписывается нуль. */ } putchar('\n'); /* перейти к следующей строке */ } } void main(){ int i, cols;

/* Инициализация значений элементов массива */ for(i=0; i < 100; i++) array[i] = i + 1;

for(cols=4; cols <= 13; cols++){ printf("\t\t* * * ТАБЛИЦА В %d СТОЛБЦОВ * * *\n", cols); printArray(array, 77, cols); putchar('\n'); } }


#include
main(){ int x, y; int COLUMNS = 11; int LINES = 10;
int value;
/* цикл по строкам */ for(y=0; y < LINES; y++){
/* цикл по столбцам */ for(x=0; x < COLUMNS; x++){
/* что напечатать */ value = LINES * x + y;
/* если это не нулевой столбец, то перейти в следующую колонку */
if(x > 0) putchar('\t');
/* ... и в ней напечатать значение */ printf("%d", value);
} putchar('\n'); /* новая строка */ } }


/* elem(x, y) = LINES * x + y;
тогда
elem(0, y+1) - elem(COLUMNS-1, y) = 1 + LINES - COLUMNS*LINES; elem(x+1, y) - elem(x, y) = LINES; */
#include
int A = 150; /* Количество элементов */ int COLUMNS = 7; /* Количество столбцов */ int LINES; /* Количество строк */ int value; /* Значение в текущей клетке */
int OFFSET_NEXT_COLUMN; int OFFSET_NEXT_LINE;
/* Рисуем строку таблицы */ void line(){ int col; /* номер колонки */
for(col=0; col < COLUMNS; col++){ if(value >= A) /* отсутствующий элемент */ printf("* "); else printf("%03d ", value);
/* Увеличение при переходе в соседнюю колонку */ value += OFFSET_NEXT_COLUMN; /* 1 */ } /* Перейти к следующей строке */ putchar('\n');
/* Увеличение при переходе из конца одной строки к началу следующей. Заметим, что к value уже прибавлено OFFSET_NEXT_COLUMN из точки 1, поэтому при переходе в начало следующей строки в сумме прибавляется OFFSET_NEXT_COLUMN + OFFSET_NEXT_LINE равное 1 - LINES*COLUMNS + LINES, что соответствует формуле. */ value += OFFSET_NEXT_LINE; /* 2 */ }
int main(){ int nline; /* Номер строки */
LINES = (A + (COLUMNS - 1)) / COLUMNS;
OFFSET_NEXT_COLUMN = LINES; OFFSET_NEXT_LINE = 1 - LINES*COLUMNS;
for(nline=0; nline < LINES; nline++) line();
/* возврат 0 из main() означает "программа завершена успешно" */ return 0; }

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