1 / 165

Programmation structurée et Langage C

Programmation structurée et Langage C. L’informatique à Phelma/PET. 1ère année : les objectifs Maîtriser le développement de logiciels Apprendre la Programmation structurée Connaitre quelques Structures de données et Algorithmes Semestre 1 : 14 séances de 2h de C/TD papier et machine

mali
Download Presentation

Programmation structurée et Langage C

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programmation structurée et Langage C

  2. L’informatique à Phelma/PET • 1ère année : les objectifs • Maîtriser le développement de logiciels • Apprendre la Programmation structurée • Connaitre quelques Structures de données et Algorithmes • Semestre 1 : 14 séances de 2h de C/TD papier et machine • Environ 1 cours/TD et 1 sujet de TP pour 2 séances • TP préparés à l’avance, individuellement • Contrôle des préparations papier à chaque TP • Terminer les TP en dehors des seances encadrées si nécessaire • Conseil : taper le code à l’avance • Semestre 2: 18 séances de 2h de C/TD papier et machine • Tous les documents sur le site tdinfo-pet.phelma.grenoble-inp.fr/1APET • 1 mini projet en fin de semestre et d’année • 1 examen écrit + contrôle continu (20%)‏ 2

  3. Première séance • Présentation générale • Le réseau MINATEC • Le matériel mis à disposition • Les ressources • Les adresses et liens utiles • Environnement Unix • Le système de fichiers • Les commandes de bases • Développement logiciel • Sur machine • Connexion • Webmail • Mon premier programme • Un autre programme 3

  4. Le matériel • 350 K€ de matériel réseau • Réseau entièrement redondant • Cœur de réseau et équipements principaux ondulés • 800 PCs : 1M€ de serveurs et PCs • 1 Petaoctet de stockage • Stockage accessible depuis tous les postes clients • 12 Serveurs : • Messagerie • Web • Authentification centralisé (Ldap, radius)‏ • Base de données • NFS (partage de disque)‏ • Monitoring 24/24 – 7/7 des serveurs et équipements réseaux 4

  5. Les ressources par etudiants • Quotas espace disque : • 150 Mo pour le stockage du mail • 200 Mo dans votre « Home Dir » • Quotas d’impression : Pensez à nos arbres !! • 50 pages recto/verso par mois cumulables • Non limité en salle de TDs 5

  6. Les sites utiles • http://tdinfo-pet.phelma.grenoble-inp.fr • Infos sur les TDs d’informatique (sujet, docs, etc…) • Help@phelma.grenoble-inp.fr • Pour tout problème lié à l’informatique • Les autres sites : • http://webmail.minatec.grenoble-inp.fr • Accès à votre messagerie via un navigateur web • http://login.minatec. grenoble-inp.fr • Informations sur vos quota mail et impression, changement de votre mot de passe • http://prism.minatec. grenoble-inp.fr • Site d’informations et de support du service informatique • http://intranet.phelma.grenoble-inp.fr • Information scolarités, école • http://etudiants.phelma.grenoble-inp.fr • Site des étudiants 6

  7. Lancer un explorateur de fichiers: 7

  8. Un explorateur de fichiers: 8

  9. Lancer un explorateur internet : 9

  10. Un explorateur internet : 10

  11. Le mail 11

  12. Le mail 12

  13. Lancer un terminal 13

  14. Le shell • Le « shell » est l’interpréteur de vos commandes. • Le « shell » dispose d’astuces vous facilitant la vie : • Le rappel de commande : • Les touches « flèche vers le haut « et flèches vers le bas » permettent de se déplacer dans les dernières commandes déjà tapées • La complétion automatique • Lorsque vous saisissez des chemins, l’appui sur la touche « tabulation » permet de compléter automatiquement votre chemin avec le nom du fichier ou du répertoire disponible. • En cas d’incertitudes (plusieurs chemins possibles), appuyez deux fois sur la touche « tabulation », la liste des chemins possibles s’affiche. • Le copier/coller : Sous Xwindows, le copier coller est possible via la souris • Le copier se fait automatiquement via une sélection du texte (clic gauche)‏ • Le coller se fait grâce au bouton du milieu de la souris 14

  15. Système de fichiers • Le « système de fichiers » est une arborescence de dossiers où vous stockez tous vos fichiers et dossiers • Le dossier racine est le dossier root : « / » • Dans chaque dossier on peut créer d’autres dossiers ou des fichiers • Les dossiers sont protégés contre les autres utilisateurs / __ users ____ phelma ____ phelma2009 __ user1 : /users/phelma/phelma2009/user1 | | | |___user2 : /users/phelma/phelma2009/user2 | | | |___tdinfo : /users/phelma/phelma2009/tdinfo | | | | | |____ phelma2010 ____user1 : /users/phelma/phelma2010/user1 | |____ erg2007 : /users/erg2007 |____ etc : /etc |____ lib : /lib |____ bin : /bin 15

  16. Unix : commandes • man : permet de comprendre le fonctionnement d’une commande • Donne accès également aux informations des fonctions C standard. Appuyer sur ‘q’ pour quitter man • pwd : Permet de savoir dans quel répertoire on se situe • (pas d’argument)‏ • cd : Permet de se déplacer dans un autre répertoire • (ex : de tdinfo, cd ~/../tdinfo/user1 • ls : Permet de lister le contenu d’un répertoire • (ex., ls, ls –l, ls –la, pour les options voir le man)‏ • mkdir : permet de créer un répertoire • (ex., mkdir td0, mkdir ~/tdinfo)‏ • rmdir : permet de supprimer un répertoire (il doit être vide)‏ • (ex., rmdir td0, rmdir /users/phelma/phelma2008/users1/tdinfo/td0)‏ • cp : permet de copier un ou plusieurs fichiers • (ex., cp file1.txt ../../test, cp ../tdinfo/td0/file1.txt .)‏ • mv : permet de déplacer ou renommer un ou plusieurs fichiers • (ex., mv file1.txt file1Old.txt, mv file1.txt ../../tdinfo/td1)‏ • rm : permet d’effacer un ou plusieurs fichiers ou répertoires • (ex., rm file1.txt, rm –r dir1, rm –rf dir1)‏ • quota : permet de connaître son utilisation d’espace disque 16

  17. Unix : tester cette liste • pwd • ls –l • cd tdinfo • mkdir td0 • ls -l • cd td0 • ls -l • cp /users/prog1a/C/librairie/td0.c td0.c • ls -l • less td0.c • cd .. • pwd • ls -l • rmdir td0 • cd td0 • ls -l • rm * • ls -l • cd .. • rmdir td0 17

  18. Répertoire de travail • Chaque utilisateur dispose d’un répertoire de travail • Grâce à des protocoles de partage de fichiers réseaux, ce répertoire est accessible de tous les postes clients. • Par défaut à la connexion on « tombe » dans sa « home dir » • Pour retourner dans sa home dir, on peut utiliser la commande : cd ~ • Tout répertoire peut être désigné par rapport à sa « home dir » : • ~/tdinfo/td0 • ~/../users1/projet/td0 18

  19. Chemin relatif et absolu • Exemples : • Si on est dans le répertoire absolu : /users/phelma/phelma2008/user1 • Pour désigner le répertoire : /users/phelma/phelma2008/user1/tdinfo/td0 • On doit utiliser le chemin : • ./tdinfo/td0 • ou plus simplement : • tdinfo/td0 • Si on se trouve maintenant dans : /users/phelma/phelma2008/user2 • Le répertoire précédent sera accessible via : • ../user1/tdinfo/td0 19

  20. Comment créer un programme • Un programme • indique à la machine ce qu’elle doit faire • succession d’octets (8 bits) qui sont des commandes reconnues par le processeur • Il faut • Un cahier des charges • Analyse du problème • Codage en langage informatique : Matlab, Java, C, assembleur • Traduction en langage binaire : compilation et edition des liens 20

  21. Exemple • Cahier des charges • Faire un programme qui calcule l’inverse d’un nombre • Analyse : il faut 2 nombres réels • créer le fichier contenant le programme C : • bash-3.00$ nedit prog1.c #include <stdio.h> main(){ double x,y; /* Créer deux nombres réels */ printf("Entrer un nombre au clavier\n"); /*Affiche un message à l’ecran*/ scanf("%lf", &x); /* Entrer un nombre au clavier, le mettre dans x */ y =1/x; /* Calculer l’inverse, le mettre dans y */ printf("L’inverse de %lf est : %lf \n ",x,y); /* Afficher le resultat */ } 21

  22. Exemple 22

  23. Exemple • Créer le fichier executable contenant le programme : • bash-3.00$ gcc td0.c -o td0 • Executer le programme • bash-3.00$ ./td0 Entrer un nombre au clavier 3 L’inverse de 3 est : 0.333333 23

  24. Un éditeur de texte • Un editeur est un programme qui sert à taper, modifier, sauver du texte dans un fichier • De nombreux editeurs existent : vi , nedit, kate, xemacs. • Le plus facile : nedit • Le plus geek : kate • Le préféré des programmeurs libres : xemacs • Le plus vieux : vim 24

  25. Pour créer un nouveau programme Afficher les numéros des lignes de votre programme Pour utiliser un fichier existant Pour enregistrer (sauver) un programme Un éditeur de texte : nedit Espace où vous tapez votre programme ZONE où on écrit son programme 25

  26. Un éditeur de texte : kate 26

  27. Pourquoi compiler pouilly:~/Documents/ens/1AERG/2008/ex desvignes$ od -A n -t x p1 feedface 00000012 00000000 00000002 0000000b 00000530 00000085 00000001 00000038 5f5f5041 47455a45 524f0000 00000000 00000000 00001000 00000000 00000000 00000000 00000000 00000000 00000004 00000001 0000018c 5f5f5445 58540000 00000000 00000000 00001000 00002000 00000000 00002000 00000007 00000005 00000005 00000000 5f5f7465 78740000 00000000 00000000 5f5f5445 58540000 00000000 00000000 000023ac 00000988 000013ac 00000002 00000000 00000000 80000400 00000000 00000000 5f5f7069 6373796d 626f6c5f 73747562 5f5f5445 58540000 00000000 00000000 00002d34 00000000 00001d34 00000002 00000000 00000000 80000008 00000000 00000024 5f5f7379 6d626f6c 5f737475 62000000 5f5f5445 58540000 00000000 00000000 00002d34 00000000 00001d34 00000002 00000000 00000000 80000008 00000000 00000014 5f5f7069 6373796d 626f6c73 74756231 5f5f5445 58540000 00000000 00000000 00002d40 00000160 00001d40 00000005 00000000 00000000 80000408 00000000 00000020 5f5f6373 7472696e 67000000 00000000 5f5f5445 58540000 00000000 00000000 00002ea0 00000130 00001ea0 00000002 00000000 00000000 00000002 00000000 00000000 00000001 0000018c 5f5f4441 54410000 00000000 00000000 00003000 00001000 00002000 00001000 00000007 00000003 00000005 00000000 5f5f6461 74610000 00000000 00000000 5f5f4441 54410000 00000000 00000000 00003000 00000014 00002000 00000002 00000000 00000000 • Voici le code binaire de l’addition de deux nombres. • C’est un programme qui met 5 dans i, 8 dans j et i+j dans k. • Taille du programme binaire : 16904 octets • Facile, non !!!! • On utilise des langages plus proches de nous 27

  28. Assembleur .section __TEXT,__text,regular,pure_instructions .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 .machine ppc .text .align 2 .globl _main _main: stmw r30,-8(r1)‏ stwu r1,-64(r1)‏ mr r30,r1 li r0,5 // Mettre 5 dans le registre r0 stw r0,32(r30) // stocker r0 dans i (adresse r30+32)‏ li r0,8 // Mettre 8 dans le registre r0 stw r0,28(r30) // stocker r0 dans j (adresse r30+28)‏ lwz r2,32(r30) // Charger i (adresse r30+32) dans r2 lwz r0,28(r30) // Charger j (adresse r30+28) dans r0 add r0,r2,r0 // Additionner r0 et r2 dans r0 stw r0,24(r30) // stocker r0 dans k (adresse r30+24)‏ lwz r1,0(r1)‏ lmw r30,-8(r1)‏ blr .subsections_via_symbols 28

  29. En C #include <stdio.h> main()‏ { int i,j,k; i=5; j=8; k = i+j; } • Question 1: Qu’est ce que vous préférez écrire ? • Question 2: Pourquoi ? Quels avantages ? Quels inconvénients ? 29

  30. La chaine de compilation • Dans la pratique, un programme peut etre constitué de plusieurs millions de lignes de code et de plusieurs centaines de fichiers • Comment construit-on un programme dans ce cas ? • Exemple : un programme réalisant le produit de (i+2) par la racine carré de j. • La somme i+2 est réalisée par une fonction f, qui est écrite dans le fichier f1.c • La racine carré de j est réalisée par une fonction g, qui est écrite dans le fichier f2.c • Le programme principal, qui calcule f(i)*g(j) se trouve dans le fichier p1.c • On veut construire le programme qui affiche le résultat. • 2 étapes : compilation puis édition des liens 30

  31. La chaîne de compilation p1.c main() {int i,j,k; i=5; j=8; k=f(i)*g(j); printf("%d",k); } f2.c int g(int a) { int y; y= sqrt(a); return y; } f1.c int f(int a) {int x; x=a+2; return x; } Etape 1 :Traduction du C en langage machine binaire par Preprocesseur +Compilation gcc -c f2.c gcc -c f1.c gcc -c p1.c p1.o _main... f1.o _f... f2.o _g... libC.a _printf gcc -o monprog p1.o f1.o f2.o -lm Bibliothèques Etape 2 : Edition des liens : rassembler les différentes parties de code binaire dans un fichier unique libm.a _sqrt a.out Executable 31

  32. Compilation • Pour créer le programme, il faut faire toutes les commandes suivantes : • gcc -c p1.c • gcc -c f1.c • gcc -c f2.c • gcc –o monprog p1.o f1.o f2.o -lm • L’utilitaire make et le fichier Makefile permettent de simplifier cette tache. Vous l’utiliserez plus tard chaque fois que possible, nous fournissons la plupart du temps le fichier Makefile utile 32

  33. Développement logiciel • Cahier des charges • Analyse papier du projet à réaliser • Définition des besoins (structures, fonctions, prototypes)‏ • Cycle • Saisie du code à l'aide d'un éditeur (génération des fichiers .c et .h)‏ • Compilation : • correction des erreurs de syntaxe • Exécution, tests unitaires et débogage : • correction des erreurs de logique en modifiant le code • Tests de validation 33

  34. A vous de jouer • Connexion à votre login • Aller dans le répertoire tdinfo • Voir le site tdinfo-pet.phelma.grenoble-inp.fr et récupérer le premier TD 34

  35. Programme, E/S, variables Structures de controle

  36. Structure d’un programme • Le programme exécute les instructions séquentiellement, les unes apres les autres en commençant la fonction main • Une instruction est un ordre/commande que le processeur sait executer : par exemple, faire une addition, aller à un autre endroit dans le programme, etc… • On commence par déclarer quels sont les variables et les types de données utiles: on peut manipuler des entiers, des réels, etc… • Un programme est composé d’un ou plusieurs fichiers de la forme : < Commandes du préprocesseur > < Définition de types > < Variables globales > < Fonctions > • Structures des fonctions : <type de retour> nom_de_fonction(<Déclaration des arguments >)‏ { <Déclaration locales> <instructions> }

  37. Structure d’un programme Nom de la fonction Début de fonction ou bloc /* Exemple : prog2.c */ #include <stdio.h> int max(int a, int b)‏ { if (a>b) return a; else return b; } main()‏ { int i,j,k; i=10; j=20; k = max(i,j); printf("Le max de %d et de %d est %d\n",i,j,k); } Une fonction qui calcule et renvoi le plus grand des 2 nombres qu’on lui donne • Programme principal : • Crée 3 variables i,j,k qui peuvent contenir des entiers, • Met 10 dans i, • Met 20 dans j • Met le max de i et j dans k • Affiche le résultat sur l’ecran ensuite. Fin de bloc 37

  38. Exemple 38

  39. L’essentiel • Qu’est ce qu’un programme informatique manipule ? • Des nombres, des mots • Pour manipuler des nombres, il faut pouvoir les stocker dans des variables. • Il faut pouvoir introduire les nombres dans le programme et le programme doit pouvoir les afficher • Le programme doit exécuter les ordres : instructions 39

  40. Types de nombre • Entier • char : Octet : 1 octet compris entre -128 et +127 • int : Entier (1 mot machine)‏ • short : entier Court • long : entier Long • long long : entier Long • unsigned int : entier Non Signe • unsigned long : entier Long Non Signe • short int <= int <= long int • Réels • float : Réel flottant Simple Précision (4 octets)‏ : • double : Réel flottant Double Précision (8 octets)‏ • long double : Réel flottant quadruple Précision (16 octets)‏ • PAS de booleens • FAUX = 0 VRAI = NON ZERO 40

  41. Notion de variable Mémoire Adresse • Objet informatique permettant de conserver et de modifier sa valeur • Un type : entier, réel, etc… • Un nom • Une adresse : où est elle ? un entier qui est le numéro de la case mémoire où elle se trouve • Sa durée de vie (ou portée) : de l’endroit où elle est déclarée à la fin du bloc : } • Exemple : var1.c • La variable a est créée à l’adresse 3221221990 en décimal, soit 0xbffff26c en hexadécimal #include <stdio.h> main() { int a; a=5; printf("Bonjour\n"); printf("La valeur de a est %d\n",a); printf("L’adresse de a est %p\n",&a); } 0 1 2 &a= 0xbffff26c a=5 Création de a … &a: adresse de a Destruction de a 41

  42. Entrées/Sorties

  43. Entrées/sorties OUT • Opérations permettant la communication entre le programme et l'extérieur • Unité centrale : egocentrique • Sortie • Exportation d'une valeur vers l'extérieur (écriture) à travers un périphérique de sortie : écran, réseau , fichier, port série ou parallèle, pipe….. • Entrée • introduction d'une valeur à l'intérieur du programme (lecture) à travers un périphérique d'entrée : clavier, réseau, fichier, port série ou parallèle, pipe….. Unité centrale IN 43

  44. Comment afficher : printf • On utilise des fonctions déjà écrites : il faut inclure un fichier d'entête au début du fichier • #include <stdio.h> • Afficher un message : printf("Mon message\n"); • Afficher un nombre : printf("Mon entier i : %d\n", i ); Aller à la ligne Un message optionel %d : le symbole % indique que la lettre suivante est le type du nombre à afficher‏ Le nombre à afficher 44

  45. printf : exemple • Syntaxe : Affichage d ’un type de base int printf(const char * format, variable1, variable2, ...); format : %[*][largeur] [.precision] [modif type] type_carac • spécifier le type du nombre à afficher (type_carac) par • %d : nombre entier • %c : un caractère • %lf : un réel double précision • %f : un réel simple précision • En option, on peut préciser le nombre de chiffres que l’on souhaite pour l’affichage par le nombre largeur et le nombre de chiffre apres la virgule pour un réel par le nombre précision 45

  46. Un message facultatif printf : exemples • Exemple : affiche0.c #include <stdio.h> main() { double x; int a; x = 3.1415927; a=6; /* Afficher un message */ printf("Bonjour.\n"); /* Afficher un reel avec 6 chiffres dont 2 apres la virgule */ printf("Pi vaut %6.2lf\n",x); /* Afficher plusieurs nombres entier ou reels */ printf("La somme de a et x: %d + %lf vaut %lf\n",a, x, a+x); } Le premier nombre affiché est l’entier a Le deuxième nombre affiché est le reel x 46

  47. printf : le piège • Erreur sur le type des nombres à afficher • a est un entier, le format demandé (%lf) est celui des réels • idem pour x • ==> • le programme est syntaxiquement correct, • la compilation est correcte, mais à l’execution du programme, l’AFFICHAGE sera incohérent • Exemple : affiche0a.c #include <stdio.h> main() { double x; int a; x = 3.1415927; a=6; /* Afficher un message */ printf("Bonjour.\n"); printf("Le nombre a : %lf \n", a); printf("Le nombre x : %d \n", x); } 47

  48. Lire au clavier: scanf • On utilise des fonctions déjà écrites : il faut inclure un fichier d'entête au début du fichier • #include "stdio.h" • Lire un nombre au clavier : scanf("%d", &i); • spécifier le type du nombre à lire dans le format • %d : nombre entier • %c : un caractère • %lf : un réel double précision • %f : un réel simple précision • Spécifier ensuite le nombre à lire • Par l’adresse d’une variable ATTENTION au symbole & L’adresse de la variable à lire Aucun message %d : le type de i 48

  49. scanf : exemple • Syntaxe : lecture d ’un type de base int scanf(const char * format, adresse_variable1, ...); format : %[*][largeur] [.precision] [modif type] type_carac • Exemple : lecture0.c #include <stdio.h> main() { double x; int a; /* Afficher un message pour demander les nombres a l’utilisateur*/ printf("Entrer un nombre reel \n"); /* Il faut taper un reel au clavier */ scanf("%lf", &x); /* Afficher un reel avec 6 chiffres dont 2 apres la virgule */ printf("La variable x vaut : %6.2lf\n",x); printf("Entrer un nombre entier \n"); /* Il faut taper un entier au clavier */ scanf("%d", &a); /* Afficher un entier */ printf("La variable a vaut : %d\n",a); } 49

  50. scanf : lire plusieurs nombres en une fois • Exemple : lecture1.c #include <stdio.h> main() { double x,y; int a; /* Afficher un message pour demander les nombres a l’utilisateur*/ printf("Entrer un nombre entier puis 2 reel\n"); /* lire un nombre entier puis 2 reels */ scanf("%d %lf %lf", &a, &x, &y); printf("Le nombre a vaut : %d\n",a); printf("Le nombre x vaut : %lf\n",x); printf("Le nombre y vaut : %lf\n",y); } deuxième nombre : le réel x Le premier nombre tapé au clavier sera stocké dans la variable entiere a 50

More Related