Security-X

Forum Security-X => Programmation => Cours => Discussion démarrée par: igor51 le juillet 18, 2012, 21:51:09

Titre: Notre premier programme
Posté par: igor51 le juillet 18, 2012, 21:51:09
Codons maintenant notre premier programme !

On va faire le "jeu" du plus ou moins : celui-ci consiste à choisir aléatoirement un nombre entre un minimum et un maximum et à demander à l'utilisateur de taper un nombre jusqu'à qu'il trouve celui sélectionné (en lui donnant des indices).
Ce jeu a sûrement un vrai nom mais je ne le connais pas. Pour cela, comme il va y avoir un interaction avec l'utilisateur, on va utiliser la fonction scanf(), qui permet de donner la main à l'utilisateur et de lire ce que tape ce dernier au clavier.
Voir son descriptif ici (http://www.cplusplus.com/reference/clibrary/cstdio/scanf/).

L'idée du programme : le programme choisit un entier entre 0 et 100 et l'utilisateur doit le trouver en moins de coups possibles. Le programme n'a que 3 réponses possibles :  plus, moins ou ok.

Avant de partir sur le code, réfléchissons à l'algorithme que l'on va utiliser. Il y a plusieurs écoles, je vous propose une solution : à vous de trouver mieux si vous le désirer.

On a besoin d'au moins 3 entiers : le nombre choisi par le programme, le nombre de l'utilisateur et un compteur. Comme on a vu que des choses simples, je mettrai en plus un entier qui fera office de booléen : 1 si l'utilisateur a trouvé, 0 sinon.

int compteur=0;
        int entier_programme = 0;
        int entier_utilisateur = 0;
        int boolean = 0;

Ensuite  on doit choisir un entier. Pour cela on utilisera la fonction rand() et la fonction modulo notée %. On l'utilisera de cette manière :

  entier_programme  = rand()%100;
Cela signifie que l'on prend le reste entier dans la division euclidienne du nombre renvoyé par rand() divisé par 100. Comme vous pouvez le voir dans le manuel (http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/rand.3.html) de rand() : pour initialiser notre générateur, il faut utiliser srand() avec un paramètre. Nous utiliserons time (NULL) pour spécifier que nous l'initialisation au début du monde : le 1 er janvier 1970. Si on ne le fait pas, notre valeur risque de ne jamais changer.

D'ailleurs, on peut noter que pour utiliser ces fonctions, il nous faut inclure stdlib.h comme ceci : #include <stdlib.h>.

Puis, pour dialoguer avec l'utilisateur, nous utiliserons le couple printf() pour afficher un message à l'écran et scan() pour récupérer la valeur.

printf("Entrer une valeur : \n');

scanf("%i", &entier_utilisateur);
Pourquoi est-ce qu'il y a un "&" devant entier_utilisateur ? Vous le comprendrez mieux avec l'explication sur les pointeurs, mais ici il faut placer la valeur entrée par l'utilisateur dans la case mémoire de la variable. On se sert donc de l'adresse (référence de la variable) pour savoir où stocker la donnée. Je ne m'étends pas sur ce sujet pour l'instant, on y reviendra.

Donc on a tout ce qu'il faut pour faire notre programme. Un peu d'algo :

Tant que boolean est égal à 0 alors

  - Demandez et récupérez une valeur à l'utilisateur.
  - La comparer avec la valeur de notre programme:
      - Afficher le bon message.
      - Modifier le booléan en cas de succès.

fin du tant que


Résultat :

#include <stdio.h>
#include <stdlib.h>

int main()
{

// Declaration des variables
        int compteur=0;
        int entier_programme = 0;
        int entier_utilisateur = 0;
        int boolean = 0;


// Initialisation du generateur de nb aleatoire
        srand(time(NULL));
        entier_programme = rand() % 100;

        while( boolean != 1 )
        {
                printf("Entrer un entier : \n");
                scanf("%i",&entier_utilisateur);

                if(entier_utilisateur < entier_programme)
                {
                        printf("Plus \n");
                }
                else
                {
                        if( entier_utilisateur > entier_programme)
                        {
                                printf("Moins \n");
                        }
                        else
                        {
                        // Ce n'est ni plus grand ni plus petit, c'est donc egale
                                printf("Congratz !\n");
                                boolean = 1;
                        }
                }

        }
        printf("Entier a trouver : %i \n", entier_programme);


        return 1;
}
Titre: Re : Notre premier programme
Posté par: igor51 le juillet 18, 2012, 21:51:31
Retour sur le programme précédent.

Les commentaires se marquent de 2 façons :
//  pour commenter une ligne
/*
balba
*/
/* [] */ permet de commenter plusieurs lignes.

Comme vous pouvez le voir, on peut "entasser"  les if..else  pour tester plusieurs cas les uns à la suite des autres.  Cela permet d'éviter des tests pour rien.

On peut aussi proposer cette solution, mais le programme va faire chaque "if" alors qu'un else..if ou else n'est exécuté que si la condition précédente renvoie FAUX.

#include <stdio.h>
#include <stdlib.h>

int main()
{

        // Declaration des variables
        int compteur = 0;
        int entier_programme = 0;
        int entier_utilisateur = 0;
        int boolean = 0;


        // Initialisation du generateur de nb aleatoire
        srand(time(NULL));
        entier_programme = rand() % 100;

        while( boolean != 1 )
        {
                printf("Entrer un entier : \n");
                scanf("%i",&entier_utilisateur);

                if(entier_utilisateur < entier_programme)
                {
                        printf("Plus \n");
                }

                if( entier_utilisateur > entier_programme)
                {
                        printf("Moins \n");
                }

                if( entier_utilisateur ==  entier_programme)
                {
                        printf("Congratz !\n");
                        boolean = 1;
                }
        }

        printf("Entier a trouve : %i \n", entier_programme);


        return 1;
}