2017-07-22 7 views
-2

J'essaie de travailler sur un programme où l'utilisateur entre une matrice de taille n x n où n est 10 ou moins, et le programme doit le faire pivoter de 90, 180, 270 degrés etc. L'utilisateur va d'abord entrer quelle sera la taille de la matrice ("entrez n:"), puis remplira la matrice en entrant plusieurs nombres à la fois séparés par des espaces. Donc le programme dira "entrez la ligne 0 de la matrice:" et l'utilisateur tapera "1 2 3", "entrez la ligne 1 de la matrice:" etc.Comment scanner un nombre inconnu d'entiers séparés par des espaces dans C?

Mes questions sont, comment puis-je écrire un programme où je analyser des entiers dans un tableau multidimensionnel n x n lorsque je ne saurais pas quelle taille n va être jusqu'à ce que l'utilisateur entre. Je sais que scanf("%d %d %d", matrix[0][0], matrix [0][1], matrix[0][2]); peut être utilisé pour la première ligne si je sais à l'avance que ça va être une matrice 3 par 3 ou scanf("%d %d %d %d", matrix[0][0], matrix [0][1], matrix[0][2], matrix[0][3]); pour une matrice 4 par 4, mais dans ce cas je ne connaîtrais pas n après que le code soit écrit et l'utilisateur l'entre. Tout ce que je peux penser en ce moment est:

printf("Enter n: "); 
scanf("%d", &n); 

if (n == 3){ 
    printf("Enter row 0 of matrix:); 
    scanf("%d %d %d", matrix[0][0], matrix [0][1], matrix[0][2]); 
    printf("Enter row 1 of matrix:); 
    scanf("%d %d %d", matrix[1][0], matrix [1][1], matrix[1][2]); 
    printf("Enter row 2 of matrix:); 
    scanf("%d %d %d", matrix[2][0], matrix [2][1], matrix[2][2]); 
    // code to rotate 3x3 matrix 
} 
else if (n == 4){ 
    printf("Enter row 0 of matrix:); 
    scanf("%d %d %d", matrix[0][0], matrix [0][1], matrix[0][2], matrix[0][3]); 
    printf("Enter row 1 of matrix:); 
    scanf("%d %d %d", matrix[1][0], matrix [1][1], matrix[1][2], matrix[1][3]); 
    printf("Enter row 2 of matrix:); 
    scanf("%d %d %d", matrix[2][0], matrix [2][1], matrix[2][2], matrix[2][3]); 
    printf("Enter row 3 of matrix:); 
    scanf("%d %d %d", matrix[3][0], matrix [3][1], matrix[3][2], matrix[3][3]); 
    // code to rotate 4x4 matrix 
} 
else if (n == 5) { 
// and so on... 
} 

Cependant, je sais que cela va prendre trop de temps. Y a-t-il quelqu'un qui peut aider? Merci!

+4

Veuillez lire à propos des boucles 'for' - couvertes au chapitre 1 de tout livre de programmation en C –

+0

Je me suis dit que je devrais utiliser une boucle for, mais comment numériser en plusieurs numéros sur une ligne sans savoir combien de nombres w être inscrit à l'avance? – John

+0

Appels répétés à 'scanf' - ie' scanf ("% d", ....) ' –

Répondre

0

Tout d'abord, si vous devez utiliser stdin, puis mettre en place un fichier, appelez-le inputfile.txt et évoquer le programme via

./myprogram < inputfile.txt

autrement entrer dans une matrice entière devient trop lourd.

Effectuez la première ligne n, c'est-à-dire n lignes. Ensuite, une boucle sur n, et de lire les lignes, comme celui-

int i; 
int n; 
char buff[1024]; 
scanf("%d", &n); 

for(i=0;i<n;i++) 
{ 
    fgets(buff, 1024, stdin); 
    /* now process here */ 
} 

Procédé via les lignes strtok() et strtol() (en supposant que les entrées de nombre entier).

Maintenant, comment stockez-vous la matrice? Le plus simple est d'oublier tout ce qui concerne les tableaux 2D et de les aplatir simplement. Donc, en supposant des matrices carrées, vous allouez comme ça

int *mtx = malloc(n * n * sizeof(int)); 

Ensuite, vous accédez comme celui-ci (i et j sont les variables d'index)

mtx[i*n+j] = x; 
2

Donc ce serait quelque chose comme:

for (int i=0; i<n; i++) { 
    printf ("Enter data for row %d:\n",i+1); 
    for (int j=0; j<n; j++) 
     scanf("%d ",&matrix[i][j]); 
} 
+1

Peut-être une vérification de la valeur de retour de' scanf'? –

+1

@Ed, je préfère démontrer la simplicité des boucles plutôt que l'idiot-proofness d'une solution complète, mais oui, vous avez raison. –