IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Sudoku avec fichier


Sujet :

C

  1. #21
    Invité(e)
    Invité(e)
    Par défaut
    Pense aussi à vérifier que le fichier s'est bien ouvert, que scanf a bien fait son travail.

  2. #22
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 45
    Par défaut
    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 :

    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);
     }
    Merci de votre aide car je suis dessus depuis tous se week end

  3. #23
    Invité(e)
    Invité(e)
    Par défaut
    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");
        }
    }

  4. #24
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 45
    Par défaut
    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.

  5. #25
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 45
    Par défaut
    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

  6. #26
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par raining-blood Voir le message
    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.

  7. #27
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    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.

  8. #28
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 45
    Par défaut
    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...

  9. #29
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par man scanf
    VALEUR RENVOYÉE
    Ces fonctions renvoient le nombre d'éléments d'entrées correctement assignés. Ce nombre peut être plus petit que le nombre d'élements attendus, et même être nul, s'il y a une erreur de mise en correspondance. La valeur zéro indique qu'aucune conversion n'a été faite bien que des caractères étaient disponibles en entrée. Typiquement c'est un caractère d'entrée invalide qui en est la cause, par exemple un caractère alphabétique dans une conversion `%d'. La valeur EOF est renvoyée si une erreur d'entrée a eu lieu avant toute conversion, par exemple une fin de fichier. Si une erreur fin-de-fichier se produit après que les conversions aient commencé, le nombre de conversions réussies sera renvoyé.

  10. #30
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 45
    Par défaut
    Bonjour,

    Désolé, mais je ne vois pas comment entre le code pour vérifier les valeur du fichier

  11. #31
    Invité(e)
    Invité(e)
    Par défaut
    Il faut vérifier que la valeur retournée par scanf correspond au nombre de conversions demandées, 1 ici.

    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);
    }
    EDIT:

    Peux tu poster la dernière version de ton code et un exemple de grille qui pose problème ?

  12. #32
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 45
    Par défaut
    Voici le dernier code :

    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");
    }
    Un exemple de grille ( contenu dans le fichier vide1.dat)

    670900530
    000400800
    208030910
    805740000
    007109400
    000083602
    052010708
    004007000
    036004051

  13. #33
    Invité(e)
    Invité(e)
    Par défaut
    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 :

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

  14. #34
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 45
    Par défaut
    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.

  15. #35
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 45
    Par défaut
    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 :
    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;
    Mais lors de la compilation il m'indique une erre au niveau de la condition.

  16. #36
    Invité(e)
    Invité(e)
    Par défaut
    Que dit le compilateur ?

    Sinon, "o" est une chaine de caractère, 'o' est un caractère.

  17. #37
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 45
    Par défaut
    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;

  18. #38
    Invité(e)
    Invité(e)
    Par défaut
    Je pense que ton buffer d'entrée n'est pas vide.

    http://c.developpez.com/faq/?page=cl...buffer_clavier

  19. #39
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 45
    Par défaut
    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.

  20. #40
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 45
    Par défaut
    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

Discussions similaires

  1. Mettre a jour BD avec fichier csv
    Par Looping94510 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 07/02/2005, 18h56
  2. Erreur avec fichier .manifest
    Par engi dans le forum Windows
    Réponses: 2
    Dernier message: 16/11/2004, 14h58
  3. [Eclipe 2.1.1]Projet avec fichiers sources existants
    Par mfofana dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 26/02/2004, 05h20
  4. Problème avec fichier texte
    Par jpdelx dans le forum ASP
    Réponses: 7
    Dernier message: 13/11/2003, 13h17
  5. Réponses: 4
    Dernier message: 25/08/2003, 09h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo