2016-11-22 17 views
-1

私は、ユーザーが最初にマトリックスのサイズを入力し、次に各セルが占有されている(o)か占めていない(。)かを入力しようとしています。入れ子になったforループを使用して、セルごとではなく、占有/非占有の入力行全体をユーザーが入力するように、どのように記述しますか?C - マトリックスへのユーザー入力

UPDATE

アイテムは、1つずつ入力される例がある:

#include <stdio.h> 

#define MAX_SIZE 100 

int main(void) 
{ 
    char matrix[MAX_SIZE][MAX_SIZE] = { 0 }; 
    int rows = 0, cols = 0; 
    while (rows < 1 || rows > MAX_SIZE) 
    { 
     printf("What is the number of rows? "); 
     scanf("%d", &rows); 
    } 
    while (cols < 1 || cols > MAX_SIZE) 
    { 
     printf("What is the number of columns? "); 
     scanf("%d", &cols); 
    } 
    // fill the matrix 
    printf("Please, fill the matrix by entering o for occupied or . for unoccupied cell (E for exit)\n"); 
    int r, c, ch; 
    int fulfill = 1; 
    for (r = 0; r < rows && fulfill; r++) 
    { 
     for (c = 0; c < cols && fulfill; c++) 
     { 
      // clean the input bufer 
      while ((ch = getchar()) != '\n' && ch != EOF); 
      // read data 
      printf("cell [%d, %d] : ", r + 1, c + 1); // or just r, c if you prefer 0..(N-1) indexing 
      while (matrix[r][c] != 'o' && matrix[r][c] != '.' && matrix[r][c] != 'E') 
      { 
       scanf("%c", &matrix[r][c]); 
      } 
      if (matrix[r][c] == 'E') 
      { 
       fulfill = 0; 
      } 
     } 
    } 
    // output 
    printf("\nResult is:\n"); 
    for (r = 0; r < rows; r++) 
    { 
     for (c = 0; c < cols; c++) 
     { 
      printf("%c", matrix[r][c]); 
     } 
     printf("\n"); 
    } 
} 
+1

ようこそスタックオーバーフロー!これまでのところあなたの研究/デバッグの努力を示してください。まず[Ask]ページをお読みください。 –

答えて

1

次の例を考えてみます。ここ

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    char** matrix; // now it is a pointer and memory will be allocated after getting values of rows and columns 
    int rows = 0, cols = 0; 
    while (rows < 1) 
    { 
     printf("What is the number of rows (should be >= 1)? "); 
     scanf("%d", &rows); 
    } 
    while (cols < 1) 
    { 
     printf("What is the number of columns (should be >= 1)? "); 
     scanf("%d", &cols); 
    } 
    // part 1 for memory allocation 
    matrix = (char**)malloc(sizeof(char*) * rows); 
    // fill the matrix 
    printf("Please, fill the matrix by entering o for occupied or . for unoccupied cell (other chars will be ignored)\n"); 
    int r, c, ch; 
    for (r = 0; r < rows; r++) 
    { 
     // part 2 for memory allocation - memory for each row 
     matrix[r] = (char*)malloc(sizeof(char) * cols); 
     for (c = 0; c < cols; c++) 
     { 
      // read while apropriate character was found 
      while ((ch = getchar()) != 'o' && ch != '.'); 
      // save character to matrix 
      matrix[r][c] = ch; 
     } 
    } 
    // output 
    printf("\nResult is:\n"); 
    for (r = 0; r < rows; r++) 
    { 
     for (c = 0; c < cols; c++) 
     { 
      printf("%c", matrix[r][c]); 
     } 
     printf("\n"); 
    } 
    // free the memory 
    for (r = 0; r < rows; r++) 
    { 
     free(matrix[r]); 
    } 
    free(matrix); 
} 

データは(ヒープに格納されます。動的メモリ、malloc、または他の同様の機能によって割り当てる)と同じネストされたループの使用にもかかわらず、i違う。

What is the number of rows (should be >= 1)? 3 
What is the number of columns (should be >= 1)? 3 
Please, fill the matrix by entering o for occupied or . for unoccupied cell (other chars will be ignored) 
o.o 
.o. 
o.o 

Result is: 
o.o 
.o. 
o.o 

ユーザーは、新しい行を開始するにはEnterキーを使用して行ごとを入力するか、単に(充填は、いかなる場合で行単位になります)すべてのセルのいずれかによってo.いずれかを入力することができます:それはどのように動作するか、参照してください。 。不必要な要素と不適切な文字(oおよび.と異なる)は無視されます。例:

What is the number of rows (should be >= 1)? 4 
What is the number of columns (should be >= 1)? 5 
Please, fill the matrix by entering o for occupied or . for unoccupied cell (other chars will be ignored) 
ooZooCooXooOoo 
...... 
........XXX 

Result is: 
ooooo 
ooooo 
..... 
..... 
+0

こんにちは、静的割り当ても実行可能なオプションですか?また、私のコードは、ユーザーが正しい入力(量と正しい文字)を入力することを前提としています。私はCの初心者であり、コードを単純化できるかどうか疑問に思っていました。 – Zhasan

+0

配列に静的な質問を追加しました。同じアプローチを使用することができます。ご質問がある場合は、コードを記入してから新しい投稿をお願いします – VolAnd

+0

ユーザーが常に正しい場合でも、一部の文字(たとえば\ n)をスキップする必要があります。コードの最小化に注意してください。そして、この答えが役に立つなら、それを受け入れてください – VolAnd

関連する問題