Informatique et Programmation Examen N°1
6 mars 2006 18h-20h
Nom : Prénom :
Nom de la machine : Répertoire de travail : Remarques :
Exercice 1 :
Expliquer ce que fait le programme codechar.c fourni en annexe. Illustrer votre propos avec un exemple.
Exercice 2 :
Le programme div2.c fourni en annexe est destiné à effectuer la division entière de 2 entiers (dividende et diviseur). Ce programme contient plusieurs erreurs de syntaxe et de conception. Identifier ces erreurs et proposer pour chacune une correction.
Exercice 3 :
1) Ecrire un programme tva.c qui demande le montant HT d'un produit et le taux TVA (en pourcentage (19.6 par exemple)) à appliquer et affiche le montant TTC.
Rappel : Montant TTC = Montant HT x (1+ Taux TVA)
A l'issue de cette première question, sauvegarder le fichier tva.c sous le nom tva1.c.
2) Modifier le programme tva.c pour qu'il affiche le montant TTC arrondi au centime le plus proche. Cet arrondi devra être réalisé au moyen d'une fonction nommée "arrondi".
Sauvegarder la nouvelle version du fichier tva.c sous le nom tva2.c.
3) Modifier le programme tva.c pour qu'il demande à la fois les montants HT et TTC et qu'il affiche le Taux TVA avec seulement 1 chiffre après la virgule. On veillera à traiter
correctement le cas où le montant HT est nul.
Sauvegarder la nouvelle version du fichier tva.c sous le nom tva3.c.
4) Modifier le programme pour que si l'un des deux montants est nul, le programme demande à l'utilisateur le taux TVA et affiche dans tous les cas : le montant HT, le taux TVA (en pourcentage avec si possible le caractère " %"), le montant TVA, le montant TTC. Le cas
où les deux montants (HT et TTC) fourni par l'utilisateur sont nuls devra être traité correctement (affichage du message "Impossible de déterminer le Taux TVA" par exemple).
Annexe
/*************************************
Programme codecar.c
*************************************/
#include <stdio.h>
#include <stdlib.h>
#define DIM 20
int main() {
char ligne[DIM];
int i;
printf("Entrez une ligne de caracteres :\n\n");
for(i=0; i<DIM; ++i) { ligne[i]=getchar();
if(ligne[i]=='\n') break;
}
printf("\nVoici le resultat :\n\n");
for(i=i-1; i>=0; --i) { printf("%c",ligne[i]);
}
printf("\n\n");
}
/*************************************
Programme div2.c
*************************************/
#include <stdio.h>
#include <stdlib.h>
void divint(int dividende, int diviseur, int quotient, int *reste);
int main() {
int dividende,diviseur,quotient,reste,status;
do {
printf("Entrez le dividende et le diviseur : ");
status=scanf("%d %d", ÷nde, &diviseur);
} while( status != 0 )
divint(dividende,diviseur, quotient, &reste);
printf("Le quotient est : %d\n","ient);
printf("Le reste est : %d\n",&reste);
void divint(int dividende, int diviseur, int quotient, int *reste) { quotient = dividende / diviseur;
*reste = dividende - quotient * diviseur;
}
Correction
Exercice 1 :
Le programme codecar.c lit une ligne de caractères saisie au clavier. Les caractères sont placés dans un tableau de 20 cases. La lecture s'arrête lors de la détection du caractère de fin de ligne '\n' ou lorsque le tableau est plein. Dans une seconde phase, le programme imprime les différents caractères dans l'ordre inverse.
Exemple : la saisie de "Il fait beau" produit : "uaeb tiaf lI"
Exercice 2 :
Voici le programme corrigé. Les morceaux de code corrigés sont soulignés.
/*************************************
Programme div2.c
*************************************/
#include <stdio.h>
#include <stdlib.h>
void divint(int dividende, int diviseur, int *quotient, int *reste);
int main() {
int dividende,diviseur,quotient,reste,status;
do {
printf("Entrez le dividende et le diviseur : ");
status=scanf("%d %d",÷nde,&diviseur);
} while(status!=2);
divint(dividende,diviseur, "ient, &reste);
printf("Le quotient est : %d\n", quotient);
printf("Le reste est : %d\n", reste);
}
void divint(int dividende, int diviseur, int *quotient, int *reste) { *quotient = dividende / diviseur;
*reste = dividende - *quotient * diviseur;
}
Exercice 3 :
Voici le programme tva.c final :
/*************************************
Programme tva.c
*************************************/
#include <stdio.h>
#include <math.h>
float arrondi(float montant,int NbDecimales) { int i,rapport=1;
float retval;
// calcul de 10^NbDecimales
for(i=0; i<NbDecimales; ++i) rapport=rapport*10; //
// Arrondi grace à l'ajout de 0.5
int NbUnites=(int)(montant*rapport+0.5);
// calcul de la valeur flottante arrondie retval=(float)NbUnites/rapport;
//printf("%f -> %f\n",montant,retval);
return retval;
}
void saisie(float *valeur,int NbDecimales) { while(scanf("%f",valeur)!=1) {
printf("Saisie incorrecte ! Recommencez : \n");
fflush(stdin);
}
*valeur=arrondi(*valeur,NbDecimales);
}
int main() {
float montantHT, montantTVA, montantTTC, tauxTVA;
printf("Entrez un montant HT : "); saisie(&montantHT,2);
printf("Entrez un montant TTC : "); saisie(&montantTTC,2);
if(montantHT==0 && montantTTC==0) {
printf("\nImpossible de determiner le Taux TVA !\n");
return 0;
} else if(montantHT!=0 && montantTTC!=0) { if(montantTTC<montantHT) {
printf("\nLe montant TTC doit etre superieur ou egal au montant HT !\n");
return 0;
}
tauxTVA=arrondi(100*((montantTTC/montantHT)-1),1);
} else {
printf("Entrez le taux TVA (%%) : "); saisie(&tauxTVA,1);
if(montantTTC==0) {
montantTTC=arrondi(montantHT*(1+tauxTVA/100),2);
} else { // montantHT==0
montantHT=arrondi(montantTTC/(1+tauxTVA/100),2);
} }
montantTVA=montantTTC-montantHT;
printf("\n");
printf("Montant HT : %8.2f\n",montantHT);
printf("Taux TVA (%%) : %8.2f\n",tauxTVA);
printf("Montant TVA : %8.2f\n",montantTVA);
printf("Montant TTC : %8.2f\n",montantTTC);
return 0;
}