Travaux dirigés 3 : pointeurs et fonctions. 1 Initialisation d un tableau passé en paramètre

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

Introduction au langage C

Les structures. Chapitre 3

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

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

Programmation en langage C

Algorithmique et Programmation, IMA

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

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

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

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

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

Le langage C. Séance n 4

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


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

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

Chapitre 1 : La gestion dynamique de la mémoire

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

Le prototype de la fonction main()

Les structures de données. Rajae El Ouazzani

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

Chap III : Les tableaux

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

Java Licence Professionnelle CISII,

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

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

INITIATION A LA PROGRAMMATION

TP2 : tableaux dynamiques et listes chaînées

Programmation Classique en langage C

Programme Compte bancaire (code)

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

I. Introduction aux fonctions : les fonctions standards

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

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

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

V- Manipulations de nombres en binaire

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

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

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

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

COURS D'INFORMATIQUE: LANGAGE C NOTES DE COURS

Outils pour la pratique

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

SUPPORT DE COURS. Langage C

Département Automatisation et Informatisation Année Programmation en C++ Institut des Sciences et Techniques de l Ingénieur d Angers

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

Les arbres binaires de recherche

Rappels Entrées -Sorties

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

OS Réseaux et Programmation Système - C5

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

Les processus légers : threads. Système L3, /31

Les fichiers. Chapitre 4

Programmation système I Les entrées/sorties

Le Langage C Licence Professionnelle Qualité Logiciel Pr. Mouad BEN MAMOUN ben_mamoun@fsr.ac.ma Année universitaire 2011/2012

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

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

Conventions d écriture et outils de mise au point

Langage Éric Guérin 5 octobre 2010

COMPARAISONDESLANGAGESC, C++, JAVA ET

Introduction au Langage de Programmation C

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

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

Cours de C. Allocation dynamique. Sébastien Paumier

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

Premiers Pas en Programmation Objet : les Classes et les Objets

Programmation en Java IUT GEII (MC-II1) 1

Cours Programmation Système

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

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

Cours 6 : Tubes anonymes et nommés

as Architecture des Systèmes d Information

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

Cours d algorithmique pour la classe de 2nde

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

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

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

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

Les débordements de tampons et les vulnérabilités de chaîne de format 1

Programmation système en C/C++

Corrigé des exercices sur les références

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

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

Principes des langages de programmation INF 321. Eric Goubault

Architecture des ordinateurs

Chapitre 10 : Logiciels

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

Cours de Systèmes d Exploitation

Claude Delannoy. 3 e édition C++

Algorithmique I. Algorithmique I p.1/??

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

INF 321 : mémento de la syntaxe de Java

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

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

Transcription:

Université Paris-Nord Institut Galilée Année 2008-2009 Licence 1-2ième semestre Travaux dirigés 3 : pointeurs et fonctions L1 L objectif de ce TD est de mettre en évidence le fait que les paramètres formels sont des variables locales aux fonctions. Les variables locales ont une place mémoire allouée au début de l exécution de la fonction et libérée à la fin de l exécution. Si l on souhaite modifier des variables déclarées en dehors de la fonction, il faut définir des paramètres formels pointeurs et les initialiser avec les adresses de ces variables. 1 Initialisation d un tableau passé en paramètre Soit le programme suivant : #include <stdlib.h> /* EXIT_SUCCESS */ #include <stdio.h> /* printf */ void init_tableau(int t[],int taille); int main() /* un tableau et sa taille */ int tab[2]; int taille = 2; int i; /* var boucle */ /* représenter l occupation mémoire */ identificateur adresse valeur tab[0] 1000? tab[1] 1004? taille 1008 2 i 1012? init_tableau(tab,taille); /* représenter l occupation mémoire */ Remarquer que la zone mémoire de init_tableau a été désallouée. identificateur adresse valeur tab[0] 1000 0 tab[1] 1004 1 taille 1008 2 i 1012? 1

for(i = 0;i < taille;i = i + 1) printf("%d ",tab[i]); printf("\n"); return EXIT_SUCCESS; void init_tableau(int t[],int taille) int i; /* représenter l occupation mémoire */ Remarquer que l on donne toute l occupation mémoire du prog. Il faut distinguer taille et i de main et de init_tableau, même si c est pas très clair avec cette présentation. Insister sur le fait que la zone mémoire de init_tableau est désallouée/perdue à la fin de identificateur adresse valeur tab[0] 1000 0 tab[1] 1004 1 l exécution de la fonction (voir plus haut). taille 1008 2 i 1012? t 8000 1000 taille 8004 2 i 8008? for(i = 0;i < taille;i = i + 1) t[i] = i; Représenter l occupation mémoire comme indiqué en commentaires. Qu affiche le programme? Pour déterminer les adresses, on fera les simplifications suivantes 1 : les données sont réservées en mémoire dans l ordre de leur déclaration ; les données allouées dans la fonction main démarre à 1000 ; les données allouées dans la fonction init_tableau démarre à 8000 ; l architecture est 32 bits Proposez une réécriture de la procédure init_tableau qui permet de faire l économie de la variable de boucle (i). var de boucle. taille est une variable locale donc on peut la modifier et l utiliser comme 1 Le choix des adresses est arbitraire, seule importe l observation que les données locales allouées dans une fonction ont un espace mémoire propre. 2

void init_tableau(int t[],int taille) for(taille = taille - 1;taille >= 0;taille = taille - 1) t[taille] = taille; 2 Recopie de tableaux Nous souhaitons écrire une procédure recopie_tableau qui prend en entrée deux tableaux de réels de même taille, original et copie, leur taille taille et qui recopie les valeurs de original dans copie. 1. Donner le prototype de cette fonction. Les deux sont strictement équivalents mais on préfère la b (sucre syntaxique pour le passage de tableaux) : (a) void recopie_tableau(double *original,double *copie,int taille) ; (b) void recopie_tableau(double original[],double copie[],int taille) ; 2. Définir cette fonction. 3. Écrire une programme simple permettant de tester cette fonction. Faire une trace si besoin. On peut faire sans affichage_tableau. #include <stdlib.h> /* EXIT_SUCCESS */ #include <stdio.h> /* printf */ /* déclaration de fonctions utilisateurs */ void affichage_tableau(double t[],int taille); void recopie_tableau(double original[],double copie[],int taille); int main() double original[5] = 1,2,3,4,5; double copie[5] = 5,4,3,2,1; recopie_tableau(original,copie,5); affichage_tableau(copie,5); return EXIT_SUCCESS; void affichage_tableau(double t[],int taille) int i; /* var. boucle */ 3

for(i = 0;i < taille;i = i + 1) printf("%g\n",t[i]); void recopie_tableau(double original[],double copie[],int taille) int i; /* var. boucle */ for(i = 0;i < taille;i = i + 1) copie[i] = original[i]; 3 Les rationnels, suite et fin Cet exercice est à terminer en TP pour tester votre codage. 1. Réécrire les fonctions lit_rat, somme_rat, produit_rat, affiche_rat, difference_rat, quotient_rat sous forme de procédures, c est-à-dire sans valeur de retour. Le résultat du calcul sera communiqué par un paramètre supplémentaire jouant le rôle de paramètre de sortie. Il y a rend_irreductible aussi pour ceux qui l ont fait. /* prototypes */ void lit_rat(struct rat *p_r); void affiche_rat(struct rat r); void somme_rat(struct rat r1, struct rat r2, struct rat *p_res); void produit_rat(struct rat r1, struct rat r2, struct rat *p_res); void rend_irreductible(struct rat *p_r); /*fonctions */ void lit_rat(struct rat *p_r) scanf("%d", &p_r->num); scanf("%d", &p_r->deno); rend_irreductible(p_r); void affiche_rat(struct rat r) printf("(%d/%d)\n", r.num, r.den); void somme_rat(struct rat r1, struct rat r2, struct rat *p_res) 4

p_res->num= r1.num * r2.den + r2.num * r1.den; p_res->den= r1.den * r2.den; rend_irreductible(p_res); void produit_rat(struct rat r1, struct rat r2, struct rat *p_res) p_res->num= r1.num * r2.num; p_res->den= r1.den * r2.den; rend_irreductible(p_res); void rend_irreductible(struct rat *p_r) int diviseur; if (p_r->num < p_r->den) diviseur= p_r->num; else diviseur= p_r->den; while (diviseur > 1) if (p_r->num % diviseur == 0 && p_r->den % diviseur == 0) p_r->num= p_r->num / diviseur; p_r->den= p_r->den / diviseur; diviseur = diviseur - 1; 2. Modifier le programme de la mini-calculatrice pour utiliser ces fonctions. Que le main... int main() struct rat nombre_g; /* membre gauche de l expression */ struct rat nombre_d; /* membre droit de l expression */ char op; /* operateur */ struct rat expr; /* resultat de l expression */ /* saisie expression */ printf("les nombres ici sont rationnels. Pour saisir un nombre saisir le nume printf("entrez une expression de la forme : nombre operateur nombre\n"); lit_rat(&nombre_g); 5

scanf(" %c",&op); lit_rat(&nombre_d); /* calcul valeur expression */ /* cas mutuellement exclusif */ if(op == + ) /* addition */ somme_rat(nombre_g,nombre_d,&expr); if(op == - ) /* soustraction */ difference_rat(nombre_g,nombre_d,&expr); if(op == * ) /* multiplication */ produit_rat(nombre_g,nombre_d,&expr); if(op == / ) /* division */ quotient_rat(nombre_g,nombre_d,&expr); /* affichage resultat */ affiche_rat(expr); return EXIT_SUCCESS; 3. Étendre les fonctionnalités de la mini-calculatrice pour faire des opérations entre rationnels et entiers. Des exemples d expressions valides sont : 2 3 / 2 2 + 3 5 3! + 4 5 Cette question n est pas corrigée et doit être faite que par ceux qui ont tout terminé, le TP ddd compris. Une solution est d écrire une procédure void lire_expression(struct rat *p_nombre_g,struct rat *p_nombre_d) qui normalise les entrées sous la forme de rationnels. N.B. il faut que les expressions puissent être parsées de façon déterministe, d où le. Ils verront la reprise sur erreurs en E/S avancées. 6