Как распечатать содержимое массива нелинейно (например, в ячейках 4x4) - PullRequest
1 голос
/ 08 апреля 2019

Я пытаюсь распечатать содержимое массива нелинейным способом ( не последовательно). Мой код в настоящее время считывает данные из текстового ввода, сохраняет данные текстового ввода в 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; 
}

РЕДАКТИРОВАТЬ: Я, к сожалению, забыл упомянуть ключевые спецификации; Я также хотел бы иметь возможность изменять размер ячейки от 4х4 до других размеров, например, 12х12.

Ответы [ 3 ]

1 голос
/ 08 апреля 2019

Если вы действительно хотите напечатать это, следующий код сделает это:

#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

1 голос
/ 08 апреля 2019

Возможное решение (только циклы печати):

     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");
    }
1 голос
/ 08 апреля 2019

Вы можете сделать, как показано ниже.

//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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...