________ _______ ________ ________
| | | \ | | | |
| __ | | __ | | __ | | _____|
| |__| | | |__| _| | | | | | | ___
| _____| | __ \ | |__| | | |_|_ |
| | | | | | | | | |
|__| |__| |__| |________| |________|
programmation : algorithmique, langage objet
IFPA Bordeaux 09/2002
Introduction CHAPITRE 1 - Algorithmique 1.1. Definition 1.2. Syntaxe generale 1.3. Structures conditionnelles 1.4. Types complexes (tableaux - fichies) 1.5. Communications entre actions 1.6. Types structures CHAPITRE 2 - C++, langage objet 2.1. Introduction au language objet CHAPITRE 3 - Visual basic, langage objet 3.1. Notions elementaires
Ce document a été écrit dans le but de condenser les informations utiles sur la programmation afin d'être un guide ultime. Il a été écrit avec un editeur de texte, pour etre imprimable sous forme de fiches miniatures. Ce document suppose que vous avez déjà quelques notions de programmation.
Basic: Ce langage est assez facile à utiliser, mais il génère des applications limitées en taille, assez peu performantes et lentes.
Pascal: Ce langage est bien structure, d'une difficulté moyenne, il donne des applications rapides.
C, C++: Ce langage laisse une grande liberté au programmeur, il est assez difficile à utiliser, il donne des applications performantes et rapides.
Visual Basic: Facile à utiliser, ce langage génère des exécutables assez lents. (même avec une amélioration de vitesse sur la dernière version).
Delphi: Ce langage offre beaucoup de possibilités, les exécutables sont très rapides. Il est utilisé par les professionnels. Delphi 5, 7 2006 pour Windows XP, XE3 pour Windows 8 et 10. Sa déclinaison Kylix 3 destinée à Linux a été abandoné par Borland.
C++ Builder: Semblable à Delphi, la syntaxe diffère, mais les possibilités sont voisines.
Lazarus Lazarus est le RAD/EDI qui s'approche le plus possible de Delphi. Free Pascal Compilateur sous licence GPL fonctionnant sous Linux, Windows, OS2 Mac OSX, BSD, iOS, Android, etc. Il est conçu pour interpréter et compiler le Pascal Objet de Delphi. A la différence de Java dont le slogan est: « write once run anywhere » celui de Lazarus et Free Pascal est: write once compile anywhere »
Ensemble de règles operatoires dont l' enchainement permet de resoudre un probleme au moyen d'un nombre fini d'operations. Les deux reigles pricipales d'un algorithme, sont:
operateurs de condition: ...... <, >, >=, <=, =, <> operateurs logique/booleen: ... et, ou, non operations: ................... +, -, *, /, mod symboles de priorite: ......... () ex: lire(a,b) Entree: lire(liste de variables) ecrire(a+b) Sortie: ecrire(liste de variables)
Chaque action est compose d'une commande, ou de plusieurs commandes dans une structure debut fin.
structure si structure selon que ~~ ~~~~~~~~~ si <condition vrai> Selon que alors <action1> <condidition1> : <action1> sinon <action2> <condidition2> : <action2> Fin Selon si <condition vrai> alors <action> structure repeter structure tan que ~~~~~~~ ~~~~~~~ repeter <action> tan que <condition vrai> jusqu'a <condition> faire <action> structure pour ~~~~ pour <variable> de <debut> a <fin> par pas de <index> faire <action>
Variables Tab ___________________ _ _ Tab : Tableau [1 ... 20] d'entiers | 10 | 20 | 30 | 40 | i : entier |____|____|____|____|_ _ Debut i 1 2 3 4 Pour i de 1 a 20 par pas de 1 Tab ___________________ _ _ Faire lire(Tab[i]) | 11 | 21 | 31 | 41 | Pour i de 1 a 20 par pas de 1 |____|____|____|____|_ _ Faire Tab[i] <- Tab[i]+1 i 1 2 3 4 Fin
Tab [1...5] [1...7] represente un tableau de 'l' chaines de 'c' caracteres l c Pour i de 1 a 5 par pas de 1 Faire Debut Pour j de 1 a 7 par pas de 1 Faire ecrire(Tab[i][j]) Fin
modes: lecture, creation, ajout Variables etats: FdF, Succes, Echec fic: fichier sequentiel d'entiers nb : entier <varfic> : fichier sequentiel de <type> Debut ouvrirfichier(<varfic>, <mode>) ouvrirfichier(fic, lecture) lirefichier(<varfic>, <vartype>) lirefichier(fic, nb) etatfichier(<varfic>) fermeturefichier(fic) ecrirefichier(<varfic>, <vartype>) ouvrirfichier(fic, ajout) fermeturefichier(<varfic>) ecrirefichier(fic, nb) fermeturefichier(fic) Fin
On doit decouper les actions en action plus petites, pour la comprehension, la maintenabilite, et pour reutiliser des actions dans d'autres actions.
La Fonction retourne obligatoirement une valeur de sortie. L'Action accepte des parametres ou arguments mais ne retourne rien.
Une action manipule:
Action <nom_action> (E nompar1, nompar2 : type 1, nompar3 : type2 S nompar4 : type E/S nompar5 : type ) Fonction <nom_fonction> (E nompar : type) : type Variable pour_retourner : type Debut ... Retourner(pour_retourner) Fin
Action appelante Action appelee Action cube(E x, Fonction carre (E var) : entier S y) Debut Variables retourner(var*var) a : entier Fin Debut a <- carre(x) Une action ou une fonction peut se rappele elle y <- a*x meme si une condition de sortie a ete prevu. Fin
types enumere: type entite compose de constantes symboliques Action main Action main Specif exemple enumere Specif exemple entite Type Tfeu = (Rouge, Orange, Vert) Type Tdate = entite (Jour: 1...31, Variable Mois: 1...12, feucircul : Tfeu annee: entier) Debut Variable feucircul <- Rouge datnais.Jour si feucircul = Rouge et .. Debut alors feucircul <- Vert datnais.Jour <- 10 Fin Fin
Structure de structures ...
Type personnage1 = entite (nom: tableau [1...20] de caracteres, naissance: Tdate) Variable jacque : personnage1 Debut lire(jacque.naissance.Jour) Fin
Pourquoi la p.o.o (Programmation Oriente Objet)?
Pour la modularite: modules independant les uns des autres. Pour la maintenabilite et la reutilisabilite. L'objectif est de reutiliser le maximum d'objets existant.
attribut: ensemble de variables qui constituent les donnees de la classe. methode: ensemble des fonctions qui constituent les traitements de la classe classe: une classe est un type d'objet qui regroupe attributs et methodes. objet: un objet est l'integration d'une classe. instance: variable qui a été déclarée du type d'une classe. encapsulation: regroupement des donnees dans un objet pour masquer les attributs interphace: vue externe de l'objet (prototype des differentes methodes) accesseurs: methodes qui renvoient ou qui modifie la valeur d'un attribut.
ex: objet voiture donnees: vitesse, couleur, marque, annee, ... traitement: se deplacer, prendre de l'essence, s'user, ... voiture r5,r21,mustang; r5,r21 et mustang sont des instances de l'obet voiture.
cette methode permet d'eviter que des variables soient modifiees n' importe ou, et intempestivement.
ex: r5.annee=1976; // pas bon r5.setannee(1976); // bon: principe d'encapsulation
Si l' attribut annee change de nom dans la classe, on aura pas a modier tout le programme. L'encapsulation n'est pas obligatoire en c++, c'est au programmeur de faire attention.
cin objet entree standard dans la librairies
La compilation se fait par g++. Les extensions sont .cpp .cc .c++ .h
transmission par valeur: echange (int, int ) // proto ici on travaille avec des recopies des arguments de la fct appelante.
transmission par reference: echange (int &, int &); // proto ici on travaille directement avec les arguments de la fonction appelante.
Une reference est un alias, un synomyme d'une autre variable. Il est donc impossible de faire int &n = 3;
En c, la portee d'une variable n'est que dans le bloc ou elle est declaree. En c++, il est possible de declarer une variable n'importe ou.
Pour définir une variable globale dans plusieurs fichiers il faut la définir en extern dans le fichier d'en tête (Header), et la déclarer dans un des fichiers utilisateur. Cela permet de la rendre visible par tous les fichiers qui inclue .
On met d'abord les parametres obligatoires puis les parametres par defaut. S'il n' y a que des parametres par defaut, la fonction devrat etre appelee sans parentheses. On appele la meme fonction de plusieurs manieres differentes.
Le compilateur fait la difference entre fonctions, par le nom, le nombre d'arguments, les types des arguments. Le type retourne n'est pas pris en compte.
S'il existe une fonction surdefinite sans parametres, l'appel de cette fonction peut se faire de 2 maniere distinctes; avec ou sans parentheses. Dans ce cas, il ne doit pas y avoir une fonction avec que des parametres par defaut, car la distinction n'est pas possible.
Les classes existantes se situe dans un seul fichier ".h" . Il faut inclure la classe sans le ".h", creer une instance de la classe, puis utiliser les methodes existantes.
Une classe est une structure evoluee, qui permet de regrouper non seulement des donnees, mais aussi des fonctions (methodes). L'acce aux champs, et aux methodes se fait avec l'operateur "."
Chaque proprietes et chaque methodes doit etre soit en private, soit en public. Les sous fonctions des methodes principales doivent etre definis en private.
constructeur: methode lancee automatiquement a la creation d'une instance destructeur: methode lancee automatiquement a la destruction d'une instance
Le constructeur a le meme nom que la classe. Le destructeur egalement mais avec un ~ devant le nom. Ces fonctions ne retournent pas de valeur, et doivent etre public. Le destructeur n'a pas de parametres.
Le C++ a introduit 2 operateurs new et delete qui remplacent malloc et free.
meme avec new, le constructeur est appele.
Lors de chaque création d'une instance, les attributs, et les pointeurs sur les méthodes sont recopiées en mémoire. Ainsi chacune des instance contient ses propres attributs. Le fait de déclarer un attribut 'statique' peut permettre à toutes les instances de partager la meme donnée.
point p1(2,3), p2(5,2);
recopie: int point::fct(point p) { cout << p.x; } p1.fct(p2); adresse: int point::fct(point *p) { cout << p->x; } p1.fct(&p2); reference: int point::fct(point &p) { cout << p.x; } p1.fct(p2);
On peut retourner un objet: int point::fct() { point p; return (p); } p2 = p1.fct();
Le compilateur c++ integre un mecanisme de recopie par defaut, si la classe n'a pas defini de constructeur par recopie.
Si la classe contient des pointeurs, le compilateur va affecter les memes adresse des attributs pointeurs de a aux attributs pointeurs de b. On aura des pointeurs differents pointant sur la meme zone!
constructeur par recopie:
L'heritage permet de definir une nouvelle classe a partir d'une classe de base. On parle alors de sous classe, ou de classe derivee. Cela permet de hierarchiser et de creer des modeles entre les classes.
Les acces aux membres de la classe de base, par la classe derivee, depand du statut des membres dans la classe de base: ______________ ________________________ _____________________ Statut dans la Acces aux membres de la Acces aux membres de classe de base classe de base par un la classe de base par utilisateur de la classe une classe derivee ______________ ________________________ _____________________ public oui oui private non non protected non oui
L'heritage entre les 2 classes est implemente par la declaration de la classe derivee: class classe_derivee : public classe_de_base
Il est possible de forcer une instance main() { de la sous-classe a appeler la methode pointcol p1(2,6); de la classe de base p1.point::affiche(); } Le lancement des constructeurs se fait du sommet vers le bas de la pyramide d'heritage. Et les destructeur du bas vers le haut. Si un constructeur d'une sous classe necessite de nouveaux parametres, il faut faire un appel explicite:
Il en est de meme pour le constructeur par recopie:
Il est possible de redefinir les operateurs =, +, -, *, /, == pour une classe. Le prototype de la fonction s'ecrit: nom_classe operator + (nom_classe)
Si throw est exécuté dans un bloc try (depuis une fonction), les clauses catch associées à ce bloc sont examinées pour voir si l'une d'elles peut gérer l'exception. Si une clause catch est détectée, l'exception est gérée. Si aucune clause catch n'est détectée, la recherche se propage dans les bloc try-catch de niveau supérieur. Si aucun gestionnaire n'est trouvé, le programme appelle la fonction terminate() définie dans la bibliothèque du C++ standard. Cette fonction appelle abort() qui indique "Abnormal program termination".
Ce chapitre regroupe toutes les notions de base du Basic, de son compilateur, et de l'environnement de programmation.
Visual Basic n'est pas sensible au majuscules et aux minuscules.
Declaration implicite: La variable est declaree au moment de son utilisation.
Nom$ 'ajout d'un suffixe correspondant au type DefStr a-c, z ' les variable commencant par a,b,c, ou z seront du type String DefInt i-l
Declaration explicite: La variable est declaree avant son utilisation.
Dim : Reinitialise la variable Static : conserve la precedente valeur Private : variable privee
Definifion de constantes Creation d'un type utilisateur: (facilite la maintenance): Public Type udtEmployes Const USER1 = 0; Matricule As String * 5 Const NOIR = &H0& Nom As String * 20 Age As Integer End Type
Creation d'une variable:
Il est possible de creer des tableaux de variable dans chacuns de ces types.
Ces tableaux peuvent etre bornee ou non. Il est possible de definir la longueur d'un tableau par "ReDim".
Tant qu'une boucle n'est pas fini, le programme prendra toutes les ressources. Lancer la procédure "DoEvents" dans la boucle permet au système de reprendre la main à chaque tour, et ainsi mettre à jour l'interface.
Il existe 4 types de sous programmes:
Il existe 3 niveaux de sous programme:
|
passage de parametres:
Dans le passage par valeur, il s'agit d'une recopie de la variable, mais dans le passage par reference c'est la meme variable parente qui est utilisee. Elle est realisee par le mot ByRef lors de la declaration de la fonction. Sur un paramettre Optional il est possible de definir une valeur par defaut.
ByVal passage par valeur ByRef passage par reference Optional parametre optionnel (derniers parametres de type Variant) ParamArray tableau de parametre (derniers parametres sans ByVal,ByRef,Optional)
Il est possible de passer les parametre dans n'importe quel ordre a partir du moment ou on nomme ses parametres ex: Surface(largeur:=15, longueur:=15)
L'appel d'un sous programme d'un autre module se fait par module.ssprog arg1, ..
Une classe est une structure evoluee, qui permet de regrouper non seulement des donnees, mais aussi des fonctions (methodes). L'acce aux champs, et aux methodes se fait avec l'operateur ".". Un objet est une representation dynamique de la classe. Tous les objets d'une meme classe auront les memes possibilites.
Heritage et Polymorphisme:
L'heritage permet de definir une nouvelle classe a partir d'une classe de base. On parle alors de sous classe, ou de classe derivee. Cela permet de hierarchiser et de creer des modeles entre les classes.
Les acces aux membres de la classe de base, par la classe derivee, depand du statut des membres dans la classe de base:
______________ ________________________ _____________________ Statut dans la Acces aux membres de la Acces aux membres de classe de base classe de base par un la classe de base par utilisateur de la classe une classe derivee ______________ ________________________ _____________________ public oui oui private non non
L'heritage entre les 2 classes est implemente par la declaration de la classe Implements ClasseParente - a mettre au debut de la sous classe.
Le lancement des constructeurs (Sub Initialize) se fait du sommet vers le bas de la pyramide d'heritage. Et les destructeur (Sub Terminate) du bas vers le haut. Pour ajouter une propriete a la classe on utilise Property Let ou Property Get
Une Classe peut etre instanciee de plusieurs manieres:
Une collection permet de regrouper un ensemble d'elements connexes. (collections Forms, Controls, ...)
Creation d'une nouvelle collection:
Vous pouvez évidemment créer vos propres exceptions pour prévenir des erreurs par exemple dans l'utilisation des composants que vous distribuez.
Error
Les variables sont préfixés suivant leur portée et leur type.
Les variables déclarées dans un module m_ Les variables publiques g_ Les variables de module de classe c_ Les variables déclarées comme paramètre sont précédées d'aucun préfixe. Ecrire les mots en entier pour être plus explicite. Pour les entiers, variables I, J ou N.
___________________________________________________________________________ | Animated button ani | ListView lvw | | Combo box cbo | MCI mci | | drop-down list box cbo | MDI child form mdi | | Check box chk | Menu mnu | | Command button cmd | MAPI message mpm | | Communications com | MS Flex grid msg | | Control ctl | MS Tab mst | | Data-bound grid dbg | OLE ole | | Directory list box dir | Picture pic | | Common dialog dlg | 3D Panel pnl | | Drive list box drv | ProgressBar prg | | File list box fil | Report rpt | | Frame fra | Shape shp | | Form frm | Slider sld | | Grid grd | Spin spn | | Horizontal scroll bar hsb | StatusBar sta | | ImageList ils | TabStrip tab | | Image img | Toolbar tlb | | Key status key | Timer tmr | | Label lbl | TreeView trw | | Line lin | Text box txt | | List box lst | Vertical scroll bar vsb | |_____________________________________|_____________________________________| | Container con | Parameter prm | | Database db | QueryDef qry | | DBEngine dbe | Recordset rec | | Document doc | Relation rel | | Field fld | TableDef tdf | | Index idx | Workspace wsp | |_____________________________________|_____________________________________|
ex: m_strMaChaine, cmdMaCommande, objMonObjet
26 millisecondes