Как распечатать содержимое массива нелинейно (например, в ячейках 4x4)

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
81
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

//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

Код должен быть прокомментирован или иным образом задокументирован и объяснен — хотя это элементарный код, человек, задающий вопрос, как правило, плохо знаком с концепциями и может получить пользу от объяснения.

Eric Postpischil 08.04.2019 15:20

спам @EricPostpischil ?

Guillaume D 09.04.2019 10:17

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

#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 отформатировать поле, состоящее не менее чем из двух символов, с начальным нулем, если это необходимо. Код должен быть прокомментирован или иным образом задокументирован и объяснен — хотя это элементарный код, человек, задающий вопрос, как правило, плохо знаком с концепциями и может получить пользу от объяснения.
Eric Postpischil 08.04.2019 15:16
Ответ принят как подходящий

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

     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");
    }

Код должен быть прокомментирован или иным образом задокументирован и объяснен — хотя это элементарный код, человек, задающий вопрос, как правило, плохо знаком с концепциями и может получить пользу от объяснения.

Eric Postpischil 08.04.2019 15:20

спам @EricPostpischil ?

Guillaume D 09.04.2019 10:17

Другие вопросы по теме