Partage
  • Partager sur Facebook
  • Partager sur Twitter

Avis sur mon premier TP en C

TP Plus ou moins

    14 juin 2019 à 19:04:53

    bonjour j'ai commencer a apprend le C très récemment, je vient donc de terminer le premier TP donner dans les cours et je voulais votre avis sur mon code (erreur, optimisation...) afin d'approfondir un peu plus.

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int menuD(choix1);
    int menuJ(choix);
    
    int main(int argc, char *argv[])    // Fonction execution + compteur + relancer la partie
    {
        int nombre = 0;
        int nombreMystere = 0;
        int compteur = 0;
        int continuerPartie = 1;
        int nombreDeJoueurs = 0;
        int MIN = 1;
        int nombreMaximum = 0;
    
        srand(time(NULL));
    
        do   // boucle pour relancer le jeux
        {
    
        int compteur = 0;
    
    
        // Switch Premier Menu choix du niveau
    
            switch(menuD())
            {
                case 1:
                        nombreMaximum = 100;
                        printf("\nnombre maximum 100\n\n");
                    break;
                case 2:
                        nombreMaximum = 1000;
                        printf("\nnombre maximum 1000\n\n");
                    break;
                case 3:
                        nombreMaximum = 10000;
                        printf("\nnombre maximum 10000\n\n");
                    break;
            }
    
    
        // Switch Deuxieme Menu choix du nombre de joueur
    
            switch(menuJ())
            {
                case 1:
                        nombreMystere = (rand() % (nombreMaximum - MIN + 1)) + MIN;
                    break;
                case 2:
                        do   // choix du nombre mystere par le premier joueur
                        {
                        printf("\nJoueur 1 : Entrez un nombre mystere : ");
                        scanf("%d", &nombreMystere);
    
                        if(nombreMystere > nombreMaximum)
                        {
                        printf("\nErreur : Entrez un nombre moins grand\n\n");
                        }
    
                        }while(nombreMystere > nombreMaximum);
                    break;
            }
    
        do      // Partie execution du jeux
        {
            printf("\nQuel est le nombre ? ");
            scanf("%d", &nombre);
            printf("\n");
    
            compteur++;
    
            if (nombre < nombreMystere)
                printf("C'est plus !\n");
    
            else if (nombre > nombreMystere)
                printf("C'est moins !\n");
    
            else
                printf("Bravo, vous avez trouve le nombre mystere en %d coups!!!\n\n", compteur);
    
        }while(nombre != nombreMystere);
    
    
        // Recommencer une partie oui ou non
    
        if(continuerPartie)
            printf("Une autre partie ? \n");
            printf("Oui = 1\t Non = 0\n");
            scanf("%d", &continuerPartie);
    
        }while(continuerPartie != 0);
    
        return 0;
    }
    
    int menuD(int choix1)               // Fonction Premier Menu choix du niveau
    {
        do
        {
            printf("===Menu Difficulte===\n");
            printf("1. Facile\t1 a 100\n");
            printf("2. Nomral\t1 a 1000\n");
            printf("3. Difficile\t1 a 10000\n\n");
            printf("Niveau de difficulte ? ");
            scanf("%d", &choix1);
    
            if(choix1 < 1 || choix1 > 3)
            {
                printf("\nErreur : pas de niveau selectionne\n\n");
            }
            else if(choix1 >= 1 || choix1 <= 3)
            {
                return choix1;
            }
    
        }while(choix1 < 1 || choix1 > 3);
    }
    
    int menuJ(int choix)                // Fonction Deuxieme Menu choix du nombre de joueur
    {
        do
            {
            printf("===Menu Joueurs===\n");
            printf("1. Mode un joueur\n");
            printf("2. Mode deux joueurs\n\n");
            printf("Mode de jeux ? ");
            scanf("%d", &choix);
    
                    if(choix < 1 || choix > 2)
                    {
                        printf("\nErreur : pas de mode de jeux selectionne\n\n");
                    }
                    else if(choix >= 1 || choix <= 2)
                    {
                        return choix;
                    }
            }while(choix < 1 || choix > 2);
    
    }
    


    Il s'agit d'un simple jeux, je précise que le jeux fonctionne je ne vient pas demander de l'aide car je n'y arrive pas mais simplement un avis global, merci d'avance.

    -
    Edité par Nets 16 juin 2019 à 8:44:42

    • Partager sur Facebook
    • Partager sur Twitter
      14 juin 2019 à 19:55:59

      srand est mal placé, il ne devrait être appelé qu'une seul fois par le programme.
      • Partager sur Facebook
      • Partager sur Twitter
        15 juin 2019 à 8:27:07

        Merci pour ta réponse rouloude, la fonction srand ne s’exécute qu'une fois par partie si est seulement si la personne sélectionne le mode un joueur, ou alors je n'ai pas bien compris et dans ce cas je veux bien que tu me donne plus de précision.

        • Partager sur Facebook
        • Partager sur Twitter
          15 juin 2019 à 9:55:44

          srand est dans une boucle do... continuer partie, donc s'exécute plusieurs fois dans ce programme. C'est rand() qui doit s'exécuter une fois à chaque partie. srand doit s'exécuter une fois tout court, comme l'a dit dit rouloude.

          • Partager sur Facebook
          • Partager sur Twitter
            15 juin 2019 à 12:17:38

            Autant pour moi je vient de vérifier dans le cours, et en effet, srand ne s’exécute qu'une seul fois au début du programme, merci pour la précision robun :) , j'ai corrigé tout ça dans le code du message d'origine.

            -
            Edité par Nets 15 juin 2019 à 12:22:58

            • Partager sur Facebook
            • Partager sur Twitter
              15 juin 2019 à 12:23:16

              Première chose à faire d'urgence : indenter correctement le code.

              Code-blocks : controle-a   controle-maj-f  (de mémoire)

              Un programme est certes destiné, quand il sera au point, à tourner sur une machine qui s'en fout.

              Mais en attendant que ça marche, il doit être lu et relu cent fois par celui/celle qui essaie de le faire marcher. Alors il faut qu'il soit le plus agréable à lire possible.

              -
              Edité par michelbillaud 15 juin 2019 à 12:25:27

              • Partager sur Facebook
              • Partager sur Twitter
                15 juin 2019 à 14:30:16

                d'accord merci pour le conseil j'essayerais de faire quelque chose de plus propre sur les prochains programme.
                • Partager sur Facebook
                • Partager sur Twitter
                  15 juin 2019 à 15:18:22

                  Il faudrait remettre ton compteur à zéro après chaque partie ...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 juin 2019 à 17:12:21

                    je me suis rendu compte toute à l'heure c'est déjà corriger ^^
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 juin 2019 à 23:56:22

                      Nets a écrit:

                      Autant pour moi je vient de vérifier dans le cours, et en effet, srand ne s’exécute qu'une seul fois au début du programme, merci pour la précision robun :), j'ai corrigé tout ça dans le code du message d'origine.

                      -
                      Edité par Nets 15 juin 2019 à 12:22:58

                      Je me permets juste d'ajouter un peu de théorie pour que tu comprennes mieux à quoi correspond exactement srand et rand.

                      L'aléatoire n'existe pas dans un ordinateur. Pour le simuler, on utilise des PRNG - Pseudo Random Number Generator.

                      Le principe est très simple : tu pars d'un entier initial qu'on appelle seed (noté s), tu prends des entiers A, B et N qui sont choisis de façon à satisfaire certaines propriétés statistiques, et tu calcules l'entier suivant de la façon suivante : s' = (A * s + B) modulo N

                      Puis, pour avoir l'entier suivant, tu fais pareil avec s' : s'' = (A * s' + B) modulo N.  Tu peux d'ailleurs essayer toi même à la main avec des petites valeurs pour avoir une idée de comment ça marche. En réitérant ça plusieurs fois, tu obtiens une liste de valeurs qui s'apparentent à de l'aléatoire. L'implémentation de la librairie standard C choisit A, B et N de façon à ce qu'on soit le plus proche statistiquement parlant d'un vrai aléatoire (par exemple si A = 1, B = 0, c'est clairement pas aléatoire du tout - seules certaines combinaisons permettent d'avoir des résultats satisfaisants)

                      rand() c'est le s' = A*s + B modulo N ; chaque appel à rand() va en fait utiliser le résultat du précédent rand()

                      srand() c'est la fonction qui t'initialises la seed avec une certaine valeur. En donnant time(NULL), tu vas en fait lui dire : je veux que ma seed soit le temps qui s'est écoulé en secondes depuis un certain temps. D'où la formule un peu magique srand(time(NULL)), et d'où le fait que srand ne doit apparaitre qu'une seule fois : sinon, tu réinitialises la seed - si tu le fais trop suivant, ça va rendre la chose moins aléatoire.

                      Voilà, en espérant que ça éclaircisse un peu ta compréhension des fonctions rand() et srand() :)

                      (et donc, comme rand() génère un nombre complètement aléatoire potentiellement très grand, il faut le ramener à l'intervalle que tu veux [MIN, MAX] avec une formule du genre rand() % (MAX-MIN+1) + MIN )

                      -
                      Edité par potterman28wxcv 24 juin 2019 à 23:58:49

                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 juin 2019 à 0:22:05

                        Salut,

                        Petit complément au message de mon vdd, il existe d'autres manières de créer des suites pseudo-aleatoires, avec différentes propriétés : typiquement la fonction rand n'est pas cryptographiquement sûre, ce qui veut dire que l'on peut deviner la suite à partir d'un faible nombre d'observations de celle-ci.

                        La page wikipédia (https://fr.m.wikipedia.org/wiki/Générateur_de_nombres_pseudo-aléatoires) présente quelques autres techniques ;)

                        -
                        Edité par FantasMaths 25 juin 2019 à 0:23:03

                        • Partager sur Facebook
                        • Partager sur Twitter
                          26 juin 2019 à 9:31:19

                          // Bon je tiens  a préciser que je suis un débutant dans le language C, du coup je sais très bien que le copier/coller en utilisant les 2 fonctions est pas top.
                          // Cela est juste mon code, au cas ou ca peut servir quelqu'un, à apprendre un concept ou quelque chose du genre, ca ne fait pas de mal de le mettre ici, bonne journée.
                          
                          #include <stdio.h>
                          #include <stdlib.h>
                          #include <time.h>
                          
                          int myfunction_1p();
                          int myfunction_2p();
                          
                          int main(int argc, char *argv[])
                          {
                          	char userChoice;
                          
                          	printf("Choose 1 for 1Player | 2 for 2Players --> ");
                          	scanf("%c", &userChoice);
                          
                          	if (userChoice == '1')
                          		myfunction_1p();
                          	else if (userChoice == '2')
                          		myfunction_2p();
                          
                          	return 0;
                          }
                          
                          int myfunction_1p()
                          {
                          	
                          	int MAX = 100, MIN = 1;
                          	int myResult = 0;
                          	int secretNumber = 0;
                          	int continueGame = 1;
                          	int difficultyLevel;
                          
                          	printf("Choose difficulty level: 1 | 2 | 3 --> ");
                          	scanf("%d", &difficultyLevel);
                          	
                          	if (difficultyLevel == 1)
                          		MAX = 100;
                          	else if (difficultyLevel == 2)
                          		MAX = 1000;
                          	else if (difficultyLevel == 3)
                          		MAX = 10000;
                          
                          	srand(time(NULL));
                          	
                          	while (continueGame)
                          	{
                          		int counter = 0;
                          		char check;
                          
                          		printf("Press 'Q or q' to quit || Press 'Y or y' to play --> ");
                          		scanf(" %c", &check);
                          
                          		if (check == 'Q' || check == 'q')
                          			continueGame = 0;
                          		
                          		else if (check == 'Y' || check == 'y')
                          		{
                          			secretNumber = (rand() % (MAX - MIN + 1)) + MIN;
                          			printf("%d\n", secretNumber);
                          
                          			while (myResult != secretNumber) 
                          			{
                          				printf("What's the mysterious number ? ");
                          				scanf("%d", &myResult);
                          				counter++;
                          
                          				if (myResult > secretNumber)
                          					printf("It's less !\n");
                          				else if (myResult < secretNumber)
                          					printf("It's more !\n");
                          				else
                          					printf("Congratulations, you've found the secret number in %d tries !!!\n", counter);
                          			}
                          		}
                          		
                          		else 
                          			printf("You've entered none of the keys demanded, try again!\n");
                          	}
                          
                          	return 0;
                          }
                          
                          int myfunction_2p()
                          {
                          
                          	const int MAX = 100, MIN = 1;
                          	int myResult = 0;
                          	int continueGame = 1;
                          
                          	while (continueGame)
                          	{
                          		int counter = 0;
                          		char check;
                          
                          		printf("Press 'Q or q' to quit || Press 'Y or y' to play --> ");
                          		scanf(" %c", &check);
                          
                          		if (check == 'Q' || check == 'q')
                          			continueGame = 0;
                          		
                          		else if (check == 'Y' || check == 'y')
                          		{
                          			int secretNumber;
                          			printf("Choose a secret number and hide it from your friend! --> ");
                          			scanf("%d", &secretNumber);
                          
                          			printf("%d\n", secretNumber);
                          
                          			while (myResult != secretNumber) 
                          			{
                          				printf("What's the mysterious number ? ");
                          				scanf("%d", &myResult);
                          				counter++;
                          
                          				if (myResult > secretNumber)
                          					printf("It's less !\n");
                          				else if (myResult < secretNumber)
                          					printf("It's more !\n");
                          				else
                          					printf("Congratulations, you've found the secret number in %d tries !!!\n", counter);
                          			}
                          		}
                          		
                          		else 
                          			printf("You've entered none of the keys demanded, try again!\n");
                          	}
                          
                          	return 0;
                          }

                          -
                          Edité par Ayoub ABOUNAKIF 26 juin 2019 à 9:46:03

                          • Partager sur Facebook
                          • Partager sur Twitter
                            26 juin 2019 à 10:23:32

                            • C'est très bien d'utiliser des fonctions, mais il faut leur donner des noms significatifs. Genre one_player_game(), two_players_game()
                            • il y a surement une partie commune entre les deux fonctions. En faire une autre fonction.
                            • Utiliser le type bool pour les indicateurs logiques, plutôt que des int valant 0/1.  (#include <stdbool.h>)
                            • ne pas mettre de u à langage.

                            -
                            Edité par michelbillaud 26 juin 2019 à 10:25:53

                            • Partager sur Facebook
                            • Partager sur Twitter
                              26 juin 2019 à 10:51:13

                              michelbillaud a écrit:

                              • C'est très bien d'utiliser des fonctions, mais il faut leur donner des noms significatifs. Genre one_player_game(), two_players_game()
                              • il y a surement une partie commune entre les deux fonctions. En faire une autre fonction.
                              • Utiliser le type bool pour les indicateurs logiques, plutôt que des int valant 0/1.  (#include <stdbool.h>)
                              • ne pas mettre de u à langage.

                              -
                              Edité par michelbillaud il y a 22 minutes

                              Merci beaucoup, de tes remarques, j'ai bien aimer l'idée de rendre la partie commune entre les deux fonctions une fonction.

                              Je vais essayer d'en faire après que j'en finis avec la partie 2 du cours.

                              Mais je n'ai pas compris ce que c'est le u à language.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                26 juin 2019 à 13:54:04

                                Dire "language" est une faute d'orthographe en français. Il n'y a pas de 'u' dans le mot "langage".

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  26 juin 2019 à 17:14:59

                                  potterman28wxcv a écrit:

                                  Dire "language" est une faute d'orthographe en français. Il n'y a pas de 'u' dans le mot "langage".


                                  Ah d'accord, je parles pas bien français, je parles généralement anglais du coup, je fais pas mal de fautes niveau français :(
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    26 juin 2019 à 17:28:07

                                    Ayoub ABOUNAKIF a écrit:

                                    potterman28wxcv a écrit:

                                    Dire "language" est une faute d'orthographe en français. Il n'y a pas de 'u' dans le mot "langage".


                                    Ah d'accord, je parles pas bien français, je parles généralement anglais du coup, je fais pas mal de fautes niveau français :(


                                    C'est ce que je supposais, parce que les variables et les fonctions ont des noms tout à fait raisonnables en anglais (bien choisis, et orthographiés correctement), avec un très bon style (*)(**). Et les messages sont en vrai anglais.

                                    Ma remarque était destiné aux vrais francophones, qui font souvent la faute.

                                    (*) c'est rare que je le dise, profitez en :-)

                                    (**) à part myFunction() :-)

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Avis sur mon premier TP en C

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    • Editeur
                                    • Markdown