INFO517-cours1
Cours/TD 1
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 INCR*NUM en ajoutant NUM fois INCR à 0 */ main() {
float accu ; int i ; accu = 0 ; for (i=0 ; i < NUM ; i=i+1) accu = accu + INCR ; printf("%f=%f?\n",NUM*INCR,accu) ;
} </source>
arrondi-double.c (cette variante a été signalée pendant les rappels de la deuxième séance) <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 INCR*NUM en ajoutant NUM fois INCR à 0.
* Cette version utilise un accumulateur de type `double' * pour limiter les erreurs d'arrondi */
main() {
double accu ; // On calcule en double précision int i ; accu = 0 ; for (i=0 ; i < NUM ; i=i+1) accu = accu + INCR ; printf("%f=%f?\n",NUM*INCR,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.
Solutions possibles pour les exercices
Pour les variations sur euros-francs-v?.c, voilà un programme qui rassemble un peu tout:
conversion.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 ; int francs ; printf("Euros:\t\tFrancs:\n") ; for (euros = 0 ; euros <= 100 ; euros = euros + 5) printf(" %3d\t\t %6.2f\n", euros, UN_EURO*euros) ;
printf("\nFrancs:\t\tEuros:\n") ; for (francs = 0 ; francs <= 100 ; francs = francs + 5) printf(" %3d\t\t %6.2f\n", francs, francs/UN_EURO) ;
} </source>
Un programme qui affiche la valeur entière (type int) de EOF:
<source lang="c">
- include<stdio.h>
/* Écrit la valeur entière de EOF */ main() { printf("%d\n",EOF) ; } </source> On sauve ça dans EOF.c, puis on compile avec
$ gcc -Wall -o EOF EOF.c
Les erreurs produites sont standard (mauvais prototype pour main). L'exécution sur ma machine donne:
$ ./EOF -1
La valeur entière de €, sur le même modèle:
<source lang="c">
- include <stdio.h>
main () { int euro = '€' ;
printf("%d\n",euro) ; } </source> On sauve ça dans euro.c, puis on compile avec:
$ gcc -Wall -o euro euro.c
ce qui produit les avertissements:
euro.c:3: attention : return type defaults to «int» euro.c:4:13: attention : constante caractère multi-caractères euro.c: Dans la fonction «main» : euro.c:7: attention : control reaches end of non-void function
La deuxième ligne est le premier signe que quelque chose de bizarre est à l'œuvre. À l'exécution, on obtient:
$ ./euro 14844588
Savez-vous expliquer ce qui se passe ?
Pour compter le nombre de caractères: ce qu'on a vu en cours fait mieux.