Projet en C déterminer le nimber d'un nombre

Fermé
ScaRed - 29 déc. 2022 à 12:27
mamiemando Messages postés 33073 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 avril 2024 - 30 janv. 2023 à 15:27

Bonjour,

Bonjour à tous,

Je dois réaliser un projet en C, j'ai bien avancé dessus mais je bloque sur un petit point. En effet je dois réaliser la fonction suivante (en pièce jointe). J'ai déjà bien avancé en effet il était demandé de créer deux types une structure T_case et un tableau à une dimension T_Tab_Case de T_case afin d'afficher ce tableau (2 ème et 3 ème pièce jointe). J'aimerai avoir quelques avis sur comment je pourrai réaliser la suite bien sûr toujours en utilisant les structures ?

Je vous joint mon code ci-contre :

Code :

 
#include <stdio.h>
 
#define VMAX 30
 
 
 
 
 
// Définition de la structure pour les coordonnées de la grille
typedef struct {
  int nlig;
  int ncol;
} T_Case;
 
typedef T_Case T_Tab_Case[];
 
T_Case pion;
 
 
 
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);
 
 
 
 
 
 
int main(){
    int niveau, next = 1;
    int nlig, ncol;
    int n;
    int T[VMAX][VMAX];
 
 
 
 
    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);
 
 
  T_Case T_Tab_Case [VMAX];
  int nb_vois;
 
  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");
  }
}

Merci de votre aide ! 
Macintosh / Chrome 108.0.0.0

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

3
mamiemando Messages postés 33073 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 avril 2024 7 748
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 (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

0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
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");
    }
}
-2