0
1
resolveur sudoku simple
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 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 ^^) :
int init_mat(int mat, 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 = c - '0';
}
else {
fprintf(stderr, "Fichier %s corrompu, caractère inconnu.\n", s);
exit(EXIT_FAILURE);
}
}
}
fclose(f);
return 0;
}
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. :)
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 !

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 ?