Systèmes Informatiques TD 1: langage C entrées/sorties et la fonction main() P. Bakowski bako@ieee.org
Fonctions printf() et scanf() Les programmes en langages C ont besoin des fonctions qui permettent de lire les données (arguments) et d afficher les résultats. arguments résultats P. Bakowski 2
Fonctions printf() et scanf() Ces fonctions doivent également convertir les données saisies et affichées en texte ASCII en format interne qui est binaire. arguments code binaire 00..1010 11..0010 01..1110 résultats P. Bakowski 3
Fonctions printf() et scanf() Les données/arguments d entrée peuvent être fournis par les fonctions type scanf(..) où directement par l interface de la fonction main(). arguments du programme main(..) données scanf(..) P. Bakowski 4
Fonctions printf() et scanf() Les résultats sont affichés par le biais de la fonction printf(..) main(..) scanf(..) printf(..) résultats P. Bakowski 5
Fonctions printf() et scanf() Les résultats sont affichés par le biais de la fonction printf(..) main(..) scanf(..) printf(..) résultats Dans ce TD nous allons étudier ces fonctions P. Bakowski 6
Exercice 1 - fonction printf() Exercice 1: étude de la fonction printf(..,..) Écrire un programme simple sans argument (main()) qui affiche trois valeurs numériques P. Bakowski 7
Exercice 1 - fonction printf() Exercice 1: étude de la fonction printf(..,..) Écrire un programme simple sans argument (main()) qui affiche trois valeurs numériques initialisées comme un nombre décimal (vd), comme un nombre héxa-décimal (vh), et comme un nombre octal (vo). P. Bakowski 8
Exercice 1 - fonction printf() Exercice 1: étude de la fonction printf(..,..) Écrire un programme simple sans argument (main()) qui affiche trois valeurs numériques initialisées comme un nombre décimal (vd), comme un nombre héxa-décimal (vh), et comme un nombre octal (vo). A l affichage appliquer à chaque valeur les trois conversions décimale, héxa-décimale, octale. P. Bakowski 9
Exercice 1 - fonction printf() La fonction printf(..) est une «super» fonction; ; elle peut recevoir un nombre d arguments variable. P. Bakowski 10
Exercice 1 - fonction printf() La fonction printf(..) est une «super» fonction; elle peut recevoir un nombre d arguments variable. Dans la première partie elle a besoin des caractères de conversion; ; ces caractères indiques comment on veut afficher les données binaires: P. Bakowski 11
Exercice 1 - fonction printf() La fonction printf(..) est une «super» fonction; elle peut recevoir un nombre d arguments variable. Dans la première partie elle a besoin des caractères de conversion; ces caractères indiques comment on veut afficher les données binaires: %d - pour l affichage en décimal (0,..,9) %x - pour l affichage en héxa-décimal (0,..,9,..,f) %o - pour l affichage en octal (0,..,7) P. Bakowski 12
Exercice 1 - fonction printf() La fonction printf(..) est une «super» fonction; elle peut recevoir un nombre d arguments variable. Dans la première partie elle a besoin des caractères de conversion; ces caractères indiques comment on veut afficher les données binaires: %d - pour l affichage en décimal (0,..,9) %x - pour l affichage en héxa-décimal (0,..,9,..,f) %o - pour l affichage en octal (0,..,7) les données binaires - variables sont listées dans la deuxième partie d arguments P. Bakowski 13
Exercice 1 - fonction printf() main() // pas d arguments { int vd = 99; // variable décimale int vh = 0xab; // héxa-décimale int vo = 072; // octale déclaration et initialisation P. Bakowski 14
Exercice 1 - fonction printf() main() // pas d arguments { int vd = 99; int vh = 0xab; int vo = 072; printf("vd= %d, %x, %o",, vd,vd,vd); // compléter le programme P. Bakowski 15
Exercice 2 - fonction scanf() Exercice 2: étude de la fonction scanf(..,..) Écrire un programme simple sans argument (main()) qui lit trois valeurs numériques exprimées comme P. Bakowski 16
Exercice 2 - fonction scanf() Exercice 2: étude de la fonction scanf(..,..) Écrire un programme simple sans argument (main()) qui lit trois valeurs numériques exprimées comme un nombre décimal (vd), comme un nombre héxa- décimal (vh), et comme un nombre octal (vo). P. Bakowski 17
Exercice 2 - fonction scanf() Exercice 2: étude de la fonction scanf(..,..) Écrire un programme simple sans argument (main()) qui lit trois valeurs numériques exprimées comme un nombre décimal (vd), comme un nombre héxa- décimal(vh), et comme un nombre octal (vo). Afficher le valeurs saisies en appliquant à chaque valeur les trois conversions décimale, héxa- décimale, octale. P. Bakowski 18
Exercice 2 - fonction scanf() main() // pas d arguments { int vd; int vh; int vo; scanf("%d,%x,%o", &vd,&vh,&vo); Attention: : on doit fournir les adresses des arguments à lire - remplir P. Bakowski 19
Exercice 2 - fonction scanf() main() // pas d arguments { int vd; int vh; int vo; scanf("%d,%x,%o", &vd,&vh,&vo); printf("vd= %d, %x, %o", vd,vd,vd); // compléter le programme P. Bakowski 20
Fonction main() et ses arguments Étude de la fonction main(..) La fonction main(..) permet de récupérer les arguments du programme: main(int argc, char *argv[]) P. Bakowski 21
Fonction main() et ses arguments Étude de la fonction main(..) La fonction main(..) permet de récupérer les arguments du programme: main(int argc, char *argv[]) tableau de pointeurs vers des chaînes de caractères! P. Bakowski 22
Fonction main() et ses arguments main(int argc, char *argv[]) Le premier argument indique le nombre d arguments (chaînes de caractères), le nom du programme inclut. P. Bakowski 23
Fonction main() et ses arguments %nom_du_programme toto tata argv[0] argv[1] argv[2] main(int argc, char *argv[]) argc=3 argv[0] argv[1] argv[2] argv[3] P. Bakowski 24
Fonction main() et ses arguments %nom_du_programme toto tata main(int argc, char *argv[]) argc=3 argv[0] argv[1] argv[2] argv[3] P. Bakowski 25
Fonction main() et ses arguments %nom_du_programme toto tata main(int argc, char *argv[]) argc=3 argv[0] argv[1] argv[2] argv[3] P. Bakowski 26
Fonction main() et ses arguments %nom_du_programme toto tata main(int argc, char *argv[]) argc=3 argv[0] argv[1] argv[2] argv[3] P. Bakowski 27
Fonction main() et ses arguments %nom_du_programme toto tata main(int argc, char *argv[]) argc=3 argv[0] argv[1] argv[2] argv[3] (*char) 0 pointeur NULL P. Bakowski 28
Exercice 3 - fonction main() Écrire un programme avec l interface main: main(int argc, char *argv[]) P. Bakowski 29
Exercice 3 - fonction main() Écrire un programme avec l interface main: main(int argc, char *argv[]) Qui permet d afficher les chaînes (arguments) et la taille des chaînes saisies dans la ligne de commande. P. Bakowski 30
Exercice 3 - fonction main() Écrire un programme avec l interface main: main(int argc, char *argv[]) Qui permet d afficher les chaînes (arguments) et la taille des chaînes saisies dans la ligne de commande. Utiliser la fonction printf(..,..) et strlen(..). P. Bakowski 31
Exercice 3 - fonction main() La fonction strlen(..) permet de calculer le nombre d octets dans une chaîne; comme l argument on donne l adresse du premier caractère! P. Bakowski 32
Exercice 3 - fonction main() La fonction strlen(..) permet de calculer le nombre d octets dans une chaîne; comme l argument on donne l adresse du premier caractère! Attention: : la chaîne doit se terminer par le caractère ASCII 0 (en binaire 00000000) P. Bakowski 33
Exercice 3 - fonction main() La fonction strlen(..) permet de calculer le nombre d octets dans une chaîne; comme l argument on donne l adresse du premier caractère! Attention: : la chaîne doit se terminer par le caractère ASCII 0 (en binaire 00000000) Le caractère ASCII 0 n est pas pris en compte! P. Bakowski 34
Exercice 3 - fonction main() main(int argc, char *argv[]) { int i; for (i=0; i<argc; i++) printf("%s %s:%d \n",argv[i],strlen(argv[i])); } caractère nouvelle ligne affichage des chaînes de caractères P. Bakowski 35
Exercice 4 - fonction main() Exercice 4: étude de la fonction main(..) Écrire un programme qui permet d afficher les chaînes (arguments) saisies dans la ligne de commande. Cette fois ci les chaînes représentent les valeurs numériques. P. Bakowski 36
Exercice 4 - fonction main() Exercice 4: étude de la fonction main(..) Écrire un programme qui permet d afficher les chaînes (arguments) saisies dans la ligne de commande. Cette fois ci les chaînes représentent les valeurs numériques. %nom 345 678 argv[0] argv[2] argv[1] P. Bakowski 37
Exercice 4 - fonction main() Exercice 4: étude de la fonction main(..) Écrire un programme qui permet d afficher les chaînes (arguments) saisies dans la ligne de commande. Cette fois ci les chaînes représentent les valeurs numériques. %nom 345 678 argv[0] argv[2] argv[1] Utiliser la fonction de conversion atoi() pour initialiser les variables internes. Afficher le contenu (en héxa- décimal) ) de ces variables P. Bakowski 38
Exercice 4 - fonction main() main(int argc, char *argv[]) { int a[10]; for(i=0;i<argc-1;i++) { } %nom 345 678.. a[i] = atoi(argv[i+1]); printf("%x\n",a[i]); n",a[i]); } maximum 10 arguments numériques P. Bakowski 39
Fonction main() et pointeurs Les pointeurs sont des adresses qui pointent vers les données (ou autres pointeurs). P. Bakowski 40
Fonction main() et pointeurs Les pointeurs sont des adresses qui pointent vers les données (ou autres pointeurs). Un pointeur est enregistré comme une valeur numérique codée sur 32 bits. 32 bits P. Bakowski 41
Fonction main() et pointeurs Les pointeurs sont des adresses qui pointent vers les données (ou autres pointeurs). Un pointeur est enregistre comme une valeur numérique codée sur 32 bits. Initialement le contenu d un pointeur est égal à zéro (pointeur NULL) int *ptra; int *ptrb; NULL NULL P. Bakowski 42
Fonction main() et pointeurs On initialise un pointeur avec l adresse qui pointe vers une zone qui contient des données (ou un/des pointeur/s). int *ptra; int *ptrb; P. Bakowski 43
Fonction main() et pointeurs Cette zone peut être réservée statiquement par une déclaration (par exemple int tab[10]) ou dynamiquement par une fonction d allocation dynamique malloc(..). int *ptrsta; int tab[10] ptrsta = tab; int *ptrdyn; ptrdyn = malloc(sizeof(int)*10); P. Bakowski 44
Exercice 5 - main() et pointeurs Exercice 5: étude de la fonction main(..) et de pointeurs Écrire un programme qui permet de lire, de stocker et de comparer le contenu de argv[1] et argv[2]. %comp toto tata contenu argv[1] = contenu argv[2] P. Bakowski 45
Exercice 5 - main() et pointeurs Exercice 5: étude de la fonction main(..) et de pointeurs Écrire un programme qui permet de lire, de stocker et de comparer le contenu de argv[1] et argv[2]. %comp toto tata contenu argv[1] = contenu argv[2] Attention: on compare le contenu adressé par les pointeurs (pas les adresses enregistrées dans les pointeurs) P. Bakowski 46
Exercice 5 - main() et pointeurs déclarer deux pointeurs ptr1 et ptr2 (de type char) char ptr1,ptr2; P. Bakowski 47
Exercice 5 - main() et pointeurs transférer les chaînes/arguments dans les zones mémoire réservées dynamiquement par la fonction malloc(..); ptr1 = malloc(strlen(argv[1]+1)); char ptr1,ptr2; ptr2 = malloc(strlen(argv[2]+1)); P. Bakowski 48
Exercice 5 - main() et pointeurs transférer les chaînes/arguments dans les zones mémoire réservées dynamiquement par la fonction malloc(..); char ptr1,ptr2; strcpy(ptr1,argv[1]); argv[1] => strcpy(ptr2,argv[2]); argv[2] => P. Bakowski 49
Exercice 5 - main() et pointeurs comparer les chaînes par le biais de la fonction strcmp(..,..) ptr1 ptr2 strcmp(ptr1,ptr2) \0 \0 La comparaison s arrête sur le premier caractère ASCII 0 P. Bakowski 50
Exercice 5 - main() et pointeurs comparer les chaînes par le biais de la fonction strcmp(..,..) afficher le résultat [«oui», «non»] ptr1 ptr2 strcmp(ptr1,ptr2) \0 \0 strcmp(ptr1,ptr2) égale à 0 => chaînes sont égales affichage «oui» sinon «non» P. Bakowski 51
Résumé fonction printf(..) affichage sortie et conversion des données formatées fonction scanf(..) lecture et conversion des données formatées arguments du programme main(..) int argc et char *argv[] Puis: pointeurs, allocation statique et dynamique P. Bakowski 52