Structures conditionnelles [if] Sujets d Examens Karine Zampieri, Stéphane Rivière, Béatrice Amerein-Soltner Unisciel algoprog Version 15 octobre 2016 Table des matières 1 Indice de masse corporelle / pgimc 2 2 Tarifs d assurance / pgassurance 5 3 Abonnements téléphoniques / pgtelecom 7 4 Calcul du poids idéal / pgpoids 9 5 Le stationnement alternatif / pgalternatif 12 6 La fourchette / pgfourche 14 7 Manipulation du temps 17 7.1 Une minute plus tard / pgminute...................... 17 7.2 L horloge / pghorloge............................ 19 8 Références générales 19 C++ - Sujets d Examens (Solution) 1
Unisciel algoprog Sujets d examens [if17], October 15, 2016 2 1 Indice de masse corporelle / pgimc Utilise Conditions, Si Durée estimée 15 min Objectif L Indice de Masse Corporelle (IMC) constitue un indice d appréciation des risques pour la santé liés au surpoids. Cet indice est calculé en divisant le poids (en kilogrammes) par la taille (en mètres) au carré. L interprétation de l IMC se fait selon les critères suivants : Strictement inférieur à 16 : dénutrition De 16 à 18.5 non inclus : maigreur De 18.5 à 25 non inclus : corpulence normale De 25 à 30 non inclus : surpoids De 30 à 35 non inclus : obésité modérée De 35 à 40 non inclus : obésité sévère 40 ou plus : obésité massive Ce «non inclus» est une précision d informaticien qui a besoin de ce détail : elle n a pas de sens pratique dans la vie réelle. Écrivez un programme qui saisit : Le poids (en kg) d un individu dans p (réel). Sa taille (en mètre) dans t (réel). Affichez les invites : Votre poids (en kg)? Votre taille (en m)? Calculez l IMC dans imc (réel) défini par : IMC = p / t 2 Affichez (où [x] désigne le contenu de x) : ==> Votre IMC vaut [imc]
Unisciel algoprog Sujets d examens [if17], October 15, 2016 3 Affichez l un des messages suivants (c.-à-d. uniquement de texte de gauche) de l interprétation de l IMC : ==> Denutrition // imc < 16 ==> Maigreur // 16 <= imc < 18.5 ==> Corpulence normale // 18.5 <= imc < 25 ==> Surpoids // 25 <= imc < 30 ==> Obesite moderee // 30 <= imc < 35 ==> Obesite severe // 35 <= imc < 40 ==> Obesite massive // 40 <= imc Solution simple Les opérateurs de comparaison d infériorité ou de supériorité devant être utilisés, plusieurs instructions alternatives imbriquées s imposent. Validez votre programme avec la solution. Solution C++ #include <iostream> using namespace std; @[pgimc1.cpp] int main() double poids; cout<<"votre poids (en kg)? "; cin>>poids; double taille; cout<<"votre taille (en m)? "; cin>>taille; double imc = poids / (taille * taille); cout<<"==> Votre IMC vaut "<<imc<<endl; if (imc < 16) cout<<"==> Denutrition"<<endl; else if (imc < 18.5) cout<< "==> Maigreur"<<endl; else if (imc < 25) cout<< "==> Corpulence normale"<<endl; else if (imc < 30) cout<< "==> Surpoids"<<endl; else if (imc < 35) cout<< "==> Obesite moderee"<<endl; else if (imc < 40)
Unisciel algoprog Sujets d examens [if17], October 15, 2016 4 cout<< "==> Obesite severe"<<endl; else cout<<"obesite massive"<<endl;
Unisciel algoprog Sujets d examens [if17], October 15, 2016 5 2 Tarifs d assurance / pgassurance Utilise Conditions, Si Durée estimée 15 min Objectif Une assurance propose trois couleurs de tarifs (Vert, Orange et Rouge) selon l âge et le nombre d accidents des automobilistes. Accidents Moins de 25 ans 25 ans et plus 0 accidents Orange Vert 1 ou 2 accidents Rouge Orange 3 à 6 accidents Pas assuré Rouge 7 accidents ou plus Pas assuré Pas assuré Étant donnés l âge et le nombre d accidents d un automobiliste, cet exercice détermine la couleur de tarif. Écrivez un programme qui saisit : L âge d un automobiliste dans age (entier). Son nombre d accidents dans naccs (entier). Affichez les invites : Votre age? Nombre d'accidents? Calculez les booléens de la couleur de tarif : bv (tarif vert). bo (tarif orange). br (tarif rouge). Affichez l un des textes : VERT ORANGE ROUGE Pas assure Aide simple Utilisez l alternative Si.
Unisciel algoprog Sujets d examens [if17], October 15, 2016 6 Testez. Exemples d exécution. Votre age? 30 Nombre d'accidents? 0 VERT Votre age? 20 Nombre d'accidents? 2 ROUGE Votre age? 22 Nombre d'accidents? 5 Pas assure Validez votre programme avec la solution. Solution C++ #include <iostream> using namespace std; @[pgassurance1.cpp] int main() int age; cout << "Votre age? "; cin >> age; int naccs; cout << "Nombre d accidents? "; cin >> naccs; bool bv = (naccs==0 && age>=25); bool bo = ((naccs==0 && age<25) (naccs>=1 && naccs<=2 && age>=25)); bool br = ((naccs>=1 && naccs<=2 && age<25) (naccs>=3 && naccs<=6 && age>=25)); if (bv) cout << "VERT" << endl; else if (bo) cout << "ORANGE" << endl; else if (br) cout << "ROUGE" << endl; else cout << "Pas assure" << endl;
Unisciel algoprog Sujets d examens [if17], October 15, 2016 7 3 Abonnements téléphoniques / pgtelecom Utilise Conditions, Si Durée estimée 15 min Objectif Vous désirez comparer deux offres d abonnement téléphonique. La facture est calculée avec un fixe (somme à payer obligatoirement tous les mois) et une partie proportionnelle au temps (en minutes) passé à téléphoner. Offre Fixe Prix à la minute Telecom 1 10e 0.50e Telecom 2 15e 0.40e Écrivez un programme qui saisit la consommation moyenne mensuelle (en minutes) dans consom (réel). Affichez l invite : Consommation moyenne (en minutes)? Calculez les montants des deux offres : Dans tarif1 (réel) pour Télécom 1. Et tarif2 (réel) pour Télécom 2. Affichez (ou [x] désigne le contenu de x) : Avec Telecom1 = [tarif1] euros Avec Telecom2 = [tarif2] euros Affichez l opérateur le plus intéressant, c.-à-d. l un des messages : ==> Prenez Telecom1 ==> Prenez Telecom2 ==> Prenez l'un ou l'autre Orientation C/C++ Attention à l opérateur de comparaison. Calculez et affichez à partir de combien de minutes l opérateur Telecom2 est plus intéressant que Telecom1, à savoir : (fixe2 fixe1 )/(prix1 prix2 )
Unisciel algoprog Sujets d examens [if17], October 15, 2016 8 Testez. Exemples d exécution. Consommation moyenne (en mn)? 30 Avec Telecom1 = 25 euros Avec Telecom2 = 27 euros ==> Prenez Telecom1 Prenez Telecom2 a partir de 50 mn Consommation moyenne (en mn)? 50 Avec Telecom1 = 35 euros Avec Telecom2 = 35 euros ==> Prenez l'un ou l'autre Prenez Telecom2 a partir de 50 mn Validez votre programme avec la solution. Solution C++ @[pgtelecom1.cpp] #include <iostream> using namespace std; int main() const double FIXE1 = 10.0; const double FIXE2 = 15.0; const double PRIX1 = 0.5; const double PRIX2 = 0.4; double consom; cout << "Consommation moyenne (en mn)? "; cin >> consom; double tarif1 = FIXE1 + PRIX1 * consom; double tarif2 = FIXE2 + PRIX2 * consom; cout << "Avec Telecom1 = " << tarif1 << " euros" << endl; cout << "Avec Telecom2 = " << tarif2 << " euros" << endl; if (tarif1 < tarif2) cout << "==> Prenez Telecom1" << endl; else if (tarif1 > tarif2) cout << "==> Prenez Telecom2" << endl; else cout << "==> Prenez l un ou l autre" << endl; cout << "Prenez Telecom2 a partir de " << (FIXE2-FIXE1)/(PRIX1-PRIX2)<< " mn" << endl;
Unisciel algoprog Sujets d examens [if17], October 15, 2016 9 4 Calcul du poids idéal / pgpoids Utilise Conditions, Si Durée estimée 25 min Objectif Mon poids se situe-t-il dans la moyenne? Écrivez un programme qui saisit : Le poids d un individu dans poids (réel). Sa taille dans taille (réel). Son sexe dans sexe (caractère). Affichez les invites : Votre poids (en kg)? Votre taille (en cm)? Votre sexe (f,m)? Outil C/C++ Le type caractère s écrit char. Calculez dans pn (réel) la limite inférieure du poids normal : PN = Taille(en cm) 100 Calculez dans sp (réel) la limite inférieure de la surcharge pondérale qui se situe 10% au-dessus du poids normal : SP = 1.10 PN Calculez dans pi (réel) la limite inférieure du poids idéal. Les conditions s avèrent plus sévères pour les femmes (15% en-dessous du poids normal) que pour les hommes (10%) : Femmes : Hommes : PI = 0.85 PN PI = 0.90 PN Outil C/C++ Pour tester si un char x vaut la lettre 'f', on écrit : if (x == f )
Unisciel algoprog Sujets d examens [if17], October 15, 2016 10 Calculez dans sa (réel) la limite supérieure de la sous-alimentation qui représente 95% du PI : SA = 0.95 PI Affichez les calculs (où [x] désigne le contenu de x) : Surcharge ponderale >= [sp] Poids normal = [pn] Poids ideal = [pi] Sous alimentation <= [sa] En fonction du poids et des valeurs calculées, Affichez l un des messages suivants : (Ce qui est après les // est un commentaire. N affichez que la partie gauche) : Vous etes en Surcharge ponderale // si poids >= sp Bravo, votre poids est normal // si poids >= pn et poids <= sp Super, vous avez le poids idéal // si poids >= sa et poids <= pn Vous etes en Sous alimentation // si poids <= sa Orientation Ordonnez vos tests de sorte à ne faire qu un unique test dans la structure Si. Finalement affichez l éventuel message : Parlez-en à votre médecin // si poids<=sa ou si poids>=sp Testez. Exemples d exécution. Votre poids (en kg)? 50 Votre taille (en cm)? 165 Votre sexe (f,m)? f ==> Surcharge ponderale >= 71.5 ==> Poids normal = 65 ==> Poids ideal = 55.25 ==> Sous alimentation <= 52.4875 ==> Vous etes en Sous alimentation ==> Parlez-en à votre médecin Votre poids (en kg)? 74 Votre taille (en cm)? 180 Votre sexe (f,m)? m ==> Surcharge ponderale >= 88 ==> Poids normal = 80
Unisciel algoprog Sujets d examens [if17], October 15, 2016 11 ==> Poids ideal = 72 ==> Sous alimentation <= 68.4 ==> Super, vous avez le poids idéal Validez votre programme avec la solution. Solution C++ #include <iostream> using namespace std; @[pgpoids1.cpp] int main() double poids; cout << "Votre poids (en kg)? "; cin >> poids; double taille; cout << "Votre taille (en cm)? "; cin >> taille; char sexe; cout << "Votre sexe (f,m)? "; cin >> sexe; double pn = taille - 100; double sp = 1.1 * pn; double pi = (sexe == f )? pn * 0.85 : pn * 0.90; double sa = 0.95 * pi; cout << "==> Surcharge ponderale >= " << sp << endl; cout << "==> Poids normal = " << pn << endl; cout << "==> Poids ideal = " << pi << endl; cout << "==> Sous alimentation <= " << sa << endl; if (poids >= sp) cout << "==> Vous etes en Surcharge ponderale" << endl; else if (poids >= pn) cout << "==> Bravo, votre poids est normal" << endl; else if (poids >= sa) cout << "==> Super, vous avez le poids idéal" << endl; else cout << "==> Vous etes en Sous alimentation" << endl; if (poids <= sa poids >= sp) cout << "==> Parlez-en à votre médecin" << endl;
Unisciel algoprog Sujets d examens [if17], October 15, 2016 12 5 Le stationnement alternatif / pgalternatif Utilise Conditions, Si Durée estimée 15 min Objectif Dans une rue où se pratique le stationnement alternatif, on se gare : Du 1 au 15 du mois : du côté des maisons ayant un numéro impair. Et le reste du mois : de l autre côté. Écrivez un programme qui saisit le numéro du jour dans jr (entier supposé compris entre 1 et 31). Affichez l invite : Numero du jour? Selon la valeur de jr, affichez de quel côté (impair ou pair) on doit se garer. Exemple : Pour jr valant 20 : Garez-vous du cote pair Saisissez le numéro de maison devant laquelle vous vous êtes arrêté dans num (entier). Affichez l invite : Numero de maison? Sur la base du numéro du jour jr et du numéro de maison num, Indiquez dans un booléen b si vous êtes bien stationné ou non. Affichez (où [x] signifie le contenu de x) : Stationnement correct : [b] (Le C++ indiquera 1 pour Vrai et 0 pour Faux.) Testez. Exemples d exécutions. Numero du jour? 20 Garez-vous du cote pair Numero de maison? 67 Stationnement correct : 0 Numero du jour? 5 Garez-vous du cote impair Numero de maison? 9 Stationnement correct : 1
Unisciel algoprog Sujets d examens [if17], October 15, 2016 13 Validez votre programme avec la solution. Solution C++ #include <iostream> using namespace std; @[pgalternatif1.cpp] int main() int jr; cout << "Numero du jour? "; cin >> jr; if (1 <= jr && jr <= 15) cout << "Garez-vous du cote impair" << endl; else cout << "Garez-vous du cote pair" << endl; int num; cout << "Numero de maison? "; cin >> num; bool b = (1 <= jr && jr <= 15 && num%2==1) (15 < jr && jr <= 31 && num%2==0); cout << "Stationnement correct : " << b << endl;
Unisciel algoprog Sujets d examens [if17], October 15, 2016 14 6 La fourchette / pgfourche Utilise Conditions, Si Durée estimée 15 min Objectif Cet exercice demande trois entiers puis affiche si le premier des trois appartient à l intervalle donné par le plus petit et le plus grand des deux autres. Exemple : Vos trois entiers? 2 6-1 a=2 b=-1 c=6 Fourchette : -1<=2<=6 Écrivez un programme qui saisit trois entiers dans a, b et c. Affichez l invite : Vos trois entiers? Pour réaliser le test, il faut que b et c soient ordonnés. Par conséquent, Réordonnez-les de sorte que b contienne le plus petit et c le plus grand de b et c. Rappel de cours Pour permuter deux contenus, il faut passer par une variable intermédiaire. Solution simple Affichez (où [x] désigne le contenu de x) : a=[a] b=[b] c=[c]
Unisciel algoprog Sujets d examens [if17], October 15, 2016 15 Selon les valeurs de a, b et c, affichez l un des trois messages. Fourchette cassee : [b]=[a]=[c] Fourchette : [b]<=[a]<=[c] [a] non dans [[b]..[c]] Testez. Exemples d exécution. Vos trois entiers? 2 6-1 a=2 b=-1 c=6 Fourchette : -1<=2<=6 Vos trois entiers? 1 3 6 a=1 b=3 c=6 1 non dans [3..6] Vos trois entiers? 3 3 3 a=3 b=3 c=3 Fourchette cassee : 3=3=3 Validez votre programme avec la solution. Solution C++ @[pgfourche1.cpp] #include <iostream> using namespace std; int main() int a, b, c; cout << "Vos trois entiers? "; cin >> a >> b >> c; int tmp; if (b > c) tmp = b; b = c; c = tmp; cout << "a=" << a << " b=" << b << " c=" << c << endl; if (b == a && a == c) cout <<"Fourchette cassee : " << b << "=" << a << "=" << c << endl; else if (b <= a && a <= c) cout <<"Fourchette : " << b << "<=" << a << "<=" << c << endl; else cout << a << " non dans [" << b << ".." << c << "]" << endl;
Unisciel algoprog Sujets d examens [if17], October 15, 2016 16 Qu est-ce qui change si on exclus les bornes? Indiquez votre Réponse comme suit en fin de programme : /*... (votre réponse)... */ Solution simple Il suffit de mettre des inégalités strictes.
Unisciel algoprog Sujets d examens [if17], October 15, 2016 17 7 Manipulation du temps 7.1 Une minute plus tard / pgminute Utilise Conditions, Si Durée estimée 15 min Objectif Cet exercice affiche l horaire (heure, minute) qu il sera une minute plus tard. (Une montre à affichage digital effectue un calcul semblable toutes les minutes.) Écrivez un programme qui saisit un horaire exprimé par deux entiers dans hr (heure) et mn (minute). Affichez l invite : Votre horaire (hr mn)? Dans ces mêmes entiers hr et mn, Calculez l horaire (heure, minute) qu il sera une minute plus tard. Aide simple On peut envisager deux familles de solutions : Soit ajouter 1 au nombre des minutes puis changer l heure si on arrive à 60. Soit traiter différemment le cas où le nombre des minutes est 59 (changement d heure) de celui où il n est pas 59 (pas de changement d heure). Dans les deux cas, on se méfiera de 23 heures et 59 minutes. Affichez l horaire en tenant compte du cas spécial de minuit et des minutes nulles. Testez. Exemples d exécution. Votre horaire (hr, mn)? 11 32 Une minute plus tard : 11h33' Votre horaire (hr, mn)? 23 59 Une minute plus tard : Minuit Votre horaire (hr, mn)? 3 59 Une minute plus tard : 4h Validez votre programme avec la solution.
Unisciel algoprog Sujets d examens [if17], October 15, 2016 18 Solution C++ @[pgminute1.cpp] #include <iostream> using namespace std; int main() int hr, mn; cout << "Votre horaire (hr, mn)? "; cin >> hr >> mn; if (mn < 59) ++mn; else mn = 0; if (hr < 23) ++hr; else hr = 0; cout << "Une minute plus tard: "; if (hr == 0 && mn == 0) cout << "Minuit" << endl; else cout << hr << "h"; if (mn!= 0) cout << mn << " "; cout << endl;
Unisciel algoprog Sujets d examens [if17], October 15, 2016 19 7.2 L horloge / pghorloge Utilise Conditions, Si Durée estimée 15 min Objectif Cet exercice fait avancer une horloge de 1 seconde. Cette horloge est représentée par un triplet de trois variables (heure, minute, seconde). Exemple : si l horloge indique 15:12:59, une seconde plus tard, elle devra indiquer 15:13:00. On suppose que le passage au jour suivant remet l horaire à 00:00:00. Écrivez un programme qui saisit un triplet d entiers dans hr (heure), mn (minute) et ss (seconde). Affichez l invite : Votre horloge (hr mn ss)? Dans ces mêmes entiers hr, mn, ss supposés valides, Calculez l horaire (heure, minute, seconde) qu il sera une seconde plus tard. Aide simple On peut envisager deux familles de solutions : Soit ajouter 1 au nombre de secondes puis changer les minutes si on arrive à 60. Soit traiter différemment le cas où le nombre de secondes est 59 (changement de minutes) de celui où il n est pas 59 (pas de changement de minutes). Affichez l horaire en tenant compte du cas spécial de minuit et des minutes nulles. Testez. Validez votre programme avec la solution. 8 Références générales Comprend [Dabancourt-PG1 :c2 :ex1], [Felea-PG1 :c3 :ex22]