Я пытаюсь напечатать содержимое массива нелинейным способом (последовательно нет). Мой код в настоящее время считывает данные из текстового ввода, сохраняет текстовые входные данные в 2D-массив, а затем последовательно выполняет итерацию по 2D-массиву в ячейках 4x4 и печатает результат в cmd.
Входной файл-test_file.txt:
01 02 03 04 05 06 07 08 09 10 11 12
13 14 15 16 17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44 45 46 47 48
Текущий нежелательный результат:
001 002 003 004 013 014 015 016 025 026 027 028 037 038 039 040
005 006 007 008 017 018 019 020 029 030 031 032 041 042 043 044
009 010 011 012 021 022 023 024 033 034 035 036 045 046 047 048
Результат, которого я пытаюсь достичь:
01 02 03 04 05 06 07 08 09 10 11 12
13 14 15 16 17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44 45 46 47 48
Моя попытка кода:
#include <stdio.h>
int main()
{
int h = 4; //Height of dataset
int w = 12; //Width of dataset
int matrix[4][12]; //The 2d matrix where the data is stored
int i, j; //Loop variables
FILE *f;
f = fopen("test_file.txt", "r"); //Input file
if (f == NULL)
{
fprintf(stderr, "Error: cannot open file input", f);
exit(1);
}
//Iterate through the input file stream
for (i = 0; i < h; i++) {
for (j = 0; j < w; j++) {
fscanf(f, "%d", &matrix[i][j]);
}
}
//Iterate through the 2d array in 4x4 cells
for (int ii = 0; ii < h && ii < h; ii += 4)
{
for (int jj = 0; jj < w && jj < w; jj += 4)
{
for (int i = ii; i < ii + 4 && i < h; i++)
{
for (int j = jj; j < jj + 4 && j < w; j++)
{
printf("%.3d ", matrix[i][j]);
}
}
printf("\n");
}
}
fclose(f);
getchar();
return 0;
}
Обновлено: К сожалению, я забыл упомянуть ключевую спецификацию; Я также хотел бы иметь возможность изменять размер ячейки от 4x4 до других размеров, например, 12x12.
Вы можете сделать, как показано ниже.
//Iterate through the 2d array in 4x4 cells
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w ; j+=4)
{
for (int jj = 0; jj < h ; jj++)
{
printf("%.2d ", matrix[i][j+jj]);
}
printf(" ");
}
printf("\n");
}
или
//Iterate through the 2d array in 4x4 cells
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w ; j++)
{
printf("%.2d%s", matrix[i][j], ((j+1)%4 == 0)?" ":" ");
}
printf("\n");
}
Выход:
01 02 03 04 05 06 07 08 09 10 11 12
13 14 15 16 17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44 45 46 47 48
спам @EricPostpischil ?
Если вы действительно хотите просто Распечатать, то следующий код сделает это:
#include <stdio.h>
#define BLOCK 4
#define COLS 12
int main(int argc, char* argv[])
{
for(int i = 1; i <= 48; ++i) /* replace this loop with a loop over the actual data to print */
{
/* print mtx with columns and blocks
* insert a leading 0 with format %02i
* insert tab e.g. e.g. i == 4,8,12 etc.. for BLOCK=4, or a whitespace otherwise
* insert new line e.g. when i == 12, 24, etc... for COLS=12 */
printf("%02i%s%s", i, (i%BLOCK==0) ? "\t" : " ", (i%COLS==0) ? "\n" : "");
}
return 0;
}
http://coliru.stacked-crooked.com/a/1ca5b8796aea7224
#include <cstdio>
не является кодом C. Нет необходимости загромождать начальный 0; %02i
говорит printf
отформатировать поле, состоящее не менее чем из двух символов, с начальным нулем, если это необходимо. Код должен быть прокомментирован или иным образом задокументирован и объяснен — хотя это элементарный код, человек, задающий вопрос, как правило, плохо знаком с концепциями и может получить пользу от объяснения.
Возможное решение (только циклы печати):
for (i = 0; i < h; i++) {
for (j = 0; j < w; j++) {
printf("%.2d ", matrix[i][j]);
if ((j + 1) % 4 == 0) printf(" ");
}
printf("\n");
}
Код должен быть прокомментирован или иным образом задокументирован и объяснен — хотя это элементарный код, человек, задающий вопрос, как правило, плохо знаком с концепциями и может получить пользу от объяснения.
спам @EricPostpischil ?
Код должен быть прокомментирован или иным образом задокументирован и объяснен — хотя это элементарный код, человек, задающий вопрос, как правило, плохо знаком с концепциями и может получить пользу от объяснения.