ALGORITHMIQUE ET LANGAGE C – L1S2–MPI ROSELINE DESCOUT-RENIER TD 2 – GROUPE D1 JEUDI 06 FÉVRIER 2014 Objectifs de la séance : • • Concevoir un algorithme en pseudocode ; Traduire un pseudo-code en langage C. Exercices étudiés pendant la séance : 8 – 12 – 13 – 16. Méthodologie : • • • Analyse du problème ◦ Pré-traitement (définir les données du problème) ; ◦ Traitement (résolution du problème pas à pas) ; ◦ Affichage du résultat. Rédaction de l’algorithme en pseudo-code Traduction du pseudo-code en langage C Autant que possible, décomposer le code en trois parties séparées : Entrées / Traitement / Sorties, en éliminant les affichages de la partie Traitement. Exercice 8 : Pseudo-code : Code en C : #include <stdio.h> entier note, sortie ; écrire “ Entrez votre note : ” ; lire note ; int main(void) { /* Entrées. */ int note, sortie; printf ("\nEntrez votre note :"); scanf ("%d", ¬e); /* Traitements. */ if (note < 8) { sortie = 1; } else /* alors la note est supérieure ou égale à 8 */ if (note < 10) { sortie = 2; } else { /* alors la note est supérieure ou égale à 10 */ sortie = 3; } si note < 8 faire sortie ← 1 ; sinon faire si note < 10 faire sortie ← 2 ; sinon faire sortie ← 3 ; finsi finsi /* Sorties. */ switch(sortie) { case 1 : printf("\nAjournée./n"); break; case 2 : printf("\nRattrapage./n"); break; case 3 : printf("\nAdmis./n"); break; default: printf("\nErreur./n"); break; } cas sortie = 1 faire écrire “ Ajournée ” cas sortie = 2 faire écrire “ Rattrapage ” cas sortie = 3 faire écrire “ Admis ” return 0; } Conclusion : L’utilisation de la variable sortie permet de regrouper tous les affichages en fin de traitement. Un code structuré est un code plus facile à lire pour une tierce personne, donc plus facile à débugger. Exercice 12 : Dans un premier temps, réfléchir sur le papier à la façon dont on va calculer le prix des photocopies : • • • moins de 10 photocopies : chaque photocopie vaut 10 centimes → prix = nombre × 0,10 entre 10 et 30 photocopies : les 10 premières valent 10 centimes chaque, les suivantes valent 9 centimes chaque → prix = 10 × 0,10 + (nombre – 10) × 0,09 au-delà de 30 photocopies : les 10 premières valent 10 centimes chaque, les 20 suivantes valent 9 centimes chaque, les dernières valent 8 centimes chaque → prix = 10 × 0,10 + 20 × 0,09 + (nombre – 30) × 0,08 → besoin d’une variable flottante prix, d’un nombre entier correspondant au nombre de photocopies à faire. Penser à regrouper les affichages en fin de traitement. Pseudo-code : Code en C : #include <stdio.h> entier nombre ; flottant prix ; écrire “ Entrez votre nombre de photocopies : ” ; lire nombre ; int main(void) { /* Entrées. */ int n; float prix; printf ("\nEntrez votre nombre de photocopies :"); scanf ("%d", &n); /* Traitements. */ if (n < 10) { prix = n*0.1; } else /* alors le nombre de copies est supérieur à 10 */ if (n < 30) { prix = 1 + (n-10)*0.09; } else { /* alors le nombre de copies est supérieur à 30 */ prix = 2.8 + (n-30)*0.08; } si nombre < 10 faire prix = nombre*0.1; sinon faire si nombre < 30 faire prix = 1 + (nombre-10)*0.09; sinon faire prix = 2.8 + (nombre-30)*0.08; finsi finsi écrire “ Le prix de ces photocopies vaut ” prix “ euros. ” /* Sorties. */ printf("\nLe prix de ces photocopies vaut %f euros.\n", prix); return 0; } Exercice 13 : Une condition sur le sexe de la personne, une condition sur l’âge → deux conditions imbriquées Pseudo-code : Code en C : #include <stdio.h> entier age, imposable ; caractère sexe ; écrire “ Etes-vous un homme ou une femme ? ” ; lire sexe ; écrire “ Quel est votre âge ? ” ; lire age ; int main(void) { /* Entrées */ int age, imposable; char sexe ; printf ("\nEtes-vous un homme (h) ou une femme (f) ?"); scanf ("%c", &sexe); printf ("\nQuel est votre âge ?"); scanf ("%d", &age); /* Traitements */ if (sexe == 'h') { if (age >= 20) { imposable = 1; } else { imposable = 0; } } if (sexe == 'f') { if (age >= 18 && age < 35) { imposable = 1; } else { imposable = 0; } } si sexe = homme faire si age ≥ 20 faire imposable = 1 ; sinon faire imposable = 0 ; finsi finsi si sexe = femme faire si age ≥ 18 et age < 35 faire imposable = 1 ; sinon faire imposable = 0 ; finsi finsi /* Sorties */ if (imposable == 0) { printf("\nVous n'êtes pas imposable.\n"); } else { printf("\nVous êtes imposable.\n"); } si imposable = 0 faire écrire “ Vous n’êtes pas imposable. ” sinon faire écrire “ Vous êtes imposable. ” finsi return 0; } Remarque : donner dans la question posée une indication sur le type de réponse attendue. → si votre code est conçu pour tester ‘h’ ou ‘f’ alors que l’opérateur répond ‘masculin’ ou ‘féminin’, l’exécution du code donnera des résultats aberrants. Exercice 16 : L’énoncé indique clairement que les valeurs ne doivent pas être stockées en mémoire. Il ne s’agit donc pas de créer un tableau qui sera rempli au fur et à mesure des valeurs données par l’opérateur. Il faut envisager une variable courante dont la valeur sera remplacée à chaque nouvelle entrée de l’opérateur. Il n’est donc pas possible de respecter ici la règle de séparation des entrées / traitements / sorties, puisque l’analyse des valeurs entrées se fera au fil de l’eau. Pour initialiser les variables min et max, il faut détailler une première fois le traitement, puis automatiser dès la deuxième valeur avec une boucle tant que. La sortie de la boucle tant que se fait grâce à l’entrée d’une valeur négative par l’opérateur. Pseudo-code : Code en C : #include <stdio.h> entier min, max, n ; écrire “ Entrez votre première valeur : ” ; lire n ; int main(void) { /* Entrées et traitements. */ int min, max, n; printf ("\nEntrez votre première valeur :"); scanf ("%d", &n); min ← n ; max ← n ; min = n; max = n; tant que n ≥ 0 faire si min > n faire min ← n ; finsi si max < n faire max ← n ; finsi écrire “ Entrez une nouvelle valeur : ” lire n ; finsi while (n >=0) { if (min > n) { min = n; } if (max < n) { max = n; } printf("\nEntrez une nouvelle valeur :"); scanf ("%d", &n); } écrire “ Le minimum vaut ” min “ , le maximum vaut ” max ; /* Sorties */ printf("\nLe minimum vaut %d, le maximum vaut %d.\n", min, max); return 0; } Remarque : Dans la boucle tant que, si le test est fait avant de remplacer les valeurs min et max, la valeur min sera remplacée dans le dernier parcours de boucle par la valeur négative servant à clore la série. Il faut donc remplacer les éventuels min et max, puis demander la nouvelle valeur. Si la nouvelle valeur est négative, la boucle ne sera pas parcourue à nouveau. Exercice 16 – complément : On demande également l’affichage de la position des valeurs min et max. Pseudo-code : Code en C : #include <stdio.h> entier min, max, position_min, position_max, n, indice_boucle ; écrire “ Entrez votre première valeur : ” ; lire n ; int main(void) { /* Entrées et traitements. */ int min, max, position_min, position_max, n, indice_boucle; printf ("\nEntrez votre première valeur :"); scanf ("%d", &n); min ← n ; position_min ← 1 ; max ← n ; position_max ← 1 ; indice_boucle ← 1 ; min = n; position_min = 1; max = n; position_max = 1; indice_boucle = 1; tant que n ≥ 0 faire si min > n faire min ← n ; position_min ← indice_boucle ; finsi si max < n faire max ← n ; position_max ← indice_boucle ; finsi écrire “ Entrez une nouvelle valeur : ” lire n ; indice_boucle = indice_boucle + 1 ; finsi while (n >=0) { if (min > n) { min = n; position_min = indice_boucle; } if (max < n) { max = n; position_max = indice_boucle; } printf("\nEntrez une nouvelle valeur :"); scanf ("%d", &n); indice_boucle++; } écrire “ Le minimum vaut ” min “ (en position ” position_min “, le maximum vaut ” max “ en position ” position_max “ )” ; /* Sorties */ printf("\nLe minimum vaut %d (en position %d), le maximum vaut %d (en position %d).\n", min, position_min, max, position_max); return 0; }
© Copyright 2025 ExpyDoc