Université Paris-Sud 11 Institut de Formation des Ingénieurs Remise à niveau INFORMATIQUE Année 2007-2008 Travaux pratiques d informatique Le langage C Séance n 4 But : Vous devez maîtriser à la fin de cette séances les notions suivantes : la manipulation des pointeurs et l utilisation des tableaux. Exercice 1 : Utilisation des pointeurs On considère le programme suivant : #include<stdio.h> int main() { int nombre ; int * ptr1 ; int * ptr2 ; ptr1 = &nombre ; *ptr1 = 10 ; printf("la variable nombre vaut : %d \n",nombre) ; ptr2 = ptr1 ; *ptr2 = 3346 ; printf("la variable nombre vaut maintenant : %d \n",nombre) ; return 0 ; } Question : Dessinez sur une feuille de papier l état de la mémoire durant l exécution de ce programme. Codez le programme et expliquez ce que vous observez. Exercice 2 : Aire et volume de la sphère Le but de l exercice est de calculer l aire et le volume de la sphère. Nous allons rappeler les formules de l aire et du volume de la sphère pour les amnésiques : On écrira une fonction AireVolSphere qui a le prototype suivant : Aire de la sphère = 4π rayon 2 (1) Volume de la sphère = 4 3 π rayon3 (2) T. Rodet Le 11 juillet 2007
le langage C 2 int AireVolSphere(double rayon, double * ptraire, double * ptrvolume) ; Cette fonction retourne un entier égal à 1 si les arguments de la fonction sont corrects (rayon de la sphère positif), et 0 sinon. Question : Écrire la fonction AireVolSphere. Écrire une fonction main qui déclare les variable nécessaires et qui appelle la fonction AireVolSphere. Conseil : Faites un dessin de l espace mémoire pour bien vérifier que vous avez bien réservé l espace nécessaire en mémoire. Exercice 3 : Saisie au clavier (scanf) Le clavier est l entrée standard (ou stdin, pour standard input) de vos programmes. La fonction scanf permet de faire une lecture formatée du clavier ; elle lit les caractères en entrée, les interprète selon les spécifications de format (%c, %d, %f, %lf, etc... ) décrites dans la chaîne format en argument. Par exemple : char c ; int i,j ; printf("saisir un caractère et deux entiers\n") ; scanf("%c %d %d", &c, &i, &j) ; /* On entre les valeurs : a 2 3 */ Dans cet exemple, les valeurs frappées au clavier sont indiquées en souligné. La variable c prend donc la valeur a et les entiers i et j les valeurs 2 et 3. Attention! Pour pouvoir affecter aux variables c, i et j les valeurs saisies, les arguments de scanf doivent être obligatoirement les adresses des variables (&c, &i, &j). En d autres termes, on doit indiquer à quel(s) endroit(s) de la mémoire doivent être stockées les valeurs saisies au clavier. Remarques. Les valeurs tapées au clavier (a, 2, 3) sont séparées par un ou plusieurs espaces, et la ligne de saisie est terminée par un retour-chariot (touche Entrée). Les valeurs entrées sont d abord mémorisées dans une mémoire "tampon" avant d être traitées par scanf. La chaîne de format ("%c %d %d" dans l exemple) ne doit comporter que des spécifications de format, tout autre caractère peut amener le programme à se comporter curieusement... Bibliothèque. Comme la fonction printf, scanf nécessite de prendre en compte la bibliothèque des entrées-sorties standard : #include <stdio.h> Question 1. Un caractère. Écrire le programme qui saisit la valeur d un caractère, puis affiche ce caractère. Faire précéder le scanf d un message d invite et d explication qui précise que l on doit entrer un caractère. L exécution du programme doit ressembler à : Entrez au clavier un caractère : Le caractère saisi est : X. X
le langage C 3 Question 2. Caractère, double, entier. Écrire le programme qui saisit la valeur d un caractère, d un double puis d un entier, et affiche ces valeurs. Chaque entrée se fait par un nouveau scanf. Reprenez cette question en introduisant une erreur de frappe au moment de l entrée du double (par exemple, tapez une virgule au lieu du point décimal). Comprenez-vous ce qui se passe? Question 3. Deux caractères. Écrire le programme qui saisit la valeur d un caractère, affiche ce caractère, puis entre un nouveau caractère et affiche ce nouveau caractère. Vous n utiliserez qu une seule variable de type caractère. Vous devez constater que le programme s exécute sans vous laisser entrer le second caractère. Explication. Les entrées provenant du clavier sont stockées dans une mémoire (la mémoire tampon). Au premier appel à scanf, on frappe les touches X (pour la saisie du premier caractère) puis Entrée, la mémoire tampon contient donc deux caractères ( X et \n ). Ainsi, les deux appels à scanf saisissent respectivement X et \n, sans attendre une nouvelle saisie. La solution est de vider la mémoire tampon entre les deux appels à scanf en rajoutant l instruction : fflush(stdin); Ainsi, la mémoire est «nettoyée» du caractère \n, et le second appel à scanf attend une nouvelle saisie. Notez que ce problème est seulement lié à la saisie de caractères ; en effet, le retour-chariot est interprété comme un caractère ( \n ), mais jamais comme un nombre (entier ou réel). Dans le programme de la question 2, les retour-chariot sont donc interprétés comme des séparateurs entre un caractère et un double, puis un double et un entier. Exercice 4 : Tableau dynamique Le but de cet exercice est de manipuler un tableau dynamique formé de N entiers. Question 1. Dans un premier temps, vous écrirez une seule fonction main, qui réalise les opérations suivantes : Initialisation d un pointeur ptrint sur entier, à la valeur NULL. Saisie au clavier d un entier non signé N. Allocation d un bloc de N entiers pour le pointeur ptrint (il s agit d un tableau dynamique). Affectation des valeurs 1,2,...,N aux N entiers alloués à l adresse ptrint. Affichage des N valeurs pointées par ptrint. Libération de la mémoire si nécessaire. Vérifier le fonctionnement du programme. Question 2. On veut maintenant écrire une fonction pour remplir le tableau et une fonction pour réaliser l affichage des N entiers mémorisés à l adresse ptrint. La fonction remplit possède l interface suivante : Nom : remplit. Valeurs reçues : un pointeur sur entiers ptrint et un entier non signé N. Pas de valeur retournée. La fonction affichage possède l interface suivante : Nom : affichage. Valeurs reçues : un pointeur sur entiers ptrint et un entier non signé N. Pas de valeur retournée. Écrire les fonctions remplit et affichage, puis modifier la fonction main pour réaliser l appel de ces deux fonctions. Tester le programme sur un exemple simple. Note : dans la fonction affichage le paramètre contenant l adresse de la première case mémoire du tableau peut ici être déclaré en const, car les valeurs pointées par ptrint ne sont pas modifiées.
le langage C 4 A Prise en main de visual C++ Nous utilisons le logiciel Visual C++ (version 6.0). Il permet de compiler des programmes écrits en C et en C++, puis de les exécuter, de les débugger... Pour cette année, nous n utiliserons que le compilateur C, vos fichiers sources porteront donc l extension.c. Gérer votre travail avec Visual C++ Le travail que vous réalisez sous Visual C++ est organisé en espace de travail (ou workspace) et projets. Un projet correspond à un programme écrit en C, et un espace de travail est un dossier qui regroupe un ou plusieurs projets. Vous pouvez donc créer un seul workspace par séance de TP sur machine, et autant de projets que d exercices. Pour aujourd hui, vous créerez le workspace TP1 au sein du dossier Z:\TP_C, puis plusieurs projets (exo1, exo2, exo3, etc... ) dans le workspace TP1. Création d un espace de travail Pour démarrer le logiciel Visual C++, utilisez la barre de menu située en bas de l écran : Démarrer = Programmes = Microsoft Visual C++ 6.0. Une fois Visual C++ démarré, utilisez la barre de menu située en haut de la fenêtre : File = New = Workspaces Une fenêtre s ouvre alors qui vous permet de définir votre espace de travail : Workspace Name : TP1 Location : Z:\TP_C\TP1 Pour désigner la localisation, vous pouvez utiliser l icône située à droite ("...") de façon à parcourir l arborescence des dossiers. Cliquez ensuite sur le bouton OK. L espace de travail a été créé, il est vide : Workspace TP1 : 0 project(s) Création d un projet Vous allez à présent ajouter un nouveau projet (ou programme) exo1 au workspace TP1. Cliquez avec le bouton de droite sur la ligne Workspace TP1, et sélectionnez dans le menu déroulant : Add New Project to Workspace Une nouvelle fenêtre s ouvre. Vous devez alors : 1. Définir la nature du programme : Win32 Console Application (système d exploitation Windows 32 bits, en mode console). 2. Indiquer le nom et le chemin d accès de votre projet : Project Name : exo1 Location : Z:\TP_C\TP1\exo1 3. Cliquez finalement sur Add to current workspace, puis sur OK, Finish puis encore OK. À ce stade, vous avez ajouté un nouveau projet (an empty project) à l espace de travail. Tout nouvel ajout de projet à l espace de travail TP1 se fera de la même façon. Création d un fichier source Cliquez en bas de la fenêtre sur FileView. Vous voyez apparaître une (des) arborescence(s) qui illustre la structure du (des) projet(s) de l espace de travail. Pour l instant, nous n utiliserons que le dossier indiqué par
le langage C 5 Source. La partie droite de la fenêtre est destinée à l éditeur de texte dans lequel vous pourrez créer votre fichier source (fichier terminé par l extension.c). Pour créer un fichier source dans le projet courant, faire : File = New = C++ Source File et proposer un nom pour votre programme, par exemple exo1.c. Ce fichier est automatiquement rangé dans le dossier Z:\TP_C\TP1\exo1\. Projet actif Si votre espace de travail comporte plusieurs projets, vous constatez que l un d eux (par exemple exo1) a son nom inscrit en gras. C est le projet actif : les commandes de compilation et d exécution (Build Build, Execute) concernent ce projet et non les autres. Pour rendre un autre projet actif (par exemple exo2) et désactiver le premier, cliquer avec le bouton de droite sur son nom (exo2), puis sur Set as Active Project. Sauvegardes La commande File save sauvegarde le fichier "actif" sur lequel vous travaillez (celui qui est au premier plan sur l écran). Cliquez sur save all pour sauvegarder l ensemble de votre travail (tout vos programmes). Autres commandes Explorez la barre de menu pour trouver comment compiler le fichier actif, construire le fichier exécutable (exo1.exe), lancer le programme, le débugger, etc. Utilisez l aide en ligne en double-cliquant sur un nom de fonction (par exemple printf) puis en tapant sur la touche F1.