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