написать функцию для распечатки массива целых чисел
/* Задача: написать функцию для распечатки массива целых чисел в виде таблицы в 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; }