TD3 - Variables et Fonctions

Les entrées/sorties

Durée : 1h30

Objectifs :

  • Manipuler des fonctions/procédures en C
  • Connaître la différences entre une variable globale ou locale
  • Se servir du mot clé STATIC
  • Réaliser des tests de fonctions/procédures
  • Utiliser la sortie d’erreur
  • Mettre en place de la compilation conditionnelle

Attention :

À chaque étape de programmation, vous devez vérifier si le programme :

  • Compile sans warning
  • Obtient les résultats attendus
  • Avant de coder, il faut écrire un algo avec un papier et un stylo !

Rappels

Pour compiler un programme, on utilise l’instruction suivante :

gcc -Wall exo.c -o nomExecutable

Pour executer un programme, on utilise l’instruction suivante :

./nomExecutable

Exercice 1 : La Saisie

Nous considérons l’algorithme suivant :

PROGRAMME LaRacine
VARIABLES :
    res,x: reel
DEBUT
    ECRIRE ("Veuillez saisir un reel : ")
    LIRE(x)
    res <- calculRacine(x)
    ECRIRE ("La racine de +" x + "  est : " +res)

FIN
  1. Traduisez cet algorithme en C
  2. Ecrire la fonction calculRacine qui souléve une assertion si x est inférieur ou égal à zéro

Exercice 2 : La portée des variables

On souhaite connaître le nombre de connexion à un service.

Créer une fonction qui simule des connexions à un service, qui affiche le nom de la personne connectée, qui compte le nombre de connexion et affiche le calcul.

/* Auteur : ... */
/* Date :  ... */
/* Résumé :  Créer une fonction qui simule des connexions à un service, qui affiche le nom de la personne connectée, qui compte le nombre de connexion et affiche le calcul */
/* Entrée(s) :  Le nom de la personne connectée */
/* Sortie(s) :  affiche le nom de la personne passée en paramètre et le nombre de connexion */
void connexionUtilisateur(char nom[50]);

Exercice 3 : Directives microprocesseurs

Nous considérons le programme suivant :

PROGRAMME ClassementATP
VARIABLES
    nbJoueurs,anneeNaissance,ptsATP : entier
    nom,prenom : chaine de caractères
DEBUT
    ECRIRE("Combien de joueur voulez vous créer ?")
    LIRE (nbJoueurs);
    POUR i allant de 0 à nbJoueurs FAIRE
        ECRIRE ("nom :")
        LIRE (nom)
        ECRIRE ("prenom :")
        LIRE (prenom)
        ECRIRE ("Annee de naissance :")
        LIRE (anneeNaissance)
        ECRIRE ("PointsATP :")
        LIRE (ptsATP)
        ECRIRE("Le joueur a "+ AGE(anneeNaissance))
    FIN POUR
FIN
  1. Codez l’algorithme ClassementATP.
  2. Définir une macro permettant de connaître l’age d’un joueur
  3. Ajouter une directive de compilation conditionnelle permettant d’afficher le joueur saisie.

Exercice 4 : Approximation de PI

  1. Écrire une fonction permettant de calculer l’aproximation de \(\pi\) selon la méthode de Leibniz en utilisant le critére d’arrêt par nombre d’étapes.
/* Auteur : ... */
/* Date :  ... */
/* Résumé :  fonction permettant de calculer l'aproximation de pi selon la méthode de Leibniz en utilisant le critére d'arrêt par nombre d'étape */
/* Entrée(s) :  Le nombre d'étape que l'on souhaite réaliser */
/* Sortie(s) :  Le réel de l'approximation de pi */
double approximationPiNbEtape(int nbEtape);

Leibniz

  \(\pi\) = 4 \(\times\) (\(\frac{1}{1}\) - \(\frac{1}{3}\) + \(\frac{1}{5}\) - \(\frac{1}{7}\) + …)

Astuce pour alterner entre positif et négatif

On peut utiliser la puissance de (-1) sur l’itérateur i.

  • pour les valeurs de i paire la puissance  \(-1^i\)  donnera un 1
  • pour les valeurs de i impaire la puissance  \(-1^i\)  donnera un -1

On pourra donc alterner et respecter la formule d’approximation.

Comment calculer la puissance en C ?

Attention

  • Il faut importer la bibliothèque math.h
#include <stdio.h>
#include <stdlib.h>

#include <math.h>

/* exo 6 :  Approximation de PI */
int main(){
    return 0;
}
  • À la compilation, il faut rajouter l’extension lm
gcc -Wall exo6.c -o exo6 -lm
  • Dans le code, il faut utiliser l’instruction pow(leNombre,àLaPuissance)
#include <stdio.h>
#include <stdlib.h>

#include <math.h>

/* exo 6 :  Approximation de PI */
int main(){
    int nb;
    nb= pow(4,2); /* 4 à la puissance 2 */
    return 0;
}
  1. Écrire une fonction permettant de calculer l’aproximation de \(\pi\) selon la méthode de statistique.
/* Auteur : ... */
/* Date :  ... */
/* Résumé :  fonction permettant de calculer l'aproximation de pi selon la méthode de statistique en utilisant */
/* Entrée(s) :  Le nombre de points que l'on souhaite utiliser */
/* Sortie(s) :  Le réel de l'approximation de pi */
double approximationPiMethodeStat(int nbPoints);

Explication de la méthode statistique

Traçons un carré dont le demi-côté mesure une unité et inscrivons y un cercle de rayon unitaire. La surface du carré est de 4 et celle du cercle est de π. Si on choisi au hasard un point dans le carré, la probabilité qu’il se trouve dans le cercle est de  \(\frac{\pi}{4}\) . Et par conséquent, en recommençant de plus en plus souvent le choix aléatoire d’un point du carré, le rapport entre le nombre de points se trouvant dans le cercle (dont la distance à l’origine est inférieure à 1) et le nombre de points choisis doit s’approcher de π.

Comment faire de l’aléatoire en C ?

  • Il faut importer la bibliothèque time.h
#include <stdio.h>
#include <stdlib.h>

#include <time.h>
  • Il faut initialiser la “GRAINE” et le faire UNE SEULE ET UNIQUE FOIS dans le programme principal. L’instruction est la suivante : srand(time(NULL));. Si on ne met pas cette instruction, une fois, alors le nombre aléatoire généré sera toujours le même.
int main(){

    srand(time(NULL));

    return 0;
}
  • Pour générer un nombre aléatoire, l’instruction est la suivante :
    int a = rand() % 5; /* génération d'un entier aléatoire entre 0 et 5 */
    double x = (rand()/(double)  RAND_MAX * 2.0 - 1.0);     /* génération d'un réél aléatoire entre -1 et 1.*/

Exercice 5 : Le triangle

  1. Créer une procédure qui prend en entrée un entier n positif, représentant un nombre de ligne et affiche le triangle correspondant.
/* Auteur : ... */
/* Date :  ... */
/* Résumé : Procédure permettant d'afficher un triangle de taille n */
/* Entrée(s) :  La taille du triangle */
/* Sortie(s) :  aucunes  */
void triangle(int n);
  1. Écrire le programme principal qui demande à l’utilisateur de saisir un nombre de ligne.