« Exercices en langage C/Fonctions » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
m A supprimé la protection de « Exercices en langage C/Fonctions » : Robot : Suppression de la protection d’une liste de fichiers
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
Ligne 14 : Ligne 14 :
=== Solution proposée ===
=== Solution proposée ===
<div style="width:100%">{{Boîte déroulante|titre=Solution proposée|contenu =
<div style="width:100%">{{Boîte déroulante|titre=Solution proposée|contenu =
<source lang="c">
<syntaxhighlight lang="c">
/**
/**
* Programme . : majuscule
* Programme . : majuscule
Ligne 39 : Ligne 39 :
return EXIT_SUCCESS;
return EXIT_SUCCESS;
}
}
</syntaxhighlight>
</source>
}} </div>
}} </div>


Ligne 60 : Ligne 60 :
===Éléments fournis===
===Éléments fournis===
<div style="width:100%">{{Boîte déroulante|titre=lire_ligne.c à compléter|contenu =
<div style="width:100%">{{Boîte déroulante|titre=lire_ligne.c à compléter|contenu =
<source lang="c">
<syntaxhighlight lang="c">
/**
/**
* Fonction .. : lire_ligne
* Fonction .. : lire_ligne
Ligne 117 : Ligne 117 :
// Fin partie à compléter...
// Fin partie à compléter...
} // char *lire_ligne(...
} // char *lire_ligne(...
</syntaxhighlight>
</source>
}} </div>
}} </div>


<div style="width:100%">{{Boîte déroulante|titre=lire_ligne.h|contenu =
<div style="width:100%">{{Boîte déroulante|titre=lire_ligne.h|contenu =
<source lang="c">
<syntaxhighlight lang="c">
/*
/*
* Nom .... : lire_ligne.h
* Nom .... : lire_ligne.h
Ligne 153 : Ligne 153 :


#endif
#endif
</syntaxhighlight>
</source>
}} </div>
}} </div>


<div style="width:100%">{{Boîte déroulante|titre=main_lire_ligne.c|contenu =
<div style="width:100%">{{Boîte déroulante|titre=main_lire_ligne.c|contenu =
<source lang="c">
<syntaxhighlight lang="c">
/*
/*
* Nom ......... : main_lire_ligne.c
* Nom ......... : main_lire_ligne.c
Ligne 246 : Ligne 246 :
return EXIT_SUCCESS;
return EXIT_SUCCESS;
} // int main(void)
} // int main(void)
</syntaxhighlight>
</source>
}} </div>
}} </div>


Ligne 262 : Ligne 262 :
===Solution proposée===
===Solution proposée===
<div style="width:100%">{{Boîte déroulante|titre=Voir la solution|contenu =
<div style="width:100%">{{Boîte déroulante|titre=Voir la solution|contenu =
<source lang="c">
<syntaxhighlight lang="c">
/**
/**
* Fonction .. : lire_ligne
* Fonction .. : lire_ligne
Ligne 395 : Ligne 395 :
return chaineRetour;
return chaineRetour;
} // char *lire_ligne(...
} // char *lire_ligne(...
</syntaxhighlight>
</source>
}} </div>
}} </div>


Ligne 417 : Ligne 417 :
===Solution proposée===
===Solution proposée===
<div style="width:100%">{{Boîte déroulante|titre=Voir la solution|contenu =
<div style="width:100%">{{Boîte déroulante|titre=Voir la solution|contenu =
<source lang="c">
<syntaxhighlight lang="c">
/*
/*
Nom : verifrand.c
Nom : verifrand.c
Ligne 495 : Ligne 495 :
return EXIT_SUCCESS;
return EXIT_SUCCESS;
} // int main(void)
} // int main(void)
</syntaxhighlight>
</source>


'''Résultats obtenus :'''
'''Résultats obtenus :'''

Version du 16 avril 2020 à 09:38

Ces exercices concernent l'utilisation des fonctions de la bibliothèque standard du langage C.

Filtre qui passe le texte en majuscule

Problème à résoudre

Ecrivez un programme majuscule.c qui lit des données sur le flux stdin et écrits sur stdout après avoir transformé les caractères lus en majuscules. Vous utiliserez les fonctions getchar, putchar (stdio.h) et toupper (ctype.h).

Vous testerez votre programme en lui faisant convertir son propre fichier source majuscule.c.

majuscule.exe < majuscule.c

Solution proposée

Lire une ligne longue avec fgets

Problème à résoudre

La fonction fgets de la bibliothèque standard du langage C permet de lire une chaine de caractère de longueur limitée dans un flux.

Vous allez compléter une fonction lire_ligne répondant au spécifications suivantes :

  • Retour d'une ligne lue dans un flux texte passé en paramètre.
  • Vous éliminerez les caractères de saut de ligne lus.
  • La longueur des lignes lues n'est pas limitée.
  • Contrôle des paramètres et retour des codes d'erreurs systèmes, détection de la fin du fichier.
  • Vous utiliserez au maximum les fonctions de la bibliothèque standard du langage C : allocation mémoire, chaines de caractères...
  • Son prototype est donné par lire_ligne.h.
  • Vous utiliserez le programme de main_lire_ligne.c pour lire_ligne.
  • Vous devrez traiter le fichier test_lire_ligne.txt fourni.
  • Les instructions de compilation et d'édition de lien sont dans les commentaires des fichiers fournis.

Éléments fournis

Solution proposée

Remarques sur l'exercice

  • Le test des paramètres dans la solution est expéditif.
  • Pour obtenir des programmes robustes, le langage C oblige à une gestion pénible des erreurs. Avec le langage Java par exemple, les mécanismes d'exception facilitent la tâche du programmeur.
  • L'utilisation de l'allocation dynamique de mémoire est risquée : fuite mémoire. Avec le langage Java par exemple, le ramasse miettes (Garbage collector) se charge de la libération de la mémoire.
  • En Java des classes comme String et StringBuffer prennent en charge les chaines de caractères longues.

Test d'un générateur de nombre aléatoire

Problème à résoudre

La bibliothèque standard du langage C offre au programmeur plusieurs fonctions pour générer des nombres aléatoires. La plus connue est rand().

Vous allez écrire un programme verifrand.c qui estime la répartition des nombres aléatoires générés : moyenne et dispersion. Nous allons traiter l'ensemble des nombres générés comme une série discrète regroupée.

  1. Générez 1 million (NB_TIRAGE) notes (xi) entre 0 et 20 (N) comprises (NB_NOTE = 21) à l'aide de la fonction rand().
  2. Répartissez-les dans le tableau effectif (n) où ni représente l'effectif (nombre d'occurrences cumulées) de la note xi.
  3. calculez et affichez la moyenne arithmétique :
  4. calculez et affichez l'écart moyen de la série :

Solution proposée

Remarques sur l'exercice

  • La série générée avec rand() sur ma machine est bien centrée sur la moyenne théorique 10/20 : les nombres de notes en dessous et au dessus de 10 sont quasi-identiques. L'écart moyen de la série est proche de 5 ce qui indique que les notes sont bien réparties.
  • La fonction rand() est pseudo-aléatoire : deux exécutions du programme donnent exactement la même série de note.
  • Vous pouvez tester d'autres fonctions comme random() ou arc4random(). Cette dernière, de qualité cryptographique, utilise l'algorithme nommé ARC4. Elle est aléatoire.