đź•’ : 3 h maximum

Prérequis:

  • cours gcc, gdb
  • gestion des fichiers sous linux
  • utilisation de vi
  • lib stdio.h (printf)
  • rand() fonction de gĂ©nĂ©ration pseudo alĂ©atoire
  • srand() injection d’une graine pour rand
  • division entière et reste , modulo


But:

  • prise en main de la chaĂ®ne de compilation pour faire du c ansi avec GCC
  • Afficher un caractère (char)
  • Afficher une chaĂ®ne de caractère (string)
  • utilisation de gdb , pas Ă  pas .
  • Afficher une valeur entière et comprendre les limites des variables (char, int , long )
  • rĂ©aliser un jeu de hasard , pseudo alĂ©atoire
  • envoyer une archive des codes au format tar


Répertoire du travail:

~/Works/TP1_C

pour vous donner une idée du travail à la fin

etudiant@ordi:~/Works$ tree TP1_C/
TP1_C
├── double
│   ├── double
│   └── double.c
├── heure
│   ├── heure
│   └── heure.c
├── jeucube
│   ├── jeucube
│   └── jeucube.c
├── jour
│   ├── jour
│   └── jour.c
├── rand
│   ├── avecgraine
│   │   ├── rand
│   │   └── rand.c
│   └── sansgraine
│       ├── rand
│       └── rand.c
└── time
    ├── time
    └── time.c

9 directories, 14 files
etudiant@ordi:~/Works$

Dé numérique

un dĂ© permet de jouer , car on considère qu’on obtient un tirage au sort d’une valeur entre 1 et 6 avec un dĂ©s cubique.

le temps

le temps change en permanence , le temps de lire ceci le temps s’Ă©coule..

votre ordinateur possède une notion du temps qui s’Ă©coule !

la fonction time(NULL) nous donne le nombre de secondes écoulées depuis le 1er janvier 1970

Répertoire time / Source : time.c

time.c

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

/* Programme qui affiche le temps actuel en secondes depuis 1er janvier 1970 */

int main()
{
time_t temps;
        temps = time(NULL);
        printf("Temps actuel (secondes depuis 1970) : %ld\n", temps);
return EXIT_SUCCESS;
}

tester le ! plusieurs fois et expliquer.

le nombre de jour(s) depuis le 1er Janvier 1970

Répertoire : jour / Source: jour.c

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

/* Programme qui calcule le nombre de jours écoulés depuis 1er janvier 1970 */

int main()
{
    time_t secondes;
    long secondes_par_jour;
    long jours;

    secondes = time(NULL); /* secondes depuis Epoch */

    /* Calcul d’un jour en secondes : 24 heures × 60 minutes × 60 secondes */
    secondes_par_jour = 24 * 60 * 60;

    /* Conversion en jours entiers */
    jours = secondes / secondes_par_jour;

    printf("Secondes depuis le 1er janvier 1970 : %ld\n", secondes);
    printf("Un jour contient : %ld secondes\n", secondes_par_jour);
    printf("Nombre de jours écoulés : %ld\n", jours);

    return EXIT_SUCCESS;
}

Expliquer le code et le calcul .

donner le nombre d’heure(s) Ă©coulĂ©e(s) depuis 1er janvier 1970

donner un code c

Répertoire: heure / Source: heure.c

Le hasard

la fonction rand()

Pseudo alĂ©atoire vu en cours ou pas (Ă  rĂ©clamer en cours si vous n’avez pas compris après le tp)

dans des répertoires rand et avecgraine et sansgraine (voir arborescence )

sans graine (pseudo aléatoire)

rand.c: (de sansgraine)

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

int main()
{
    printf("Tirages sans srand() :\n");
    printf("%d %d %d %d %d\n", rand(), rand(), rand(), rand(), rand());
    return EXIT_SUCCESS;
}

Exécuter plusieurs fois ce code et expliquer !

vous devez obtenir
etudiant@ordi:~/Works/TP1_C/rand/sansgraine$ vi rand.c
etudiant@ordi:~/Works/TP1_C/rand/sansgraine$ gcc rand.c -o rand -Wall -pedantic -ansi -g                                                                                   
etudiant@ordi:~/Works/TP1_C/rand/sansgraine$ ./rand
Tirages sans srand() :
1957747793 1714636915 1681692777 846930886 1804289383
etudiant@ordi:~/Works/TP1_C/rand/sansgraine$ ./rand
Tirages sans srand() :
1957747793 1714636915 1681692777 846930886 1804289383
etudiant@ordi:~/Works/TP1_C/rand/sansgraine$ ./rand
Tirages sans srand() :
1957747793 1714636915 1681692777 846930886 1804289383
etudiant@ordi:~/Works/TP1_C/rand/sansgraine$

on va ajouter notre graine avec srand (seed , graine en anglais)

srand permet d’initialiser le gĂ©nĂ©rateur de hasard pseudo alĂ©atoire.

dans le répertoire avecgraine

rand.c:

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

int main()
{
    srand(time(NULL)); /* Initialisation de la graine */

    printf("Tirages avec srand(time(NULL)) :\n");
    printf("%d %d %d %d %d\n", rand(), rand(), rand(), rand(), rand());

    return EXIT_SUCCESS;
}

tester plusieurs fois ce code , alors quelle est la différence.

trouver la valeur de RAND_MAX

on la retrouve dans le fichier /usr/include/stdlib.h

on peut faire une recherche dans le fichier avec un grep

cat /usr/include/stdlib.h | grep RAND_MAX

le dé cubique final

le jeu de DĂ© simple

dans un répertoire jeucube

jeucube.c:

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

/* Simulation d’un lancer de dé à 6 faces */

int main()
{
    int lancer;

    srand(time(NULL)); /* Initialisation de la graine */

    lancer = 1 + rand() % 6;

    printf("Lancer de dé : %d\n", lancer);

    return EXIT_SUCCESS;
}

Expliquer et tester ce code.

Expliquer la fonction mathématique lancer

lancer = 1 + rand() % 6;

Le jeu de DĂ© double (validation)

proposer dans un répertoire double un code c double.c

Donnant un tirage de 2 Dés .

Tester et valider votre code , commentez le bien.

Avec Monia donner les algorithmes et les PL des codes précèdents.

Faire une archive TP1_C.tar

Réaliser une archive de vos codes au format tar

Et envoyer votre PDF (compte rendu à coté de votre archive TP1_C.tar

Je vous conseil de tester votre archive .. pour bien comprendre la notion d’archive

Ne pas oublier de sauvegarder Works sur Linux3!