Partage
  • Partager sur Facebook
  • Partager sur Twitter

Raccourcir le code

    3 septembre 2020 à 20:20:27

    Bonjour à tous j'ai fait un programme qui fonctionne mais je suis sur de pouvoir le racourcir sans savoir comment. Dans la consigne il dit de changer le ran() par le scanf_s mais du coup je ne comprends pas le nombreMystere ne sera plus aléatoire !?

    Et si vous pouviez me guider pour racourcir le programme. Merci d'avance !

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    	int main(int argc, char* argv[]) // equivalent de int main
    	{
    		const MIN = 1;
    		int nombreEntre = 0, nombreMystere = 0, compteurCoup = 0, recommencer = 0, MAX = 0, niveau = 0, nbJoueurs = 0;
    
    		printf("Quel niveau de difficultée choisissez vous ?\n 1 entre 1 et 100\n 2 entre 1 et 1000\n 3 entre 1 et 10000\n");
    		scanf_s("%d", &niveau);
    
    		switch (niveau)
    		{
    		case 1:
    			MAX = 100;
    		break;
    		case 2:
    			MAX = 1000;
    		break;
    		case 3:
    			MAX = 10000;
    		break;
    		}
    		printf("Tapez le nombre de joueurs (1 ou 2) ?\n");
    		scanf_s("%d", &nbJoueurs);
    			
    		if (nbJoueurs == 1)
    		{
    			do
    			{
    				do
    				{
    					srand(time(NULL));
    					nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
    					// On demande le nombre
    					printf("Quel est le nombre ? ");
    					scanf_s("%d", &nombreEntre);
    
    					// On compare le nombre entré avec le nombre mystère
    
    					if (nombreMystere > nombreEntre)
    						printf("C'est plus !\n\n");
    					else if (nombreMystere < nombreEntre)
    						printf("C'est moins !\n\n");
    					else
    						printf("Bravo, vous avez trouve le nombre mystere en %d coups!!!\n\n", compteurCoup);
    
    					compteurCoup++;
    
    				} while (nombreEntre != nombreMystere);
    
    				printf("Voulez vous recommencer ? \n Tapez 0 pour oui ou 1 pour arrêter \n");
    				scanf_s("%d", &recommencer);
    
    
    			} while (recommencer == 0);
    			printf("Merci d'avoir jouer\n");
    		}
    		else
    		{
    			
    			int nombreMystere = 0, nombreMystere1 = 0, nombreMystere2 = 0, nombreEntre1 = 0, nombreEntre2 = 0, compteurCoup1 = 0, compteurCoup2 = 0;
    			do
    			{
    				srand(time(NULL));
    					nombreMystere1 = (rand() % (MAX - MIN + 1)) + MIN;
    					nombreMystere2 = (rand() % (MAX - MIN + 1)) + MIN;
    				do
    				{
    					
    					// On demande le nombre
    					printf("Quel est le nombre (joueur1)? ");
    					scanf_s("%d", &nombreEntre1);
    					// On compare le nombre entré avec le nombre mystère
    
    					if (nombreMystere1 > nombreEntre1)
    						printf("C'est plus !\n\n");
    					else if (nombreMystere1 < nombreEntre1)
    						printf("C'est moins !\n\n");
    					else
    						printf("Bravo, joueur 1 vous avez trouve le nombre mystere en %d coups!!!\n\n", compteurCoup1);
    
    					compteurCoup1++;
    					
    				} while (nombreEntre1 != nombreMystere1);
    
    				do
    				{
    					// On demande le nombre
    					printf("Quel est le nombre (joueur2)? ");
    					scanf_s("%d", &nombreEntre2);
    					// On compare le nombre entré avec le nombre mystère
    					if (nombreMystere2 > nombreEntre2)
    						printf("C'est plus !\n\n");
    					else if (nombreMystere2 < nombreEntre2)
    						printf("C'est moins !\n\n");
    					else
    						printf("Bravo,joueur 2 vous avez trouve le nombre mystere en %d coups!!!\n\n", compteurCoup2);
    
    					compteurCoup2++;
    				} while (nombreEntre2 != nombreMystere2);
    
    				printf("Voulez vous recommencer ? \n Tapez 0 pour oui ou 1 pour arrêter \n");
    				scanf_s("%d", &recommencer);
    
    
    			} while (recommencer == 0);
    			printf("Merci d'avoir jouer\n");
    
    		}
    		return 0;
    	}



    • Partager sur Facebook
    • Partager sur Twitter
      3 septembre 2020 à 20:49:07

      Essaye de scinder ton code avec des fonctions
      • Partager sur Facebook
      • Partager sur Twitter
        3 septembre 2020 à 22:14:06

        Benjodubois a écrit:

        Dans la consigne il dit de changer le ran() par le scanf_s mais du coup je ne comprends pas le nombreMystere ne sera plus aléatoire !?

        Je suppose, que c'est pour le mode deux joueurs, car dans ce cas c'est un joueur qui saisie le nombre à chercher et l'autre qui doit le trouver.

        Entre parenthèses, il ne faut appeler srand qu'une seule fois lors de l’exécution du programme. 

        On voit bien qu'il y a du code qui se répète dans ton code, dans ce cas oui tu peux effectivement le raccourcir. Surtout qu'il se répète trois fois pour deux modes.

        -
        Edité par rouloude 3 septembre 2020 à 22:17:40

        • Partager sur Facebook
        • Partager sur Twitter
          4 septembre 2020 à 5:56:39

          noname51 a écrit:

          Essaye de scinder ton code avec des fonctions

          Oui merci, mais c'est le chapitre suivant du tuto que j'ai commencé du coup. Je vais essayé ça.


          Et merci rouloude je n'avais pas compris la consigne.



          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            4 septembre 2020 à 9:50:30

            salut,

            Raccourcir un programme n'est pas très important. La taille d'un programme influe seulement sur son poids sur le disque (et encore là on parle de quelques ko) et peut-être aussi sa rapidité à être lu par l'ordinateur (de presque rien). Concentre toi plutôt sur un code lisible qu'un code court car un code court n'est pas forcément lisible tandis qu'un code lisible est bien souvent court (je penses à des fonctions d'abstraction pour un lib).

            Quelques petits trucs pour améliorer la lisibilité de ton code :

            - "MAX" n'est pas un bon nom de variable, pour moi c'est soit une constante soit un define alors que MAX est ni const ni un define

            - Les booléens sont la vie ^^ (stdbool.h), cela donne plus de sens à "recommencer"

            Aussi fait attention avec scanf et ses cousins car si tu attends un %d et que l'utilisateur t'envoie un %s alors le programme plante. Il est bien de protéger ses inputs utilisateurs car comme dit dans le cours du zestedusavoir.com : "l'utilisateur est un idiot".

            • Partager sur Facebook
            • Partager sur Twitter
              4 septembre 2020 à 10:20:46

              Salut.

              Ta variable MIN n'a pas de type. Par défaut le compilateur va lui attribuer le type int. Ça tombe bien !

              • Partager sur Facebook
              • Partager sur Twitter
                4 septembre 2020 à 14:43:36

                Salut,

                pour commencer il faut savoir voir les choses simples. Ton switch ligne 13 peut tenir en une ligne :

                Si tu regardes bien, la valeur max est directement dépendante du niveau de difficulté, la base est 10 puis on ajoute autant de zéro que la difficulté choisie 1-> 10 0 ; 2-> 10 00 ; 3->10 000, facile d'en conclure que :

                max = 10* pow(10.0, niveau); //10* 10^niveau

                Ensuite, on n'écrit jamais 2 fois la même chose. Tu as écris 3 fois la même chose... Donc on écrit une fois du code et si quelque chose doit changer entre 2 boucles, alors tu as identifié une variable.

                Tables et boucles sont la solution.

                Comme l'a souligné Rouloude ton mode 2 joueurs ne répond pas aux instructions de l'exercice. Mais en guise d'indice, le nombre de joueur n'intervient que lors de la définition du nombre à trouver.

                Bonne continuation.

                • Partager sur Facebook
                • Partager sur Twitter

                Bonhomme !! | Jeu de plateforme : Prototype.

                  4 septembre 2020 à 17:23:21

                  Et si vous êtes maniaque de la performance:
                      int max=10;
                      for(int i=0; i<niveau; i++) max*=10;
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                    4 septembre 2020 à 18:06:11

                    PierrotLeFou a écrit:

                    Et si vous êtes maniaque de la performance:
                        int max=10;
                        for(int i=0; i<niveau; i++) max*=10;

                    Il n'y a pas lieu d'optimiser les performance ici. sinon je ferais plutôt :

                        int val[]={10, 100, 1000};    
                        int max = val[niveau-1];

                    avec niveau de 1 à 3


                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 septembre 2020 à 18:38:17

                      Merci pour toutes ces réponses constructives .

                      Me revoilà. J'ai beaucoup d'erreur de syntaxe dont certaine je n'arrive pas à debuger à commencer par le fin et certaine que l'on ne peux faire comme utiliser des fonctions dans des if. J'ai pas encore les connaissance pour faire autrement. Donc je vais continuer le cour mais j'aimerais avoir à nouveaux votre avis. D'avance merci.

                      #include <stdio.h>
                      #include <stdlib.h>
                      #include <time.h>
                      
                      nombreJoueurs(nbJoueurs)
                      {
                      	int  nbJoueurs = 0, joueurs = 0;
                      	printf("Tapez le nombre de joueurs (1 ou 2) ?\n");
                      	scanf_s("%d", &nbJoueurs);
                      
                      	if nbJoueurs == 1
                      		 joueurs = 1;
                      	if nbJoueurs == 2
                      		joueurs = 2;
                      	return joueurs;
                      }
                      
                      int main(int argc, char* argv[]) // equivalent de int main
                      {
                      	const int MIN = 1;
                      	int nombreEntre = 0, compteurCoup = 0, recommencer = 0, max = 0, niveau = 0;
                      
                      	printf("Quel niveau de difficultée choisissez vous ?\n 1 entre 1 et 100\n 2 entre 1 et 1000\n 3 entre 1 et 10000\n");
                      	scanf_s("%d", &niveau);
                      
                      	switch (niveau)
                      	{
                      	case 1:
                      		max = 100;
                      		break;
                      	case 2:
                      		max = 1000;
                      		break;
                      	case 3:
                      		max = 10000;
                      		break;
                      	}
                      	do (nombreJoueurs() == 1 || nombreJoueurs() == 2)
                      	{
                      		int nombreMystere = 0,
                      			srand(time(NULL));
                      			nombreMystere = (rand() % (max - MIN + 1)) + MIN;
                      	}while (nombreJoueurs() != 1 || nombreJoueurs() != 2);
                      
                      	if (nombreJoueurs() == 1 || nombreJoueurs() == 2)
                      	{
                      		do
                      		{
                      			// On demande le nombre
                      			printf("Quel est le nombre ? ");
                      			scanf_s("%d", &nombreEntre);
                      
                      			// 1 joueur
                      
                      			if (nombreJoueurs() == 1 || nombreMystere > nombreEntre)
                      				printf("C'est plus !\n\n");
                      			else if (nombreMystere < nombreEntre)
                      				printf("C'est moins !\n\n");
                      			else
                      				printf("Bravo, vous avez trouve le nombre mystere en %d coups!!!\n\n", compteurCoup);
                      			compteurCoup++;
                      			//2 joueurs
                      			for (nombreJoueurs() = 0, nombreJoueurs() = 2, nombreJoueurs()++);
                      			{
                      				printf("nombreJoueurs()");
                      				if (nombreMystere > nombreEntre;)
                      					printf("C'est plus !\n\n");
                      				else if (nombreMystere < nombreEntre)
                      					printf("C'est moins !\n\n");
                      				else
                      					printf("Bravo, vous avez trouve le nombre mystere en %d coups!!!\n\n", compteurCoup);
                      				compteurCoup++;
                      			}
                      			printf("Voulez vous recommencer ? \n Tapez 0 pour oui ou 1 pour arrêter \n");
                      			scanf_s("%d", &recommencer);
                      		} while (recommencer == 0);
                      		printf("Merci d'avoir jouer\n");
                      	}
                      	return 0;
                      }




                      -
                      Edité par Benjodubois 5 septembre 2020 à 10:37:50

                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 septembre 2020 à 10:55:59

                        Re bonjour j'ai fait un imprim écran pour le debugage car je ne comprends les 2 premières (dernière) erreurs. Si vous pouviez m'aider... Merci

                        -
                        Edité par Benjodubois 6 septembre 2020 à 10:58:03

                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 septembre 2020 à 11:13:09

                          Benjodubois a écrit:

                          Re bonjour j'ai fait un imprim écran pour le debugage car je ne comprends les 2 premières (dernière) erreurs. Si vous pouviez m'aider... 

                          2 premières (dernière) ? premières ou dernières, faut savoir ! Normalement il faut les prendre dans l'ordre, car la première peut provoquer le signalement d'erreur suivante qui n'en sont pas.

                          Tu as essayé de faire une fonction, il faudrait tout de même regarder le cours a ce sujet, car il y a des règles pour écrire une fonction. Elle doivent avoir un type de retour, ses paramètres doivent aussi avoir un type 

                          int nombreJoueurs(int nbJoueurs)
                          { 
                          //...

                          aussi, le paramètre fait parti des variables locale à la fonction, tu ne peux donc pas déclarer une variable du même nom que le paramètre.

                          Dans le cas de ta fonction, le paramètre est inutile car tu désir juste que la fonction te retourne le nombre de joueur que tu as saisie.

                          De plus tu te complique la vie avec tes if pour retourner le nombre de joueurs. tu peux le retourner directement. Tu peux éventuellement faire une boucle avec un test si tu veux limiter le nombre de joueur.

                          (Je n'ai pas regardé la fonction main)

                          -
                          Edité par rouloude 6 septembre 2020 à 11:15:56

                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 septembre 2020 à 11:41:43

                            Salut,

                            Visiblement tu compiles en C++, changes l'extension en .c.

                            Apres tu fait des erreurs entre virgule et point-virgule (genre ligne 40). Pour la ligne 38 la syntaxe du do...while est à revoir.

                            Mais si on oublie la syntaxe il ne faut pas que tu appelles la fonction pour avoir le nombre de joueur plusieurs fois par partie, tu l'appelles une fois et tu stocke le resultat dans une variable (int nbDeJoueur = nombreJoueurs() ) puis tu utilises la variable.

                            Mais ne te force pas à utiliser des fonctions si tu ne sais pas faire.

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              6 septembre 2020 à 12:22:49

                              Salut,

                              Il serait bien de se mettre au booléen assez rapidement. Quand je lis :

                              while(recommencer == 0);

                              Pour moi "recommencer" est un nombre alors que son nom traduit un état, ça n'a aucun sens. Avec un booléen c'est tout de suite plus claire (ou énum si l'état n'est pas binaire) :

                              while(recommencer == false);
                              // ou encore plus rapide
                              while(!recommencer);

                              Tout de suite on comprend l'utilité de cette variable : elle marque un état et ne stocke pas un nombre.


                              • Partager sur Facebook
                              • Partager sur Twitter
                                6 septembre 2020 à 18:58:03

                                Le pire est que ça fonctionne avec des int même si ça n'est pas recommandé.
                                    int recommencer = 0;
                                    ...
                                    while(! recommencer);
                                Je pourrais ajouter qu'il est préférable de choisir le nom de la variable et l'état de sorte que l'on n'ait pas besoin de faire la négation.
                                Par exemple dans le cas présent:
                                    bool terminer = true;
                                    ...
                                    while(terminer);
                                Me semble mieux.
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Le Tout est souvent plus grand que la somme de ses parties.

                                  6 septembre 2020 à 20:16:26

                                  Le PO débute, il n'a peut-être pas encore vu les booléen ! Quand on débute on ne peut pas tout voir en même temps ! Comme on dit : chaque chose en son temps !
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Anonyme
                                    6 septembre 2020 à 22:17:48

                                    rouloude a écrit:

                                    Le PO débute, il n'a peut-être pas encore vu les booléen ! Quand on débute on ne peut pas tout voir en même temps ! Comme on dit : chaque chose en son temps !

                                    C'est la base... C'est même pas propre au langage, c'est de l'algorithmie !
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      7 septembre 2020 à 1:35:55

                                      Je connais peu de gens qui font de l'algorithmie de façon systématique sans écrire une seule ligne de code.
                                      On commence par des algorithmes simples et on essaie de les coder.
                                      Au fur et à mesure qu'on se sent à l'aise avec un langage, on essaie avec d'autres algorithmes.
                                      Je ne me rappelle pas à quel moment de nos études on apprend l'algèbre de Boole.
                                      Moi, je l'ai appris à l'adolescence en faisant un peu d'électronique de façon théorique.
                                      (tous les chemins mènent à Rome ...)
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Le Tout est souvent plus grand que la somme de ses parties.

                                        7 septembre 2020 à 5:46:21

                                        Salut,

                                        L'algèbre de Boole, ça se fait en seconde pour les options TSA.

                                        Après, il n'y a pas de quoi faire une fixette sur les booléens. Ils sont d'ailleurs devenus plutôt handicapants dans certains langages pour lesquels il valent absolument false ou true plutôt que 0 et pas 0.

                                        Le type des variables n'a rien à voir avec l'algorithmie qui est un raisonnement à suivre, pas une méthode.

                                        Si je fais :

                                        int toto = getTotoFromUser(),
                                            value;
                                        
                                        if (toto)
                                         value = 25;
                                        else
                                         value = 0;

                                        C'est la même chose que :

                                        bool toto = getTotoFromUser();
                                        int value = toto * 25;

                                        Même algo, différente méthode. toto pourrait tout aussi bien être un char ou un int_64 dans le premier cas, dans le second il DOIT être un bool ou un numérique dans [0,1].

                                        Certains langages refusent le produit d'un booléen et d'un numérique.

                                        Bonne continuation.


                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Bonhomme !! | Jeu de plateforme : Prototype.

                                        Raccourcir le code

                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                        • Editeur
                                        • Markdown