INFO517 : Programmation C

De Wiki du LAMA (UMR 5127)
Révision datée du 23 septembre 2008 à 15:14 par Lvaux (discussion | contributions) (Références piquées à INFO719)
Aller à la navigation Aller à la recherche

Cours du semestre 5 de la license STIC INFO.

Responsable pour 2008--2009: Lionel Vaux.

Pensez à consulter les indications pour compiler un petit programme sur une machine des salles de TP.

Fonctionnement

Cet enseignement comprendra 10 séances de cours/TD (1h30) et 3 séances de TP (4h).

La distinction entre cours et TD restera floue. Je vous demanderai généralement d'écrire quelques petits programmes d'une semaine sur l'autre. Autant que possible, envoyez-moi vos fichiers sources à l'adresse lionel.vaux@univ-savoie.fr, afin que je puisse évaluer le niveau de chacun et ajuster le contenu des séances suivantes.

Et dites-moi si ça ne va pas, ou je risque d'avancer trop vite.


Objectifs du cours

  • Principes généraux et particularités du langage (programmation impérative, typage fort, adressage mémoire)
  • Syntaxe
  • Bibliothèque standard (pour les entrées-sorties et l'interaction avec le système d'exploitation)
  • Gestion de la mémoire
  • Bonnes pratiques
  • Outils et concepts:
    • automatisation de la compilation (make),
    • analyse de l'exécution et déboguage (gdb, valgrind),
    • documentation (doxygen),
    • boîte à outils graphique (gtk+)


Séances

Cours/TD 1 : lundi 22 septembre 2008

Présentation tout-en-un.

Le but de ce cours est de fournir le minimum vital aux étudiants pour:

  • écrire un programme simple et court utilisant les types de base
  • le compiler et l'exécuter
  • trouver de la documentation

Après cette première séance, les étudiants devraient être capable de s'amuser un peu avec le langage.

Les exemples vus en cours

bateau.c <source lang="c">

  1. include <stdio.h>

int main () { /* Écrit une chaîne */ puts("Bateau !");

/* Renvoie la valeur de sortie en cas de succès */ return 0; } </source>

euros-francs-v1.c <source lang="c">

  1. include<stdio.h>

/* Écrit une table de conversion euros/francs

*  pour euros = 0, 5, 10, ...,  100 :
*  version initiale */

main() {

 int euros, euros_max, pas ;
 float francs, un_euro ;
 un_euro = 6.55957 ;  /* taux de conversion */
 pas = 5 ;         /* pas d'itération */
 euros = 0 ;       /* valeur initiale */
 euros_max = 100 ; /* valeur maximale */
 
 while (euros <= euros_max) {
   francs = un_euro * euros ; 
   printf("%d\t%f\n", euros, francs) ; 
   euros = euros + pas ; 
 }

} </source>

euros-francs-v2.c <source lang="c">

  1. include<stdio.h>

/* Écrit une table de conversion euros/francs

*  pour euros = 0, 5, 10, ...,  100 :
*  correction de l'alignement */

main() {

 int euros, euros_max, pas ;
 float francs, un_euro ;
 un_euro = 6.55957 ;  /* taux de conversion */
 pas = 5 ;         /* pas d'itération */
 euros = 0 ;       /* valeur initiale */
 euros_max = 100 ; /* valeur maximale */
 
 while (euros <= euros_max) {
   francs = un_euro * euros ; 
   printf("%3d\t%6.2f\n", euros, francs) ; 
   euros = euros + pas ; 
 }

} </source>

euros-francs-v3.c <source lang="c">

  1. include<stdio.h>

/* Écrit une table de conversion euros/francs

* pour euros = 0, 5, 10, ...,  100 :
* avec un  `for' */

main() {

 int euros ;
 
 for (euros = 0 ; euros <= 100 ; euros = euros + 5) 
   printf("%3d\t%6.2f\n", euros, 6.55957*euros) ; 

} </source>

euros-francs-v4.c <source lang="c">

  1. include<stdio.h>
  1. define UN_EURO 6.55957 /* un euro en francs */

/* Écrit une table de conversion euros/francs

* pour euros = 0, 5, 10, ...,  100 :
* définition pour le préprocesseur */

main() {

 int euros ;
 
 for (euros = 0 ; euros <= 100 ; euros = euros + 5)
   printf("%3d\t%6.2f\n", euros, UN_EURO*euros) ; 

} </source>

arrondi.c <source lang="c">

  1. include<stdio.h>
  1. define INCR 0.00001 /* incrément pour le test de précision */
  2. define NUM 100000 /* nombre de pas */

/* Calcule 100000*0.00001=1 ? */ main() {

 float accu ;
 int i ;
 
 accu = 0 ;
 for (i=0 ; i < PAS ; i=i+1) 
   accu = accu + INCREMENT ;
 printf("%d=%f?\n",PAS*INCREMENT,accu) ;

} </source>

copie-v1.c <source lang="c">

  1. include<stdio.h>

/* Copie l'entrée standard sur la sortie standard */ main() {

 int c;
 c = getchar();
 while (c != EOF) {
   putchar(c);
   c = getchar();
 }

} </source>

copie-v2.c <source lang="c">

  1. include<stdio.h>

/* Copie l'entrée standard sur la sortie standard :

* assignation comme valeur */

main() {

 int c;
 while ((c = getchar()) != EOF) {
   putchar(c);
 }

} </source>

Exercices pour le 29 septembre

  • Au choix:
    1. Sur la machine et le système de votre choix, écrire et compiler un programme C (par exemple bateau.c), puis envoyer le fichier source et le binaire obtenu à l'adresse lionel.vaux@univ-savoie.fr.
    2. Ne pas y parvenir et alors me contacter au plus tôt pour y remédier. Ensuite revenir au choix 1, évidemment.
  • Modifier l'un des fichiers euros-francs-v?.c pour afficher une ligne d'en-tête alignée sur les résultats (et quelques fioritures). C'est-à-dire que la sortie doit ressembler à:
 Euros:    Francs:
    0   ->     0.00 
    5   ->    32.80 
   10   ->    65.60 
   15   ->    98.39 
   20   ->   131.19 
   ...
  • Écrire un programme francs-euros.c qui affiche une table de conversion dans le sens contraire (les comptes ronds sont en francs).
  • Écrire un programme qui affiche la valeur entière, de type int, de EOF (vérifier qu'elle n'est pas dans l'intervalle entier [0..255]).
  • Écrire un programme qui affiche la valeur entière du « caractère » (il est possible que vous ne compreniez pas très bien ce qui vous arrive: on en parlera).
  • Écrire un programme qui compte le nombre de caractères (au sens de getchar()) dans un fichier.


Références

  • The C programming language, de Kernighan et Ritchie;
  • Le langage C, version française du précédent;
  • Le polycopié de Bernard Cassagne, disponible ici, au format html (consultable en ligne) ou pdf;
  • Le wikilivre Programmation C: un livre de cours sur le mode wikipedia.