6TT Notes de cours INFORMATIQUE LOGIQUE Ingénieur civil Page 1 sur 24
Préliminaires Le cours de logique s appuie (notamment en deuxième partie) sur un langage de programmation appelé : Langage C Nous introduirons le C++ qui lui est un langage orienté objet. Le C peut être comparé à un assemblage de petites briques constituant un tout. Chaque petite brique serait alors assimilée à une fonction, leur assemblage formant l application. Une fonction est en effet une petite «boîte opaque» à laquelle on passe des arguments. L exécution de l algorithme qui la compose permet de calculer un résultat qui sera retourné à l application sous forme de paramètres. La fonction d entrée s appelle void () Nous verrons que : Une fonction est constituée par un corps délimité par des accolades ouvrante et fermente. Des tests logiques composés d une entrée et deux sorties régies par une ou des conditions. Une force du langage que sont les boucles : Une boucle est un procédé qui permet d exécuter un certain nombre de fois un même corps de programme sans devoir ainsi le répéter artificiellement. Nous aurons les boucles : For (i=0 ; i<10 ; i++) { } While cin i ; while (i<10) { cin i} Do While Do { cin i ;} while (i<10) ; Les fonctions reprenant des passages par valeurs et des passages par références (surtout en 6TT). Des tableaux à une dimension et à deux dimensions. Le shiftage unaire. Les structures amenant le concept d enregistrements de fichiers avec un abord de classes. De nombreux exemples seront abordés en logique et finalisés dans leur concept en laboratoire informatique Page 2 sur 24
Chapitre 1 Etablir un flux de traitement d information 4.1. Structures alternatives Remarque : Les points 1, 2 et 3 sont vus en 5TT, c est pourquoi nous commençons ici par le point 4.1 4.1.1. Ecriture d une condition simple Une condition simple s applique dans: Un test logique : IF (i < 10) { } ELSE { } Remarque: Les exemples ci-dessous ne reprennent pas les caractères accentués, de ce fait certaines fautes d orthographes apparaissent. Figure 1 Page 3 sur 24
4.1.2. Ecriture d une condition complexe Une condition complexe fait entrer des opérateurs logiques tels que : OU logique qui s écrit : ET logique qui s écrit : && Quant au test d égalité, il s écrit : == Exemple : tester si la variable i vaut 10 IF (i==10) { } Figure 2 4.1.3. Ecriture de structures alternatives imbriquées Nous voyons qu il est possible d écrire des tests logiques comprenant plusieurs variables. Il est aussi possible d imbriquer ces tests logiques et donc un test IF() peut comprendre un autre test IF(). Page 4 sur 24
Figure 3 4.2. Structures itératives 4.2.1 Ecriture d une boucle (initialisation, condition sortie) Une itération est une répétition d un même code avec toutefois variations possibles des variables qui le compose. Dans la langage C nous parlerons de boucles. Nous disposons essentiellement de trois formes de boucles : 1. FOR (i=0; i<10; i++) { } que nous noterons : initialisation ; condition ; incrémentation 2. Cin i ; WHILE (i<10) { cin i ;} avec une attribution de valeur à la variable condition pour déterminer si la boucle sera effectuée lors de l exécution de l application 3. D0 { cin i ; } WHILE (i<10); cette boucle est toujours exécutée une fois. Attribution de valeur à la variable condition pour déterminer si la boucle est réexécutée Page 5 sur 24
1.1. Boucle for Figure 4 Remarque : La variable i de contrôle de la boucle FOR varie depuis zéro, jusque strictement plus petit que 10, c est-à-dire 9, par incrément de 1 i++ Nous voyons donc que les valeurs de i vont de 0 à 9 Dans le cas d une boucle FOR, la variable de contrôle de la boucle varie de par la conception de la boucle. Le développeur de l application ne doit pas le faire varier. Nous pouvons cependant nous en servir comme le montre l application ci-dessus. L application précédente montre qu il est facile de se prémunir contre les encodages de valeurs de caractères spéciaux et ainsi protéger l application de ces valeurs indésirables. Page 6 sur 24
1.2. Boucle While () Figure 5 Remarque : Contrairement à la boucle FOR, la boucle WHILE ne fait pas varier elle-même la valeur d une variable de contrôle. Nous ne devons pas non plus exécuter le nombre de fois la boucle selon la variation de cette variable de contrôle. Nous pouvons en effet décider nous-mêmes d interrompre le bouclage en attribuant à la variable de test la valeur de sortie ce qui en soit est un avantage Insistons sur la structure de cette boucle qui demande une attribution de valeur à la variable test avant d entrer dans la boucle et donc pour décider si nous entrons bel et bien une première fois dans la boucle et une nouvelle demande d attribution à la variable test à la fin de l écriture de la boucle pour savoir si nous continuons à boucler ou bien si nous sortons de l exécution de la boucle. Page 7 sur 24
1.3. Boucle Do WHILE () Figure 6. Remarque : Contrairement à la boucle While () la boucle Do While () ; est exécutée une première fois sans le demander : en effet l encodage de la variable de test s effectue à la dernière instruction de la boucle. Remarquons d emblée qu il y a un point-virgule après le While () ; Cette boucle, comme nous le verrons plus tard lors des appels de fonctions (voir préliminaire), sera beaucoup utilisée pour afficher un menu et notamment la valeur pour sortir de l exécution de l application. 4.2.2. Initialiser et utiliser un compteur Ce point est abordé en 1.2. et 1.3. lors des descriptions de la boucle While () et de la boucle Do While () ; Page 8 sur 24
4.2.3. Imbriquer des structures itératives Il est facile de combiner les boucles que nous venons de développer Soit deux boucles FOR imbriquées Figure 7. Une autre façon d imprimer : Utilisation de printf () http://www.linux-france.org/prj/embedded/sdcc/sdcc_course.formatted_io.html Page 9 sur 24
Organigramme Un organigramme informatique est un agencement de symboles qui représentent structure Exercice 1 : Reprenons l organigramme de l application qui affiche : «Bonjour Madame», «Bonjour Mademoiselle», «Bonjour Monsieur», selon le cas de l application. Celle-ci peut être développée à l aide d un langage comme le C++. Le concept peut également servir à représenter sous forme d un graphique organisé avec logique les séquences d un processus de traitement, qu il soit de programmation ou d exécution sur une chaine de production. Le lien ci-dessous reprend sous forme d organigramme les différentes organisations de boucles d un langage de programmation (c++, Visual Basic ) : http://troumad.developpez.com/c/organigrammes/ 4.3. Algorithmes de base Il est évidemment possible de mettre en relation des variables dans une expression. Figure 8 Page 10 sur 24
4.4. Tableaux 4.4.1. Déclaration de tableau statique + utilisation d indice Un tableau, aussi appelé variable indicée, peut être à une ou deux dimensions. Commençons par les premiers. Chaque indice repère un élément dans le tableau. Remarque importante : pour l encodage nous utiliserons une boucle While () ou bien Do While () et pour l affichage une boucle FOR dont la variable de contrôle se réfère au nombre d éléments encodés Figure 9 Page 11 sur 24
4.4.2. Sommations et moyennes Reprenons l exemple précédent et ajoutons le calcul de moyenne des valeurs et de somme des valeurs des éléments du tableau à 1 dimension. Lors d une division, le résultat prend le type du numérateur et dénominateur. C est ainsi que, même si le type de la variable moyenne est float, si le numérateur et le dénominateur sont de type int, le résultat sera affiché comme un int, sauf si nous appliquons un casting au numérateur ou au dénominateur, car dans ce cas l affichage se fera à partir du type le plus précis (dans notre cas : float) Figure 10 Page 12 sur 24
4.4.3. Insertion et suppression de données dans un tableau Nous allons anticiper à propos de notions : Fonctions Appel de fonctions par référence (c'est-à-dire par pointeur) L objectif premier se trouve dans l écriture des fonctions qui se trouvent à la page suivante. En effet nous allons attribuer à un élément i la valeur de l élément i+& dans le cas d une suppression et i-1 en partant de la fin dant le cas de l ajoute, car nous insérons ainsi une valeur à l élément i Figure 11 Page suivante écriture des fonctions : ajout suppres Page 13 sur 24
Figure 12 int t [10] ; est la déclaration d un tableau à 1 dimension comportant 10 éléments int* t est la déclaration d un pointeur sur le tableau t (qui est l adresse en mémoire de l élément 0 du tableau Exercice : Reprendre cet exemple sans le copier et comprendre les processus. Veuillez me poser des questions à ce propos car notons tout de suite qu il s agit de notions d examen Page 14 sur 24
4.4.4. Déclaration et manipulation de tableaux multidimensionnels Soit un tableau à deux dimensions int t [10][5] ; déclaration d un tableau t comportant 10 lignes et 5 colonnes Figure 13 Page 15 sur 24
Chapitre 2 5. Construire un programme modulaire 5.1. Fonction, passage par valeurs et par références Disons tout de suite qu il y a : 1. Passage par valeurs : ce sont les valeurs des variables arguments qui sont transmises à la fonction 2. Passage par références : ce sont les adresses des variables arguments qui sont transmises à la fonction L exemple suivant est l illustration d un passage par valeur : Figure 14. Page 16 sur 24
L exemple suivant est l illustration d un passage par référence : Figure 15 5.2. Etablissement d une valeur de retour Lorsque nous plaçons void (qui veut dire «rien du tout») devant le nom d une fonction, cela veut dire que cette fonction ne renvoie rien, qu elle ne retourne pas une valeur après l exécution de l algorithme qu elle renferme. Par contre lorsqu un type (int, float ) est renseigné devant le nom d une fonction, cela veut dire que la fonction retourne un résultat de type indiqué Exemple : int addition (int*, int*) ; Dans ce cas, nous transférons deux arguments par référence de type integer et la fonction renvoie un résultat de type integer C est cette notion que nous développons dans l exemple suivant. Page 17 sur 24
Fonction passage par référence avec return Figure 16. 5.3. Déclaration de variables globales et locales 5.3.1. Variables globales Une variable globale se déclare en dehors de la fonction main() et en dehors de tout fonction. Si, comme je le suggère, la fonction main() est la première fonction (se trouve audessus) de notre application, les variables globales sont déclarées au-dessus de la fonction main(). De cette façon ces variables sont connues déclarées pour toute l application, même s il y a d autres fonctions que la fonction principale main(). 5.3.2. Variables locales Une variable locale est déclarée à l intérieur d une fonction et est seulement connue à l intérieur de cette fonction. Si nous utilisons plusieurs fois le même nom de variable dans des fonctions différentes et déclarées en variables locales, C++ ne se «mélangera» pas car ces variables sont alors connues à des niveaux différents : notion«empilages» Page 18 sur 24
5.4. Récursivité Fonction qui s auto appelle Figure 17 En effet : 5 * 4 * 3 * 2 * 1 = 120 Page 19 sur 24
Chapitre 6. 6.1. Algorithmes de recherches et de tris. 6.1.1 Etablissement des structures physiques et logiques des données C est IBM (Industrial Business Machine), qui s appelle maintenant Lenovo, qui a créé dans les années 70 le concept de fichiers physiques (qui contiennent les données) et de vues logiques, lesquelles permettaient d accéder aux données à partir de différents tris préétablis. Considérons une structure véhiculée par une variable indicée de type struct. Durant l encodage nous approvisionnerons en valeurs une deuxième variable indicée qui contiendra le champ constituant l argument de recherche. 6.1.2. Recherche séquentielle Soit donc la structure «SIGNA» et la variable indicée «rech». Page 20 sur 24
Figure 18 Page 21 sur 24
6.1.2 Recherche dichotomique. Cette recherche doit s effectuer à partir d une liste indicée dont les éléments sont triés au départ. Cette notion permet d effectuer une recherche plus rapide que lors d une recherche séquentielle durant laquelle tous les éléments de la liste sont parcourus jusqu à ce que la recherche aboutisse. La recherche dichotomique divise un certain nombre de fois le nombre d éléments visités par la recherche. Soit une liste de 10 éléments triés au départ par ordre numérique croissant Liste (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) De façon simplifiée : Recherche séquentielle : nous effectuons 10 fois une boucle. Recherche dichotomique : nous divisons le nombre d éléments par 2 et retenons la valeur de cet élément. Si la valeur recherché est inférieure, nous effectuons une boucle depuis le début jusqu au milieu. Si la valeur recherchée est plus grande, nous effectuons une boucle depuis le milieu jusqu à la fin Figure 19. Page 22 sur 24
6.2. Tri d un ensemble de données L algorithme de tri «shell Metzner» regroupe deux ensembles de données. Le nombre total des éléments de liste à trier est divisé par deux. Les deux premiers éléments de ces ensembles sont comparés, ensuite les deux suivants et ainsi de suite jusqu à ce qu il n y ait plus de permutations à effectuer // Shell-Metzner.cpp : définit le point d'entrée pour l'application console. // #include "stdafx.h" #include <iostream> using namespace std; void main () { int t[10]={10,2,5,15,35,1,56,99,6,9}; int i, j, n=10, l, w; l = n; l = int (l/2); while (l!= 0) { for (j=0; j<n-l; j++) { i = j; while (i>=0) { if (t[i]>t[i+l]) { w = t[i]; t[i] = t[i+l]; t[i+l] = w; } i = i-l; } } l = int (l/2); } for (i=0; i<n; i++) { cout << t[i] << endl; } } system ("Pause"); Figure 20 Page 23 sur 24
Figure 21. Page 24 sur 24