INFO517-cours9
Séance 9 du Cours-TD de Programmation C.
Préparation du TP
Voir le sujet.
Entrées/sorties dans des fichiers
Voir les pages de manuel des flux et de fopen fgetc, fputc, fprintf, fclose, et fscanf.
Un exemple pour scanf: <source lang="c">
- include <stdio.h>
int main () { int i,s ; s = 0 ; while (scanf("%d",&i) == 1) s = s + i ; printf("Somme: %d\n",s) ; return 0 ; } </source> et une variante pour comprendre la valeur de retour: <source lang="c">
- include <stdio.h>
int main () { int i,j,s ; s = 0 ; while (scanf("%d%d",&i,&j) == 2) s = s + i + j ; printf("Somme: %d\n",s) ; return 0 ; } </source>
Voir aussi l'archive liste-v2.tar.gz qui fournit une variante de ce qu'on a fait au TD2.
Opérations bit à bit
Un exemple qui réunit un peu tout ce qu'on a vu: <source lang="c">
- include <stdio.h>
int deux_puissance(int n) { /* Utilisation du décalage */ return 1 << n ; }
int xor(int x, int y) { /* OU exclusif binaire */ return (~x & y) | (x & ~y) ;
/* Note: le `xor' est aussi une primitive C: `^'. */ }
void ecrit_binaire(int z) { int i ; printf("%11d == 0x%08x : ",z,z) ; for (i=8*sizeof(int)-1;i>=0;--i) if (z & deux_puissance(i)) putchar('1') ; else putchar('0') ; printf("\n") ; }
int main () { int i,x,y ;
printf("Puissances de 2:\n") ;
/* Notez le cas de deux_puissance(sizeof(int)*8-1) */
for (i=0; i<sizeof(int)*8; i++) {
printf("2 puissance %3d == %11d\n",i,deux_puissance(i)) ;
}
printf("\nQuelques écritures binaires:\n") ; ecrit_binaire(1) ; ecrit_binaire(127) ; ecrit_binaire(128) ; ecrit_binaire(-1) ; ecrit_binaire(0) ; ecrit_binaire(deux_puissance(sizeof(int)*8-1)) ;
x = 13 ; y = 32 ; ecrit_binaire(x) ; ecrit_binaire(y) ;
printf("\nOpposé:\n") ;
ecrit_binaire(-x) ; ecrit_binaire(-y) ;
/* Deux méthodes pour le XOR */ printf("\n%d XOR %d:\n",x,y) ; ecrit_binaire(xor(x,y)) ;
printf("\nPareil avec l'opérateur C: %d ^ %d:\n",x,y) ; ecrit_binaire(x^y) ;
/* Deux méthodes pour le complément */ printf("\nComplément de %d:\n",x) ; ecrit_binaire(~x) ;
printf("\nComplément de %d:\n",y) ; ecrit_binaire(xor(y,0)) ;
printf("\nComplément à 1 de %d (c'est pareil que l'opposé sur la plupart des machines):\n",x) ; ecrit_binaire(~x+1) ;
return 0 ; }
</source>