Pense aussi à vérifier que le fichier s'est bien ouvert, que scanf a bien fait son travail.
Pense aussi à vérifier que le fichier s'est bien ouvert, que scanf a bien fait son travail.
Bonjour,
J'ai un problème au niveau de l'affiche car il m'affiche trop de ligne ( il ne s'arrête pas a 9 ).Peut être que j'ai mal définie mon tableau a 2 dimensions
Voici le code :
Merci de votre aide car je suis dessus depuis tous se week end
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
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 #include<stdio.h> #include <stdlib.h> #include <string.h> typedef int tableau [9][9]; void lire_fichier( char *nf, tableau t1) //Procedure Lecture de du fichier { int ligne=0,col=0; FILE*f; f = fopen(nf,"r"); for (ligne=0; ligne<9; ligne++) { for (col=0; col<9; col++) { fscanf( f, "%d",&t1[ligne][col]); } } fclose(f); } void afficher(tableau t1) //Procedure Aficher { int ligne,col=0; for (ligne=0; ligne<9; ligne++) { for (col=0; col<9; col++) { printf("%09d\n",t1[ligne][col]); } } } main() { tableau t1; lire_fichier("vide1.dat",t1); afficher(t1); }
Tu lui demandes de sauter une ligne après chaque chiffre, il faut placer le '\n' à un autre endroit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 void afficher(tableau t1) { int ligne,col=0; for (ligne=0; ligne<9; ligne++) { for (col=0; col<9; col++) { printf("%01d ",t1[ligne][col]); } printf("\n"); } }
Oui, en effet.
Mais j'ai l'impression qu'il ne s'arrête pas a 9 lignes, il m'affiche encore plein de lignes après ma grille.
Je pense avoir aussi un problème pour ranger les valeur du fichier dans le tableaux a 2 dimensions.
Car je fais un printf("%d",t[3][2]) il dois me montré le chiffre de la ligne 3 au deuxième rang, or ici li m'affiche une suite de 7 chiffres.
Dans je pense qu'il dois aussi avoir un problème dans la procédure lire_fichier
Comme dit plus tôt, il faut vérifier que le scanf a bien fonctionné --> http://man.developpez.com/man3/scanf.3.php.
Il n'y a pas d'erreur de base dans lire_fichier(). Peut-être que l'erreur est dans ce qu'il y a dans le fichier lui-même.
Pour te prémunire contre cette éventualité (ou plutôt détecter de telles erreurs), suit les conseils de mabu.
merci pour vos réponse.
J'ai bien lu le liens que m'a envoyer mabu, mais je ne vois pas comment faire pour vérifier la fonction scanf, je n'est jamais vu sa en cours...
Envoyé par man scanf
Bonjour,
Désolé, mais je ne vois pas comment entre le code pour vérifier les valeur du fichier
Il faut vérifier que la valeur retournée par scanf correspond au nombre de conversions demandées, 1 ici.
EDIT:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 void lire_fichier( char *nf, tableau t1) { int ligne=0,col=0; FILE*f; f = fopen(nf,"r"); for (ligne=0; ligne<9; ligne++) { for (col=0; col<9; col++) { if(1 != fscanf( f, "%d",&t1[ligne][col])) { /* la conversion a échoué */ printf("impossible de lire %d:%d, on met 0 à la place.\n", ligne, col); t1[ligne][col] = 0; } } } fclose(f); }
Peux tu poster la dernière version de ton code et un exemple de grille qui pose problème ?
Voici le dernier code :
Un exemple de grille ( contenu dans le fichier vide1.dat)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
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 #include<stdio.h> #include <stdlib.h> #include <string.h> typedef int tableau [9][9]; void lire_fichier( char *nf, tableau t1) //Procedure Lecture de du fichier { int ligne=0,col=0; FILE*f; f = fopen(nf,"r"); for (ligne=0; ligne<9; ligne++) { for (col=0; col<9; col++) { fscanf( f, "%d",&t1[ligne][col]); } } fclose(f); } void afficher(tableau t1) //Procedure Aficher { int ligne,col=0; for (ligne=0; ligne<9; ligne++) { for (col=0; col<9; col++) { printf("%09d \n",t1[ligne][col]); } printf("\n"); } } main() { tableau t1; lire_fichier("vide1.dat",t1); afficher(t1); system("pause"); }
670900530
000400800
208030910
805740000
007109400
000083602
052010708
004007000
036004051
Alors, en effet, la lecture pose problème.
Pourquoi ?
Parce que dans la grille que tu donnes à ton programme, les chiffres sont collés. Il faut donc, soit les séparer, soit indiquer à scanf comment les lire :
Et pour l'affichage, le "%09d" ne se justifie plus, puisque tu affiches les éléments 1 à 1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 void lire_fichier(char *nf, tableau t1) { int ligne = 0, col = 0; FILE *f; f = fopen(nf, "r"); for (ligne = 0; ligne < 9; ligne++) { for (col = 0; col < 9; col++) { fscanf(f, "%1d", &t1[ligne][col]); } } fclose(f); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 void afficher(tableau t1) { int ligne, col = 0; for (ligne = 0; ligne < 9; ligne++) { for (col = 0; col < 9; col++) { printf("%d ", t1[ligne][col]); } printf("\n"); } }
Enfin, sa marche. Juste une petite erreur comme celle-ci...
Merci
Maintenant je vais essayer de faire la mise en forme du sudoku, si j'ai des probleme je reviendrais posté ici.
Bonjour
Donc pour la partie d'ouvrir et afficher la grille je n'est plus de probleme.
Par contre j'ai quelque petite question :
J'aimerais demander a l'utilisateur si il veut afficher le résultat, il répondra par o ou n. Si il répond o j'ouvre la grille remplie et si il dit n le programme se termine.
Donc comme code j'ai :
Mais lors de la compilation il m'indique une erre au niveau de la condition.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 char r printf("Voulez-vous voir la grille résolue ? répond o pour oui et n pour non\n"); scanf("%c",&r) if (c =="o") { lire_fichier(...,...); afficher(...); } else break;
Que dit le compilateur ?
Sinon, "o" est une chaine de caractère, 'o' est un caractère.
J'ai changer les " par des ' la compilation fonctionne.
Mais lors de l'exécution il me demande si je veux afficher la résolution mais il n'attend pas la que je tape sur le clavier la réponde.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 printf("Voulez vous afficher la grille resolue ?\n"); scanf("%c",&r); if (r =='o') { lire_fichier("facile_remplie1.dat",t1); afficher(t1); } else break;
Je pense que ton buffer d'entrée n'est pas vide.
http://c.developpez.com/faq/?page=cl...buffer_clavier
Ok merci , sa fonctionne maintenant.
Je vais passer a l'étape ou je dois demander a l'utilisateur d'entré sa propre table pour la résoudre.
Bonjour,
Donc pour que l'utilisateur entre une grille pas de probleme, mais j'aimerais crée une procédure qui vérifie si il n'y a pas 2 fois le même chiffre sur la ligne
Partager