Probleme de programme en C

Fermé
Sakuude - 3 janv. 2023 à 21:32
 PierrotLeFou - 4 janv. 2023 à 01:06

Bonjour, j'écris un programme qui doit afficher 5 chiffres allant de 0 à 9 sans doublons. Cependant après plusieurs essais, il me reste toujours des doublons. Pouvez-vous m'aider ?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N_NUMBERS 5
int main(){
  int choix, quitter, tmp, i, j, n_numbers;
  int t[10]={0,1,2,3,4,5,6,7,8,9};
  srand(time(NULL));
  quitter=0;
  do{
    printf("===Menu===\n");
    printf("Commencer une nouvelle partie (1)\n");
    printf("Quitter le jeu (0)\n");
    scanf("%d",&choix);
    switch(choix){
    case 0:
      break;
    case 1:
      for (int i= 0; i < 10; ++i){
        t[i]=i;
        for (int i=0; i<n_numbers; i++) 
        {
          j = rand()%(10-i)+i;
          tmp=t[i];
          t[i]=t[j];
          t[j]=tmp;
        }
      }
    for (int i = 0; i <10; ++i)
    {
      printf("%d->%d\n", i, t[i]);
    }
    break;
  }

}while(!quitter);

return(0);
}

2 réponses

xHaMaz Messages postés 108 Date d'inscription mardi 3 janvier 2023 Statut Membre Dernière intervention 23 avril 2023 14
3 janv. 2023 à 21:43

Bonjour,

Il y a plusieurs problèmes dans ton code et c'est pour ça que tu n'arrives pas à générer 5 nombres sans doublons.

Premièrement tu initialise ton tableau "t" avec les valeurs de 0 à 9 à chaque itération de la boucle "for". En gros à chaque fois que tu lances une nouvelle partie tu remplies à nouveau le tableau "t" avec les valeurs initiales et donc rend impossible l'obtention de nombre différents à chaque itération.

Deuxièmement, tu utilises la même boucle "for" pour initialiser le tableau "t" et mélanger ses éléments. Ce qui veut dire que la boucle "for" qui mélange les éléments du tableau "t" est éxécutée 10 fois, ce qui fait que chaque élément du tableau sera mélangé 10 fois à 100% et donc impossible d'avoir des nombres différents à chaque itération.

Pour te donner des pistes, tu peux déclarer ton tableau "t" en dehors de la boucle principale pour éviter qu'il soit réinitialisé à chaque itération, utiliser une boucle "for" différente pour mélanger les éléments de ton tableau et qui devrait être exécutée 5 fois pour les 5 nombres sans doublons et pour finir d'afficher uniquement les 5 premiers éléments de ton tableau qui sont les nombres sans doublons.

Tiens moi au courant

0

peux-tu me montrer le rendu en code s'il te plaît ? Je vois un peu ce que tu veux dire mais pour moi, le tableau a été initialisé dans la boucle for pour chaque i de 0 à 9. Donc j'avoue que je ne comprends pas trop quelle modification je dois apporter... Je te remercie pour ton aide, j'essaie de répondre au plus vite.

0
xHaMaz Messages postés 108 Date d'inscription mardi 3 janvier 2023 Statut Membre Dernière intervention 23 avril 2023 14 > Sakuude
3 janv. 2023 à 22:06
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N_NUMBERS 5
int main(){
  int choix, quitter, tmp, i, j, n_numbers;
  int t[10]={0,1,2,3,4,5,6,7,8,9};
  srand(time(NULL));
  quitter=0;
  do{
    printf("===Menu===\n");
    printf("Commencer une nouvelle partie (1)\n");
    printf("Quitter le jeu (0)\n

Ca ressemblerait à ça pour moi

0
Sakuude > xHaMaz Messages postés 108 Date d'inscription mardi 3 janvier 2023 Statut Membre Dernière intervention 23 avril 2023
3 janv. 2023 à 22:47

ola tout ne s'est pas mis je crois, on ne voit pas tout 

0
xHaMaz Messages postés 108 Date d'inscription mardi 3 janvier 2023 Statut Membre Dernière intervention 23 avril 2023 14 > Sakuude
3 janv. 2023 à 23:14
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N_NUMBERS 5

int main(){
  int choix, quitter, tmp, i, j;
  int n_numbers = 10;
  int t[10]={0,1,2,3,4,5,6,7,8,9};
  srand(time(NULL));
  quitter=0;
  do{
    printf("===Menu===\n");
    printf("Commencer une nouvelle partie (1)\n");
    printf("Quitter le jeu (0)\n");
    scanf("%d",&choix);
    switch(choix){
    case 0:
      break;
    case 1:
      for (int i=0; i<n_numbers; i++) 
      {
        j = rand()%(n_numbers-i)+i;
        tmp=t[i];
        t[i]=t[j];
        t[j]=tmp;
      }
      for (int i = 0; i < N_NUMBERS; ++i)
      {
        printf("%d\n", t[i]);
      }
      break;
    }
  }while(!quitter);
  return(0);
}
0

Ce problème a  été posté ailleurs. :)
C'est correct d'initialiser le tableau à chaque tour de boucle, mais il faut mélanger dans une autre boucle.
Et on affiche dans une troisième boucle ...
Pourquoi rand() % 10 + i; ?
Le + i  est non seulement inutile, mais nuisible.
L'utilisation du switch est ici une très mauvaise idée.
Une fois qu'on a mélangé les chiffres, si on fait deviner à l'utilisateur (sujet de l'autre site), il faut avoir une boucle à l'intérieur de l'autre pour que le joueur essaie de deviner les chiffres.

Voici comment je le vois (vois est un grand mot ... je suis aveugle et j'utilise une synthèse vocale)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N_NUMBERS 5
int main(void) {
    int tab[10];
    srand(time(NULL));
    int quitter = 0;
    do {
        printf("Menu ...\n");
        for(int i = 0; i < 10; i++)  tab[i] = i;
        for(int i = 0; i < N_NUMBERS; i++) {
            int j = rand() % 10;
            int temp = tab[i];
            tab[i] = tab[j];
            tab[j] = temp;
        }
        for(int i = 0; i < N_NUMBERS; i++)  printf("%d ", tab[i]);
        printf("\n");
        int fini = 0;
        do {
            // Jusqu'à ce que ça soit fini ...
            fini = 1;   // Je décide que c'est fini ...
        } while(!fini);
        printf("Voulez-vous quitter? (0 = non, 1 = oui) ");
        scanf("%d", &quitter);
    } while(!quitter);
    return 0;
}

0