131
INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C UE INF111 : Cahier de TP epartement de la Licence Sciences et Technologie Universit´ e Joseph Fourier - Grenoble Ann´ ee 2009/2010

INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

  • Upload
    vonga

  • View
    223

  • Download
    0

Embed Size (px)

Citation preview

Page 1: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

INTRODUCTION A UNIX ET A LA

PROGRAMMATION EN LANGAGE C

UE INF111 : Cahier de TP

Departement de la Licence Sciences et TechnologieUniversite Joseph Fourier - Grenoble

Annee 2009/2010

Page 2: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

Table des matieres

I INTRODUCTION A UNIX 3

1 Premier contact 41.1 Connexion a Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2 Configuration de XWin32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.3 Demarrer une session XWin32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.4 Connexion au systeme Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.5 Fin de la session de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.6 Terminal X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2 Prise en main detaillee 72.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.2 Session de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.3 La souris et les fenetres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.4 Le systeme d’exploitation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.5 L’editeur de texte nedit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.6 Le systeme de fichiers de Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.7 Compilation, Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.8 Revision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.9 Fin d’une session de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

3 Exercices 273.1 Exercice : application du cours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

4 L’essentiel a savoir 314.1 Editer un texte a partir d’Unix : NEdit . . . . . . . . . . . . . . . . . . . . . . . . 314.2 Transferer des fichiers entre votre compte et le compte de votre binome . . . . . . 314.3 Transferer des fichiers entre votre domicile et votre compte Unix au DLST . . . . . 314.4 Fichiers et repertoires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

II PROGRAMMATION EN C 33

5 Sujets de TP 345.1 Premiers programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345.2 Adibou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365.3 Le jeu du prix du lot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385.4 Tri par selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405.5 Le voyageur de commerce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445.6 Le jeu du taquin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465.7 Manipulation de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.8 Tri avec sous-programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525.9 L’editeur graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

1

Page 3: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

TABLE DES MATIERES TABLE DES MATIERES

6 Projets 596.1 Jeu d’echecs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596.2 Nuages de particules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626.3 Collisions de particules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646.4 Jeu de dames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676.5 Tout noir tout blanc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696.6 Clobber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

7 Resume de cours et exercices 737.1 TYPES, VARIABLES, ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737.2 Entrees, sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 787.3 IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 807.4 FOR, While . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827.5 Tab. 1D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857.6 Tab. 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 897.7 Pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

8 Annales 938.1 Examen 2004-2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 938.2 Examen 2005-2006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 998.3 Examen 2007-2008 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

9 Annexes 1129.1 Programmer chez soi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1129.2 Transfert de fichiers de compte a compte . . . . . . . . . . . . . . . . . . . . . . . . 1149.3 Transferts entre domicile et compte . . . . . . . . . . . . . . . . . . . . . . . . . . . 1159.4 Generation aleatoire de nombres entiers . . . . . . . . . . . . . . . . . . . . . . . . 1179.5 La bibliotheque graphsimple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1209.6 Fonctions de la libc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1259.7 Le preprocesseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1289.8 Bibliographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

2

Page 4: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

Premiere partie

INTRODUCTION A UNIX

3

Page 5: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

Chapitre 1

Premier contact

1.1 Connexion a Windows

Pendant tout le semestre vous travaillerez dans un environnement Unix, mais a partir depostes de travail de type PC fonctionnant sous Windows. Pour acceder a l’environnement Unixvous utiliserez un emulateur X Window. Le nom de l’emulateur X Window utilise au DLST estXWin32.Vous devez donc tout d’abord ouvrir une session Windows en saisissant une premiere fois votreidentifiant d’utilisateur et votre mot de passe. Ces deux informations sont inscrites sur votre feuilled’inscription. Vous devrez ensuite demarrer le programme XWin32, puis vous connecter au serveurUnix en saisissant une seconde fois votre identifiant et votre mot de passe. En fin de session vousdevrez vous deconnecter du systeme Unix puis fermer votre session Windows.Pour ouvrir une session Windows, effectuez les actions suivantes :

1. Remplissez les trois champs de la fenetre d’identification :

Utilisateur : durand

Mot de passe : ********

Domaine : E

ATTENTION : pour passer d’un champ a l’autre utiliser la touche la touche→← (“Tabulation”)

situee a gauche du clavier, ou bien cliquer avec la souris dans le champ a remplir.

2. Cliquez sur le bouton graphique OK , ou bien tapez sur la touche “Entree”.

Une fois la session Windows ouverte :– si vous n’avez jamais configure XWin32, suivez les instructions donnees en section 1.2– sinon, demarrer le programme XWin32 (cf. section 1.3).

1.2 Configuration de XWin32

La configuration du programme XWin32 (l’emulateur X Window) doit etre effectuee une foiset une seule pour chaque etudiant :

– dans le menu Demarrer choisir Tous les programmes , puis X-Win32 , puis X-Config : la

fenetre de configuration de XWin32 s’ouvre.

– cliquer sur le bouton Ajouter

– cliquer sur + Mes sessions en haut de la partie gauche de la fenetre du programme XConfig,

puis sur Autostart .

– cliquer sur le bouton Manuel : une fenetre de choix s’ouvre. Son nom est “Methode deconnexion”.

4

Page 6: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

1.3. DEMARRER UNE SESSION XWIN32 CHAPITRE 1. PREMIER CONTACT

– dans la fenetre“Methode de connexion”, choisir“XDMCP”puis cliquer sur le bouton Suivant .La fenetre de choix se referme, une fenetre de dialogue s’ouvre.

– dans le champ “Nom de la session”, taper : gallien– dans le champ “Hote”, taper : gallien– dans le champ “Mode XDMCP”, remplacer l’option “Diffuser” par l’option “Interroger”

– cliquer sur le bouton Enregistrer : la fenetre de dialogue se referme.

– cliquer sur le bouton Lancer : la fenetre de connexion au systeme Unix s’affiche.

– cliquer sur le bouton OK pour terminer le programme XConfig.

Pour vous connecter a Unix, suivez a present les instructions donnees en section 1.4.

1.3 Demarrer une session XWin32

Verifiez si le programme XWin32 n’est pas deja actif : la presence d’un icone X dans la barredes taches de Windows, en bas et a droite de l’ecran, indique que le programme est deja actif etque vous pouvez demarrer une nouvelle session Unix. Dans le cas contraire, le programme XWin32est inactif et doit etre demarre au prealable.

1.3.1 Demarrage du programme XWin32

Hypothese : le programme XWin32 est inactif (aucun icone X dans la barre des taches).

– Dans le menu Demarrer choisir Tous les programmes , puis X-Win32 , puis X-Win32 : la

fenetre de connexion au systeme Unix s’affiche.– Vous pouvez a present vous connecter au serveur Unix : suivez les instructions donnees en

section 1.4.

1.3.2 Demarrage d’une nouvelle session Unix

Hypothese : le programme XWin32 est demarre mais aucune session Unix n’est en cours.

– Cliquer avec le bouton droit de la souris sur l’icone X situe dans la barre des taches deWindows, en bas et a droite de l’ecran.

– Sans relacher le bouton de la souris, choisir ensuite Autostart puis gallien : la fenetre de

connexion au systeme Unix s’affiche.

1.4 Connexion au systeme Unix

Pour etablir une connexion Unix au serveur gallien remplir les champs “login” et “Password”dans la fenetre de connexion :

Debian GNU/Linux (gallien)

Login : durand

Password : |

Debian

5

Page 7: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

1.5. FIN DE LA SESSION DE TRAVAIL CHAPITRE 1. PREMIER CONTACT

– Dans le champ “Login” : taper votre identifiant d’utilisateur puis la touche Entree (ou la

touche Entr ).

– Dans le champ “Password” : taper votre mot de passe puis la touche Entree .Attention : il est normal qu’aucun caractere (pas meme des “*”) ne s’affiche dans le champ“Password” lorsque vous saisissez votre mot de passe.

REMARQUE : Vous ne devez utiliser ni les touches du pave numerique, a droite du clavier, ni latouche “Verrouillage Majuscule” (ou “Verr Maj”, ou representant un petit cadenas), a gauche duclavier :

– Pour taper une LETTRE MAJUSCULE, appuyez sur la touche “Majuscule” (ou “Shift”, ou⇑) situee a gauche du clavier, puis, tout en maintenant cette touche appuyee, taper sur latouche correspondant a la lettre que vous voulez obtenir.

– Pour taper un CHIFFRE, appuyez sur la touche “Majuscule”, puis, tout en maintenant cettetouche appuyee, taper sur la touche correspondant au chiffre que vous voulez obtenir, dansla rangee de touches situee en haut du clavier.

Lorsque la connexion au systeme Unix est etablie, une fenetre representant une console de com-mande s’affiche sur l’ecran.

1.5 Fin de la session de travail

Pour terminer votre session de travail, vous devez quitter Unix et Windows :– Pour quitter Unix, taper la commande “exit” dans la console de commande.

Remarque : la session Unix est fermee, mais le programme XWin32 est toujours actif ; une

nouvelle session Unix peut etre demarree en cliquant sur l’icone X dans la barre des tachesde Windows, a droite (voir paragraphe 1.3.2 page 5).

– Pour quitter Windows, cliquer sur le menu Demarrer , puis choisir Arreter .

1.6 Terminal X

Certaines salles du DLST sont equipees de terminaux X en lieu et place de PC. Un terminalX est une machine tres depouillee, pourvue d’un ecran, d’une souris et d’un clavier. Ce type demachine permet de se connecter aux serveurs du DLST (gallien, par exemple), de la facon suivante :

– Mettre le terminal sous tension (bouton marche/arret). Le terminal charge depuis le reseaule programme qui lui permettra de communiquer avec les serveurs.

– Apres mise sous tension, une fenetre d’accueil identique a celle indiquee en section 1.4 ci-dessus s’affiche au centre de l’ecran. Cette fenetre comporte les champs “Login” et “Pass-word” permettant de s’identifier. La connexion s’effectue selon la procedure decrite dans lasection 1.4. Lorsque la connexion au systeme Unix est etablie, une fenetre representant uneconsole de commande s’affiche sur l’ecran.

– Pour terminer la session de travail et se deconnecter du serveur Unix, taper la commande“exit” dans la console de commande.

6

Page 8: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

Chapitre 2

Prise en main detaillee

2.1 Introduction

2.1.1 Votre premier TP : le TP1

La premiere seance de TP a pour but de vous familiariser avec l’environnement de travail informa-tique au DLST. Cette partie du polycopie est a la fois un guide pour cette seance et un documenta consulter lorsque par la suite vous ne saurez plus comment realiser telle ou telle operation. Ilvous est demande de lire la brochure et de realiser les manipulations indiquees. Celles ci appa-raissent dans des encadres. Elles sont decrites avec precision, ce qui permet de les realiser sansgrande difficulte. Ces manipulations sont celles dont vous aurez le plus souvent besoin tout au longdes seances de travaux pratiques ; il est donc important d’en comprendre l’utilite et de savoir lesrealiser.La durees de la seance est largement suffisante pour realiser et comprendre les manipulationsdemandees. Si vous n’arrivez pas a realiser l’une d’elles, ou bien si vous ne comprenez pas lesexplications donnees, ne passez pas outre, demandez de l’aide a votre enseignant.A la fin de cette seance vous devriez savoir effectuer seul les operations suivantes :– vous connecter a votre poste de travail et au serveur Unix,– manipuler des objets dans votre arborescence de fichiers,– creer et modifier un fichier texte,– compiler et executer des programmes,– terminer une session de travail.

2.1.2 Notations

Dans le langage de tous les jours, la phrase : “Ecrivez votre nom” indique bien entendu qu’il fautecrire le texte “Pierre Durand” (par exemple), et non pas le texte “votre nom”. Dans ce polycopie,ce type d’ambiguite sera elimine a l’aide des notations suivantes :

1. Ce qui est ecrit avec une police de caracteres a largeur constante, comme ceci, appartientau langage utilise et doit etre interprete tel quel.

2. ce qui est ecrit entre < et >, <comme cela>, appartient a un meta-langage et doit etreremplace par un element de votre choix dependant du contexte.

Exemple : La consigne : “taper rm <nom-de-fichier>”, indique que le mot rm doit etre tape telquel, alors que <nom-de-fichier > doit etre remplace par un nom de votre choix.

Les touches du clavier seront en general designees par le nom ou le symbole inscrit sur chacuned’elles (par exemple la touche “Fin”, ou bien la touche ↑). Toutefois, l’appui sur la touche “Entree”etant extremement frequent, il sera denote (represente) le plus souvent par le symbole ← .

7

Page 9: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.2. SESSION DE TRAVAIL CHAPITRE 2. PRISE EN MAIN DETAILLEE

2.2 Debut d’une session de travail

Apres vous etre connecte sous Windows et avoir lance l’emulateur XWin32, ou bien apres avoirmis en marche votre terminal X, vous devez voir apparaıtre sur votre ecran la fenetre suivante :

Debian GNU/Linux (gallien)

Login : |

Password :

Debian

La barre verticale juste apres le mot “Login :” indique que vous devez saisir votre identifiant deconnexion :

Tapez votre identifiant de connexion, suivi de ← , puis tapez votre mot de passe, toujourssuivi de ← .

ATTENTION

1. Une lettre minuscule n’est pas equivalente a la lettre majuscule correspondante.

2. Le caractere - (“moins”) est different du caractere _ (“souligne”)

3. Vous ne devez utiliser ni les touches du pave numerique, a droite du clavier, ni la touche“Verrouillage Majuscule” (ou “Caps Lock”, ou representant un petit cadenas), a gauche duclavier :– Pour taper une LETTRE MAJUSCULE, appuyez sur la touche “Majuscule” (ou ⇑) situee

a gauche du clavier, puis, tout en maintenant cette touche appuyee, taper sur la touchecorrespondant a la lettre que vous voulez obtenir.

– Pour taper un CHIFFRE, appuyez sur la touche “Majuscule”, puis, tout en maintenantcette touche appuyee, taper sur la touche correspondant au chiffre que vous voulez obtenir,dans la rangee de touches situee en haut du clavier.

4. Il est normal qu’aucun caractere (pas meme des“*”) ne soit affiche dans le champ“Password”lorsque vous saisissez votre mot de passe. . .

Une fenetre s’est affichee sur l’ecran. Votre session de travail est commencee.

2.3 La souris et les fenetres

Vous disposez d’un poste de travail (PC ou terminal X) muni d’un ecran, d’un clavier et d’unesouris. L’ecran, le clavier et la souris sont des “peripheriques” du poste de travail : ils vous perme-ttent d’echanger des informations (c’est a dire de communiquer) avec votre poste de travail, et audela avec les serveurs Unix du DLST.

8

Page 10: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.4. LE SYSTEME D’EXPLOITATION CHAPITRE 2. PRISE EN MAIN DETAILLEE

2.3.1 La souris

Faites glisser la souris sur votre table.

Vous remarquez sur l’ecran un symbole en forme de fleche qui effectue les memes deplacementsque votre souris sur la table. On appelle ce symbole le “pointeur” (ou curseur) de la souris.La souris permet de deplacer le pointeur sur l’ecran, de “cliquer”(c’est a dire appuyer puis relacherl’un des boutons de la souris) pour designer une zone precise sur l’ecran.La souris dont vous disposez comporte (en principe) trois boutons :– Le bouton de gauche est le bouton dont on se sert le plus souvent. Il permet de designer

(“selectionner”) un objet graphique sur l’ecran (l’objet se trouvant sous le pointeur), et luiappliquer une action, par exemple derouler un menu.

– Les deux autres boutons permettent d’effectuer des actions complementaires dont la naturedepend du logiciel utilise et du contexte dans lequel ces boutons seront manoeuvres.

Remarques :

1. Pour simplifier, dans la suite du document, quand il est demande de “cliquer” sans autreprecision, il s’agit de cliquer avec le bouton gauche de la souris. Dans le cas contraire, lebouton a cliquer sera precise.

2. Veillez a bien laisser desactivee la touche “Verrouillage Majuscule” (ou “Verr Maj”, ourepresentant un petit cadenas), a gauche du clavier, pour un bonne execution des actionseffectuees au moyen de la souris (le voyant “Verr Maj”, ou “Caps Lock”, en haut et a droitedu clavier doit etre eteint).

2.3.2 Les fenetres

Une fenetre est une zone rectangulaire de l’ecran permettant a l’utilisateur de communiquer avecson poste de travail, ou comme au DLST avec un serveur distant. Cette zone de communicationva vous permettre d’une part d’envoyer des commandes a l’ordinateur auquel vous etes connecte(gallien), et d’autre part de recevoir et visualiser les resultats produit par chaque commande.La fenetre qui s’ouvre en debut de session est appelee “fenetre xterm”.Pour travailler confortablement, il faut pouvoir deplacer une fenetre, changer ses dimensions, ouencore la reduire a l’etat d’icone (on dit “iconifier”) :

Cliquez dans la barre superieure de la fenetre et, tout en maintenant appuye le bouton gauche,deplacez la souris. La fenetre doit se deplacer en suivant les mouvements de la souris.

La partie droite de la barre de fenetre contient deux (ou trois) boutons graphiques. Cliquezsur celui le plus a gauche pour reduire la fenetre. Cette derniere est a present remplacee parune icone qui apparaıt soit dans la barre des taches de Windows (cas du PC + XWin32), soitsur l’un des cotes de l’ecran (cas des terminaux X).Pour rendre a nouveau visible la fenetre et lui rendre sa taille normale, cliquez une fois surl’icone.

Cliquez sur un cote de la fenetre (le pointeur de la souris doit prendre la forme d’un trait) puisdeplacez legerement la souris tout en maintenant le bouton gauche appuye. La largeur ou lahauteur de la fenetre doit s’agrandir ou se rapetisser, selon le cote choisi et selon le mouvementde la souris.

2.4 Le systeme d’exploitation

Le logiciel charge de gerer la machine a laquelle vous vous connectez (gallien) lorsque vousdebutez une seance de travail est le systeme Unix. Ce logiciel appele “systeme d’exploitation” apour role de vous donner acces aux ressources de la machine (memoire, processeur, disques) envous fournissant un certain nombre de services. Ces services sont demandes par l’utilisateur sous la

9

Page 11: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.4. LE SYSTEME D’EXPLOITATION CHAPITRE 2. PRISE EN MAIN DETAILLEE

forme de commandes qui seront decodees (interpretees) et activees (executees) par un interpreteurde commandes. L’interpreteur de commandes est une partie du systeme d’exploitation.

2.4.1 Notion de commande

Certaines commandes, particulierement simples, ne necessitent pour etre activees, que la frappede leur nom sur le clavier.Unix comporte une commande permettant d’afficher la date et l’heure. Cette commande porte lenom de date.

Activez-la en tapant sur votre clavier : date←

La reponse (en principe en francais) s’interprete sans peine.

2.4.2 Notion d’interpreteur de commandes

L’interpreteur de commandes est un programme qui realise les operations suivantes :

1. ecriture sur l’ecran d’une “invite”, c’est a dire d’une invitation a taper une commande : ils’agit d’une courte chaıne de caracteres, parfois reduite a un seul caractere, le caractere $ ou% par exemple.

2. attente d’une ligne tapee au clavier par l’utilisateur et terminee par ← .

3. interpretation du premier mot de la ligne comme etant le nom d’une commande. Les motssuivants, s’il y en a, sont interpretes comme etant des arguments (ou parametres) de lacommande, c’est a dire des informations complementaires requises pour l’execution de cettederniere.

4. execution de la commande tapee.

5. retour a l’etape numero 1.

Que se passe-t-il si l’utilisateur tape un nom de commande incorrect ?

Tapez par exemple : xyz32←

Memorisez bien le message d’erreur : c’est celui que vous donnera l’interpreteur de commandesa chaque fois que vous taperez quelque chose qui ne correspond a aucune commande connue (ouvalide).

Certaines commandes sont un peu plus complexes : il faut taper leur nom, mais aussi fournir desparametres (ou arguments).Unix comporte une commande, nommee cal, permettant d’afficher le calendrier d’un mois quel-conque d’une annee comprise entre 0 et 9999. Pour qu’elle puisse etre executee, il faut evidemmentfournir a cette commande deux parametres : les numeros du mois et de l’annee choisis.

Pour vous familiariser avec son emploi, tapez par exemple :cal 2 1988←puis faites afficher le mois de votre naissance.

2.4.3 L’aide en ligne : commande man

Le systeme Unix offre une aide en ligne pour chacune des commandes qu’il propose. Pour obtenircette aide il suffit de taper la commande man suivie du nom de la commande pour laquelle on veutobtenir de l’aide.La commande man affiche a l’ecran la documentation Unix (en principe en francais...).

10

Page 12: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.4. LE SYSTEME D’EXPLOITATION CHAPITRE 2. PRISE EN MAIN DETAILLEE

Tapez par exemple : man cal ←puis : man man←

Appuyez sur la barre d’espace pour faire defiler les pages successives.Pour terminer la commande man tapez sur la touche Q.

2.4.4 Configurer votre environnement de travail

Avant de poursuivre ce premier TP, vous devez configurer un certain nombre de parametres dusysteme, de facon a pouvoir dans la suite travailler dans les meilleures conditions de “confort”possible.Pour cela, vous devez executer, une fois pour toutes, la commande :

source /Public/INF111/config.sh←

ATTENTION ! : Chacun des membres d’un binome d’etudiants doit executer cette commande unefois (et une seule) lors de sa premiere connexion a Unix.

2.4.5 Notions de fichier et de repertoire

Ces notions seront developpees en section 2.6. Un ordinateur est utilise principalement pour pou-voir :

1. traiter des informations

2. conserver ces informations

3. communiquer avec d’autres ordinateurs

Les paragraphes qui suivent concernent la fonction de conservation de l’information.Un utilisateur pouvant conserver une quantite considerable d’informations sur un ordinateurdonne, il n’est pas possible de les ranger “en vrac”, il faut structurer l’ensemble de ces infor-mations.La solution informatique a ce probleme repose sur le concept de fichier. Un fichier peut etre vucomme un conteneur d’informations.A tout instant, chaque utilisateur d’un systeme Unix detient un ensemble de fichiers, memorisesdans l’ordinateur.

Des qu’on gere un grand nombre de fichiers, le meme probleme de classement se pose a nouveau,cette fois-ci non plus au niveau de informations elementaires, mais au niveau des fichiers.Les repertoires (en anglais : “directory”) permettent de classer les fichiers. Un repertoire est destinea contenir des fichiers, mais il peut aussi contenir d’autres repertoires.

2.4.6 Recuperer un premier ensemble de fichiers

Pour effectuer la suite de ce TP, vous aurez besoin d’un ensemble de fichiers exemples que vousallez recuperer en tapant les commandes suivantes :

sh /Public/INF111/tp1/tp1.sh←cd INF111/TP1←

2.4.7 Commandes de manipulation des fichiers

Vous allez decouvrir a present les services que peut rendre le systeme Unix concernant la manip-ulation des fichiers.

11

Page 13: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.4. LE SYSTEME D’EXPLOITATION CHAPITRE 2. PRISE EN MAIN DETAILLEE

Visualiser vos repertoires et vos fichiers : commande dtree

La commande dtree (abbreviation de “directory tree”) affiche une figure representant l’arbre desrepertoires et fichiers contenus dans le repertoire courant.

Tapez : dtree←

La figure suivante est affichee. Cette figure represente les repertoires presents dans le repertoirecourant (TP1) :

|-TP1-|-courrier---

|-programmes-

Tapez : dtree -a←

La figure affichee represente cette fois-ci les repertoires mais aussi les fichiers presents dans lerepertoire TP1 :

|-asupprimer

|-chap1

|

| |-lettre1

|-courrier---|-lettre2

| |-lettre3

| |-lettre4

|-curriculum

|

|-TP1-| |-boucle.c

| |-boucle.p

| |-donneespgcd

| |-exo1.c

|-programmes-|-exo2.c

|-pgcd1.c

|-pgcd1.p

|-pgcd2.c

|-pgcd2.p

Lister les noms des fichiers : commande ls

La commande ls (abreviation de list) permet d’afficher la liste des noms des fichiers et repertoirespresents dans le repertoire courant.

Tapez : ls ←

Le systeme doit vous repondre par une liste des noms des fichiers et des repertoires presents dansle repertoire courant :

asupprimer chap1 courrier/ curriculum programmes/

Voir le contenu d’un fichier texte : commandes less et more

L’execution des commandes dtree -a et ls, vous a permis de constater qu’un fichier de nomchap1 se trouve dans le repertoire courant. La commande less (ou alternativement la commandemore) permet d’examiner le contenu d’un fichier. Il est evidemment necessaire de specifier le nomdu fichier dont vous voulez voir le contenu :

12

Page 14: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.4. LE SYSTEME D’EXPLOITATION CHAPITRE 2. PRISE EN MAIN DETAILLEE

Tapez : less chap1←

Le debut du fichier s’affiche sur votre ecran. Vous pouvez alors effectuer plusieurs types d’actionpermettant de visualiser le contenu du fichier. Les principales actions sont :– touche ↓, pour faire apparaıtre une ligne supplementaire du fichier,– touche ↑, pour revenir en arriere d’une ligne,– touche / suivie d’un mot, pour rechercher ce mot,– touche N (abbreviation de “Next”), pour chercher le prochain exemplaire du meme mot,– bien d’autres possibilites encore (voir man less)...

Effectuez chacune de ces actions tour a tour pour constater leur effet.Pour arreter l’execution de less, tapez sur la touche Q (abbreviation de “Quit”).

Contrairement a ce que semble indiquer son nom, la commande more est moins puissante que lacommande less. Les actions possibles sont :– touche F (abbreviation de “Forward”) ou appui sur la barre d’espacement, pour avancer d’une

page,– touche B (abbreviation de “Backward”), pour revenir en arriere d’une page,– touche “Entree” (ou “Entr”), pour avancer d’une ligne,– touche Q, pour arreter l’execution de more.

Voir le contenu d’un fichier texte de petite taille : commande cat

La commande cat est tres utile pour afficher le contenu d’un fichier ne contenant que quelqueslignes.

Verifiez au moyen de la commande ls que vous possedez un fichier qui porte le nomasupprimer.Tapez : cat asupprimer←

La totalite du contenu du fichier est affiche sur votre ecran.

Detruire un fichier : commande rm

Quand on ne desire plus conserver un fichier, on peut le supprimer a l’aide de la commande rm

(abbreviation de “remove”).

Detruisez le fichier asupprimer en tapant la commande : rm asupprimer←A la question vous demandant si vous souhaitez bien detruire le fichier indique, repondez entapant sur la touche O (“oui”) ou sur la touche Y (“yes”).Utilisez a nouveau ls pour verifier que le fichier a bien disparu.

Attention ! : Un fichier supprime ne peut plus etre recupere.Il faut donc bien reflechir a ce que l’on s’apprete a faire avant chaque utilisation de la commanderm. . .

Copier un fichier : commande cp

La commande cp (abbreviation de“copy”) permet de creer une copie d’un fichier. Cette commandeest utilisee par exemple pour sauvegarder le contenu d’un fichier avant modification de ce dernier.Deux arguments sont requis : le nom du fichier original, et le nom de la copie.

Tapez : cp chap1 copie-chap1←Utilisez la commande ls pour verifier qu’un nouveau fichier de nom copie-chap1 a bien etecree. Executez ensuite la commande less pour verifier que son contenu est bien le meme quecelui du fichier chap1.

13

Page 15: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.5. L’EDITEUR DE TEXTE NEDIT CHAPITRE 2. PRISE EN MAIN DETAILLEE

Changer le nom d’un fichier : commande mv

La commande mv (abbreviation de “move”) permet de changer le nom d’un fichier1. Comme lacommande cp, elle requiert deux arguments : le nom original du fichier, et son nouveau nom.

Donnez un nouveau nom (par exemple : copie2-chap1) au fichier que vous avez cree lors dela manipulation precedente en tapant :mv copie-chap1 copie2-chap1←Utilisez les commandes ls et less pour verifier que la manipulation s’est bien deroulee.

Imprimer un fichier texte : commande a2ps

Pour imprimer un fichier contenant du texte il suffit d’emettre la commande :a2ps < nom de fichier > ←ou < nom de fichier > designe le fichier a imprimer.

N’imprimez aucun fichier pour l’instant.

2.4.8 Exercice

– Observez le contenu du fichier chap1.– Comparez ce contenu avec le debut de ce poly.– Cherchez la page de ce poly qui correspond a la fin du fichier chap1.– Modififez le nom de la copie de chap1 que vous avez creee precedemment :

1. Creez une nouvelle copie du fichier chap1 nommee chap1.copie.

2. Supprimez la premiere copie.

– Changez le nom de chap1.copie en chap1.sauv, sans effectuer de copie.

2.5 L’editeur de texte nedit

2.5.1 Notion d’editeur de texte

Un fichier texte est un fichier contenant des caracteres affichables (et imprimables) : lettres, chiffres,caracteres de ponctuation. Pour creer ou modifier un fichier texte, on doit utiliser un programmeediteur de texte. Il existe de nombreux editeurs de texte. Celui qui est utilise sur les serveurs Unixdu DLST a pour nom nedit.Une session d’edition de texte se deroule de la facon suivante :– Demarrage de l’editeur : l’execution de l’editeur est demarree au moyen d’une commande ap-

propriee tapee dans la fenetre xterm.– Creation / ouverture du fichier : si le fichier edite n’existait pas auparavant, il faut le creer.

Sinon, il faut ouvrir le fichier.– Insertion de texte : la plupart des editeurs de texte sont par defaut en mode insertion : tous les

caracteres tapes au clavier sont enregistres.– Modification de texte : tout editeur dispose d’un certain nombre de commandes ou operations

permettant de modifier le texte d’un fichier. Celles fournies par l’editeur nedit sont presenteesdans les sections qui suivent.

– Sauvegarde du fichier : un editeur utilise une zone de la memoire qui lui est propre (appelee“tampon” ou “buffer” d’edition). Le texte cree ou modifie par l’utilisateur est memorise parl’editeur dans son tampon d’edition. Cette zone memoire est creee au demarrage de l’editeur etest detruite lorsque l’execution de l’editeur se termine. Il est donc indispensable de sauvegarderdans le fichier concerne le texte contenu dans le tampon d’edition, au plus tard avant la fin dela session d’edition.

1Le mot “move” s’explique par le fait que la commande mv a d’autres utilisations possibles qui seront presentees

ulterieurement.

14

Page 16: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.5. L’EDITEUR DE TEXTE NEDIT CHAPITRE 2. PRISE EN MAIN DETAILLEE

2.5.2 Creer et sauvegarder un nouveau fichier

A l’aide de la commande ls (ou de la commande dtree -a) verifiez que vous ne disposez pas d’unfichier dont le nom est monfichier.

Tapez la commande : nedit monfichier &←

Une fenetre d’edition s’ouvre. Cette fenetre est vide, elle va servir a editer (a creer) le fichiermonfichier qui n’existe pas encore.

Remarque : le caractere & a la fin de la commande vous permet de continuer a executer des com-mandes dans la fenetres Unix tout en travaillant dans la fenetre graphique de nedit.L’absence de ce caractere aurait pour effet de “bloquer” la fenetre xterm jusqu’a ce que la fenetrenedit soit refermee.

Vous disposez donc maintenant de 2 fenetres : une fenetre nommee xterm dans laquelle vous pouvezexecuter des commandes Unix, et une fenetre d’edition de texte. Vous pouvez travailler dans cesdeux fenetres simultanement.

Positionner les fenetres

Mettez vous dans de bonnes conditions de travail en faisant en sorte que vos 2 fenetres (xtermet nedit) soient assez grandes et ne se recouvrent pas totalement. Pour pouvoir travailler dansune fenetre, il faut qu’elle soit active : cliquez dans la fenetre nedit.

Notez qu’une barre de menus se trouve tout en haut de la fenetre de nedit. Cette barre de menus

rassemble les menus File , Edit , Search , etc. . .

Creer du texte

Tapez plusieurs lignes de texte dans la fenetre d’edition.

Sauvegarder du texte

Pour sauvegarder le texte tape, il faut selectionner la commande Save dans le menu File .

Sauvegardez votre texte.Dans la fenetre xterm verifiez a l’aide de la commande ls qu’un fichier nomme monfichier aete cree.

Le fichier monfichier a ete cree dans le repertoire de travail courant, c’est a dire dans le repertoirea partir duquel vous avez invoque la commande nedit. C’est ainsi que vous pourrez creer les fichierscontenant les programmes que vous aurez a ecrire par la suite.

2.5.3 Modifier du texte

Executez la commande ls dans la fenetre xterm, et verifiez que vous disposez bien dans le reper-toire courant d’un fichier nomme chap1. Vous allez a present effectuer des manipulations sur lecontenu de ce fichier existant.

Selectionnez la commande Open du menu File . L’editeur ouvre une fenetre ou sont affiches

les noms de vos fichiers.Cliquez sur chap1, puis dans le bouton graphique OK .

Le debut du fichier chap1 est affiche dans la fenetre nedit.Vous devez voir clignoter au debut de la premiere ligne du fichier un symbole ressemblant a unI : ce symbole indique le “point d’insertion”, c’est a dire le point du texte ou seront ajoutes les

15

Page 17: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.5. L’EDITEUR DE TEXTE NEDIT CHAPITRE 2. PRISE EN MAIN DETAILLEE

prochains caracteres tapes au clavier.

L’editeur ouvre une nouvelle fenetre a chaque execution de la commande Open du menu File .

Il est donc possible d’editer plusieurs fichiers en meme temps.

Defilement du texte

La fenetre de nedit dispose sur sa droite d’un dispositif graphique appele barre de defilement ou“ascenseur”. Cette barre de defilement represente une “glissiere” dans laquelle peut se deplacer uncurseur.

Faites defiler le texte dans la fenetre en utilisant la barre de defilement :Amenez le pointeur de la souris sur le curseur de la barre de defilement et cliquez sur le boutongauche.Tout en maintenant le bouton gauche de la souris appuye, faites glisser le curseur de haut enbas. Le texte doit se deplacer dans la fenetre.Apres quelques deplacements, replacez le curseur tout en haut de la barre de defilement, defacon a voir le debut du texte.

Deplacement du point d’insertion

La modification (ou l’ajout) de texte se fait toujours a partir du point d’insertion.

Deplacez le point d’insertion a l’aide des touches →, ←, ↓ et ↑.Deplacez le point d’insertion en cliquant directement sur un autre point du texte dans lafenetre d’edition.

Recherche d’une ligne de numero donne

Il est souvent commode de pouvoir placer le point d’insertion au debut d’une ligne dont on connaitle numero.

Selectionnez la commande Goto Line Number. . . du menu Search . Composez le numero de laligne cherchee, 95 par exemple, dans la fenetre qui est apparue. Cliquez sur le bouton graphique

OK , ou tapez ← . Verifiez que le point d’insertion est a present place sur la ligne voulue.

Recherche d’un mot

Il est souvent necessaire de rechercher un mot precis (on dit aussi : une “chaıne de caracteres”)dans un texte donne, par exemple pour remplacer ce mot par un autre mot.

Placez le point d’insertion au debut du fichier.

Selectionnez la commande Find du menu Search . Une fenetre s’ouvre.

Tapez le texte a rechercher, le mot “programme”par exemple, puis cliquer sur le bouton Find

ou tapez ← .Verifiez que le point d’insertion est maintenant positionne a la fin du premier exemplaire dumot recherche ; remarquez que l’exemplaire trouve est d’une couleur differente de celle desmots qui l’entourent : on dit que le mot trouve est “selectionne”.

La fenetre de recherche presente differentes options. Parmi elles les options “Search Forward” et“Search Backward” permettent de determiner le sens de la recherche : en avant (c’est a dire versla fin du fichier) ou en arriere (c’est a dire vers le debut du fichier).

16

Page 18: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.5. L’EDITEUR DE TEXTE NEDIT CHAPITRE 2. PRISE EN MAIN DETAILLEE

Remplacement d’un mot par une autre

Il s’agit d’une action complementaire de celle qui vient d’etre presentee :

Selectionnez la commande Replace. . . du menu Search . Une autre fenetre s’ouvre ; examinez

son contenu (options et boutons) pour en comprendre le fonctionnement, puis essayez deremplacer tous les exemplaires du mot “clavier” par le mot “keyboard” (par exemple).

Annulation de la derniere commande executee

Il est toujours possible d’annuler l’effet de la derniere commande executee, au moyen de la com-

mande Undo du menu Edit .

Suppression d’un caractere, d’un mot, d’une ligne, d’un paragraphe

– Supprimer un caractere : placez le point d’insertion juste apres le caractere a supprimer ettapez sur la touche← (en haut du clavier). Retapez ensuite le caractere supprime (ou bienannulez l’action de suppression executee).

– Supprimer un bloc de texte selectionne au moyen de la souris : selectionnez une partie devotre texte avec la souris. A cet effet, cliquer au debut du texte a supprimer, puis faitesglisser la souris vers la droite jusqu’a la fin de ce texte, tout en maintenant le bouton gauche

appuye. Choisissez ensuite la commande Delete du menu Edit , ou plus simplement tapezsur la touche←.

Autres operations d’edition

– Scinder une ligne en deux : placez le point d’insertion sur la ligne concernee, a l’emplacementprecis ou vous avez choisi de la scinder. Tapez ← .Pour annuler la scission, tapez sur la touche← (en haut du clavier).

– Concatener deux lignes consecutives : Placez le point d’insertion apres la premiere ligne,juste avant le premier caractere de la seconde ligne. Tapez sur la touche←.

– Deplacement d’un bloc de lignes : Il arrive frequemment que l’on veuille deplacer un bloc deplusieurs lignes consecutives, d’un endroit du fichier vers un autre.

Selectionnez un bloc de lignes avec la souris, puis choisissez la commande Cut du menu

Edit : les lignes selectionnees disparaissent, elles ont ete“coupees”et placees dans un“presse-papier” virtuel (dans la memoire de l’editeur). Placez ensuite le point d’insertion a l’endroit

ou vous voulez “coller” ces lignes, puis selectionnez la commande Paste du menu Edit : leslignes coupees re-apparaissent a l’endroit choisi, elles ont ete retrouvees par l’editeur dansle presse-papier et collees a cet endroit.

– Duplication (copie) d’un bloc de lignes : Selectionnez avec la souris un bloc de lignes a copier,

puis choisissez la commande Copy du menu Edit : les lignes selectionnees ont ete copiees

par l’editeur dans son presse-papier. Placez ensuite le point d’insertion a l’endroit ou vous

voulez ajouter les lignes copiees, puis selectionnez la commande Paste du menu Edit : leslignes copiees apparaissent a l’endroit choisi (elles ont ete copiees a cet endroit par l’editeurdepuis son presse-papier).

Annuler toutes les modifications effectuees

Lorsqu’on est satisfait des modifications appliquees au contenu d’un fichier, il faut les sauvegarder(voir section 2.5.2).Dans certains cas par contre, on souhaite annuler toutes les modifications effectuees depuis l’ou-verture du fichier (ou bien depuis la derniere sauvegarde effectuee). Supposons par exemple, que

17

Page 19: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.5. L’EDITEUR DE TEXTE NEDIT CHAPITRE 2. PRISE EN MAIN DETAILLEE

l’on souhaite eliminer toutes les modifications appliquees au fichier courant, le fichier chap1, et re-afficher ce fichier dans l’etat ou il se trouvait initialement (c’est a dire au debut de la section 2.5.3).

Pour revenir a la version initiale du fichier chap1, selectionnez la commande Revert to Saved

du menu File . L’editeur ouvre une fenetre d’alerte vous signalant que des modifications nonsauvegardees seront perdues si vous confirmez votre demande.

Cliquez sur le bouton OK pour eliminer les modifications effectuees et revenir a la versionprecedente du fichier.

2.5.4 Quitter l’editeur

Pour fermer une seule fenetre de l’editeur, choisir la commande Close du menu File de cettefenetre.Pour fermer toutes les fenetres d’edition et quitter nedit, selectionnez la commande Exit du

menu File .

18

Page 20: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.6. LE SYSTEME DE FICHIERS DE UNIX CHAPITRE 2. PRISE EN MAIN DETAILLEE

2.6 Le systeme de fichiers de Unix

2.6.1 Organisation des fichiers sous Unix

Nous avons vu que le premier niveau de structuration des informations memorisees sur un ordi-nateur est le fichier. Les fichiers permettent de ne pas conserver les informations en vrac, maisau contraire de la decouper en parties. Ces parties doivent bien entendu etre chacune composeed’informations de meme type : un texte simple, un programme, une image, etc.Nous avons vu aussi qu’il est necessaire de pouvoir ranger les fichiers eux-memes dans des con-teneurs appeles repertoires. Si l’on represente graphiquement la relation d’appartenance entrefichiers et repertoires, l’ensemble des repertoires et fichiers d’un systeme Unix peut etre representesous la forme d’un arbre inverse par le schema de la figure 2.1.

d

duranddupontdupondduchamp

... y zba ...

... ...

u

HOME

/

Fig. 2.1 – Arborescence de fichiers et repertoires Unix.

2.6.2 Les informations associees aux fichiers et repertoires

Un utilisateur gere donc deux types d’objets informatiques : les fichiers et les repertoires. Il fautqu’il sache avant tout determiner le type de chaque objet.La commande ls avec l’option -l permet d’afficher une description detaillee des fichiers :

Tapez : ls -l ←

En supposant que vous soyez l’utilisateur dont l’identifiant est durand, vous devez obtenir unaffichage ressemblant a ce qui suit :

total 40

-rw-r--r-- 1 durand durand 9064 2008-06-12 11:10 chap1

-rw-r--r-- 1 durand durand 9064 2008-06-16 19:50 chap1.sauv

drwxr-xr-x 2 durand durand 4096 1998-12-14 08:45 courrier

-rw-r--r-- 1 durand durand 1560 1998-12-14 08:45 curriculum

-rw-r--r-- 1 durand durand 113 2008-06-16 19:45 monfichier

drwxr-xr-x 2 durand durand 4096 2004-09-13 19:32 programmes

On distingue dans cet affichage 8 colonnes (separees par un espace) :– Le premier caractere de la premiere colonne est soit la lettre d soit le caractere -. Un d indique

que l’objet considere est un repertoire, un - indiquant que l’objet est un fichier. Vous pouvez doncconstater que les objets monfichier et chap1 sont des fichiers, alors que les objets courrier etprogrammes sont des repertoires.

19

Page 21: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.6. LE SYSTEME DE FICHIERS DE UNIX CHAPITRE 2. PRISE EN MAIN DETAILLEE

– Le nom de chaque objet se trouve en derniere colonne.– la colonne 3 indique le nom du proprietaire de l’objet, ici durand.– la colonne 4 donne le nom du groupe d’utilisateurs auquel appartient le proprietaire de l’objet.

Sur les serveurs du DLST, chaque utilisateur appartient par defaut a un groupe dont le nom estidentique a son identifiant, ici le groupe durand.

– la colonne 5 indique la taille de l’objet exprimee en nombre de caracteres (ou nombre d’“octets”),par exemple 9064 octets pour le fichier chap1.

– les colonnes 6 et 7 contiennent la date et l’heure de la derniere modification de l’objet, parexemple le 16 juin 2008 a 19h50 pour le fichier chap1.sauv.

– Enfin, les 9 derniers caracteres de la premiere colonne indiquent les droits d’acces a l’objet :lettre r (“read”) pour une autorisation de lecture, lettre w (“write”) pour une autorisation d’ecri-ture, et lettre x (“execute”) pour une autorisation d’execution. Le remplacement de l’une de cestrois lettres par le caractere - indique que l’acces correspondant n’est pas autorise.Les trois premiers caracteres concernent les droits d’acces du proprietaire de l’objet, les troissuivants s’appliquent aux membres du groupe du proprietaire de l’objet, les trois derniers car-acteres s’appliquant a tous les autres utilisateurs.Pour le fichier chap1 par exemple, l’utilisateur durand peut lire et modifier le fichier, les membresde son groupe et les autres utilisateurs ne pouvant que le lire.

2.6.3 Changement de repertoire : commande cd

On appelle repertoire courant ou repertoire de travail le repertoire dans le contexte duquel s’exe-cutent a un instant donne les commandes Unix et les programmes de l’utilisateur.Supposons que vous soyez l’utilisateur durand et que votre arborescence de fichiers soit cellerepresentee par la figure 2.2. durand est le nom de votre repertoire d’accueil (ou repertoire d’o-rigine). Votre repertoire courant est actuellement le repertoire TP1 qui appartient au repertoireINF111, qui lui meme appartient au repertoire durand.

durand

INF111

TP1

curriculumchap1chap1.sauv programmescourriermon_fichier

lettre1 lettre2 lettre3 lettre4 boucle.p boucle.c pgcd1.p pgcd1.c...

Fig. 2.2 – votre arborescence de repertoires Unix.

Il est evidemment possible de changer de repertoire courant, au moyen de la commande cd (ab-breviation de “change directory”).

Se placer dans un repertoire appartenant au repertoire courant

Votre repertoire courant contient deux repertoires : courrier et programmes. Vous allez main-tenant vous placer dans le repertoire courrier :

20

Page 22: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.6. LE SYSTEME DE FICHIERS DE UNIX CHAPITRE 2. PRISE EN MAIN DETAILLEE

Tapez : cd courrier←puis : ls -l←

Votre repertoire courant est a present le repertoire courrier et vous pouvez constater que cerepertoire contient quatre objets qui sont tous des fichiers. Remarquez d’autre part que la com-mande ls n’a affiche que le contenu du repertoire courrier et n’a pas liste les fichiers chap1,monfichier, etc.

Se placer dans un repertoire auquel appartient le repertoire courant

Le repertoire auquel appartient le repertoire courant, appele repertoire parent, peut etre designepar le nom special .. (notez qu’il n’y a pas d’espace entre les deux points). Il n’y a pas d’ambiguitepuisqu’un repertoire ne peut avoir qu’un seul repertoire parent.

A partir du repertoire courrier (repertoire courant actuel) placez-vous dans votre repertoired’accueil en invoquant trois fois la commande : cd .. ←A l’aide des commande ls et dtree, verifiez qu’a present vous etes bien place dans votrerepertoire d’origine.

Tapez : cd .. ← , puis : ls ←Vous devez voir la liste des etudiants dont le nom commence par la meme lettre que le votre.Recommencez. Vous devez voir la liste des lettres de l’alphabet.

Se replacer dans le repertoire d’accueil

Quelque soit votre repertoire courant, vous devez pouvoir a tout instant vous replacer dans votrerepertoire d’origine.

Tapez la commande : cd ←Verifiez que votre repertoire courant est bien votre repertoire d’accueil.

2.6.4 Afficher le nom du repertoire courant : commande pwd

Quand on se deplace dans l’arborescence, il arrive parfois que l’on soit perdu, et que l’on ne sacheplus ou l’on est situe. La commande pwd (abbreviation de “print working directory”) permet d’af-ficher le nom du repertoire courant.

Tapez : pwd←

Le resultat s’interprete sans peine.

2.6.5 Creation de repertoire : commande mkdir

Les repertoires sont un moyen tres efficace de classement, encore faut-il savoir les creer. Pour celaon doit utiliser la commande mkdir (abbreviation de “make directory”). Cette commande requiertun argument : le nom du repertoire que l’on souhaite creer.

Tapez la commande : cd INF111/TP1←Pour creer un repertoire de nom monrep, tapez la commande : mkdir monrep←Utilisez ensuite la commande ls pour verifier qu’un objet de type repertoire et de nom monrep

a ete cree dans le repertoire courant.Utilisez la commande cd pour vous placer dans ce nouveau repertoire, et ensuite ls pourafficher son contenu.

La commande ls n’a rien affiche, indiquant ainsi que le repertoire est vide.

21

Page 23: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.6. LE SYSTEME DE FICHIERS DE UNIX CHAPITRE 2. PRISE EN MAIN DETAILLEE

2.6.6 Deplacement d’un objet d’un repertoire a l’autre : commande mv

Il est souvent necessaire de deplacer un objet (fichier ou repertoire) du repertoire ou il se trouvevers un autre repertoire. On utilise dans ce cas la commande mv (abbreviation de “move”), avecdeux arguments : le nom de l’objet a deplacer et le nom du repertoire destination.

Replacez vous dans le repertoire TP1.Deplacer le fichier monfichier dans le repertoire monrep au moyen de la commande :mv monfichier monrep←

Verifiez le resultat obtenu au moyen des commandes ls et dtree.

2.6.7 Exercice 1

Il est tres fortement recommande de creer pour chaque TP qui sera realise cette annee un reper-toire distinct. Ces repertoires auront pour nom TPn, TPn+1, etc. TP1 est le repertoire consacre aupresent TP.Vous allez maintenant creer le repertoire du prochain TP, le repertoire TP2 :

Utilisez la commande cd pour vous replacer dans le repertoire INF111. Verifiez le resultat aumoyen de la commande pwd.Creez un repertoire nomme TP2.Creez dans le repertoire TP2 un fichier nomme tp2_1.c, contenant les 3 lignes suivantes :

int main(void) {

return 0 ;

}

Verifiez que ce fichier se trouve bien dans le repertoire TP2. Si ce n’est pas le cas, c’est que vousn’avez pas effectue correctement les actions requises. Recommencez jusqu’a obtenir le resultatvoulu.

Reflechissez bien a tous ces noms, et a ce qu’ils representent : le nom du repertoire (TP2), le nomdu fichier (tp2_1.c).

2.6.8 Exercice 2

Creer dans le repertoire courrier quatre repertoires nommes vincent, francois, paul etlesautres. Deplacez dans ces quatre repertoires les fichiers respectifs lettre1, lettre2,lettre3 et lettre4.

2.6.9 Suppression de repertoire : commande rmdir

On peut supprimer un repertoire a l’aide de la commande rmdir (abbreviation de “remove direc-tory”). Cette suppression ne peut avoir lieu que si le repertoire concerne est vide, c’est a dire s’ilne contient aucun fichier ou repertoire.

Replacez-vous dans le repertoire INF111, puis tapez la commande : rmdir TP2←Verifiez ensuite a l’aide de la commande ls que le repertoire TP2 a bien disparu.

Placez-vous maintenant dans le repertoire TP1, puis tapez la commande : rmdir monrep←Observez le message affiche.

2.6.10 Designation des objets

Les fichiers et les repertoires que nous avons manipules jusqu’a present se trouvaient tous dansle repertoire courant. Il est pourtant tout a fait possible de designer des objets se trouvant dansn’importe quel repertoire de l’arborescence Unix.

22

Page 24: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.6. LE SYSTEME DE FICHIERS DE UNIX CHAPITRE 2. PRISE EN MAIN DETAILLEE

L’une des facons est de decrire le chemin a parcourir depuis le repertoire courant jusqu’a l’objetconsidere. Les noms des differents repertoires devant etre traverses sont separes par le caractere /.

Verifiez que vous etes bien dans le repertoire TP1.Tapez ensuite : less courrier/vincent/lettre1←

Vous accedez ainsi au fichier lettre1 du repertoire vincent appartenant au repertoire courrier,tout en etant place dans le repertoire TP1.

Tapez : cd courrier←pour vous placer dans le repertoire courrier.Tapez ensuite : less ../programmes/pgcd1.p←

Le nom special .. vous a permis de traverser le repertoire parent du repertoire courrier, c’est adire le repertoire TP1, puis le repertoire programmes, pour enfin acceder au fichier pgcd1.p.

2.6.11 Quelques facilites d’ecriture des noms d’objets

Certains caracteres ont une signification speciale et permettent d’ecrire des motifs de noms :– le caractere? dans un motif correspond a n’importe quel caractere. Le motif fic ? correspond

donc a la liste des objets du repertoire courant dont le nom comporte quatre caracteres exacte-ment et commence par les caracteres fic.

– le caractere * dans un motif correspond a une chaıne (une suite) eventuellement vide de car-acteres quelconques. Ainsi, l’interpreteur remplacera le motif fic*12 par la liste des objets durepertoire courant dont le nom contient cinq caracteres au moins, commence par les caracteresfic, et se termine par les caracteres 12.

Par ailleurs, la touche →← (“Tabulation”) permet dans certains cas de completer un nom automa-

tiquement.

Placez vous dans le repertoire programmes, et utilisez la commande ls pour verifier que cerepertoire contient bien les fichiers donneespgcd, pgcd1.c, pgcd1.p, pgcd2.c et pgcd2.p.

Utilisez la commande ls et les caracteres speciaux ? ou * pour :– Lister pgcd1.c et pgcd1.p uniquement.– Lister pgcd1.p et pgcd2.p uniquement.– Lister pgcd1.c, pgcd2.c, pgcd1.p et pgcd2.p uniquement.– Lister tous les fichiers dont le nom se termine par les caracteres pgcd.– Lister tous les fichiers dont le nom contient les caracteres pgcd.– Tapez : ls -l pg, puis appuyez sur la touche →

← :L’interpreteur complete votre commande partiellement en affichant le mot pgcd.Appuyez deux fois sur la touche →

← :L’interpreteur affiche la liste des fichiers dont le nom commence par les caracteres pgcd puisre-affiche votre commande incomplete. Pour afficher la ligne de commande complete, il vousfaut choisir entre pgcd1.c, pgcd1.p, pgcd2.c et pgcd2.p.Tapez : 1, puis appuyez sur la touche →

← :L’interpreteur complete votre commande partiellement en affichant les caracteres pgcd1.

puis la liste des fichiers dont le nom commence par ces caracteres. Il re-affiche ensuite votrecommande incomplete. Il vous reste en effet a choisir entre pgcd1.c et pgcd1.p.Tapez : p, puis appuyez sur la touche →

← :Votre ligne de commande est complete puisqu’il n’existe dans le repertoire courant aucunautre fichier dont le nom commence par les caracteres pgcd1.p. Vous pouvez a presentappuyer sur la touche ← , l’interpreteur accepte votre commande et l’execute.

23

Page 25: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.7. COMPILATION, EXECUTION CHAPITRE 2. PRISE EN MAIN DETAILLEE

2.7 Compilation et execution d’un programme

2.7.1 Introduction

L’interpreteur de commandes permet aussi de compiler et d’executer ensuite un programme. Lacompilation d’un programme consiste a traduire un programme source contenu dans un fichiertexte en un programme executable contenu dans un fichier binaire. Le programme source est ecritdans un langage de programmation, par exemple le langage Pascal, ou le langage C. Le programmeexecutable contient des instructions codees en langage machine, instructions “comprehensibles”uniquement par le processeur de l’ordinateur. La compilation est realisee par un programme appelecompilateur.

2.7.2 Compilation d’un programme C : commande gcc

Le compilateur du langage C utilise au DLST a pour nom gcc. Le nom du fichier contenant unprogramme source ecrit en langage C doit se terminer par le suffixe .c.La commande permettant de compiler un programme source est constituee du nom du compilateursuivi d’un certain nombre d’arguments :

gcc <fichier-source> -o <fichier-executable>

Cette commande signifie : “compiler le fichier designe par <fichier-source> et placer le resultat(argument -o) dans le fichier designe par <fichier-executable>”.

Placez-vous dans le repertoire programmes.Tapez la commande : gcc pgcd1.c -o pgcd1←puis la commande : gcc pgcd2.c -o pgcd2←

Pour compiler un programme effectuant des traces graphiques, la commande devient :

gccgraph <fichier-source> -o <fichier-executable>

Remarque : La commande gccgraph permet d’invoquer le compilateur gcc de facon a ce qu’ilprenne en compte les bibliotheques requises pour afficher des objets graphiques.

2.7.3 Execution d’un programme

Le service le plus important fourni par le systeme d’exploitation de l’ordinateur (Unix dans notrecas) est le lancement de l’execution d’un programme. Pour executer un programme qui se trouvedans le repertoire courant, il suffit de taper les caracteres ./ suivis (sans espace intermediaire) dunom du fichier contenant le programme executable correspondant :

Tapez : ./pgcd1←Recommencez avec : ./pgcd2←

2.7.4 Redirection des entrees / sorties

Generalement, un programme requiert des donnees et produit des resultats. Par defaut, les donneessont tapees (“saisies”) au clavier par l’utilisateur et les resultats sont affiches sur son ecran (dansla fenetre xterm).Il est souvent souhaitable de pouvoir preparer les donnees a traiter dans un fichier, et d’enregistrerles resultats produits dans un autre fichier. Ceci peut s’obtenir au moyen de ce qu’on appelle laredirection des entrees et des sorties :

24

Page 26: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.8. REVISION CHAPITRE 2. PRISE EN MAIN DETAILLEE

Tapez : pgcd2 < donneespgcd > respgcd←

Cette commande invoque le programme pgcd2 en lui indiquant de lire les donnees dans le fichierdonneespgcd (redirection de l’entree) et d’ecrire les resultats dans le fichier respgcd (redirectionde la sortie).Observez le contenu du fichier respgcd au moyen de la commande cat.

2.7.5 Interruption de l’execution d’un programme

Il peut se produire que suite a une erreur de programmation un programme ne se termine jamais.Il est dans ce cas necessaire que l’utilisateur puisse interrompre l’execution du programme. Le sys-

teme d’exploitation reconnaıt a cet effet la combinaison particuliere de touches Ctrl C commeune requete d’interruption de l’execution du programme en cours.

Tapez ls pour verifier que le repertoire courant contient un fichier ayant pour nom boucle.c.Ce fichier contient le code source d’un programme dont l’execution ne s’arrete jamais. Compilezce programme, puis executez le en tapant la commande : boucle←Le programme affiche indefiniment le meme message.

Apres quelques secondes d’execution, appuyez sur la touche Ctrl , puis en maintenant cette

derniere enfoncee appuyez sur la touche C .Constatez que l’execution du programme s’est interrompue.

2.7.6 Re-execution d’une commande recente

Lorsqu’on programme on est tres souvent amene a executer plusieurs fois la meme sequence decommandes, par exemple : editer le texte d’un programme source, compiler ce programme, l’exe-cuter pour le tester, constater que des modifications sont encore necessaires, modifier le programmesource, le compiler, l’executer, etc.

– Appuyez sur la touche ↑. Le texte de la toute derniere ligne de commande que vous avezexecutee s’affiche.Recommencez. Le texte de l’avant derniere ligne de commande executee apparaıt.Vous pouvez ainsi remonter autant de fois que necessaire dans l’historique des lignes decommande (de la plus recente vers la plus ancienne).

– Si vous etes remonte trop “haut” (trop loin) dans l’historique des commandes, vous pouvezle re-parcourir dans l’autre sens (de la plus ancienne commande vers la plus recente) :Appuyez sur la touche ↓. Recommencez autant de fois que necessaire.

– Lorsque vous avez retrouve la commande cherchee, il suffit de taper ← pour que cettecommande soit executee.

2.8 Revision

2.8.1 Exercice 1

Creez dans le repertoire programmes deux sous repertoires nommes respectivement pascal et c

dans lesquel vous rangerez les programmes source : les fichiers en langage Pascal dans le repertoirepascal, les fichiers en langage C dans le repertoire c.

2.8.2 Exercice 2

– Le programme exo1.c a pour objet d’imprimer un message a l’ecran.Compilez ce programme : il y a des erreurs. Essayez de les corrigez et de re-compiler le programmejusqu’a ce que la compilation s’effectue sans message d’erreur. Executez le programme.

25

Page 27: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

2.9. FIN D’UNE SESSION DE TRAVAIL CHAPITRE 2. PRISE EN MAIN DETAILLEE

– Le programme exo2.c lit deux nombres au clavier et affiche le maximum de ces deux nombres.Compilez ce programme : il y a des erreurs. Essayez de les corrigez et de re-compiler le programmejusqu’a ce que la compilation s’effectue sans message d’erreur. Executez le programme.

2.9 Fin d’une session de travail

En fin de seance, et chaque fois que vous quittez votre poste de travail, vous devez terminer votresession Unix, ainsi que votre session Windows dans le cas d’un PC :– Pour quitter Unix, taper la commande “exit” dans la fenetre xterm.

Remarque : la session Unix est fermee, mais le programme XWin32 est toujours actif ; une

nouvelle session Unix peut etre demarree en cliquant sur l’icone X dans la barre des taches deWindows, a droite.

– Pour quitter Windows, cliquer sur le menu Demarrer , puis choisir Arreter .

26

Page 28: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

Chapitre 3

Exercices

3.1 Exercice : application du cours

1. QCM

Question v/f ? justification- Le nom du fichier “truc.txt” est “truc”- Le pere du repertoire courant est le repertoire racine- toto/ designe le repertoire “toto” situe dans le repertoire de travail- Sous UNIX, il est indifferent d’indiquer TOTO.txt ou toto.txt- “cp -r” permet de copier uniquement des repertoires, pas des fichiers- “less” et “ls” ont la meme signification- “man ls” permet d’avoir des informations sur ls- “cd” signifie “create directory” (creer un repertoire)- pwd | cd > truc.txt cree un fichier truc.txt vide

2. Questions– Si je tape gcc monprog.c -o monprog.c, que se passe-t-il ?– Quel est l’interet de dtree par rapport a ls ?– Comment enregistrer l’arborescence du repertoire racine dans un fichier nomme arbo.txt,

situe dans le repertoire de travail ?

3.1.1 Exercice : chemins absolu et relatif

Soit l’arborescence de la figure ci-dessous. Si le repertoire courant est JEUX, comment copiertp.doc dans le repertoire TD? Ecrire la reponse en chemins absolus et en chemins relatifs.

27

Page 29: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

3.1. EXERCICE : APPLICATION DU COURS CHAPITRE 3. EXERCICES

Fig. 3.1 – arborescence

3.1.2 Exercice : cryptage d’un fichier texte

A l’aide de la commande “Remplacer” de l’editeur de texte NEdit, modifier un texte quelconquede telle sorte que tous les “s” initiaux deviennent des “t”, tous les “t” initiaux deviennent des “u”,et tous les “u” initiaux deviennent des “s”.

3.1.3 Exercice : manipulation d’arborescence

Soit l’arborescence de la figure ci-dessous. Donner la liste des commandes unix pour faire les actionssuivantes :

Fig. 3.2 – arborescence

1. Je suis dans “User”, je veux aller dans “essai”, je connais l’arborescence.

2. Je suis dans “User”, je veux aller dans “essai”, je ne connais pas l’arborescence.

3. Je suis dans “blagues”, je veux aller lire le score de Beach-Volley qui est dans mon fichier“BeachVolley”.

4. Je suis dans“blagues”, je veux lire le score de Beach-Volley qui est dans mon fichier“BeachVol-ley” sans bouger de mon repertoire courant.

5. Je suis dans“TP”, je veux aller creer un fichier“minmax.c”dans le repertoire“MesProgPerso”.

6. Je suis dans “essai”, je veux creer un repertoire “TP4”dans le repertoire “TP” et y mettre leprogramme “monProg” en le laissant aussi dans “TP1”.

28

Page 30: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

3.1. EXERCICE : APPLICATION DU COURS CHAPITRE 3. EXERCICES

7. En reprenant l’arborescence initiale, reflechir a ce que font ces commandes :– less travail/ (repertoire courant : User)– less /Sports/Beachvolley (repertoire courant : User)– less /courrier/lettre1 (repertoire courant : User)– cd monJeu (repertoire courant : MesProgsPerso)– less monProg (repertoire courant : TP1)– nedit toto.c

– nedit monJeu.c (repertoire courant : TP1)

3.1.4 Exercice : manipulation d’arborescence

1. En supposant que seul le repertoire MOI existe deja et que c’est le repertoire courant,construire l’arborescence de la figure 1.3.

Fig. 3.3 – arborescence

2. A partir de cette arborescence et en supposant que MOI est le repertoire courant, supprimerles repertoires TpsUNIX et TpsC, et mettre le contenu de TpsC dans MesTps.

3. MOI etant le repertoire courant, je veux modifier Motiv.doc et verifier le contenu de cv.doc.

3.1.5 Exercice : manipulation d’arborescence

Soit l’arborescence de la figure ci-dessous (les boıtes sont des repertoires, le reste des fichiers).Pour chaque question, on prend l’arborescence initiale, sans prendre en compte les modificationsque les questions precedentes auraient pu produire. De plus, a partir de la question 2, on supposeque l’on connaıt l’arborescence.

Fig. 3.4 – arborescence

29

Page 31: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

3.1. EXERCICE : APPLICATION DU COURS CHAPITRE 3. EXERCICES

1. Je suis dans travail et je veux savoir ce qu’il y a dans evaluation.

2. Je suis dans papiers et je veux creer un repertoire tdC dans td.

3. Je suis dans MOI et je veux lire le contenu de Planning.txt.

4. Je suis dans papiers et je veux supprimer loisirs.

5. Je suis dans divers et je veux copier Planning.txt dans papiers.

6. Je suis dans divers et je veux deplacer Planning.txt dans papiers.

7. Je ne sais pas ou je suis, et je veux le savoir.

8. Je suis dans papiers et je veux renommer lettreMotiv.doc en Motiv1.doc.

30

Page 32: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

Chapitre 4

L’essentiel a savoir

4.1 Editer un texte a partir d’Unix : NEdit

Le programme que nous utiliserons pour saisir des programmes C s’appelle NEdit. Pour creer unnouveau fichier s’appellant essai.c, taper en ligne de commande nedit essai.c &. Remarquez

que la fenetre de nedit est bordee en haut par une barre de menus comportant les menus File ,

Edit , Search , etc. Les commandes Save et Quit du menu File permettent respectivementd’enregistrer votre travail et de quitter nedit. Pour plus de details revoir le TP de prise en maind’Unix (chapitre 2).

4.2 Transferer des fichiers entre votre compte et le comptede votre binome

A la fin de chaque seance de TP, il faut imperativement que l’etudiant dont le compte a ete utilisepour realiser le TP copie les repertoires et fichiers qu’il a crees pendant la seance vers le comptede son binome.Pour des raisons de securite, la commande cp ne peut etre utilisee.Pour effectuer cette copie de compte a compte, il faut utiliser la commande scp, selon la proceduredecrite dans les annexes, en section 9.2, page 114.

4.3 Transferer des fichiers entre votre domicile et votrecompte Unix au DLST

Pour certains TP et pour le projet vous serez peut-etre amenes a vouloir utiliser votre propreordinateur chez vous pour avancer votre travail.Il vous faudra dans ce cas pouvoir :

1. recuperer le repertoire et les fichiers concernes sur le serveur Unix du DLST et copier le toutsur votre ordinateur a la maison, avant de pouvoir travailler chez vous, et

2. transferer sur le serveur Unix du DLST une copie des fichiers que vous aurez modifies a lamaison, de facon a pouvoir retrouver une version a jour de ces fichiers lors de votre prochaineseance de travail au DLST.

Pour effectuer ces deux types de transfert, vous devrez utiliser plusieurs outils, selon les proceduresdecrites en section 9.3, page 115.

31

Page 33: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

4.4. FICHIERS ET REPERTOIRES CHAPITRE 4. L’ESSENTIEL A SAVOIR

4.4 Fichiers et repertoires

Instructions d’information sur une arborescence

dtree -a Rep affiche l’arborescence de fichiers issue du repertoire Rep (ou du reper-toire courant si Rep n’est pas specifie)

ls -l Rep affiche la liste detaillee des fichiers et repertoires presents dans lerepertoire Rep (ou le repertoire courant si Rep n’est pas specifie) ;selon les systemes cette liste peut aussi contenir .. (repertoire pere)et . (repertoire courant)

pwd affiche le nom du repertoire courant

Instructions concernant les fichiers

cp Fic1 Fic2 si Fic2 n’est pas un nom de repertoire existant, duplique le fichierFic1 dans un fichier nomme Fic2

cp Fic Rep si Rep est un nom de repertoire existant, place une copie du fichierFic dans le repertoire Rep

cat Fic affiche le contenu du petit fichier texte Ficless Fic affiche le contenu du fichier texte Ficmv Fic1 Fic2 si Fic2 n’est pas un nom de repertoire existant, renomme le fichier

Fic1 en Fic2mv Fic Rep si Rep est un nom de repertoire existant, deplace le fichier Fic dans

Reprm Fic supprime le fichier Fic

Instructions concernant les repertoires

cd Rep accede au repertoire Repcp -r RSrc RDest place une copie du repertoire RSrc et de tout ce qu’il contient

dans le repertoire RDestmkdir Rep cree le repertoire Reprmdir Rep supprime le repertoire Rep (Rep doit etre vide)

mv RSrc RDest deplace le repertoire RSrc et tout ce qu’il contient dans le reper-toire RDest

Redirection de flux

Cmd < Fic Execute la commande Cmd en remplacant les caracteres saisis auclavier par le contenu du fichier Fic

Cmd > Fic Enregistre les caracteres affiches par la commande Cmd dans le fichierFic

Cmd >> Fic Enregistre les caracteres affiches par la commande Cmd a la suite dufichier Fic

Cmd1 | Cmd2 Execute la commande Cmd1 puis la commande Cmd2. La commandeCmd2 a pour entree le resultat de la commande Cmd1.

Autres instructions

gcc fich.c -o fich Compile le fichier fich.c en un fichier executable fichlpx Fic imprime le contenu du fichier texte Fic sur l’imprimanteman Cmd affiche une aide sur la commande UNIX ou C appelee Cmdnedit Fic & edite le fichier texte Fic a l’aide de l’editeur Nedit ; si Fic n’est

pas un nom de fichier existant, celui-ci est cree./Fic si Fic est le nom d’un fichier executable, execute les instruc-

tions qu’il contient

32

Page 34: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

Deuxieme partie

PROGRAMMATION EN C

33

Page 35: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

Chapitre 5

Sujets de TP

5.1 Premiers programmes

Avertissement. Les exercices proposes dans ce TP sont independants. Cependant ils sontpresentes dans un ordre de complexite croissante. Aussi ne passez pas a un exercice avant d’avoirtermine l’exercice precedent, c’est-a-dire avant d’avoir teste la bonne execution des programmes.

Conventions. Afin d’organiser correctement votre travail, nous vous demandons de respecterles regles suivantes :

1. Si ce n’est deja fait, creer au moyen de la commande mkdir un repertoire INF111 dans votrerepertoire d’accueil (rappel : votre repertoire d’accueil est le repertoire dans lequel vous voustrouvez lorsque vous vous connectez au systeme Unix).

2. Pour chaque TP, creer dans le repertoire INF111, un repertoire TPi ou i est le numero du TP.C’est dans ce repertoire que vous devrez ranger les programmes que vous ecrirez pendant leTP courant.

Pour ce TP, vous devez donc creer le repertoire TP2.

Une fois le repertoire TP2 cree, placez vous dans ce repertoire au moyen de la commande cd.

Pour creer le fichier exo.c (ou pour l’ouvrir s’il existe deja) utilisez la commande :nedit exo.c &

Pour compiler le fichier exo.c (et obtenir le programme executable exo utilisez la commande :gcc exo.c -o exo

Attention : un programme ne peut etre considere comme correct tant que gcc affiche des messagesd’erreurs ou des messages d’alerte (“warning”).

Par ailleurs, afin d’identifier clairement vos programmes tout fichier source en langage C devraavoir comme suffixe .c et tout programme executable devra avoir le meme nom que le fichiersource correspondant mais sans le suffixe .c.

Remarque : Pour faciliter la cooperation entre les deux etudiants d’un binome, on dupliquerales fichiers sous les repertoires de TP des deux membres de ce binome (utilisez la commande scp,voir annexe 9.2 page 114.

34

Page 36: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.1. PREMIERS PROGRAMMES CHAPITRE 5. SUJETS DE TP

5.1.1 Conversion de temperatures

En utilisant la formule C = 5

9(F − 32), ecrire un programme degres.c en langage C qui lit une

temperature exprimee en degres fahrenheit et affiche sa valeur en degres celsius.

Remarque : Dans l’exemple d’execution donne ci-dessous,– ce qui est produit par le programme est affiche : comme ceci,– ce qui est tape au clavier par l’utilisateur (par vous donc) est affiche : comme cela.

Exemple d’execution du programme degres :

durand@gallien:~/INF111/TP2$ ./degresDonnez une temperature en degres fahrenheit : 60Cette temperature equivaut a 15.6 degres celsius.

durand@gallien:~/INF111/TP2$

5.1.2 Conversion de durees

Ecrire un programme jhms.c en langage C qui pour un nombre donne de secondes affiche la dureeequivalente exprimee en jours, heures (le nombre d’heures etant inferieur ou egal a 23), minutes (lenombre de minutes etant inferieur ou egal a 59) et secondes (le nombre de secondes etant inferieurou egal a 59).

Exemple d’execution du programme jhms :

durand@gallien:~/INF111/TP2$ ./jhmsDonnez une duree en secondes : 3721Cette duree correspond a :

0 jours

1 heures

2 minutes

1 secondes

durand@gallien:~/INF111/TP2$

Le programme ci-dessus utilise systematiquement le pluriel. Ecrire une deuxieme version de ceprogramme appelee jhms2.c qui evite l’usage incorrect du pluriel et n’affiche pas les valeurs nulles.

Exemple d’execution du programme jhms2.c :

durand@gallien:~/INF111/TP2$ ./jhms2Donnez une duree en secondes : 7260Cette duree correspond a :

2 heures

1 minute

durand@gallien:~/INF111/TP2$

5.1.3 Tri de 3 entiers

Ecrire un programme tri3.c en langage C qui lit trois entiers et les affiche dans l’ordre du pluspetit au plus grand.

Exemple d’execution du programme tri3 :

durand@gallien:~/INF111/TP2$ ./tri3Donnez un entier : 25Donnez un entier : 56Donnez un entier : 4Les entiers du plus petit au plus grand sont : 4 25 56

durand@gallien:~/INF111/TP2$

35

Page 37: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.2. ADIBOU CHAPITRE 5. SUJETS DE TP

5.2 Adibou

5.2.1 Exercice 1

Ecrire un programme adibou.c qui demande trois entiers a, b et c a l’utilisateur, puis lui posesuccessivement les questions suivantes :

1. a < b < c ?

2. un seul nombre impair parmi a, b, c ?

3. a, b, c distincts deux a deux ?

A chaque question, le programme doit afficher“reponse correcte, bravo!”ou“reponse incorrecte”selon la reponse de l’utilisateur. Le programme doit compter le nombre de bonnes reponses et ala fin afficher le total de points, sous la forme : “n bonnes reponses sur 3”.

Exemple d’execution du programme :

durand@gallien:~/INF111/TP3$ ./adiboua = ? : 1b = ? : 4c = ? : 3

Repondre par V (vrai) ou F (faux) :

Q1. 1 < 4 < 3 ? : Vreponse incorrecte

Q2. un seul nombre impair parmi 1, 4, 3 ? : Freponse correcte, bravo!

Q3. 1, 4, 3 distincts deux a deux? : Vreponse correcte, bravo!

2 bonnes reponses sur 3

durand@gallien:~/INF111/TP3$

5.2.2 Exercice 2

Creez une copie du fichier adibou.c nommee adibou2.c. Modifier cette copie de facon a ajouterles questions suivantes au quizz :– Quelle est la valeur de a ∗ b + b ∗ c + c ∗ a ?– Existe-t-il un triangle dont les cotes sont a, b, c ?– Donner les valeurs de a, b, c dans l’ordre croissant– Deux des nombres a, b, c sont-ils egaux entre eux ? Lesquels ?

5.2.3 Exercice 3

Creez une copie du fichier adibou2.c nommee adibou3.c. Modifier cette copie de facon a ceque l’ensemble des questions soient posees plusieurs fois (par exemple 3 fois) a l’utilisateur. Leprogramme devra verifier que les nombres a, b et c choisis sont differents a chaque fois. Il devra ala fin afficher le score global obtenu par l’utilisateur.

Exemple d’execution du programme :

36

Page 38: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.2. ADIBOU CHAPITRE 5. SUJETS DE TP

durand@gallien:~/INF111/TP3$ ./adibou3partie 1

========

a = ? : 17b = ? : 5c = ? : -3

Repondez par V (vrai) ou F (faux) :

Q1. 17 < 5 < -3 ? : Freponse correcte, bravo!

. . .

5 bonnes reponses sur 7

partie 2

========

a = ? : 7b = ? : 13c = ? : 25

Repondez par V (vrai) ou F (faux) :

Q1. 7 < 13 < 25 ? : Vreponse correcte, bravo!

. . .

3 bonnes reponses sur 7

partie 3

========

a = ? : 7b = ? : 13c = ? : 25Choisissez 3 nombres differents de ceux deja choisis!

a = ? : 77b = ? : 1c = ? : 29

Repondez par V (vrai) ou F (faux) :

Q1. 77 < 1 < 29 ? : Vreponse incorrecte

. . .

6 bonnes reponses sur 7

score final : 14 bonnes reponses sur 21

durand@gallien:~/INF111/TP3$

37

Page 39: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.3. LE JEU DU PRIX DU LOT CHAPITRE 5. SUJETS DE TP

5.3 Le jeu du prix du lot

5.3.1 Le prix du lot : version de base

Le jeu consiste a decouvrir par essais successifs le prix d’un lot. Pour chaque essai, le programmeaffiche un message “ Trop grand”, “ Trop petit” ou “ BRAVO! Vous avez trouve en k essais”.Le jeu est fini quand le joueur a trouve le prix du lot.

On propose d’ecrire un programme prixlot1.c qui joue le role de meneur de jeu. L’execution dece programme vous fera tenir le role du joueur. Le programme doit definir le prix du lot en tirantun entier aleatoire compris entre 1 et 1000 et dialoguer avec le joueur pendant le jeu. La generationdes nombres aleatoires sera obtenue au moyen de la fonction hasard() (voir section 9.4.1 page 117en annexe).

Voici un exemple de l’execution du programme prixlot1 (les informations tapees par l’utilisateursont en gras) :

durand@gallien:~/INF111/TP4$ ./prixlot1Entrer un prix : 566Trop grand

Entrer un prix : 400Trop grand

Entrer un prix : 150Trop petit

Entrer un prix : 200Trop petit

Entrer un prix : 214BRAVO! Vous avez gagne en 5 essais

durand@gallien:~/INF111/TP4$

Un algorithme pour ce programme est le suivant :

• tirer au sort un prix entre 1 et 1000• initialiser le compteur du nombre d’essais a 0• initialiser la valeur de l’essai a 0• tant que le dernier essai etait different du prix tire :

{ nouvel essai }· demander au joueur un nouvel essai· saisir la valeur jouee· afficher le message approprie selon que la valeur saisie

est plus grande ou plus petite que le prix tire· incrementer le compteur d’essais

{ le dernier essai correspondait au prix tire }• afficher le message de felicitations et le nombre d’essais joues

5.3.2 Le prix du lot : deuxieme version

Creer une copie nommee prixlot2.c du fichier prixlot1.c. Modifier le fichier prixlot2.c demaniere a pouvoir :

1. Enchaıner plusieurs parties consecutives lors d’une meme execution du programme.A la fin de chaque partie, il est demande au joueur de preciser s’il veut s’arreter ou jouerune nouvelle partie.

38

Page 40: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.3. LE JEU DU PRIX DU LOT CHAPITRE 5. SUJETS DE TP

2. Limiter le nombre d’essais effectues par le joueur au cours d’une partie.Au debut de chaque partie, le programme demande le nombre maximum d’essais autorisespour la partie qui debute.

Exemple d’execution du programme prixlot2 :

durand@gallien:~/INF111/TP4$ ./prixlot2

1ere partie. Nombre maximm d’essais : 4Entrer un prix : 678Trop petit

Entrer un prix : 920Trop grand

Entrer un prix : 860Trop petit

Entrer un prix : 910Trop petit

PERDU! Vous avez epuise le nombre d’essais autorises

Le prix a trouver etait : 917

Voulez-vous rejouer (O/N)? : o

2eme partie. Nombre maximm d’essais : 8Entrer un prix : 678Trop petit

Entrer un prix : 333Trop grand

Entrer un prix : 300Trop petit

Entrer un prix : 320Trop petit

Entrer un prix : 324BRAVO! Vous avez gagne en 5 essais

Voulez-vous rejouer (O/N)? : ndurand@gallien:~/INF111/TP4$

5.3.3 Le prix du lot : version complete

En jouant avec le programme prixlot2, essayer de trouver une strategie systematique permettantde trouver le prix tire en un minimum de coups. En deduire un programme prixlot3.c qui faitjouer l’ordinateur a votre place suivant la strategie trouvee. Ce programme aura donc en chargeles deux roles de meneur de jeu et de joueur (joueur virtuel).

Pouvez-vous prevoir, pour la strategie que vous avez choisie, l’ordre de grandeur du nombre d’es-sais requis pour trouver le prix tire ?

Completer le programme prixlot3.c en lui faisant effectuer consecutivement 20 parties. Pourchaque partie le programme affichera le prix tire au sort et le nombre d’essais successifs qui ont etenecessaires pour le trouver avec la strategie utilisee. A la fin des 20 parties, le programme afficherala moyenne des nombres d’essais utilises pour les 20 parties. Vous pourrez ainsi comparer cettemoyenne avec l’ordre de grandeur que vous aviez prevu.

39

Page 41: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.4. TRI PAR SELECTION CHAPITRE 5. SUJETS DE TP

5.4 Tri par selection

La recherche d’une donnee dans un ensemble d’informations volumineux est grandement faciliteelorsque ces informations sont ordonnees. Ainsi, si les mots d’un dictionnaire n’etaient pas ordonnesselon l’ordre alphabetique, il faudrait parcourir en moyenne la moitie du dictionnaire pour trouverun mot, ce qui rendrait les parties de scrabble interminables !Le tri d’un ensemble de donnees est l’operation permettant de re-arranger ces donnees selon unordre choisi.

On se propose dans ce TP de trier un tableau de n entiers selon l’ordre croissant : a la fin du tri,les n entiers sont ranges du plus petit au plus grand dans les n premieres cases du tableau.Le contenu du tableau a trier sera tire aleatoirement par le programme. L’algorithme de tri utilisedans ce TP s’appelle le tri par selection.

Dans un premier temps (paragraphe 5.4.3), on ecrira un programme qui trie le tableau et afficheensuite a l’ecran les valeurs triees. Dans un deuxieme temps (paragraphe 5.4.4), on modifiera lepremier programme pour visualiser graphiquement le deroulement du tri.

5.4.1 Structure du programme

Le programme sera construit selon l’algorithme general suivant :

– lire le nombre d’elements a trier– remplir le tableau au moyen du generateur aleatoire– afficher le contenu du tableau non trie– trier le tableau– afficher le contenu du tableau trie

Les principales informations que le programme aura a traiter sont :

– Constantes :

NMAX : nombre maximun d’elements a trier (par exemple 50).

VALMIN : plus petit entier que peut contenir le tableau (par exemple −10),

VALMAX : plus grand entier que peut contenir le tableau tableau (par exemple 400).

– Variables :

tab : tableau contenant les elements a trier

n : nombre d’elements a trier

Le contenu du tableau a trier sera genere aleatoirement au moyen de la fonction hasard (voirsection 9.4.1 page 117 en annexe).

Pour obtenir une suite de nombres toujours identique a chaque execution du programme, on pourrautiliser la procedure initialiser_germe (voir section 9.4.2 page 117) qu’il faut appeler une foisavant de remplir le tableau.

5.4.2 Premiere version du programme

Ecrire une premiere version du programme tri.c qui, apres avoir declare les constantes et variablesnecessaires, effectue les actions suivantes :

– saisir au clavier le nombre n (n ≤ NMAX) d’elements que doit contenir le tableau(le tableau comporte NMAX cases, mais nous n’utiliserons ici que les cases 0, ..., n−1)

– initialiser le generateur aleatoire (optionnel)– remplir le tableau tab de n entiers tires au hasard dans l’intervalle [V ALMIN, V ALMAX ],

les n entiers etant ranges successivement dans les cases 0, 1, . . . , n− 1– afficher le contenu du tableau

Remarque : Cette premiere version du programme n’effectue aucun tri.Compiler et tester le programme obtenu.

40

Page 42: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.4. TRI PAR SELECTION CHAPITRE 5. SUJETS DE TP

5.4.3 Realisation du tri

Algorithme du tri par selection : principe

L’algorithme utilise se deroule en n− 1 etapes principales (si n est le nombre d’entiers a trier).A chaque etape le contenu du tableau se divise en deux parties disjointes. A la i + 1eme etape, cesdeux parties sont :

1. Les cases d’indices 0 a i − 1 contiennent les i plus petits elements du tableau, ces elementssont deja tries et ils occupent leur place definitive (resultat des i premieres etapes dejaeffectuees).

2. Les cases d’indices i a n− 1 contiennent les elements non encore tries.

������������������������������������������������0 i−1 i NMAX−1n−1

éléments triés éléments non triés utiliséepartie non

Fig. 5.1 – Principe du tri par selection

Les etapes successives du tri se deroulent de la facon suivante :

Etape 0 : aucun element n’est trie ; on recherche l’element minimum (le plus petit) dans la partienon triee, c’est a dire parmi les elements d’indices 0 a n− 1 ; on echange ensuite cet elementminimum avec l’element d’indice 0.Resultat : la partie triee comprend un seul element, l’element d’indice 0, lequel element est≤ a tout element de la partie non triee (elements d’indice 1 a n− 1).

Etape 1 : on recherche l’element minimum dans la partie non triee, c’est a dire parmi les elementsd’indices 1 a n− 1 ; on echange ensuite cet element minimum avec l’element d’indice 1.Resultat : l’element d’indice 1 est ≤ a tout element de la partie non triee, mais il est aussi≥ a l’element d’indice 0. La partie triee est donc a present constituee des deux elementsd’indices 0 et 1.

. . .

Etape i : on recherche l’element minimum dans la partie non triee, c’est a dire parmi les elementsd’indices i a n− 1 ; on echange ensuite cet element minimum avec l’element d’indice i.Resultat : l’element d’indice i est ≤ a tout element de la partie non triee, mais il est aussi ≥a tout element de la partie triee. La partie triee est donc a present constituee des elementsd’indices 0 a i.

. . .

Etape n − 2 : on recherche l’element minimum dans la partie non triee, c’est a dire parmi leselements d’indices n − 2 et n− 1 ; on echange ensuite cet element minimum avec l’elementd’indice n− 2.Resultat : l’element d’indice n− 2 est ≤ a l’element d’indice n− 1, mais il est aussi ≥ a toutelement de la partie triee. La partie triee est donc a present constituee des elements d’indices0 a n− 2.

Question : Pour quelle raison est-il inutile d’effectuer l’etape n− 1 ?

Realisation du tri

Du principe decrit ci-dessus on deduit l’algorithme du tri par selection (tri par minimum) :

i parcourant [0, . . . , n− 2]rechercher le minimum des elements d’indices i a n - 1echanger cet element minimum avec l’element d’indice i

41

Page 43: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.4. TRI PAR SELECTION CHAPITRE 5. SUJETS DE TP

Creer une copie du fichier tri.c nommee tri2.c. Modifier cette copie de facon a ce que leprogramme obtenu effectue les actions suivantes apres avoir affiche le contenu initial du tableau :

– trier le contenu du tableau tab en utilisant l’algorithme du tri par selection.– afficher le contenu trie du tableau

5.4.4 Visualisation graphique

On veut maintenant visualiser sous forme graphique l’execution de l’algorithme de tri. La figure 5.2donne un exemple du resultat a obtenir.Le trace correspondant sera effectue au moyen d’un environnement graphique base sur la biblio-theque graphsimple dont une documentation detaillee est donnee en annexe (cf. section 9.5page 120).Le programme utilisant cette bibliotheque aura la forme suivante :

/* tri3.c */

#include "graphsimple.h"

...

int main(void) {

...

/* initialisation du contenu du tableau */

...

/* creation d’une fenetre graphique de dimensions 600 x 500 */

Initialiser(600, 500);

/* trace d’une representation graphique des elements non tries */

...

/* attente d’un clic souris (pour observer le dessin obtenu) */

AttendreClic();

/* execution du tri */

...

/* trace d’une representation graphique des elements tries */

...

/* attente d’un clic souris (avant fermeture de la fenetre) */

AttendreClic();

/* fermeture de la fenetre graphique */

Clore();

return 0;

}

Pour compiler ce programme il faut utiliser la commande : gccgraph tri3.c -o tri3

Realisation du trace graphique

Rappel : les coordonnees dans la fenetre graphique sont reperees par rapport au point le plus hautet le plus a gauche de la fenetre (le point de coordonnees < 0, 0 >).On peut tout d’abord dessiner deux axes :

42

Page 44: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.4. TRI PAR SELECTION CHAPITRE 5. SUJETS DE TP

a b c

e

d

VALMIN

VALMAX avant le tri après le tri

0 n−1 0 n−1

tab[i]

i

Fig. 5.2 – Representation graphique du tableau d’entiers

– L’axe des abscisses represente les indices des elements du tableau. Il est dessine a une distancee du bord haut de la fenetre.

– L’axe des ordonnees represente les valeurs de ces memes elements. Il est dessine a une distancea du bord gauche de la fenetre.

Ces axes seront dessines au moyen de la procedure Ligne de la bibliotheque graphsimple (voirannexe 9.5 page 120).Chaque element d’indice i du tableau tab est represente par un rectangle dont le sommet superieurgauche a pour coordonnees le couple < a + b + i.(d + c), e >, et dont le sommet inferieur droit apour coordonnees le couple < a + b + i.(d + c) + d, e + tab[i]− V ALMIN >.Pour afficher cet element on utilisera la procedure Rectangle, pour l’effacer on utilisera la proce-dure SuppRectangle.

Animation du trace

Pour visualiser l’echange des elements d’indices i et j du tableau il faut tout d’abord effacer dansla fenetre les deux rectangles representant ces elements, puis effectuer l’echange des deux elements,et enfin re-dessiner deux rectangles representant les nouvelles valeurs des elements d’indices i et j.Remarque : la procedure AttendreDelai de la bibliotheque graphsimple permet de ralentir l’ani-mation lorsque celle-ci est trop rapide.On peut aussi obtenir une execution pas a pas du programme : Il suffit d’invoquer a chaqueiteration la procedure AttendreClic ou bien la procedure AttendreTaper.

Ameliorations possibles

1. Le graphique obtenu lors des etapes precedentes a pour principal defaut d’etre trace “al’envers”. Une premiere amelioration consiste a modifier le programme pour que le trace soiteffectue “a l’endroit”, c’est a dire axe des abscisses en bas de la fenetre graphique et axe desordonnees dirige vers le haut de la fenetre.

2. Pour faciliter l’observation du processus de tri on peut utiliser des couleurs autres que le noiret le blanc. On peut par exemple utiliser une premiere couleur pour les valeurs deja triees etune seconde couleur pour les valeurs non encore triees. On peut aussi utiliser une troisiemecouleur pour mettre en evidence la valeur minimum lors du parcours de la partie non triee.

3. On peut enfin ameliorer l’algorithme de tri en lui-meme : Si lors du parcours de la partiepresumee non triee (indices i a n− 1) la suite des valeurs parcourues s’avere etre croissante,cela signifie que cette partie est en fait deja triee. Les elements de la partie non triee etanttous ≥ a ceux de la partie triee, le tableau est dans ce cas totalement trie, il est inutile depoursuivre l’execution du tri.

43

Page 45: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.5. LE VOYAGEUR DE COMMERCE CHAPITRE 5. SUJETS DE TP

5.5 Le voyageur de commerce

Le TP sera effectue selon les etapes successives ci-dessous, en respectant l’ordre indique.A chaque etape, le programme devra avoir ete compile (et si possible teste) avec succes avant quela realisation ne passe a l’etape suivante.Le codage de chaque etape sera base sur le travail de preparation effectue en TD.

5.5.1 Declaration des variables principales

Les variables representant les informations principales du programme sont les suivantes :– Nombre de villes : variable nbVilles

– Numero de la ville de depart : variable villeDepart

– Distances inter-villes : tableau distances

– Villes deja visitees : tableau dejaVisitee

– Etapes de l’itineraire : tableau etapes

– Distances parcourues depuis la ville de depart : tableau distanceCumulee

– Numero de la ville visitee lors de chaque etape : variable villeCourante

Remarques :– Le nombre de villes maximum est donne par la constante NMAX.– La case no 0 des tableaux n’est pas utilisee.

Coder puis compiler.

5.5.2 Saisie des donnees

Les donnees du programme doivent etre saisies au clavier. Ce sont (dans l’ordre) :

1. Le nombre de villes a visiter (variable nbVilles)

2. Les distances inter-villes (tableau distances) : Si n est le nombre de villes a visiter, il y an(n− 1)/2 valeurs a saisir :– les n− 1 premieres valeurs sont les distances entre la ville no 1 et les villes no 2 a n– les n− 2 valeurs suivantes sont les distances entre la ville no 2 et les villes no 3 a n– . . .– la derniere valeur est la distance entre la ville no n− 1 et la ville no n

3. Le numero de la ville de depart (variable villeDepart)

Coder puis compiler et tester.

5.5.3 Affichage des donnees saisies

Les donnees saisies seront affichees dans l’ordre suivant :

1. Nombre de villes a visiter

2. Numero de la ville de depart

3. Distances inter-villes : le contenu du tableau distances sera affiche sous la forme d’une tablea double entree, sur le modele de ce qui est produit par le programme de demonstrationvoyageur-demosparc.

Coder puis compiler et tester.

44

Page 46: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.5. LE VOYAGEUR DE COMMERCE CHAPITRE 5. SUJETS DE TP

5.5.4 Initialisation des variables de travail et tableaux resultat

Les informations suivantes doivent etre initialisees avant d’entamer la visite des villes :

1. Etat des villes : tableau dejaVisitee

– La ville de depart est visitee.– Les autres villes n’ont pas encore ete visitees.

2. Etapes de l’itineraire : tableau etapes

– La premiere etape est la ville de depart.

3. Distance parcourue : tableau distanceParcourue

– La distance parcourue au depart (etape no 1) est nulle.

4. Ville en cours de visite : variable villeCourante

– La ville visitee lors de la premiere etape est la ville de depart.

Coder puis compiler et tester.

5.5.5 Visite des villes

Il y a au total nbVilles+ 1 villes a visiter :– La ville visitee lors de la premere etape est la ville de depart.– La ville visitee lors de la derniere etape est aussi la ville de depart.

Algorithme

– Pour chaque etape de no i, i ∈ [2, . . . , nbVilles] :

1. Rechercher la ville v non visitee la plus proche de la ville courante.

2. Memoriser dans le tableau dejaVisitee le fait que la ville v est visitee.

3. Memoriser dans le tableau etapes le fait que la ville visitee lors de la ieme etapeest la ville v.

4. Calculer la distance parcourue depuis la ville de depart jusqu’a la ville v etmemoriser cette distance dans le tableau distanceCumulee. Ce calcul doit etreeffectue en utilisant la distance calculee lors de la i− 1eme etape.

5. Memoriser le fait que la nouvelle ville en cours de visite est la ville v.

– Memoriser dans le tableau etapes le fait que la derniere etape consiste a revenir ala ville de depart.

– Calculer la distance totale parcourue apres avoir visite toutes les villes et etre revenua la ville de depart ; memoriser cette distance dans le tableau distanceCumulee.

Coder puis compiler et tester.

5.5.6 Affichage du resultat

L’itineraire calcule par le programme sera affiche sous forme tabulaire, sur le modele de ce quiest produit par le programme de demonstration. Pour chaque etape de l’itineraire devront etreaffiches : Le numero de l’etape, le numero de la ville visitee et la distance parcourue depuis la villede depart.

Coder puis compiler et tester.

45

Page 47: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.6. LE JEU DU TAQUIN CHAPITRE 5. SUJETS DE TP

5.6 Le jeu du taquin

Le but de ce TP est de realiser un jeu de taquin. Le taquin se joue avec un plateau de N × Ncases comme ci-dessous :

Fig. 5.3 – Exemple de plateau de taquin (N = 3)

Chaque case du plateau contient un nombre compris entre 1 et N2 − 1 distinct de celui presentdans les autres cases. Le plateau contient necessairement une case vide. Une case contenant unnombre peut etre deplacee vers la case vide, horizontalement ou verticalement uniquement. Le butdu jeu est de replacer tous les nombres dans l’ordre croissant, de gauche a droite et de haut enbas.

5.6.1 Premiere version : affichage et saisies en mode texte

Initialisation et affichage du taquin

Ecrire un programme taquin1.c qui initialise puis affiche un plateau de taquin. Ce programmefera appel aux procedures remplirTaquin et afficherTaquin decrites ci-dessous.Un jeu de taquin est represente en memoire par un tableau d’entiers (la case vide sera representeepar l’entier 0). Pour faciliter le calcul du deplacement d’une case (voir paragraphe suivant), cetableau comportera N + 2 lignes et N + 2 colonnes : la 1ere et la derniere lignes ne seront pasutilisees, de meme que la 1ere et la derniere colonnes.

– Remplissage du taquinLe programme doit declarer un tableau et l’initialiser avec des valeurs tirees au hasard comprisesentre 0 (case vide) et N2 − 1, toutes differentes les unes des autres.

La constante suivante devra etre utilisee :

#define N 3 /* nombre de lignes et de colonnes du taquin */

Un plateau comme celui de la figure 5.3 peut alors etre represente par un tableau plateau :

int plateau[N + 2][N + 2];

Dans l’exemple ci-dessus, plateau[1][1] a pour valeur 5, plateau[3][1] a pour valeur 4,plateau[3][2] a pour valeur 0, etc.Pour faciliter le deplacement des cases, les cases des lignes 0 et N +1 et des colonnes 0 et N +1devront etre initialisees a la valeur −1.Le remplissage (l’initialisation) du taquin sera effectuee par le sous-programme :

void remplirTaquin(int p[N + 2][N + 2]);

– Affichage du taquinL’affichage du taquin est dans cette premiere version effectue en mode texte, par le sous-programme :

void afficherTaquin(int p[N + 2][N + 2]);

Ce sous-programme fera lui-meme appel au sous-programme standard printf.Remarque : la case de valeur 0 doit etre affichee comme etant vide !...

46

Page 48: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.6. LE JEU DU TAQUIN CHAPITRE 5. SUJETS DE TP

Deplacement d’une case

Completer le programme precedent pour autoriser le deplacement des cases du plateau de taquin.Les deplacements de case demandes par l’utilisateur seront saisis au clavier (sous-programmescanf), sous la forme d’un numero de ligne et d’un numero de colonne.

Apres l’affichage initial du plateau, le programme permet a un joueur de deplacer une case con-tenant un nombre vers la case vide adjacente : dans l’exemple de la figure 5.3 ci-dessus, le joueurpeut demander de deplacer la case de valeur 8, ce deplacement est valide puisque la case corres-pondante est adjacente a la case vide. De meme, s’il choisit la case de valeur 4. Dans les deux cas,la case choisie et la case vide doivent etre interverties.Si par contre il choisit la case de valeur 3, le deplacement n’est pas possible, le programme doitdans ce cas re-demander a l’utilisateur un coup valide.Si le joueur choisit une case situee hors du plateau, le programme se termine.

La partie du programme a ecrire concernant le deplacement des cases est structuree sous la formed’une iteration :

attendre que le joueur saisisse un deplacement

tant que le joueur a choisi une case situee sur le plateau

si le joueur a choisi une case valide alors

effectuer le deplacement de cette case

re-afficher le taquin

sinon

informer le joueur que son coup n’est pas valide

attendre que le joueur saisisse un deplacement

Remarque 1 : une case situee sur le plateau est une case dont le numero de ligne et le numero decolonne sont compris entre 1 et N .Remarque 2 : une case valide est une case qui contient une valeur comprise entre 1 et N2 − 1.

Initialisation du taquin par le joueur

On veut maintenant que l’utilisateur puisse initialiser lui-meme le taquin. Creer une copie taquin2.cdu programme precedent et la modifier de facon a ce que le joueur puisse saisir une valeur initialecomprise entre 0 et 8 pour chacune des cases du taquin.La saisie sera effectuee par le sous-programme :

void saisirTaquin(int p[N + 2][N + 2];

Ce sous-programme fera lui-meme appel au sous-programme standard scanf. Il devra initialisercorrectement les lignes 0 et N + 1 ainsi que les colonnes 0 et N + 1.

Jouer avec le programme

Creer une copie taquin3.c du programme precedent et la modifier de facon a ce que le programmeobtenu informe l’utilisateur qu’il a gagne lorsque toutes les cases sont rangees dans l’ordre croissantde leurs valeurs, de gauche a droite, et de haut en bas.Completer ensuite le programme pour qu’en fin de partie (gain de la partie ou abandon) le joueurpuisse soit effectuer une nouvelle partie, soit terminer le programme. On rappelle que l’abandoncorrespond au choix d’une case situee hors du plateau.Remarque : dans la configuration gagnante, la case vide se trouve en bas et a droite du taquin.

47

Page 49: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.6. LE JEU DU TAQUIN CHAPITRE 5. SUJETS DE TP

5.6.2 Seconde version : realisation d’une interface graphique

Dans cette version, le programme doit communiquer avec le joueur au moyen d’une fenetregraphique dans laquelle est dessine le plateau de taquin. Une bordure de largeur egale a celled’une case est reservee autour du plateau de taquin, afin de permettre a l’utilisateur de cliquer endehors du plateau.L’algorithme principal du programme devient :

initialiser le taquin et la fenetre graphique

dessiner le taquin

attendre que le joueur ait clique sur une case

tant que le joueur a clique sur une case situee sur le plateau

si le joueur a clique sur une case valide alors

effectuer le deplacement de cette case

mettre a jour le dessin du taquin

sinon

informer le joueur que son coup n’est pas valide

attendre que le joueur ait clique sur une case

La constante suivante devra etre declaree :

#define MAILLE 80 /* dimensions d’une case (en pixels) */

L’affichage du dessin sera effectue par la procedure :

void dessinerTaquin(int p[N + 2][N + 2]);

Cette procedure doit faire appel aux sous-programmes de la bibliotheque graphsimple (voir an-nexe 9.5 page 120).Le programme doit a present etre compile au moyen de la commande gccgraph (au lieu de gcc).Vous aurez plus particulierement besoin des procedures suivantes :

– void Initialiser(int l, int h) pour ouvrir une fenetre graphique de dimensions l × h.Exemple d’utilisation : Initialiser(largeur, hauteur);

– void Ligne(int x1, int y1, int x2, int y2) pour dessiner le plateau.Exemple d’utilisation : Ligne(120, 10, 150, 10) ;

– void EcrireDessus(int x, int y, char texte[2]) pour ecrire les valeurs des cases en ef-facant ce qu’il y a dessous (x et y representent les coordonnees en pixels du centre de la caseconcernee).Exemple d’utilisation : EcrireDessus(xc, yc, "7") ;

Remarque : pour la conversion d’un entier compris entre 0 et 9 en une chaıne de caracteres, onutilisera un tableau de 2 caracteres que l’on remplira soit en utilisant le codage ASCII du chiffredecimal correspondant a cet entier (en prenant garde de terminer la chaıne de caracteres par lecaractere special ’\0’), soit au moyen de la procedure sprintf (taper man sprintf pour plusd’informations).

– void AttendreClicXY(int *x, int *y, int *b) qui attend un clic de souris et enregistre sescoordonnees ainsi que le numero du bouton clique dans les variables designees par les parametres*x, *y et *b.Attention : ces coordonnees sont representees dans le repere graphique de l’ecran ; il faut ensuiteles convertir en coordonnees (i, j) d’une case du tableau representant le taquin.Exemple d’utilisation : AttendreClicXY(&xx, &yy, &bouton);

– void Clore(void) pour fermer la fenetre graphique.Exemple d’utilisation : Clore();

48

Page 50: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.7. MANIPULATION DE FICHIERS CHAPITRE 5. SUJETS DE TP

5.7 Manipulation de fichiers

5.7.1 Explication prealable

Un fichier est un ensemble d’informations stockees sur un peripherique d’ordinateur, et repere parun nom. Les donnees d’un fichier ne s’effacent pas lorsqu’on coupe le courant, a la difference desvaleurs des variables utilisees ordinairement pas les programmes.La communication entre l’unite centrale et le peripherique, c’est-a-dire entre le programme et lefichier, s’effectue dans un sens bien determine, soit du peripherique vers l’unite centrale (lecture),soit de l’unite centrale vers le peripherique (ecriture), mais pas dans les deux sens a la fois ; lesdonnees transitent sequentiellement (a la queue leu leu) depuis le fichier vers le programme, oudans l’autre sens.Les programmes utilisent des variables de type ”fichier”, qui sont des structures permettant le lienentre le programme et le fichier proprement dit ; ces structures doivent etre renseignees (initialisees)avant toute action du programme sur le fichier : c’est ce qu’on appelle l’ouverture du fichier.L’ouverture d’un fichier provoque en general une reservation de ce fichier par le programme, defacon a empecher l’action d’un autre programme en meme temps sur le meme fichier ; c’est pourquoilorsqu’il a termine son action, le programme doit ”fermer” le fichier afin d’annuler la reservationdu fichier.Les fichiers peuvent contenir toutes sortes d’information, images, videos, sons, etc., mais on n’u-tilisera ici que des fichiers de texte. Voici deux exemples de programmes, l’un qui lit un fichier, etaffiche le contenu a l’ecran, l’autre qui lit un texte au clavier et ecrit ce texte dans un fichier.

#include <stdio.h> /* ce programme lit le contenu d’un fichier

et l’affiche sur l’ecran */

int main(){

FILE* fic; /* declaration de la variable fichier */

char carac;

fic = fopen("exemple.txt","r"); /* ouverture en lecture */

if (fic == NULL) {

printf("fichier introuvable");

exit(1); /* arret du programme */

}

carac = fgetc(fic); /* lecture du premier caractere du fichier */

while (carac != EOF) { /* repetition tant que carac n’est pas EOF */

printf("%c",carac); /* affichage du caractere sur l’ecran */

carac = fgetc(fic); /* lecture du caractere suivant */

}

fclose(fic); /* fermeture du fichier */

return 0;

}

Ce programme de lecture du fichier exemple.txt utilise une repetition pour lire tous les caracteresdu fichier l’un apres l’autre ; cette repetition s’arrete lorsqu’elle rencontre le caractere special EOF,qui indique la fin du fichier : ”End Of File” signifie ”fin de fichier”. La fonction fopen recoit deuxparametres ; le premier est le nom du fichier a ouvrir, le second est ”r”(read : lecture) ou ”w”(write :ecriture) ; la fonction produit une variable de type fichier, qui representera ensuite le fichier dansle programme ; si la fonction ne trouve pas le fichier, elle produit la valeur NULL.

#include <stdio.h>

/* ce programme ecrit dans un fichier

49

Page 51: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.7. MANIPULATION DE FICHIERS CHAPITRE 5. SUJETS DE TP

des informations tapees au clavier */

int main(){

FILE* fic; /* declaration de la variable fichier */

char carac;

fic = fopen("exemple.txt","w"); /* ouverture en ecriture */

printf("Taper le texte a mettre en fichier ; pour finir, taper ctrl-D\n\n");

carac = getchar(); /* lecture au clavier du premier caractere */

while (carac != EOF) { /* repetition tant que carac n’est pas EOF */

fprintf(fic,"%c",carac); /* ecriture du caractere dans le fichier */

carac = getchar(); /* lecture au clavier du caractere suivant */

}

fclose(fic); /* fermeture du fichier */

return 0;

}

5.7.2 Questions

Les programmes des questions qui suivent vont lire et ecrire des fichiers ; il est important decreer un unique dossier pour ce TP, dans lequel on mettra TOUS les fichiers utilises, les textesdes exemples, les textes des programmes et les programmes compiles. Les programmes que vousecrivez doivent etre testes par vos soins.

1. Ecrire et enregistrer un fichier exemple.txt contenant un texte, par exemple :

Demain ne meurt jamais

A demain

Ecrire, enregistrer, compiler et executer le programme de lecture de fichier fourni ci-dessus ;l’execution doit faire apparaıtre a l’ecran le contenu du fichier exemple.txt.

Modifier le programme pour qu’il demande le nom du fichier a lire.

Modifier le programme pour qu’il saute une ligne a chaque fin de ligne rencontree ; on rappelleque le caractere de fin de ligne est code ’\n’ en langage C.

2. Ecrire, enregistrer, compiler et executer le programme d’ecriture de fichier fourni ci-dessus.Tester au moins deux fois, avec differents textes : qu’arrive-t-il au fichier exemple.txt ?

3. Recopie

Ecrire un programme copie qui demande le nom d’un fichier a lire, le nom d’un fichier aecrire, et recopie le contenu du premier dans le deuxieme.

4. Fusion 1

Ecrire un programme qui lit deux fichiers source1 et source2, et qui recopie le contenu desource1, suivi du contenu de source2 dans un troisieme fichier but.

5. Fusion 2

Ecrire un programme qui lit deux fichiers source1 et source2, et qui recopie un caracterede source1, suivi d’un caractere de source2, suivi d’un caractere de source1, etc. dans untroisieme fichier but, jusqu’a epuisement des deux fichiers sources.

Voici une description plus precise :

Tant qu’aucun des deux, source1 et source2, n’est epuise

lire un caractere de source1, l’ecrire dans but

lire un caractere de source2, l’ecrire dans but

/* Ici, la repetition s’acheve : un au moins des fichiers

50

Page 52: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.7. MANIPULATION DE FICHIERS CHAPITRE 5. SUJETS DE TP

source1, ou source2, est epuise */

Recopier la fin de source1

Recopier la fin de source2 /* l’un des deux est epuise,

mais on ne sait pas lequel */

6. Fusion 3

Ecrire un programme qui lit deux fichiers source1 et source2, et qui les fusionne dans untroisieme fichier but, ligne apres ligne, c’est-a-dire une ligne de source1, suivie d’une ligne desource2, etc.

51

Page 53: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.8. TRI AVEC SOUS-PROGRAMMES CHAPITRE 5. SUJETS DE TP

5.8 Tri avec sous-programmes

5.8.1 Sujet du TP

Le but de ce TP est d’implementer deux algorithmes de tri en utilisant des sous-programmes : letri par selection vu dans un TP precedent (cf. section 5.4 page 40) et le tri a bulles.

5.8.2 Structure des programmes

L’algorithme general qui sera implante est bati sur un modele proche de celui vu pour le tri parselection (la seule difference notable etant la definition de sous-programmes auxillaires) :

– lire le nombre n d’elements a trier– initialiser le generateur aleatoire (facultatif)– remplir le tableau a trier– afficher les elements du tableau non trie– trier le tableau– afficher les elements du tableau trie

Les constantes suivantes devront etre definies :

– NMAX : nombre maximum d’elements a trier– VALMIN : valeur minimale d’un element du tableau– VALMAX : valeur maximale d’un element du tableau

5.8.3 Remplissage du tableau

Les n elements du tableau a trier sont generes aleatoirement au moyen de la fonction hasard. Onpeut auparavant appeler la procedure initialiser_germe si l’on souhaite obtenir la meme seriede valeurs a chaque execution du programme.Definir une procedure remplirTableau qui affecte a chacun des elements du tableau un entier tireau hasard. Cette procedure a pour parametres formels :

– tableau : le tableau d’entiers a remplir– nbElem : le nombre d’elements a initialiser dans le tableau

5.8.4 Affichage du tableau

Definir une procedure afficherTableau qui affiche les elements du tableau. Cette procedure apour parametres formels :

– tableau : le tableau d’entiers a afficher– nbElem : le nombre d’elements a afficher

5.8.5 Tri par selection

Le principe du tri par selection a deja ete presente (cf. section 5.4.3 page 41). Voici un rappel del’algorithme retenu :

i parcourant [0, . . . , n− 2]rechercher le minimum des elements d’indices i a n− 1echanger cet element minimum avec l’element d’indice i

Realisation

Trois sous-programmes seront utilises pour realiser cet algorithme :

1. procedure echanger : intervertit deux elements du tableau. Les parametres formels de cetteprocedure sont :– tableau : le tableau d’entiers au sein duquel doit avoir lieu l’echange

52

Page 54: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.8. TRI AVEC SOUS-PROGRAMMES CHAPITRE 5. SUJETS DE TP

– u, v : les indices des elements a echanger

2. fonction minimum : determine l’indice dans le tableau du plus petit element se trouvant dansun intervalle d’indices donne. Les parametres formels de cette fonction sont :– tableau : le tableau d’entiers au sein duquel se trouve la valeur minimum recherchee– bi, bs : les bornes de l’intervalle d’indices delimitant les elements du tableau contenant

le minimum chercheLa valeur de la fonction est l’indice du plus petit element trouve.

3. procedure triSelect : effectue le tri selon l’algorithme rappele ci-dessus. Les parametresformels de cette procedure sont :– tableau : le tableau d’entiers a trier– nbElem : le nombre d’elements a trier

Definir les trois sous-programmes permettant d’effectuer le tri, puis ecrire un programme complettrisel.c utilisant les sous-programmes auxillaires permettant de realiser l’algorithme generalpresente en section 5.8.2 ci-dessus.

Visualisation graphique

Dans cette partie du TP on remplace l’affichage textuel (dans la console Unix) par un affichagegraphique (dans une fenetre separee).Pour la representation graphique du tableau et du processus de tri, on se reportera aux indicationset consignes donnees dans l’enonce du TP “Tri par selection” (voir section 5.4.4 page 42).On rappelle que cette visualisation graphique repose sur l’utilisation de la bibliotheque graphsimple(voir annexe 9.5 page 120).

5.8.6 Tri a bulles

Principe

Le principe du tri a bulles est a la base le meme que ceui du tri par selection tel qu’il est presenteen section 5.4.3 page 41 : A chaque etape i, il faut placer en position i le plus petit entier setrouvant dans la partie non triee, c’est a dire parmi les elements d’indices i a n− 1.

L’algorithme du tri a bulles differe du tri par selection uniquement par la facon dont le plus petitelement de la partie non triee est ramene en position i : au lieu d’effectuer une recherche deminimum, on permute successivement toutes les paires d’elements consecutifs qui ne sont pas dansle bon ordre.

Par exemple, considerons la suite d’entiers : S = [7, 5,3, 9].On veut ramener en 1ere position le plus petit element de cette suite, ici la valeur 3.On parcourt la suite en sens inverse, depuis l’avant-dernier element jusqu’au premier. A chaqueetape on permute l’element d’indice j avec l’element d’indice j+1, si et seulement si S[j] > S[j+1].Dans cet exemple, l’algorithme se deroule en trois etapes :– etape 1 : S0 = [7, 5,3,9], 3 ≤ 9→ pas de permutation → S1 = [7, 5,3, 9].– etape 2 : S1 = [7,5,3, 9], 5 > 3→ permutation de 5 et 3 → S2 = [7,3, 5, 9].– etape 3 : S2 = [7,3, 5, 9], 7 > 3→ permutation de 7 et 3 → S3 = [3, 7, 5, 9].Le plus petit element de la suite est ainsi descendu petit a petit de sa position initiale (comme s’iletait le plus lourd) pour se retrouver finalement en 1ere position.Dans cette version de l’algorithme les “bulles” descendent, ce qui n’est pas tout a fait conforme aucomportement auquel on s’attendrait de la part d’une bulle1 !

1On peut obtenir des bulles qui montent en inversant le sens des parcours de l’algorithme principal et de

l’algorithme secondaire.

53

Page 55: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.8. TRI AVEC SOUS-PROGRAMMES CHAPITRE 5. SUJETS DE TP

Realisation

L’algorithme principal du tri a bulles est donc :

i parcourant [0, . . . , n− 2]en utilisant l’algorithme des bulles, placer en position i le plus petit des elements

d’indices i a n− 1

Definir une procedure placerMinimum qui realise l’algorithme des“bulles”selon le principe presenteplus haut. Cette procedure a pour parametres formels :

– tableau : le tableau d’entiers auquel l’algorithme des bulles doit etre applique– bi, bs : les bornes de l’intervalle d’indices delimitant les elements du tableau auquels

l’algorithme doit etre applique

A la fin de l’execution de la procedure le plus petit element de la partie du tableau delimitee parles indices bi et bs a ete place en position bi.Indication : cette procedure doit utiliser la procedure echanger.

Ecrire un programme complet tribulles.c utilisant l’algorithme du tri a bulles et structure selonl’algorithme general donne en section 5.8.2.

Visualisation du tri

De la meme maniere que pour le tri par selection, modifiez le programme tribulles.c pourvisualiser de facon graphique le processus du tri a bulles, en prenant soin d’utiliser chaque fois quepossible les sous-programmes existants.

54

Page 56: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.9. L’EDITEUR GRAPHIQUE CHAPITRE 5. SUJETS DE TP

5.9 L’editeur graphique

Nous proposons de realiser un editeur graphique simplifie. Pour dessiner, l’utilisateur specifie auclavier la forme qu’il souhaite dessiner, puis avec la souris les coordonnees sur la zone de dessin.Par exemple, pour dessiner un rectangle, l’utilisateur annonce qu’il souhaite dessiner un rectangleau clavier, puis effectue deux clics souris dans la zone de dessin pour specifier la taille et la positiondu rectangle a creer.

5.9.1 Dessiner une forme dans la zone de dessin

Programme 1 : dessiner1.cNous considerons trois formes de dessin possible : Rectangle, Cercle, Segment. Les dessins creesdans la zone sont ranges dans des tableaux. Nous considerons un tableau par forme de dessin. Nousavons donc trois tableaux. Afin de limiter la taille de ces tableaux, nous fixons a 10 le nombremaximum de dessins par forme.

Modalite de dessin :1- Pour un rectangle :L’utilisateur saisit au clavier ’r’, puis effectue deux clics souris dans la zone de dessin, qui definissentla diagonale du rectangle. Les coordonnees des deux points du rectangle (x1, y1) et (x1’, y1’) sontstockees dans le tableau.

x1 y1 x1’ y1’ x2 y2 x2’ y2’ . . .

2- Pour un cercle :L’utilisateur saisit au clavier ’c’ puis effectue deux clics souris dans la zone de dessin, qui definissentrespectivement le centre et un point sur le cercle. Les coordonnees du centre (x1, y1) et le rayondu cercle rayon1 sont stockes dans le tableau.

x1 y1 rayon1 x2 y2 rayon2 . . .

3- Pour un segment :L’utilisateur saisit au clavier ’s’ puis effectue deux clics souris dans la zone de dessin, qui definissentles deux extremites de la segment. Les coordonnees des deux extremites (x1,y1) et (x1’, y1’) sontstockees dans le tableau.

x1 y1 x1’ y1’ x2 y2 x2’ y2’ . . .

Les declarations correspondantes sont les suivantes :

#define MaxForme 10 /* Nb maximum de formes autorisees */

#define demande_rect ’r’ /* Lettres saisies dans le menu */

#define demande_cerc ’c’

#define demande_segm ’s’

#define demande_quit ’q’

int LesRectangles[MaxForme][4]; /* Tableau des rectangles */

int LesCercles [MaxForme][3]; /* Tableau des cercles */

int LesSegments [MaxForme][4]; /* Tableau des segments */

int NbRectangles; /* Nombre de rectangles */

int NbCercles; /* Nombre de cercles */

int NbSegments; /* Nombre de segments */

Nous proposons d’ecrire les fonctions et procedures suivantes :

55

Page 57: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.9. L’EDITEUR GRAPHIQUE CHAPITRE 5. SUJETS DE TP

1- Fonction afficher menu :

Cette fonction affiche un menu dans la fenetre de l’interpreteur de commandes et retourne lecaractere saisi par l’utilisateur. On pourra effectuer la saisie a partir de la fenetre graphique enutilisant les fonctions TestClavier et Touche (au lieu de passer par la fenetre de l’interpreteurde commandes en utilisant un scanf ). La fonction afficher menu doit verifier que l’utilisateursaisisse un caractere valide. Le menu doit proposer des choix possibles pour l’utilisateur. Parexemple si l’utilisateur a deja cree 10 cercles, le menu doit par exemple avoir la forme suivante :

Voulez-vous dessiner :

- un rectangle : tapez la touche r,

- un segment : tapez la touche s,

ou voulez-vous quitter l’application : tapez la touche q

Entrez votre choix :

Si l’utilisateur a deja dessine 10 rectangles, 10 cercles et 10 segments, la seule option restanteconsiste a quitter l’application. La forme du menu pourrait etre alors :

Voulez-vous quitter l’application : tapez la touche q

Entrez votre choix :

Nous suggerons l’introduction d’une fonction intermediaire (choix valide) qui verifie que la touchesaisie par l’utilisateur est valide.

2- Procedure creer rectangle

Pour dessiner un rectangle, deux clics souris doivent etre effectues. La procedure CliquerXYpermet d’attendre un clic souris et d’obtenir les coordonnees (x, y) de ce clic. La procedurecreer rectangle range le nouveau rectangle ainsi cree dans le tableau correspondant et le des-sine a l’ecran. Le tableau et le nombre de rectangles etant modifies, il faut utiliser un passage deparametres par reference.– Determiner la signature (en-tete) de cette procedure.– Realiser la procedure.

3- Procedure creer cercle

Pour dessiner un cercle, deux clics souris doivent etre effectues. Le rayon du cercle doit etre calcule.La procedure creer cercle range le nouveau cercle ainsi cree dans le tableau correspondant et ledessine a l’ecran. Le tableau et le nombre de cercles etant modifies, il faut utiliser un passage deparametres par reference.– Determiner la signature de cette procedure.– Realiser la procedure.

4- Procedure creer segment

Pour dessiner un segment, deux clics souris doivent etre effectues. La procedure creer segmentrange le nouveau segment ainsi cree dans le tableau correspondant et le dessine a l’ecran. Letableau et le nombre de segments etant modifies, il faut utiliser un passage de parametres parreference.– Determiner la signature de cette procedure.– Realiser la procedure.

5- Programme principal de dessiner1

En utilisant les fonctions et procedures ci-dessus, realiser le programme principal.

56

Page 58: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.9. L’EDITEUR GRAPHIQUE CHAPITRE 5. SUJETS DE TP

5.9.2 Formes elastiques

Programme 2 : dessiner2.cDupliquer le fichier dessiner1.c en le nommant dessiner2.c.

Lorsque nous creons un dessin, nous voulons cette fois que la forme suive le curseur lors de la crea-tion jusqu’a l’occurrence d’un deuxieme clic souris. Par exemple, si l’utilisateur cree un rectangle :1- L’utilisateur saisit la touche ’r’.2- L’utilisateur effectue un clic souris. A partir de ce point, un rectangle est affiche et suit laposition du curseur jusqu’a ce que l’utilisateur effectue le deuxieme clic. Ce mecanisme s’appelleforme elastique (par analogie avec la deformation d’un elastique).3- A l’occurrence du deuxieme clic souris le rectangle est cree.

6- Modifier les procedures creer rectangle, creer cercle et creer segment pour afficherles formes elastiques correspondantes.

La fonction GlisserXY permet d’obtenir les coordonnees (x, y) de la souris lorsqu’elle se deplace.

int GlisserXY(int *x, int *y) ;

Une solution pour realiser la forme elastique consiste a :

Attendre un clic souris (procedure CliquerXY)

Tant qu’il n’y a pas de deuxieme clic souris (procedure Clic)

Recuperer les coordonnees de la souris a chaque mouvement (procedure GlisserXY)

Effacer la fenetre et re-afficher toutes les formes.

Afficher la forme a la nouvelle position.

Stocker la nouvelle forme et mettre a jour le compteur correspondant.

Le traitement s’arrete lorsqu’un deuxieme clic souris est recu. La fonction Clic permet de savoirsi un des boutons de la souris a ete enfonce sans bloquer le programme.Puisque l’on affiche toutes les etapes de dessin, on est oblige de re-afficher toutes les formes achaque etape. Il est conseille d’utiliser une procedure afficher tout qui efface entierement lafenetre graphique (procedure Effacer) et affiche toutes les formes deja creees.

5.9.3 Destruction d’un dessin dans la zone

Programme 3 : dessiner3.cDupliquer le fichier dessiner2.c en le nommant dessiner3.c.

Nous proposons de rajouter une fonction de destruction a notre editeur. Il s’agit tout d’abord derajouter un choix dans notre menu qui correspond a la destruction. Cette destruction se fait parselection avec la souris du dessin a detruire.

7- Modifier la fonction afficher menu pour rajouter l’option ”detruire”.

8- Ecrire la procedure detruire.

Cette procedure detruit un dessin qui a ete designe par un clic souris. A partir des coordonneesdu clic, il s’agit de parcourir les tableaux pour determiner quel dessin a ete selectionne. Quandplusieurs figures se chevauchent, la priorite sera donc donnee par l’ordre dans lequel on effectueles differents parcours. Pour cela nous suggerons la realisation de trois fonctions intermediaires :

- XYestDansRect (un point, un rectangle) qui rend vrai si le point est a l’interieur du rectangle.- XYestDansCercle (un point, un cercle) qui rend vrai si le point est a l’interieur du cercle.- XYappartientSegment (un point, un segment) qui rend vrai si le point appartient au segment.(Remarque : a cause de l’imprecision du trace et des coordonnees du clic dans la fenetre graphique,

57

Page 59: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

5.9. L’EDITEUR GRAPHIQUE CHAPITRE 5. SUJETS DE TP

prevoir une marge de tolerance pour cette fonction)

A la destruction d’un dessin d’une forme donnee, le tableau et le nombre de dessins de la formedoivent etre mis a jour. Une fois supprimee du tableau, on peut appeler la procedure afficher toutpour mettre a jour le dessin.Nous suggerons pour la mise a jour du tableau un decalage vers la gauche pour ne pas laisser decases libres dans le tableau.

9- Modifier le programme principal pour prendre en compte la nouvelle option ”detru-ire”.

58

Page 60: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

Chapitre 6

Projets

6.1 Jeu d’echecs

Principe : le jeu est represente par un tableau 2D d’entiers 8x8. Le chiffre des dizaines correspond ala couleur (1=blanc, 2=noir) et le chiffre des unites au type de piece (1=pion, 2=tour, 3=cavalier,4=fou, 5=reine, 6=roi). Un entier nul correspond a une case vide. Pour savoir si une case estblanche ou noir, il suffit de faire la somme des coordonnees de la case : blanc pour une sommepaire, noir pour une somme impaire.Exemple de plateau :

22 23 24 25 26 24 23 2221 21 21 21 21 21 21 210 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 011 11 11 11 11 11 11 1112 13 14 15 16 14 13 12

Librairies : <stdio.h> , <stdlib.h>, et en mode graphique ”graphsimple.h”

Variables globales : plateau de jeu :a quel joueur de jouer ? (1=blc, 2=noir)type de joueur (1=ordi, 2=humain) : case 0non utilisee, case 1=blancs, case 2=noirsfin de partie (1=blcs gagnent, 2=noirs gag-nent, 3= pat, 4=abandon) :

int Plateau[8][8] ;int tour=1 ;

int type[3] ;

int finPartie=0 ;

int main ()

Cette fonction :– appelle la procedure Init– tant que la finPartie==0 :

– si type[tour]==1 appelle joueOrdi(tour)– sinon appelle joueHumain(tour)– affiche le plateau

59

Page 61: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

6.1. JEU D’ECHECS CHAPITRE 6. PROJETS

– si tour==1 tour prend la valeur 2, sinon tour prend la valeur 1.– appelle la procedure Fin

void Init ()

Cette procedure :– initialise le mode graphique (en mode graphique seulement)– affiche (eventuellement) un message ou un ecran de bienvenue– initialise Plateau, puis les variables type[1] et type[2] :

– en demandant de quelle nature sont les deux joueurs– en tirant au hasard lequel des deux a les blancs a l’aide de la fonction hasard (voir livret

rouge))– affiche le plateau

void Fin ()

Cette procedure :– affiche un message approprie selon la valeur de FinPartie– clot le mode graphique (en mode graphique seulement)

void joueOrdi (int tour)

Cette procedure declare un plateau S de taille 2*16 qui stocke les coordonnees de toutes lespieces du plateau dont la dizaine vaut tour, un entier max et deux tableaux Coup et CoupMax2x2 d’entiers. Puis elle :– calcule S et le nombre de pieces restantes dont la dizaine vaut tour– appelle calculeScoreMax pour la premiere piece de S (avec CoupMax), stocke le resultat dans

max– pour chaque piece de S, si calculeScoreMax >max (avec Coup), max et CoupMax changent de

valeur– appelle joueCoup (coupMax)

void calculeScoreMax (int unePiece[2], int coup[2][2])

Cette procedure prend comme parametre une piece (referencee par ses coordonnees sur le plateau)et un coup (reference par deux couples de coordonnees). Le plateau coup est non rempli au depart.Elle declare de plus un tableau tousCoups de 2x27 entiers (car une piece a au plus 27 deplacementspossibles), deux entiers score et scoreMax, et un tableau coupMax de deux entiers. Puis elle :– appelle la procedure calculeCoups (avec unePiece, tousCoups et un entier nbCases), qui remplit

tousCoups– pour le premier couple de tousCoups, appelle calculeScore (avec unePiece), stocke le resultat

dans scoreMax et le couple dans coupMax– pour chaque couple de tousCoups, appelle calculeScore (avec unePiece), stocke le resultat dans

scoreTemp ; si scoreTemp > scoreMax, scoreMax et coupMax changent de valeur.– coup[0] prend la valeur de unePiece et coup[1] la valeur de coupMax.

void calculeCoups (int piece[2], int coups[2][27], int *nbCases)

Cette procedure prend comme parametre une piece (referencee par ses coordonnees sur le plateau),un tableau vide de cases du plateau ou est censee pouvoir aller cette piece (vide au debut) et unentier qui sera rempli avec le nombre de cases du tableau coups rempli a la fin. Elle declare deplus un plateau PlateauTemp[8][8] d’entiers, qui contiendra le plateau une fois chaque coup joue.*nbCases est mis a 0. Selon le type de piece, la procedure essaye les differents coups ; pour chaquecoup a priori possible (c’est a dire tel que la piece peut aller sur la case), un plateau de jeuPlateauTemp contenant la nouvelle configuration est genere a partir de Plateau. Si testEchec(PlateauTemp,

60

Page 62: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

6.1. JEU D’ECHECS CHAPITRE 6. PROJETS

tour) est egal a 0, c’est a dire si le fait de jouer cette piece ne met pas le joueur en echec, ce coupest ajoute a coups et *nbCases est augmente de 1.

int calculeScore (int piece[2], int nouvelleCase[2])

Cette fonction calcule le score d’un coup. C’est la seule fonction a changer pour changer lastrategie de l’ordinateur. Une possibilite serait :– si ce coup met l’adversaire en echec et mat (creer un nouveau plateau et tester si testEchec

donne comme resultat 2), le resultat est 1000– si ce coup met l’adversaire en echec, le resultat est 100– si ce coup cree une reine, le resultat est 50– si ce coup permet un roque, le resultat est 10– si ce coup prend :

– la reine de l’adversaire, le resultat est 20– une tour : 5– un fou, un cheval : 4– un pion : 3

– sinon, le resultat est de 1

int testEchec (int P[8][8], int T)

Cette procedure teste si le plateau de jeu P reflete une situation d’echec, pour les blancs si T==1,pour les noirs si T==2. Le resultat est 1 s’il y a echec et 2 s’il y a echec et mat, 3 s’il y a pat, 0dans le cas contraire. Sachant qu’il y a echec, pour savoir s’il y a echec et mat, pour chaque coupque peuvent faire les blancs si T==1 ou les noirs si T==2 (procedure calculeCoups), on cree unnouveau plateau de jeu et on teste si testEchec appele avec le nouveau plateau et T est differentde 0. Si le resultat est different de 0 pour toutes les pieces, il y a echec et mat.

void joueHumain (int Tour)

Cette procedure :– calcule s’il y a pat (testEchec vaut 3), si oui finPartie est mis a 3, sinon :

– 1. demande au joueur d’entrer deux couples de coordonnees, un pour la case de depart et unpour la case d’arrivee

– 2. calcule l’ensemble E des coups jouables par le joueur Tour (proc. calculeCoups) avec lapiece de depart

– si le coup correspondant n’est pas dans E, recommencer l’etape 1.– s’il y a echec et mat, le joueur a gagne, si oui finPartie est mis a Tour

61

Page 63: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

6.2. NUAGES DE PARTICULES CHAPITRE 6. PROJETS

6.2 Nuages de particules

Principe : ce projet a pour but de visualiser une simulation numerique de l’evolution d’un nuagede particules. Le nuage de particules est represente par un tableau de 6 lignes (la position du pointsur l’ecran, son vecteur vitesse et son vecteur acceleration) et un grand nombre de colonnes (unecolonne par particule). Les positions des particules sont calculees toutes les unites de temps etaffichees sur l’ecran. Les particules sont en interaction de masse avec les autres particules, soit uneacceleration (simplifiee) de

~ai =∑

j 6=i

posj − posi

|posj − posi|3

Librairies : <stdio.h> , <stdlib.h>, <time.h>, <math.h> et ”graphsimple.h”

Constantes : DIAM MINNBPARTDELAINBZONESXMAX, YMAX

Diametre minimal du nuageNombre de particulesTemps (en ms) a attendre entre deux affichages du nuageNombre de zones de densites differentesDimensions de la fenetre en pixels

int main ()

Cette fonction :– initialise les positions, vitesses et accelerations des particules (procedure Init)– affiche le nuage (procedure afficheNuage)– attend DELAI ms (procedure usleep, predefinie)– tant que le diametre du nuage est superieur a DIAM MIN (fonction diametre) :

– calcule les nouvelles positions de chaque particule a partir de sa position prededente, de savitesse et de son acceleration (procedure calcule Pos)

– calcule les nouvelles accelerations de chaque particule a partir des nouvelles positions (proce-dure calcule Acc)

– calcule les nouvelles vitesses a partir des nouvelles accelerations (procedure calcule Vit)– affiche le nouveau nuage de particules (procedure afficheNuage)– attend DELAI ms

– termine le programme (procedure Fin)

void Init (float nuage[6][NBPART])

Cette procedure :– initialise le mode graphique– initialise nuage de la facon suivante :

– toutes les vitesses sont nulles– demande a l’utilisateur d’effectuer NBZONES fois :

– deux clics qui delimitent une zone sur l’ecran entre (x1, y1) et (x2, y2)– d’indiquer la densite de particules dans cette zone (nombre entre 1 et 100)

– ces donnees sont memorisees dans un tableau tab 6xNBZONES d’entiers construit ainsi :

62

Page 64: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

6.2. NUAGES DE PARTICULES CHAPITRE 6. PROJETS

Zone 0 Zone 1 Zone 2 ... Zone NBZONES-1x1 200 50 330 ... 12y1 50 25 400 ... 43x2 220 100 380 ... 25y2 80 75 500 ... 79densite 12 28 40 ... 8densite cumul. 12 40 80 ... 100

– Pour chacune des NBPART particules :– un nombre nb est genere aleatoirement entre 1 et 100– ce nombre determine la zone i de la particule, qui est telle que tab[6][i-1]≤nb≤tab[6][i] (at-

tention au cas particulier de la premiere zone)– ensuite deux entiers sont tires au hasard entre x1, x2 et y1, y2 respectivement de la zone i.

Ces deux entiers fournissent la position initiale de la particule courante– Lorsque toutes les positions ont ete calculees, les accelerations doivent etre calculees a leur tour

(procedure calcule Acc)

void Fin ()

Cette procedure clot le mode graphique.

void calcule Pos (float nuage[6][NBPART])

Cette procedure calcule, pour chaque particule, sa position a partir de son ancienne positionet de sa vitesse courante a l’aide de la formule (simplifiee) :

Mnouveau −Mancien + ~vitesse

void calcule Vit (float nuage[6][NBPART])

Cette procedure calcule, pour chaque particule, sa vitesse a partir de son ancienne vitesse etde son acceleration courante a l’aide de la formule (simplifiee) :

~vitessenouveau − ~vitesseancien + ~acceleration

void calcule Acc (float nuage[6][NBPART])

Cette procedure calcule, pour chaque particule i, son acceleration a partir des positions de toutesles particules a l’aide de la formule (simplifiee) :

~ai =∑

j 6=i

posj − posi

|posj − posi|3

float diametre (float nuage[6][NBPART])

Cette procedure calcule la plus grande distance entre deux particules dans le nuage, et retournece resultat.

63

Page 65: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

6.3. COLLISIONS DE PARTICULES CHAPITRE 6. PROJETS

6.3 Collisions de particules

Principe : ce projet a pour but de visualiser une simulation numerique de l’evolution d’un en-semble de particules quantiques. La deviation de ces particules par action distante est supposeenegligeable, cette modelisation s’interesse principalement aux collisions. L’ensemble des particulesest represente par un tableau de 6 lignes (la position du point sur l’ecran, son vecteur vitesse, letype de particule et la particule avec laquelle elle est (eventuellement) en collision et autant decolonnes que de particules. Les positions des particules sont calculees toutes les unites de tempset affichees sur l’ecran.

Librairies : <stdio.h> , <stdlib.h>, <time.h>, <math.h> et ”graphsimple.h”

Constantes : DIAM PARTNBPARTDELAIXMAX, YMAX

Diametre d’une particule (en pixels)Nombre de particulesTemps (en ms) a attendre entre deux affichages successifsDimensions de la fenetre en pixels

int main ()

Cette fonction :– declare un tableau DejaVu d’entiers contenant autant de colonnes que de particules– initialise les positions, vitesses et types des particules (procedure Init)– attend DELAI ms (procedure usleep, predefinie)– tant qu’il reste une particule sur l’ecran (fonction restePart) :

– remplit le tableau DejaVu avec des 0– pour chaque particule telle que la case correspondante de DejaVu vaut 0 :

– si celle-ci n’est pas marquee en collision (6eme ligne du tableau), appelle calculePropSans– si elle est marquee en collision, appelle calculePropAvec pour elle-meme et l’autre particule

intervenant dans la collision– remplit la ou les cases de DejaVu concernee(s) avec un 1

– teste s’il y a des particules en collision (fonction enCollision) ; si oui, met dans la 6eme lignedu tableau, aux colonnes concernees, le numero de l’autre particule en collision.

– affiche les partiules dans leur nouvelle configuration (procedure affichePart)– attend DELAI ms

– termine le programme (procedure Fin)

void Init (float nuage[6][NBPART])

Cette procedure :– initialise le mode graphique– initialise les particules de la facon suivante :

– NBPART fois :– demande a l’utilisateur de cliquer sur l’ecran pour indiquer la pos. d’une particule– remplit la case de nuage correspondante– dessine la particule (AfficheUnePart)– demande a l’utilisateur de cliquer sur l’ecran pour indiquer la vitesse de la particule– remplit la case de nuage correspondante– dessine le vecteur vitesse (AfficheUneVitesse)– met a jour le type de la particule

– teste s’il y a des particules en collision (fonction enCollision) ; si oui, met dans la 6eme lignedu tableau, aux colonnes concernees, le numero de l’autre particule en collision.

64

Page 66: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

6.3. COLLISIONS DE PARTICULES CHAPITRE 6. PROJETS

– attend DELAI ms

void Fin ()

Cette procedure clot le mode graphique.

void calculePropSans (int indice)

Calcule la nouvelle position de la particule d’indice indice a l’aide de son ancienne position etde sa vitesse, sachant que cette particule n’est pas en collision, a l’aide de la formule (simplifiee) :

Mnouveau −Mancien + ~vitesse

void calculePropAvec (int indice1, int indice2)

Calcule les nouvelles proprietes (position, vitesse, type) des particules d’indices indice1 et indice2a l’aide de leurs anciennes proprietes.Attention, il faut que les positions des deux particules apres l’appel a cette procedure soientdistantes d’au moins DIAM PART (i.e. qu’elles ne soient plus en collision).Les nouvelles vitesses des particules 1 et 2 pourront etre calculees a l’aide des formules (simplifiees) :

{

~v′1 = 1−w1+w

~v1 + 2w1+w

~v2

~v′2 = 2

1+w~v1 −

1−w1+w

~v2

avec w = m2

m1

, rapport des masses des deux particules. Si ces masses sont egales, les formulesdeviennent :

{

~v′1 = ~v2

~v′2 = ~v1

autrement dit les deux vitesses s’echangent. Concernant les positions, chaque particule est deplaceed’une quantite x fois sa nouvelle vitesse, avec

x >d(d−DIAMPART )

(~v′1 −~v′2).

~O1O2

ou O1 et O2 sont les positions actuelles des particules.

int reste part (float nuage[6][NBPART])

Cette fonction renvoit 1 s’il existe une particule dont la position est dans l’ecran, 0 sinon.

int enCollision (float nuage[6][NBPART], int i, int j)

Cette fonction renvoit 1 si la distance entre les deux particules correspondant aux colonnes iet j de nuage est inferieure a DIAM PART, 0 sinon.

void affichePart (float nuage[6][NBPART])

Cette procedure appelle, pour chaque colonne du tableau nuage :– la procedure afficheUnePart– la procedure afficheUneVitesse

void afficheUnePart (float nuage[6][NBPART], int j)

Cette procedure affiche un disque sur l’ecran aux positions de la particule representee par la

65

Page 67: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

6.3. COLLISIONS DE PARTICULES CHAPITRE 6. PROJETS

colonne j du tableau nuage, et de diametre DIAM PART.

void afficheUneVitesse (float nuage[6][NBPART], int j)

Cette procedure affiche une fleche partant de la position de la particule, representant le vecteurvitesse de la particule representee par la colonne j du tableau nuage.

66

Page 68: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

6.4. JEU DE DAMES CHAPITRE 6. PROJETS

6.4 Jeu de dames

Le but de ce projet est de construire un jeu de dames le plus complet possible, ou deux joueursjoueront alternativement. Pour cela, nous utiliserons l’environnement graphique defini dans“ graph-simple.h ” (explicite a la fin du polycopie).

Pour realiser un projet correct, il est important de proceder par etapes, et de tester son pro-gramme avant chaque nouvelle etape.Vous serez tres libres dans vos choix de programmation ; cela dit, ce document devrait vous per-mettre de guider vos premiers pas. . .

Rappelons qu’on joue aux dames sur un damier de taille 10*10 :

Chaque joueur possede 20 pions de sa couleur, et on se deplace en diagonale uniquement.

Dans un premier temps, il est bon de penser a la facon de modeliser ce jeu sous forme infor-matique. Il paraıt tout a fait adapte d’utiliser un tableau d’entiers a deux dimensions, de taille10*10, dans lequel on pourra par exemple stocker la valeur 1 dans la case (i,j) si le joueur blancpossede un pion sur la case correspondante du damier, la valeur 2 si c’est un pion noir, et 0 si lacase n’est pas occupee.D’autres variables de jeu seront surement a definir pour simplifier l’acces a certaines donnees,comme par exemple le nombre de pions restant pour chacun des joueurs. Ecrire une premiereprocedure initialiser damier(int u[N][N]) qui definit la position initiale des pions.

Le premier aspect a considerer est l’aspect graphique. A l’aide de la librairie “ graphsimple.h ”,votre programme doit ouvrir une fenetre graphique de taille 600*600. Le damier va occuper uneplace de taille 500*500 sur cette fenetre (carre compris entre les points de coordonnees (0,0) et(500,500)). Construisez une procedure afficher damier() qui affiche dans la fenetre graphiqueune grille de jeu de taille 10*10. Puisque le damier aura une taille de 500*500, la taille de chaquecase sera donc de 50*50. Testez cette premiere procedure dans votre main()

Il y a aussi la question de l’affichage des pions ; pour cela, on pourra utiliser les procedures Cercleet CerclePlein de l’environnement graphique. On passera en parametre un rayon de 20, et en cequi concerne les coordonnees du centre, on a besoin de connaıtre abscisse et ordonnee d’une case(i,j) du damier. Une idee est de creer deux fonctions : int abscisse du centre(int ligne, intcolonne) et int ordonnee du centre(int ligne, int colonne), qui retournent respectivementabscisse et ordonnee du centre de la case de coordonnees (ligne,colonne). On peut alors creer uneprocedure afficher pion(int ligne, int colonne, int couleur) qui affiche un pion dans la casepassee en parametre, de couleur blanche si couleur=0, et noire si couleur=1 (par exemple). Creezde la meme facon une procedure effacer pion(int ligne, int colonne, int couleur).

Deplacements des pions : le joueur doit tout d’abord cliquer sur une des cases, votre programmedoit verifier qu’un pion de la bonne couleur est present a cet emplacement (si ce n’est pas le cas, ildoit demander au joueur de recommencer), puis le joueur clique sur une deuxieme case, qui corre-spond au deplacement du pion. Dans le cas ou votre pion peut manger plusieurs pions d’adverses

67

Page 69: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

6.4. JEU DE DAMES CHAPITRE 6. PROJETS

d’affilee, l’utilisateur cliquera sur les cases correspondantes au fur et a mesure. Pour valider uncoup, on demandera par exemple a l’utilisateur de cliquer a l’exterieur du damier : cela permetde savoir a quel moment on change de joueur. Pour recuperer les coordonnees d’un clic de l’util-isateur, on utilisera la procedure CliquerXY(int *x, int *y). Bien entendu, il faut transformerles coordonnees en pixels en indices de lignes et colonnes, en creant par exemple une methodeCliquerLigneColonne(int *ligne, int *colonne). Votre procedure donnera les valeurs -1 auxparametres si le clic est en dehors du damier.

Une fois la gestion graphique effectuee, votre programme devra assurer (dans cet ordre) :– que les joueurs ne peuvent pas tricher– la promotion d’un pion en dame– la regle “ souffler n’est pas jouer ”, i.e. si un joueur ne mange pas un pion alors qu’il le pouvait,

son adversaire lui en ote un.

Squelette du programme principal (on suppose que l’utilisateur ne triche pas, il manque les af-fichages, le cas ou des pions sont manges n’est pas traite + la gestion du damier) :

#include <stdio.h>#include “ graphsimple.h ”#define N 10int main(){int damier[N][N], int joueur=1 ; int i, j, iprec, jprec ;Initialiser(600,600) ;Initialiser damier(damier) ;Afficher damier() ;Tant qu’ il reste des pions, faire

Si (joueur==1)CliquerLigneColonne(&i,&j) ;//il faut gerer les modifications du damieriprec=i ; jprec=j ;While (i !=-1 && j !=-1){

CliquerLigneColonne(&i,&j) ;If (i !=-1 && j !=-1) {

Effacer pion(iprec,jprec,0) ;Afficher pion(i,j,0) ;iprec=i ; jprec=j ; }

}joueur=2 ;

else . . .//idem pour le joueur 2

Fin tant queClore() ;}

68

Page 70: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

6.5. TOUT NOIR TOUT BLANC CHAPITRE 6. PROJETS

6.5 Tout noir tout blanc

Un probleme mathematique : le jeu du “ tout noir, tout blanc ”.

Le support : une grille a m lignes et n colonnes avec des cases pouvant prendre deux couleurs(noir ou blanc). Au depart, toutes les cases sont noires. En retournant une case, le joueur en changesa couleur ainsi que celle de ses quatre voisines (nord, sud, est, ouest). Le but du jeu est de rendrela grille toute blanche.

Exemple sur une grille 5*5

Projet : construire une telle zone de jeu, ou l’utilisateur qui clique sur une case en change lacouleur ainsi que celle des voisines. Proposer des variantes avec d’autres regles de jeu, ou desconfigurations initiales aleatoires. Programmer un algorithme de recherche des solutions de ceprobleme pour des tailles de grille convenables.

L’objectif est de vous laisser tres libres quant a vos choix de programmation, vos creations defonctions, et vos idees de resolution de ce probleme. Ce papier a pour but de vous decrire le travailattendu, ainsi que de vous fournir un support pour guider vos premiers pas.

1ere partie : la programmation graphique et le jeu.Vous utiliserez l’environnement graphique du DLST associe a la librairie “ graphsimple.h ”. Deuxgrilles seront a gerer parallelement : la grille de jeu (celle qui apparaıtra a l’ecran), accessibleen cliquant sur la souris, et la grille “ interne ”, qu’on pourra modeliser par un tableau a deuxdimensions de taille m*n, et qui stockera l’etat de chaque case (on mettra par exemple 0 pour lescases noires et 1 pour les blanches). Les variables m et n pourront etre declarees comme globales.A l’execution, votre programme pourra demander au debut de rentrer au clavier les entiers m etn, puis vous pourrez declarer votre grille “ interne ” int grille[m][n]. Ecrire ensuite une procedureinitialiser grille( int tab[m][n]) qui initialise la grille tout en noir.

La suite se passe dans votre grille “ graphique ”. Vous pourrez par exemple initialiser une fenetregraphique de taille ((m+1)*50,(n+1)*50) a l’aide de la fonction Initialiser de la librairie. Votregrille va occuper une place de taille 50m ∗ 50n pixels sur cette fenetre, la bande restante pouvantetre utilisee pour afficher certains parametres du jeu. Chaque case de ce tableau aura donc unetaille de 50*50 pixels. Construisez alors une procedure afficher grille() qui affiche a l’ecran lazone de jeu avec des cases noires (vous pourrez utiliser pour cela les procedures RectanglePleinet ChangeCouleur ). Testez-la dans votre fonction principale.

Pour recuperer les coordonnees d’un clic de l’utilisateur, on utilisera la procedure CliquerXY(int*x, int *y). Bien entendu, il faut transformer les coordonnees en pixels en indices de lignes etcolonnes, en creant par exemple une methode CliquerLigneColonne(int *ligne, int *colonne).On pourra ensuite creer une procedure appliquer regle(int ligne, int colonne), qui fait changerla couleur de la case grille[ligne][colonne], ainsi que celle de ses voisines.

Votre programme pourra aussi afficher a l’ecran GAGNE lorsque toutes les cases seront devenuesblanches, proposer a l’utilisateur de recommencer en cliquant sur une zone precise de la fenetre

69

Page 71: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

6.5. TOUT NOIR TOUT BLANC CHAPITRE 6. PROJETS

graphique, ou encore de marquer d’un point rouge les cases ayant ete cliquees un nombre impairde fois (celles-ci permettent en effet de reconstituer la solution du probleme).

2eme partie : Extensions du jeuOn peut definir d’autres regles de retournement des cases. En voici trois autres , que vous pourrezproposer a l’utilisateur en debut de programme :

Vous etes tout a fait libres d’en inventer d’autres. . .

Une autre option de jeu est d’introduire une configuration aleatoire au depart, au lieu de n’avoirque des cases noires. A l’aide du generateur aleatoire habituel, et si l’utilisateur le souhaite, con-figurez la grille de depart avec un melange quelconque de cases noires et blanches.

3eme partie : Recherche de solutionsAu lieu du mode “ jeu ”, votre programme pourra proposer a l’utilisateur de resoudre le problemelui-meme. A vous de suggerer un algorithme le plus leger possible pour reduire le temps de calculau maximum. L’affichage d’une solution pourra se faire comme precedemment en marquant d’unpoint rouge les cases a cliquer.

Cherchez egalement des solutions dans le cas des nouvelles regles ou lorsque la configuration dedepart est aleatoire. Attention, l’existence de solutions n’est pas garantie dans tous les cas. . .

70

Page 72: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

6.6. CLOBBER CHAPITRE 6. PROJETS

6.6 Clobber

Projet : le jeu du ”Solitaire Clobber”

1) Construction d’une interface de jeu

”Solitaire Clobber” est un jeu qui a ete etudie en 2002 par des chercheurs du MIT (Demaine etal.), et qui presente des proprietes tres interessantes dans le domaine des jeux combinatoires. Al’heure actuelle, nous ne connaissons que tres peu de resultats a son sujet.

Ce jeu est defini de la facon suivante : sur une grille n*m, on dispose arbitrairement des pierresnoires et blanches, comme l’illustre l’exemple ci-dessous.

Il y a un seul joueur et les regles sont les suivantes : le joueur choisir une pierre, et va capturerune pierre voisine (situee horizontalement ou verticalement) de l’autre couleur. La pierre captureeest retiree du jeu, et l’autre pierre prend sa place. Le joueur repete cette action tant que cela estpossible. L’objectif est de minimiser le nombre de pierres restantes a la fin du jeu.

Exemple d’execution sur une grille 1*5 :

Nous vous demandons dans un premier temps de creer une interface de jeu qui permette a unutilisateur de jouer.

L’utilisateur devra au prealable rentrer au clavier la taille (longueur et largeur) de la grille surlaquelle il souhaite jouer, puis votre programme generera une disposition aleatoire des pierres.

Ensuite, l’utilisateur pourra capturer les pierres de la facon suivante (ceci n’est qu’un exemple) :- Cliquer sur la pierre que l’on veut choisir - Cliquer sur la pierre que l’on veut capturer - Si lespierres sont bien de couleurs differentes et situees sur des cases voisines, effectuer la capture. Sinon,annuler le coup et recommencer.

Lorsque l’utilisateur n’a plus la possibilite de jouer, il faut le lui faire remarquer en indiquantun message ”fin du jeu”. Votre programme devra ensuite afficher ensuite son score, c’est-a-dire lenombre de pierres restantes sur la grille.

N.B : Pour constuire une telle interface de jeu, vous aurez sans doute besoin, en plus de la grillegraphique, d’un tableau a deux dimensions qui stockera ce que contient chaque case de la grille.

71

Page 73: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

6.6. CLOBBER CHAPITRE 6. PROJETS

On pourra par exemple attribuer la valeur 0 pour les cases qui contiennent une pierre blanche, 1pour celles qui contiennent une pierre noire, et 2 pour les cases ne contenant aucune pierre.

2) Resolution du probleme sur une seule ligne

On considere le jeu sur une grille 1*m (cf. exemple ci-dessus). Etant donnee n’importe quelledisposition des pierres, le probleme consiste a determiner le nombre minimum de pierres que l’onpeut laisser a la fin (et si possible, savoir comment jouer pour y arriver).

On vous demande tout d’abord de reflechir a la forme des configurations pour lesquelles on peutlaisser une seule pierre a la fin (celle de l’exemple ci-dessus en est une). On appelle ces configurationsde jeu des configurations 1-reductibles.

a) Construire ensuite un programme qui demande a l’utilisateur la longueur de la ligne de jeu,puis qui affiche une configuration aleatoire de cette longueur. Votre programme doit ensuite diresi cette configuration est 1-reductible ou non.

b) Si la configuration n’est pas 1-reductible, proposez alors un algorithme qui essaie de minimiserle nombre de pierres restantes a la fin (on ne vous demande pas forcement un algorithme quicalcule la valeur optimale, mais qui essaie au moins de s’en approcher2026). Votre programmedevra afficher la solution calculee.

3) Ameliorations du jeu initial.

- Permettre a l’utilisateur de recommencer le jeu et d’ameliorer son score. La configuration initialealeatoire doit donc etre sauvegardee. Dans ce cas, afficher le meilleur score de l’utilisateur sur cetteconfiguration.

- Changer de regles : la version originale du jeu (Demaine et al., 2002) prevoit que le joueur doitalternativement capturer une pierre blanche puis une noire. Votre programme doit maintenantincorporer cette regle. Il demandera initialement a l’utilisateur s’il souhaite jouer avec la premiereou la seconde regle.

72

Page 74: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

Chapitre 7

Resume de cours et exercices

7.1 Types, variables, constantes, expressions, operateurs,instructions

Le type d’une donnee est la nature de la valeur qu’elle contient. Les mots-cles utilises en C pourtraduire les differents types sont les suivants1 :

Type Traduction ExempleEntier int 30Reel double 3.526

Caractere char ’a’Chaıne de caracteres char* ; char[] ; char[n] ”Hello”

Booleens int (0=faux, 6= 0=vrai) 0Pointeur type* (type=type de valeur pointee) &a (a : variable)

Une variable est un objet symbolique qui contient une valeur modifiable. En C, le type d’unevariable est fixe une fois pour toutes.

La declaration d’une variable permet de faire connaıtre son type au systeme. Elle est obliga-toire et peut se faire de deux facons, suivant que l’on connaıt sa valeur initiale ou non. Soit parexemple a declarer la variable entiere x :

– on ne connaıt pas sa valeur initiale : int x ;

– on connaıt sa valeur initiale (0 par exemple) : int x = 0 ;

Apres la declaration, l’affectation d’une valeur a la variable se fait a l’aide du signe = (par ex-emple, x=1 ;).

Lorsque certaines valeurs constantes sont utilisees a plusieurs reprises, il peut etre utile deleur donner un nom. Ceci se fait a l’aide de la commande define (par exemple, #define PI

3.1415926535).Une expression est une“formule”qui peut etre evaluee par le compilateur et dispose d’une valeur,comme 3, ’a’, a=3 (valeur : 3), a==3 (valeur : vrai ou faux). Cette formule se construit en combi-nant des variables, des operateurs, des appels a fonctions et des parentheses. La table ci-dessousdecrit l’ordre de priorite des operateurs elementaires.

1Il est aussi possible de definir ses propres types a l’aide de la commande typedef.

73

Page 75: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.1. TYPES, VARIABLES, ... CHAPITRE 7. RESUME DE COURS ET EXERCICES

Priorite Operateurs Symbole associativite1 fonction ( ) −→1 tableau [ ] −→1 champ de structure -> . −→2 negation booleenne ! ←−2 negation bit a bit ˜ ←−2 incrementation ++ ←−2 decrementation -- ←−2 - unaire - ←−2 + unaire + ←−2 indirection * ←−2 adresse & ←−2 taille sizeof ←−3 casting (type) ←−4 multiplication * −→4 division / −→4 modulo % −→5 addition + −→5 soustraction - −→6 decalages << >> −→7 relations logiques < <= > >= −→8 egalite == != −→9 ET bit a bit & −→10 OU exclusif bit a bit ^ −→11 OU bit a bit | −→12 ET booleen && −→13 OU booleen ‖ −→14 operateur conditionnel ? : ←−15 affectations(1) = *= /= %= ←−15 affectations(2) += -= <<= >>= ←−15 affectations(3) &= ^= |= ←−16 sequence , −→

Fig. 7.1 – Ordre de priorite des operateurs

Une expression booleenne est une expression qui est soit vraie, soit fausse. Les expressionsbooleennes peuvent etre combinees par des operateurs logiques pouvant tous etre definis a par-tir des operateurs suivants :

– la negation “ !”; si x est vrai alors !x est faux et reciproquement.– le et logique “&&”; x&&y est vrai ssi x et y sont tous les deux vrais– le ou logique “‖”; x‖y est faux ssi x et y sont tous les deux faux– les parentheses () permettent de regrouper les expressions logiques

Les regles suivantes permettent de simplifier certaines expressions booleennes :

– !(x&&y) = (!x) ‖ (!y)– !(x ‖ y) = (!x)&&(!y)– (x1&&x2) ‖ (y1&&y2) = (x1 ‖ y1)&&(x1 ‖ y2)&&(x2 ‖ y1)&&(x2 ‖ y2)– (x1 ‖ x2)&&(y1 ‖ y2) = (x1&&y1) ‖ (x1&&y2) ‖ (x2&&y1) ‖ (x2&&y2)

Une autre methode pour simplifier une expression booleenne consiste a ecrire sa table de verite2

2une table de verite decrit l’ensemble des valeurs prises par l’expression en fonction des valeurs de ses elements

74

Page 76: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.1. TYPES, VARIABLES, ... CHAPITRE 7. RESUME DE COURS ET EXERCICES

et a la comparer a des tables de verite connues.Enfin, une instruction est une action a effectuer, comme printf("Bonjour \n");. Lorsqu’uneinstruction est constituee d’une expression suivie d’un point-virgule, comme a=3 ; ou printf("Bonjour

\n") ; on parle d’instruction-expression.

7.1.1 Exercice : expression logique

Ecrire l’expression logique : l’entier n est multiple de 4 ou multiple de 6 (indication : considerer lereste de la division euclidienne de a par b (a%b)).

7.1.2 Exercice : operations logiques

1. Completer les tables de verite des expressions a valeur booleennes suivantes.

a non a a==vrai a==faux1 vrai2 faux

a b a et b a ou b3 vrai vrai4 faux vrai5 vrai faux6 faux faux

2. Deduire de ce qui precede une simplification de chacune des deux expressions suivantes :

expression forme simplifiee7 a == vrai8 a == faux

3. Donner une expression equivalente de chacune des expressions suivantes, en utilisant lesoperateurs non et ou mais sans utiliser l’operateur et :

expression expression equivalente9 non a et non b10 a et b

7.1.3 Exercice : Simplifications booleennes

Demontrez les regles de simplification presentees a la page precedente.

75

Page 77: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.1. TYPES, VARIABLES, ... CHAPITRE 7. RESUME DE COURS ET EXERCICES

7.1.4 Exercice : operateurs arithmetiques et logiques

Contexte Expression Type (en C) Valeura↔4, b↔7 a + b

a↔4, b↔2.3 a + ba↔1, b↔2, c↔3 a− (b− c)a↔1, b↔2, c↔3 (a− b)− ca↔1, b↔2, c↔3 a− b− c

a↔10, b↔3 a/ba↔10, b↔3 a%b

a↔10, b↔3.0 a/ba↔10, b↔3.0 a%b

a↔-5 abs(a)a↔-5.2 fabs(a)a↔2.3 floor(a)a↔-2.3 floor(a)a↔’A’ aa↔’A’ a + 2

a↔vrai, b↔faux a&&ba↔vrai, b↔faux a ‖ b

a↔vrai !aa↔7, b↔4 a < b

a↔4, b↔7, c↔5 a < b < ca↔7, b↔4 a == ba↔7, b↔4 a! = b

a↔vrai, b↔4, c↔5 a == (b < c)a↔4, b↔7, c↔5, d↔3 a < b&&c < d

a↔vrai, b↔faux,c↔faux (a ‖ b)&&ca↔vrai,b↔faux, c↔faux a ‖ b&&c

a↔4, b↔7, c↔5 (a > b&&a < c) ‖ a < ba↔4, b↔7, c↔5 a > b&&(a < c ‖ a < b)a↔4, b↔7, c↔5 (a > b&&a < c) ‖ a > ba↔4, b↔7, c↔5 (a > b ‖ a <= b)&&a < c

trouver un contexte (a < b) ‖ (a > b)

7.1.5 Exercice : Notation des valeurs

Contexte Expression Type (traduction en C) Valeurø 3ø 2.5ø 2.5e2ø ’a’ø “toto”ø “a”ø “3”ø ’3’ø “2.5e2”ø ’toto’ø toto

Remarque : C donne le type double aux constantes reelles.

76

Page 78: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.1. TYPES, VARIABLES, ... CHAPITRE 7. RESUME DE COURS ET EXERCICES

7.1.6 Exercice : type et valeur d’une variable

Donner le type et, si elles ne sont pas evidentes, les valeurs de chacune des expressions suivantes,sachant que P, Q, R et S sont des variables booleennes et que K est une variable entiere.

1. sqrt (2) /* racine carree de 2 */

2. sqrt (2.0)

3. ’Z’ - ’A’

4. ceil (-99.9) /* entier immediatement superieur a -99.9 */

5. -ceil (99.9 + 0.5)

6. - round (-99.9 + 0.5) /* entier le plus proche de -99.9+0.5 */

7. 10 / 3 /*quotient de la division euclidienne de 10 par 3 */

8. 10%3 /*reste de la division euclidienne de 10 par 3 */

9. 126 / 3 % 5

10. (K%2 == 0) ‖ ((K+1)%2 == 0)

11. ! (P && Q) ==! ( ! P && ! Q)

12. (P && (Q && ! Q)) ‖ ! (R ‖ (S ‖ ! S))

13. (ceil (-65.3 + 0.5) < ceil (-65.3)) && P

7.1.7 Exercice : simplification d’expressions booleennes

Donner une forme simplifiee de l’expression booleenne a > b&&(a < c ‖ a < b)

77

Page 79: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.2. ENTREES, SORTIES CHAPITRE 7. RESUME DE COURS ET EXERCICES

7.2 Entrees-sorties (printf, scanf, putchar, getchar)

7.2.1 printf

Syntaxe : printf ( [Chaıne de caracteres contenant des "trous"],

[valeur du trou n 1], [valeur du trou n 2], ... ) ;

Role : affiche la chaıne de caracteres en substituant les trous par leur valeur

Description : la chaıne de caracteres est delimitee par des guillemets ; elle peut contenir descaracteres speciaux (voir ci-dessous) et des “trous”, c’est a dire des emplacements d’une certainetaille, dont la valeur est specifiee separement.

Caracteres speciaux : Les caracteres sont des lettres speciales permettant d’inclure des champsspeciaux dans le texte :

Caractere special Resultat\n passage a la ligne\t tabulation\“ guillemet\\ barre oblique inverse (antislash)\% pourcent\a signal sonore (bip)\0 caractere de fin de chaıne

Emplacements : les emplacements sont indiques par un % suivi d’une lettre representant letype de donnee que l’on souhaite afficher : i pour int, f pour float et double, c pour caractere, spour chaıne de caracteres (string).

7.2.2 scanf

Syntaxe : scanf ( [Chaıne de caracteres contenant des "trous"],

&[variable du trou n 1], &[variable du trou n 2], ... ) ;

Role : Lit la chaıne de caracteres tapee par l’utilisateur au clavier en stockant la valeur destrous dans les variables correspondantes.

Description : Le & devant les noms de variables sont necessaires pour leur donner des valeurs.

7.2.3 putchar

Syntaxe : putchar (caractere) ;

Role : Envoie le caractere specifie sur le peripherique de sortie principal (par defaut : sur l’ecran).Description : Cette commande est equivalente a printf("%c",caractere) ;

Exemple : Le programme suivant affiche l’alphabet en majuscules sur l’ecran (voir le chapitresur le for) :

#include <stdio.h>

int main (void) {

char c;

for (c = ’A’ ; c <= ’Z’ ; c++) { putchar (c); }

return 0;

}

78

Page 80: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.2. ENTREES, SORTIES CHAPITRE 7. RESUME DE COURS ET EXERCICES

7.2.4 getchar

Syntaxe : getchar()

Role : Lit le caractere suivant sur le peripherique d’entree principal (par defaut : le clavier).

Description : getchar n’attend pas de retour a la ligne pour lire un caractere, contrairementa scanf. getchar ne prend pas de parametre et renvoie la valeur du caractere lu.Exemple : Le programme suivant lit et affiche au fur et a mesure une phrase jusqu’au caracterede fin : un point (voir le chapitre sur le while) :

#include <stdio.h>

int main (void) {

char c;

puts ("Entrer un texte. Mettre un point (’.’) pour sortir :");

do {

c=getchar();

putchar (c);

} while (c != ’.’);

return 0;

}

7.2.5 Exercice : application de scanf et printf

Ecrire un programme qui demande deux nombres entiers A1 et A2 a l’utilisateur et les affiche dela facon suivante :

A1 A2 A1

A2 A1 A2

79

Page 81: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.3. IF CHAPITRE 7. RESUME DE COURS ET EXERCICES

7.3 Instruction conditionnelle (if, else, else if)

Syntaxe :

1. if (<cond1>) {<instr1>}

2. if (<cond1>) {<instr1>} else {<instr>}

3. if (<cond1>) {<instr1>}else if (<cond2>) {<instr2>}...else if (<condn>) {instrn}

4. if (<cond1>) {<instr1>}else if (<cond2>) {<instr2>}. . .else if (<condn>) {<instrn>}else {<instr>}

Role :

1. effectue l’ensemble d’instructions {<instr1>} ssi l’expression booleenne <cond1> est vraie

2. idem que 1. ; de plus si <cond1> est fausse, effectue {<instr>}

3. effectue l’instruction {instri} correspondant a la premiere expression booleenne (<condi>)vraie rencontree et n’en effectue aucune autre

4. idem que 3. ; de plus si aucune expression booleenne n’est vraie, effectue <instr>.

7.3.1 Exercice : comparaison de deux programmes

Les deux parties de programmes suivantes sont-elles semblables ? Justifier votre reponse.

if (n%2 == 1) if (n%2 == 1)

n = 3*n + 1; n = 3*n + 1;

else if ( n%2 == 0)

n = n/2; n = n/2;

7.3.2 Exercice : etude d’un petit programme

Considerez la sequence d’instructions suivantes (A et B sont deux variables entieres predeclareeset initialisees) :

...

if (A>B){

if (A>10){

printf ("premier choix \n");} else if (B<9){

printf ("deuxieme choix \n");}} else{

if (A==B) {printf ("troisieme choix \n");}

else {printf ("quatrieme choix \n");}}

– Recopiez la sequence d’instructions en l’indentant correctement pour la rendre plus lisible.– Qu’affiche le programme si :

- A=9 et B=9- A=12 et B=12- A=10 et B=7- A=11 et B=9- A=0 et B=-3

– Quelles sont les conditions sur A et B pour que ” premier choix ” s’affiche ? Meme question pourles trois autres choix. Est-il possible que rien ne s’affiche ?

80

Page 82: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.3. IF CHAPITRE 7. RESUME DE COURS ET EXERCICES

7.3.3 Exercice : Racines des equations du second degre

Ecrire un programme qui lit trois entiers a, b et c, et qui affiche les racines du polynome ax2+bx+c.Examinez tous les cas de figure.

7.3.4 Exercice : des chiffres et des lettres

Ecrire un programme qui demande a l’utilisateur d’entrer un nombre entre 20 et 45 et ecrit lenombre en toutes lettres (attention aux tirets).

7.3.5 Exercice : la cible

Soit une cible circulaire centree sur (0,0), comportant quatre zones delimitees par des cerclesconcentriques de rayons respectifs 1, 2, 3 et 4. Selon la zone ou arrive la flechette, le joueur gagnerespectivement 100, 50, 20 et 10 points (si la flechette arrive hors de la cible, le joueur ne marquepas de points). Ecrire un programme qui demande a l’utilisateur de saisir les coordonnees d’uneflechette et affiche le nombre de points realises. (Remarque : inclure la librairie math.h pour pouvoircalculer la racine carree : sqrt).

7.3.6 Exercice : quizz des trois entiers

Construisez un programme qui demande a l’utilisateur de taper trois entiers, puis qui affiche vraiou faux aux questions suivantes :

1. Les trois entiers sont-ils dans l’ordre croissant ?

2. Sont-ils tous egaux ?

3. Sont-ils distincts deux a deux ?

4. L’un des trois est-il plus grand que la somme des deux autres ?

5. Sont-ils tous impairs ?

Votre programme affichera chaque question suivie de sa reponse. Indiquez le nombre de reponsesvraies a la fin du programme.

Exemple d’execution du programme :

Rentrez le premier entier : 9

Rentrez le deuxieme entier : 6

Rentrez le troisieme entier : 21

Les trois entiers sont-ils dans l’ordre croissant ? faux

Sont-ils tous egaux ? faux

Sont-ils distincts deux a deux ? vrai

L’un des trois est-il plus grand que la somme des deux autres ? vrai

Sont-ils tous impairs ? faux

Il y a 2 reponses vraies.

81

Page 83: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.4. FOR, WHILE CHAPITRE 7. RESUME DE COURS ET EXERCICES

7.4 Iterations (for, while)

7.4.1 while (tant que)

Syntaxe : while (<expr>) {<instr>}

Role : Effectue le bloc d’instructions {<instr>} plusieurs fois, tant que la condition booleenne<expr> reste vraie.

7.4.2 for (pour)

Syntaxe : for (<var>=<INF> ; <var><=<SUP> ; <var>=<var>+1 ) {<instr>}

Role : Effectue le bloc d’instructions {<instr>} un nombre connu de fois, ce nombre etant deter-mine par une borne inferieure <INF> et une borne superieure <SUP>. L’intervalle entre les deuxbornes est parcouru par une variable <var>, dont la valeur peut etre utilisee dans les instructions{<instr>}.

7.4.3 Drapeaux

Il arrive que la condition pour sortir d’un while ne s’exprime pas de maniere simple, par exemplelorsqu’elle depend des resultats des fonctions appelees dans le corps de la boucle, ou de la valeur dela condition lors des iterations precedentes. Une solution est alors d’utiliser des variables special-isees, les drapeaux qui memorisent les valeurs utiles et sont utilisees comme condition de sortiedu while.

7.4.4 Exercice : application du for

Ecrire les instructions permettant :

1. d’afficher dix fois de suite “bonjour”

2. de demander cinq fois de suite un nombre et d’afficher juste apres : “votre nombre est (. . .)”

3. d’afficher les entiers compris entre 40 et 70

7.4.5 Exercice : sommes d’entiers

Ecrire un programme qui lit un entier n au clavier et qui :

1. affiche la somme des n premiers entiers

2. affiche la somme des n premiers entiers impairs

3. affiche la somme des n premiers carres

7.4.6 Exercice : listes d’entiers

1. A l’aide d’une boucle for, ecrire un programme qui affiche la liste des entiers pairs de 1 a 50separes par des espaces.

2. Meme question en utilisant une boucle while.

3. Ecrire un programme qui affiche dans l’ordre decroissant la liste des entiers compris entre 1et 50 separes par des espaces.

4. Ecrire un programme qui affiche la liste des multiples de 3 et de 5 compris entre 1 et 50separes par des virgules et terminee par un point.

5. Meme question sauf que les multiples de 15 ne doivent pas etre affiches.

6. Ecrire un programme qui affiche la liste des multiples de 3 puis des multiples de 5 comprisentre 1 et 50 separes par des espaces.

82

Page 84: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.4. FOR, WHILE CHAPITRE 7. RESUME DE COURS ET EXERCICES

7. Ecrire un programme qui lit deux entiers n et m au clavier puis affiche les entiers de n a m.

Ex :

m=1 et n=1, le programme affiche 1

m=1 et n=3, le programme affiche 1 2 3

m=5 et n=2, le programme affiche 5 4 3 2

7.4.7 Exercice : suite de Fibonacci

Ecrire un programme qui lit un entier n au clavier et affiche le nieme terme de la suite de Fibonacci.

Cette suite est definie par F0 = 1, F1 = 1, . . ., Fn = Fn−1 + Fn−2.

7.4.8 Exercice : for imbriques

Ecrire les instructions permettant d’afficher les diagrammes suivants :

a. ***** b. * c. * d. *

***** ** ** * *

***** *** *** * *

***** **** **** * *

***** ***** ***** * *

7.4.9 Exercice : programme mysterieux

Que fait le programme suivant ?

#include <stdio.h>

int main (void ) {

int a, b, ainit, binit, r;

printf (" Donnez les valeurs de a et de b \n");

scanf ( "%i %i", &a, &b);

ainit = a;

binit = b;

r = a % b;

while (r != 0) {

a = b ;

b = r ;

r = a % b ;

}

printf ("Etant donnes %i et %i, le resultat est %i \n", ainit, binit, b);

return (0) ;}

7.4.10 Exercice : suite recursive de Syracuse (while)

Soit la suite recursive donnee par u0 = A, ..., un, avec un+1 definie par :– un+1 = un

2si u(n) est pair

– un+1 = 3 ∗ u(n) + 1 sinonEcrire un programme qui demande la saisie de d’un entier et determine pour quel n on a : un = 1.

NB : La grande question est de savoir si, pour toute valeur de A /* u0 = A */ cette suite contientl’element 1. Les matheux n’ayant pas resolu ce probleme, on dit que ce probleme est ouvert. On ditaussi que “cette suite passe par 1 quel que soit le point de depart” est la conjecture de Syracuse.

83

Page 85: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.4. FOR, WHILE CHAPITRE 7. RESUME DE COURS ET EXERCICES

7.4.11 Exercice : jeu du bon nombre (while, for, if)

Dans ce jeu, un premier joueur tape un nombre a deviner D, un nombre d’essais E et une bornesuperieure S, puis l’ecran est efface (pour effacer l’ecran on affichera 50 retours a la ligne successifs).

L’autre joueur dispose ensuite de E essais pour trouver D, sachant que D est compris entre 1et S. A chaque essai, le programme indique si le nombre propose est trop petit ou trop grand. Si lejoueur trouve, le programme termine la partie et affiche le nombre de coups ; s’il ne trouve pas aubout des E coups autorises, le programme termine la partie et affiche le nombre qu’il fallait trouver.

A la fin de la partie l’ordinateur propose une autre partie (0=fin, 1=nouvelle partie).

Ecrire le programme correspondant.

Question subsidiaire : quelle relation doivent verifier E et S pour que le deuxieme joueur nesoit pas certain de trouver la bonne reponse au bout des E coups ?

7.4.12 Exercice : copies...

Taper le programme ci-dessous dans un fichier ”Copier.c”

int main (void) {

int c;

c = getchar();

while ( c!= EOF ) {

putchar(c);

c = getchar();

}

return 0;

}

Compiler le programme precedent avec : gcc -Wall -ansi Copier.c -o copier puis taper lacommande : copier < Copier.c > Nouveau.c Expliquer.

7.4.13 Exercice : decomptes...

En se basant sur le programme de l’exercice 7.4.12 ci-dessus, faire un programme qui compte lescaracteres, les mots, et les lignes d’un fichier. Il affiche les trois resultats.

7.4.14 Exercice : longueur de ligne

En se basant sur le programme de l’exercice 7.4.12 ci-dessus, faire un programme qui cherche etaffiche la ligne la plus longue d’un fichier.

7.4.15 Exercice : Sans commentaire...

En se basant sur le programme de l’exercice 7.4.12 ci-dessus, faire un programme qui supprime lescommentaires d’un programme C.

84

Page 86: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.5. TAB. 1D CHAPITRE 7. RESUME DE COURS ET EXERCICES

7.5 Tableaux a une dimension et chaınes de caracteres

Un tableau est un ensemble de donnees reperees par un nombre (ou indice). Il se caracterise parle type des donnees qu’il contient et par le nombre de ces donnees (longueur). Il est habituelle-ment represente par un ensemble de cases alignees.

Exemple : tableau d’entiers de longueur 10 :

Indice 0 1 2 3 4 5 6 7 8 9Valeur 15 43 51 62 -28 0 3 61 -12 -1

Attention : en C, la numerotation des cases commence toujours a 0.

Declaration : En C, comme toute variable, une variable de type tableau doit etre declaree. Parexemple, pour un tableau A de 100 caracteres, cette declaration s’effectue de la facon suivante :

char A [100] ;

Utilisation : Chaque case d’un tableau peut etre consideree comme une variable independante(exception faite de la declaration).

Notation : la case d’indice i du tableau tab s’ecrit : tab[i].

Exemple : les instructions suivantes permettent de remplir puis d’afficher la case d’indice 3du tableau de caracteres A :

printf ("Entrez la valeur de la case : ") ; scanf ("%c",&tab[3]);

printf ("%c",tab[3]) ;

En langage C, une chaıne de caracteres est representee par un tableau de caracteres ; la fin dela chaıne de caracteres est representee par le caractere ’\0’. Attention a bien prevoir le ’\0’ dansla taille du tableau.

Lorsque la chaıne de caracteres est specifiee explicitement entre guillemets, le ’\0’ est sous-entendu.

Exemple : char toto[6] = "hello" ;i 0 1 2 3 4 5toto[i] ’h’ ’e’ ’l’ ’l’ ’o’ ’\0’

Le symbole representant les chaınes de caracteres pour printf et scanf est %s. Contrairement auxtypes symples, il ne faut pas mettre de ”&“ devant le nom de la variable lors du scanf.

Exemple :

scanf ("%s",toto) ; <- helloi 0 1 2 3 4 5toto[i] ’h’ ’e’ ’l’ ’l’ ’o’ ’\0’

printf ("%s***",toto) ; ->hello*** (eq. a : printf ("%s***","hello") ;)

Les caracteres sont ordonnes selon un ordre pseudo-alphabetique : ’z’ > . . . > ’a’ > ’ ’ ; par ailleurstoute majuscule est superieure a une minuscule : ’A’ > ’z’. De meme que pour les entiers, il estpossible d’effectuer des operations arithmetiques sur les caracteres.

Exemple :

printf ("%c",’a’+2) ; -> c

85

Page 87: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.5. TAB. 1D CHAPITRE 7. RESUME DE COURS ET EXERCICES

7.5.1 Exercice : tableau de caracteres

Ecrire un programme C qui :

1. initialise un tableau de 50 caracteres avec les caracteres ’a’ ... ’z’ generes uniformement

2. affiche le tableau

3. calcule la plus petite lettre (ordre alphabetique) de l’alphabet presente dans le tableau etdonne l’indice de sa premiere occurence

4. affiche les lettres presentes, sans duplication

5. affiche les lettres absentes de ce tableau

6. affiche la frequence d’apparition de chacune des lettres de l’alphabet

7. affiche la lettre la plus frequente

7.5.2 Exercice : classement alphabetique

Ecrire un programme qui demande a l’utilisateur d’entrer deux chaınes de caracteres (8 caracteresmaximum) puis les classe par ordre alphabetique. Un exemple d’affichage :

Donner chaıne 1 : bo

Donner chaıne 2 : baobab

Classement :

baobab

bo

7.5.3 Exercice : codage

Les lettres A ... Z sont codees respectivement par les lettres

NBFGRTZXOPKLCEDMHJYUIQSVWA

un espace est code par un espace, on suppose aussi que le texte ne comporte que des lettresmajuscules et des espaces. Lire le texte de l’utilisateur et afficher la version codee de ce texte. Onsuppose que le texte a coder est dans un fichier.

7.5.4 Exercice : cryptage

Ecrire un programme qui transforme une chaıne de caracteres ainsi : pour chaque lettre,– si la lettre est une voyelle, la remplace par un– si c’est une consonne, la remplace par la lettre situe deux lettres plus loin (y est remplace par ’

’, z par a, etc.)– si c’est un espace, termine la chaıne de caracteres

Remarque : l’ordre des lettres est le suivant : <espace> a b c ... z

7.5.5 Exercice : histogramme du jeu de des

Ecrire un programme C qui :– genere M = 1000 fois une suite de N = 50 jeux de pile ou face– stocke pour chacune des 1000 parties le nombre de piles obtenus– affiche sous forme d’histogramme horizontal le resultat de ces M parties. Un histogramme hor-

izontal est l’affichage d’une ligne pour chaque entier de 0 a N. Sur la ligne i on affiche l’entieri, suivi d’un nombre d’etoiles proportionnel aux nombre de parties (parmi les M) qui se sontterminees avec i piles.

NB : pour simuler un jeu de pile ou face, utiliser l’annexe sur la generation de nombres aleatoires.

86

Page 88: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.5. TAB. 1D CHAPITRE 7. RESUME DE COURS ET EXERCICES

7.5.6 Exercice : longueur d’une chaınes de caracteres

Ecrire un programme qui affiche la longueur d’une chaıne de caracteres saisie par l’utilisateur(max. 100 caracteres).

7.5.7 Exercice : palindrome

– Ecrire un programme qui demande un mot a l’utilisateur et qui affiche si le mot donne est unpalindrome. Un palindrome est un mot qui se lit de la meme maniere de la gauche vers la droiteou de la droite vers la gauche, comme ”ara“ ou ”elle“.

– Ecrire un programme qui demande une phrase a l’utilisateur et determine si la phrase est un vraipalyndrome, un pseudo-palindrome, ou ni l’un ni l’autre. Dans un vrai palindrome, les espacessont repartis de maniere symetrique dans la phrase (exemple : rats live on no evil star) ; dansun pseudo palindrome, il y a une symetrie entre les lettres mais pas entre les espaces (exemple :eve reve).

7.5.8 Exercice : parcours de tableau

Ecrire un programme qui fait remplir a l’utilisateur un tableau de 8 flottants, puis affiche lesvaleurs de ce tableau et determine la valeur la plus grande du tableau et l’indice correspondant.

7.5.9 Exercice : representation decimale d’un entier

Dans cet exercice un entier est represente par un tableau de 10 entiers. La case 0 contient lesunites, la case 1 les dizaines, la case 2 les centaines, . . . Ecrire un programme qui :

1. demande un entier positif, n1, a l’utilisateur

2. le stocke, comme ci-dessus, dans un tableau N1

3. demande un second entier, n2, positif et plus petit que le premier

4. le stocke dans un tableau N2

5. calcule le tableau N3 qui contient la representation de la difference n1-n2 sans utiliser laquantite n1-n2

6. affiche chacun des tableaux N1, N2, N3 sur une ligne differente et dans l’ordre de lecturehabituel (les centaines avant les dizaines etc.)

7.5.10 Exercice : retournement

Ecrire un programme qui :– demande un mot a l’utilisateur– affiche le mot donne et le mot a l’envers sur une meme ligne

7.5.11 Exercice : schema de Horner

Un polynome P a coefficients reels, de degre <= 10 est defini par le tableau A de ses coefficients :

A[0] + A[1]x + A[2]x2 + ...A[10]x10

Ecrire un programme qui initialise le tableau A par lecture de chaque coefficient, calcule et affichela valeur prise par ce polynome pour une valeur lue de la variable. On demande d’utiliser lamethode de Horner :

P (x) = (. . . (((A[10] ∗ x + A[9]) ∗ x + A[8]) ∗ x + A[7]) ∗ x + . . . A[1]) ∗ x + A[0]

87

Page 89: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.5. TAB. 1D CHAPITRE 7. RESUME DE COURS ET EXERCICES

7.5.12 Exercice : suite croissante

Soit un tableau d’entiers indice sur 0 . . . 100. Ecrire un sous-programme qui determine si la suited’entiers representee par ce tableau est croissante : c’est a dire element i <= element i+1 pourtout i.

7.5.13 Exercice : tri de caracteres

Ecrire un programme qui trie les caracteres d’une chaıne de caracteres entree par l’utilisateur parordre alphabetique. Par exemple :

Entrez une chaıne de caracteres : arbre

Resultat : aberr

7.5.14 Exercice : stockage d’entiers

Construire un programme qui demande a l’utilisateur une succession d’entiers compris entre 0 et99. Le programme cesse de reclamer des entiers quand l’utilisateur re-donne pour la premiere foisun entier deja donne. Il doit alors afficher tous les entiers donnes par l’utilisateur et dans l’ordreou celui-ci les a donnes.Imaginez plusieurs methodes pour resoudre ce probleme.

7.5.15 Exercice : pile ou face

Simuler 10000 parties de 50 tirages Pile ou Face. Le programme archive les resultats dans untableau et affiche l’”histogramme horizontal” de ces 10000 parties. On appelle ici ”histogrammehorizontal” l’affichage de 51 lignes, sur chacune desquelles apparaıt le numero de la ligne i (de 0 a50) et un nombre d’etoiles proportionnel au nombre de parties ayant obtenu i Piles.

7.5.16 Exercice : sur les chaınes de caracteres....

Ecrire un programme qui :

1. demande a l’utilisateur d’entrer une chaıne de caracteres se terminant par # et la stockedans un tableau de 50 caracteres, jusqu’au caractere # exclu (ne pas oublier le \0)

2. calcule la longueur de cette chaıne de caracteres (nombre de caracteres avant le ′\0′)

3. insere dans le tableau avant la chaıne de caracteres le mot ” toto ”

4. compare la chaıne ainsi obtenue avec la chaıne ” toto titi ”

5. affiche la chaıne, mais a l’envers

6. regarde si la chaıne est un palindrome

7. efface tous les ’o’ de la chaıne

8. teste si la chaıne contient un ’l’

9. affiche le nombre de ’a’ de la chaıne

88

Page 90: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.6. TAB. 2D CHAPITRE 7. RESUME DE COURS ET EXERCICES

7.6 Tableaux a deux dimensions

Un tableau a deux dimensions (2D) est un tableau dont les cases sont referencees par deux indices.Ses deux dimensions sont son nombre de lignes et son nombre de colonnes. De meme que pour untableau a une dimension, en C, les cases d’un tableau 2D sont toutes du meme type. La declarationd’un tableau 2D est obligatoire et se fait de la facon suivante (par exemple pour un tableau de 8lignes et 10 colonnes de caracteres) :

char NomTableau [8][10] ;

Chaque case du tableau peut etre consideree comme une variable independante. En C, la case dela ime ligne et de la jme colonne du tableau tab se note tab[i][j] ;

Attention : en C, la numerotation des lignes et colonnes commence toujours a 0.

La representation la plus commode d’un tableau a deux dimensions est la representation enechiquier, avec l’indice de la ligne indique sur un axe vertical descendant et l’indice de la colonnesur un axe horizontal dirige vers la droite. Par exemple dans le tableau T ci dessous, l’elementT [0][1] vaut 12.

i\j 0 1 20 0 12 01 1 15 −12 −1 5 03 0 3 1

7.6.1 Exercice : triangle de Pascal

Faire un programme qui affiche les coefficients du developpement de l’expression (a + b)n. Onutilise un tableau a deux dimensions et le triangle de Pascal. On suppose n connu et egal a 10.On suppose aussi que ce premier programme utilise un tableau a deux dimensions. Refaire ceprogramme avec un seul tableau a une dimension.

7.6.2 Exercice : carre magique

On appelle carre magique 3*3 un tableau carre 3*3 d’entiers, qui verifie :

1. chaque case contient un entier entre 1 et 9

2. aucun entier n’apparaıt deux fois

3. la somme de chaque ligne vaut 15

4. la somme de chaque colonne vaut 15

5. la somme de chaque diagonale vaut 15.

On demande tout d’abord de demontrer pourquoi dans un tel tableau :– la case du milieu vaut 5– si l’on fixe deux cases de la premiere ligne alors les autres cases sont determinees par les con-

traintes (meme si le carre alors obtenu n’est pas necessairement magique)– l’ensemble des carres ainsi obtenu contient tous les carres magiques

En deduire un programme qui affiche l’ensemble des carres magiques 3*3. Verifier (visuellementou par programme (plus difficile)) que ces carres magiques sont tous equivalents aux symetries ourotations pres.

89

Page 91: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.6. TAB. 2D CHAPITRE 7. RESUME DE COURS ET EXERCICES

7.6.3 Exercice : Au CE1...

En classe de CE1 les eleves font l’exercice suivant :La maıtresse dispose des entiers sur une ligne de cahier et les eleves doivent calculer les lignessuivantes pour former une pyramide renversee : sur chaque ligne et entre deux entiers de la ligneprecedente l’eleve ecrit la somme de ceux-ci. Voyez plutot sur l’exemple ci-dessous :

3 4 23 12 14 437 27 35 26 57

34 62 61 8396 123 144

219 267486

– Ecrire un programme qui demande la premiere ligne a l’utilisateur et affiche les suivantes.– Meme exercice, mais en utilisant un tableau a une dimension.

7.6.4 Exercice : autour des carres k-valides

On considere un tableau de caracteres a deux dimensions de taille N × N , ou N sera une con-stante definie dans l’entete du programme. Les cases de ce tableau contiennent soit des caracteresnumeriques (valeurs comprises entre 1 et 9), soit le caractere #.

9

5 1 3 #

4

3

6

2

#

8

#

1

2 #

9 5

7#

8

# #6

1

5

2

4

2 6 #

8 3 2

5

5

1

Etant donne un entier k, on dit qu’un tel tableau est k-valide si pour chaque bloc de chiffrescompris entre deux marqueurs # (ou bien le bord du tableau), la somme des chiffres de ce bloc nedepasse pas k. On ne considere que les blocs horizontaux ou verticaux. Sur l’exemple ci-dessus, letableau est 14-valide.Question 1 : Construire une fonction booleenne qui prend un tableau de caracteres N ×N et unentier k en parametres, et qui retourne 1 si le tableau est k-valide, 0 sinon.Question 2 : Ecrire une procedure qui determine la plus petite valeur k telle que le tableau passeen parametre soit k-valide.

7.6.5 Exercice : symetrie

Verifier qu’un tableau carre M est symetrique, c’est a dire que ∀i, j, M [i][j] = M [j][i].

7.6.6 Exercice : initialisations

Pendant tout l’exercice on considere un tableau 8*8 d’entiers.– initialiser ce tableau comme une matrice identite et l’afficher.– l’initialiser comme une matrice ”identite-sym”, qui n’a que des 0 et des 1, ou les 1 sont portes

par l’autre diagonale.– l’initialiser comme une matrice 3-identite dont seules les 3 diagonales principales ont des 1.– l’initialiser avec des 0 et des 1, comme un echiquier.

90

Page 92: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.6. TAB. 2D CHAPITRE 7. RESUME DE COURS ET EXERCICES

– l’initialiser avec des 0, des 1 et des 2, comme un echiquier a trois couleurs.– l’initialiser avec des diagonales de 0, des diagonales de 1, des diagonales de 2, . . . comme dans

le dessin ci-dessous :0 1 2 3 4 5 6 7

1 0 1 2 3 4 5 6

2 1 0 1 2 3 4 5

3 2 1 0 1 2 3 4

4 3 2 1 0 1 2 3

5 4 3 2 1 0 1 2

6 5 4 3 2 1 0 1

7 6 5 4 3 2 1 0

91

Page 93: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

7.7. POINTEURS CHAPITRE 7. RESUME DE COURS ET EXERCICES

7.7 Les pointeurs

7.7.1 Exercice 1

Taper, compiler et executer le programme ci-dessous. Expliquer les resultats.

#include <stdio.h>

int main (void) {

char c1;

int x1;

double y;

printf(" adresse de c1: %p contenu de c1 %c \n", &c1, c1);

printf(" adresse de x1: %p contenu de x1 %d \n", &x1, x1);

printf(" adresse de y1: %p contenu de y1 %f \n", &y1, y1);

c1 = ’A’;

x1 = 7;

y1 = 3.1459;

printf(" adresse de c1: %p contenu de c1 %c \n", &c1, c1);

printf(" adresse de x1: %p contenu de x1 %d \n", &x1, x1);

printf(" adresse de y1: %p contenu de y1 %f \n", &y1, y1);

return 0;

}

7.7.2 Exercice 2

Taper le programme ci-dessous, le compiler et l’executer. Puis commenter l’execution.

# include <stdio.h>

int main (void) {

char *ptr;

double Tab[10];

int i;

printf("\n");

printf ("ptr = %p, ptr+1 = %p\n", ptr, ptr+1);

printf ("Tab = %p, Tab+1 = %p\n", Tab, Tab+1);

printf ("adresse(ptr) = %p, adresse(ptr)+1 = %p\n", &ptr, &ptr+1);

printf ("adresse(i) = %p, adresse(i)+1 = %p\n", &i, &i+1);

printf("\n");

return 0;

}

92

Page 94: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

Chapitre 8

Annales

8.1 Examen 2004-2005

Examen d’informatique

L1 INF111

duree : 3h00

– Tous les documents sont autorises a l’exception des calculettes.

– Les baremes sont donnes a titre indicatif. Les deux exercices et le probleme sont indepen-

dants.

– La qualite de redaction et la clarte des algorithmes et des programmes sont serieusement

pris en compte dans la note.

– Lisez toutes les questions avant de commencer.

Probleme : Les huit Dames ( /15.5pts)

Peut on disposer huit dames sur un echiquier (echiquier 8 ∗ 8) sans qu’aucune d’elles ne puisse enprendre une autre ?

Une dame prend une autre dame si cette autre dame est sur la meme colonne, sur la meme ligne,sur la meme diagonale droite ou sur la meme diagonale gauche (voir figure ci-dessous ou la damepositionnee en ligne 1 et colonne 4 peut prendre n’importe quelle piece situe sur une case marquee).

colonne 0

colonne 1

colonne 2

colonne 3

colonne 4

colonne 5

colonne 6

colonne 7

ligne 0

ligne 1

ligne 2

ligne 3

ligne 4

ligne 5

ligne 6

ligne 7

D

Il ne peut donc y avoir- plus d’une dame sur une colonne (contrainte a)

93

Page 95: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.1. EXAMEN 2004-2005 CHAPITRE 8. ANNALES

- plus d’une dame sur une ligne de l’echiquier (contrainte b)- plus d’une dame sur une diagonale droite ou gauche (contrainte c).Comme un echiquier a huit colonnes, il est impossible de poser sur celui-ci plus de huit dames (unepar colonne) qui ne se prennent pas les unes les autres.

Question 0 ( /0.25pts) : Sur l’echiquier ci-dessus, donnez un exemple de position d’une secondedame telle que celle-ci et celle positionnee en (1, 4) ne se prennent pas mutuellement.

Nous considerons au debut de ce probleme les configurations de huit dames respectant seulementla contrainte a : une (et exactement une) dame par colonne.On considere deux representations equivalentes pour definir une telle configuration de huit damesplacees sur l’echiquier :a) un tableau 8 ∗ 8 a deux dimensions. Une case a 0 est une case vide, une case a 1 est une casecontenant une dame.b) un tableau a une dimension de huit cases. Chaque case correspond a une colonne de l’echiquier :la case i contient le numero de ligne ou se trouve la dame de la colonne i de l’echiquier.

Voici les structures de donnees retenues :

#define MAX 8

int Echiquier[MAX][MAX], NumeroLigne[MAX];

Nous donnons ci-dessous un exemple d’une configuration satisfaisant la contrainte a :

ligne 0 0 0 1 0 0 0 0 0ligne 1 0 0 0 1 0 0 0 1

0 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 1 1 0 0 L = 6, 5, 0, 1, 4, 4, 5, 10 1 0 0 0 0 1 01 0 0 0 0 0 0 0

ligne 7 0 0 0 0 0 0 0 0

Configuration ”Echiquier” Configuration ”NumeroLigne”

Question 1 ( /1pt) : Ecrire une procedure qui prend en parametre une configuration sous laforme Echiquier et l’affiche a l’ecran sous la forme donnee en partie gauche de l’exemple ci-dessus.Cette procedure a pour en-tete :void AfficheEchiquier(int E[MAX][MAX])

Ecrire une procedure qui prend en parametre une configuration sous la forme NumeroLigne etl’affiche a l’ecran sous la forme donnee en partie droite de l’exemple ci-dessus. Cette procedure apour en-tete :void AfficheLigne(int L[MAX])

Question 2 ( /1pt) : Ecrire une procedure void InitEchiquier(int L[MAX]) qui initialise untableau passe en parametre sous la forme NumeroLigne avec les positions de 8 dames rentrees auclavier par l’utilisateur. Votre procedure doit lire huit entiers compris entre 0 et 7 (pas neces-sairement distincts), les stocker dans chacune des huit cases de L, en demandant a l’utilisateur derecommencer tant que chaque valeur n’est pas dans l’intervalle [0..7].

Question 3 ( /1.25pts) : Ecrire une procedure qui fait passer de la representation Echiquier ala representation NumeroLigne.L’en-tete de cette procedure est :void RepEversL(int E[MAX][MAX], int L[MAX])

94

Page 96: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.1. EXAMEN 2004-2005 CHAPITRE 8. ANNALES

La variable E contient la configuration sous la forme Echiquier que l’on veut convertir. On supposeque E contient exactement une dame par colonne. La variable L, modifiee par la procedure, doitcontenir a la fin la configuration convertie sous la forme NumeroLigne.Pour chaque valeur j de 0 a (MAX − 1), la procedure calcule le seul indice de ligne i tel queE[i][j] = 1, indice qui est alors affecte a L[j].

Question 4 ( /1.25pts) : Ecrire une procedure qui fait passer de la representation NumeroLigne

a la representation Echiquier.L’en-tete de cette procedure est :void RepLversE(int L[MAX], int E[MAX][MAX])

La variable L contient la configuration sous la forme NumeroLigne que l’on veut convertir. Lavariable E, calculee par la procedure, contient la configuration convertie sous la forme Echiquier,avec une seule dame par ligne et par colonne.Elle initialise chaque case de E a 0, puis pour chaque j de 0 a (MAX − 1), affecte 1 a E[L[j]][j].

Question 5 ( /1pt) : Ecrire un programme principal qui demande a l’utilisateur de :– Rentrer une configuration sous la forme NumeroLigne dans une variable L– Afficher L a l’ecran– Calculer la representation echiquier E de cette configuration associee a L– Afficher E a l’ecran– Enfin, le programme doit calculer la representation NumeroLigne L de E et l’afficher a l’ecran.

La derniere valeur calculee de L doit etre egale a celle rentree au debut par l’utilisateur, maison ne fera pas la verification dans le programme.

Le programme principal utilise les procedures vues precedemment. On demande la totalite duprogramme principal, mais l’on ne recopiera que les en-tetes des procedures et fonctions.

Si l’on veut maintenant qu’une variable L soit une solution qui reponde davantage au problemedes huit dames, il faut que L soit une permutation : la variable L de type NumeroLigne est unepermutation si elle contient chaque entier de 0 a 7 une fois et une seule fois. En d’autres termes,L represente une permutation si ∀i ∈ 0 . . . (MAX − 1), L[i] ∈ 0...7 et ∀i 6= j, L[i] 6= L[j]. Dans lecadre du probleme si la variable L est une permutation cela signifie que la configuration representeecontient une seule dame par ligne et une seule dame par colonne (la contrainte sur les diagonalesn’est pas necessairement satisfaite !). Autrement dit : les contraintes a et b sont respectees, maispas necessairement la contrainte c.

Question 6 ( /1.5pts)

Ecrire une procedure qui genere une permutation aleatoire. L’en-tete de cette procedure est :void GenPermutation (int L[MAX])

Cette procedure utilise un tableau int DejaVu[MAX]. La case DejaV u[i] contiendra 0 si i n’estpas encore dans la permutation L en cours de calcul, contiendra 1 si i est deja dans la permutation.Au depart la procedure doit initialiser a 0 les cases de DejaV u.Cette procedure utilise aussi un entier CaseAleat. Pour toute valeur j de 0 a MAX − 1, elle tirealeatoirement un entier CaseAleat compris entre 0 et 7 tant que cet entier n’est pas deja dans lapermutation. Une fois cet entier obtenu, L[j] devient egal a CaseAleat et DejaV u est modifie enconsequence.On rappelle que la fonction int hasard(int inf, int sup), retourne une valeur aleatoire en-tiere comprise dans [inf, sup].

Question 7 ( /1.5pt)

Ecrire une fonction booleenne qui verifie qu’une permutation est une solution au probleme des huitdames. La fonction a un parametre L de type NumeroLigne. La fonction renvoie VRAI (valeur 1)si la permutation donnee en parametre est une solution au probleme des huit dames, elle renvoieFAUX (valeur 0) sinon. La fonction doit en fait decider si la contrainte c est verifiee (puisqu’une

95

Page 97: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.1. EXAMEN 2004-2005 CHAPITRE 8. ANNALES

permutation verifie deja les contraintes a et b). On appellera cette fonction Solution.Pour cela, l’algorithme de la fonction verifie que pour chaque couple d’indices i, j (i < j) on a :abs(L[i] − L[j]) 6= abs(i − j). Des qu’un couple ne verifie pas cette condition la fonction renvoiela valeur faux. Sinon la fonction renvoie la valeur vrai. On rappelle que la fonction valeur absolueexiste en langage C et se note abs.

Question 8 ( /1.25pts)

Ecrire un programme principal qui engendre une solution au probleme des huit dames. Ce pro-gramme doit contenir la totalite des en-tetes des fonctions et procedures necessaires. Ce programmedemande une permutation aleatoire au generateur de permutation, tant que la permutation donneen’est pas une solution au probleme des huit dames. Lorsque le programme obtient une premieresolution, il l’ecrit sous les deux formes : Echiquier et NumeroLigne.

Imaginons avoir obtenu une solution L au probleme des huit dames. Grace a cette solution, onpeut calculer immediatement 8 solutions differentes ou non de L.La premiere de ces solutions est representee par L, la seconde est celle obtenue par rotation de 90degres de l’echiquier correspondant a la solution L, la troisieme par rotation de 180 degres de lasolution L , la quatrieme par rotation de 270 degres de la solution L . Ces quatre solutions donnent,par symetrie par rapport a leur diagonale principale, quatre autres solutions. Ces 8 solutions nesont pas necessairement toutes differentes (elles le sont en general).

Question 9 ( /1.5pts)Nous demandons d’ecrire la procedurevoid SymDiag(int Linit[MAX], int Lfinal [MAX])

Cette procedure calcule Lfinal, la representation NumeroLigne de la solution obtenue par symetriepar rapport a la premiere diagonale de Linit.Indication : la case de coordonnees (i, j) de l’echiquier devient de coordonnees (j, i) apres symetriepar rapport a la premiere diagonale.

Question 10 ( /1.5pts)Nous demandons d’ecrire la procedurevoid Rotation(int Linit[MAX], int Lfinal [MAX])

Cette procedure calcule Lfinal, qui est la representation NumeroLigne de la solution obtenue parrotation de Linit de 90 degres.Indication : une case de coordonnees (i, j) de l’echiquier devient de coordonnees(MAX − 1− j, i) apres rotation de 90 degres.

Question 11 ( /1.5pts)Nous demandons d’ecrire une procedure qui a partir d’une solution Linit donnee calcule les huitsolutions equivalentes obtenues par symetrie et rotation et les stocke dans un tableau. Pour celala procedure utilise un tableau St[8][MAX ].L’en-tete de la procedure demandee est :void Equivalent(int Linit[MAX], int St[8][MAX])

La procedure stocke dans chacune des lignes du tableau St une des huit solutions sous formeNumeroLigne, y compris celle donnee en parametre.

Question 12 ( /1pt)Nous demandons d’ecrire un programme principal qui calcule comme ci-dessus (question 8) unepremiere solution, puis calcule les huit solutions obtenues par symetrie et rotation. Le programmeecrit les solutions obtenues sous la forme ”NumeroLigne”. La variable utilisee, au niveau du pro-gramme principal, pour stocker les solutions aura pour nom Stock.

96

Page 98: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.1. EXAMEN 2004-2005 CHAPITRE 8. ANNALES

Exercice 1 ( /2.5pts)

Considerons la fonction decrite ci-dessous :

#define N 6

int mystere(int tab[N], int c)

{

return tab[c-1];

}

Question 1 ( /1pt) Pour quelles valeurs du parametre c l’execution de la fonction mysterepeut-elle provoquer une erreur ? Recrire la fonction pour que dans ce cas, elle affiche un messaged’erreur et qu’elle retourne la valeur −1.Question 2 ( /1.5pts)Jean souhaite utiliser la fonction mystere et construit pour cela la fonction main suivante :

int main(void)

{

int t[N]={24,6,22,22,6,-1}; /*i.e. t[0]=24,t[1]=6,...,t[5]=-1*/

int x=1;

printf("%i",mystere(t,4));

printf("%i",mystere(x,2);

printf("%i",mystere(t,t[x]));

printf("%i",mystere(t[2],3));

printf("%i",mystere(t,3)+mystere(t,x));

printf("%i",mystere(t,t[0]-t[2]));

return 0;

}

Pour chacune des six instructions printf, dire si elle pose un probleme a l’execution du programme,et expliquer pourquoi le cas echeant. S’il n’y a pas de probleme, dire ce qu’elle affiche a l’ecran.

Exercice 2 ( /2pts)

Question 1 ( /0.5pt)Considerons le programme de Paul presente ci-dessous :

#define N 10

void secret(char c, char *l)

{

*l=*l+1;

if (*l >= c)

*l=’A’;

}

int main(void)

{

char e=’X’,f=’Y’;

secret(e,f);

printf("%c",e);

printf("%c",f);

97

Page 99: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.1. EXAMEN 2004-2005 CHAPITRE 8. ANNALES

return 0;

}

Malheureusement, le programme de Paul engendre un probleme a l’execution. Expliquer son erreuret corrigez-la.

Question 2 ( /1.5pts)Paul semble maintenant avoir compris son erreur, il efface donc sa fonction main et en ecrit unenouvelle (la procedure secret restant inchangee) :

int main(void)

{

char c,l,a,b,t[N]="RABOT";

/*bloc numero 1*/

a=’X’; b=’Y’;

secret(a,&b);

printf("%c",a);

printf("%c",b);

/*bloc numero 2*/

c=’X’; l=’Y’;

secret(l,&c);

printf("%c",c);

printf("%c",l);

/*bloc numero 3*/

c=’X’; l=’Y’;

secret(&l,c);

printf("%c",c);

printf("%c",l);

/*bloc numero 4*/

a=’X’; b=’Y’;

printf("%c",secret(b,&a));

/*bloc numero 5*/

secret(t[0],&t[1]);

printf("%s",t);

/*bloc numero 6*/

c=’L’;

secret(c,&c);

printf("%c",c);

return 0;

}

Pour chacun des six blocs d’instructions, dire s’il est valide ou non (le programme compilera/s’executera-t-il correctement ?). Si oui, donner ce qui est affiche a l’ecran, si non, expliquer ce qui ne va pas.

98

Page 100: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.2. EXAMEN 2005-2006 CHAPITRE 8. ANNALES

8.2 Examen 2005-2006

Exercice 1 : suites recurrentes de Mycielski

a) 1 points On considere la suite recurrente definie par :

{

m1 = 2mk = 2×mk−1 + 1

Ecrire une fonction mycielski qui prend en parametre un entier n puis calcule mn (le nieme

terme de la suite) et retourne la valeur de mn.

b) 1,5 points On considere maintenant une suite supplementaire :

{

c1 = 1ck = 3× ck−1 + mk−1

ou mk−1 designe le k − 1eme terme de la suite de Mycielski de la question a).

Ecrire une procedure1 mycielski2 qui prend en parametre un entier n, et qui affiche les valeursdes termes mn et cn de la maniere suivante :L’appel de la procedure mycielski2 avec n = 5 affiche

m5 = 47

c5 = 236

c) 1,5 points

Ecrire un programme complet qui demande a l’utilisateur de donner un entier n et affiche lesvaleurs des terme mn et cn et recommence jusqu’a ce que l’utilisateur donne l’entier −1.Le programme doit respecter les conventions d’affichage de l’exemple suivant :

n= ? 5m5 = 47

c5 = 236

n= ? 3m3 = 11

c3 = 20

n= ? -1Au revoir.

1Une procedure est une fonction qui ne retourne rien

99

Page 101: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.2. EXAMEN 2005-2006 CHAPITRE 8. ANNALES

Exercice 2 : que font ces programmes ?

1) 2 points Pierre decide d’ecrire le programme ci-dessous :

#define N 5

void secret (int tab[N], int i)

{

tab[i]=tab[N-i-1];

tab[N-i-1]=tab[i];

}

void affichage(int tab[N])

{

int i;

for (i=0;i<N;i++)

{

printf("%i ",tab[i]);

}

}

int main (void)

{

int t[N]={12,2,-7,-3,4}; /* c.a.d. t[0]=12,t[1]=2,...,t[4]=4 */

int u[N]={0,1,2,3,4};

int v[N]={12,2,-7,-3,4};

int w[N]={0,1,2,3,4};

int x[N]={0,1,2,3,4};

int i;

/* bloc numero 1 */

secret(t,1);

printf("%i",t[1]);

/* bloc numero 2 */

secret(u,0);

affichage(u);

/* bloc numero 3 */

if (v[1]>0){

secret(v,1);

}

if (v[1]<0){

v[1]=-1;

}

affichage(v);

/* bloc numero 4 */

for (i=0;i<N/2;i++){

secret(w,i);

}

affichage(w);

/* bloc numero 5 */

100

Page 102: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.2. EXAMEN 2005-2006 CHAPITRE 8. ANNALES

for (i=0;i<N;i++){

secret(x,i);

}

affichage(x);

Pour chacun des 5 blocs de la fonction main, dites ce qui est affiche a l’ecran.

2) 0,5 points Paul, l’ami de Pierre, a decide d’ecrire la fonction suivante :

int mystere (int *a, int b, int *c)

{

*a=b ;

b=*c ;

*c=*a ;

return *a ;

}

Que signifient les ’∗’ dans l’entete et le corps de la fonction ?

3) 2 points Paul cherche maintenant a utiliser sa fonction mystere en ecrivant la fonction princi-pale suivante :

int main(void)

{

int x=2,y=8,z=4 ;

/* bloc numero 1 */

printf ("%i", mystere(x,y,z)) ;

/* bloc numero 2 */

x=2;y=8;z=4;

printf ("%i", mystere(&x,y,&z)) ;

/* bloc numero 3 */

x=2;y=8;z=4;

printf ("%i", mystere(&z,x,&y)) ;

/* bloc numero 4 */

x=2;y=8;z=4;

mystere(&x,y,&z);

printf ("%i %i %i",&x,y,&z) ;

/* bloc numero 5 */

x=2;y=8;z=4;

mystere(&x,z,&y);

printf ("%i %i %i",x,y,z) ;

return 0;

}

Pour chacun des cinq blocs d’instructions, dire s’il est valide ou non (le programme compilera/s’executera-t-il correctement ?). Si oui, donner ce qui est affiche a l’ecran, si non, expliquer ce qui ne va pas.

101

Page 103: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.2. EXAMEN 2005-2006 CHAPITRE 8. ANNALES

Probleme

On dispose d’une grille 9×9 partiellement remplie (voir exemple). Cette grille 9×9 est subdiviseeen 9 sous-carres 3 × 3, (voir exemple). Un sous-carre est la partie de grille que l’on obtient enselectionnant 3 lignes et 3 colonnes : les trois premieres, les trois du milieu ou les trois dernieres.

0 1 2 3 4 5 6 7 8

0 8 5 2 11 9 4 1 2 32 3 7 4

3 5 3 4 94 4 2 6 35 1 3 9 7

6 6 8 57 1 8 4 3 68 2 7 8 9

Le sous-carre obtenu en selectionnant les 3 lignes du milieu et les 3 dernieres colonnes de l’exempleest :

39 7

Le jeu consiste a remplir chaque case de la grille avec un entier compris entre 1 et 9 en respectanttrois contraintes :

a) Un entier n’apparaıt qu’une seule fois dans une ligne (contrainte a).

b) Un entier n’apparaıt qu’une seule fois dans une colonne (contrainte b).

c) Un entier n’apparaıt qu’une seule fois dans un sous-carre (contrainte c).

Comme chaque ligne contient 9 cases, cela signifie qu’elle contient tous les entiers de 1 a 9 exacte-ment une fois. Meme remarque pour les colonnes et pour chacun des sous-carres.

Dans ce probleme nous realisons un programme C, qui nous permet d’initialiser une grille et denous aider a la remplir.

ATTENTION : Ne cherchez pas a remplir la grille d’exemple, ce n’est pas le but du probleme etcela ne vous procurera aucun point.

Partie 1

1) 0,5 points Donnez, avec justification, le seul entier qu’il est possible de poser dans la case(ligne 7, colonne 5), ainsi que dans la case (ligne 1, colonne 0).

Nous definissons une constante T et un tableau Grille de la maniere suivante :

#define T 9

int Grille[T][T];

Le tableau Grille contient le tableau du jeu. Une case contient un entier de 0 a 9. La valeur 0signifie que le contenu de la case n’est pas encore determine.

2) 0,5 points Ecrire une procedure qui initialise une grille de jeu a 0. L’en-tete de cette procedureest :

void Initialiser (int G[T][T]);

102

Page 104: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.2. EXAMEN 2005-2006 CHAPITRE 8. ANNALES

3) 1,5 points

Ecrire une procedure qui demande a l’utilisateur de donner les cases initialement connues. Pourchaque case connue l’utilisateur donne trois entiers : un indice de ligne i, un indice de colonne j,et le contenu de la case correspondante k. L’utilisateur donne k = 0 pour signifier a la procedureque l’initialisation est terminee. A chaque triplet d’entiers donne par l’utilisateur, la procedureverifie qu’ils sont tous les trois compris entre 1 et 9 ou que k est nul. L’en-tete de cette procedureest :

void Demande_cases (int G[T][T]);

indice de ligne? 3

indice de colonne? 4

contenu de la case? 7

La case (3,4) contient maintenant l’entier 7.

indice de ligne? 2

indice de colonne? -3

contenu de la case? 6

Les nombres ne sont pas correct, veuillez recommencer!

indice de ligne? 2

indice de colonne? 3

contenu de la case? 0

Vous avez termine, merci.

4) 1 points Ecrire une procedure qui prend en parametre un tableau G de jeu et l’affiche a l’ecran,en separant les entiers par des ”;” et en passant a la ligne a chaque fin de ligne du tableau. Cetteprocedure a pour en-tete :

void AfficherJeu (int G[T][T]);

Le tableau doit s’afficher sous la forme :

; 8 ; 5 ; ; ; ; 2 ; 1 ; ;

; 9 ; 4 ; ; 1 ; 2 ; ; ; 3 ;

; ; ; 3 ; ; ; 7 ; ; 4 ;

5 ; ; 3 ; 4 ; ; 9 ; ; ; ;

; 4 ; ; 2 ; ; 6 ; ; 3 ; ;

; ; ; 1 ; ; 3 ; 9 ; ; 7 ;

6 ; ; 8 ; ; ; 5 ; ; ; ;

1 ; ; ; 8 ; 4 ; ; 3 ; 6 ; ;

; 2 ; 7 ; ; ; ; 8 ; 9 ; ;

Partie 2

Pour chacune des cases vides (a 0) de Grille, nous allons calculer la liste des entiers possibles.Un entier, de 1 a 9, est possible pour une case (i,j), si cet entier n’est pas deja dans la ligne i, oudans la colonne j, ou dans le sous-carre contenant la case (i,j).

Pour memoriser les entiers possibles d’une case, nous utilisons le tableau EPossibles declarecomme ci-dessous :

int EPossibles [81][T+1];

103

Page 105: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.2. EXAMEN 2005-2006 CHAPITRE 8. ANNALES

Chaque case de EPossibles contient un 0 ou un 1. Chaque ligne de ce tableau correspond a unecase du tableau Grille. Chaque colonne de ce tableau correspond a un entier : la colonne d’indicej (j de 1 a 9), correspond a l’entier j. Nous n’utilisons pas la colonne 0. Supposons que la case(i,j) de Grille soit associee a la ligne lg de EPossibles. Alors : EPossibles[lg][c]=1, si c estpossible pour (i,j) et EPossibles[lg][c]=0 sinon.Voila par exemple les lignes 44 et 45 du tableau EPossibles :

0 1 2 3 4 5 6 7 8 9. . .

EPossibles[44] 1 0 0 0 1 0 0 1 0EPossibles[45] 0 1 0 0 0 0 0 1 0

. . .

La ligne 44 correspond a la case (4, 8) pouvant recevoir les entiers 1, 5, 8.La ligne 45 correspond a la case (5, 0) pouvant recevoir les entiers 2, 8.

Il est important, pour la suite du probleme de bien comprendre la correspondance entre les indicesd’une case (i,j) du tableau Grille et l’indice lg de la ligne qui lui est associee dans EPossibles.Cette correspondance est celle proposee dans le tableau ci-dessous :

0 1 2 3 4 5 6 7 8

0 0 1 2 3 4 5 6 7 81 9 10 11 12 13 14 15 16 172 18 19 20 21 22 23 24 25 263 27 28 29 30 31 32 33 34 354 36 37 38 39 40 41 42 43 445 45 46 47 48 49 50 51 52 536 54 55 56 57 58 59 60 61 627 63 64 65 66 67 68 69 70 718 72 73 74 75 76 77 78 79 80

Le tableau illustre cette correspondance entre les cases de Grille et les lignes de EPossibles.Pour (i,j), indices d’une case de Grille il donne la valeur lg d’une ligne de EPossibles. Et, ildonne la correspondance inverse, de lg vers (i,j). On y voit, par exemple que :La case (3,2) de Grille correspond a la ligne 29 du tableau EPossibles.On y voit aussi que la ligne 46 de EPossibles est associee a la case (5,1) de Grille.

5) 1 points Ecrire une fonction qui prend en entree deux parametres, lig et col, qui sont lesindices d’une case du tableau Grille. Cette fonction retourne le numero de la ligne du tableauEPossibles qui lui est associee. L’en-tete de cette fonction est :

int CaseVersLigne (int lig, int col);

6) 1 points Ecrire une procedure qui calcule la ligne et colonne de Grille associes a un numerode ligne de EPossibles. Cette procedure a trois parametres et son en-tete est :

void LigneVersCase (int IndiceDeLigne, int *lig, int *col);

La variable IndiceDeLigne contient un entier compris entre 0 et 80 (c’est un indice de ligne dutableau EPossibles). Les variables *lig et *col, modifiees par la procedure doivent contenir, ala fin de celle-ci, l’indice de ligne et de colonne de la case associee a IndiceDeLigne.

7) 1 points Ecrire une procedure qui calcule les indices de la case du coin en haut a gauche dusous carre contenant une case de la Grille.

104

Page 106: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.2. EXAMEN 2005-2006 CHAPITRE 8. ANNALES

void CoinCarre (int lig, int col, int *ligcoin, int *colcoin);

Les variables lig et col sont les indices de la case de la Grille. Les variables *ligcoin et*colcoin, modifiees par la procedure doivent contenir, a la fin de celle-ci, l’indice de ligne et decolonne de la case du coin en haut a gauche du sous carre contenant la case (lig,col).Par exemple :Pour (lig,col)=(7,5) on doit avoir (ligcoin,colcoin)=(6,3).Pour (lig,col)=(5,5) on doit avoir (ligcoin,colcoin)=(3,3).Pour (lig,col)=(7,2) on doit avoir (ligcoin,colcoin)=(6,0).

8) 1,5 points Ecrire la procedure Possibles. Cette procedure a deux parametres et son en-teteest :

void Possibles (int G[T][T], int EP[81][T+1]);

Le tableau G contient le jeu partiellement rempli (une case qui contient 0 est vide, une case quicontient un entier > 0 est connue). Le tableau EP, une fois calcule par la procedure, indique pourchaque case vide de G, les entiers disponibles pour celle-ci.Cette procedure commence par initialiser le tableau EP a 1.Cette procedure parcourt ensuite chacune des cases (i,j) du tableau G :Si la case (i,j) est connue, la procedure met la ligne correspondante de EP a 0.Si la case (i,j) est inconnue, la procedure doit parcourir (contrainte a) la ligne i du tableau G, etmettre EP[lg][c]=0, si c est un entier present sur cette ligne i de G (lg est ici, la ligne de EP quicorrespond a la case (i,j) de G). Puis la procedure continue ce travail avec la colonne j du tableauG (contrainte b), et avec le sous-carre contenant (i,j) (contrainte c).

9) 1 points Ecrire la procedure :

void AfficherPossibles (int G[T][T], int EP[81][T+1]);

Cette procedure a deux parametres, un parametre G qui est une Grille partiellement remplieet un second parametre, EP, qui indique les entiers possibles pour chacune des cases de G. Cetteprocedure, affiche sur une ligne, pour chacune des cases de Grille, les indices de cette case, et laliste des entiers possibles sous la forme de l’exemple :

...

case (4,6) : 1 ; 5 ;

case (4,8) : 1 ; 5 ; 8 ;

case (5,0) : 2 ; 8 ;

...

Partie 3

10) 1 points Ecrire, le programme principal main, qui initialise le tableau Grille, l’affiche, calculele tableau EPossibles pour cette variable Grille et enfin affiche pour chaque case vide de Grillela liste des entiers possibles.

11) 1 points Ecrire une fonction

int Completer (int G[T][T], int EP[81][T+1]);

Cette fonction recoit deux parametres G (une grille partiellement remplie) et EP le tableau dejacalcule par la procedure Possibles pour G. Cette fonction parcourt le tableau EP. Pour toutes leslignes de EP qui contiennent une seule valeur possible, la fonction attribuera cette valeur a la case

105

Page 107: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.2. EXAMEN 2005-2006 CHAPITRE 8. ANNALES

correspondante de G. Cette fonction retourne aussi un booleen vrai si le tableau G a ete modifiepar elle (et faux sinon).

12) 1 points Ecrire un programme principal, qui initialise le tableau Grille, l’affiche et calculele tableau EPossibles pour cette variable Grille. Puis le programme modifie le tableau Grille

avec la procedure Completer, si c’est possible. Chaque fois que Grille est modifie, le programmerecommence le processus : calcul de EPossibles et modification de Grille. Quand il n’est pluspossible de progresser vers la solution du jeu, avec Completer, ou que le tableau Grille estcompletement rempli, le programme affiche Grille. Dans le cas ou Grille n’est pas completementrempli, le programme affiche aussi le tableau EPossibles.

106

Page 108: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.3. EXAMEN 2007-2008 CHAPITRE 8. ANNALES

8.3 Examen 2007-2008

Probleme : Jeu de Hex

Hex est un jeu de reflexion pour 2 joueurs qui se joue sur une grille triangulaire (voir figureci-dessous). La regle du jeu est tres simple :Le joueur blanc pose des pions blancs, le joueur noir pose des pions noirs. Le joueur blanc com-mence. Chaque joueur pose a son tour un pion sur une intersection libre. Les pions une fois posesne sont ni retires ni deplaces. La grille a quatre bords, deux bords opposes sont pour le joueurblanc et les deux autres sont pour le joueur noir (voir la position de depart de la figure). Le joueurqui parvient a former un chemin continu qui rejoint ses deux bords a gagne la partie.

0 1 2 3 4 5 6 7 8 9 10

10

9

8

7

6

5

4

3

2

1

0

0 1 2 3 4 5 6 7 8 9 10

10

9

8

7

6

5

4

3

2

1

0

Position de depart Le joueur noir gagne la partie

Dans l’exemple, le joueur noir a gagne. Le joueur blanc a perdu : l’existence d’un chemin gagnantpour une couleur empeche l’existence d’un chemin gagnant pour l’autre couleur.

Partie 1 : Modelisation du jeu

Nous realisons un programme en langage C qui permet a 2 joueurs de jouer au jeu de Hex. Danscette partie, nous ne cherchons pas a savoir quel est le joueur gagnant. Ce sera l’objet de la partiesuivante.Chaque intersection de la grille est indicee par son indice de ligne et de colonne (voir figure). Nousutilisons un tableau carre a deux dimensions pour modeliser la grille : une case du tableau est uneintersection de la grille. Le jeu de Hex peut se jouer sur une grille carree de taille quelconque (11pour l’exemple). Nous definissons une constante T pour la taille et le tableau Grille de la manieresuivante :

#define T 11

int Grille[T][T];

Un pion blanc sera modelise par l’entier 1 et un pion noir par l’entier 2. L’absence de pion sera mod-elise par l’entier 0. Voici, par exemple, l’etat du tableau Grille correspondant au deux situationsprecedentes (les indices de lignes et de colonnes ne font pas partie du tableau).

107

Page 109: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.3. EXAMEN 2007-2008 CHAPITRE 8. ANNALES

0 1 2 3 4 5 6 7 8 9 10

0 2 2 2 2 2 2 2 2 2 2 21 1 0 0 0 0 0 0 0 0 0 12 1 0 0 0 0 0 0 0 0 0 13 1 0 0 0 0 0 0 0 0 0 14 1 0 0 0 0 0 0 0 0 0 15 1 0 0 0 0 0 0 0 0 0 16 1 0 0 0 0 0 0 0 0 0 17 1 0 0 0 0 0 0 0 0 0 18 1 0 0 0 0 0 0 0 0 0 19 1 0 0 0 0 0 0 0 0 0 110 2 2 2 2 2 2 2 2 2 2 2

0 1 2 3 4 5 6 7 8 9 10

0 2 2 2 2 2 2 2 2 2 2 21 1 1 2 0 2 1 0 0 0 0 12 1 2 2 1 0 2 0 0 0 0 13 1 0 0 2 1 1 2 1 1 1 14 1 0 0 0 2 2 1 2 0 0 15 1 1 1 1 1 2 1 2 0 0 16 1 0 0 0 2 1 1 2 0 0 17 1 0 0 0 2 2 1 2 0 0 18 1 0 0 0 2 1 2 2 0 0 19 1 0 0 0 0 2 1 1 1 0 110 2 2 2 2 2 2 2 2 2 2 2

Position de depart Le joueur noir gagne la partie

1) Initialiser Ecrire une procedure qui initialise la grille de jeu a la position de depart. L’en-tetede cette procedure est :

void initialiser (int G[T][T]);

2) Afficher Pour afficher la grille de jeu, nous ne dessinons pas les lignes de la grille triangulairemais juste des symboles representant les pions. Un pion blanc est represente par le caractere ’B’,un pion noir par le caractere ’N’, l’absence de pion par le cartactere ’.’. Ecrire une procedurequi affiche la grille de jeu. L’en-tete de cette procedure est :

void afficher (int G[T][T]);

Voici, par exemple, l’affichage correspondant aux deux situations precedentes.

N N N N N N N N N N N

B . . . . . . . . . B

B . . . . . . . . . B

B . . . . . . . . . B

B . . . . . . . . . B

B . . . . . . . . . B

B . . . . . . . . . B

B . . . . . . . . . B

B . . . . . . . . . B

B . . . . . . . . . B

N N N N N N N N N N N

N N N N N N N N N N N

B B N . N B . . . . B

B N N B . N . . . . B

B . . N B B N B B B B

B . . . N N B N . . B

B B B B B N B N . . B

B . . . N B B N . . B

B . . . N N B N . . B

B . . . N B N N . . B

B . . . . N B B B . B

N N N N N N N N N N N

Position de depart Le joueur noir gagne la partie

3) Jouer un coup Ecrire une procedure qui demande a un joueur un numero de ligne et unnumero de colone correspondant a une case ou il peut jouer. La procedure redemande un numerode ligne et un numero de colonne, tant que le joueur ne joue pas sur une case valide. Une caseest valide si elle correspond a une case de la grille et si elle n’est pas occupee par un autre pion.L’en-tete de cette procedure est :

void jouercoup (int * i, int * j, int G[T][T]);

Les variables designees par les deux premiers parametres de la procedure, contiennent a la fin decelle-ci le numero de ligne et de colonne donnes par le joueur.

108

Page 110: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.3. EXAMEN 2007-2008 CHAPITRE 8. ANNALES

4) Enregistrer le coup Ecrire une procedure qui utilise la procedure jouercoup pour demandera un joueur un numero de ligne et de colonne, et qui met un pion du joueur sur la grille. Cetteprocedure a un parametre joueur qui vaut 1 ou 2 selon que c’est le joueur blanc ou noir quijoue. Cette procedure peut etre utilisee pour faire jouer le joueur blanc ou le joueur noir, selon leparametre joueur. L’en-tete de cette procedure est :

void enregistrercoup (int joueur, int G[T][T]);

5) Programme principal Ecrire le programme principal main qui permet de faire jouer deuxjoueur au jeu de Hex. Le programme doit initialiser la grille, l’afficher, puis faire jouer alternative-ment le joueur blanc et le joueur noir jusqu’a ce que toutes les cases de la grille soient remplies.Apres chaque coup, la grille est affichee. On utilise les procedures definies aux questions prece-dentes. Il n’est pas demande de determiner si un joueur a gagne.

Partie 2 : Determiner le gagnant

Au jeu de Hex, il y a toujours un gagnant. Une grille qui ne contient aucune case vide possedetoujours un chemin gagnant pour le joueur blanc ou le joueur noir et il ne peut exister un chemingagnant pour les deux joueurs.Dans cette partie, nous allons determiner, pour une grille completement remplie, quel est le joueurqui a gagne. Si le joueur blanc gagne, le joueur noir ne peut pas gagner. Si le joueur blanc perd,c’est le joueur noir qui gagne. Il nous suffit donc de determiner si le joueur blanc gagne ou non,pour connaıtre le vainqueur.Pour determiner si le joueur blanc gagne, nous utilisons l’algorithme suivant. Nous remplacons tousles 1 de la colonne 1 par des -1. Puis, nous propageons ces -1 dans la grille de jeu sur les positionsdu joueur blanc : “ un 1 devient -1 s’il a un voisin -1”. Si, une fois la propagation terminee, lacolonne T-2 contient un -1, le joueur blanc a gagne.Nous remarquons qu’une case interieure de la grille a exactement 6 voisines dans le jeu de Hex.

3

1 2

4

65

6) Coordonnees des cases voisines Ecrire une procedure qui affiche les indices des casesvoisines d’une case interieure donnee. L’en-tete de cette procedure est :

void casesvoisines (int i, int j);

Par exemple, l’appel a casesvoisines(3,5) doit afficher

2,4

2,5

3,4

3,6

4,5

4,6

7) Initialisation de la propagation Ecrire une procedure qui remplace tous les 1 de la colonne1 du tableau passe en parametre par des -1. L’en-tete de cette procedure est :

void initialisationpropagation (int G[T][T]);

109

Page 111: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.3. EXAMEN 2007-2008 CHAPITRE 8. ANNALES

8) Propagation partielle Ecrire une fonction qui propage les -1 partiellement. Cette fonctionparcours toutes les cases interieures de la grille, une seule fois, et transforme un 1 en -1 si etseulement si ce 1 a un -1 comme voisin. Cette fonction retourne un booleen vrai si au moins unecase a ete modifiee et faux sinon. L’en-tete de cette fonction est :

int propagationpartielle (int G[T][T]);

9) Propagation totale Ecrire une procedure qui propage totalement les -1, c’est-a-dire : jusqu’ace que plus aucune propagation ne soit possible. Cette procedure appelle la fonction precedentejusqu’a ce qu’elle ne realise plus de modification. L’en-tete de cette procedure est :

void propagationtotale (int G[T][T]);

10) Test propagation Ecrire une fonction qui retourne 1 si la colonne T-2 du tableau passe enparametre contient un -1 et retourne 0 sinon. L’en-tete de cette fonction est :

int testpropagation (int G[T][T]);

11) Afficher le gagnant Ecrire une procedure qui prend en parametre une grille de jeu de Hexne contenant aucune case vide et qui affiche ”Victoire du joueur blanc” ou ”Victoire du joueurnoir”.

void affichergagnant (int G[T][T]);

Partie 3 : Pour aller plus loin (Hors-sujet)

– Essayez de montrer qu’il y a toujours un gagnant.– Si vous voulez jouer a Hex, commencez par jouer sur une grille de petite taille puis faites la

grossir jusqu’a 11x11 cases interieures ou plus.

110

Page 112: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

8.3. EXAMEN 2007-2008 CHAPITRE 8. ANNALES

111

Page 113: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

Chapitre 9

Annexes

9.1 Programmer chez soi

Si vous avez disposez d’un ordinateur vous avez la possibilite de travailler vos exercices de pro-grammation chez vous. Trois solutions sont envisageables :

Solution 1 : Connexion directe au serveurs du DLST

Cette solution necessite d’etre relativement a l’aise avec l’outil informatique : installation et con-figuration des outils logiciels requis, comprehension elementaire du fonctionnement en reseau, etc.

Pour ceux qui ne se sentent pas suffisamment a l’aise avec les points ci-dessus, les solutions decritesdans les sections suivantes sont conseillees.

L’idee est de se connecter directement sur les serveurs du DLST (gallien notamment).Pour cela, les outils suivants sont necessaires :

– Client VPN de l’UJF : cet outil permet d’etablir une connexion reseau securisee entre votreordinateur et le reseau de l’UJF. Une fois cette connexion etablie, votre ordinateur fait partiedu reseau de l’UJF.

– PUTTY : cet outil permet d’ouvrir une session securisee sur l’un des serveurs Unix du DLST.Il permet en particulier d’ouvrir une console de commande analogue a une fenetre xterm.

– XMING : il s’agit d’un simulateur X Window. Il est requis si votre ordinateur fonctionne sousWindows. Il remplace l’outil XWin32 et permet d’utiliser des logiciels tels que NEdit.

L’installation de ces outils s’effectue selon les trois etapes suivantes :

1. Installer le client VPN : se connecter a l’adresse https ://nomadisme.grenet.fr

Choisir l’etablissement (UJF) et s’identifier avec son identifiant et son mot de passe habituels.Suivre ensuite les instructions donnees.

2. Rechercher sur Internet et telecharger PUTTY : le site original se trouve a l’adressehttp://www.chiark.greenend.org.uk/~sgtatham/putty/download.html.Le programme putty.exe est directement utilisable. Pour le configurer, effectuer les actionssuivantes :

(a) Executer putty.exe.

(b) Choisir la rubrique “Connection/SSH/X11” : cocher la case “Enable X11 forwarding”.

(c) Choisir la rubrique “Session” :– remplir le champ “Host Name” avec : gallien.e.ujf-grenoble.fr,– sauvegarder la session, en lui choisissant un nom, gallien pour faire simple.

112

Page 114: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.1. PROGRAMMER CHEZ SOI CHAPITRE 9. ANNEXES

3. Rechercher sur Internet et telecharger XMING : le site original se trouve a l’adressehttp://sourceforge.net/projects/xming.Pour installer le logiciel, telecharger puis executer le programme Xming-6-9-0-31-setup.exe(ou une version plus recente le cas echeant).

Pour demarrer une session de travail sur le serveur du DLST :

1. Lancer le client VPN,

2. lancer XMING,

3. lancer la session PUTTY sur gallien.

Vous disposez alors d’une fenetre de commande sur gallien. Vous pouvez ouvrir un fichier avecnedit, le compiler avec gcc, etc.

Solution 2 : Travail en local sous Unix

Si vous disposez d’un ordinateur de type PC equipe de Linux, ou bien d’un ordinateur Mac Intoshequipe de Mac OS X, dans ces deux cas vous n’avez rien a faire, les outils de programmation sonten principe inclus d’origine.Si l’editeur de texte present sur votre ordinateur ne vous convient pas, vous pouvez recherchernedit sur Internet et l’installer.

Solution 3 : Travail en local sous Windows

Si votre ordinateur ne dispose que du systeme d’exploitation Windows, vous pouvez installerl’environnement Cygwin, disponible a l’adresse http://www.cygwin.com.Il s’agit d’un environnement Unix complet fonctionnant sous Windows. Son installation requiertune connexion internet a haut debit.

Alternativement, vous pouvez installer l’outil DEV C++, disponible a l’adressehttp://www.bloodshed.net/dev/devcpp.html.Il s’agit d’un environnement de programmation en langage C++ partiellement compatible avecle langage C. Son principal inconvenient est qu’il ne permet pas de compiler ni d’executer lesprogrammes graphiques que vous aurez a realiser dans la seconde moitie du semestre.

113

Page 115: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.2. TRANSFERT DE FICHIERS DE COMPTE A COMPTE CHAPITRE 9. ANNEXES

9.2 Transferer des fichiers entre votre compte et le comptede votre binome

Il faut utiliser la commande Unix scp.

– Pour envoyer des fichiers a son binome, il faut utiliser la commande :scp < nom du fichier local > < identifiant du binome >@gallien:<nom du repertoire distant >

Exemple de session pour copier tous les fichiers .c de mon repertoire de travail courant vers lerepertoire TP7 de l’etudiant ayant pour identifiant martin :$ scp *.c martin@gallien:INF111/TP7

martin@gallien’s password:

exo1.c 100% |*****************************| 355 00:00

exo2.c 100% |*****************************| 249 00:00

$

– Pour recuperer des fichiers depuis le compte de son binome, il faut utiliser la commande :scp < identifiant du binome>@gallien:<nom du fichier distant > <nom du repertoire local >

Exemple de session pour copier tous les fichiers .c du repertoire du TP7 de l’etudiant martin

vers le repertoire TP7 se trouvant dans mon repertoire de travail courant :$ scp martin@gallien:INF111/TP7/*.c TP7

martin@gallien’s password:

exo1.c 100% |*****************************| 355 00:00

exo2.c 100% |*****************************| 249 00:00

$

Remarques :

1. Le chemin distant specifie dans la commande scp est toujours relatif au repertoire d’accueildu compte distant, quelque soit le sens du transfert.

2. Le mot de passe a saisir est bien entendu celui du compte distant, c’est a dire celui de sonbinome. Les deux etudiants doivent donc etre presents pres du poste de travail pour pouvoireffectuer l’operation1.

1On rappelle qu’il est interdit de communiquer son mot de passe a un tiers. . .

114

Page 116: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.3. TRANSFERTS ENTRE DOMICILE ET COMPTE CHAPITRE 9. ANNEXES

9.3 Transferer des fichiers entre votre domicile et votrecompte Unix au DLST

9.3.1 Depuis chez vous vers le DLST

Il faut utiliser deux outils : (1) un outil pour transferer vos fichiers depuis votre ordinateur a lamaison vers votre compte Windows au DLST, et (2) un outil pour transferer les memes fichiersdepuis le compte Windows vers le compte Unix.

transfert maison → compte Windows

Pour envoyer des fichiers depuis votre ordinateur a la maison vers votre compte Windows au DLST,la methode la plus simple est l’utilisation d’une cle USB.

Une autre possibilite est d’envoyer (via votre fournisseur d’acces) un mail (avec ou sans fichiersattaches) vers votre adresse electronique a l’UJF. Cette derniere adresse vous a ete communiqueelors de votre inscription. Elle est de la forme :< Prenom>.<Nom>@e.ujf-grenoble.fr

Attention : ne pas oublier le prefixe e. dans le nom de domaine.

Vous pouvez aussi utiliser, si vous le souhaitez, l’adresse electronique qui vous a ete communiqueepar votre fournisseur d’acces, plutot que votre adresse a l’UJF.

Si vous utilisez cette possibilite du courrier electronique, le mail envoye (a vous-meme) devraetre lu sur l’un des PC sous Windows du DLST, au moyen du navigateur Internet Firefox. Pourconsulter votre boıte aux lettres a l’UJF, vous pouvez passer par l’un des URL suivants :– https://cas.grenet.fr/UJF/login

– http://portail.univ-grenoble.fr

– https://parana.ujf-grenoble.fr/index.html

Pour acceder a vos messages, il vous faudra saisir votre identifiant de connexion et votre mot depasse. Il s’agit des memes informations que celles utilisees pour vous connecter localement sur lespostes de travail dans les salles de TP.

Lors de la consultation d’un message, vous pouvez sauvegarder sur votre compte Windows lesfichiers qui sont attaches a ce message.

transfert compte Windows → compte Unix

Il faut utiliser l’outil WinSCP3, installe sur tous les PC du DLST. Il s’agit d’un outil graphique,tres facile a utiliser (a demarrer sous Windows bien entendu). Cet outil permet d’effectuer lestransferts (securises) depuis le compte Windows vers le compte Unix, et reciproquement.

9.3.2 Depuis le DLST vers votre domicile

Il y a deux methodes pour effectuer un tel transfert : (1) directement depuis le compte Unix, et(2) via le compte Windows.

transfert direct compte Unix → maison

Il faut utiliser l’outil mailx.

– Pour transferer un fichier texte unique, la commande a utiliser est :mailx -s "< sujet >" < adresse mail > < < nom du fichier texte>Exemple :mailx -s "exo tp7" [email protected] < exo1.c

Pour transferer plusieurs fichiers, il faut utiliser la commande mailx autant de fois que necessaire.

115

Page 117: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.3. TRANSFERTS ENTRE DOMICILE ET COMPTE CHAPITRE 9. ANNEXES

– Pour transferer un repertoire complet, il faut d’abord creer une archive (au moyen de la com-mande tar) et, si necessaire, la compresser (au moyen de la commande gzip).Exemple :tar cf TP7.tar TP7 # creation de l’archive : TP7 -> TP7.tar

gzip TP7.tar # compression du fichier : TP7.tar -> TP7.tar.gz

Le fichier obtenu (.tar ou .tar.gz) est un fichier binaire. Il faut donc l’encoder dans un formattexte avant de pouvoir l’envoyer via mailx. L’outil a utiliser est uuencode qui s’utilise ainsi :uuencode< nom du fichier a encoder > <nom du fichier a encoder > > <nom du fichier encode>Exemple :uuencode TP7.tar.gz TP7.tar.gz > TP7.tar.gz.uu

Le fichier encode obtenu peut ensuite etre envoye via mailx.Exemple :mailx -s "tp7" [email protected] < TP7.tar.gz.uu

Il restera dans ce cas a recevoir le fichier a la maison, puis a le decoder. Le fichier decode devraetre ensuite decompresse (s’il y a lieu) puis desarchive.Exemple :uudecode TP7.tar.gz.uu # decodage : TP7.tar.gz.uu -> TP7.tar.gz

gunzip TP7.tar.gz # decompression : TP7.tar.gz -> TP7.tar

tar xf TP7.tar # desarchivage : TP7.tar -> TP7

Remarque : l’utilisation des outils uudecode, gunzip et tar suppose que l’etudiant dispose d’unsysteme Unix a la maison (Linux, par exemple), et que ces outils soient installes sur ce systeme.Dans le cas contraire les operations de decodage et desarchivage devront etre effectuees sousWindows, avec l’outil approprie...

transfert compte Unix → maison via le compte Windows

Il s’agit dans ce cas de transferer les fichiers consideres en deux etapes : transfert du compte Unixvers le compte Windows, puis transfert du compte Windows vers la maison.

1. transfert compte Unix→ compte Windows : Il faut utiliser l’outil WinSCP3, deja mentionnepour les transferts compte Windows → compte Unix.

2. Pour tranferer des fichiers depuis le compte Windows au DLST vers l’ordinateur a la maison,il y a la encore deux possibilites : la cle USB, ou le mail.

Pour la cle USB, la procedure a suivre est evidente. Pour le mail, l’outil a utiliser est leservice webmail, deja mentionne pour les transferts maison → compte Windows.

116

Page 118: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.4. GENERATION ALEATOIRE DE NOMBRES ENTIERS CHAPITRE 9. ANNEXES

9.4 Generation aleatoire de nombres entiers

Certains exercices de ce polycopie sont bases sur l’utilisation de suites de nombres entiers tires auhasard. Un generateur aleatoire simplifie vous est fourni sous la forme de deux sous-programmes :la (pseudo) fonction hasard() et la procedure initialiser_germe(). Ces deux sous-programmessont rassembles au sein d’une petite bibliotheque : la bibliotheque libhasard.

9.4.1 Fonction hasard()

L’entete de ce sous-programme est : int hasard(int inf, int sup);

Si bi et bs sont deux entiers tels que bi ≤ bs, l’execution de hasard(bi, bs) produit un entiertire aleatoirement dans l’intervalle { bi . . . bs }.

Exemples :

– v = hasard(12, 57);

Apres l’execution de cette instruction, la variable v contient un entier aleatoire compris dansl’intervalle { 12 . . . 57 }.

– printf("%d", hasard(-10, 10);

L’execution de cette instruction a pour effet d’afficher un entier aleatoire compris dans l’intervalle{ -10 . . . +10 }.

9.4.2 Procedure initialiser_germe()

L’entete de ce sous-programme est : void initialiser_germe(unsigned int germe);

L’execution de initialiser_germe(g) initialise (ou re-initialise) le generateur aleatoire avec l’en-tier naturel g : la suite de nombres produite par l’invocation de la fonction hasard() (pour unintervalle de valeurs donne) est identique apres chaque execution de initialiser_germe appliqueea une meme valeur de germe.Par contre, apres deux executions de initialiser_germe() appliquees a deux valeurs de germedistinctes, les deux suites d’entiers produites par la fonction hasard() seront necessairement dis-tinctes.Lors des executions successives d’un meme programme n’appelant pas la procedureinitialiser_germe(), l’invocation de la fonction hasard() produira des suites d’entiers succes-sives distinctes deux a deux.

Exemples :

– Apres chaque execution de :initialiser_germe(1457);

l’invocation repetee 5 fois de :v = hasard(12, 57);

produira toujours la meme suite (par exemple) : 17, 29, 12, 53, 38.

– Apres l’execution de :initialiser_germe(365);

l’invocation repetee 5 fois de :v = hasard(12, 57);

produira la suite (par exemple) : 19, 13, 13, 56, 22.Apres l’execution de :initialiser_germe(0);

l’invocation repetee 5 fois de :v = hasard(12, 57);

produira la suite (par exemple) : 49, 57, 45, 15, 28.

117

Page 119: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.4. GENERATION ALEATOIRE DE NOMBRES ENTIERS CHAPITRE 9. ANNEXES

9.4.3 Utilisation de la bibliotheque libhasard

Les deux sous-programmes hasard() et initialiser_germe() sont declares dans le fichier hasard.h.En consequence, tout programme utilisant le generateur aleatoire, doit comporter en tete de fichierla directive :

#include "hasard.h"

L’acces “automatique” a la bibliotheque libhasard est obtenu en ajoutant l’argument -lhasarda la commande gcc. Par exemple pour compiler le programme monprog.c, il faudra taper lacommande :gcc -o monprog monprog.c -lhasard

Remarques :

– L’acces a la bibliotheque libhasard n’est“automatique”que si vous avez configure correctementvotre environnement, c’est a dire si vous avez en debut de semestre execute la commande :source /Public/INF111/config.sh.

– Si vous travaillez sur votre propre ordinateur a la maison, il vous faudra disposer dans votrerepertoire de travail des deux fichiers hasard.h et hasard.c.Vous pouvez recuperer une copie de ces deux fichiers sur le serveur gallien du DLST dans lerepertoire /Public/INF111/src/hasard.Vous devrez ensuite compiler (une seule fois suffit) le fichier hasard.c :gcc -c hasard.c

Pour compiler votre programme (monprog.c, par exemple), vous devrez utiliser la commande :gcc -o monprog monprog.c hasard.o

9.4.4 Exemples de programme

Les deux programmes qui suivent affichent 10 entiers aleatoires compris entre 50 et 100 :

1. Sans initialisation du generateur aleatoire

/**********************************************************************/

#include "hasard.h"

int main(void) {

int i;

for (i = 1 ; i <= 10 ; i = i + 1) {

printf("%i ", hasard(50, 100));

}

return 0;

}

/**********************************************************************/

L’execution de ce programme le 4 septembre a 11 heures 33 minutes et 14 secondes affiche leresultat :

93 60 57 97 99 71 94 75 73 53

Ce meme programme execute 7 secondes plus tard affiche :

89 67 67 86 86 90 91 59 59 95

118

Page 120: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.4. GENERATION ALEATOIRE DE NOMBRES ENTIERS CHAPITRE 9. ANNEXES

2. Avec initialisation du generateur aleatoire

/**********************************************************************/

#include "hasard.h"

int main(void) {

int i;

initialiser_germe(297);

for (i = 1 ; i <= 10 ; i = i + 1) {

printf("%i ", hasard(50, 100));

}

return 0;

}

/**********************************************************************/

Plusieurs executions de ce programme afficheront toutes le meme resultat :

70 83 68 52 94 78 84 79 85 55

9.4.5 Code source des sous-programmes hasard() et initialiser_germe()

/**********************************************************************/

#include "hasard.h"

#include <stdlib.h>

#include <time.h>

#define VRAI 1

#define FAUX 0

static int est_initialise = FAUX;

void initialiser_germe(unsigned int germe) {

srand(germe);

est_initialise = VRAI;

}

int hasard(int inf, int sup) {

if (! est_initialise) {

initialiser_germe(time(NULL));

}

return inf

+ (int)((double)(sup - inf + 1) * rand() / ((double)RAND_MAX + 1));

}

/**********************************************************************/

119

Page 121: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.5. LA BIBLIOTHEQUE GRAPHSIMPLE CHAPITRE 9. ANNEXES

9.5 La bibliotheque graphsimple

Dans plusieurs des TP proposes dans ce poly le programme realise doit afficher des figuresgeometriques dans une fenetre graphique.Cette fenetre est distincte de la fenetre de l’interprete de commandes (le“shell”) Unix. Elle est creeeau moyen de la bibliotheque graphsimple qui permet egalement d’effectuer des traces graphiquesdans cette fenetre.La bibliotheque graphsimple fournit un ensemble de sous-programmes (procedures et fonctions)prets a l’emploi dont la description est donnee en section 9.5.2 ci-apres.

9.5.1 La fenetre graphique

Coordonnees et repere

Chaque point (ou “pixel”) de la fenetre graphique est caracterise par ses coordonnees dans unrepere plan constitue de deux axes principaux, l’axe des abscisses (X) et l’axe des ordonnees (Y ).Ce repere graphique differe du repere habituel utilise en mathematiques :– L’origine (le point de coordonnees < 0, 0 >) est situe tout en haut et a gauche de la partie utile

de la fenetre graphique.– L’axe des abscisses est dirige vers la droite.– L’axe des ordonnees est dirige vers le bas.

Utilisation de la bibliotheque graphsimple

Chaque programme devant utiliser la bibliotheque graphsimpledoit inclure le fichier graphsimple.hau moyen de la directive suivante (a placer en tout debut de programme) :

#include "graphsimple.h"

La creation et l’ouverture de la fenetre graphique sont obtenues au moyen de l’instruction :

Initialiser(l, h) ;

Cette instruction a pour effet de creer une fenetre dont la largeur et la hauteur sont donneesrespectivement par les parametres l et h. Si par exemple l vaut 600 et h vaut 400, une fenetregraphique de dimensions utiles 600× 400 sera creee et apparaıtra sur l’ecran de l’utilisateur.

Une fois la fenetre graphique creee, il est possible d’y realiser des traces graphiques au moyendes divers sous-programmes fournis par la bibliotheque graphsimple. Toutefois, l’execution de cessous-programmes est en general trop rapide pour que l’utilisateur puisse avoir le temps d’observerle resultat affiche : le programme s’execute puis se termine ce qui provoque la fermeture et ladestruction automatiques de la fenetre graphique.Pour permettre a l’utilisateur d’observer le contenu de la fenetre graphique aussi longtemps qu’ille souhaite il faut utiliser l’instruction suivante :

AttendreClic();

Cette instruction a pour effet de bloquer l’execution du programme jusqu’a ce que l’utilisateureffectue un clic souris dans la fenetre graphique de ce programme.

120

Page 122: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.5. LA BIBLIOTHEQUE GRAPHSIMPLE CHAPITRE 9. ANNEXES

Il est possible de fermer la fenetre graphique avant la fin de l’execution du programme. Il faututiliser l’instruction :

Clore();

La bibliotheque graphsimple n’est pas une bibliotheque standard du langage C. Pour compiler unprogramme utilisant cette bibliotheque il faut donc utiliser une commande speciale, la commandegccgraph. Voici un exemple d’utilisation de cette commande :

durand@gallien:~/INF111/TP5$ gccgraph prog.c -o prog

9.5.2 Principaux sous-programmes de la bibliotheque graphsimple

Exemple d’utilisation de procedures de trace

Specification des sous-programmes

/* Constante definissant les couleurs */

#define Noir 0

#define Blanc 1

#define Rouge 2

#define Bleu 3

#define Vert 4

#define Jaune 5

void Initialiser(int, int);

/* Initialiser(l, h) cree et ouvre la fenetre graphique */

void Clore();

/* Core() ferme et detruit la fenetre graphique */

void Effacer();

/* Effacer() efface tous les traces precedemment effectues */

void Point(int, int);

/* Point(x, y) affiche un point aux coordonnees < x, y > */

void SuppPoint(int, int);

/* SuppPoint(x, y) efface le point de coordonnees < x, y > */

121

Page 123: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.5. LA BIBLIOTHEQUE GRAPHSIMPLE CHAPITRE 9. ANNEXES

void Ligne(int, int, int, int);

/* Ligne(x1, y1, x2, y2) trace un segment de droite ayant pour

extremites les points < x1, y1 > et < x2, y2 > */

void SuppLigne(int, int, int, int);

/* SuppLigne(x1, y1, x2, y2) efface le segment ayant pour extremites

les points < x1, y1 > et < x2, y2 > */

void Cercle(int, int, int);

/* Cercle(x, y, r) trace un cercle de centre < x, y > et de rayon r */

void SuppCercle(int, int, int);

/* SuppCercle(x, y, r) efface le cercle de centre < x, y >

et de rayon r */

void CerclePlein(int, int, int);

/* CerclePlein(x, y, r) trace un disque de centre < x, y >

et de rayon r */

void Rectangle(int, int, int, int);

/* Rectangle(x1, y1, x2, y2) trace un rectangle parallele aux axes

principaux et dont l’une des diagonales a pour extremites les points

< x1, y1 > et < x2, y2 > */

void SuppRectangle(int, int, int, int);

/* SuppRectangle(x1, y1, x2, y2) efface le rectangle dont l’une des

diagonales a pour extremites les points < x1, y1 > et < x2, y2 > */

void RectanglePlein(int, int, int, int);

/* RectanglePlein(x1, y1, x2, y2) trace un rectangle plein dont l’une

des diagonales a pour extremites les points < x1, y1 > et

< x2, y2 > */

void Ellipse(int, int, int, int);

/* Ellipse(x, y, rx, ry) trace une ellipse de centre < x, y > et de

rayons rx et ry */

void SuppEllipse(int, int, int, int);

/* SuppEllipse(x, y, rx, ry) efface l’ellipse de centre < x, y > et de

rayons rx et ry */

void EllipsePleine(int, int, int, int);

/* EllipsePleine(x, y, rx, ry) trace un disque elliptique de centre

< x, y > et de rayons rx et ry */

void Triangle(int, int, int, int, int, int);

/* Triangle(x1, y1, x2, y2, x3, y3) trace un triangle dont les sommets

sont les points < x1, y1 >, < x2, y2 > et < x3, y3 > */

void SuppTriangle(int, int, int, int, int, int);

/* SuppTriangle(x1, y1, x2, y2, x3, y3) efface le triangle dont les

sommets sont les points < x1, y1 >, < x2, y2 > et < x3, y3 > */

122

Page 124: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.5. LA BIBLIOTHEQUE GRAPHSIMPLE CHAPITRE 9. ANNEXES

void TrianglePlein(int, int, int, int, int, int);

/* TrianglePlein(x1, y1, x2, y2, x3, y3) trace un triangle plein dont

les sommets sont les points < x1, y1 >, < x2, y2 > et < x3, y3 > */

void DebutDessin();

/* DebutDessin() debute une sequence de traces. Le dessin effectue sera

affiche lors de l’appel de FinDessin() */

void FinDessin();

/* FinDessin() termine une sequence de traces. Les traces effectues

depuis l’appel de DebutDessin() sont affiches */

void AttendreDelai(long);

/* AttendreDelai(tps) suspend l’execution du programme pendant la duree

tps (donnee en millisecondes) */

void AttendreTaper(char *);

/* AttendreTaper(&c) suspend l’execution du programme jusqu’a l’appui

sur une touche du clavier et depose le caractere correspondant dans

la variable c */

char Touche();

/* Touche() vaut le caractere correspondant si une touche du clavier

vient d’etre appuyee, le caractere ’\0’ sinon */

int TestClavier();

/* TestClavier() vaut 1 (VRAI) si une touche du clavier a ete appuyee,

0 (FAUX) sinon */

void AttendreClic();

/* AttendreClic() suspend l’execution du programme jusqu’a l’appui sur

l’un des boutons de la souris */

void AttendreLacher();

/* AttendreLacher() suspend l’execution du programme jusqu’au

relachement de l’un des boutons de la souris */

void AttendreClicXY(int *, int *, int *);

/* AttendreClicXY(&x, &y, &b) suspend l’execution du programme jusqu’a

ce que l’utilisateur appuie sur l’un des bouton de la souris ; les

coordonnees du pointeur et le numero du bouton appuye (1, 2 ou 3)

sont ensuite deposes respectivement dans les variables x, y et b.

La mise a jour de chacune des variables n’est effectuee que si sa

valeur initiale est differente de NULL */

void AttendreLacherXY(int *, int *, int *);

/* AttendreLacherXY(&x, &y, &b) suspend l’execution du programme jusqu’a

ce que l’utilisateur relache l’un des bouton de la souris ; les

coordonnees du pointeur et le numero du bouton relache sont ensuite

deposes respectivement dans les variables x, y et b.

La mise a jour de chacune des variables n’est effectuee que si sa

valeur initiale est differente de NULL */

123

Page 125: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.5. LA BIBLIOTHEQUE GRAPHSIMPLE CHAPITRE 9. ANNEXES

void AttendreDeplacementXY(int *, int *);

/* AttendreDeplacementXY(&x, &y) suspend l’execution du programme

jusqu’a ce que la souris soit deplacee ; les coordonnees du pointeur

sont ensuite deposees dans les variables x et y.

La mise a jour de chacune des variables n’est effectuee que si sa

valeur initiale est differente de NULL */

int BoutonAppuye();

/* BoutonAppuye() vaut le numero du bouton appuye si un bouton de la

souris a ete appuye, 0 sinon */

int BoutonRelache();

/* BoutonRelache() vaut le numero du bouton relache si un bouton de la

souris a ete relache, 0 sinon */

int BoutonGlisse();

/* BoutonGlisse() vaut le numero du bouton appuye si la souris vient

d’etre deplacee alors que l’un des boutons etait appuye, 0 sinon */

void TextInverse();

/* TextInverse() : apres execution de cette procedure, les traces seront

effectues en video inverse (couleur de fond = Noir, couleur de trace

= Blanc) */

void TextNormal();

/* TextNormal() : apres execution de cette procedure, les traces seront

effectues en video normale (couleur de fond = Blanc, couleur de trace

= Noir) */

void GraphInverse();

/* GraphInverse() : apres execution de cette procedure, les traces

seront effectues en video inverse (couleur de fond = Noir, couleur de

trace = Blanc) et le fond de la fenetre prend la couleur Noir */

void GraphNormal();

/* GraphNormal() : apres execution de cette procedure, les traces seront

effectues en video normale (couleur de fond = Blanc, couleur de trace

= Noir) et le fond de la fenetre prend la couleur Blanc */

void Ecrire(int, int, char []);

/* Ecrire(x, y, t) affiche la chaine de caracteres t a partir du point

de coordonnees < x, y > */

void EcrireDessus(int, int, char []);

/* EcrireDessus(x, y, t) affiche la chaine de caracteres t a partir du

point de coordonnees < x, y >, en effacant ce qu’il y a dessous */

void ChangerCouleur(int);

/* ChangerCouleur(c) : apres execution de cette procedure, la couleur

utilisee pour les traces sera la couleur c (voir definition des

constantes correspondantes ci-dessus */

124

Page 126: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.6. FONCTIONS DE LA LIBC CHAPITRE 9. ANNEXES

9.6 Les fonctions de la bibliotheque du langage C

On presente ici quelques fonctions de la bibliotheque definie par la norme ANSI. Les fonctions, lestypes et les macros de la bibliotheque standard sont declares dans les fichiers d’en-tete : ctype.h,math.h, stdlib.h, stdio.h, string.h, time.h, . . .Le detail des fonctions et procedures graphiques sera prsente dans l’annexe suivante.

9.6.1 Les entrees-sorties : < stdio.h >

Le prototype de la fonction printf est :int printf ( chaıne de caracteres, liste d’expressions ) ;

Le premier argument est une chaıne de caracteres dite chaıne de formatage, les autres argumentssont des expressions. Cette chaıne de formatage contient des caracteres qui seront reproduitsfidelement sur la sortie standard (par defaut, l’ecran) et des specifications de conversion. Unespecification de conversion est un mot commencant par le caractere % et sera remplacee par unevaleur.Chaque specification de conversion correspond a un argument de printf : la premiere specificationau deuxieme argument, la deuxieme specification au troisieme et . . . ainsi de suite.Chaque specification precise le format selon lequel on veut imprimer la valeur de l’expression asso-ciee. Les specifications sont, entre autres : %c (caractere), %i ou %d (entier sous forme decimale),%f (nombre avec virgule), %s (chaıne de caracteres), %p (pour un pointeur).

A aucun moment, ni dans la phase de compilation, ni dans la phase d’execution, il n’est procede aune verification de la coherence entre specification de conversion et type de l’expression associee.La fonction printf retourne le nombre de caracteres ecrits.

Le prototype de la fonction scanf est :scanf ( chaıne de caracteres, liste d’arguments ) ;

Le premier argument est une chaıne de caracteres dite chaıne de formatage, les autres argumentssont des pointeurs (adresses de variables). Cette chaıne de formatage contient, comme ci-dessus,des specifications de conversions.Chaque specifications de conversions correspond a un argument de scanf : la premiere specificationau deuxieme argument, la deuxieme specification au troisieme et . . . ainsi de suite.La procedure scanf lit tous les caracteres sur l’entree standard ((stdin) par defaut, le clavier).Elle les interprete selon les specifications incluses dans la chaıne de formatage et stocke les resultatsa l’adresse associee.Les specifications de conversion sont, entre autres : %c (caractere), %i ou %d (entier sous formedecimale), %lf (nombre avec virgule de type double), %s (chaıne de caracteres), %p (pour un poin-teur). La specification %s est une specification de conversion indiquant que scanf doit recueillirdans le flux d’entree une chaıne de caracteres. Cette fonction considere qu’une chaıne de carac-teres est terminee des qu’elle rencontre un espace, une tabulation, le caractere newline (le 10iemecaractere de la table ASCII ou ’\n’).La fonction scanf retourne le nombre de variables lues.

int sprintf (char *s, chaıne de caracteres, listes d’expression )

identique a printf, le resultat (termine par \0) est ecrit dans la chaıne s.int getchar (void)

retourne le caractere suivant de l’entree standard, ou EOF en fin de fichier.int put (int c)

ecrit le caractere c sur la sortie standard.char *gets (char *s)

125

Page 127: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.6. FONCTIONS DE LA LIBC CHAPITRE 9. ANNEXES

lit la ligne suivante et la place dans s.

Exercice :Comment vider le buffer associe a stdin ?

9.6.2 Les fonctions de categorie de caracteres : < ctype.h >

Toutes ces fonctions ont le meme prototype, i.e. int nom-de-fonction (int c) ;

Elles retournent une valeur non nulle si l’argument c remplit la condition et zero sinon.

int isdigit (int c)

vraie si et seulement si (sss) c est un digit (0-9)int isalpha (int c)

vraie sss c est une lettre de l’alphabet minuscule ou majusculeint isalnum (int c)

vraie sss c est une lettre ou un digit.int isprint (int c)

vraie sss c est un caractere imprimableint islower (int c)

vraie sss c est une lettre minusculeint isupper (int c)

vraie sss c est une lettre majusculeint isspace (int c)

vraie sss c est ’ ’, sautdepage, \n, retouchariot, tabulatv, tabulath

9.6.3 Les fonctions mathematiques : < math.h >

Toutes ces fonctions ont le meme prototype, i.e. double nom-de-fonction (double x) ;

double sin (double x)

double cos (double x)

double tan (double x)

double exp (double x)

double log (double x)

double sqrt (double x)

racine carree de xdouble ceil (double x)

plus petit entier superieur a xdouble floor (double x)

plus grand entier inferieur a xdouble pow (double x, double y)

x puissance y

La commande de compilation pour un fichier fich.c utilisant des fonctions mathematiques devient :gcc –Wall –ansi –lm fich.c –o fich

L’adjonction de –lm a pour objet de “ lier ” notre programme avec la bibliotheque mathema-tique ou sont precompilees les fonctions de la bibliotheque “math.h”. La commande gcc effectuedeux operations, la compilation du programme et l’edition de liens avec des fonctions precompileesarchivees dans des bibliotheques. L’inclusion du fichier “math.h” est necessaire pour la compilationmais est evidemment insuffisante pour obtenir un programme executable. Ces codes compiles des

126

Page 128: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.6. FONCTIONS DE LA LIBC CHAPITRE 9. ANNEXES

fonctions “math.h” sont contenues dans la bibliotheque mathematique “libm.a”et doivent etre lieesa notre programme pour qu’il puisse etre executable.Par defaut, la commande gcc compile le programme et effectue l’edition de liens avec la bibliothequestandard libc.a (usr/lib/libc.a)

9.6.4 Les fonctions utilitaires : < stdlib.h >

int rand (void)

retourne un entier uniformement tire dans [ 0 et RAND MAX ]void srand (int germe)

initialisation du generateur aleatoire rand.double atof (const char *s)

convertit s en un double.int atoi (const char *s)

convertit s en un int.int system (const char *s)

passe la chaıne s a l’environnement qui l’execute.

9.6.5 Les fonctions de traitement des chaınes : < string.h >

char *strcpy (sres, sinit)

copie la chaıne sinit dans sres.char *strcat (sres, sinit)

concatene la chaıne sinit a la chaıne sres.int strcmp (s1, s2)

compare s1 avec s2.int strlen (s)

retourne la longueur de la chaıne s.char *strchr (const char *s, int c)

retourne la premiere occurrence de c dans s ou NULL si aucune.

9.6.6 Les fonctions de traitement de la date et de l’heure : < time.h >

time (time_t *tp)

retourne le nombre de secondes qui se sont ecoulees depuis le 01/01/1970.

127

Page 129: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.7. LE PREPROCESSEUR CHAPITRE 9. ANNEXES

9.7 Le preprocesseur

La toute premiere phase du compilateur est confiee au pre-processeur. Il est plus precis de direque le travail du compilateur commence veritablement apres cette phase du pre-processeur. Lesinstructions du pre-processeur s’appellent des directives, commencent par le caractere # et seterminent a la fin d’une ligne.

Le role du pre-processeur :- definir des macros, une definition de macro peut etre placee n’importe ou dans le programme,a condition de figurer avant son utilisation. La directive de definition de macro est # define.- remplacer tout nom de macro par le corps de la macro correspondante, cette operations’appelle une substitution de macro.- inclure des fichiers sources, comme des fichiers d’en-tete. La directive d’inclusion de fichierest #include.- de realiser des compilations conditionnelles de certaines parties du programme. Les direc-tives sont #if, #ifdef, #ifndef, #elif.- et aussi de supprimer les backslashs terminaux d’une ligne.- et aussi de supprimer les commentaires, preparant ainsi le travail du compilateur.

Toutes les directives du pre-processeur commencent par le signe # et se termine par un passagea la ligne. Les directives les plus courantes sont : #define, #include, #undef, #if, #elif,

#else, #ifdef, #endif.

Le directive #define demande au pre-processeur de remplacer chaque occurrence d’une chaınepar une autre chaıne. Voici des exemples :

#define PI 3.14159

#define PAYS France

#define SOMME (12+8)

Chaque occurrence de PI sera remplacee par 3.14159 dans toute la suite du fichier. . . .

Certains auteurs utilisent cette directive pour remedier au fait que le langage C ne connaıt pas letype booleen :

#define bool int

#define VRAI (0 == 0)

#define FAUX ! VRAI

La directive #undef annule la definition de la macro pour toute la suite du fichier.Ex :#undef PAYS

a partir de cette directive PAYS n’est plus consideree comme une macro.

Il est assez frequent de vouloir, dans une phase de mise au point d’un programme, supprimer(cacher) une partie du code. L’idee de mettre cette partie en commentaire n’est souvent pas util-isable, puisque le langage C n’accepte pas les commentaires emboıtes. Nous donnons des exemplessans les expliquer de suppression de code :#if 0

... ici le code ne sera pas compile ...

#endif

#if NEXISTEPAS

... si NEXITEPAS est une macro non definie alors le code ici n’est pas compile ...

128

Page 130: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.7. LE PREPROCESSEUR CHAPITRE 9. ANNEXES

#endif

L’expression associee au #if est evaluee. Si celle-ci vaut 1 le code qui suit le #if jusqu’au prochain#endif, #elif ou #else est evalue. Il n’est pas evalue si l’expression vaut 0. Un identificateurde macro est remplace par 1 si la macro est definie et 0 sinon.

Un nom de macro peut etre suivi d’un ou plusieurs arguments, ce qui permet de l’utiliser commeune fonction, dans ce cas, il ne faut pas de blanc entre le nom de la macro et la parenthese ou-vrante. Voici quelques exemples classiques :#define MULTIPLIER(val1, val2) ((val1)*(val2))

#define ABS(val) ((val) < 0 ? -(val) : (val))

#define MAX(x1, x2) ((x1) < (x2) ? (x2) : (x1))

Cette derniere macro n’impose pas de type a ses parametres, ce qui ne serait pas le cas d’unefonction equivalente.

129

Page 131: INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C …membres-timc.imag.fr/Nicolas.Duforet-Frebourg/INF111/INF111poly.pdf · INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE

9.8. BIBLIOGRAPHIE CHAPITRE 9. ANNEXES

9.8 Bibliographie

Liens et references generales

– http ://dmoz.org/World/Francais/Informatique/Programmation/Langages/C/ (Liens vers descours et exercices corriges de langage C.)

– Hansel, G. et Champarnaud, J-M. Passeport pour Unix et C. International Thomson PublishingFrance 1995.

– Drix, P. Langage C norme ANSI, vers une approche orientee objet. Masson 1993.

– Cassagne, B. Introduction au Langage C. Accessible a l’adresse web :http ://www-clips.imag.fr/commun/bernard.cassagne/Introduction ANSI C.html

– Kernighan B.W. et Ritchie D.M. Le langage C, Norme ANSI. Dunod 2ime edition 2000 (Livreecrit par les deux concepteurs du langage C.)

– Braquelaire J-P. Methodologie de la programmation en langage C, principes et applications. Mas-son 2ime edition 1995.

– Trau, P. Cours de langage C. http ://www-ipst.u-strasbg.fr/pat/program/tpc.htm (Un coursclair comprenant les notions abordees en cours et quelques autres.)

– http ://www.isty-info.uvsq.fr/˜rumeau/fclc/ (Une FAQ serieuse et complete sur le langage C)

References dans d’autres langues

Le livre de Kernighan et Ritchie a ete traduit dans un tres grand nombre de langues. Les referencesde ces traductions sont disponibles sur le site http ://cm.bell-labs.com/cm/cs/cbook/. Pour seprocurer un de ces ouvrages, il est possible de le commander sur un site de vente par correspondancecomme http ://www.amazon.com .

130