🕒 : 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!

