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
28 septembre 2019 à 0:45:26

Bonjours je m'appelle flo, je commence dans le domaine est sur les cours.

Je suis aussi sur ce TP mais la si on peut me dire comment tu arrive a la ligne 99 sans que le programme n'affiche rien ???

Sur sa première capture!!!

intmenuD(intchoix1)               // Fonction Premier Menu choix du niveau

C' est le int sans parenthèse qui renvoie au choix 1?

Pk ça lis pas le premier switch ni le do ni les 2 autre? 

Je comprend pas le sens de la boucle!!!!!

merci beaucoup a ceux qui pourront  m’éclaire.

  • Partager sur Facebook
  • Partager sur Twitter
28 septembre 2019 à 13:19:38

Bonjour ! Est-ce que tu as vu la notion de fonction ? (Ta question suggère que non, et si tu n'as pas vu cette notion, il est normal que tu ne comprennes pas tout ça.)
  • Partager sur Facebook
  • Partager sur Twitter
28 septembre 2019 à 20:14:16

Bonjours, oui je te remercie je l'avais vue mais pas très bien comprise.

La tout est plus claire.

Si possible j'aimerais savoir si il y a un autre cours a la suite pour progresser sur le langage C je n'ai rien trouver sur le site.

Je ne sais pas par ou poursuivre pour progresser dans ce langage merci beaucoup.

  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2019 à 9:01:52

Pour progresser il faut pratiquer. Travailler sur ses propres projets.

-
Edité par michelbillaud 29 septembre 2019 à 10:58:49

  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2019 à 10:56:36

Donc tu dis avoir vu la notion de fonction, tu dis que tu es allé au bout du cours, et pourtant tu n'arrivais pas à comprendre le code au dessus ?

A mon avis avant de passer "à la suite" tu devrais reprendre un ou plusieurs TP du cours.

Ou te faire ton propre projet.

Si tu es vraiment allé jusqu'au bout du tutoriel C (ce qui inclut la SDL), tu peux te faire ton propre jeu en 2D.

Si, en fait, tu n'as jamais pratiqué jusque là et que tu n'as fait que "lire" sans vraiment toucher au code, je te conseille vivement de coder les TPs du cours par toi même.

  • Partager sur Facebook
  • Partager sur Twitter