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 :

Sat-Solveur de Sudoku


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 42
    Par défaut Sat-Solveur de Sudoku
    Bonjour, Bonsoir

    Je suis étudiant en Informatique en L1, et j'ai un cours d'intelligence artificiel ! Je devais faire un solveur de sudoku avec un sat-solveur.

    J'ai réussi a le faire, mais on me demande de rajouter une interface graphique et je n'ai pas appris a le faire ! Et je doit envoyer mon projet au prof le 5 Mai Donc j'aurais voulut savoir si vous pouvez m'aidez s'il vous plait !!

    Merci

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    #include<stdio.h>
    #include<math.h>
     
    #define ND(n,i,j,v)(n*n*(i-1)+(j-1)*n+v)
     
     
    void code_cnf(){
     
      int i, j, t, var=9, cases=1, clause= (int)pow(1000, 9);
     
     
      //la creation du fichier cnf.
      printf("p cnf %d  %d \n", var*var*var, clause);
     
     
     
      //valeur entre 1 et 9  
      while(cases<=var){
        for(i=1; i<=var; i++){
          for(j=1;j<=var; j++){
        printf("%d", ND(var,i,j,cases));
        printf(" ");
          } 
          printf("0 \n");
     
        }
        cases++;
      }
     
      //ligne
     
      cases=1;
      int tmp=0;
     
      while(cases<=var){
        for(t=1;t<=var;t++){
          for(j=1;j<=var;j++){
        for(i=1+cases;i<=var; i++){
          printf("-%d -%d 0\n", ND(var,t,cases,j), ND(var,t,i,j));
        }
          }
        }
        cases++;
      }
     
      //colonne
     
      cases=1;
     
      while(cases<=var){
        for(t=1;t<=var;t++){
          for(j=1;j<=var;j++){
        for(i=1+cases;i<=var; i++){
          printf("-%d -%d 0\n", ND(var, cases, t, j), ND(var, i, t, j));
     
        }
          }
        }
        cases++;
      }
     
      //carre
     
      int x,y;
     
      for (i = 1; i<=var; i++){
        for (j = 1; j<=var; j++){
          for (x = 1; x <= var; x++){
        for (y = 1; y < x; y++){
          printf("-%d -%d 0\n", ND(var, i, j, x), ND(var, i, j, y));
        }
          }
        }
      } 
    }
     
     
    int main(){
     
      code_cnf();
     
      return ;
    }

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Bonjour,
    Premièrement:


    Ton main ne retourne pas de valeur, c'est une incohérence. Active plus de warning à la compilation (au moins -Wall pour gcc)

    Deuxièmement, ton code n'est pas découpé correctement.
    ici, ton main est exactement ta fonction code_cnf, donc, il faudrait renommer cette dernière en main.

    Chacun de tes commentaires me semble désigner autant de fonctions.

    Pour faire une interface graphique en mode texte, soit tu te tourne vers ncurses (linux) / conio (windows), soit tu la fais directement (printf/getc).

    Pour une interface graphique "jolie", il faut passer par une bibliothèque externe, parmi lesquelles on peut citer gtk, SDL (ou SFML), la lib de windows.

    Le vrai problème, c'est de savoir ce que doit permettre ton interface graphique.
    Pour de l'affichage sans interaction (ou un simple bouton Go), ca peut être très rapide à faire.

  3. #3
    Membre actif
    Profil pro
    Ingénieur
    Inscrit en
    Avril 2013
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Avril 2013
    Messages : 77
    Par défaut interface
    Pour créer une interface graphique, il te faut une librairie qui contient les boutons, et tous les outils nécessaires...

    Voici quelques librairies courantes :
    - l'utilisation de l'API windows ou des MFC, qui ne fonctionnera que sur Windows, ceci nécessite aucune installation particulière
    - l'utilisation de Qt, qui est portable sur différents systèmes d'exploitation et qui est facile à utiliser pour des débutants, il est alors recommandé d'installer toute la suite Qt, avec QtCreator
    - l'utilisation de la SDL, avec simple aussi
    - openGL si tu veux faire de la 3D, avec glut pour gérer l'interface !!

    Dans tous les cas, il faut absolument que ton code de résolution du sudoku soit bien dissocié du code de gestion de l'interface.
    Tu peux par exemple dans un premier temps utilisé la console comme interface, et ensuite passer à un truc plus évolué avec la SDL ou QT par exemple.

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Cela dit, la contrainte étant de terminer avant dimanche soir, openGL n'est pas recommandable.

    Nous avons quelques cours sur la SDL (dans Applications/2D-3D-jeux), et on peut en trouver pas mal sur le net

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 42
    Par défaut
    Merci pour vos réponse !! Est désoler je mettrait la balise code la prochaine fois !!
    J'ai oublier de vous dire que je code sous linux ! Mais la SDL ne veux pas s'installer sur ma version d'Ubuntu la dernière 12.10 !!
    Pour le graphique un simple bouton lancer ou go peut importe suffira !!
    Et je n'est jamais fait de SDL ! Le cours de SDL ce fera l'an prochain, donc ...

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Le plus simple, demande à ton professeur ce qui est demandé exactement.
    Il est probable qu'une simple présentation textuelle soit suffisante.

    Auquel cas, ncurse sera un très bon choix.

  7. #7
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    en plus des remarques concernant le code et les indications pour le choix d'un toolkit pour ton interface, il y a une ligne dans ton code qui est fausse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void code_cnf(){
      int i, j, t, var=9, cases=1, clause= (int)pow(1000, 9);
      ...
    Tu ne peux pas stocker 1000⁹ dans un int (ni 32 ni même 64 bits) car log2(1000⁹)≃89.7.
    Comme tu ne l'utilises que pour l'afficher dans le printf qui suit autant afficher directement sa valeur en texte : un 1 suivit de vingt-sept 0.
    Comme ton programme semble ne créer qu'un fichier qui sera ensuite utilisé dans un solveur (enfin ce n'est qu'une déduction ...) je suppose que ton interface devra appeler ce solveur après la création du fichier ?
    Enfin comme le conseille l'Éternel mieux vaut demander à ton prof ce qu'il attend s'il ne l'a pas déjà dit clairement.

Discussions similaires

  1. Le Solveur de Sudoku !
    Par Ennydra dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 03/12/2014, 13h39
  2. [Sources] Solveur de sudoku
    Par smartties dans le forum Contribuez
    Réponses: 5
    Dernier message: 06/09/2013, 23h08
  3. Réponses: 1
    Dernier message: 28/05/2011, 22h55
  4. Solveur de Sudoku
    Par forthx dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 15h54
  5. Solveur de Sudoku en Java
    Par User Name dans le forum Général Java
    Réponses: 6
    Dernier message: 10/06/2009, 20h30

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