IN3T01 Programmation C TP 2 corrigé Jean-Claude Georges - Michel Landschoot



Documents pareils
Introduction au langage C

Java Licence Professionnelle CISII,

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

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.


Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Programme Compte bancaire (code)

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Recherche dans un tableau

Programmer en JAVA. par Tama

Claude Delannoy. 3 e édition C++

Algorithmique et Programmation, IMA

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

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

Plan du cours. Historique du langage Nouveautés de Java 7

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Programmation en langage C

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

INITIATION A LA PROGRAMMATION

Algorithmique I. Algorithmique I p.1/??

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

UE C avancé cours 1: introduction et révisions

Programmation C. J.-F. Lalande. 15 novembre 2012

Programmation système I Les entrées/sorties

Généralités sur le Langage Java et éléments syntaxiques.

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

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

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

I. Introduction aux fonctions : les fonctions standards

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

Les structures. Chapitre 3

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

as Architecture des Systèmes d Information

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Programmation C++ (débutant)/instructions for, while et do...while

Programmation en Java IUT GEII (MC-II1) 1

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

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

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

Java Licence Professionnelle CISII,

Programmation par les Objets en Java

La programmation des PIC en C. Les fonctions, les interruptions.

Corrigé des exercices sur les références

COMPARAISONDESLANGAGESC, C++, JAVA ET

Programmation en langage C Eléments de syntaxe

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

SUPPORT DE COURS. Langage C

Les structures de données. Rajae El Ouazzani

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

Projet de programmation (IK3) : TP n 1 Correction

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

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Cours d Algorithmique et de Langage C v 3.0

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

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

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

Langage Java. Classe de première SI

Le langage C. Séance n 4

TP2 : tableaux dynamiques et listes chaînées

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

Introduction à l héritage en C++

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

REPUBLIQUE ALGERIENNE DEMOCRATIQUE ET POPULAIRE UNIVERSITE M HAMED BOGARA DE BOUMERDES

Solutions du chapitre 4

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Notions fondamentales du langage C# Version 1.0

Le prototype de la fonction main()

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

PROJET ALGORITHMIQUE ET PROGRAMMATION II

MINIMUM. connaissances nécessaires à la programmation des microcontrôleurs PIC18 en langage C (une introduction au langage c A.N.S.

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

Cours 1: Java et les objets

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

Utilisation d objets : String et ArrayList

Quelques éléments de compilation en C et makefiles

Premiers Pas en Programmation Objet : les Classes et les Objets

INF 321 : mémento de la syntaxe de Java

Programmation en C/C++

Prendre le marteau, le tableau, le mètre, le crayon, la ficelle, le clou, la pointe ;

Programmation système de commandes en C

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

INITIATION AU LANGAGE JAVA

Les chaînes de caractères

Algorithmique, Structures de données et langage C

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Programmation avec des objets : Cours 7. Menu du jour

Introduction au Langage de Programmation C

Perl Orienté Objet BioPerl There is more than one way to do it

Examen d informatique première session 2004

Derrière toi Une machine virtuelle!

Anis ASSÈS Mejdi BLAGHGI Mohamed Hédi ElHajjej Mohamed Salah Karouia

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

Cours de programmation avancée. Le langage C. Université du Luxembourg

ETUDE DE CAS en UML : GESTION DES COMMANDES DE PIECES FABRIQUEES PAR LA SOCIETE C

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Transcription:

ESIEE 2011 2012 IN3T01 Programmation C TP 2 corrigé Jean-Claude Georges - Michel Landschoot PARTIE 1: LES FONCTIONS ET LES POINTEURS fichier fonctions.h #ifndef _FONCTION_H_ #define _FONCTION_H_ #include <stdio.h> #include <math.h> /* inutile sous UNIX */ #define M_PI 3.14159265358979323846 /* les déclarations prototypes des fonctions et les macro-définitions */ # define DUREE_LEGALE 35 # define TAUX_MAJ_HEUR_SUP 150 /* 150 % */ /* Conversion kilomètres-miles */ void km_vers_mile(double km, double * pmile); /* Conversion Fahrenheit C */ void F_vers_C(double F, double * pc); /* Volume d une sphère */ void volume_sphere(double rayon, double * pvolume); /* Notes */ void note (int bonnes_reponses, char * pc); /* Salaire */ void salaire_hebdo(int nb_heures, double salaire_horaire, double * psalairehebdo); #endif

fichier fonctions.c #include "fonctions.h" /* les définitions des fonctions */ /* Conversion kilomètres-miles */ void km_vers_mile(double km, double * pmile) *pmile = km /1.609; /* Conversion Fahrenheit C */ void F_vers_C(double f, double * pc) *pc = 5.0/9.0*(f -32.0); /* Volume d une sphère */ void volume_sphere(double rayon, double * pvolume) *pvolume = 4.0/3.0 * M_PI * rayon * rayon * rayon; /* Notes */ void note (int bonnes_reponses, char * pc) if ( bonnes_reponses <0 bonnes_reponses >50) *pc = '#'; else if ( bonnes_reponses <=10) *pc = 'E'; else if ( bonnes_reponses <=20) *pc = 'D'; else if ( bonnes_reponses <=30) *pc = 'C'; else if ( bonnes_reponses <=40) *pc = 'B'; else if ( bonnes_reponses <=50) *pc = 'A'; /* Salaire */ void salaire_hebdo(int nb_heures, double salaire_horaire, double * psalairehebdo) if ( nb_heures < DUREE_LEGALE ) *psalairehebdo = nb_heures * salaire_horaire ; else *psalairehebdo = ( DUREE_LEGALE + ( nb_heures - DUREE_LEGALE ) * TAUX_MAJ_HEUR_SUP / 100.0 ) * salaire_horaire ;

fichier testfonctions.c #include <stdio.h> #include "fonctions.h" /* pour afficher le menu */ /* LE MOT CLE static rend la fonction locale au fichier.c dans lequel elle est définie. Elle ne peut être appelée dans un fichier.c */ static void affichemenu(void); int mainfonctions(void) int choix; do affichemenu(); choix = getchar(); switch( choix) case '1': double miles; km_vers_mile(1609, &miles); printf("1609 kms valent %.2f miles \n\n", miles); break; case '2': double celsius; F_vers_C(457, &celsius); printf("457 degrés Fahrenheit valent %.2f degrés celsius \n\n", celsius ); break; case '3': double volume; volume_sphere(60, &volume); printf("une sphère de rayon 60 m a un volume de %.2f m \n\n", volume); break; case '4': char c; note(45, &c); printf("45 bonnes réponses valent %c \n\n", c); break; case '5':

double salaire; salaire_hebdo(35, 15, &salaire); printf("35 heures à 15 euros/h donne un salaire hebdomadaire de %.2f euros \n\n",salaire); break; default : printf("choix impossible \n"); break; while ((choix = getchar())!= EOF); return 0; static void affichemenu(void) printf(" 1 Conversion kilomètres-miles \n"); printf(" 2 Conversion Fahrenheit C \n"); printf(" 3 Volume d une sphère \n"); printf(" 4 Notes \n"); printf(" 5 Salaire\n"); printf("taper le numero choisi: ");

PARTIE 2: LES TABLEAUX ET LES POINTEURS Exercice 1: (c'est le passage machine de l'exercice 3 du TD2 avec des double au lieu de int) Initialiser à 0 un tableau de 20 double avec une boucle for. Afficher le tableau. Saisir les valeurs du tableau Afficher le tableau 1) version avec la notation des tableaux 2) version avec la notation des pointeurs 3) version avec une fonction prenant en paramètre un pointeur fichier testtableaux.c #include <stdio.h> void notationtableaux(void); void notation1pointeurs(void); void notation2pointeurs(void); void initialiser(float * p, int longueur); void saisir(float * p, int longueur); void afficher(float * p, int longueur); int main(void) printf("\n NOTATION TABLEAU \n"); notationtableaux(); printf("\n NOTATION POINTEUR version simpliste\n"); notation1pointeurs(); printf("\n NOTATION POINTEUR version élaborée\n"); notation2pointeurs(); printf("\n AVEC DES FONCTIONS PRENANT EN PARAMETRES DES POINTEURS \n"); /* rappel en C un tableau est passé en paramètre d'une fonction via l'adresse de son premier élément: &tab[0] noté aussi tab tab est un pointeur constant valant &tab[0] il faut aussi passer la longueur du tableau en paramètre */ float tab[5]; initialiser(&tab[0], sizeof(tab)/sizeof(tab[0])); printf("\n\n Affichage des valeurs initialisées: "); afficher(tab, sizeof(tab)/sizeof(tab[0])); printf("\n Saisie des valeurs: "); saisir(tab, sizeof(tab)/sizeof(tab[0])); printf("\n\n Affichage des valeurs saisies: "); afficher(tab, sizeof(tab)/sizeof(tab[0]));

void notationtableaux(void) float tab[5]; /* initialiser le tableau à 0*/ for ( i = 0; i < sizeof(tab)/sizeof(tab[0]); i++) tab[i] = 0; /* afficher le tableau */ printf("\n Affichage des valeurs initialisées: "); for (i = 0; i < sizeof(tab)/sizeof(tab[0]); i++) printf("%.2f ", tab[i]); /* saisir le tableau */ printf("\n Saisie des valeurs: "); for (i = 0; i < sizeof(tab)/sizeof(tab[0]); i++) scanf("%f", &tab[i]); /* afficher le tableau */ printf("\n Affichage des valeurs saisies: "); for (i = 0; i < sizeof(tab)/sizeof(tab[0]); i++) printf("%.2f ", tab[i]); void notation1pointeurs(void) float tab[5]; /* initialiser le tableau à 0*/ for ( i = 0; i < sizeof(tab)/sizeof(tab[0]); i++) *(tab + i) = 0;

/* afficher le tableau */ printf("\n Affichage des valeurs initialisées: "); for (i = 0; i < sizeof(tab)/sizeof(tab[0]); i++) printf("%.2f ", *(tab + i)); /* saisir le tableau */ printf("\n Saisie des valeurs: "); for (i = 0; i < sizeof(tab)/sizeof(tab[0]); i++) scanf("%f", tab + i); /* afficher le tableau */ printf("\n Affichage des valeurs saisies: "); for (i = 0; i < sizeof(tab)/sizeof(tab[0]); i++) printf("%.2f ", *(tab + i)); /* ON UTILISE L'ARITHMETIQUE DES POINTEURS dans les boucles for */ void notation2pointeurs(void) float tab[5]; float * p; /* initialiser le tableau à 0*/ for ( p = tab; p < tab + sizeof(tab)/sizeof(tab[0]); p++) *p = 0; /* afficher le tableau */ printf("\n Affichage des valeurs initialisées: "); for ( p = tab; p < tab + sizeof(tab)/sizeof(tab[0]); p++) printf("%.2f ", *p); /* saisir le tableau */ printf("\n Saisie des valeurs: "); for ( p = tab; p < tab + sizeof(tab)/sizeof(tab[0]); p++) scanf("%f", p);

/* afficher le tableau */ printf("\n Affichage des valeurs saisies: "); for ( p = tab; p < tab + sizeof(tab)/sizeof(tab[0]); p++) printf("%.2f ", *p); /* ON UTILISE L'ARITHMETIQUE DES POINTEURS dans les boucles for */ void initialiser(float * p, int longueur) float * pcourant; for ( pcourant = p; pcourant < p + longueur; pcourant++) *pcourant = 0; void saisir(float * p, int longueur) float * pcourant; for ( pcourant = p; pcourant < p + longueur; pcourant++) scanf("%f", pcourant); void afficher(float * p, int longueur) float * pcourant; for ( pcourant = p; pcourant < p + longueur; pcourant++) printf("%.2f ", *pcourant);

Pour les exercices suivants les tableaux seront initialisés en dur dans la fonction main: exemple: double tab[4] = 2.1, 4.8, 16.32, 5.0 ; tab tableau de 4 double ou double tab[] = 2.1, 4.8, 16.32, 5.0 ; tab tableau de 4 double (le compilateur calcule tout seul le nombre d'éléments du tableau). Toutes les déclarations prototypes des fonctions sont dans un fichier fonctions_tableaux.h Toutes les définitions des fonctions sont dans un fichier fonctions_tableaux.c La fonction main contient les appels aux fonctions demandées et les affichages des résultats dans un fichier main.c Exercice 2: Moyenne Écrivez la fonction qui calcule la moyenne des n premiers éléments stockés dans un tableau de double. Prototype : double moyenne (double t[], int n); ou double moyenne (double * t, int n); Exercice 3: Les carrés Écrivez la fonction qui remplit un tableau de n int par les carrés des n premiers nombres entiers et ne retourne aucune valeur. Prototype : void remplit_carres (doublet[], int n); ou void remplit_carres (double * t, int n); Afficher le tableau remplit en utilisant une fonction d'affichage. Exercice 4: Recherche d éléments sur critère Écrivez la fonction qui retourne l indice du premier élément strictement négatif parmi les n premiers éléments d un tableau de double (-1 si aucun élément n est négatif). Prototype : int indice_premier_negatif (double t[], int n); ou int indice_premier_negatif (double * t, int n); Exercice 5:Maximum Écrivez la fonction qui retourne la valeur du plus grand des n premiers éléments d un tableau de double. Prototype : double valeur_plus_grand (double t[], int n); ou double valeur_plus_grand (double * t, int n);

Exercice 6: Position du maximum Écrivez la fonction qui retourne l indice du plus grand des n premiers éléments d un tableau de double (en cas d ex-æquo, l indice du premier d entre eux). Prototype : int indice_plus_grand (double t[], int n); ou int indice_plus_grand (double *, int n); Exercice 7: Copie Écrivez la fonction qui copie les n premiers éléments d un tableau source de double dans le tableau destination de double et retourne l adresse du tableau destination. On prendra en compte le fait que les deux tableaux ne peuvent pas se recouvrir partiellement (2 tableaux différents). Prototype : double * copie (double * destination, double * source, int n); fichier fonctions_tableaux.h #ifndef _FONCTION_TABLEAUX_H_ #define _FONCTION_TABLEAUX_H_ double moyenne (double * t, int n); void remplit_carres (int * t, int n); int indice_premier_negatif (double * t, int n); double valeur_plus_grand (double * t, int n); int indice_plus_grand (double * t, int n); double * copie (double * destination, double * source, int n); #endif LES FONCTIONS SONT ECRITES EN UTILISANT LES NOTATIONS TABLEAU fichier fonctions_tableaux.c #include "fonctions_tableaux.h" double moyenne (double * t, int n) double total =0.0; for (i = 0 ; i < n ; ++ i ) total += t[i]; return total /n; void remplit_carres (int * t, int n) for (i=0; i<n ; ++i ) t[i]=i*i;

indice_premier_negatif L'analyse du problème nous conduit à la solution suivante : on parcourt le tableau si l'on rencontre un élément négatif, on termine la fonction en retournant l'indice courant si l'on a parcouru l'intégralité du tableau sans avoir rencontré d'élément négatif, on retourne 1 comme indiqué dans la spécification. Attention : c'est après la boucle que l'on peut constater l'absence d'élément négatif. Une erreur courante de programmation consiste à retourner 1 trop tôt, avec un test du style if (t[i]<0) return i; else return -1; ce qui conduit à retourner -1 si le premier un élément n'est pas négatif. int indice_premier_negatif (double * t, int n) for (i =0; i<n ; ++ i) if (t[i] <0) return i; return -1; valeur_plus_grand L'analyse du problème nous conduit à la solution suivante : Un parcours du tableau s'impose, avec une mémorisation du plus grand élément rencontré. En effet, le plus grand élément du tableau peut se situer n'importe où (en début, en cours ou en fin de tableau) et donc on ne peut le connaître qu'après avoir examiné tous les éléments du tableau, et le mémoriser permettra de le retourner en fin de parcours. L'initialisation de ce maximum pourra se faire par le premier élément du tableau ( t[0] ), et la boucle peut commencer par l'indice 1. Le corps de la boucle consistera à comparer l'élément courant au maximum, et, s'il lui est supérieur, à le mémoriser dans le maximum. Ce qui conduit à la solution suivante : double valeur_plus_grand (double * t, int n) double maxi =t [0]; for (i=1; i<n ; ++i ) if (t[i]> maxi ) maxi =t[i]; return maxi ;

indice_plus_grand L'analyse du problème nous conduit à la solution suivante : Le programme est semblable au précédent. Un parcours du tableau s'impose, avec une mémorisation de l'indice du plus grand élément rencontré. En effet, le plus grand élément du tableau peut se situer n'importe où (en début, en cours ou en n de tableau) et donc on ne peut le connaître qu'après avoir examiné tous les éléments du tableau ; mémoriser sa position permettra de la retourner en fin de parcours. L'initialisation de cet indice maximum pourra se faire par l'indice du premier élément du tableau ( 0 ), et la boucle peut commencer par l'indice 1. Ce qui conduit à la solution suivante : int indice_plus_grand (double * t, int n) int imax =0; for (i=1; i<n ; ++i ) if (t[i]>t[ imax ]) imax =i; return imax ; copie L'analyse du problème nous conduit à la solution suivante : La solution naturelle est basée sur le principe : on parcourt parallèlement les deux tableaux et on copie élément par élément le contenu du tableau source dans le tableau destination, ce qui donne : /* Attention : ne fonctionne que si * les tableaux ne se recouvrent pas */ double * copie (double * destination, double * source, int n) for (i =0 ; i<n ; ++ i) destination [i ] = source [i]; return destination ;