« INFO517-cours1 » : différence entre les versions

De Wiki du LAMA (UMR 5127)
Aller à la navigation Aller à la recherche
mAucun résumé des modifications
mAucun résumé des modifications
 
Ligne 1 : Ligne 1 :
Séance 1 du Cours-TD de [[INFO517|Programmation C]].

Présentation tout-en-un.
Présentation tout-en-un.



Dernière version du 18 novembre 2008 à 22:54

Séance 1 du Cours-TD de Programmation C.

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 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">

  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 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">

  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.

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">

  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 ;
 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">

  1. 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">

  1. 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.