Les sous-programmes : exercices résolus en C Corrigé



Documents pareils
Projet CORBA : gestion de supermarchés

Les arbres binaires de recherche

Bases de programmation. Cours 5. Structurer les données

Les structures. Chapitre 3

Chapitre 1 : La gestion dynamique de la mémoire

Les structures de données. Rajae El Ouazzani

Utilisation d objets : String et ArrayList

Cours d initiation à la programmation en C++ Johann Cuenin

Chap III : Les tableaux

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Compression de Données - Algorithme de Huffman Document de Conception

Conventions d écriture et outils de mise au point

PROJET 1 : BASE DE DONNÉES REPARTIES

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Le prototype de la fonction main()

FOCUS Evolution. Lisez-Moi. Version FE 7.0.t

I. Introduction aux fonctions : les fonctions standards

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

les Formulaires / Sous-Formulaires Présentation Créer un formulaire à partir d une table...3

Travaux Dirigés n 1 : chaînes de caractères

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

1 Année LMD-STSM Algorithmique et Programmation. Série de TD 2

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Algorithmique et programmation : les bases (VBA) Corrigé

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

AURELIE Gestion Commerciale Mode d emploi pour comptabilité

V- Manipulations de nombres en binaire

Programmation C. Apprendre à développer des programmes simples dans le langage C

GUIDE DE PRISE EN MAIN

Feuille TD n 1 Exercices d algorithmique éléments de correction

Cours 1: Java et les objets

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Chapitre 10. Les interfaces Comparable et Comparator 1

Cahier des charges Remontée des ventes

Facturation / Trains de facture INTRODUCTION. On peut accéder à la gestion des trains de facture de deux manières : Via les menus classiques

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.


Les chaînes de caractères

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

CEGID - Business Suite Gestion commerciale

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

COMPTABILITE SAGE LIGNE 100

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Baccalauréat L spécialité, Métropole et Réunion, 19 juin 2009 Corrigé.

TP2 : tableaux dynamiques et listes chaînées

Représentation d un entier en base b

3IS - Système d'exploitation linux - Programmation système

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

L import : Mise à jour rapide de votre catalogue

Exercices sur les interfaces

UE Programmation Impérative Licence 2ème Année

Génération de scripts automatiques pour la sécurité des cartes bancaires nouvelle génération (EMV)

Premiers Pas en Programmation Objet : les Classes et les Objets

CMS Modules Dynamiques - Manuel Utilisateur

Chapitre 07 Le modèle relationnel des données

Chapitre 1 : Introduction aux bases de données

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

TD3: tableaux avancées, première classe et chaînes

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Architecture des ordinateurs

Cours 6 : Tubes anonymes et nommés

NETWORK & SOFTWARE ENGINEERING MANUEL D UTILISATEUR. Logiciel TIJARA. NETWORK AND SOFTWARE ENGINEERING Manuel d'utilisateur "TIJARA" 1

Guide d utilisation des fichiers bonus accompagnant le guide «L Argent est une science exacte»

SOFI Gestion+ Version 5.4. Echanges de données informatiques Spicers Sofi gestion+ Groupements. SOFI Informatique. Actualisé le

Excel avancé. Frédéric Gava (MCF)

Mail2SMS. Envoyer facilement vos SMS depuis un . Version : Revision : 12/12/2011. Page 1/8

Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin Algorithmique 1

Poker. A rendre pour le 25 avril

Introduction à la programmation concurrente

Initiation. àl algorithmique et à la programmation. en C

SUPPORT DE COURS. Langage C

DovAdis. Objet Rapprochement bancaire Métier Gérance. Siège social SPI 1, rond-point du Flotis Bât IV St Jean

Programmation Objet Java Correction

Les pourcentages. Un pourcentage est défini par un rapport dont le dénominateur est 100. Ce rapport appelé taux de pourcentage est noté t.

Gestion des bases de données (2 e partie)

Exo7. Calculs de déterminants. Fiche corrigée par Arnaud Bodin. Exercice 1 Calculer les déterminants des matrices suivantes : Exercice 2.

et Programmation Objet

Programme Compte bancaire (code)

Algorithmique, Structures de données et langage C

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Introduction à l héritage en C++

Licence Sciences et Technologies Examen janvier 2010

COURS WINDEV NUMERO 3

La question est : dans 450 combien de fois 23. L opération est donc la division. Le diviseur. Le quotient

, accessible depuis l application ITOOL Comptabilité est un module complémentaire permettant la dématérialisation de vos factures d achats.

GENERALITES Sélection du fichier... 7 TRANSFERT DES ECRITURES... 8

GESTION WINPRO ** PRISE EN MAIN RAPIDE **

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Assurance Qualité. Cours de génie logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 23/04/2007

Chapitre 2. Classes et objets

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Cours de C. Allocation dynamique. Sébastien Paumier

FACTURATION. Menu. Fonctionnement. Allez dans le menu «Gestion» puis «Facturation» 1 Descriptif du dossier (onglet Facturation)

Transcription:

PAD INPT ALGORITHMIQUE ET PROGRAMMATION 1 Exercices résolus en C, Semaine 3 avril mai 2013 Corrigé Objectifs Savoir écrire des sous-programmes ; Comprendre les modes de passage de paramètres ; Faire la différence entre fonction et procédure ; Continuer à appliquer les principes des semaines 1 & 2. Exercice 1 : Notion de produit......................................................... 1 Exercice 2 : Notion de ligne de facture................................................. 2 Exercice 3 : Notion de facture......................................................... 4 Exercice 4 : Programme de test........................................................ 6 1 Édition simplifiée d une facture L objectif de ces exercices est de réaliser l édition d une facture dans une version relativement simplifiée puisqu il s agit de pouvoir ajouter et/ou supprimer des lignes sur une facture et de l éditer à l écran. Nous ne traiterons pas l interface homme/machine (IHM) et nous nous contenterons donc de développer les types et sous-programmes qui constituent ce modèle. Exercice 1 : Notion de produit Commençons par définir le type Produit et les opérations associées. 1.1 Écrire le type Produit sachant qu un produit est caractérisé par un code (sur 3 caractères), un libellé (9 caractères) et un prix hors taxe. Solution : Le type Produit est un enregistrement composé de trois champs un code de type chaîne de 3 caractères, un libellé (chaîne de 9 caractères) et un prix hors taxe (Réel). 1 #define LG_CODE 3 /* longueur maximale d un code */ 2 #define LG_LIBELLE 9 /* longueur maximale d un libellé */ 3 4 typedef char Code[LG_CODE+1]; 5 typedef char Libelle[LG_LIBELLE+1]; 6 7 struct Produit { 8 Code code; 9 Libelle libelle; 10 double prix_ht; 11 }; Exercices résolus en C, Semaine 3 c INPT PAD 1/7

13 typedef struct Produit Produit; 1.2 Écrire un sous-programme pour initialiser un produit à partir de son code, son libellé et son prix hors taxe. Solution : Le but du sous-programme est «initialiser un produit à partir de son code, son libellé, et son prix hors taxe». Les paramètres sont donc : le produit à initialiser : out ; le code du produit : in ; le libellé du produit : in ; le prix du produit : in. On constate qu il n y a qu un seul paramètre en sortie et tous les autres sont en entrée. Nous en faisons quand même une procédure car il s agit d un sous-programme d initialisation. Il est préférable dans ce cas que la mémoire soit fournie par le programme appelant (ceci évite par exemple de faire des copies inutiles lors du retour de la fonction). On peut donc en déduire la spécification. 1 Procédure initialiser_produit(p: out Produit) ; 2 c: in Code ; l: in Libellé ; prix_ht: in Réel) Est 3 -- Initialiser le produit p à partir de son code c, de son libellé l 4 -- et de son prix hors taxe. On peut maintenant en déduire le code. 1 Début 2 produit.code <- c 3 produit.libellé <- l 4 produit.prix_ht <- prix_ht 5 Fin 1 void initialiser_produit(produit *p, Code c, Libelle l, double prix_ht) 2 { 3 strncpy(p->code, c, LG_CODE); 4 p->code[lg_code] = \0 ; /* être sûr d avoir le zéro terminal */ 5 strncpy(p->libelle, l, LG_LIBELLE); 6 p->libelle[lg_libelle] = \0 ; /* être sûr d avoir le zéro terminal */ 7 p->prix_ht = prix_ht; 8 } En C, on ne peut pas faire directement l affectation des chaînes de caractères. Il faut en fait copier les caractères de l une dans l autre. Nous utilisons la fonction strncpy de string.h qui permet de tenir compte de la capacité de la chaîne destination. On force ensuite un caractère nul pour être sûr que la chaîne, même dans le cas où la copie a été tronquée, a le zéro final. Exercice 2 : Notion de ligne de facture Le type LigneFacture permet de représenter une ligne d une facture. Il est caractérisé par le produit concerné, la quantité commandée et le prix total hors taxe de la ligne. 2.1 Définir le type LigneFacture. Exercices résolus en C, Semaine 3 c INPT PAD 2/7

Solution : Le type LigneFacture est également un enregistrement. Notons la redondance entre le prix hors taxe de la ligne et des informations prix hors taxe d un produit et quantité commandée. 1 struct LigneFacture { 2 Produit produit; 3 int quantite; /* > 0 */ 4 double prix_ht; /* prix_ht = quantite * produit.prix_ht */ 5 }; 6 7 typedef struct LigneFacture LigneFacture; 2.2 Définir une opération qui permet d initialiser une ligne de facture à partir du produit concerné et de la quantité commandée. Le prix total hors taxe de la ligne peut être déduit de ces deux informations puisqu il correspond au prix hors taxe du produit multiplié par la quantité commandée. Solution : L initialisation d une ligne de facture est réalisée sur le même principe que le produit. 1 /* Initialiser une ligne de facture à partir du produit concerné et de 2 * la quantité commandée. 3 */ 4 void initialiser_ligne(lignefacture *ligne, Produit p, int quantite) 5 { 6 ligne->produit = p; 7 ligne->quantite = quantite; 8 ligne->prix_ht = p.prix_ht * quantite; 9 } 2.3 Écrire une opération qui affiche une ligne de facture. Les informations sont affichées de manière tabulée avec dans l ordre le code du produit, son libellé, son prix hors taxe, la quantité commandé, le prix total hors taxe et le prix total TTC. On supposera le taux de TVA constant et indépendant des produits. Voici un exemple de ligne affichée. 1 001 Truc 99.00 10 990.00 1184.04 Solution : Ce sous-programme réalise un affichage sur l écran. Il convient donc d en faire une procédure. Notons qu il n a qu un seul paramètre en entrée, la ligne de facture, ce qui nous aurait aussi conduit à en faire une procédure. 1 /* Afficher une ligne de facture. 2 */ 3 void afficher_ligne(lignefacture ligne) 4 { 5 double prix_ttc; 6 7 /* calculer le prix ttc */ 8 prix_ttc = ligne.prix_ht * (1 + TVA); 9 10 printf(" %3s %10s %7.2f %2d %7.2f %7.2f \n", 11 ligne.produit.code, ligne.produit.libelle, ligne.produit.prix_ht, ligne.quantite, ligne.prix_ht, prix_ttc); 13 } Exercices résolus en C, Semaine 3 c INPT PAD 3/7

Exercice 3 : Notion de facture Définissons enfin le type Facture. Une facture contient plusieurs lignes (20 au maximum). Elle est caractérisée par un numéro de facture. 3.1 Définir le type Facture. Solution : Le type Facture est un tableau de lignes de facture. On ne sait pas à priori combien il y aura de lignes mais on sait qu il y en a moins de 20. On peut donc prendre un tableau de capacité 20 et il faudra gérer la taille effective. Ces deux informations sont donc regroupées dans un enregistrement 1 #define NB_LIGNES 20 /* nombre maximal de lignes sur une facture */ 2 3 struct Facture { 4 int numero; 5 LigneFacture lignes[nb_lignes]; 6 int nb_lignes; /* nombre effectif de lignes sur la facture */ 7 }; 8 9 typedef struct Facture Facture; 3.2 Écrire une opération qui permet d initialiser une facture à partir de son numéro. Une telle facture est bien entendu vierge et ne contient donc aucune ligne. Solution : Ce sous-programme a un seul paramètre, la facture à initialiser. C est un paramètre en sortie. On fait donc une procédure. 1 /* Initialiser une facture. 2 * 3 * Assure 4 * une_facture.nb_lignes == 0 5 */ 6 void initialiser_facture(facture *une_facture, int son_numero) 7 { 8 une_facture->numero = son_numero; 9 une_facture->nb_lignes = 0; 10 11 assert(une_facture->nb_lignes == 0); } 3.3 Écrire un sous-programme qui permet de calculer le montant total hors taxe de la facture. Il s agit de faire la somme des totaux hors taxe des lignes de la facture. Solution : Ce sous-programme prend en paramètre une facture (entrée) et fournit le total hors taxe de la facture (sortie). Il y a donc un seul paramère en sortie, d autres qui sont tous en entrée. On en fait donc une fonction. 1 Fonction montant_total_ht_facture(une_facture: Facture): Réel Est 2 -- Le montant total hors taxe de la facture une_facture. 1 /* Déterminer le montant total HT d une facture */ 2 double montant_total_ht_facture(facture une_facture) 3 { 4 double resultat = 0; Exercices résolus en C, Semaine 3 c INPT PAD 4/7

5 int l; /* parcourir les lignes de la facture */ 6 for (l = 0; l < une_facture.nb_lignes; l++) { 7 resultat += une_facture.lignes[l].prix_ht; 8 } 9 return resultat; 10 } Notons qu en C, on a défini une variable locale resultat qui sert à accumuler le total des lignes. 3.4 Écrire un sous-programme pour ajouter une ligne à une facture, c est-à-dire un produit et la quantité commandée. Solution : Ce sous-programme prend en paramètre la facture à modifier (in out), le produit à ajouter (in) et la quantité commandée (in). On fait donc une procédure. Notons que pour l implantation de cette procédure, on peut utiliser l opération initialiser_ligne déjà définie. 1 /* Ajouter une ligne à une facture. 2 * Nécessite 3 * une_facture.nb_lignes < NB_LIGNES; 4 */ 5 void ajouter_ligne(facture *une_facture, Produit p, int quantite) 6 { 7 assert(une_facture->nb_lignes < NB_LIGNES); 8 initialiser_ligne(&une_facture->lignes[une_facture->nb_lignes], 9 p, quantite); 10 une_facture->nb_lignes++; 11 } 3.5 Écrire un sous-programme qui permet d éditer une facture. Il s agit d afficher un entête portant le numéro de la facture. Ensuite sont affichées toutes les lignes et enfin le total hors taxe et TTC de la facture. Voici un exemple d édition d une facture. 1 2 Édition de la facture 1 3 ------------------------------------------------------- 4 001 Truc 99.00 10 990.00 1184.04 5 020 Chose 15.00 2 30.00 35.88 6 163 Bidule 250.00 1 250.00 299.00 7 ------------------------------------------------------- 8 70.00 1518.92 Solution : Ce sous-programme prend un seul paramètre, la facture à éditer (in). Son objectif est de faire un affichage sur l écran (une sortie sur l écran). Nous en faisons donc une procédure. 1 /* Éditer à l écran la facture. 2 */ 3 void editer_facture(facture une_facture) 4 { 5 int l; /* parcourir les lignes de la facture */ 6 double total_ht; /* total ht de la facture */ 7 double total_ttc; /* total ttc de la facture */ Exercices résolus en C, Semaine 3 c INPT PAD 5/7

8 9 /* Calculer les totaux */ 10 total_ht = montant_total_ht_facture(une_facture); 11 total_ttc = total_ht * (1 + TVA); 13 /* Afficher l entête */ 14 printf("\n\n"); 15 printf("édition de la facture %d\n", une_facture.numero); 16 printf("-------------------------------------------------------\n"); 17 18 /* Afficher les lignes */ 19 for (l = 0; l < une_facture.nb_lignes; l++) { 20 afficher_ligne(une_facture.lignes[l]); 21 } 22 23 /* Afficher le total */ 24 printf("-------------------------------------------------------\n"); 25 printf("%33s %7.2f %7.2f \n", "", total_ht, total_ttc); 26 } 3.6 Écrire un sous-programme pour supprimer une ligne d une facture en fonction de son numéro. Bien sûr, la première ligne porte le numéro 1. Solution : Ce sous-programme a pour paramètres la facture à modifier (in out) et le numéro de la ligne à supprimer (in). On fait donc une procédure. 1 /* Supprimer une ligne de la facture. Le numéro n_ligne correspond à la ligne 2 * de la facture qu il faut supprimer. 3 * 4 * Nécessite 5 * 1 <= n_ligne && n_ligne <= une_facture->nb_lignes; 6 */ 7 void supprimer_ligne(facture *une_facture, int n_ligne) 8 { 9 int l; /* parcourir les lignes à décaler */ 10 11 assert(1 <= n_ligne && n_ligne <= une_facture->nb_lignes); 13 /* Décaler les lignes */ 14 for (l = n_ligne; l < une_facture->nb_lignes; l++) { 15 une_facture->lignes[l-1] = une_facture->lignes[l]; 16 } 17 une_facture->nb_lignes--; 18 } Exercice 4 : Programme de test Écrire un programme de test pour les types et opérations définis dans les exercices précédents. Remarque : Même si c est le dernier exercice, il est souhaitable (et nécessaire) de le faire en même temps que les autres, au fur et à mesure que les sous-programmes sont écrits. En effet, tester au fur et à mesure permet de tester de manière plus exhaustive (donc de détecter plus d erreurs), de localiser plus vite la cause de l erreur et donc de la corriger plus facilement. Solution : Exercices résolus en C, Semaine 3 c INPT PAD 6/7

1 /* Programme principal, en fait programme de test! 2 * Attention : ce programme de test n est absolument pas complet! 3 */ 4 int main() 5 { 6 Facture f1; 7 Produit p1, p2, p3; 8 9 initialiser_produit(&p1, "001", "Truc", 99); 10 initialiser_produit(&p2, "020", "Chose", 15); 11 initialiser_produit(&p3, "163", "Bidule", 250); 13 /* Création de la facture en ajoutant les lignes */ 14 initialiser_facture(&f1, 1); 15 editer_facture(f1); 16 ajouter_ligne(&f1, p1, 10); 17 editer_facture(f1); 18 ajouter_ligne(&f1, p2, 2); 19 editer_facture(f1); 20 ajouter_ligne(&f1, p3, 1); 21 editer_facture(f1); 22 23 /* Suppression de la deuxième ligne */ 24 supprimer_ligne(&f1, 2); 25 editer_facture(f1); 26 27 return EXIT_SUCCESS; 28 } Exercices résolus en C, Semaine 3 c INPT PAD 7/7