Correction TP2 LS1 UEO11 2007-2008
I] Conseils pratiques
Rappel de mes coordonnées : PEROUMALNAÏK M.
mail : [email protected]
page-perso : http://grimaag.univ-ag.fr/~mperouma/
Les corrections proposées sont des propositions de correction : vous aussi pouvez trouvez autre chose qui peut potentiellement fonctionner.
Partant de là, c'est à vous de fournir un algortihme structuré et un code propre pour étayer la justesse de votre proposition.
II] Exercice 2 : Notion de variable
1 - Intitulé
Exercice : Ecrire un programme permettant de permuter deux valeurs entières. Réalisez un affichage avant et après permutation.
2 – Correction
Dans l'énoncé, on distingue clairement deux actions : 1. permuter deux valeurs entières
2. affichage avant et après permutation.
Dans le cadre de cette correction, on choisit de permettre à l'utilisateur de rentrer les valeurs entières à permuter.
On arrive donc à la suite d'actions élémentaires suivantes :
1. Demander à l'utilisateur de rentrer deux valeurs entières 2. Saisir les valeurs
3. Afficher les valeurs avant permutation
4. Permuter les valeurs
5. Afficher les valeurs après permutation.
Pour permuter ces valeurs, on choisit d'utiliser une variable permettant de stocker temporairement la valeur d'une variable.
Considérons la variable comme un conteneur : il va falloir échanger le contenu de deux conteneurs sans perdre aucune donnée.
Dans l'exemple suivant, on va avoir à gauche les opérations réalisées en mémoire puis à droite l'algo, en considérant a, b et c.
Permutons le contenu de a et de b en utilisant c comme variable temporaire:
En machine Lignes d'algo associées
A B C
<!> Pas d'algo pour cette ligne <!>
Initialisation A B C
C ← A
A B C
A ← B
A B C
B ← C
Donc au final, une proposition d'algorithme et une proposition de code:
Algorithme : permut_var Entrées
Sorties Constantes Variables
a, b, c : entier
Début
Ecrire('Saisissez deux valeurs entières ') Ecrire('Valeur n°1 ? ')
Lire(a)
Ecrire('Valeur n°2 ? ') Lire(b)
Ecrire('Valeurs entrées : var1=',a,' var2=',b) c ← a
a ← b b ← c
Ecrire('Valeurs entrées : var1=',a,' var2=',b) Fin
Le code correspondant :
N° Fic hier e xo2.c : P roposition de co rrection
1 #include<stdio.h> //Inclusion de la librairie standard STDIO 2
3 /* Exercice 2 : Permutation de variables */
4
5 //MAIN 6 main() 7 {
8 /* Déclaration */
9 int a, b, c;
10
11 /* Action */
12 //Demander à l'utilisateur de rentrer les valeurs 13 printf(''Saisissez deux valeurs entières: \n'');
14 printf(''Valeur a : '');
15 scanf(''%d'', &a);
16 printf(''Valeur b : '');
17 scanf(''%d'', &b);
18 //Affichage avant permutation
19 printf(''Valeurs saisies a : %d, b : %d. \n'',a,b);
20 //Permutation 21 c = a;
22 a = b;
N° Fic hier e xo2.c : P roposition de co rrection 23 b = c;
24 //Affichage après permutation
25 printf(''Valeurs saisies a : %d, b : %d. \n'',a,b);
26 }
III] Exercice n°3 : Lecture au clavier
1 – Intitulé
Exercice : Le but de cet exercice est de comprendre le fonctionnement de la fonction scanf, fonction permettant à l'utilisateur de saisir des données.
Pour plus d'informations (entête de la fonction, formats,...) tapez dans un shell
man scanf
Considérons une voiture qui parcourt une distance donnée. Ecrivez un programme permettant à l'utilisateur, en fonction de la durée du trajet (en secondes) et de la longueur de ce trajet (en mètres) de donner à l'utilisateur la vitesse moyenne de cette voiture.
2 – Correction
L'énoncé de l'exercice nous propose de calculer et d'afficher la vitesse d'un véhicule dont la distance et la durée du trajet sont saisis au clavier par l'utilisateur.
On choisit donc d'effectuer la liste d'actions élémentaires suivantes :
1. Demander à l'utilisateur de saisir la longueur du trajet parcouru par le véhicule (en m) et la durée de ce trajet
2. Lire ces valeurs
3. Afficher ces valeurs (facultatif : affichage de contrôle) 4. Calculer la vitesse (vitesse = distance /temps)
5. Afficher le résultat
Tout d'abord l'algorithme :
Algorithme : calcul_vitesse Entrées
d, t : entiers // d:distance t:temps Sorties
v : réel // v: vitesse Constantes
Variables Début
Ecrire('Saisissez la distance et le temps ') Ecrire('Entrez la distance en m : ')
Lire(d)
Ecrire('Entrez le temps en secondes :') Lire(t)
Ecrire('distance :',t,'m, temps :',b,'sec') v ← d/t
Ecrire('La vitesse est de : ',v,' m/s') Fin
On peut en déduire le code en C suivant :
N° Fic hier e xo3.c : P roposition de co rrection
1 #include<stdio.h> //Inclusion de la librairie standard STDIO 2
3 /* Exercice 3 : Calcul de vitesse */
4
5 //MAIN 6 main() 7 {
8 /* Déclarations */
9 int d,t;
10 float v;
11 /* Action */
12 //Demander à l'utilisateur de rentrer la dist et le temps
N° Fic hier e xo3.c : P roposition de co rrection 13 printf(''Saisissez la distance et le temps: \n'');
14 printf(''Entrez la distance en m : \n'');
15 scanf(''%d'', &d);
16 printf(''Entrez le temps en sec : \n'');
17 scanf(''%d'', &t);
18 //Affichage de contrôle
19 printf(''distance : %d m, temps : %d sec\n'',d,t);
20 //Calcul de la vitesse 21 v=d/t;
22 //Affichage %0.2f => 2chiffres après la virgule 23 printf(''La vitesse est de %0.2f m/s. \n'',v);
24 }
IV] Exercice n°4 : Structure conditionelle if
1 – Intitulé
Exercice :
Ecrire un programme affichant la moyenne de cinq nombres entiers entrés au clavier par l'utilisateur. L'on affichera séparément la moyenne des nombres négatifs et la moyenne des nombres positifs entrés.
2 – Correction
Tout d'abord, pour calculer la moyenne d'un groupe d'éléments quelconque, il nous faut deux données : la somme de ces éléments ainsi que le nombre d'éléments considérés.
De ce fait, suivant que le nombre saisi soit positif ou non (on va, pour la suite de cet exercice, considérer 0 comme un nombre positif.), nous devrons l'ajouter à la somme existante de nombres positifs et recenser cette occurrence.
Nous venons donc de mettre en évidence le traitement à appliquer pour une saisie donnée :
– Déterminer le signe du nombre
– Si le nombre est positif ou nul, l'ajouter à la somme des nombres positifs et incrémenter le compteur de nombres positifs.
– Sinon, l'ajouter à la somme des nombres négatifs et incrémenter le
compteur de nombres négatifs.
Clairement ici, nous avons un traitement générique à appliquer plusieurs fois : nous sommes typiquement dans le cas d'utilisation idéal d'une boucle.
Le nombre d'itérations étant connu (5), nous pouvons légitimement utiliser une boucle Pour.
On peut donc déduire l'algorithme suivant:
Algorithme : moy_posneg Entrées
n : entier // entier saisi Sorties
mpos, mneg : réel // moyennes Constantes
Variables
i : entier
nbpos, nbneg :entier Début
nbpos ← 0 nbneg 0 ← mpos 0 ← mneg 0 ←
Pour i allant de 1 à 5 faire Début
Ecrire('Saisissez la valeur n° ',i) Lire(n)
Si (n < 0) alors Début
mneg mneg + n ← nbneg nbneg + 1 ← Fin
Sinon Début
mpos mpos + n ← nbpos nbpos + 1 ← Fin
FinSi Fin
FinPour
Si (nbpos > 0) alors
Ecrire('Moyenne nb pos :', mpos/nbpos) FinSi
Si (nbneg > 0) alors
Ecrire('Moyenne nb neg :', mpos/nbneg) FinSi
Fin
Avant de passer au code C, quelques remarques sur l'algorithme.
Vous remarquerez que je ne stocke pas le calcul de la moyenne. La raison de ceci est que ce calcul de moyenne n'est pas systématique.
En effet, si l'on prend le cas (par exemple) où l'utilisateur n'a entré que des nombres positifs : sans la condition finale, l'on se retrouverait à faire une division par zéro, ce qui est mathématiquement impossible.
De cet algorithme découle la proposition de code C suivante :
N° Fic hier e xo4.c : P roposition de co rrection
1 #include<stdio.h> //Inclusion de la librairie standard STDIO 2
3 // Exercice 4 : Moyenne de nombres entiers négatifs et positifs 4
5 //MAIN 6 main() 7 {
8 /* Déclarations */
9 int nombre=0,i,nb_pos=0, nb_neg=0 ; 10 float moy_pos=0, moy_neg=0;
11 /* Action */
12 /* Début de la boucle de saisie */
13 for(i=1; i<6; i++) 14 {
15 printf(''Saisissez la valeur n°%d : \n'',i);
16 scanf(''%d'', &nombre);
17 //Suivant le signe du nombre 18 if(nombre >= 0)
19 { nb_pos=nb_pos+1;
N° Fic hier e xo4.c : P roposition de co rrection 20 moy_pos = moy_pos+nombre;}
21 else
22 { nb_neg=nb_neg+1;
23 moy_neg = moy_neg+nombre}
24 }
25 if(nb_pos>0)
26 printf(''La moyenne des nombres positifs saisis est: %f :
\n'',nb_pos);
27 if(nb_pos>0)
28 printf(''La moyenne des nombres positifs saisis est: %f :
\n'',nb_pos);
29 }