Documente Academic
Documente Profesional
Documente Cultură
Page 2 de 150
12/06/2010
Sommaire
1.Les structures de base d'un langage de programmation--------------------------6
1.1.La squence d'instructions--------------------------------------------------------------------------------7 1.2.L'affectation-----------------------------------------------------------------------------------------------13 1.3.la structure alternative------------------------------------------------------------------------------------16 1.4.La structure rptitive------------------------------------------------------------------------------------18 1.5.La compilation--------------------------------------------------------------------------------------------20 1.6.La dclaration des variables-----------------------------------------------------------------------------22 1.7.Les fonctions et procdures-----------------------------------------------------------------------------26
2.Rgles de programmation------------32 3.La syntaxe du pseudo-langage - - - -35 4.Comment analyser un problme ?- 39 5.Un peu d'entranement ---------------59
5.1.L'alternative-----------------------------------------------------------------------------------------------59 5.2.La boucle---------------------------------------------------------------------------------------------------63 5.3.Contraction------------------------------------------------------------------------------------------------67 5.4.Doublons---------------------------------------------------------------------------------------------------69 5.5.Equivalence------------------------------------------------------------------------------------------------71 5.6.Eparpillement---------------------------------------------------------------------------------------------76 5.7.Inversion---------------------------------------------------------------------------------------------------78 5.8.Palindrome-------------------------------------------------------------------------------------------------81 5.9.Cryptage---------------------------------------------------------------------------------------------------84 5.10.Comptage-------------------------------------------------------------------------------------------------86 5.11.Les tris----------------------------------------------------------------------------------------------------89 5.12.Le calcul des heures-----------------------------------------------------------------------------------101 5.13.Le jeu du pendu----------------------------------------------------------------------------------------103 5.14.Le crible d'Erathostne--------------------------------------------------------------------------------106
Afpa
Page 4 de 150
12/06/2010
AFPA
Page 5 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation Ces instructions peuvent : soit s'enchaner les unes aprs les autres, on parle alors de squence d'instructions; ou bien s'excuter dans certains cas et pas dans d'autres, on parle alors de structure alternative; ou se rpter plusieurs fois, on parle alors de structure rptitive.
1.1.
La squence d'instructions
Une instruction est une action que l'ordinateur est capable d'excuter. Chaque langage de programmation fournit une liste des instructions qui sont implmentes et que l'on peut donc utiliser sans les rcrire en dtail. Structurer un programme s'effectue que le programme soit crit en C, en Java, en Visual Basic. Dans un premier temps, nous crirons nos programmes en utilisant un pseudolangage que nous pourrons traduire ensuite dans l'un des langages de programmation.
Afpa
Page 7 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation Pour illustrer droulement notre de propos, prenons la journe l'exemple du de Buggy.
Vous voyez que l'ordre des instructions a de l'importance : "S'habiller" puis "prendre sa douche" conduit un rsultat pas gnial que nous appellerons un "bug". Cependant certaines instructions peuvent se drouler dans un ordre indiffrent: "prendre sa douche" et "prendre son petit djeuner" peuvent tre inverss sans prjudice pour le rsultat. Une alternative s'exprime par si .. sinon
Si fin de semaine ou cong Se lever Prendre son petit djeuner Prendre sa douche Mettre sa tenue de sport Faire son jogging Sinon Se lever Prendre son petit djeuner Prendre sa douche Mettre sa tenue de travail Aller travailler
Que la condition soit ralise (condition vraie) ou qu'elle ne le soit pas (condition fausse) les premires actions sont les mmes et se passent dans le mme ordre ce qui permet la simplification suivante :
Se lever Prendre son petit djeuner Prendre sa douche Si fin de semaine ou cong
Afpa
Page 8 de 150
12/06/2010
Remarquez que les actions si vrai ou si faux sont dcales par rapport aux autres instructions afin de permettre une meilleure lisibilit; on parle d'indentation.
Afpa
Page 9 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation Pour illustrer l'itrative ou rptitive (les deux termes sont quivalents), continuons notre exemple en supposant que Buggy dont nous vivons la journe palpitante, soit un employ de banque. La routine journalire de cet employ est :
Ouvrir guichet Appeler premier client Tant que client dans file d'attente et pas fin de journe Traiter client Appeler client suivant FinTantQue
Les deux actions "Traiter client" et "Appeler client suivant" vont se rpter tant que la condition situe derrire l'instruction "Tant que" est vrifie.
Afpa
Page 10 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation Considrons maintenant le programme complet de la journe de Buggy
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. FinSi Fin Fonction Sinon Classer Fonction Guichet Si client en file d'attente Traiter client Appeler client suivant Fin Fonction Fonction travail Ouvrir guichet Appeler premier client Tant que pas heure de djeuner Faire guichet FinTantQue Djeuner Tant que client et pas heure de sortie Faire guichet FinTantQue FinSi Rentrer la maison Dner Aller se coucher Sinon Mettre sa tenue de travail Aller travailler Faire travail Se lever Prendre son petit djeuner Prendre sa douche Si fin de semaine ou cong Mettre sa tenue de sport Faire son jogging Passer une journe de dtente
Afpa
Page 11 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation Remarques : Faire travail tant une instruction assez complexe, elle a t dtaille dans la fonction Travail pour une meilleure lisibilit du programme. De mme, nous avons cr une fonction guichet afin de ne pas rpter la mme squence d'instructions deux fois dans le programme. Notre programme a donc t scind en deux parties : le corps du programme de la ligne 1 la ligne 15 les fonctions ou sous-programmes internes partir de la ligne 17. Comment cela se passe-t-il lorsque nous rencontrons un appel de fonction ? A la ligne 11 nous avons "Faire travail" qui indique la machine qu'elle doit aller en ligne 17 qui correspond au dbut de la fonction appele. La procdure fait les actions des lignes 18, 19 et 20. Elle trouve nouveau un appel de fonction, cette fois-ci "Faire guichet" donc elle se dbranche vers la ligne 29 et excute les instructions jusqu' la ligne 36 o se trouve "Fin fonction" se qui ramne la machine l'instruction se situant juste aprs " Faire guichet" c'est dire ligne 22. puis les actions des lignes 20, 21, 22 vont se rpter n fois jusqu' l'heure de djeuner. Ensuite, la ligne 23 est excute et nouveau il y aura rptition de faire guichet (avec dbranchement la ligne 29 et retour la ligne 26. Lorsque nous arrivons sur la ligne 27 "Fin fonction", nous retournons la ligne 12.
Afpa
Page 12 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation Dans notre pseudo-langage, nous n'aurons que la liste minimum d'instructions, ncessaire et suffisante pour les programmes que nous aurons crire.
1.2.
L'affectation
Variable Valeur
Ce qui se lit "variable reoit valeur" et qui signifie que nous mmorisons la valeur un endroit nomm variable. Nous pourrions aussi dire que nous rangeons une valeur dans des cases de la mmoire que nous nommons variable.
Par exemple :
i1 Termine VRAI*
Il ne faut jamais confondre valeur et variable. Une variable est caractrise par : une adresse c'est dire un emplacement dans la mmoire de la machine, un type permettant d'indiquer la nature de l'information contenue, ventuellement une longueur si le type ne le dfinit pas. Quand nous aurons affaire une variable numrique, nous crirons
nCompteur 0 nSalaire nSalaireBase
Dans le premier exemple, nous envoyons la constante 0 dans une variable nomme nCompteur. Dans le deuxime exemple, nous envoyons le contenu de la variable nSalaireBase comme contenu de la variable nSalaire. Quand nous sommes en alphanumrique, nous crirons
Afpa
prsence
d'une
variable
Page 13 de 150
12/06/2010
Dans le premier cas, nous envoyons la constante Bonjour dans une variable nomme strMessage. "AFFICHER strMessage" donnera comme rsultat l'affichage du mot Bonjour. Dans le deuxime exemple, nous envoyons le contenu de la variable nomme Bonjour qui peut contenir BYE comme contenu de la variable strMessage. "AFFICHER strMessage" donnera comme rsultat l'affichage du mot BYE.
Afpa
Page 14 de 150
12/06/2010
1.2.1.
les oprations
Les oprations arithmtiques courantes, addition, soustraction, multiplication et division s'crivent ainsi :
variable val1 + val2 variable val1 - val2 variable val1 * val2 variable val1 / val2
1.2.2.
Pour permettre au programme de dialoguer avec l'utilisateur, c'est dire d'afficher un rsultat l'cran et de lire une entre au clavier, il faut au moins deux instructions une pour lire, l'autre pour afficher. Dans le pseudo-langage, elles s'crivent ainsi :
LIRE Variable AFFICHER Texte Variable Variable Texte ...
La premire lit tous les caractres qui sont saisis au clavier, jusqu' ce que l'utilisateur appuie sur la touche entre, et range le rsultat dans la variable. La seconde affiche sur l'cran le ou les textes et la valeur des variables. exemple :
AFFICHER "Quel est ton nom ? " LIRE nom_utilisateur AFFICHER "Ton nom est : " nom_utilisateur ". Le mien est TOTO"
Afpa
Page 15 de 150
12/06/2010
1.3.
la structure alternative
Il est souvent ncessaire lorsque nous crivons un programme de distinguer plusieurs cas conditionnant l'excution de telles ou telles instructions. Pour ce faire, on utilise une structure alternative : si on est dans tel cas, alors on fait cela sinon on fait ceci. La syntaxe de cette instruction est la suivante :
SI condition ALORS actions si vrai [ SINON actions si faux] FINSI
Exemples : Pour avoir la valeur absolue (appele nAbsolu dans notre exemple) d'un nombre (n1 dans notre exemple), s'il est ngatif nous le multiplions par 1 sinon la valeur absolue gale le nombre :
SI (n 1 < 0) ALORS nAbsolu n1 * (-1) SINON nAbsolu n1 FINSI
Afpa
Page 16 de 150
12/06/2010
1.3.1.
Les conditions
Pour exprimer les conditions on utilise les oprateurs conditionnels suivants : = gal < Infrieur > Suprieur <= infrieur ou gal >= suprieur ou gal <> Diffrent
(n1 < 1) (strToto <> strTiti)
On peut combiner des conditions l'aide des oprateurs logiques suivants : ET OU NON XOR (ou exclusif)
((n1<2) ET ((n2 = 0) OU (n3 <>n1)) XOR (n4 = 1))
Lorsque l'on crit de telles conditions, il est recommand de mettre toutes les parenthses afin d'viter les erreurs car les oprateurs ont une hirarchie qui ne collera pas ncessairement avec votre logique.
1.3.2.
Les -
Les actions
actions qui suivent sinon ou alors peuvent tre : une simple instruction une suite d'instructions spares par des ; une autre alternative une rptitive
Afpa
Page 17 de 150
12/06/2010
1.4.
La structure rptitive
Un programme a presque toujours pour rle de rpter la mme action un certain nombre de fois. Pour ce faire, nous utiliserons une structure permettant de dire " Excute telles actions jusqu' ce que telle condition soit remplie". Bien qu'une seule soit ncessaire, la plupart des langages de programmation proposent trois types de structure rptitive. Voici celles de notre pseudo-langage.
1.4.1.
TantQue
TantQue condition actions FinTQ
Ce qui signifie : tant que la condition est vraie, on excute les actions. exemple :
bSuite Vrai; TantQue (bSuite) n1 n1+1; SI (strFin = "oui") ALORS bFini faux FinSi FinTQ
Afpa
Page 18 de 150
12/06/2010
1.4.2.
Faire Jusqu'
FAIRE actions JUSQUA condition
Ce qui signifie que l'on excute les actions jusqu' ce que la condition soit vraie. exemple :
bFini -FAUX; Faire n1 n1+1; SI (n2 / n1 < nEpsilon) ALORS bFini VRAI SINON n2 n2 / n1 FINSI Jusqua (bFiini = VRAI);
1.4.3.
Pour
Trs souvent, nous utilisons une structure rptitive avec un compteur et nous arrtons lorsque le compteur a atteint sa valeur finale.
n1 1 TantQue (n1 < 10) nFactoriel nFactoriel * n1 n1 n1 + 1 FINTQ
C'est pourquoi la plupart des langages de programmation offrent une structure permettant d'crire cette rptitive plus simplement. Dans le pseudolangage c'est la structure pour :
POUR variable ALLANT DE valeur initiale A valeur finale [PAS valeur du pas] actions FinPour
Lorsque le
Afpa
PAS
1.5.
La compilation
Un langage de programmation sert crire des programmes de manire les excuter. Des outils permettent de traduite le langage crit par le programmeur en langage machine. Ils fonctionnent de la manire suivante : Programme source
C o Bi m bl pi la Er io Fichier th te re objet ur ur di q s te u ur e d s Fichier e Er excutable li re e ur ns Le compilateur analyse le langage source afin de vrifier s la syntaxe et de gnrer un fichier objet en langage
intermdiaire assez proche du langage machine. Tant qu'il y a des erreurs de syntaxe, le compilateur est incapable de gnrer le fichier objet.
Afpa Page 20 de 150 12/06/2010
Algorithmes et structuration de programmes Support de formation Souvent, on utilise dans un programme des fonctions qui soit ont t crites par quelqu'un d'autre soit sont fournies dans une bibliothque (graphique par exemple). Dans ce cas, le compilateur ne les connat pas et ne peut donc pas gnrer le langage intermdiaire correspondant. C'est le travail de l'diteur de liens que d'aller rsoudre les rfrences non rsolues. C'est dire que lorsqu'il est fait appel dans le fichier objet des fonctions ou des variables externes, l'diteur de liens recherche les objets ou bibliothques concerns et gnre l'excutable. Il se produit une erreur lorsque l'diteur de liens ne trouve pas ces rfrences.
Afpa
Page 21 de 150
12/06/2010
1.6.
Un programme parties :
donnes
instructions
La partie instructions contient les instructions excuter. La partie donnes contient toutes les variables utilises par le programme. Un programme excutable est charg dans la mmoire centrale de l'ordinateur, les valeurs que l'on a affectes aux variables doivent tre conserves tout le temps du droulement du programme. Par consquent, il faut que le programme soit capable de rserver la place ncessaire aux variables. Pour ce faire, les variables doivent tre dclares afin que le compilateur sache quelle place elles vont occuper.
1.6.1.
Les variables que l'on utilise dans les programmes ne sont pas toutes de mme nature, il y a des nombres, des caractres, ... On dit que les variables sont types. Il est ncessaire de donner un type aux variables, car cela permet d'une part de contrler leur utilisation (ex: on ne peut pas diviser un caractre par un entier) et
Afpa Page 22 de 150 12/06/2010
Algorithmes et structuration de programmes Support de formation d'autre part car cela indique quelle place il faut rserver pour la variable. Gnralement les langages de programmation offrent les types suivants :
entier
: il s'agit des variables destines contenir un nombre entier positif ou ngatif. Dans notre pseudo-langage, nous crirons la dclaration des variables de type entier :
ENTIER variable, variable, ... ;
Gnralement un entier occupe 2 octets, ce qui limite les valeurs de -32768 +32768. Cependant cela dpend des machines, des compilateurs, et des langages. Certains langages distinguent les entiers courts (1 octet), les entiers longs (4 octets) et les entiers simples (2 octets).
rel
: il s'agit des variables numriques qui ne sont pas des entiers, c'est dire qui comportent des dcimales. Gnralement un nombre rel est cod sur 4 octets (voir cours sur le codage des informations). Dans notre pseudo-langage, la dclaration des variables de type rel est la suivante :
REEL variable, variable, ... ;
caractre
: Les variables de type caractre contiennent des caractres alphabtiques ou numriques (de 0 9), mais dans ce cas ils ne sont pas considrs comme tant des nombres et on ne peut pas faire d'oprations dessus. Un caractre occupe un octet.
Afpa Page 23 de 150 12/06/2010
Algorithmes et structuration de programmes Support de formation Dans notre pseudo-langage, une variable de type caractre se dclare ainsi :
CAR variable , variable , ...;
Remarque : les chanes de caractres, dans notre langage sont des tableaux de caractres (voir 1.6.2)
boolen
: Il est souvent ncessaire lorsque l'on crit un programme d'introduire des variables qui prennent les valeurs vrai ou faux ou les valeurs oui ou non. Pour cela, il existe un type particulier dont les variables ne peuvent prendre que 2 valeurs : vrai ou faux.. Dans notre pseudo-langage, la dclaration s'crit :
BOOLEEN variable, variable, ... ;
1.6.2.
les tableaux
On peut regrouper plusieurs variables sous un mme nom, chacune tant alors repre par un numro. C'est ce que l'on appelle un tableau. On peut faire un tableau avec des variables de n'importe quel type. Dans tous les cas le ime lment d'un tableau appel tab sera adress par tab(i). Gnralement on fait des tableaux une dimension, mais il existe galement des tableaux deux dimensions, dans ce cas tab(i,j) reprsente la jme colonne et la ime ligne.
TABLEAU type variable [ longueur ] ;
exemple :
TABLEAU CAR mot[10];
Afpa
Page 24 de 150
12/06/2010
Le premier exemple montre la dclaration d'un tableau de 10 postes de type caractre dont les postes seront nommes mot (i) i allant de 1 10.
Afpa
Page 25 de 150
12/06/2010
1.7.
Lorsque l'algorithme devient trop compliqu, nous avons envie de le dcouper, de manire ce que chaque partie soit plus simple et donc plus lisible. De mme, lorsqu'une partie de code doit tre excute plusieurs fois des endroits diffrents ou rutilise ultrieurement on pourra ne l'crire qu'une fois et lui donner un nom en en faisant une fonction ou une procdure.
1.7.1.
Procdure
Une procdure est une suite d'instructions servant raliser une tche prcise en fonction d'un certain nombre de paramtres. Ce lot d'instructions est crit une fois dans la procdure mais peut tre excute autant de fois que voulu en appelant la procdure : on aura donc une ligne de code pour excuter n instructions. De plus une procdure peut fonctionner avec des paramtres qui sont indiqus au moment de l'appel et pris en compte dans l'excution de la procdure. Les paramtres sont de deux types. Les paramtres de type VAL : ils contiennent une valeur qui sera utilise dans la procdure. Les paramtres de type VAR : ils reprsentent une variable du programme appelant qui pourra tre lue et modifie si ncessaire. Dans notre pseudo-langage, une procdure se dclare de la manire suivante :
Afpa Page 26 de 150 12/06/2010
Les variables que nous dclarons l'intrieur de procdure ne sont connues que dans cette procdure. Elles sont d'ailleurs nommes variables locales. Pour utiliser cette procdure dans un programme appelant, on crit :
nom procdure ( P1, P2, ...,Pn.) ;
Afpa
Page 27 de 150
12/06/2010
Cette procdure attend en entre, trois paramtres pour fonctionner. Le premier sera de type caractre, le second de type numrique entier et le troisime de type tableau de caractres Nous appellerons cette fonction comme ceci :
remplir_chaine("*",12, ligne); remplir_chaine(longmot, rep, message);
Dans le premier cas, nous envoyons en paramtres deux constantes et une variable : la premire constante("*")de type caractre qui sera reue dans caractre, la seconde (12) qui sera reue dans longueur et la variable (ligne) qui sera reue dans chane. Dans le deuxime appel tous les paramtres sont transmis sous forme de variables. Appel par remplir_chaine("*",12, ligne);
remplir_chaine(rep, longmot,
Afpa
Page 28 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation Les paramtres doivent tre transmis dans l'ordre et doivent respecter le type dfini dans la procdure.
Afpa
Page 29 de 150
12/06/2010
1.7.2.
Fonction
Une fonction est une procdure dont le but est de dterminer une valeur et de la retourner au programme appelant. Dans notre pseudo-langage, elle se dclare de la manire suivante :
type FONCTION nom de la fonction ( VALtype nom VARtype nom, type nom, ... ) dclarations de variables locales DEBUT actions RETOURNE valeur FIN
Les mmes remarques que pour la procdure s'appliquent. De plus, il faut noter que la fonction retourne une valeur (ou le contenu d'une variable) et que donc la dclaration on doit indiquer son type, c'est dire le type de cette valeur. L'appel d'une fonction s'crit :
variable nom de la fonction ( valeur1 , valeur2 , .. ) ;
Afpa
Page 30 de 150
12/06/2010
Afpa
Page 31 de 150
12/06/2010
2. Rgles de programmation
Un programme doit tre le plus lisible possible, de manire ce que n'importe qui d'autre que l'auteur soit capable de comprendre ce qu'il fait rien qu'en le lisant. Pour cela il faut suivre les quelques rgles suivantes :
Le nom des variables doit tre significatif, c'est dire indiquer clairement quoi elles servent Un algorithme ne doit pas tre trop long (une page cran). S'il est trop long, il faut le dcouper en fonctions et procdures (voir 1.7) Les structures de contrle doivent tre indentes, c'est dire, par exemple, que les instructions qui suivent le alors doivent toutes tre alignes et dcales d'une tabulation par rapport au si. Il en est de mme pour les rptitives. A chaque imbrication d'une structure de contrle, on dcale d'une tabulation.
mieux crit : ENTIER i,j; ENTIER nbmots, nbavecx; BOOLEEN trouve; TABLEAU CAR mots (10) (20) i -1; nbmots 0; nbavecx 0; FAIRE SI (mots(i,1) <> ' ') ALORS trouve FAUX; nbmots nbmots + 1; j 1; TANTQUE ((j < 20) ET (NON trouve)) SI (mots(i,j) = 'X') ALORS
exemples :
mal crit : ENTIER a,b,c,i,j,k TABLEAU CAR tab(10)(20) i 1; a -0; b0; FAIRE SI (tab(i,1) <> ' ') ALORS c 0 ; a a+1; j1 TANTQUE ((j <20) ET (c <> 0)) FAIRE SI tab(i,j) = 'X' ALORS c 0 FINSI j j+1; FINTQ FINSI SI (c = 0) ALORS b b+1 FINSI i i+1; JUSQUA (i > 10);
Afpa
Page 32 de 150
12/06/2010
Afpa
Page 33 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation En ce qui concerne les fonctions et procdures, il y a aussi des rgles respecter :
On doit toujours tre capable de donner un nom significatif une procdure ou une fonction. Le nombre de paramtres ne doit pas tre trop grand ( en gnral infrieur 5) car cela nuit la lisibilit du programme. Une procdure ou une fonction doit tre la plus gnrale possible de manire pouvoir tre rutilise dans d'autres circonstances. Si le but d'une procdure est de calculer une valeur simple, il est prfrable d'en faire une fonction. Il est souvent plus clair d'crire une fonction boolenne plutt qu'une condition complexe.
Afpa
Page 34 de 150
12/06/2010
3. La syntaxe du pseudo-langage
Un programme comportera Une partie dclaration Une partie encadre par dbut les actions
programme : dclarations; DEBUT Actions FIN
Dans la partie dclarations, nous trouvons : dclaration de variables dclaration de fonction dclaration de procdure
3.1.1.
Dclaration de variables :
type nom ou TABLEAU type nom ( entier ) [ ( entier ) ] ;
ENTIER
3.1.2.
Dclaration de fonction :
type FONCTION ( VAL type nom, type nom, ...VAR type nom, type nom, ...) dclaration de variables DEBUT Actions RETOURNE valeur FIN
3.1.3.
Dclaration de procdure:
PROCEDURE nom ( dclaration de variables DEBUT VAL type nom, type nom, ...VAR type nom, type nom, ...)
Afpa
Page 35 de 150
12/06/2010
Afpa
Page 36 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation Dans la partie actions, nous trouvons : suite d'instructions alternative rptitive
3.1.4.
Suite d'instructions :
instruction; instruction; ...
3.1.5.
Alternative :
SI condition ALORS Actions si vrai [ SINON actions si faux] FINSI
3.1.6.
Faire Pour
Rptitive :
Tantque
Afpa
Page 37 de 150
12/06/2010
3.1.7.
3.1.8.
Les instructions
variable valeur LIRE variable AFFICHER [texte valeur ] Appel de fonction : param1, param2, ...) ; Appel de procdure param2, ...) ;
Pour exprimer une valeur, nous pouvons utiliser : Un nom de variable Une constante
Afpa
Page 38 de 150
12/06/2010
Dans les quelques pages qui suivent, nous vous indiquerons quelques raisonnements tenus pour arriver un pseudo code rpondant une question donne mais il s'agit de notre faon de raisonner : vous de vous construire la votre.
Afpa
Page 39 de 150
12/06/2010
Pour illustrer notre discours, nous allons utiliser le problme suivant : Cet algorithme permet de ranger un lment sa place dans une liste de manire trs rapide. Nous possdons une liste de N entiers tris, nous oulons placer un nombre X au bon endroit parmi ceux dj tris. Comment ? On compare X l'lment du milieu de tableau, s'il est infrieur on rduit le tableau sa partie gauche, s'il est suprieur on rduit le tableau sa partie droite. On ritre l'opration jusqu' ce que le tableau ait moins de 3 lments.
Afpa
Page 40 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation Quels sont les diffrents types de cas traiter ?
Premier cas
Les lments de dpart sont : 2 3 3 5 6 8 1 2 2 2 5 6 4 2 5 3 5 5
Deuxime cas
Les lments de dpart sont : Nous voulons insrer le nombre 7 dans une liste ne comportant aucun lment Le rsultat devrait tre : 7
Troisime cas
Les lments de dpart sont : 2 3 3 5 6 8 1 2 2 2 5 6 4 2 5 3 5 5
Nous voulons insrer le nombre 1en premire case Le rsultat devrait tre : 1 2 3 3 5 6 8 1 2 2 4 5 5 2 5 6 2 3 5
Quatrime cas
Les lments de dpart sont :
Afpa Page 41 de 150 12/06/2010
Nous voulons insrer le nombre 60 qui sera en fin de liste Le rsultat devrait tre : 2 3 3 5 6 8 1 2 2 4 5 5 6 2 5 6 2 3 5 0
6me lment est 8 7 est plus petit que 8 donc nous insrerons 7 dans 2 3 3 5 6 8 Nous re divisons le nombre d'lments 6 par 2 soit 3 .le 3me lment est 3 ==> on insre 7 dans 3 5 6 8 Nous re divisons le nombre d'lments soit 4 par 2 le 2me lment est 5 ==> on insre 7 dans 5 6 8 Nous re divisons le nombre d'lments soit 3 par 2 soit 1,5 que nous arrondissons 2 .le 2me lment est 6 infrieur 7 ==> on insre 7 entre 6 8 6 7 8
Afpa
Page 43 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation Rsumons notre dmarche : Soit un nombre insrer
nAInserer
Soit le nombre d'lements consuler prend la valeur de nFin Nous cherchons le nombre d'lments consulter
nbElement nFin nbElement
Si le rsultat n'est pas entier, nous arrondissons l'entier suprieur nPosition Nous comparons le nPositionime numro de la liste avec notre nombre Insrer Si ce nombre est infrieur au nombre insrer, nous prenons la partie droite du tableau depuis l'lment en nPosition jusqu' la fin; cela revient dire que nous changeons la position de dbut du tableau nDebut prend la valeur de nPosition. er autrement nous prenons la partie gauche depuis le 1 lment jusqu' l'lment en nPositio; cela revient dire que nous changeons la position de fin du tableau nFin prend la valeur de nPosition Nous cherchons le nombre d'lments restant consulter nbElement nbElement prend la valeur de nFin nDebut + 1 Nous divisons ce nombre par 2
nPosition
Si le rsultat n'est pas entier, nous arrondissons l'entier suprieur nPosition Voyez que nous sommes en train de recommencer la dmarche telle qu'elle a t dcrite un peu au dessus. Nous sommes donc en train de rpter une mme squence de ligne ce qui veut dire que nous sommes en prsence d'une rptitive.
Afpa Page 44 de 150 12/06/2010
Algorithmes et structuration de programmes Support de formation Notre dmarche devient donc Soit un nombre insrer
nAInserer
la premire fois
nbElement
prend la valeur de
nFin
Nous rptons
Nous divisons ce nombre par 2
nPosition
Si le rsultat n'est pas entier, nous arrondissons l'entier suprieur nPosition Nous comparons le nPositionime numro de la liste avec notre nombre Insrer Si ce nombre est infrieur au nombre insrer, nous prenons la partie droite du tableau depuis l'lment en nPosition jusqu' la fin; cela revient dire que nous changeons la position de dbut du tableau nDebut prend la valeur de nPosition. er autrement nous prenons la partie gauche depuis le 1 lment jusqu' l'lment en nPosition; cela revient dire que nous changeons la position de fin du tableau nFin prend la valeur de nPosition Nous cherchons le nombre d'lments restant consulter nbElement les autres fois nbElement prend la valeur de nFin nDebut +
1
Algorithmes et structuration de programmes Support de formation un solide bons sens; si nous n'y rpondons pas bien nous avons deux cueils possibles Nous ne rentrons jamais dans la squence d'instructions Nous n'en sortons jamais : c'est ce que nous appelons "boucler"; c'est le mouvement perptuel. Dans notre exemple, nous avons termin la rptition quand notre nombre d'lments consulter est arriv 2
Afpa
Page 46 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation Notre dmarche devient donc Soit un nombre insrer
nAInserer
la premire fois
nbElement
nFin
nombre
Si le rsultat n'est pas entier, nous arrondissons l'entier suprieur nPosition Nous comparons le nPositionime numro de la liste avec notre nombre Insrer Si ce nombre est infrieur au nombre insrer, nous prenons la partie droite du tableau depuis l'lment en nPosition jusqu' la fin; cela revient dire que nous changeons la position de dbut du tableau nDebut prend la valeur de nPosition. er autrement nous prenons la partie gauche depuis le 1 lment jusqu' l'lment en nPosition; cela revient dire que nous changeons la position de fin du tableau nFin prend la valeur de nPosition FINSI Nous cherchons le nombre d'lments restant consulter nbElement les autres fois nbElement prend la valeur de nFin nDebut +
1
maintenant
Page 47 de 150
avec
deux
FINTQ lments
12/06/2010
Algorithmes et structuration de programmes Support de formation Toujours en se basant sur le bon sens, nous savons que le deuxime lment est ncessairement plus grand ou gal que le nombre insrer car quand nous coupions notre tableau en deux c'tait par un "infrieur". Il suffit donc de comparer notre nombre insrer au premier lment. SI l'lment en position nDebut est infrieur notre nombre insrer La position dans laquelle nous allons insrons notre nombre insrer est nDebut + 1 Autrement c'est nDebut FINSI
Afpa
Page 48 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation A ce point du raisonnement, nous savons qu'il faut insrer 7 en 6me position Soit nPosition = 6. 7 2 3 3 5 6 8 1 2 2 5 2 6 4 2 5 3 5 5
Si nous envoyons notre nombre insrer en 6me position, nous allons "craser" la valeur qui y tait soit 8 : Notre rsultat serait alors 2 3 3 5 6 7 1 2 2 5 2 6 4 2 5 3 4 2 5 5 5 3 5 5
Ce qu'il faut faire c'est dcaler 8 vers la droite c'est dire la place de 12 pour mettre 7 la place 2 3 3 5 6 7 8 2 2 4 5 5 5 6 2 3 5 Si nous procdons ainsi nous perdons toujours un des lments initiaux. Comment faire pour ne rien perdre ? il faut commencer par la fin. 2 3 3 5 6 8 1 2 2 4 5 5 2 5 6 2 3 5
7 8 7 6 5 4 3 2 1
2
Afpa
1 2
2 5
2 6
4 2
5 5
5 5
12/06/2010
Page 49 de 150
Algorithmes et structuration de programmes Support de formation Traduite en franais, notre dmarche serait : Soit le nombre d'lments de la liste d'origine
nFin
nFin
la position
Qui se traduit aussi par POUR n ALLANT de nFIN nPosition en faisant 1 chaque tour Prendre la valeur en position n et la mettre dans la valeur en position n+1
FINPOUR
Afpa
Page 50 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation En rsum, notre dmarche est devenue : Soit un nombre insrer
nAInserer
la premire fois
nbElement
prend la valeur de
TANTQUE
nFin
nombre
Si le rsultat n'est pas entier, nous arrondissons l'entier suprieur nPosition Nous comparons le nPositionime numro de la liste avec notre nombre Insrer Si ce nombre est infrieur au nombre insrer, nous prenons la partie droite du tableau depuis l'lment en nPosition jusqu' la fin; cela revient dire que nous changeons la position de dbut du tableau nDebut prend la valeur de nPosition. er autrement nous prenons la partie gauche depuis le 1 lment jusqu' l'lment en nPosition; cela revient dire que nous changeons la position de fin du tableau nFin prend la valeur de nPosition
FINSI
Nous cherchons le nombre d'lments restant consulter nbElement les autres fois nbElement prend la valeur de nFin nDebut +
1
FINTQ
position dans laquelle nous allons insrons notre nombre insrer est nDebut + 1 Autrement c'est nDebut
FINSI
n ALLANT de nFIN nPosition en faisant 1 chaque tour Prendre la valeur en position n et la mettre dans la valeur en position n+1
POUR FINPOUR
Afpa
Page 52 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation Examinons maintenant le deuxime cas Les lments de dpart sont : Nous voulons insrer le nombre 7 dans une liste ne comportant aucun lment Le rsultat devrait tre : 7 Par rapport au cas prcdant, nous nous apercevons que la recherche de la position d'insertion est inutile car il n'y a pas de liste d'lments au dpart. De mme, il ne sera pas ncessaire de faire des dcalages puisqu'il n'y a rien dcaler. Pour ce cas, la procdure sera : Soit un nombre insrer
nAInserer
Afpa
Page 53 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation Nous adaptons notre dmarche du premier cas Soit un nombre insrer
nAInserer
nFin
pas zro
TANTQUE
Nous rptons
nPosition
Nous divisons ce nombre par 2 Si le rsultat n'est pas entier, nous arrondissons l'entier suprieur
nPosition
ce nombre est infrieur au nombre insrer, nous prenons la partie droite du tableau depuis l'lment en nPosition jusqu' la fin; cela revient dire que nous changeons la position de dbut du tableau nDebut prend la valeur de nPosition. autrement nous prenons la partie gauche depuis le 1er lment jusqu' l'lment en nPosition; cela revient dire que nous changeons la position de fin du tableau nFin prend la valeur de nPosition
FINSI
Nous cherchons le nombre d'lments restant consulter nbElement les autres fois nbElement prend la valeur de nFin nDebut + 1
Afpa Page 54 de 150 12/06/2010
en position nDebut est infrieur notre nombre insrer La position d'insertion est Autrement c'est
FINSI nDebut nDebut
+1
chaque tour
de
nFIN
nPosition
en faisant 1
Afpa
Page 55 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation Examinons le troisime cas Les lments de dpart sont : 2 3 3 5 6 8 1 2 2 2 5 6
4 2
5 3
5 5
Nous voulons insrer le nombre 1en premire case Le rsultat devrait tre : 1 2 3 3 5 6 8 1 2 2 4 5 5 2 5 6 2 3 5 La dmarche fonctionne crite pour les deux premiers cas
4 2
5 3
5 5
Nous voulons insrer le nombre 60 qui sera en fin de liste Le rsultat devrait tre : 2 3 3 5 6 8 1 2 2 4 5 5 6 2 5 6 2 3 5 0 Lorsque nous droulons la dmarche prcdemment crite, nous arrivons une anomalie. Au premier Variable Valeur
TANTQUE, les NDbut
12
TANTQUE , NFin
1 elles valent :
NPosition
12
nbElement
12
7
12/06/2010
Page 56 de 150
Algorithmes et structuration de programmes Support de formation Dmarrons le premier TANTQUE, nPosition devient 7 / 4 = 3,5 ramen l'entier suprieur soit 4. Problme, car 4 n'est pas compris entre 6 et 12. il Nous faut changer le calcul de nPosition par Ce calcul devient : Nous divisons ce nombre par 2
nPosition
nPosition
Ajouter nDebut nPosition Si nous reprenons les cas prcdant, cette nouvelle dmarche fonctionne toujours. La dmarche finale est : Soit un nombre insrer
nAInserer
pas zro
TANTQUE
Nous rptons
nPosition
Nous divisons ce nombre par 2 Si le rsultat n'est pas entier, nous arrondissons l'entier suprieur Ajouter nDebut 1 nPosition Nous comparons le nPositionime numro de la liste avec notre nombre Insrer
Si
nPosition
ce nombre est infrieur au nombre insrer, nous prenons la partie droite du tableau depuis l'lment en nPosition jusqu' la fin;
Afpa
Page 57 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation cela revient dire que nous changeons la position de dbut du tableau nDebut prend la valeur de nPosition. autrement nous prenons la partie gauche depuis le 1er lment jusqu' l'lment en nPosition; cela revient dire que nous changeons la position de fin du tableau nFin prend la valeur de nPosition
FINSI
Nous cherchons le nombre d'lments restant consulter nbElement les autres fois nbElement prend la valeur de nFin nDebut + 1 Fin de la squence rpte
SI l'lment FINTQ
en position nDebut est infrieur notre nombre insrer La position d'insertion est Autrement c'est
FINSI nDebut nDebut
+1
de
nFIN
nPosition
en faisant 1
chaque tour Prendre la valeur en position n et la mettre dans la valeur en position n+1
FINPOUR FINSI
Afpa
Page 58 de 150
12/06/2010
5. Un peu d'entranement
Pour chacun des entranements proposs, vous avez : Le sujet sur la premire page Un corrig possible sur la page suivante Eventuellement des explications complmentaires Faites-les en ne regardant pas le corrig avant; cela peut paratre une vidence mais la tentation sera grande Rsistez !!!!
5.1.
L'alternative
Un patron dcide de calculer le montant de sa participation au prix du repas de ses employs de la faon suivante : S'il est clibataire participation de 20% S'il est mari participation de 25% S'il a des enfants participation de 10% supplmentaires par enfant La participation est plafonne 50% Si le salaire mensuel est infrieur participation est majore de 10% 6000f la
Afpa
Page 59 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation crire le programme qui lit les informations au clavier et affiche pour un salari, la participation laquelle il a droit. Deuxime partie de l'exercice : Corriger l'exercice prcdent pour ne pas tre oblig de relancer le programme pour chaque employ.
Afpa
Page 60 de 150
12/06/2010
Corrig
Car strRepMarie; Entier nEnfants, REEL nSalaire REEL nParticipation, AFFICHER "L'employ est-il mari (O/N) ?" LIRE strRepMarie AFFICHER "Combien a-t-il d'enfants ?" LIRE nEnfants AFFICHER "Quel est son nSalaire ?" LIRE nSalaire SI (strRepMarie = 'N') ALORS nParticipation 0.2 SINON nParticipation 0.25 FINSI nParticipation nParticipation + nEnfants*0.1 SI (nSalaire <= 6000) ALORS nParticipation nParticipation + 0.1 FINSI SI (nParticipation > 0.5) ALORS nParticipation 0.5 FINSI
Afpa
Page 61 de 150
12/06/2010
Afpa
Page 62 de 150
12/06/2010
5.2.
La boucle
Autre sujet : crire un programme qui saisit des entiers et en affiche la somme et la moyenne (on arrte la saisie avec la valeur 0)
Afpa
Page 63 de 150
12/06/2010
Corrig
REEL nSomme REEL nMoyenne REEL nNombreFrappes REEL nSaisie nSomme 0 nNombreFrappes 0 nSaisie = 99999 TANTQUE nSaisie <> 0 AFFICHER "entrer un entier" LIRE nSaisie SI (nSaisie <> 0) ALORS nNombreFrappes nNombreFrappes + 1; nSomme nSomme + nSaisie; SINON nMoyenne (nSomme / nNombreFrappes) AFFICHER "La somme = " somme " La moyenne = " moyenne FINSI FINTQ // tout sauf zro
Afpa
Page 64 de 150
12/06/2010
Les statistiques
On saisit des entiers (comme exercice prcdent) et on les range dans un tableau (maximum 50) crire un programme qui affiche le maximum, le minimum et la valeur moyenne de ces nombres.
Afpa
Page 65 de 150
12/06/2010
Corrig
ENTIER nMini, nMaxi,,nSomme REEL nMoyenne Entier nIndice, nbNombre, nSaisie TABLEAU ENTIER nTab[50] AFFICHER "entrer un entier" LIRE nSaisie nbNombres 0 TANTQUE (nSaisie <> 0 ET nbNombre < 50 SI (nombre <> 0) nb_nombres nb_nombres + 1 TAB(nb_nombres) nombre FINSI AFFICHER "entrer un entier" LIRE nSaisie FINTQ nSomme 0 nMini TAB(1) nMaxi TAB(1) POUR nIndice ALLANT DE 1 A nbNombres somme somme +TAB(nIndice) SI (TAB(i) < nMini ALORS min TAB(nIndice) SI (TAB(i) > nMaxi) ALORS max -TAB(nIndice) FinPour nMoyenne --(nSomme / nbNombres) AFFICHER "La somme = " nSomme " La moyenne = " nMoyenne AFFICHER "Le minimum = " nMini " Le maximum = " nMaxi
Afpa
Page 66 de 150
12/06/2010
5.3.
Contraction
Recopier une phrase dans une autre en tant toutes les occurrences dun caractre Soit une phrase termine par un point. Il s'agit de la restituer en supprimant les occurrences d'un caractre donn. Exemple : phrase : abbcccdeeeffg caractre : c rsultat : abbdeeeffg Donnez le jeu d'essai qui permet de tester cette procdure. Donnez l'algorithme de la procdure en pseudo code.
Afpa
Page 67 de 150
12/06/2010
Corrig
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. FINTQ AFFICHER "le rsultat est : ", strResultat FINSI; nIndice1 nIndice1 +1 TABLEAU CAR strPhrase1[100], strResultat[100] ENTIER nIndice 1, nIndice2 CAR strOctet String strSaisie AFFICHER "entrer la phrase termine par un point" LIRE strSaisie strPhrase1 strSaisie; AFFICHER "entrer le caractre ter"" LIRE strSaisie StrOctet strSaisie // nIndice1 1; nIndice2 1; TANTQUE strPhrase1(nIndice1) <> "." SI strPhrase1(nIndice1) <> strOctet ALORS strResultat(nIndice2) = strPhrase1(nIndice1) nIndice2 nIndice2 +1
Afpa
Page 68 de 150
12/06/2010
5.4.
Doublons
Recopier une phrase dans une autre en tant tous les doublons de caractres successifs Soit une phrase termine par un point. Il s'agit de la restituer en supprimant tous les doublons de caractres successifs. Exemple : abbcccdeeeffg. donne abcdefg.
Donnez le jeu d'essai qui permet de tester cette procdure. Pour tester le programme, c'est dire voir s'il rpond bien nos attentes, s'il n'a pas de "bug", avant de la faire "tourner" sur la machine nous imaginons un jeu d'essai avec tous les cas tester et le rsultat attendu pour chaque cas : c'est le jeu d'essai. Donnez l'algorithme de la procdure.
Afpa
Page 69 de 150
12/06/2010
Corrig
TABLEAU CAR strPhrase1[100], strResultat[100] ENTIER nIndice 1, nIndice2 CAR strOctet STRING strSaisie AFFICHER "entrer la phrase termine par un point" LIRE strSaisie strPhrase1 strSaisie; // nIndice1 1 nIndice2 1 strOctet " " TANTQUE strPhrase1(nIndice1) <> "." SI strPhrase1(nIndice1) <> strOctet ALORS strResultat(nIndice2) = strPhrase1(nIndice1) nIndice2 nIndice2 +1 strOctet strPhrase1(nIndice1) FINSI nIndice1 nIndice1 +1 FINTQ AFFICHER "le rsultat est : ", strResultat
Jeu d'essai: bbbbiidooooonn. donne bidon aaaaaaaaaaaaa. donne a meilleur donne meilleur Les deux derniers cas sont des cas extrmes mais dans un jeu d'essai srieux, ce sont des cas ne pas oublier Si nous voulions tre trs rigoureux, nous devrions tester que la phrase saisie se termine bien par un point. Si ce n'est pas le cas, le TANTQUE va provoquer une boucle dont nous ne sortirons jamais. Nous pourrions appeler le mouvement perptuel.
Afpa Page 70 de 150 12/06/2010
5.5.
Equivalence
Dterminer si deux phrases sont quivalentes. Soit deux phrases termines par un mme terminateur. Elles sont dites quivalentes si elles ont les mmes lettres dans le mme ordre mais avec un nombre d'occurrences de ces lettres qui peut diffrer entre les deux phrases. On supposera qu'il existe une fonction longueur lg de chane qui renvoie un entier Exemple : abbcccdeeeffg aabcdeffffg
sont quivalentes
Donnez le jeu d'essai qui permet de tester cette procdure. Donnez l'algorithme de la procdure toujours en pseudo code.
Afpa
Page 71 de 150
12/06/2010
Corrig
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. FINTQ SI bOK = vrai AFFICHER "Les phrases sont quivalentes"; SINON AFFICHER "Les phrases sont diffrentes"; FINTQ SINON bOk = faux FINSI; TANTQUE strPhrase1(nIndice1) = strOctet ET nIndice1 <strPhrase1.lg nIndice1 nIndice1 +1; FINTQ; TABLEAU CAR strPhrase1[100], strPhrase2[100] ENTIER nIndice 1, nIndice2 CAR strOctet BOOLEEN bOK STRING strSaisie AFFICHER "entrer la premire phrase" LIRE strSaisie strPhrase1 strSaisie; AFFICHER "entrer la deuxime phrase" LIRE strSaisie StrPhrase2 strSaisie; // bOk = vrai nIndice1 1; nIndice2 1; TANTQUE bOk = vrai ET nIndice1 <strPhrase1.lg ET nIndice2 <strPhrase2.lg strOctet strPhrase1(nIndice1) SI strPhrase2(nIndice2) = strOctet ALORS TANTQUE strPhrase2(nIndice2) = strOctet ET nIndice2 strPhrase2.lg nIndice2 nIndice2 +1;
Afpa
Page 72 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation Faisons tourner le programme la main, ligne par ligne avec les phrases : Phrase1 aabbbccddde Phrase2 : abccdeee Dans le tableau qui suit, nous notons tous les changements de valeurs subies au fur et mesure de l'excution du programme. La premire colonne indique la ligne du programme o les valeurs sont notes (les valeurs sont changes une fois la ligne d'affectation passe).
N ligne 14 15 16 18 21 27 27 18 21 26 26 26 21 21 27 27 18 21 27 27 27 18 21 21 21 27 nIndice1 1 1 a 2 2 3 b 3 4 5 6 4 5 7 8 d 6 9 10 11 e 7 8 9 12 c nIndice2 StrPhrase1() StrPhrase2() StrOctet bOk vrai
Afpa
Page 73 de 150
12/06/2010
Il est assez fastidieux de "drouler" le programme de cette manire; Des outils appels "dboggeur" vous permettent de laisser le travail la machine. Ils permettent de : Faire avancer le programme "pas pas" c'est dire ligne par ligne Lister le contenu des variables un point d'arrt c'est dire une ligne prcise (nous vous rappelons que les valeurs ne sont modifies qu'une fois l'affectation finie; il faut donc se positionner sur la ligne aprs l'affectation pour voir la valeur prise par la variable. Faire avancer le programme de point d'arrt en point d'arrt Eventuellement de modifier les valeurs des variables : attention si vous travaillez dans un contexte aussi utilis par les utilisateurs, vous risquez de faire des btises en modifiant la base de donnes relle. Cas n 1 Phrase n 1 ccccccdddddaaaagggg Phrase n 2 cccdddggggaa Rsultat phrases diffrentes Cas n 2 Phrase n 1 Phrase n 2 quivalentes aaazzzeeerrty azerty
Rsultat phrases
Rsultat
Afpa
Page 74 de 150
12/06/2010
Algorithmes et structuration de programmes Support de formation En effet, une lettre majuscule est diffrente d'une lettre minuscule sur un systme "casse sensitive". Elles sont quivalence sur les autres systmes.
Afpa
Page 75 de 150
12/06/2010
5.6.
Eparpillement
Chercher les lettres dun mot parpilles dans une phrase, dans le mme ordre. Soient un caractre terminateur et une phrase termine par ce caractre terminateur. Soient un mot donn Il s'agit de vrifier si les lettres du mot sont bien prsentes dans la phrase, ce dans le mme ordre que celui du mot. Exemple : terminateur : . phrase : le chat est gris et boit. mot : lattis longueur : 6 donne vrai Donnez l'algorithme de la procdure en pseudo code.
Afpa
Page 76 de 150
12/06/2010
Afpa
Page 77 de 150
12/06/2010
5.7.
Inversion
Effectuer la saisie d'une chane de caractres qui contiendra un nom et un prnom. Les prnoms composs seront obligatoirement spars par des tirets. Afficher une chane de caractres sous forme prnom nom spars par un espace, en ayant fait disparatre les tirets saisis dans le prnom. Ecrire la procdure en pseudo-code (ventuellement ensuite avec un langage). Ne pas utiliser les instructions de type concatnation et recherche d'un caractre dans une chane.
Afpa
Page 78 de 150
12/06/2010
TANTQUE nCurseur >= 1 ET strOctet(nCurseur) = " " nCurseur nCursur 1 FINTQ SI nCurseur = 0 ALORS AFFICHER "Vous n'avez rien saisi" SINON nFinPrenom nCurseur TANTQUE nCurseur >= 1 ET strOctet(nCurseur) <> " " nCurseur nCurseur 1 FINTQ SI nCurseur = 0 ALORS AFFICHER "Vous n'avez saisi que le prnom"; SINON NCurseur2 1; nDbutPrenom nCurseur + 1; POUR nIndice ALLANT DE nDebutPrenom A nFinPrenom PAS 1 SI strOctet (nIndice) = "-" ALORS StrResultat(nCurseur2) " ": SINON StrResultat(nCurseur2) StrOctet(nIndice); FINSI; nCurseur2 nCurseur2 + 1; FINPOUR; nCurseur nDebutPrenom - 2; StrNom(nCurseur2) " ": POUR nIndice ALLANT de 1 A nCurseur nCurseur2 nCurseur2 + 1; StrNom(nCurseur2) StrOctet(nIndice); FINPOUR; FINSI // envoi du nom aprs le prnom
Afpa
Page 79 de 150
12/06/2010
Afpa
Page 80 de 150
12/06/2010
5.8.
Palindrome
Dterminer si une chane de caractres est un palindrome. Un palindrome est une phrase qui peut se lire dans les deux sens. Les espaces sont ignors. Exemple : esope reste ici et se repose. Le terminateur est ici un point. Donnez l'algorithme du programme.
Afpa
Page 81 de 150
12/06/2010
Corrig
CAR strSaisie, strOctet TABLEAU CAR strPhrase1[100]; ENTIER nIndice 1, nIndice2; BOOLEEN bOK; AFFICHER "entrer la phrase termine par un point" LIRE strSaisie strPhrase1 strSaisie bOK = vrai nIndice1 1; // recherche longueur de la phrase nIndice2 1; TANTQUE strPhrase1(nIndice2) <> "." nIndice2 nIndice2 +1 FINTQ nIndice2 nIndice2 -1 TANTQUE nIndice1 <= nIndice2 ET bOk = vrai SI strPhrase1(nIndice1) = " " ALORS TANTQUE strPhrase1(nIndice1) = " " ET nIndice1 <= nIndice2 nIndice1 nIndice1 +1 FINTQ FINSI SI strPhrase1(nIndice2) = " " ALORS TANTQUE strPhrase1(nIndice2) = " " ET nIndice1 <= nIndice2 nIndice2 nIndice2 - 1 FINTQ FINSI SI strPhrase1(nIndice1) = strPhrase1(nIndice2) nIndice2 nIndice2 - 1 nIndice1 nIndice1 +1 SINON bOK = faux FINSI FINTQ SI bOk = vrai ALORS AFFICHER "La phrase est un palindrome"; SINON ALORS
Afpa
Page 82 de 150
12/06/2010
Afpa
Page 83 de 150
12/06/2010
5.9.
Cryptage
Crypter une phrase en codant les lettres en fonction du mot o elles se trouvent. Soit une phrase termine par un point. Les espaces sont des sparateurs de mot et sont transcrits sans modification. Il s'agit de la crypter en codant chaque mot suivant son rang dans la phrase. Au mot de rang 1, on crypte ses lettres avec les lettres qui suivent dans l'alphabet. Au mot de rang 2, on crypte ses lettres avec les lettres qui suivent de 2 caractres dans l'alphabet. etc ... Par convention, la lettre suivant le caractre Z est le caractre A. Les espaces sont des sparateurs de mot et sont transcrits sans modification. Exemple : Phrase : Rang : Rsultat :
3 .
Afpa
Page 84 de 150
12/06/2010
Corrig
CAR strSaisie, ENTIER nIndice1,nIndice2,nRang, TABLEAU CAR strPhrase1[100], strAlphabet[26] strResultat[100] AFFICHER "entrer la phrase termine par un point" LIRE strSaisie strPhrase1 strSaisie strAlphabet [A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z] nIndice1 1 nRang 1 TANTQUE strPhrase1(nIndice1) <> "." SI strPhrase1(nIndice1) <> " " ALORS // recherche indice lettre nIndice2 0 TANTQUE strPhrase1(nIndice1) <> strAlphabet (nIndice2) nIndice2 nIndice2 + 1 FINTQ // recherche rang indice de la lettre rsultante nIndice2 nIndice2 +nRang SI nIndice2 > 26 ALORS nIndice2 nIndice2 26 FINSI; StrResultat (nIndice1) strAlphabet (nIndice2) SINON StrResultat (nIndice1) " " NRang nRang + 1 FINSI nIndice1 nIndice1 +1 FINTQ AFFICHER "le rsultat est : " , strResultat;
Afpa
Page 85 de 150
12/06/2010
5.10. Comptage
Compter le nombre de mots dune phrase ayant une terminaison donne. Soit une phrase termine par un point. Les espaces sont des sparateurs de mot. Il s'agit de donner le nombre de mots de la phrase ayant pour terminaison la chane intitule terminaison. Exemple : Caractre final : . Phrase : rien ne sert de courir il faut partir point il ne faut pas rire. Terminaison : rir Rsultat : 1 Note : les terminaisons de longueur nulle indiquent la procdure qu'il faut renvoyer le nombre de mots de la phrase.
Afpa
Page 86 de 150
12/06/2010
TANTQUE strPhrase1(nLongPhrase )<> "." ET nLongPhrase < 100 NLongPhrase nLongPhrase + 1 FINTQ AFFICHER "entrer la terminaison " LIRE strTermine nCpt 0 nLong 0 NLong nLong + 1 FINTQ nIndice1 1; TANTQUE strPhrase1(nIndice1) <> "." ET nIndice1< nLongPhrase nIndice2 1 strMot " " // recherche le mot // longueur de strTermine TANTQUE strTermine(nLong) >= 'A' et strTermine(nLong) <= "Z"
TANTQUE strPhrase1(nIndice1) <> " " ET strPhrase1(nIndice1) <> "." StrMot(nIndice2) strPhrase1(nIndice1) nIndice2 nIndice2 + 1 nIndice1 nIndice1 + 1 FINTQ; nLongMot nIndice2 SI nLong <> 0 ALORS SI nLong <= nLongMot ALORS bOk vrai nIndice3 1 nDepart nLongMot - nLong POUR nIndice4 ALLANT DE nDepart A nLongMot PAS 1 SI strTermine(nIndice3) <> strMot(nIndice4) ALORS bOk faux FINSI
Afpa
Page 87 de 150
12/06/2010
Afpa
Page 88 de 150
12/06/2010
5.11.1.
Le premier algorithme auquel on pense pour effectuer ce tri est celui-ci : on cherche le plus petit lment du tableau et on le place en 1er, puis on cherche le plus petit dans ce qui reste et on le met en second, etc... 52 10 1 25 62 3 8 55 3 1 52 10 25 62 3 8 55 3 1 3 52 10 25 62 8 55 3 1 3 3 52 10 25 62 8 55 1 3 3 8 52 10 25 62 55 1 3 3 8 10 52 25 62 55 1 3 3 8 10 23 52 25 62 1 3 3 8 10 23 25 52 62 1 3 3 8 10 23 25 52 62 1 3 3 8 10 23 25 52 55 23 23 23 23 23 23 55 55 55 62
Afpa
Page 89 de 150
12/06/2010
Afpa
Page 90 de 150
12/06/2010
5.11.2.
Le tri bulle
Le tri bulle est un tri plus astucieux. Son principe est de faire remonter petit petit un lment trop grand vers le haut du tableau en comparant les lments deux deux. Si l'lment de gauche est suprieur son voisin de droite on les inverse et on continue avec le suivant. Lorsque l'on est en haut du tableau on repart au dbut et on s'arrte lorsque tous les lments sont bien placs. 52 10 1 25 62 3 8 10 52 1 25 62 3 8 10 1 52 25 62 3 8 10 1 25 52 62 3 8 10 1 25 52 62 3 8 10 1 25 52 3 62 8 10 1 25 52 3 8 62 10 1 25 52 3 8 55 10 1 25 52 3 8 55 10 1 25 52 3 8 55 On a parcouru tout le tableau, on ce que tout soit bien plac. 55 3 23 55 3 23 55 3 23 55 3 23 55 3 23 55 3 23 55 3 23 62 3 23 3 62 23 3 23 62 recommence, jusqu'
Afpa
Page 91 de 150
12/06/2010
Afpa
Page 92 de 150
12/06/2010
5.11.3.
Le tri par permutation est le tri du jeu de cartes. On parcourt le tableau jusqu' ce que l'on trouve un lment plus petit que le prcdent, donc mal plac. On prend cet lment et on le range sa place dans le tableau puis on continue la lecture. On s'arrte la fin du tableau. 52 10 1 25 62 3 8 55 3 10 52 1 25 62 3 8 55 3 1 10 52 25 62 3 8 55 3 1 10 25 52 62 3 8 55 3 1 3 10 25 52 62 8 55 3 1 3 8 10 25 52 62 55 3 1 3 8 10 25 52 55 62 3 1 3 3 8 10 25 52 55 62 1 3 3 8 10 23 25 52 55 crire l'algorithme qui ralise ce tri. 23 23 23 23 23 23 23 23 62
Afpa
Page 93 de 150
12/06/2010
OU BIEN
POUR nIndice1 ALLANT DE 2 A 10 SI (nTab(nIndice1) < nTab(nIndice1 - 1)) nIndice2 nIndice1 FAIRE x nTab(nIndice2-1) nTab(nIndice2-1) nTab(nIndice2) nTab(nIndice2) x nIndice2 nIndice2-1 JUSQUA ((nIndice2 = 1) OU (nTab(nIndice2 - 1) < nTab(nIndice2)) ) FINSI FINPOUR
Afpa
Page 94 de 150
12/06/2010
5.11.4.
Le tri par comptage consiste pour chaque lment du tableau compter combien d'lments sont plus petits que lui, grce ce chiffre on connat sa position dans le tableau rsultat.
23
5 6 62
7 8 1
4 5 3
0 1 3
6 7 8
9 10 10
1 2 23
Afpa
Page 95 de 150
12/06/2010
Afpa
Page 96 de 150
12/06/2010
5.11.5.
Le tri alphabtique
Le programme consiste saisir des mots (au maximum 10) de 20 caractres maximum et de les insrer dans un tableau dans l'ordre alphabtique. Puis d'afficher ensuite ce tableau. Le tableau rsultat est du type TABLEAU CAR [10,20].
Afpa
Page 97 de 150
12/06/2010
TABLEAU CAR strLettre[nbLignes ][ nbColonnes ] // tableau pour le tri 2 dimensions TABLEAU CAR strMot [nbColonnes ] ENTIER nLigne ENTIER nColonne ENTIER nIndice, nLongMot BOOLEEN bPlusPetit ChargTableau // appelle d'une procdure de chargement du tableau // tableau pour mot saisi
POUR nbmots ALLANT DE 1 A nbLignes AFFICHER "entrer le mot suivant" LIRE strMot bPlusPetit VRAI nLigne 1 TANTQUE (bPlusPetit = vrai ET (nLigne < nbmots) ) nColonne 1 TantQue ((strLettre(nLigne, nColonne) = strMot(nColonne)) ET nColonne <= 20) nColonne nColonne +1 FINTQ SI (strLettre(nLigne, nColonne) < strMot(nColonne)) ALORS nLigne nLigne + 1 SINON bPluspetit FAUX FINSI FINTQ SI (nLigne < nbMots ET nbMots <> 0 POUR nIndice ALLANT DE nbmots A nLigne PAS -1 POUR nColonne ALLANT DE 1 A nbColonnes strLettre(nIndice, nColonne) strLettre(nIndice -1, nColonne) FinPour FinPour FINSI
Afpa
Page 98 de 150
12/06/2010
Afpa
Page 99 de 150
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010
nSecondeTotal nSeconde( 1 )+ nSeconde ( 2 ) SI (nSecondeTotal >= 60) nSecondeTotal nSecondeTotal - 60 nMinuteTotal 1 SINON nMinuteTotal 0 FINSI nMinuteTotal nMinuteTotal+ nMinute ( 1 )+ nMinute ( 2 ) SI (nMinuteTotal >= 60) nMinuteTotal nMinuteTotal - 60 nHeureTotal 1 SINON nHeureTotal 0 nHeureTotal nHeureTotal + nHeure ( 1 )+ nHeure ( 2 ) AFFICHER H(1) ":" M(1) ":" S(1) AFFICHER "+" AFFICHER H(2) ":" M(2) ":" S(2) AFFCHER "=" AFFICHER "Le rsultat est" + nHeuresTotal + " heures " + nMinuteTotal + " minutes et " + nSecondeTotal " secondes "
Afpa
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010
Algorithmes et structuration de programmes Support de formation 5 etc.... 5 est un nombre premier ==> je marque
crire un programme qui demande un nombre et affiche tous les nombres premiers infrieurs au nombre donn.
Afpa
12/06/2010
6.1.
Alternative
package TestAlgo; import java.lang.*; public class Alternative { public static String lire() throws java.io.IOException { String strSaisie = ""; char C; while((C=(char)System.in.read()) != '\r') // ou \n { if (C != '\n') { strSaisie = strSaisie + C; } } return strSaisie; } public static int convertStringInt(String strEntier) { Integer intConv = new Integer(strEntier); int nConv = intConv.intValue(); return nConv; } public static float convertStringFloat(String strEntier)
Afpa
12/06/2010
Afpa
12/06/2010
6.2.
Alternative2
package TestAlgo; import java.lang.*; public class Alternative2 { public static String lire() throws java.io.IOException { String strSaisie = ""; char C; while((C=(char)System.in.read()) != '\r') // ou \n { if (C != '\n') { strSaisie = strSaisie + C; } } return strSaisie; } public static int convertStringInt(String strEntier) { Integer intConv = new Integer(strEntier); int nConv = intConv.intValue(); return nConv; } public static float convertStringFloat(String strEntier) { Integer intConv = new Integer(strEntier); float nConv = intConv.floatValue(); return nConv; } /**
Afpa
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010
6.3.
Boucle
package TestAlgo; public class Boucle { public static String lire() throws java.io.IOException { String strSaisie = ""; char C; while((C=(char)System.in.read()) != '\r') // ou \n { if (C != '\n') { strSaisie = strSaisie + C; } } return strSaisie; } public static int convertStringInt(String strEntier) { Integer intConv = new Integer(strEntier); int nConv = intConv.intValue(); return nConv; } /** * Point d'entre principal de l'application. */ public static void main (String[] args) throws java.io.IOException { double nSomme; double nMoyenne; int int nNombreFrappes; nSaisie;
nSomme = 0; nNombreFrappes = 0;
Afpa
12/06/2010
Afpa
12/06/2010
6.4.
Statistiques
package TestAlgo; import java.lang.*; public class Statistiques { public static String lire() throws java.io.IOException { String strSaisie = ""; char C; while((C=(char)System.in.read()) != '\r') // ou \n { if (C != '\n') { strSaisie = strSaisie + C; } } return strSaisie; } public static int convertStringInt(String strEntier) { Integer intConv = new Integer(strEntier); int nConv = intConv.intValue(); return nConv; } /** * Point d'entre principal de l'application. */ public static void main (String[] args) throws java.io.IOException { int int int int int nMini; nMaxi; nSomme; nIndice; nbNombre;
double nMoyenne;
Afpa
12/06/2010
System.out.println("entrer un entier?"); String strEntier = lire(); nSaisie = convertStringInt(strEntier); nbNombre = 0; while (nSaisie != 0 & nbNombre < 50) { if (nSaisie != 0) { nbNombre = nbNombre + 1; nTab[nbNombre] = nSaisie; } System.out.println("entrer un entier?"); strEntier = lire(); nSaisie = convertStringInt(strEntier); } nSomme = 0; nMini = nTab[1]; nMaxi = nTab[1]; for (nIndice = 1; nIndice <= nbNombre; nIndice++) { nSomme = nSomme + nTab[nIndice]; if (nTab[nIndice] < nMini) nMini = nTab[nIndice]; if (nTab[nIndice] > nMaxi) nMaxi = nTab[nIndice]; } nMoyenne = ((double)nSomme / nbNombre); System.out.println("La somme = " + nSomme + " La moyenne = " + nMoyenne); System.out.println("Le mini = " + nMini + " Le maxi = System.out.println("taper n'importe quoi pour finir"); String strBidon = lire(); } } " + nMaxi);
Afpa
12/06/2010
6.5.
Contraction
package TestAlgo; public class Contraction { public static void main (String[] args) throws java.io.IOException { String strSaisie; char[] strPhrase1 = new char[100]; byte[] strResultat = new byte[100]; char char int int strOctet; strFin = '.'; nIndice1; nIndice2;
System.out.println("Saisir la phrase termin\u201Ae par un point"); strSaisie = Alternative.lire(); strPhrase1 = strSaisie.toCharArray(); System.out.println("Saisir la lettre retirer"); strSaisie = Alternative.lire(); strOctet = strSaisie.charAt(0); nIndice1 = 0; nIndice2 = 0; while (strPhrase1[nIndice1] != strFin ) { if (strPhrase1[nIndice1] != strOctet) { strResultat[nIndice2] = (byte)strPhrase1[nIndice1]; nIndice2 = nIndice2 + 1; } nIndice1 = nIndice1 + 1; } String strAffiche = new String(strResultat); System.out.println("Le r\u201Asultat est " + strAffiche); System.out.println("taper n'importe quoi pour finir"); String strBidon = Alternative.lire(); } }
Afpa
12/06/2010
Afpa
12/06/2010
6.6.
Doublons
package TestAlgo; public class Doublons { public static void main (String[] args) throws java.io.IOException { String strSaisie; char[] strPhrase1 = new char[100]; byte[] strResultat = new byte[100]; char char int int strOctet; strFin = '.'; nIndice1; nIndice2;
System.out.println("Saisir la phrase termin\u201Ae par un point"); strSaisie = Alternative.lire(); strPhrase1 = strSaisie.toCharArray(); strOctet = ' '; nIndice1 = 0; nIndice2 = 0; while (strPhrase1[nIndice1] != strFin ) { if (strPhrase1[nIndice1] != strOctet) { strResultat[nIndice2] = (byte)strPhrase1[nIndice1]; nIndice2 = nIndice2 + 1; strOctet = strPhrase1[nIndice1]; } nIndice1 = nIndice1 + 1; } String strAffiche = new String(strResultat); System.out.println("Le r\u201Asultat est " + strAffiche); System.out.println("taper n'importe quoi pour finir"); String strBidon = Alternative.lire(); } }
Afpa
12/06/2010
6.7.
Equivalence
package TestAlgo; public class Equivalence { public static void main (String[] args) throws java.io.IOException { String strSaisie; char[] strPhrase1 = new char[100]; char[] strPhrase2 = new char[100]; char char int int int int strOctet; strFin = '.'; nIndice1; nIndice2; nLong1; nLong2;
boolean bOk;
System.out.println("Saisir la premi\u0160re phrase termin\u201Ae par un point"); strSaisie = Alternative.lire(); nLong1 = strSaisie.length(); strPhrase1 = strSaisie.toCharArray(); System.out.println("Saisir la seconde phrase termin\u201Ae par un point"); strSaisie = Alternative.lire(); nLong2 = strSaisie.length(); strPhrase2 = strSaisie.toCharArray(); bOk = true; nIndice1 = 0; nIndice2 = 0;
Afpa
12/06/2010
Afpa
12/06/2010
6.8.
Eparpillement
public class Eparpillement { public static void main (String[] args) throws java.io.IOException { String strSaisie; char[] strPhrase1 = new char[100]; char[] strPhrase2 = new char[100]; char int int int int strFin = '.'; nIndice1; nIndice2; nLong1; nLong2;
System.out.println("Saisir la phrase termin\u201Ae par un point"); strSaisie = Alternative.lire(); nLong1 = strSaisie.length(); strPhrase1 = strSaisie.toCharArray(); System.out.println("Saisir le mot recherch\u201A"); strSaisie = Alternative.lire(); nLong2 = strSaisie.length(); strPhrase2 = strSaisie.toCharArray(); nIndice1 = 0; nIndice2 = 0; while (nIndice2 < nLong2 & nIndice1 < nLong1) { if (strPhrase1[nIndice1] == strPhrase2[nIndice2]) { nIndice2 = nIndice2 + 1; } nIndice1 = nIndice1 + 1; }
Afpa
12/06/2010
Afpa
12/06/2010
6.9.
Inversion
public class Inversion { public static void main (String[] args) throws java.io.IOException { String strNomPrenom; char[] strOctet = new char[30]; char[] strNom = new char[30]; int int int int int nIndice; nCurseur; nCurseur2; nFinPrenom; nDebutPrenom;
System.out.println("Entrez un nom et un pr\u201Anom s\u201Apar\u201A par un espace"); strNomPrenom = Alternative.lire(); nCurseur = strNomPrenom.length()- 1; strOctet = strNomPrenom.toCharArray(); // recherche de la fin du prnom while (nCurseur >= 0 & strOctet[nCurseur] == ' ') { nCurseur--; } if (nCurseur == 0) { System.out.println("Vous n'avez rien saisi"); } else { nFinPrenom = nCurseur; // recherche dbut du prnom
Afpa
12/06/2010
Afpa
12/06/2010
6.10. Palindrome
public class Palindrome { public static void main (String[] args) throws java.io.IOException { String strSaisie; char[] strPhrase1 = new char[100]; char char int int strOctet; strFin = '.'; nIndice1; nIndice2;
boolean bOk; System.out.println("Saisir la phrase termin\u201Ae par un point"); strSaisie = Alternative.lire(); nIndice2 = strSaisie.length() - 2; strPhrase1 = strSaisie.toCharArray(); bOk = true; nIndice1 = 0; while (bOk && nIndice1 <= nIndice2) { if (strPhrase1[nIndice1] == ' ') { while (strPhrase1[nIndice1] == ' ' && nIndice1 <= nIndice2) { nIndice1++; } } if (strPhrase1[nIndice2] == ' ') { while (strPhrase1[nIndice2] == ' ' && nIndice1 <= nIndice2) { nIndice2--; } }
Afpa
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010
6.11. Cryptage
public class Cryptage { public static void main (String[] args) throws java.io.IOException { int nIndice1; int nIndice2; int nRang; String strSaisie; char strPhrase1[] = new char[100]; char strAlphabet[] = new char[26]; char strResultat[] = new char[100]; char strFin = '.';
System.out.println("Saisir la phrase termin\u201Ae par un point"); strSaisie = Alternative.lire(); strPhrase1 = strSaisie.toCharArray(); strSaisie = "abcdefghijklmnopqrstuvwxyz"; strAlphabet = strSaisie.toCharArray(); nIndice1 = 0; nRang = 1;
while (strPhrase1[nIndice1] != strFin) { if (strPhrase1[nIndice1] != ' ') { nIndice2 =0; while (strPhrase1[nIndice1] != strAlphabet[nIndice2]) { nIndice2++; }
Afpa
12/06/2010
Afpa
12/06/2010
6.12. Comptage
public class Comptage { public static void main (String[] args) throws java.io.IOException { String strSaisie; char[] strPhrase1 = new char[100]; char[] strTermine = new char[10]; char[] strMot char int int int int int int int int = new char[26];
strFin = '.'; nIndice1; nIndice2; nIndice3; nIndice4; nLongPhrase; nLong; nLongMot; nCpt;
boolean bOk; System.out.println("Saisir une phrase termin\u201Ae par un point"); strSaisie = Alternative.lire(); nLongPhrase = strSaisie.length(); strPhrase1 = strSaisie.toCharArray(); System.out.println("Entrer la terminaison"); strSaisie = Alternative.lire(); nLong = strSaisie.length(); strTermine = strSaisie.toCharArray(); nCpt = 0; nIndice1 = 0; nLongMot = 25; while (nIndice1 < nLongPhrase && strPhrase1[nIndice1] != strFin) { for (nIndice2 = 0; nIndice2 < nLongMot ; nIndice2++) {
Afpa
12/06/2010
Afpa
12/06/2010
System.out.println("le r\u201Asultat est : " + nCpt + " " + strFinMessage); System.out.println("taper n'importe quoi pour finir"); String strBidon = Alternative.lire(); } } }
Afpa
12/06/2010
6.13. Dichotomie
public class Dichotomie { static int nLong = 20; static int[] nTab = new int[nLong]; public static String lire() throws java.io.IOException { String strSaisie = ""; char C; while((C=(char)System.in.read()) != '\r') ou \n { if (C != '\n') { strSaisie = strSaisie + C; } } return strSaisie; } public static int convertStringInt(String strEntier) { Integer intConv = new Integer(strEntier); int nConv = intConv.intValue(); return nConv; } public static void chargTableau() throws java.io.IOException { System.out.println("indiquer le nombre de poste"); String strSaisie = lire(); nLong = convertStringInt(strSaisie); strSaisie = ""; int nIndCharg = 0; for (nIndCharg = 0;nIndCharg < nLong; nIndCharg++) { System.out.println("indiquer un entier de la liste bien plac"); strSaisie = lire(); nTab[nIndCharg] = convertStringInt(strSaisie); }
Afpa
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010
6.14. TriSelection
public class TriSelection { static int nLong = 10; static int[] nTab = new int[nLong]; public static void chargTableau() throws java.io.IOException { String strSaisie = ""; int nIndCharg = 0; for (nIndCharg = 0;nIndCharg < 10; nIndCharg++) { System.out.println("indiquer un entier"); strSaisie = Alternative.lire(); nTab[nIndCharg] = Alternative.convertStringInt(strSaisie); } // } public static void main (String[] args) throws java.io.IOException { int nIndice1; int nIndice2; int nPetit; int nPosition = 0; chargTableau(); System.out.println("les r\u201Asultats interm\u201Adaires sont : " ); return strSaisie;
Afpa
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010
6.16. TriPermutation
public class TriPermut { static int nLong = 10; static int[] nTab = new int[nLong]; public static void chargTableau() throws java.io.IOException { String strSaisie = ""; int nIndCharg = 0; for (nIndCharg = 0;nIndCharg < 10; nIndCharg++) { System.out.println("indiquer un entier"); strSaisie = Alternative.lire(); nTab[nIndCharg] = Alternative.convertStringInt(strSaisie); } // } public static void main (String[] args) throws java.io.IOException { int nIndice1; int nIndice2; int nIndice3; int nABouger; chargTableau(); System.out.println("les r\u201Asultats interm\u201Adaires sont : " ); return strSaisie;
Afpa
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010
Afpa
12/06/2010