« INFO517 : Programmation C » : différence entre les versions
Ligne 188 : | Ligne 188 : | ||
==== Exercices pour le 29 septembre ==== |
==== Exercices pour le 29 septembre ==== |
||
* Au choix: |
* Au choix: |
||
Ligne 205 : | Ligne 204 : | ||
* Écrire un programme qui affiche la valeur entière du « caractère » <tt>€</tt> (il est possible que vous ne compreniez pas très bien ce qui vous arrive: on en parlera). |
* Écrire un programme qui affiche la valeur entière du « caractère » <tt>€</tt> (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 <tt>getchar()</tt>) dans un fichier. |
* Écrire un programme qui compte le nombre de caractères (au sens de <tt>getchar()</tt>) dans un fichier. |
||
Autant que possible, envoyez-moi vos fichiers sources à l'adresse <tt>lionel.vaux@univ-savoie.fr</tt>, afin que je puisse évaluer les niveaux de chacun et ajuster le contenu de la prochaine séance. <em>Et dites-moi si ça ne va pas, ou je risque d'avancer trop vite.</em> |
Version du 22 septembre 2008 à 13:00
Cours du semestre 5 de la license STIC INFO.
Organisation
Responsable pour 2008--2009: Lionel Vaux.
10 séances de cours/TD (1h30) et 3 séances de TP (4h).
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">
- 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">
- 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">
- 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">
- 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">
- include<stdio.h>
- 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">
- include<stdio.h>
- define INCR 0.00001 /* incrément pour le test de précision */
- 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">
- 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">
- 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:
- 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.
- 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.
Autant que possible, envoyez-moi vos fichiers sources à l'adresse lionel.vaux@univ-savoie.fr, afin que je puisse évaluer les niveaux de chacun et ajuster le contenu de la prochaine séance. Et dites-moi si ça ne va pas, ou je risque d'avancer trop vite.