đź•’ : 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!

