Оптимизация / уменьшение For-циклов - PullRequest
2 голосов
/ 18 августа 2011

Я изучаю C и хочу получить представление о том, как я могу уменьшить цикл for, чтобы сделать его более презентабельным.

#include<stdio.h>

int main() {

char input[81];
int i;
char input2[9][9];
int col,row;
printf("Enter sudoku board:");
scanf("%s",&input);


for (i=0;i<9;i++) {
    for (col=0;col<9;col++) 
        input2[0][col]=input[i];
    for (col=0;col<9;col++) 
        input2[1][col]=input[i];
    for (col=0;col<9;col++) 
        input2[2][col]=input[i];
    for (col=0;col<9;col++) 
        input2[3][col]=input[i];
    for (col=0;col<9;col++) 
        input2[4][col]=input[i];
    for (col=0;col<9;col++) 
        input2[5][col]=input[i];
    for (col=0;col<9;col++) 
        input2[6][col]=input[i];
    for (col=0;col<9;col++) 
        input2[7][col]=input[i];
    for (col=0;col<9;col++) 
        input2[8][col]=input[i];
}

это показывает, что пользователь будет вводить 81 число вмассив затем введенные числа будут перенесены в массив 9x9.заранее спасибо! :) 1004 *

Ответы [ 4 ]

2 голосов
/ 18 августа 2011

Ваш код не выполняет то, что вы ожидаете.

Похоже, вы хотели что-то вроде:

for (row = 0; row < 9; ++row) {
    for (col = 0; col < 9; ++col) {
        input2[row][col] = input[(row * 9) + col];
    }
}

EDIT : Кстати, когда пользователь разрешает вводить строку, убедитесь, что в буфере достаточно места для хранения всей строки, а также завершающий символ '\0'! В вашем буфере input должно быть как минимум 82 char.

1 голос
/ 18 августа 2011

Поскольку вы хотите, чтобы пользователь мог вводить 81 цифр (в виде символов), размер массива char для их хранения должен быть 82 или более.

char input[82];

Также ваш scanfне должно иметь &:

scanf("%s",input);

Поскольку вы хотите преобразовать введенный пользователем одномерный массив в двумерный массив, вы можете сделать:

for (row=0;row<9;row++) {
   for (col=0;col<9;col++) 
      input2[row][col] = input[row*9+col];
0 голосов
/ 18 августа 2011

В качестве первого шага ниже должен работать код -

int i,j;
for(i=0;i<9;i++)
{
    for(j=0;j<9;j++)
    {
        input2[i][j]=input[i];

    }
}

РЕДАКТИРОВАТЬ : я дал решение сделать циклы for «более читабельными», чтобы выполнять любую функциональность, о которой упоминал OP.Не предлагали ничего, кроме этого, например, является ли его оригинальный код правильным или неправильным?

0 голосов
/ 18 августа 2011

Вам нужно заполнить матрицу 9 * 9, основанную на 81 количестве входов.Как уже упоминалось, вам нужно выделить еще один символ для окончания '\0'.Именно этим и славится массив в стиле C.

   int i = 0, row = 0, col = 0;
   // set matrix row by row
   for (row = 0; row < 9; row++)
   {
      // for each row, set from left to right
      for (col = 0; col < 9; col++) 
      {
        input2[row][col] = input[i++];   
      }
   }

Улучшение : вам не нужно предварительно выделять строку для хранения этих 81 символов.Вы можете напрямую установить желаемый результирующий массив.

       int i = 0, row = 0, col = 0;
       // set matrix row by row
       for (row = 0; row < 9; row++)
       {
          // for each row, set from left to right
          for (col = 0; col < 9; col++) 
          {
            scanf("%c", &input2[row][col]);
          }
       }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...