EFM - Langage C - 2014-2015
Partie I : Théorique (11 pts)
- C’est quoi le rôle d’un compilateur ? (2 pts)
- Quelle est la différence entre le passage de paramètres d’une fonction par adresse et le passage de paramètres par valeur ? donner un exemple. (3 pts)
- Citer quatre fonctions de la bibliothèque h. (2 pts)
- Que sera le résultat d’exécution des programmes suivants : (4 pts)
Partie II : Pratique (29 pts)
Exercice 1 : (5 pts)
On considère la suite numérique définie par :
U1 = 1
U2 = 2 et
Un = 2 (Un-1 + Un-2) (pour n>2)
- Ecrire une fonction qui retourne, le nième terme de cette suite ; (3 pts)
- Ecrire un programme qui calcule et affiche les termes, de cette suite, inférieurs ou égaux à un entier entré par l’utilisateur ; ainsi que leur somme. (2 pts)
Exercice 2 : (24 pts)
On souhaite créer un programme en langage C permettant de gérer les articles dans un stock informatique. Un Article est caractérisé par les champs code (entier), nom et prixUnitaire.
- Définir la structure (2 pts)
- Créer une procédure void lireArticle (Article articles [], int n) permettant de remplir un tableau de n articles. (3 pts)
- Créer une procédure void afficherArticle (Article articles [], int n) permettant d’afficher la liste des articles stockés dans le tableau articles. (2 pts)
- Créer une procédure void supprimerArticle (Article articles [], int * n, int code) permettant de supprimer un article stockés dans le tableau articles en fournissant son code. (3 pts)
- Créer une procédure void ajouterArticle (Article articles [], int *n) permettant d’ajouter un article dans le tableau articles. (2 pts)
- Créer une procédure void triByNom (Article articles [], int n) permettant d’afficher les articles classés par ordre alphabétique des noms. (2 pts)
- Créer une procédure void triByPrix (Article articles [], int n) permettant d'afficher la liste des articles classés du plus cher au moins cher. (2 pts)
- Créer une procédure void saveArtciles (Article articles [], int n) permettant d’enregistrer les articles dans un fichier texte, les valeurs des champs de chaque article seront séparées par « ; ». (3 pts)
- Ecrire un algorithme qui affiche à l’utilisateur le menu suivant : (5 pts)
1: Lire les articles. 2: Afficher les articles classés par ordre alphabétique des noms. 3: Afficher les articles classés du plus cher au moins cher. 4: Ajouter un nouvel article.
5: Supprimer un article. 6: Enregistrer les articles.
7: Quitter le programme.
Tapez votre choix :
et réalise l’opération demandée par l’utilisateur en utilisant les fonctions définies précédemment.
Partie I : Théorique (11 pts)
- Un compilateur permet de :
- Vérifier la syntaxe du programme.
- Traduire le programme en langage machine.
- Quelle est la différence entre le passage de paramètres d’une fonction par adresse et le passage de paramètres par valeur ? donner un exemple :
- Dans le passage par valeur : la fonction utilise une copie des paramètres effectifs. Après appel de la fonction les paramètres effectifs gardent leurs valeurs initiales.
- Dans le passage par adresse : la fonction utilise les adresses des paramètres effectifs. Alors ces paramètres peuvent changer après appel de la fonction
- Exemple : Fonction Permuter
- Citer quatre fonctions de la bibliothèque string.h :
- strlen : renvoie la longueur d’une chaine
- strcpy : copie une chaine dans une autre
- strcmp : compare deux chaines
- strcat : concatène deux chaines
- Que sera le résultat d’exécution des programmes suivants :
- Programme 1 :
int i = 10; for(i = 0;i < 10; i++) printf("%d\n", i);
Résultat d’exécution :0
1
2
3
4
5
6
7
8
9 - Programme 2 :
int i = 0;
while(i < 10);
i++;
printf("%d\n", i);Résultat d’exécution :Boucle infinie!!
Notes- Notez bien la présence d'un point-virgule à la fin des parenthèses de la boucle while, ce qui produira une boucle infinie puisque i sera toujours inférieur à 10.
- Sans le point-virgule, ce programme affichera le nombre 10.
- Programme 3 :
int i = 0, j = 10;
do{
printf("%d\n", i);
i++;
j = i + j;
}while((i < 10) && (j <20));Résultat d’exécution :0
1
2
3 - Programme 4 :
int i = 1;
switch(i){
case 0 : puts("0");
case 1 : puts("1");
case 2 : puts("2");
default : puts("Good By");
}Résultat d’exécution :1
2
Good ByNoteNotez bien l'absence de l'instruction break donc ce programme ne s’arrêtera pas dans le case 1.
Partie II : Pratique (29 pts)
Exercice 1 : (5 pts)
//Auteur: IDMANSOUR //Copyright: Exelib.net #include<stdio.h> int suite(int n){ if(n == 1 || n == 2) return 1; return 2 * (suite(n-1) + suite(n-2)); } main(){ int nb, i, t, s = 0; printf("Entrer le nombre de termes: "); scanf("%d", &nb); for(i = 1; i <= nb ; i++){ t = suite(i); printf("U(%d) = %d\n", i, t); s = s + t; } printf("\nLa somme des termes : %d", s); }
Entrer le nombre de termes: 5
U(1) = 1
U(2) = 1
U(3) = 4
U(4) = 10
U(5) = 28
La somme des termes : 44
Exercice 2 : (24 pts)
//Auteur: IDMANSOUR //Copyright: Exelib.net #include<stdio.h> #include<string.h> //Question 1 : Définition de la structure Article typedef struct { int code; char nom[20]; float prix; } Article; //Question 2 : Lecture des articles void lireArticle (Article articles [], int n) { int i; for(i=0; i<n; i++){ printf("Article %d : \n", i+1); printf("Entrer le code : "); scanf("%d", &articles[i].code); printf("Entrer le nom : "); scanf("%s", articles[i].nom); printf("Entrer le prix : "); scanf("%f", &articles[i].prix); } } //Question 3 : Affichage de la liste des articles void afficherArticle (Article articles [], int n) { int i; for(i=0; i<n; i++){ printf("Article %d : \n", i+1); printf("Code : %d | ", articles[i].code); printf("Nom : %s | ", articles[i].nom); printf("Prix : %.2f\n\n", articles[i].prix); } } //Question 4 : Suppression d'un article void supprimerArticle (Article articles [], int * n, int code) { int i, j; //On suppose si le code est unique for(i=0; i<*n; i++){ if(articles[i].code == code){ for(j=i; j<(*n)-1; j++){ articles[j] = articles[j+1]; } (*n)--; //i--; si le code n'est pas unique } } } //Question 5 : Ajout d'un article à la fin de la liste void ajouterArticle (Article articles [], int *n){ //Ajout a la fin? printf("Entrer le code : "); scanf("%d", &articles[*n].code); printf("Entrer le nom : "); scanf("%s", articles[*n].nom); printf("Entrer le prix : "); scanf("%f", &articles[*n].prix); (*n)++; } //Question 6 : Tri de la liste des articles par ordre (Croissant) alphabétique des noms void triByNom (Article articles [], int n){ int i, j; Article a; for(i=0; i<n; i++){ for(j=i;j<n;j++){ if(strcmp(articles[i].nom , articles[j].nom) == 1) { a = articles[i]; articles[i] = articles[j]; articles[j] = a; } } } puts("Liste des articles tries par nom:"); afficherArticle(articles, n); } //Question 7 : Tri de la liste des articles du plus cher au moins cher (par ordre décroissant de prix) void triByPrix (Article articles [], int n){ int i, j; Article a; for(i=0; i<n; i++){ for(j=i;j<n;j++){ if(articles[i].prix < articles[j].prix) { a = articles[i]; articles[i] = articles[j]; articles[j] = a; } } } puts("Liste des articles tries par prix:"); afficherArticle(articles, n); } //Question 8 : Sauvegrade de la liste des articles dans un fichier texte void saveArtciles (Article articles [], int n){ FILE *f; int i; f = fopen("articles.txt", "w"); if(!f){ printf("Erreur de creation du fichier!"); return; } for(i=0; i<n; i++){ fprintf(f, "%d;%s;%.2f\n", articles[i].code, articles[i].nom, articles[i].prix); } fclose(f); } //Question 9 : Programme de test main(){ //Article t[30] = {{1, "dsw", 300}, {2, "xue", 30}, {3, "adf", 380}}, * a; Article t[30], * a; int n, choix, code; do{ //Menu puts("-------------Menu-------------"); puts("1: Lire les articles."); puts("2: Afficher les articles classés par ordre alphabétique des noms."); puts("3: Afficher les articles classés du plus cher au moins cher."); puts("4: Ajouter un nouvel article."); puts("5: Supprimer un article."); puts("6: Enregistrer les articles."); puts("7: Quitter le programme."); puts("Tapez votre choix :"); scanf("%d", &choix); switch(choix){ case 1: printf("Donner le nombre d'articles: "); scanf("%d", &n); lireArticle(t, n); break; case 2: triByNom(t,n); break; case 3: triByPrix(t,n); break; case 4: ajouterArticle(t, &n); break; case 5: printf("Entrer le code de l'article a supprime: "); scanf("%d", &code); supprimerArticle(t, &n, code); printf("Liste des articles apres suppression de l'article %d : \n", code); afficherArticle(t, n); break; case 6: saveArtciles(t, n); printf("Liste sauvegardee dans le fichier articles.txt\n"); break; case 7: printf("Fin du programme\n"); break; default: printf("Choix invalid!\n"); } }while(choix != 7); }
Dans cette solution on suppose que l'utilisateur commencera toujours par le choix 1. Sinon il faut initialiser n par 0 et contrôler sa valeur après chaque choix.
Nom | Taille | Clics | Téléchargements |
Examen de Fin de Module - LPS - Session Janvier 2015 | 230.21 Ko | 4917 | Télécharger |