Bonjour,
Je vous propose un nouvel élément à utiliser : sudoku.c
Resolveur de sudoku codé en c permettant de résoudre les grilles simples (sans hypothèses).
Qu'en pensez-vous ?
Bonjour,
Je vous propose un nouvel élément à utiliser : sudoku.c
Resolveur de sudoku codé en c permettant de résoudre les grilles simples (sans hypothèses).
Qu'en pensez-vous ?
C'est assez douteux. Tu devrais essayer un backtracking, tu pourrais résoudre n'importe quelle grille avec toutes les solutions possibles de la grille (s'il y a).
Il y a énormément de choses à redire sur le code. :s
Plus tu pédales moins fort, moins t'avances plus vite.
J'ai travaillé sur une fonction récursive permettant de faire du backtracking mais je n'ai pas encore de résultats satisfaisant par rapport à sa. Si tu as des conseils ou des améliorations pour le code n'hésite pas.
Le nom des variables est assez hasardeux. Essaye de donner des noms clairs aux variables pour savoir ce qu'elles font à la première lecture.
Tu mets des commentaires inutiles. Le truc du genre "//on ouvre le fichier en lecture", c'est vraiment pas utile. On a vu la ligne fopen, on sait qu'on ouvre le fichier,
Tu ne testes pas le fopen ligne 281, tu ne testes pas non plus si agrv[2] est valide (NULL ?)
On préfèrera utiliser des noms de constantes en majuscule (TailleMat),
Ligne 285, tu fais un for. C'est assez bizarre. Tu commences à i=0, c'est le nom du programme. Tu fais un strcmp sur tous les arguments pour chercher un ? et quitter, tu devrais plutôt faire un truc 'classique' avec des arguments (genre -h pour l'help). C'est pas beaucoup plus compliqué à faire. Tu pourrais faire une fonction 'usage' qui explique comment utiliser le programme.
Tu pourrais créer un fichier avec un nom arbitraire si le nom de fichier de sortie n'est pas présent,
Si l'ouverture du fichier a échoué dans init_mat tu continues le programme comme si de rien était, tu devrais afficher une erreur et quitter,
Ta fonction init_mat est super compliquée. Tu utilises des artifices qui n'ont pas lui d'être. Tu pourrais simplement transformer ta fonction comme ça (j'y suis peut-être allé fort sur les détections d'erreurs ^^) :
Fais attention avec les indices dans un tableau à 2 dimensions... là tu inverses ! En général je préconise l'utilisation de tableaux à 1 seule dimension. C'est plus flexible.
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 int init_mat(int mat[TailleMat][TailleMat], const char * s) { FILE * f; int c, i, j; f = fopen(s, "r"); if (f == NULL) { fprintf(stderr, "Erreur d'ouverture du fichier %s.\n", s); exit(EXIT_FAILURE); } for (i = 0; i < TailleMat; i++) { for (j = 0; j < TailleMat; j++) { c = fgetc(f); if (c == EOF) { if (i != TailleMat && j != TailleMat) { fprintf(stderr, "Fichier %s corrompu.\n", s); exit(EXIT_FAILURE); } i = TailleMat; j = TailleMat; continue; } else if (c == '\n') { break; } else if (isdigit(c)) { mat[i][j] = c - '0'; } else { fprintf(stderr, "Fichier %s corrompu, caractère inconnu.\n", s); exit(EXIT_FAILURE); } } } fclose(f); return 0; }
Dans ChercheValeur, tu fais if(lire_mat(mat,i,j)>0) mais j n'est pas initialisé,
Le reste j'ai un peu zappé, c'est du copier/coller. ^^
Essaye de faire plus de fonctions 'utiles' !
Bon courage !
Plus tu pédales moins fort, moins t'avances plus vite.
Merci pour ces conseils très complets, je ne manquerai pas d’améliorer ces divers points.![]()
bonjour, je viens de débuté dans la programmation, et je suis très content de vous. merci pour le partage.![]()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager