Algorithmique et langage C
préambule Un processus est Un phénomène que l’on peut décrire. L’ algorithmique est l’ outil logique définissant les processus en algorithmes. Un algorithme est donc une suite d’instruction à suivre pour produire un processus. tout deux fondent un système logique ou presque…
préambule le programme est la transcription de ces algorithmes respectant les paradigmes du langage utilisé. (un paradigme étant une représentation du monde, une philosophie, un système) bref… la règle du jeu! un compilateur permet la transcription du programme en un code machine exécutable. Code machine qui pourra être exécuté, si tant est que la configuration hardware et software requise est respecté. l’algorithme est correct. La transcription dans le programme est correcte.
processus, traitement et autre olibrius Il traite des entrées et selon son exécution émet des sorties et/ou des erreurs processus entrée in stdin sortie out stdout sortie d’erreur error stderr
les données Tout processus commence par des données auquel on applique par la suite un traitement
Entrée / Sortie… même combat! les E/S sont potentiellement de deux natures : –Stockés fichier (txt, xml, xsd, ini, VSAM,…), base de donnée Son dilemme consistant à comment accéder, classer l’information et comment la lire, créer, modifier, supprimer. –Émises/reçus commande, pipe, socket, protocole de communication réseau, client serveur, n-tiers… Son dilemme consistant à comment ouvrir/fermer la communication et transmettre/recevoir l’information.
Entrée / Sortie… et au milieu alors ? les E/S « externe » et les données « internes »(dites de travail) au processus sont stockés dans les variables. ces variables sont définit par un type et un nom. au nom correspond son adresse mémoire. (il est unique, mais 2 noms peuvent partager la même adresse) au type correspond la taille mémoire occupé. (bien sûr plusieurs types peuvent partager la même taille ) Au final la déclaration d’une variable A de type nombre s’écrit : char A;
Le type ou pourquoi les pommes ne donnent pas de jus de citron ? le type définit la taille, mais définit aussi le comportement de la variable. Exemple : on ne peut pas appliquer une racine carré à une chaîne de caractère. Malgré tout, les types admettent des instructions intrinsèques l’ affectation de contenu A B le contenu de B est copié dans le contenu de A (B et A étant de même type) Le conversion de type A (char ) B A qui est un char reçoit la valeur converti en char de B (A et B étant de même taille)
Les types de base en C Type de donnéeSignificationTaille (en octets) à titre d’exemplePlage de valeurs acceptée charCaractère1-128 à 127 unsigned charCaractère non signé10 à 255 short intEntier court à unsigned short intEntier court non signé20 à intEntier 2 (sur processeur 16 bits) à (sur processeur 32 bits) à unsigned intEntier non signé 2 (sur processeur 16 bits)0 à (sur processeur 32 bits)0 à long intEntier long à unsigned long intEntier long non signé40 à floatFlottant (réel)43.4* à 3.4*10 38 doubleFlottant double81.7* à 1.7* long doubleFlottant double long103.4* à 3.4* Ce qui nous amène à la question ? Et le nom (adresse mémoire pour ceux qui suivrait pas) … C’est un type?
Quelque part … dans la mémoire The pointeur ou le contenu d’un contenant, peut-être un contenant !!! Connaissant ce contenant, on trouve le contenu donc le contenu du contenu du contenant qui n’est autre que le contenu de son contenant, lui-même contenu dans un contenant … Le pointeur est un des grands paradigmes de l’informatique. Pas de secret, c’est un type, il se déclare par * (en C) int *ptA Le pointeur représente une adresse mémoire (il pointe un certain type ici) Une variable A est créé son adresse sur un processeur et OS 32 bits est alors codé sur … 4 octets je créer un pointeur sur 32 bits 1 octet Autre part … dans la mémoire E F A C 0xCAF9 0xCAFA 0xCAFB 0xCAFC 0xDEC4 Et je lui affecte l’adresse de A 0xCAFD 0xCAFE 0xDECA D’où (calembour douteux du geek) ? J’ai du café dans le déca …
int * ptrA, A=10, imageA; ptrA = & A; imageA= * ptrA; * ptrA=20; Résultat?... Il y a 10 dans imageA et 20 dans A. les pointeurs Version code… Création du pointeur d’entier ptrA à valeur nulle. Création de l’entier A valorisé à 10. Création de l’entier imageA. ptrA est valorisé avec l’adresse de A. imageA est valorisé avec le contenu pointé par prtA. le contenu pointé par prtA est valorisé à 20.
Un tableau de taille n est un pointeur adressant une zone mémoire de n * taille du type unitaire. De même pour un tableau de multidimensionnel (sa zone mémoire est le produit des tailles de toutes ses dimensions) Un tableau à 3 dimensions se conceptualise comme suis tableau int tab[10][5][3];
tableau Il peut être initialisé avec des valeurs par défaut int tab2[10]={1,2,,3,4,5,6,7,8,9}; Il peut se convertir en pointeur int *ptr; Et donc ptr = tab2; peut s'écrire ptr = &tab2[0]; comme ptr = &tab2[5]; peut s'écrire ptr = tab2 + 5 * sizeof(int); ???
Structure et union Une structure est un groupe contenant plusieurs type déclaré struct personne { char prenom[25]; char nom[25];} a,*ptr_a; Ensuite on l’utilise comme suit ptr_a = &a; a.prenom = "adrien"; ptr_a->nom = "le labousse"; Prenom nom structure personne
Structure et union Une union est un groupe contenant plusieurs type déclaré à la même adresse. union compte { char rib_val[22]; struct RIB { char code_banque[5]; char code_guichet[4]; char num_compte[11]; char clef[2];} rib_struct; } a; Ainsi rib_struct est équivalant à rib_val rib_val code_banque code_guichet num_compte clef union compte
simple et double les structures de données dynamiques Liste chaînée data1 ptrPrev ptrNext data2 ptrPrev ptrNext data3 ptrPrev ptrNext data4 ptrPrev ptrNext structure
Liste chaînée pile (LIFO) et file (FIFO), la ressemblance LIFO Last In First Out FIFO First In First Out ils possèdent deux pointeurs : La tête (élément origine) ptrHead La queue (dernier élément inséré) ptrTail Lors de l’insertion d’un élément A, ils ont le même comportement : A.ptrPrev = ptrTail; //on accroche A à la liste ptrTail->prtNext = &A;// dans les 2 sens ptrTail = &A; //modification du pointeur de queue Bref ce sont toutes les deux des…??? Listes chaînées bien sûr vous suivez ? hein…
pile (LIFO) et file (FIFO) la ressemblance data1 ptrPrev ptrNext data2 ptrPrev ptrNext data3 ptrPrev ptrNext data4 ptrPrev ptrNext Soit une liste et ses pointeurs ptrHead ptrTail Insertion 1 er élémentInsertion 2 eme élémentInsertion 3 eme élémentInsertion 4 eme élément
pile (LIFO) et file (FIFO) la différence la pile Lors de la lecture –Lit le contenu de l’élément de queue. –le pointeur de queue est affecté à l’adresse de l’élément précédent. vide si le pointeur précédent de l’élément de queue est nul. la file Lors de la lecture –Lit le contenu de l’élément de tête. –le pointeur de tête est affecté à l’adresse de l’élément suivant. vide si le pointeur suivant de l’élément de tête est nul.
pile (LIFO) et file (FIFO) la différence data1 ptrPrev ptrNext data2 ptrPrev ptrNext data3 ptrPrev ptrNext data4 ptrPrev ptrNext Soit une liste remplie et ses pointeurs ptrHead LIFO ptrTail FIFO Lecture 1 er élémentLecture 2 eme élémentLecture 3 eme élémentLecture 4 eme élément ptrHead FIFO ptrTail LIFO Lecture 4 eme élémentLecture 3 eme élémentLecture 2 eme élémentLecture 1 er élément
les structures de données dynamiques les arbres binaires (binaire pour l’exemple …simple ) data1 ptrLeftChild structure ptrParent ptrRightChild data2 ptrLeftChild ptrParent ptrRightChild data3 ptrLeftChild ptrParent ptrRightChild data4 ptrLeftChild ptrParent ptrRightChild data5 ptrLeftChild ptrParent ptrRightChild data6 ptrLeftChild ptrParent ptrRightChild data7 ptrLeftChild ptrParent ptrRightChild mon descendant mon ascendant
les structures de données dynamiques les diagrammes… c’est Santa Barbara data1 id ptr [ ] data2 id ptr [ ] data3 id ptr [ ] data4 id ptr [ ] data5 id ptr [ ] data6 id ptr [ ] data7 id ptr [ ] data8 id ptr [ ] data9 id ptr [ ] data0 id ptr [ ]
int* ptr_mem; ptr_mem = (int *)malloc(N*sizeof(int)); ptr_mem = (int *)realloc(ptr_mem, M*sizeof(int)); free(ptr_mem); ptr_mem = NULL; Fonction d’allocation mémoire dynamique en C Création des pointeurs à valeur nulle. ptr_mem est valorisé avec l’adresse d’une zone mémoire de taille de N int La zone mémoire pointé par ptr_mem est réalloué à la taille de M int et ptr_mem est valorisé avec l’adresse de cette nouvelle zone. Libération de la mémoire de la zone pointée Que reste-t-il donc dans prt_mem? Il pointe toujours son adresse!!!