Projet en C déterminer le nimber d'un nombre
Fermémamiemando Messages postés 33535 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 12 février 2025 - 30 janv. 2023 à 15:27
- Projet en C déterminer le nimber d'un nombre
- Nombre facile - Télécharger - Outils professionnels
- Musique projet x - Forum Audio
- Faites afficher avec un fond coloré les cellules qui contiennent une valeur comprise entre 250 et 350. quel nombre est dessiné en surbrillance ? - Forum VB / VBA
- Musique du film Projet X - Forum Musique / Radio / Clip
- Additionner nombres dans cellules avec texte ✓ - Forum Excel
3 réponses
J'ai l'impression que ta fonction voisine est mal utilisée. Je l'aurais mis avant afffichtab personnellement. Sinon je suis d'accord avec phil ta structure est mal interpreté. fais un effort stp
30 janv. 2023 à 15:27
Bonjour,
Avant de rentrer dans le code
Pour commencer je pense que le sujet (en particulier les puces i et ii) est imprécis voir incorrect. Il est écrit
Le puits est initialisé à 0
La notion de puits n'est pas définie à ce stade. Je suppose d'après le schéma qu'il s'agit de la case en bas à droite.
Tant qu'il existe des cases non numérotée, en choisir une dont les voisines sont numérotées. Si toutes les voisines de c ont un nimber égal à 1, on attribue 0 à la case c, sinon on lui attribute le nimber 1
La notion de voisinages n'est pas définies mais on devine qu'il s'agit des cases partageant un bord commun. Selon le jeu considéré cette notion aurait pu être différente (par exemple, en tenant compte des cases partageant un coin en commun.
Même en utilisant cette définition de voisinage, le sujet ne tient pas debout pour deux raisons : initialement, l'essentiel du tableau est vide, et même si le puits est initialisé, aucune case n'a l'ensemble de ses voisins qui sont initialisés. En réalité, il faudrait plutôt écrire "si l'ensemble de ses voisins initialisés ont une valeur égale à 1, alors on lui attribue 0 à la case c".
Enfin, il n'y a pas de notion de choix dans cet algorithme.La prochaines case c à traiter semble complètement déterminée par le parcours représenté par les flèches bleues.
Quel impact sur le code
Au niveau du parcours, la case courante est déterminée par les boucles suivantes :
for (size_t j = n, j >= 0; j--) { for (size_t i = m; i >= 0; i--) { // La case c courante est nimbus[i][j], où nimbus est un tableau composé de m lignes et n colonnes } }
Au niveau du voisinage, les seules cases initialisées sont :
- la case en dessous de c (si elle existe), i.e., c[i + 1][j] si i + 1 < m
- la case à droite de c (si elle existe), i.e., c[i][j + 1] si j + 1 < n
Je te recommande donc de faire une fonction compute_nimbus(nimbus, m, n, i, j) qui implémente ce test et retourne la valeur à affecter à nimbus[i][j] :
int compute_nimbus(int ** nimbus, size_t m, size_t n, size_t i, size_t j) { if (i + 1 < m && nimbus[i + 1][j] == 1) return 0; if (j + 1 < n && nimbus[i][j + 1] == 1) return 0; return 1; }
Bonne chance
Modifié le 30 déc. 2022 à 12:23
Bonjour,
Bizarre ton typedef en ligne 16
En général typedef sert à créer un "synonyme" d'un type de variable existant, par exemple:
typedef int ENTIER;
à partir de là, dans ton code tu peux écrire
ENTIER nb_de_cases;
au lieu de
int nb_de_cases;
Ensuite, je pense qu'il faut écrire ta déclaration de structure comme ceci:
typedef struct t_case{ int nlig; int ncol; } T_Case;
et dans ce cas, en ligne 65 tu déclares bien une variable tableau T_Tab_Case[VMAX]
qui est du type T_Case
Les indentations sont bizarres: 2 espaces ou 4 espaces ? (ça n'empêche pas de marcher, mais bon)
Remis en ordre, ça donnerait ça:
#include <stdio.h> #define VMAX 30 int Lire_Entier(); void Parametres(int niveau, int next); void affich_Tab(int nlig, int ncol); void nimber(); void construit_voisines(int nlig, int ncol, T_Case T_Tab_Case [VMAX], int *nb_vois); // Définition de la structure pour les coordonnées de la grille typedef struct t_case{ int nlig; int ncol; } T_Case; int main(){ int niveau, next = 1; int nlig, ncol; int n; int nb_vois; int T[VMAX][VMAX]; T_Case T_Tab_Case[VMAX]; T_Case pion; printf("***** Bienvenue dans le jeu ! *****\n\n"); printf("Paramètres du jeu :\n"); nlig = Lire_Entier(); ncol = Lire_Entier(); printf("\n nombre de lignes : %d\n", nlig); printf("\n nombre de colonnes : %d\n", ncol); Parametres(niveau, next); affich_Tab(nlig, ncol); construit_voisines(3, 4, T_Tab_Case, &nb_vois); printf("La case a %d voisines :\n", nb_vois); for (int i = 0; i < nb_vois; i++) { printf("(%d, %d)\n", T_Tab_Case[i].nlig, T_Tab_Case[i].ncol); } return 0; } int Lire_Entier(){ // saisie d'un nombre compris entre VMIN ET VMAX int n = 0; printf("Entrez un nombre compris entre 5 et 30 :"); scanf("%d", &n); while (n < 5 || n > 30) { printf("Veuillez recommencez avec un nombre compris entre 5 et 30 :"); scanf("%d", &n); } return n; } void Parametres(int niveau, int next){ niveau = 0; next = 0; printf("Choisissez votre niveau de difficulté (1 à 4) :"); scanf("%d", &niveau); while (niveau < 1 || niveau > 4) { printf("Veuillez recommencez avec un niveau de difficulté valide :"); scanf("%d", &niveau); } printf("A qui de commencer ? : "); scanf("%d", &next); if(next == 1) { printf(" L'ordinateur débute la partie !\n "); } else if(next == 2) { printf(" Le joueur débute la partie !\n "); } } void affich_Tab(int nlig, int ncol){ int i, j; printf("C'EST PARTI !"); printf("\n"); for (int i = 0; i < nlig; i++) { for (int j = 0; j < ncol; j++) { if (i == pion.nlig && j == pion.ncol) { printf("|O"); } else { printf("|-"); } } printf("|\n"); } }