Initiation au langage C
myriam.chesneau@univ-savoie.fr Mots clefs : Initiation la programmation Langage C Variables Oprations Structures alternatives et itratives Tableaux Fonction Algorithmes La plus part des exercices proposs sont de grands classiques de linitiation la programmation. Ils sont prsents dans de nombreux ouvrages, livres, polycopis, cours en ligne, et sont indpendants du langage.
CH 1 : Variables et oprations ________________1 Annexe : les caractres ______________12 CH 2 : Structures alternatives _______________13 CH 3 : Structures itratives _________________21 CH 4 : Tableaux __________________________26 CH 5 : Fonctions _________________________32 Annexe : visibilit _________________40 CH 6 : Bilan _____________________________41
TEST 2009-2010 _________________________43 ANNEXES Annexe 1 : utiliser Code::blocks _____________45 Annexe 2 : installer Code::blocks ____________49 Annexe 3 : complments de langage C ________50 Annexe 4 : structure dun programme en C ____51
CH 1 : VARIABLES ET OPERATIONS
Lordinateur utilise une reprsentation binaire de linformation, linformation lmentaire est le bit, il ne peut prendre que deux valeurs 0 ou 1. Programme, fichier texte, fichier imagetout ce qui est utilis par un ordinateur est donc cod en un ensemble de 0 et de 1. Ces deux valeurs correspondent deux tats lectriques, utiliss pour mmoriser et traiter linformation au sein de lordinateur. Les circuits de lordinateur manipulent des ensembles de bits : Quartet 4 bits Octet 8 bits Mot 16, 32 bits ( ou plus, prciser) ko, Mo, Go : multiples de loctet Dans ce module, nous utiliserons les nombres, entiers et rels, dont le codage est introduit au paragraphe suivant, et les caractres : chaque caractre est cod par 7 bits en code ASCII standard, sur 8 bits en code ASCII tendu. Ceci est dtaill en annexe 1, en fin de chapitre.
S bit de signe E exposant sur 8 bits lire en binaire naturel M mantisse sur 23 bits lire comme une partie dcimale en binaire (M = 2-1.m1+2-2m2 + +2-23m23)
-1-
2. VARIABLES ________________________________________________________
2.1 Type et nom des variables
Les nombres et caractres sont stocks dans des variables. Une variable possde un nom et un type adapt. Les principaux types de variable utiliss sont les entiers, cods sur 8, 16 ou 32 bits (int = integer) les rels, cods sur 32 ou 64 bits, (double = rel double prcision) les caractres, cods sur 8 bits, et associs une lettre ou un signe via le code ASCII. Exemple char lettre; int compte; int entier1, entier2; double longueur, largeur;
On crit le nom des variables en utilisant les lettres minuscules et majuscules, les chiffres, mais pas le _. On vite dappeler tous les entiers n et tous les rels x ou toutes les variables toto : on donne des noms significatifs comme longueur , taux , note Le programme gagne ainsi en lisibilit. Les majuscules servent dlimiter les noms, on commencera par une minuscule : Exemple motDePasse bilanJanvier reel2 adresseDeBase
On peut affecter une valeur une variable aprs sa dclaration, on dit quon assigne une valeur une variable. Exemple nbr=3; triple = 3 * nbr; longueur = 0.12; largeur = 1.5e-1;
// rel double prcision virgule flottante // rel double prcision notation scientifique
// 1.00 // 1.67
2.3 Conversions
Conversion implicite Lors d'une opration entre deux variables de types diffrents, c'est le type le plus prcis qui est choisi pour valuer l'opration. Lors d'une affectation, il y a conversion dans le type de la variable. A chaque conversion implicite, le compilateur prvient par un WARNING : il est prfrable dtre explicite. Exemples : int nbr1, nbr2 = 3; double reel = 1.1; nbr1 = nbr2/reel; -2-
cout<<nbr2<<endl; Conversion explicite Pour transformer le type d'une variable, on fait prcder l'expression par le nouveau type entre parenthses. Il peut y avoir perte d'information lors d'une conversion explicite. Exemple double reel; int partieEntiere; partieEntiere = (int)reel;
2.4 Constantes
Pour interdire le changement de la valeur d'une variable, on fait prcder son nom, lors de l'assignation, du mot const : Exemple const int NOMBRE = 3; const double TAUX = 0.86; const double PI = 3.14159 ; On crit le nom des constantes en majuscule.
3. OPERATEURS ______________________________________________________
3.1 Oprateurs arithmtiques
Oprateur + + * / % Nom Identit Oppos Addition Soustraction Produit Quotient modulo (n'agit que sur des entiers) unaire unaire binaire binaire binaire binaire binaire Exemple +5 -5 3+6 3.5-2 5*2 7/3 11./2. 11%3 12%3 Rsultat
-3-
Evaluation de gauche droite, jusqu' ce que le rsultat dfinitif soit trouv : (a<b)&&(c<d) si a>b, la seconde expression n'est pas value.
-4-
TD 1
1. ANALYSE DE CODE
Dterminer les valeurs de res1, res2 et res3 int nbr1, nbr2; int res1, res2, res3; nbr1 = 3; nbr2 = 4; res1 = nbr2%nbr1; res2 = 45%4; res3 = 45%nbr1; Dterminer les valeurs successives de k et x. int i=10, j=4, k; double x; k=i+j; x=i; x=i/j; x=(double)i/j; x=5/i; k=i%j; x=105; i=5; x= x+i; Dterminer les valeurs de x aprs avoir plac des parenthses inutiles mettant en vidence les priorits : x= 7 + 3 * 6 / 2 1 ; x = 2 % 2 +2*2-2/2 ; x = (3*9*(3+(9*3/(3)))) ; Dterminer les valeurs successives de q et x int n=5, p=9; int q; double x; q=n<p; q=n==p; q=p%n+p>n; x=p/n; x=(double)p/n; x=(int)(p+0.5)/n;
Chercher et expliquer les erreurs du programme const int X=10; int y,z; y+z = 10; 10 = z; X=100; z==10;
-5-
2. ANALYSES DE PROBLEMES
2.1 Disque
On souhaite raliser un programme qui Reoit au clavier la valeur numrique du rayon dun cercle Calcule la circonfrence et la surface du disque possdant ce rayon Affiche les rsultats. Prvoir une application numrique de test, par exemple : - Si le rayon vaut 1, la circonfrence vaut ..et la surface . Dfinir les variables ncessaires : nom et type. Ecrire les lignes ( ou la ligne) de code correspondantes. Dfinir comme constante. Ligne de code. Quels sont les calculs raliser ? Quelles sont les oprations dentre et de sortie raliser (nous verrons comment les coder lors du TP 1). -
2.2 Aire
Laire A dun triangle dont les cts ont pour longueur a, b et c peut se faire de la manire suivante : A=
Pour un triangle rectangle tel que a = 3, b = 4, calculer c, puis appliquer la formule et la vrifier. Le programme Reoit au clavier les trois valeurs numriques a, b ,c, longueurs des cots du triangle. Calcul la demi-somme et la surface du triangle. Affiche le rsultat Indication : on utilisera la fonction sqrt() pour extraire la racine carr. (ajouter #include <math.h> en tte de programme) Prvoir une application numrique de test, par exemple : Dans le cas particulier dun triangle rectangle tel que a = 3, b = 4, laire peut tre facilement calcule, elle vaut : Le troisime ct a pour longueur c = , en appliquant la formule, on trouve som = .et A = .. Est-ce bien laire attendue ? .
-6-
Dfinir les variables ncessaires : nom et type. Ecrire les lignes de code correspondantes. Quels sont les calculs raliser ? Quelles sont les oprations dentre et de sortie raliser (nous verrons comment les coder lors du TP 1). -
-7-
TP 1
Consignes valables pour tous les TP Tous les programmes sont sauvs dans votre partition. Crer un dossier destin recevoir vos programmes INFORMATIQUE. Les programmes sont recopis dans un fichier texte (C ou Word) et imprims une seule fois en fin de TP (ou en dehors de la sance : voir dmo prof).
Pour utiliser la fonction cout, on ajoute en dbut de fichier la ligne #include <iostream> Le programme complet scrit alors. : #include <iostream> using namespace std; int main() { int nbr = 5 ; double diam = 2 , circonf ; cout<< " contenu du message " <<endl ; cout<<3<<endl ; cout<<3*5<<endl ; cout<<nbr<<endl ; circonf = 3.14159*diam ; cout<< " la circonference du cercle vaut: " <<circonf<< " metres"<<endl; return 0; }
-9-
Ex4 tva.cpp Ecrire un programme qui permet de calculer un prix TTC partir dun prix hors taxe saisi au clavier, le taux de TVA tant fix 19,6 % et dfini comme une constante.
Ex5 pas a pas.cpp Lire entirement l'annexe 1 2 en reprant les touches cites. Recopier le programme suivant et l'excuter pas pas en recopiant la valeur des variables au fur et mesure. Attention, la ligne pointe est celle qui sera excute au prochain "F7". #include <iostream> using namespace std; int main() { int n; Valeur de Valeur Expliquer le rsultat : n de r double r; n=2; r=n/3; r=n/3.; n=n/3; n=r+6; r=n; r=r/4; n=r; r=n; return 0; } / / / / / / / / /
Faire vrifier
Ex6 operation.cpp Ecrire un programme qui demande lutilisateur dentrer un rel x et affiche le rsultat r1 de lopration Modifier le programme pour quil affiche en plus le rsultat r2 de lopration 1 + x + x + x . Modifier le programme pour afficher lcart entre les deux rsultats ci-dessus calculs : r1 r2. - 10 2 3
1 . 1 x
Vrifier, en crant un petit programme, que vous savez : Afficher un message l'cran Saisir un nombre au clavier, puis l'afficher l'cran, Afficher un rsultat de calcul accompagn d'un message,( ex : resultat = ) Saisir plusieurs nombres la suite, avec une seule instruction. Trouver le fichier en-tte inclure pour utiliser une fonction quelconque.
4. EXERCICES AVANCES________________________________________________
Ex7 moyenne.cpp Ecrire un programme qui calcule la moyenne de 2, puis 3 valeurs entires. On utilisera une seule variable pour la saisie des donnes.
Ex8 papierpeint.cpp Le but de cet exercice est de calculer le nombre de rouleaux de papiers peint ncessaire la dcoration dune pice, en supposant quil ny a pas de raccords. Voici les donnes disponibles : On connat les dimensions dun rouleau standard : longueur 10,05 m et largeur 53 cm. Lutilisateur entre les dimensions de la pice : hauteur, longueur, largeur. On souhaite calculer ensuite le nombre de bandes par rouleau, le primtre de la pice, le nombre total de bandes requises, et enfin le nombre de rouleaux. Rsoudre le problme sans lordinateur pour le cas suivant : 2,1 m de hauteur, pice de 4 m 3 m. Dfinir : les constantes, les variables On utilisera des noms explicites pour chaque constante ou variable. Les calculs seront effectus sur des rels (double), on utilisera les fonctions darrondi lentier suprieur (ceil) ou infrieur (floor), voir laide.
Ex9 codeascii.cpp Lire lannexe page suivante. Ecrire un programme qui Demande lutilisateur dentrer un nombre compris entre 0 et 255 Affiche le caractre associ au nombre par le codage ASCII (remarque : les premiers caractres ne donnent pas un caractre l'affichage).
5. PROJET
P1
Ecrire un programme qui calcule et affiche la valeur de Pi en utilisant la fonction arc tangente (atan), sachant que atan (1) = /4. En utilisant les complments sur la mise en forme, au chapitre 4, afficher Pi avec 5 dcimales.
- 11 -
code ASCII
code ASCII tendu sous Windows 4.3 Code ASCII sous Windows
- 12 -
CH 2 : STRUCTURES ALTERNATIVES
1. IFELSE __________________________________________________________
1.1 exemples
if (i>0) { cout<<"positif"<<endl; } cout<<"max = "<<endl; if (a>b) { cout<<a<<endl; } else { cout<<b<<endl; } if (nombre>max) { max = nombre; cpt++; } else if (nombre<min) { min = nombre; } if (note>=12) { cout<<"Admis"<<endl; } else if (note<8) { cout<<"Refus"<<endl; } else { cout<<"Oral"<<endl; }
1.2 exercices
En sinspirant des exemples ci-dessus, complter les programmes suivants : Le programme affiche si le nombre est pair ou impair. int nombre; cout<<"entrer un nombre "<<endl; cin>>nombre; --Le programme affiche + si le nombre est positif, - si le nombre est ngatif, 0 si le nombre est nul. int nombre; cout<<"entrer un nombre "<<endl; cin>>nombre; --- 13 -
if(expression) { instructions1; } else { instructions2; } Soit, en franais: si lexpression est vraie, alors on ralise les instructions 1, sinon, on ralise les instructions 2 Lexpression est entoure de parenthses. Une expression est vraie si lexpression entre parenthse est diffrente de 0. Un ensemble d'instructions est entour d'accolades. Une instruction se termine toujours par un point virgule : ";". Plusieurs structures ifelse peuvent tre imbriques.
2. SWITCHCASE_____________________________________________________
2.1 Exemple
int a=2, b=7; int operation; cout<<"Choisir une operation : + (1) ou - (2) ou * (3)"<<endl; cin>>operation; switch(operation) { case 1: cout<<"somme = "<<a+b<<endl; break; case 2 : cout<<"difference = "<<a-b<<endl; break; case 3 : cout<<"produit = "<<a*b<<endl; break; default : cout<<"mauvais choix"<<endl; }
- 14 -
2.2 structure
Excution dinstructions selon la valeur dexpression. switch (expression) { case val1 : instructions1; break; case val2 : instructions2; break; case val3 : instructions3; break; default : instructions4; }
Soit, en franais: si lexpression vaut val_1, alors on ralise les instructions 1 et on sort de la structure, sinon, si lexpression vaut val_2, alors on ralise les instructions 2 et on sort de la structure, sinon, si lexpression vaut val_3, alors on ralise les instructions 3 et on sort de la structure, sinon, on ralises les instructions 4 et on sort de la structure.
break : permet de sortir du switch. Si on omet le break, toutes les instructions suivantes sont excutes, jusqu'au prochain break. default : si expression ne correspond aucun des cas, le branchement est ralis sur default.. Si cette instruction est absente, le programme passe l'instruction suivante. On peut mettre nimporte quelle expression dans la parenthse du switch, par exemple un caractre, un rel, comme le montre lexemple ci-dessous, similaire lexemple prcdent. int a=2, b=7; char operation; cout<<"Choisir une operation : + ou - ou * "<<endl; cin>>operation; switch(operation) { case'+': cout<<"somme = "<<a+b<<endl; break; case'-' : cout<<"difference = "<<a-b<<endl; break; case'*' : cout<<"produit = "<<a*b<<endl; break; default : cout<<"mauvais choix"<<endl; }
- 15 -
TD 2
Ex 1 Analyse de code int x, c = 0; cout<<"Entrer un entier"<<endl; cin>>x; if((x>=-20)&&(x<=-8)) { c = -10; } if((x>=1)&&(x<=5)) { c = 10; } if((x>=34)&&(x<=180)) { c = 20; } cout<<"c = "<<c<<endl; A quel problme rpond ce programme ? Comment le rendre plus efficace : proposer les nouvelles lignes de code. Ex 2 Structures if imbriques Soient deux rels non nuls x et y, on souhaite dterminer le quadrant dans lequel se trouve le point de coordonnes (x, y). On suppose que les quadrants sont numrots de 1 4, dans le sens trigonomtrique, en partant du quadrant suprieur droit. Reprsenter par un schma (organigramme) la dmarche qui permet de rsoudre ce problme. Ecrire le code correspondant (x et y sont demands lutilisateur). Ex 3 Analyse de problme Le programme calcule les racines relles dune quation du second degr et affiche le nombre de solutions relles et leurs valeurs. ( a x2 + b x + c = 0). Rsoudre le problme sans lordinateur : rappeler les calculs effectuer pour obtenir la ou les solution(s) Prvoir une application numrique de test, Trouver trois triplets (a, b, c) permettant de tester chacun des trois cas, quelles sont les solutions attendues dans chaque cas. triplet donnant un dterminant nul : a =. , b = ., c = ., solution =. triplet donnant un dterminant positif : a = ., b = ., c = ., solutions = .. triplet donnant un dterminant ngatif : a = ., b = ., c = .
Dfinir les variables ncessaires : nom et type. Ecrire les lignes (ou la ligne) de code correspondantes. -
- 16 -
Quels sont les calculs raliser ? Quelles sont les oprations dentre et de sortie raliser. Ex 4 Structure choix En vous inspirant de lexemple du cours, crire un programme qui demande lutilisateur dentrer un nombre rel puis lui propose le menu suivant : 1 2 3 4 : : : : carr racine carr cosinus sinus
Le rsultat de lopration choisie est affich lcran. Ex 5 Tri de deux ou trois nombres On souhaite permuter le contenu de deux variables. Proposer une solution, puis un programme complet permettant de tester cette solution (entre des deux nombres, permutation, affichage). On souhaite ordonner deux nombres. Le programme reoit ces deux nombres dans les variables nbr1 et nbr2 et change le contenu des variables si ncessaire, de sorte que nbr1 contienne le plus petit nombre. Proposer une dmarche, puis crire le programme complet (entre des deux nombres, test avec ventuelle permutation, affichage dans lordre croissant). Utiliser les deux exercices prcdents pour effectuer le tri dans lordre croissant de trois nombres entrs au clavier dans les variables nbr1, nbr2, nbr3. Tester la main votre programme pour en vrifier la validit. Trouver les exemples ncessaires au test de tous les cas.
- 17 -
TP2
Un petit truc : pour raligner convenablement votre code : Pluggin/Source Code Formatter Le style utilis est le Astyle, pour en savoir plus : en.wikipedia.org/wiki/Indent_style Un autre petit truc : Pour augmenter la police de caractre dans lditeur : Settings / Editor / Choose
1. DEBUGUER
1.1 Ex 0 Debug
Suivre pas pas lexcution du programme ci-dessous en visualisant les variables. Justifier les valeurs puis dtecter le problme ! #include <iostream> using namespace std; int main() { int resultat,temp, donnee = 512; resultat = 8*donnee*donnee*donnee-1; temp = 2*resultat; resultat = temp+1; temp = resultat+1; resultat = resultat*4; temp = temp*2; resultat = resultat/temp; return 0; }
2. EXERCICES DE BASE
Tester les deux programmes du cours, paragraphe 1.2, puis les exercices 2, 3 et 4 du TD : Ex1 parite.cpp / Ex2 signe.cpp / Ex3 quadrant.cpp / Ex4 racines.cpp / Ex5 operations.cpp Ex6 tri.cpp Raliser le programme dchange de deux valeurs, le modifier pour obtenir un tri des deux valeurs, puis le modifier pour trier trois valeurs entres par lutilisateur. Ex7 multiple.cpp Ecrire un programme qui demande lutilisateur dentrer un nombre et affiche si le nombre est multiple de 5 ou non. Ex8 egal.cpp Ecrire un programme qui reoit deux rels x et y et affiche Egaux si, les deux rels sont alors considrs comme gaux. Diffrent sinon. Ex9 absolue.cpp Ecrire un programme qui saisit un entier positif ou ngatif au clavier et affiche sa valeur absolue. (On nutilisera pas la fonction valeur absolue du C)
CE QUIL FAUT SAVOIR FAIRE
Vrifier que vous savez : Utiliser un if tout seul Utiliser un if/else avec la bonne indentation ( = dcalage du texte) Permuter le contenu de deux variables laide dune troisime.
- 18 -
3. EXERCICES AVANCES
Ex10 cryptage.cpp On dispose de donnes sous forme dentiers compris entre 0 et 9999. On choisit de coder ces donnes avant transmission sur ligne tlphonique, pour les garder secrtes. Le programme doit lire un entier 4 chiffres et le crypter comme suit : chaque chiffre est remplac par (chiffre + 7) modulo 10, puis, le premier et le troisime chiffre sont permuts, puis le second et le quatrime chiffre sont permuts. le programme doit ensuite afficher le nombre crypt. On commencera par extraire du nombre et afficher les 4 chiffres correspondants aux milliers, centaines, dizaines et units. (Attention, ne pas crire 0147 mais 147, car un zro devant un nombre indique - en C - quil est cod en octal) Ex11 decryptage.cpp Raliser ensuite un autre programme pour le dcryptage Ex 12 jukebox Rcuprer sur le serveur (DUT\MPH\Doc-Etudiants\MPh1\MPh1 Informatique) les 4 fichiers .wav dans le rpertoire JUKE. Les copier-coller dans votre rpertoire de travail (TP2). Le programme doit proposer le menu suivant :
Le choix de lutilisateur est saisi au clavier. Selon le choix, le bon morceau (fichier) doit tre jou par le PC. Complment Pour charger dynamiquement un fichier .wav et jouer ce son Placer le fichier .wav dans le mme rpertoire que votre code source .cpp Inclure le fichier qui va permettre dutiliser le son sous windows. #include <windows.h> Inclure le fichier d'en-tte mmsystem.h contenant le prototype de la fonction PlaySound() qui va permettre de jouer le fichier .wav, au dbut du code source #include <mmsystem.h> Ajouter la bibliothque libwinmm.a au projet. Cette bibliothque contient entre autre le code d'excution de la fonction PlaySound(). Elle se trouve dans le rpertoire des bibliothques de CodeBlocks C:\Program Files\CodeBlocks\MinGW\lib\libwinmm.a ou quivalent.
On lajoute au projet en utilisant par exemple Project / Build Options / Linker Settings / Add / Puis, pour jouer le fichier fichier.wav et rendre la main au programme la fin du son, utiliser comme suit la fonction PlaySound : PlaySound ("fichier.wav",NULL,SND_SYNC);
4. PROJET
P2
Complment La fonction rand() renvoie un entier compris entre 0 et 32 767 (tirage pseudo-alatoire). La fonction srand permet de rinitialiser le gnrateur de nombres alatoires. - 19 -
srand(time(NULL)); Comment obtenir un rel alatoire compris entre 0 et 1 ? (Ces fonctions ncessitent lappel des fichiers stdlib.h et time.h) On souhaite tirer un point P (x,y) au hasard dans le carr ci-contre, puis tester sil appartient au disque de rayon 1 inscrit dans ce carr. Proposer une solution. 1
-1
-1
- 20 -
1.2 while
Les instructions sont excutes de faon rptitive aussi longtemps que le rsultat de lexpression de continuation priori est vraie. while (expression) { instructions; } Soit, en franais : tant que lexpression est vraie, alors on ralise les instructions
1.3 dowhile
Cette instruction est similaire la prcdente, le test de continuation a posteriori a lieu aprs chaque excution des instructions, de fait les instructions sont au moins excutes une fois. do { instructions ; } while (expression) ; Soit, en franais : On ralise les instructions, tant que lexpression est vraie
On utilise une structure while ou dowhile quand - au moment de lexcution de la boucle le programme ne sait pas combien de fois la boucle va tre excute, on utilise une structure for quand on connat le nombre ditrations
1.4 exercice
Dterminer les valeurs successives de m, n et de la condition de continuation lors de lexcution de la boucle : int m=0, n=3; do { cout<<"m="<<m<<" et n="<<n<<endl; m++; n--; } while(m<n);
- 21 -
2. FOR _____________________________________________________________
2.1 exemple
int i ; for (i=0 ; i<4 ; i++ ) { cout<<i*i<<endl ; }
2.4 Exercice
Dterminer laffichage ralis lors de lexcution de cette boucle : int i; for (i=0; i<=5; i++) { cout<<"i : "<<i<<endl; } cout<<"i vaut maintenant : "<<i<<endl;
- 22 -
TD 3
Dterminer la structure utilise (for ou while) et crire le contenu de la boucle pour les exercices 1 3. Ex 1 L'utilisateur saisit un nombre entier au clavier et le programme affiche une colonne contenant un nombre dtoiles correspondant au nombre donn : 3 * * * Ex 2 Le programme demande l'utilisateur d'entrer le montant qu'il dsire retirer au distributeur. Ce montant doit tre un multiple de 20 euros. La question est repose tant que le montant entr n'est pas correct. Ex 3 Complment : La fonction rand() renvoie un entier compris entre 0 et 32 767 (tirage pseudo-alatoire). La fonction srand() permet de rinitialiser le gnrateur de nombres alatoires. srand(time(NULL)); Ces fonctions ncessitent lappel des fichiers stdlib.h et time.h. Ecrire un programme qui affiche 10 entiers alatoires compris entre 0 et 32 767. Ecrire un programme qui affiche 10 entiers alatoires compris entre 0 et 10. Ecrire un programme qui affiche 10 rels alatoires compris entre 0 et 1. Ecrire un programme qui affiche 50 nombres alatoires compris entre 0 et 100, puis le modifier pour qu'il n'affiche que les multiples de 5. Ex 4 int somme, n, i; somme = 0; cout<<"Nombre d'iterations ? " <<endl; cin>>n; for(i=0 ; i<n ; i = i+1) { somme = somme + i*i; } cout<<somme<<endl; Prvoir lvolution des variables dans le tableau ci-contre pour n = 5 : Quelle est la valeur de i en sortie de boucle ? Que se passe-t-il si on omet la seconde ligne ? Pourquoi a-t-on choisi une structure for et non une structure while ? Quelle suite cette boucle calcule-t-elle ? Ex 5 On souhaite entrer des nombres au clavier (par exemple, saisir les notes dun examen), puis analyser ces notes. On ignore au dpart le nombre de notes saisir. Les notes tant comprises entre 0 et 20, on dcide dentrer une note ngative pour arrter le traitement. Ecrire un programme qui saisit les notes calcule et affiche la somme des notes, attention, on ne dsire pas ajouter la valeur ngative darrt de boucle. Complment : Pour calculer la somme des notes, on initialise la variable somme 0, puis chaque fois quune note est entre, on lajoute somme : somme = somme + note ;
somme
- 23 -
TP 3
1. EXERCICES DE BASE ________________________________________________
Les trois premiers exercices consistent programmer des exemples et exercices du cours. Ex1 while.cpp (1.1) / Ex2 dowhile.cpp (1.1) / Ex3 for.cpp (2.4) Ex4 etoiles.cpp Tester l'exercice 1 du TD. Ex5 distrib.cpp Tester l'exercice 2 du TD. Modifier ce programme pour, en plus, limiter la somme retire 120 euros. Si le montant est suprieur, la question est repose. Ex6 alea.cpp Tester les programmes de lexercice 3. Puis, modifier le dernier pour que le programme Gnre des nombres alatoires compris entre 0 et 100, Affichent parmi ces nombres ceux qui sont multiples de 5 ou de 6, Sarrte quand 20 nombres alatoires multiples de 5 ou de 6 sont affichs. Mme question pour afficher 10 multiples alatoires de 5 et de 6. Ex7 traitement.cpp Tester le programme de l'exercice 5, le modifier pour afficher la moyenne des notes. Ex8 suite.cpp Calculer la somme des (N+1) premiers termes de la suite 1 + x + x2 + x3 + x4 + xN. N sera dfini en constante, et x entr par l'utilisateur. Vrifier que pour x petit devant 1, cette somme approche 1/(1-x). On nutilisera pas la fonction puissance (pow)
CE QUIL FAUT SAVOIR FAIRE
Vrifier que vous savez : Tester si un entier est multiple d'un autre entier Combiner des conditions de test (arrter une boucle si C1 et C2, si C1 ou C2, continuer une boucle si C1 et C2, si C1 ou C2) Calculer une suite Utiliser la fonction rand() pour obtenir un nombre alatoire compris entre 0 et 1 Utiliser la fonction rand() pour obtenir un entier alatoire compris entre 0 et N ou entre 1 et N. Rinitialiser le gnrateur de nombres alatoires.
2. EXERCICES AVANCES________________________________________________
Ex7 traitement.cpp Modifier l'exercice 7 pour afficher le maximum et le minimum. Complment Pour rechercher le maximum, on utilise une variable max quon initialise 0. Puis, chaque fois quune note est saisie, on compare max cette note, si la note est suprieure au contenu de max, on place la note dans la variable max, sinon, on ne fait rien. Dans un cas plus gnral, le maximum peut tre initialis n'importe quelle valeur du tableau.
- 24 -
Ex 9 Condensateur.cpp Soit un condensateur C = 10 nF, charg la tension E0. A linstant t=0, il commence sa dcharge dans une rsistance R = 10 k . La tension ses bornes est E(t) = E0 e-t/ avec = RC. A quel instant est-il dcharg 63 % ? (E = 0,37 E0) Premier programme. Lutilisateur entre la tension initiale, et un temps t1 donn. Le programme affiche la tension E1 du condensateur t1. Second programme Lutilisateur entre la tension initiale, et une tension E1 donne, infrieure E0. Le programme calcule par valeur approche le temps au bout duquel cette tension est atteinte, avec une prcision de 100 ns. (On ne demande pas de rsoudre lquation.)
3. PROJET
P3
On souhaite calculer une valeur approche de pi par la mthode suivante : On tire un certain nombre N de points au hasard dans un carr donn. On dtermine le nombre de points appartenant au cercle inscrit dans ce carr : Nc. Pour N grand, le nombre de points Nc est proportionnel la surface du cercle, N celle du carr. On peut ainsi estimer une valeur de pi. Proposer un programme utilisant cette mthode.
- 25 -
CH 4 : TABLEAUX
1. TABLEAUX MONODIMENSIONNELS _____________________________________
Un tableau est un ensemble de N donnes de mme type, rfrences par un indice. N est le nombre dlments du tableau, un bloc de N variables du type donn est rserv en mmoire. La taille du tableau est une valeur constante.
1.3 Initialisation
Elle peut se faire au moment de la dclaration : exemple prcdent tab. Dans le cas ou l'initialisation et la dclaration sont simultanes, la taille du tableau peut tre omise, le compilateur la calcule d'aprs le nombre de valeurs d'initialisation : int tab[] = {10,20,30,40,50,60,70,80,90}; On peut se contenter de n'initialiser que le dbut du tableau. double resistances[12]={1., 1.2, 1.8, 2.2}; // le reste 0 Un tableau peut tre initialis plus tard, en affectant une valeur chaque lment : int notes[56], i; for (i=0; i<56; i++) { notes[i]=20; } notes[3] = 13; notes[55] = 9;
Remarques Si on spcifie trop de valeurs, un message d'erreur le signale. Si tout le tableau n'est pas initialis lors de la dclaration, les lments non initialiss sont mis 0 (ce qui correspond au caractre NUL pour un tableau de caractres). Il n'y a pas d'affectation, de comparaison, doprations arithmtiques directes sur les tableaux. cout<<mesures<<endl; affiche l'adresse mmoire du tableau mesures.
- 26 -
On peut encore omettre la taille du tableau au moment de la dclaration, s'il y a initialisation : char ville[] = "annecy";
mot [0] mot [1] mot [2] mot [3] mot [4] mot [5] mot [6] a n n e c y \0
- 27 -
TD 4
Ex 1 Ecrire les lignes de code permettant de remplir un tableau de 100 lments, avec 100 entiers compris entre 0 et 100, choisis alatoirement. Ex 2 On souhaite dclarer et initialiser un tableau dont l'indice correspond au numro du mois, et le contenu au nombre de jour du dit mois. Donner la ligne de code ncessaire. Ex 3 On souhaite maintenant entrer au clavier un numro compris entre 1 et 12, et afficher le nombre de jour du mois correspondant. Proposer le code. Ex 4 Soit un tableau tab[50] dj rempli, quelles lignes de code permettent d'en afficher le contenu, raison d'une valeur par ligne ? Ex 5 Rappeler la dmarche pour trouver le maximum dun ensemble dentiers positifs. Mme question pour le minimum. Quelles sont les lignes de code correspondantes ? On supposera l'existence d'un tableau tab[50], rempli de nombres compris entre 0 et 20. Amlioration : comment rsoudre le mme problme si on ne connait pas les bornes des nombres contenus dans le tableau ? Ex 6 On souhaite simuler 1000 jets de ds et traiter statistiquement les faces obtenues. Rappeler comment obtenir un entier compris entre 1 et 6, pour simuler les 6 faces du d. Proposer les lignes de code qui permettent de crer un tableau de N entiers (N sera fix en constante, 1000 par exemple, moins en phase de test), et de le remplir de chiffres alatoirement pris entre 1 et 6. A l'aide d'une variable intermdiaire (compte), compter le nombre de "1" prsents dans le tableau et afficher ce rsultat. Recommencer pour compter le nombre de "2". Comment effectuer ce comptage pour les 6 valeurs possibles, en utilisant une boucle ? On pourra rflchir en supposant l'existence de trois variables : cherche : qui est le nombre que l'on recherche dans le tableau (1, puis 2) compte, qui est le nombre d'occurrence du nombre recherch. stat : qui est un tableau dont les indices sont les nombres recherchs (de 1 6) et le contenu, les diffrents comptes obtenus. Par exemple, si on trouve 15 "1" dans un tableau de 100 entiers, on aura stat[1] = 15.
- 28 -
TP 4
Remarque : chaque fois que l'exercice s'y prtera, on respectera l'ordre ci-dessous : entre des donnes ou initialisation, puis affichage des donnes, puis traitement des donnes, puis affichage des rsultats.
- 29 -
Ex5 miseenforme.cpp Complment On inclut en dbut de programme le fichier iomanip pour utiliser les manipulateurs ci-dessous : # include <iomanip> setw (int n) permet de fixer la largeur du champ setfill(char c) permet de fixer un caractre de remplissage setprecision (int p) permet de fixer un nombre maximum de chiffre significatifs. int n = 13; double x = 3.14159; cout<<setw(4)<<3<<endl; //affiche 3 cout<< setw(6)<<setprecision(2)<<x<<endl; //affiche 3.1 cout<<setw(8)<<setfill('*')<<n<<endl; //affiche ******13 Application La console comporte 80 colonnes et 25 lignes. Application : Ecrire un programme qui affiche sur une mme ligne les 20 premiers entiers (N = 1 20), chacun sur un champ de largeur 4. On mettra une seule instruction de fin de ligne aprs la dernire criture l'cran. Ajouter le code permettant d'afficher galement les 20 premiers rels inverses des prcdents (de 1/1 1/20), chacun sur un champ de largeur 8 avec 3 chiffres significatifs. Si on veut afficher 10 nombres sur une ligne, rgulirement rpartis, quelle instruction de formatage faut-il utiliser ? Ajouter le code permettant de saisir un entier positif n et d'afficher tous les entiers compris entre n et 2n, raison de 10 par ligne.
CE QUIL FAUT SAVOIR FAIRE
Vrifier que vous savez : Dclarer un tableau, le remplir au moment de la dclaration ou ensuite via le clavier. Dclarer un tableau, puis le remplir automatiquement avec des nombres alatoires. Rechercher les extremums d'un tableau Mettre en forme des rsultats pour une prsentation agrable
2. EXERCICES AVANCES________________________________________________
Ex6 table.cpp Ecrire un programme qui calcule et affiche lcran les entiers de 0 10, ainsi que leur carr et leur cube, suivant le format suivant : 0 1 2 9 10 0 0 1 1 4 8 81 729 100 1000
Ex7 ds.cpp Crer et afficher convenablement un tableau de N entiers compris entre 1 et 6. N est une constante qui vaudra 10 pendant la mise au point du programme, puis 100, 1000 ou plus Modifier le programme pour, dans une nouvelle boucle, compter et afficher le nombre de "1" du tableau. FAIRE VERIFIER. Raliser le programme final et afficher convenablement, en pourcentage, les rsultats statistiques. Ex8 tasser.cpp Dclarer et initialiser un tableau contenant les 10 entiers suivants : 0 1 0 0 8 0 7 6 0 0. L'afficher. Effacer toutes les valeurs "0" du tableau et tasser les lments restants. Afficher le tableau rsultant. On utilisera un second tableau dans un premier temps puis on recommencera l'exercice avec un seul tableau. - 30 -
3. PROJET
P4
La valeur de peut tre calcule par la somme infinie suivante :
=4 1 1 + 1 1 + 1 1 ... 3 5 7 9 11 Ecrire un programme qui calcule la somme des 100 premiers termes.
Encore mieux Modifier pour obtenir un programme qui permet de calculer le nombre de termes de la srie ncessaire pour stabiliser la Nime dcimale, N compris entre 0 et 5. (la vraie valeur de sera obtenue par la mthode de l'exercice 1)
Encore plus fort Le modifier pour que l'utilisateur entre le nombre de dcimales souhaites et qu'il obtienne le nombre de termes de la srie utilis.
- 31 -
CH 5 : FONCTIONS
1. PRESENTATION DES FONCTIONS
Pour permettre de rutiliser une portion de programme sans rcrire les lignes, on utilise les fonctions. Lorsqu'on appelle une fonction, une portion de code est excute. Une fonction reoit (en entre) des informations : les arguments : donnes renvoie (en sortie) une information, la valeur de retour.
1.1 Exemple
double Moyenne(int x1, int x2) { return (x1+x2)/2.; } int main() { int nMath=15, nPhys=11; cout<<Moyenne(nMath, nPhys)<<endl; return 0; }
1.2 Description
Moyenne est le nom de la fonction double est le type de la valeur retourne x1 et x2 sont les variables dans lesquelles seront placs les arguments formels (x1+x2)/2 est la valeur retourne. On aurait pu galement crire :
double moy; moy = (x1+x2)/2.; return moy; Moyenne(nMath, nPhys) est l'appel de la fonction. Les valeurs numriques des variables nMath et nPhys de main sont recopies dans les variables x1 et x2 de la fonction. Reprsenter le transfert des valeurs sur le programme ci-dessous : int main() { int nMath=15, nPhys=11; cout<<Moyenne(nMath, nPhys)<<endl; return 0; } double Moyenne(int x1, int x2) { double moy; moy = (x1+x2)/2.; return moy; }
1.3 Gnralisation
A chaque utilisation d'une fonction, on retrouve : l'appel de la fonction la dfinition de la fonction en elle mme : type de la valeur retourne, nom, type et nom des arguments ( Rgle de style : on utilisera une majuscule comme premire lettre du nom d'une fonction sauf pour main.) le corps de la fonction : les lignes de code entre accolades.
- 32 -
Une fonction renvoie une valeur, cette valeur est Soit stocke dans une variable : var = Fonction.(); Soit directement affiche l'cran : cout<<Fonction()
1.4 Exercice
Pour l'exemple prcdent, quels sont : L'appel de la fonction Le type de valeur retourne Le nom de la fonction, Les arguments de la fonction, Le corps de la fonction.
double Moyenne(int x1, int x2) { return (x1+x2)/2.; } int main() { int nMath=15, nPhys=11; cout<<Moyenne(nMath, nPhys)<<endl; return 0; }
double Moyenne(int, int); void main() { int nMath=15, nPhys=11; cout<<Moyenne(nMath, nPhys)<<endl; return 0; } double Moyenne(int x1, int x2) { return (x1+x2)/2.; }
Le prototype ressemble la premire ligne de dclaration de la fonction, mais comporte un point virgule en fin de ligne et ne spcifie pas le nom des arguments. Lorsqu'on utilise des fonctions du systme, il faut galement donner leur prototype. En fait, il suffit d'indiquer au pr processeur le fichier dans lequel est crit le prototype. Ces prototypes sont regroups dans des fichiers en-tte d'extension .h. Ainsi, crire : # include <stdio.h> c'est inclure dans le programme le prototype des fonctions d'entres / sorties. Les bibliothques spcifiques au C++ ne comportent pas dextension .h : #include <iostream>
- 33 -
- 34 -
TD 5
Ex 1 Prvoir le rsultat du programme du paragraphe 2.1 du cours. Ex 2 Pour chacune des fonctions ci-dessous, remplir le tableau void Carre(int i) { int j; j=i*i; cout<<"carr de "<<i<<":"<<j<<endl; } double Pi() { return 3.14159265; }
Carre
Argument(s) : nom et type
Pi
Multiplie
Message
Ex 3 Pour les fonctions dcrites ci-dessous, prvoir le type de fonction en dfinissant ses arguments, sa valeur retourne (ventuelle), son rle et son appel : Parabole : la fonction reoit un rel x et renvoie 3x2 + 1, sans affichage lcran. Maxim : la fonction reoit deux entiers et renvoie le plus grand des deux, sans affichage lcran. Bonjour : la fonction affiche "Bonjour" l'cran. Nbonjour : la fonction reoit un nombre entier nFois et affiche "Bonjour" un nombre de fois gal cette valeur. Parabole
Argument : nom et type
Maxim
Bonjour
Nbonjour
- 35 -
Ex 4 Mme exercice Fcube : la fonction reoit un entier et renvoie son cube (n3=n*n*n). SommeCube : la fonction reoit un entier compris entre 100 et 999, calcule ces units, ces dizaines et ces centaines, effectue la somme u3 + c3 + d3 et l'affiche. TestSomCube : La fonction reoit un entier compris entre 100 et 999, calcule la somme des cubes des units, dizaines et centaines, naffiche rien, mais retourne 0 ou 1 selon que cette somme est gale ou non l'entier reu.
Fcube
Argument : nom et type
SommeCube
TestSomCube
Ex 5 : Passage d'arguments pour information Seule la valeur numrique (contenu ) de l'argument est transmise. void Echange(int a, int b) { int c; c=a; a=b; b=c; } int main() { int n=10, p=20; cout<<"main: Avant appel de Echange n="<<n<<" p="<<p<<endl; Echange(n,p); cout<<"main: Apres appel de Echange n="<<n<<" p="<<p<<endl; return 0; } Dterminer le contenu des variables lors du droulement en pas pas de ce programme. Pourquoi navoir pas appel la variable a n et la variable b p ? Rq : Cas des tableaux L'identificateur du tableau, c'est dire son nom, reprsente l'adresse du premier lment : tab = &tab[0]. Passer en argument une fonction le nom d'un tableau revient lui passer l'adresse mmoire du tableau. On transmet donc le tableau lui mme et non une recopie de son contenu : void Fonction (double tableau[]) { } int main() { ... double reel[10]; Fonction (reel); ... }
- 36 -
exemple : #include <iostream.h> #include <iomanip.h> void LireTableau(int N, double tab[]) { int i; for (i=0; i<N; i++) { cout<<"tab["<<i<<"] : "<<endl; cin>>tab[i]; } } int main() { const int NMAX = 50; int i, nbMes; double resultats[NMAX]; cout<<"Nombre de mesures ? "<<endl; cin>>nbMes; LireTableau(nbMes, resultats); for(i=0; i<nbMes; i++) cout<<setw(10)<<resultats[i]; cout<<endl; return 0; }
- 37 -
TP 5
1. EXERCICES DE BASE
Ex1 parabole.cpp Ecrire une fonction qui reoit un rel x et renvoie 3x2 + 1, sans affichage lcran. Tester cette fonction en l'appelant dans le programme principal, le rel sera entr au clavier. La fonction principale ralise laffichage du rsultat. Ex2 maxim.cpp Ecrire une fonction qui reoit deux entiers et renvoie le plus grand des deux, sans affichage lcran. Tester cette fonction en l'appelant dans le programme principal, les deux entiers seront entrs au clavier. La fonction principale ralise laffichage du rsultat. Ex3 bonjour.cpp Ecrire une fonction qui affiche "Bonjour" l'cran. Tester cette fonction en l'appelant dans le programme principal. Ex4 Nbonjour.cpp Ecrire une fonction qui reoit un nombre entier nFois et affiche "Bonjour" un nombre de fois gal cette valeur. Tester cette fonction en l'appelant dans le programme principal, le nombre d'itrations sera entr au clavier. Ex5 surface.cpp Ecrire une fonction qui retourne la valeur numrique de pi : PI(). Ecrire une fonction qui reoit le rayon dun disque et renvoie sa surface, cette fonction utilise la prcdente. Ecrire la fonction principale permettant de mettre en uvre ces fonctions. Ex6 cube.cpp On cherche les nombres qui comme 153 vrifient 153 = 13+53+33 Ecrire une fonction Fcube qui reoit un entier et renvoie son cube (n3=n*n*n). Ecrire une fonction principale qui appelle Fcube, et tester cette fonction. Ecrire une fonction SommeCube qui reoit un entier compris entre 100 et 999, calcule ces units, ces dizaines et ces centaines et affiche la somme des cubes des units, dizaines et centaines. On utilisera Fcube. Utiliser la fonction principale prcdente modifie pour tester cette fonction. En partant de la fonction prcdente, et en la modifiant, crer une fonction "TestSomCube"qui reoit un entier compris entre 100 et 999, calcule ses unit, dizaine et centaine, puis la somme des cubes des units, dizaines et centaines l'aide de Fcube, naffiche rien, mais retourne 0 ou 1 selon que cette somme est gale ou non au nombre. Utiliser la fonction principale prcdente modifie pour tester cette fonction.
Modifier la fonction principale pour dterminer et afficher tous les nombres cdu compris entre 100 et 999 qui vrifient c3+d3+u3 = cdu .
- 38 -
Vrifier que vous savez : Ecrire une fonction, avec ou sans argument, qui renvoie ou non une valeur : 4 cas. Tester avec une fonction principale chacune de ces 4 fonctions Extraire d'un entier ses diffrents digits (units, dizaines)
2. EXERCICES AVANCES
Ex7 disparfaits.cpp Les fonctions seront testes dans un programme principal. Ecrire une fonction Diviseurs qui reoit un entier et affiche tous ses diviseurs. Ecrire une fonction SommeDiv qui reoit un entier et renvoie la somme de ses diviseurs, l'entier lui mme compris. Ex : (6) = 1 + 2 + 3 + 6 = 12 Ecrire une fonction Premier qui reoit un nombre et laffiche sil est premier (alors (n) = n+1, sauf pour 1); Ecrire une fonction Disparfait qui reoit un nombre et laffiche sil est disparfait, ( il vrifie (n) = 2n). Ecrire une fonction Triparfait qui reoit un nombre et laffiche sil est triparfait. Chercher et afficher les nombres premiers compris entre 1 et 100, les nombres disparfaits compris entre 1 et 1000, les nombres triparfaits compris dans le mme intervalle. (0 6 28 496 puis 0 120 672) Ex8 factorielle.cpp Ecrire une fonction qui reoit un entier et renvoie sa factorielle : n! = 1.2.3. .n. Tester cette fonction avec une fonction principale adquate.
- 39 -
ANNEXE
COMPLEMENT : VISIBILITE ET PASSAGE DE PARAMETRES
bloc d'instructions
Un bloc d'instructions est encadr d'accolades et compos de deux parties : les dclarations locales et les instructions. Exemples : une fonction, un bloc de condition Le C permet la dclaration de variable dans n'importe quel bloc d'instruction (pour des programmes simples, on peut continuer tout dclarer en tte de fonction, pour une bonne lisibilit). if (N>0) { int i; for (i=0; i<N; i++) }
variables locales
Les variables dclares dans un bloc d'instructions sont uniquement visibles l'intrieur de ce bloc : on dit que ce sont des variables locales ce bloc. int Fonction(int a); { int x; x = 100; ... while (a>10) { double x; ... x = x*a; } }
variables globales
Les variables dclares au dbut du fichier, l'extrieur de toutes les fonctions, sont disponibles pour toutes les fonctions du programme. Ce sont alors des variables globales. Il faut faire attention ne pas cacher involontairement des variables globales par des variables locales du mme nom. En gnral, les variables globales sont dclares immdiatement derrire les instructions #include au dbut du programme. #include <stdio.h> int status; void A(...) { if (status>0) status--; else } void B(...) { ... status++; ... }
Les variables globales sont utiliser avec prcaution : pour nous uniquement lorsque plusieurs fonctions qui ne s'appellent pas ont besoin des mme variables, ou plusieurs fonctions d'un programme ont besoin du mme ensemble de variables (un tableau par exemple)
- 40 -
TD TP 6 : BILAN
Les exercices sont prparer en TD et tester en TP.
Ex 1 Somme
L'utilisateur doit entrer un entier N, le programme doit afficher la somme des N premiers entiers : 1 + 2 + 3 + + N-1 + N.
Ex 2 PGCD
Pour viter de calculer le PGCD de deux nombres ( plus grand commun diviseur), on utilise l'astuce suivante : Soient deux entiers A et B tels que A > B. Le PGCD de A et B est le mme que celui de A-B et B. Exemple : pour calculer le PGCD de 30 et 18 PGCD de 30 et 18 = PGCD de (30-18), et 18 = PGCD (12 et 18) = PGCD (18-12) et 12 = PGCD (6 et 12)= PGCD (12-6) et 6 = PGCD de 6 et 6 = 6. Calculer votre tour, la main, le PGCD de 36 et 16. Elaborer un algorithme permettant d'effecteur ce calcul automatiquement. Ecrire une fonction qui reoit deux nombres entiers positifs et renvoie leur PGCD, dans un premier temps, cette fonction affichera tous les rsultats intermdiaires. Ecrire une fonction principale qui teste la fonction prcdente.
Ex 3 dichotomie
Problme Prvoir la structure d'un programme dterminant, par dichotomie, le zro d'une fonction f(x) continue sur un intervalle considr. On suppose connu un intervalle [a, b] sur lequel la fonction change de signe : f(a).f(b) < 0. Exemple d'application : Une fonction simple pour commencer : f(x) = 3x 2 dans lintervalle [0 ; 1] on doit trouver x = 2/3 Une fonction plus complexe pour testerf(x) = atan x + atan(x+1) + atan(x-1) -/2 = 0, [a, b] = [0 ; 1] (x 0,82) Analyse On suppose que f(x) ne s'annule qu'une fois sur l'intervalle. Soit m le milieu de [a, b]. Si f(a).f(m) < 0, le zro est entre a et m, sinon, il est entre b et m. On remplace l'intervalle [a,b] par l'intervalle [a,m] ou [b,m], selon la place du zro, et on divise le nouvel intervalle en deux. Le traitement est interrompu lorsque l'intervalle [a,b] est suffisamment rduit, c'est dire lorsque |b a| est infrieur la prcision souhaite. Ecrire la dmarche pour rsoudre le problme (liste daction, organigramme)
Premier programme Ecrire un programme qui permet de reprer lindice du plus petit lment, afficher cet indice. Modifier ce programme pour permuter cette plus petite valeur avec celle contenue dans tab[0].
- 41 -
Second programme Il s'agit maintenant de chercher le plus petit lment du tableau (dimension N), et de le placer en tte (change avec le premier lment), puis de recommencer sur les N-1 lments restants, etc Effectuer le tri dans le tableau suivant Tableau initial Itration 1 Itration 2 Itration 3 Itration 4 Itration 5 Proposer un organigramme ou un algorithme. Dfinir les variables utilises, en spcifiant les variables de comptage (boucle) et leurs bornes. Ecrire le code. Lors du test, on utilisera dans un premiers temps le tableau propos dans l'exemple, entr la dclaration, chaque tableau intermdiaire sera affich, puis un tableau de 13 entiers alatoires gnrs par la fonction rand(), chaque tableau intermdiaire sera inscrit sur une ligne. (chaque entier sera affich sur un champ de 6 laide de stew, puisqu'il comporte au plus 5 digits, 6*13 = 78 < 80 colonnes de la console). 6 4 3 5 2 1
Ex 5 tri bulle
Il s'agit de parcourir le tableau du dbut la fin, en permutant deux lments successifs s'ils ne sont pas bien classs. Ce ci permet de placer au fond du tableau le plus grand lment et de pr-trier les autres. On recommence le parcours jusqu' ce qu'il ne comporte plus de permutation. Tableau initial 6 4 4 6 3 6 5 6 2 6 1 Tableau n2 4 3 3 4 4 2 5 1 Tableau n3 3 4 2 1 5 5 6 6 5 2 1 6 6 3 5 2 1
Tableau n4
Tableau n 5
- 42 -
TEST 2009-2010
Dure 1 h 45 Document autoris : cahier de TP
Ex 1 : structure conditionnelle 1
Ecrire un programme qui teste si un nombre entier est compris dans lintervalle ferm [5 ; 10] et affiche le rsultat comme suit :
Ou
Ex 2 : structure conditionnelle 2
Un fournisseur effectue une remise de 3 % sur le montant brut des achats si ce montant dpasse 100 ou une remise de 5 % si le montant dpasse 300 . Ecrire un programme qui demande lutilisateur dentrer le montant brut de ses achats en euros et centimes puis qui calcule et affiche le montant de la rduction et la somme payer.
(45/0/45
348/17.40/330.6)
Ex 3 : structure itrative 1
On cherche le plus grand diviseur dun nombre, diffrent du nombre. Exemples : le plus grand diviseur de 16 est 8 ; le plus grand diviseur de 15 est 5. Ecrire un programme qui recherche puis affiche le plus grand diviseur dun entier entr au clavier par lutilisateur.
Ex 4 : structure itrative 2
Ecrire un programme qui demande lutilisateur dentrer un entier trois chiffres (cest--dire compris entre 100 et 999) dont la somme des chiffres vaut 9, et qui repose la question tant que lutilisateur se trompe. Modifier lexercice pour que la question soit galement repose si le nombre entr ne possde pas trois chiffres.
Ex 5 : Fonction 1
Soit f la fonction mathmatique dfinie par f(x) = sin(x) + x2 - x. Ecrire une fonction nomme Equation qui reoit un rel (naturellement exprim en radian) et renvoie la valeur de la fonction f pour ce rel. Utiliser cette fonction dans une fonction main approprie pour afficher la table des valeurs de f pour les entiers compris entre 1 et 9, avec 5 chiffres significatifs, sous la forme donne ci-contre.
- 43 -
Ex 6 : Tableaux
Raliser un programme qui remplit un tableau de 10 lments avec des valeurs entires comprises entre 0 et 5, choisies alatoirement. Le programme doit afficher le contenu du tableau raison dun lment par ligne, calculer la somme des lments du tableau et lafficher dterminer lindice des lments nuls et les afficher.
Ex 7 : Fonction 2
Ecrire une fonction Jeu qui gnre trois nombres alatoires compris entre 1 et 6 (simulant trois jets de d), qui affiche ces trois nombres, qui calcule la somme des trois nombres et qui renvoie 1 si la somme est suprieure 13, qui renvoie 0 sinon. Crer une fonction principale permettant de tester cette fonction, on affichera gagn si la somme dpasse 13, perdu sinon.
ou
Ex 8 : Bilan
Dcomposer un nombre entier n en facteurs premiers consiste trouver tous les diviseurs de ce nombre qui sont des nombres premiers. 792 = 2 2 2 3 3 11 En fait, on essaie souvent daller plus loin en trouvant pour chaque diviseur son nombre dapparitions dans la dcomposition , ainsi on peut crire : 792 = 23 32 11. Ecrire un programme qui - demande lutilisateur dentrer un entier - affiche les frquences des diviseurs premiers de ce nombre. Indication : Ds quun diviseur est trouv, diviser le nombre par ce diviseur jusqu ce que le reste soit non nul : On teste 2 : 792 est divisible par 2, rsultat 396 donc 2 divise 1 fois 792 396 est divisible par 2, rsultat 198 donc 2 divise 2 fois 792 198 est divisible par 2, rsultat 99 donc 2 divise 3 fois 792 99 nest pas divisible par 2 On teste 3
- 44 -
Choisir le langage C++, puis Renseigner la fentre : le nom du projet : TP1 l'endroit o il sera stock sur le serveur : P:\INFORMATIQUE Next
- 45 -
Le code de votre programme remplacera la ligne cout << "Hello world!" << endl; Tout le reste sera prsent dans tous vos programmes.
- 46 -
File/New/Empty File
La roue dente effectue la construction du projet, c'est--dire la compilation du fichier et la cration du fichier excutable (code binaire compris par l'ordinateur). Le bouton "play" vert excute le programme. Le troisime bouton construit puis excute.
Build / Construit le projet / Ctrl F9 Run / Excute du projet / Ctrl F10 Build and Run / Construit et excute / F9 Rebuild / reconstruit tout Abort / Termine lexcution en cours Choix du type de cible : version pour chercher les erreurs (Debug) ou version finale (Release)
Lors de la compilation, si tout se passe bien, on obtient Process terminated with status 0 (0 minutes, XX seconds) le message ci-contre dans la fentre Build log 0 errors, 0 warnings
- 47 -
Debug/Continue Excute le programme jusqu'au point d'arrt suivant ou jusqu' la prochaine erreur. F8 Run to cursor / Excute le programme jusqu' la ligne du code o se trouve le curseur. F4 Next line/ Excute une ligne sans entrer dans les fonctions F7 Next Instruction / Excute une instruction en assembleur Step into / Excute une ligne en entrant dans les fonctions Step out / Excute jusqu la fin du bloc en cours Stop Debugger / Termine lexcution en cours Menu douverture des fentres de dbogage L'ouverture de la fentre de debogage Watches Glisser cette fentre sous la fentre de Managment.
On excute jusque l : La flche jaune indique la prochaine ligne qui sera excute :
F4 / Run to Curseur
On excute les lignes une par une en regardant les variables (Watches) Plus tard, quand on voudra entrer dans le code d'une fonction ou dune structure, on utilisera Si on doit entrer une donne dans la fentre noire, il faut l'ouvrir en cliquant dans la barre en bas de l'cran : On sort du dbogueur si on le souhaite, avant la fin du programme : - 48 -
Stop debugger
- 49 -
- 50 -
ANNEXE 4
Inclusion des en-ttes Dfinition des espaces de noms utiliser (noms standard du C) Dclaration des fonctions Point d'entre du programme Dclaration des constantes et des variables Entre des donnes Traitement des donnes, calculs Affichage des rsultats Fin du programme
int main() {
return 0; }
Il faut prendre lhabitude dajouter des commentaires aux programmes, mme si ceci peut paratre un peu artificiel lors de lcriture des premiers programmes. Pourquoi ajouter des commentaires ?
(Le contenu de ce paragraphe est extrait de http://fr.wikibooks.org/wiki/Programmation/Commentaires)
Ajouter des commentaires un programme permet de dcrire ce que fait le code, en utilisant un langage naturel. Il est important d'ajouter des commentaires pour les raisons suivantes : Expliquer le rle d'une fonction Utiliser une fonction est compliqu si on ne sait pas ce qu'elle fait, ce qu'elle retourne. Une explication permet de savoir comment l'utiliser. Expliquer le fonctionnement d'un algorithme complexe Le code source des algorithmes les plus complexes ne suffit pas en comprendre le fonctionnement. Une description synthtique permet de le modifier pour l'adapter un autre projet, ou pour le corriger en cas de problmes. Justifier certains choix techniques Un code source est souvent repris ultrieurement (correction, rutilisation). Si certains choix ne sont pas justifis par un commentaire explicatif, ils pourront tre remis en cause par le dveloppeur. Comment ajouter des commentaires ? Pour crire une ligne de commentaires, faire prcder la ligne de //. Pour crire plusieurs lignes de commentaires, encadrer le paragraphe par /* (dbut) et */(fin). // ceci est un commentaire sur une ligne /* ceci est un commentaire sur plusieurs lignes */
- 51 -