You are on page 1of 15

UNIVERSITE PAUL SABATIER TOULOUSE III

TP Module 3 - Langage C

L2 IUP AISEM
2004/2005

J.M. ENJALBERT

IUP AISEM L2

TP Langage C

2004/2005

Pr esentation de lenvironnement de travail


Session de travail
Les s eances de TP langage C se d eroulent sur des machines fonctionnant sous LINUX dans lenvironnement graphique KDE. LINUX est un syst` eme dexploitation multi-taches et multi-utilisateurs. Chaque utilisateur poss` ede un compte identi e par un nom de login et proteg e par un mot de passe. Il poss` ede par ailleurs un r epertoire personnel (espace personnel prot eg e sur le disque). Les machines etant reli ees en r eseau (local!), lacc` es a un compte utilisateur peut se faire indi eremment a ` partir de nimporte quelle machine. La proc edure permettant de travailler sur son compte consiste a `: rentrer son nom de login a ` linvite: login: rentrer son mot de pasee a ` linvite: password: (attention, il ny a pas d echo a l ecran des touches actionn ees) lancer lenvironnement graphique en tapant: startx ouvrir une fen etre terminal en cliquant sur lic one ad equate. (Toutes les entr ees au clavier sont valid ees par la touche enter) En n de s eance la proc edure a ` suivre consiste a `: sortir de lenvironnement graphique se d econnecter en frappant sur la combinaison de touche CTRL-D arr eter la machine a ` laide de la combinaison de touches CTRL-ALT-SUPPR (3 touches). (Ne pas utiliser linterrupteur marche/arr et!) Un nom de login vous sera fourni a ` la premi` ere s eance de TP. Il est de la forme: l2aisem ??. Le mot de passe par d efaut est: jsupe2004. Vous pouvez le modier en utilisant la commande yppasswd.

Outils pour la programmation en C


L ecriture, la compilation, la mise au point et lex ecution dun programme C fait appel a ` di erents outils. Les instructions du programme doivent etre rentr ees comme du texte normal dans un chier a ` laide dun editeur de texte. On parle de programme source. Le chier contenant un programme source doit comporter lextension .c (Ex: prog.c). Ce chier source doit ensuite etre compil e pour cr eer un ex ecutable (chier binaire) ou un chier objet (dextension .o). Ceci est fait en utilisant un compilateur. Lex ecution du programme consiste tout simplement a ` taper son nom dans une fen etre terminal. Ces outils (traitement de texte et compilateur) seront lanc es a partir dune fen etre terminal sous la forme de commandes. 1

IUP AISEM L2

TP Langage C

2004/2005

Edition du programme:
Nimporte quel editeur de texte pourrait faire laaire. En pratique, vous utiliserez l editeur de textes emacs. Pour le lancer: taper emacs & dans la fen etre terminal (ou trouver la commande dans le menu g en eral). Pour cr eer un nouveau chier (programme): choisir open dans le menu le et taper son nom (Ex: prog1.c). Taper le programme dans la fen etre d edition. Pour sauver: save dans le menu le Des outils d edition (couper, coller, etc...) sont disponibles (accessibles par le menu edit ou par des raccourcis claviers). Attention: tout programme source devra etre sauv e en lui donnant lextension .c, par exemple programme.c On peut aussi editer un programme existant en utilisant litem open du menu le.

Compilation:
Le compilateur C utilis e sera un compilateur GNU: gcc Pour compiler, par exemple, le programme programme.c on tapera la ligne suivante: gcc -Wall -g -o programme programme.c -lm Si tout ce passe bien, lex ecutable programme sera cr e e qui pourra etre lanc e en tapant simplement programme dans la fen etre terminal.

Impression des listings


Limpression des listings se fait sur une imprimante connect ee au r eseau. A partir de la ligne de e avec commande il sut de taper la commande a2ps mon fichier.c pour sortir un listing format ent ete. La commande a2ps est en fait un ltre dimpression qui traduit un texte ascii en postscript en fonction de son type. Un chier dextension .c est ainsi reconnu comme un source C et trait e en cons equence (commentaires en italiques, etc...). Le contr ole de limpression se fait en utilisant la commande lpq qui permet de visualiser les travaux dimpressions en attente. Chacun des travaux est associ e a un num ero qui doit etre utilis e pour lenlever eventuellement de la le dimpression en invoquant la commande lprm et en lui passant ce num ero en argument. Il est rappel e que limprimante est une ressource collective. Le respect des autres utilisateurs impose de v erier que limpression que lon a lanc ee sest bien d eroul ee et ne bloque pas limprimante pour une raison ou pour une autre. Le papier est par ailleurs une ressource rare qui doit donc etre utilis ee a ` bon escient. En pratique deux imprimantes sont reli ees au r eseau. Lune dentre elles est d enie comme imprimante par d efaut mais on peut acc eder a lautre en pr ecisant son nom grace a ` loption -P. Par exemple: a2ps -Pimp1 prog.c enverra le travail dimpression sur limprimante 1 (a droite en entrant) et a2ps -Pimp2 prog.c lenverra sur limprimante 2. Limprimante d enie par d efaut d epend de la machine sur laquelle vous travaillez.

IUP AISEM L2

TP Langage C

2004/2005

S eance 1

(aectation, instruction if else, entr ees/sorties clavier/ ecran, boucles for)

1.1

Premier programme

Ecrire un programme achant a l ecran un message de bienvenue. Le compiler puis lex ecuter.

1.2

Conversion

Ecrire un programme qui lit un nombre au clavier (repr esentant une valeur en euros) et la convertit en francs. Rappel: 1 euro =6.55957 francs. On achera le r esultat avec deux chires apr` es la virgule.

1.3
1.3.1

Equation du second degr e

Le calcul des racines dune equation du second degr e du type ax2 + bx + c = 0 se fait en calculant 2 dabord son discriminant = b 4ac. Ecrire un programme permettant de calculer et dacher sa valeur a ` l ecran pour des valeurs x ees de a, b et c.

1.3.2
Compl eter le programme pr ec edent de mani` ere a ` pouvoir rentrer les valeurs de a, b et c au clavier. Compiler et tester.

1.3.3
Calculez et acher les solutions de l equation dans le cas ou > 0. (x1 = (b + x2 = (b )/2a ) )/2a et

1.3.4
Traiter les cas = 0 (1 racine double: x = b/2a) et < 0 (2 racines complexes conjugu ees: x1 = b/2a + j ( )/2a) et x2 b/2a j ( )/2a)). Pour les racines complexes on achera les parties r eelles et imaginaires. 3

IUP AISEM L2

TP Langage C

2004/2005

1.4

Calcul de moyenne

On d esire ecrire un programme dont le r ole est de calculer la moyenne de N notes rentr es au clavier. Lutilisateur doit fournir le nombre N de notes puis la liste des N notes a ` la suite de quoi le r esultat (moyenne des N notes) doit sacher a ` l ecran. Le nombre maximal de notes est x ea ` 100. Que se passe til si lutilisateur rentre dabord la valeur 0? Proposer une solution pour tenir compte de ce cas.

IUP AISEM L2

TP Langage C

2004/2005

S eance 2

(boucle for, tableaux. fonctions.)

2.1
2.1.1
Pour x variant entre xmin et xmax avec un pas de x, calculer et acher y = ax2 + bx + c. Les coecients r eels a,b et c seront rentr es au clavier par lutilisateur. On prendra par exemple xmin = 1 et xmax = 1 Le pas sera x e par lutilisateur. On achera les valeurs de x et de y correspondantes.

2.1.2
Utilisez un tableau pour stocker les valeurs de y puis calculer a ` partir des valeurs du tableau les valeurs minimale, maximale et moyenne de y . Cr eer des fonctions pour calculer chacune de ces valeurs (min, max. etc...).

2.1.3
Modier la fonction calculant le minimum de y de mani` ere a ` ce quelle renvoie aussi la valeur de x correspondant a ` ce minimum.

2.2
Un peu dalgorithmique: Ecrire un programme permettant de dessiner un sapin en xant la hauteur du c one, la largeur et la hauteur du tronc et le nombre de boules (dont la position est al eatoire). Par exemple, pour un cone de hauteur 6, un tronc de hauteur 2 et de largeur 3 et 4 boules on doit obtenir un achage du type: * *O* ***** **O***O *****O*** *********** ||| |||

IUP AISEM L2

TP Langage C

2004/2005

Pour r esoudre le probl` eme, il est judicieux de le d ecomposer en trois etapes: Dessiner le c one du sapin qui d epend de sa hauteur. Soit N la hauteur du c one, il sagit dimprimer a ` l ecran N lignes dont la premi` ere est compos ee dune etoile et la derni` ere de 2*N-1 etoiles (voir dessin). Rajouter le tronc. Modier le dessin du c one en rajoutant des boules de mani` ere al eatoire. Remarque: on peut g en erer un nombre al eatoire x compris entre 0 et 1 en ecrivant: x=rand()/RAND_MAX; Suggestion pour l etape 3: Avant dacher une etoile, g en erer un nombre al eatoire compris entre 0 et 1. Si ce nombre est inf erieur a ` une certaine valeur (probabilit e de placer une boule) et sil reste des boules a ` placer, acher un O sinon acher une etoile.

IUP AISEM L2

TP Langage C

2004/2005

S eance 3

(boucle while, biblioth` eque math ematique, lecture et ecriture dans un chier)

3.1
On reprend le programme permettant de calculer la moyenne de notes saisis au clavier mais cette fois-ci lutilisateur nindique pas le nombre de notes avant de les rentrer mais termine la saisie en rentrant le nombre -1. En supposant que le nombre de notes ne d epassera jamais 30, ecrire le programme permettant dacher la moyenne des notes ainsi que leur nombre.

3.2
On cherche a ` r esoudre une equation du type f (x) = 0 par dichotomie. On suppose connu un intervalle x0 , x1 dans lequel la fonction f sannule. On a ` donc f (x0 ).f (x1 ) < 0. On prend le point milieu du segment x0 ,x1 : x2 = (x0+ x1)/2 et on calcule f (x2 ). Si f (x2 ).f (x0 ) > 0 on sait que la racine se trouve sur le segment x2 , x1 sinon elle est sur le segment x0 , x2 . Dans le premier cas on remplace x0 par x2 , dans le second on remplace x1 par x2 . On recalcule un point milieu, etc.. Ceci jusqua obtenir |x1 x0| < , etant la pr ecision, x ee a ` lavance, que lon souhaite. Ecrire un programme appliquant cette m ethode a ` l equation cos(x) = x.

3.3
Lire des notes dans un chier puis calculer et acher le nombre de notes N, leur moyenne, la note minimale, la note maximale et l ecart type. Remarque: l ecart type est d eni par la relation:
N 1

=
i=0

(yi y )2 /(N 1)

o` u y repr esente la moyenne des yi .

IUP AISEM L2

TP Langage C

2004/2005

S eance 4

(switch, structures)

4.1
Ecrire un programme qui ache le nombre doccurences de chaque voyelle (a, e, i, o, u, y) contenues dans le chier /home/aisem/texte.txt (utiliser linstruction switch).

4.2
Le chier /home/aisem/etudiants.dat contient des couples: nom, num ero, le chier /home/aisem/notes.dat contient des couples: num ero, note. Ecrire un programme permettant de cr eer un chier resultats.dat contenant les couples: nom, note a ` partir des deux chiers pr ec edents. Algorithme sugg er e: D enir un tableau de structures contenant 3 membres: le nom (12 caract` eres) le num ero (un entier) la note (un entier) ouvrir le chier etudiants et remplir les deux membres des el ements du tableau correspondant (nom et num ero). Conservez le nombre d el ements du tableau (N). ouvrir le chier notes puis pour chaque couple lu dans le chier, chercher l el ement du tableau contenant le num ero lu et aecter la note correspondante. ouvrir le chier resultats (en ecriture) et ecrire dans le chier pour chaque el ement du tableau le nom et la note correspondants (une ligne par couple).

IUP AISEM L2

TP Langage C

2004/2005

S eance 5

Lobjectif de ce TP est d ecrire un programme de jeu de cartes: la bataille!. Dans cette version, on jouera avec un jeu de 32 cartes. Apr` es m elange et distribution des cartes a deux joueurs, chacun retourne la premi` ere carte de son tas. La carte la plus forte gagne la manche et les deux cartes sont mis en dernier dans le tas du gagnant. Lordre est: As, Roi, Dame, Valet, 10, 9, 8, 7. En cas d egalit e, la couleur la plus forte est gagnante dans lordre: Coeur, Pique, Carreau, Tr` ee. Le joueur qui ramasse toutes les cartes est d eclar e gagnant. Le programme fait appel a une structure pour repr esenter une carte dont les membres sont la valeur et la couleur. Les cartes de chaque joueur sont stock ees dans un tableau. Le squelette de programme suivant est fourni:
#include <stdio.h> #include <stdlib.h> typedef struct carte { int valeur; int couleur; } Carte; /*----------------------------------------------------------------*/ void initjeu(Carte jeu[]) /* remplit le tableau avec les 32 cartes */ {} /*----------------------------------------------------------------*/ int alea32() /* genere un entier aleatoire compris entre 0 et 31 */ { return 0; } /*----------------------------------------------------------------*/ void permutte(Carte *carte1, Carte *carte2) /* permutte 2 cartes */ {} /*----------------------------------------------------------------*/ void melange(Carte jeu[]) /* melange les cartes */ {} /*----------------------------------------------------------------*/ void affiche_carte(Carte X) /* affiche une carte (valeur,couleur)*/ {} /*----------------------------------------------------------------*/ void affiche(Carte jeu[],int N) /* affiche N cartes */ {} /*----------------------------------------------------------------*/ void distribution(Carte jeu[], Carte jeu1[], Carte jeu2[]) /* distribue les cartes aux deux joueurs */ {} /*----------------------------------------------------------------*/ void jouer1coup( Carte jeu1[], Carte jeu2[], int*N1, int*N2) /* gere le resultat dune bataille (1 coup) */ {} /*----------------------------------------------------------------*/ int main() { Carte jeu[32]; Carte jeu1[32]; /* cartes du joueur 1 */ Carte jeu2[32]; int N1=15; /* indice de la derniere carte joueur 1 */ int N2=15; initjeu(jeu); srand(12500); /* initialisation du g en erateur al eatoire */ melange(jeu); distribution(jeu,jeu1,jeu2);

11

IUP AISEM L2

TP Langage C

2004/2005

// {

while () /* tant que la partie nest pas terminee */

jouer1coup(jeu1,jeu2,&N1,&N2); } /* afficher qui gagne et en combien de coups */ return 0; }

Copier le dans votre r epertoire en tapant la commande suivante dans la fen etre terminal: cp /home/aisem/squelette.c le nom que vous voulez.c Il sagit de le compl eter en ecrivant le code des fonctions d enies.

5.1

Initialisation du jeu

Ecrire la fonction initjeu qui remplit le tableau jeu avec les 32 cartes ainsi que les fonctions dachage dune carte et du jeu entier. V erier le fonctionnement avant de passer a ` la suite.

5.2

M elange des cartes

Ecrire une fonction (alea32) qui renvoie un entier compris entre 0 et 31 (correspondant a ` un indice valide du tableau jeu). Ecrire une fonction permettant de permuter deux variables de type Carte. Utiliser ces deux fonctions pour ecrire la fonction de m elange des cartes. Lid ee est de r ealiser un nombre important (50 par exemple) de permutations entre deux cartes tir ees au hasard. V erier en lachant que le jeu est bien m elang e.

5.3

Distribution

Ecrire la proc edure permettant de distribuer 16 cartes a ` chaque joueur. On utilisera 1 tableau de 32 Cartes pour chaque joueur. Acher les 16 cartes de chacun des joueurs et v erier le bon fonctionnement.

5.4

Jeu de la carte

Voici la partie la plus d elicate du programme. Chaque joueur poss` ede N1 (ou N2) cartes indic ees de 0 a ` N1-1 (ou N2-1). La carte jou ee est celle dindice 0. Une solution consiste a ` mettre de cot e les cartes dindice 0 de chaque joueur puis a ` d ecaler toutes les cartes restantes de chaque joueur vers le bas (cartes 1 a ` N1-1 (ou N2-1) mises de 0 a ` N1-2 (ou N2-2)). Les deux cartes mises de cot e sont alors compar ees (valeur et eventuellement couleur) et rang ees dans le tas du gagnant aux positions N1-1 (pour la carte gagnante) et N1 si le joueur 1 gagne ou N2-1 et N2 si cest le joueur 2. Les valeurs de N1 et N2 doivent bien sur etre ajust ees en cons equence (+1 pour le gagnant, -1 pour le perdant). Tester le bon fonctionnement sur quelques coups du jeu en achant par exemple les cartes restantes des deux joueurs apr` es chaque coup.

5.5

Conclusion

Compl eter le programme principal en ecrivant la condition de n de partie. Acher le joueur gagnant et le nombre de coups jou es. On pourra aussi acher la succession des coups jou es.

12

IUP AISEM L2

TP Langage C

2004/2005

S eance 6

et 7
Les deux derni` eres s eances seront consacr ees aux th` emes vues en TD. On rappelle simplement les objectifs des programmes a ` ecrire.

6.1

Droite des moindres carr es

La droite des moindres carr es est une droite qui passe au mieux a ` travers un ensemble de points xi , yi . L equation de cette droite est donn ee par: y = ax + b avec: a= xy x.y x2 x
2

b=

y.x2 x.xy x2 x 2

Lobjectif est d ecrire un programme permettant de calculer et dacher la valeur de y = ax + b en fonction dune valeur de x rentr ee au clavier. On suppose que les points xi , yi sont contenus dans un chier et sont au maximum au nombre de 30.

6.2

Annuaire

Lexercice consiste a ` concevoir un logiciel de gestion dun annuaire bas e sur un tableau de structures. Les donn ees de lannuaire sont stock ees dans un chier. Les services oerts doivent permettre de: Lire le chier et stocker les donn ees dans un tableau Acher les ches Acher la che contenant un nom rentr e au clavier Ajouter une che dans la base Modier une che Supprimer une che (et r eorganiser le tableau!) Sauver les donn ees dans le chier. Tous ces services doivent etre accessibles a ` partir dun menu.

13

You might also like