INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C. UE INF111 : Cahier de TP

Dimension: px
Commencer à balayer dès la page:

Download "INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C. UE INF111 : Cahier de TP"

Transcription

1 INTRODUCTION A UNIX ET A LA PROGRAMMATION EN LANGAGE C UE INF111 : Cahier de TP Département de la Licence Sciences et Technologie Université Joseph Fourier - Grenoble Année 2009/2010

2 Table des matières I INTRODUCTION A UNIX 3 1 Premier contact Connexion à Windows Configuration de XWin Démarrer une session XWin Connexion au système Unix Fin de la session de travail Terminal X Prise en main détaillée Introduction Session de travail La souris et les fenêtres Le système d exploitation L éditeur de texte nedit Le système de fichiers de Unix Compilation, Exécution Révision Fin d une session de travail Exercices Exercice : application du cours L essentiel à savoir Editer un texte à partir d Unix : NEdit Transférer des fichiers entre votre compte et le compte de votre binôme Transférer des fichiers entre votre domicile et votre compte Unix au DLST Fichiers et répertoires II PROGRAMMATION EN C 33 5 Sujets de TP Premiers programmes Adibou Le jeu du prix du lot Tri par sélection Le voyageur de commerce Le jeu du taquin Manipulation de fichiers Tri avec sous-programmes L éditeur graphique

3 TABLE DES MATIÈRES TABLE DES MATIÈRES 6 Projets Jeu d échecs Nuages de particules Collisions de particules Jeu de dames Tout noir tout blanc Clobber Résumé de cours et exercices TYPES, VARIABLES, Entrees, sorties IF FOR, While Tab. 1D Tab. 2D Pointeurs Annales Examen Examen Examen Annexes Programmer chez soi Transfert de fichiers de compte à compte Transferts entre domicile et compte Génération aléatoire de nombres entiers La bibliothèque graphsimple Fonctions de la libc Le préprocesseur Bibliographie

4 Première partie INTRODUCTION A UNIX 3

5 Chapitre 1 Premier contact 1.1 Connexion à Windows Pendant tout le semestre vous travaillerez dans un environnement Unix, mais à partir de postes de travail de type PC fonctionnant sous Windows. Pour accéder à l environnement Unix vous utiliserez un émulateur X Window. Le nom de l émulateur X Window utilisé au DLST est XWin32. Vous devez donc tout d abord ouvrir une session Windows en saisissant une première fois votre identifiant d utilisateur et votre mot de passe. Ces deux informations sont inscrites sur votre feuille d inscription. Vous devrez ensuite démarrer le programme XWin32, puis vous connecter au serveur Unix en saisissant une seconde fois votre identifiant et votre mot de passe. En fin de session vous devrez vous déconnecter du système Unix puis fermer votre session Windows. Pour ouvrir une session Windows, effectuez les actions suivantes : 1. Remplissez les trois champs de la fenêtre d identification : Utilisateur : durand Mot de passe : ******** Domaine : E ATTENTION : pour passer d un champ à l autre utiliser la touche la touche ( Tabulation ) située à gauche du clavier, ou bien cliquer avec la souris dans le champ à remplir. 2. Cliquez sur le bouton graphique OK, ou bien tapez sur la touche Entrée. Une fois la session Windows ouverte : si vous n avez jamais configuré XWin32, suivez les instructions données en section 1.2 sinon, démarrer le programme XWin32 (cf. section 1.3). 1.2 Configuration de XWin32 La configuration du programme XWin32 (l émulateur X Window) doit être effectuée une fois et une seule pour chaque étudiant : dans le menu Démarrer choisir Tous les programmes, puis X-Win32, puis X-Config : la fenêtre de configuration de XWin32 s ouvre. cliquer sur le bouton Ajouter cliquer sur + Mes sessions en haut de la partie gauche de la fenêtre du programme XConfig, puis sur Autostart. cliquer sur le bouton Manuel : une fenêtre de choix s ouvre. Son nom est Méthode de connexion. 4

6 1.3. DÉMARRER UNE SESSION XWIN32 CHAPITRE 1. PREMIER CONTACT dans la fenêtre Méthode de connexion, choisir XDMCP puis cliquer sur le bouton Suivant. La fenêtre de choix se referme, une fenêtre de dialogue s ouvre. dans le champ Nom de la session, taper : gallien dans le champ Hôte, taper : gallien dans le champ Mode XDMCP, remplacer l option Diffuser par l option Interroger cliquer sur le bouton Enregistrer : la fenêtre de dialogue se referme. cliquer sur le bouton Lancer : la fenêtre de connexion au système Unix s affiche. cliquer sur le bouton OK pour terminer le programme XConfig. Pour vous connecter à Unix, suivez à présent les instructions données en section Démarrer une session XWin32 Vérifiez si le programme XWin32 n est pas déjà actif : la présence d un icone X dans la barre des tâches de Windows, en bas et à droite de l écran, indique que le programme est déjà actif et que vous pouvez démarrer une nouvelle session Unix. Dans le cas contraire, le programme XWin32 est inactif et doit être démarré au préalable Démarrage du programme XWin32 Hypothèse : le programme XWin32 est inactif (aucun icone X dans la barre des tâches). Dans le menu Démarrer choisir Tous les programmes, puis X-Win32, puis X-Win32 : la fenêtre de connexion au système Unix s affiche. Vous pouvez à présent vous connecter au serveur Unix : suivez les instructions données en section Démarrage d une nouvelle session Unix Hypothèse : le programme XWin32 est démarré mais aucune session Unix n est en cours. Cliquer avec le bouton droit de la souris sur l icone X situé dans la barre des tâches de Windows, en bas et à droite de l écran. Sans relâcher le bouton de la souris, choisir ensuite Autostart puis gallien : la fenêtre de connexion au système Unix s affiche. 1.4 Connexion au système Unix Pour établir une connexion Unix au serveur gallien remplir les champs login et Password dans la fenêtre de connexion : Debian GNU/Linux (gallien) Login : durand Password : Debian 5

7 1.5. FIN DE LA SESSION DE TRAVAIL CHAPITRE 1. PREMIER CONTACT Dans le champ Login : taper votre identifiant d utilisateur puis la touche Entrée (ou la touche Entr ). Dans le champ Password : taper votre mot de passe puis la touche Entrée. Attention : il est normal qu aucun caractère (pas même des * ) ne s affiche dans le champ Password lorsque vous saisissez votre mot de passe. REMARQUE : Vous ne devez utiliser ni les touches du pavé numérique, à droite du clavier, ni la touche Verrouillage Majuscule (ou Verr Maj, ou représentant un petit cadenas), à gauche du clavier : Pour taper une LETTRE MAJUSCULE, appuyez sur la touche Majuscule (ou Shift, ou ) située a gauche du clavier, puis, tout en maintenant cette touche appuyée, taper sur la touche correspondant à la lettre que vous voulez obtenir. Pour taper un CHIFFRE, appuyez sur la touche Majuscule, puis, tout en maintenant cette touche appuyée, taper sur la touche correspondant au chiffre que vous voulez obtenir, dans la rangée de touches située en haut du clavier. Lorsque la connexion au système Unix est établie, une fenêtre représentant une console de commande s affiche sur l écran. 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 fermée, mais le programme XWin32 est toujours actif; une nouvelle session Unix peut être démarrée en cliquant sur l icone X dans la barre des tâches de Windows, à droite (voir paragraphe page 5). Pour quitter Windows, cliquer sur le menu Démarrer, puis choisir Arrêter. 1.6 Terminal X Certaines salles du DLST sont équipées de terminaux X en lieu et place de PC. Un terminal X est une machine très dépouillée, pourvue d un écran, d une souris et d un clavier. Ce type de machine permet de se connecter aux serveurs du DLST (gallien, par exemple), de la façon suivante : Mettre le terminal sous tension (bouton marche/arrêt). Le terminal charge depuis le réseau le programme qui lui permettra de communiquer avec les serveurs. Après mise sous tension, une fenêtre d accueil identique à celle indiquée en section 1.4 cidessus s affiche au centre de l écran. Cette fenêtre comporte les champs Login et Password permettant de s identifier. La connexion s effectue selon la procédure décrite dans la section 1.4. Lorsque la connexion au système Unix est établie, une fenêtre représentant une console de commande s affiche sur l écran. Pour terminer la session de travail et se déconnecter du serveur Unix, taper la commande exit dans la console de commande. 6

8 Chapitre 2 Prise en main détaillée 2.1 Introduction Votre premier TP : le TP1 La première séance de TP a pour but de vous familiariser avec l environnement de travail informatique au DLST. Cette partie du polycopié est à la fois un guide pour cette séance et un document à consulter lorsque par la suite vous ne saurez plus comment réaliser telle ou telle opération. Il vous est demandé de lire la brochure et de réaliser les manipulations indiquées. Celles ci apparaissent dans des encadrés. Elles sont décrites avec précision, ce qui permet de les réaliser sans grande difficulté. Ces manipulations sont celles dont vous aurez le plus souvent besoin tout au long des séances de travaux pratiques; il est donc important d en comprendre l utilité et de savoir les réaliser. La durées de la séance est largement suffisante pour réaliser et comprendre les manipulations demandées. Si vous n arrivez pas à réaliser l une d elles, ou bien si vous ne comprenez pas les explications données, ne passez pas outre, demandez de l aide à votre enseignant. A la fin de cette séance vous devriez savoir effectuer seul les opérations suivantes : vous connecter à votre poste de travail et au serveur Unix, manipuler des objets dans votre arborescence de fichiers, créer et modifier un fichier texte, compiler et exécuter des programmes, terminer une session de travail Notations Dans le langage de tous les jours, la phrase : Ecrivez votre nom indique bien entendu qu il faut écrire le texte Pierre Durand (par exemple), et non pas le texte votre nom. Dans ce polycopié, ce type d ambigüité sera éliminé à l aide des notations suivantes : 1. Ce qui est écrit avec une police de caractères à largeur constante, comme ceci, appartient au langage utilisé et doit être interprété tel quel. 2. ce qui est écrit entre < et >, <comme cela>, appartient à un méta-langage et doit être remplacé par un élément de votre choix dépendant du contexte. Exemple : La consigne : taper rm <nom-de-fichier >, indique que le mot rm doit être tapé tel quel, alors que <nom-de-fichier > doit être remplacé par un nom de votre choix. Les touches du clavier seront en général désignées par le nom ou le symbole inscrit sur chacune d elles (par exemple la touche Fin, ou bien la touche ). Toutefois, l appui sur la touche Entrée étant extrêmement fréquent, il sera dénoté (représenté) le plus souvent par le symbole. 7

9 2.2. SESSION DE TRAVAIL CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE 2.2 Début d une session de travail Après vous être connecté sous Windows et avoir lancé l émulateur XWin32, ou bien après avoir mis en marche votre terminal X, vous devez voir apparaître sur votre écran la fenêtre suivante : Debian GNU/Linux (gallien) Login : Password : Debian La barre verticale juste après le mot Login : indique que vous devez saisir votre identifiant de connexion : Tapez votre identifiant de connexion, suivi de, puis tapez votre mot de passe, toujours suivi de. ATTENTION 1. Une lettre minuscule n est pas équivalente à la lettre majuscule correspondante. 2. Le caractère - ( moins ) est différent du caractère _ ( souligné ) 3. Vous ne devez utiliser ni les touches du pavé numérique, à droite du clavier, ni la touche Verrouillage Majuscule (ou Caps Lock, ou représentant un petit cadenas), à gauche du clavier : Pour taper une LETTRE MAJUSCULE, appuyez sur la touche Majuscule (ou ) située à gauche du clavier, puis, tout en maintenant cette touche appuyée, taper sur la touche correspondant à la lettre que vous voulez obtenir. Pour taper un CHIFFRE, appuyez sur la touche Majuscule, puis, tout en maintenant cette touche appuyée, taper sur la touche correspondant au chiffre que vous voulez obtenir, dans la rangée de touches située en haut du clavier. 4. Il est normal qu aucun caractère (pas même des * ) ne soit affiché dans le champ Password lorsque vous saisissez votre mot de passe... Une fenêtre s est affichée sur l écran. Votre session de travail est commencée. 2.3 La souris et les fenêtres Vous disposez d un poste de travail (PC ou terminal X) muni d un écran, d un clavier et d une souris. L écran, le clavier et la souris sont des périphériques du poste de travail : ils vous permettent d échanger des informations (c est à dire de communiquer) avec votre poste de travail, et au delà avec les serveurs Unix du DLST. 8

10 2.4. LE SYSTÈME D EXPLOITATION CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE La souris Faites glisser la souris sur votre table. Vous remarquez sur l écran un symbole en forme de flèche qui effectue les mêmes déplacements que votre souris sur la table. On appelle ce symbole le pointeur (ou curseur) de la souris. La souris permet de déplacer le pointeur sur l écran, de cliquer (c est à dire appuyer puis relâcher l un des boutons de la souris) pour désigner une zone précise sur l écran. 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 désigner ( sélectionner ) un objet graphique sur l écran (l objet se trouvant sous le pointeur), et lui appliquer une action, par exemple dérouler un menu. Les deux autres boutons permettent d effectuer des actions complémentaires dont la nature dépend du logiciel utilisé et du contexte dans lequel ces boutons seront manoeuvrés. Remarques : 1. Pour simplifier, dans la suite du document, quand il est demandé de cliquer sans autre précision, il s agit de cliquer avec le bouton gauche de la souris. Dans le cas contraire, le bouton à cliquer sera précisé. 2. Veillez à bien laisser désactivée la touche Verrouillage Majuscule (ou Verr Maj, ou représentant un petit cadenas), à gauche du clavier, pour un bonne exécution des actions effectuées au moyen de la souris (le voyant Verr Maj, ou Caps Lock, en haut et à droite du clavier doit être éteint) Les fenêtres Une fenêtre est une zone rectangulaire de l écran permettant à l utilisateur de communiquer avec son poste de travail, ou comme au DLST avec un serveur distant. Cette zone de communication va vous permettre d une part d envoyer des commandes à l ordinateur auquel vous êtes connecté (gallien), et d autre part de recevoir et visualiser les résultats produit par chaque commande. La fenêtre qui s ouvre en début de session est appelée fenêtre xterm. Pour travailler confortablement, il faut pouvoir déplacer une fenêtre, changer ses dimensions, ou encore la réduire à l état d icône (on dit iconifier ) : Cliquez dans la barre supérieure de la fenêtre et, tout en maintenant appuyé le bouton gauche, déplacez la souris. La fenêtre doit se déplacer en suivant les mouvements de la souris. La partie droite de la barre de fenêtre contient deux (ou trois) boutons graphiques. Cliquez sur celui le plus à gauche pour réduire la fenêtre. Cette dernière est à présent remplacée par une icône qui apparaît soit dans la barre des tâches de Windows (cas du PC + XWin32), soit sur l un des côtés de l écran (cas des terminaux X). Pour rendre à nouveau visible la fenêtre et lui rendre sa taille normale, cliquez une fois sur l icône. Cliquez sur un côté de la fenêtre (le pointeur de la souris doit prendre la forme d un trait) puis déplacez légèrement la souris tout en maintenant le bouton gauche appuyé. La largeur ou la hauteur de la fenêtre doit s agrandir ou se rapetisser, selon le côté choisi et selon le mouvement de la souris. 2.4 Le système d exploitation Le logiciel chargé de gérer la machine à laquelle vous vous connectez (gallien) lorsque vous débutez une séance de travail est le système Unix. Ce logiciel appelé système d exploitation a pour rôle de vous donner accès aux ressources de la machine (mémoire, processeur, disques) en vous fournissant un certain nombre de services. Ces services sont demandés par l utilisateur sous la 9

11 2.4. LE SYSTÈME D EXPLOITATION CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE forme de commandes qui seront décodées (interprétées) et activées (exécutées) par un interpréteur de commandes. L interpréteur de commandes est une partie du système d exploitation Notion de commande Certaines commandes, particulièrement simples, ne nécessitent pour être activées, que la frappe de leur nom sur le clavier. Unix comporte une commande permettant d afficher la date et l heure. Cette commande porte le nom de date. Activez-la en tapant sur votre clavier : date La réponse (en principe en français) s interprète sans peine Notion d interpréteur de commandes L interpréteur de commandes est un programme qui réalise les opérations suivantes : 1. écriture sur l écran d une invite, c est à dire d une invitation à taper une commande : il s agit d une courte chaîne de caractères, parfois réduite à un seul caractère, le caractère $ ou % par exemple. 2. attente d une ligne tapée au clavier par l utilisateur et terminée par. 3. interprétation du premier mot de la ligne comme étant le nom d une commande. Les mots suivants, s il y en a, sont interprétés comme étant des arguments (ou paramètres) de la commande, c est à dire des informations complémentaires requises pour l exécution de cette dernière. 4. exécution de la commande tapée. 5. retour à l étape numéro 1. Que se passe-t-il si l utilisateur tape un nom de commande incorrect? Tapez par exemple : xyz32 Mémorisez bien le message d erreur : c est celui que vous donnera l interpréteur de commandes à chaque fois que vous taperez quelque chose qui ne correspond à aucune commande connue (ou valide). Certaines commandes sont un peu plus complexes : il faut taper leur nom, mais aussi fournir des paramètres (ou arguments). Unix comporte une commande, nommée cal, permettant d afficher le calendrier d un mois quelconque d une année comprise entre 0 et Pour qu elle puisse être exécutée, il faut évidemment fournir à cette commande deux paramètres : les numéros du mois et de l année choisis. Pour vous familiariser avec son emploi, tapez par exemple : cal puis faites afficher le mois de votre naissance L aide en ligne : commande man Le système Unix offre une aide en ligne pour chacune des commandes qu il propose. Pour obtenir cette aide il suffit de taper la commande man suivie du nom de la commande pour laquelle on veut obtenir de l aide. La commande man affiche à l écran la documentation Unix (en principe en français...). 10

12 2.4. LE SYSTÈME D EXPLOITATION CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE Tapez par exemple : man cal puis : man man Appuyez sur la barre d espace pour faire défiler les pages successives. Pour terminer la commande man tapez sur la touche Q Configurer votre environnement de travail Avant de poursuivre ce premier TP, vous devez configurer un certain nombre de paramètres du système, de façon à pouvoir dans la suite travailler dans les meilleures conditions de confort possible. Pour cela, vous devez exécuter, une fois pour toutes, la commande : source /Public/INF111/config.sh ATTENTION! : Chacun des membres d un binôme d étudiants doit exécuter cette commande une fois (et une seule) lors de sa première connexion à Unix Notions de fichier et de répertoire Ces notions seront développées en section 2.6. Un ordinateur est utilisé principalement pour pouvoir : 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 quantité considérable d informations sur un ordinateur donné, il n est pas possible de les ranger en vrac, il faut structurer l ensemble de ces informations. La solution informatique à ce problème repose sur le concept de fichier. Un fichier peut être vu comme un conteneur d informations. A tout instant, chaque utilisateur d un système Unix détient un ensemble de fichiers, mémorisés dans l ordinateur. Dès qu on gère un grand nombre de fichiers, le même problème de classement se pose à nouveau, cette fois-ci non plus au niveau de informations élémentaires, mais au niveau des fichiers. Les répertoires (en anglais : directory ) permettent de classer les fichiers. Un répertoire est destiné à contenir des fichiers, mais il peut aussi contenir d autres répertoires Récupérer un premier ensemble de fichiers Pour effectuer la suite de ce TP, vous aurez besoin d un ensemble de fichiers exemples que vous allez récupérer en tapant les commandes suivantes : sh /Public/INF111/tp1/tp1.sh cd INF111/TP Commandes de manipulation des fichiers Vous allez découvrir à présent les services que peut rendre le système Unix concernant la manipulation des fichiers. 11

13 2.4. LE SYSTÈME D EXPLOITATION CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE Visualiser vos répertoires et vos fichiers : commande dtree La commande dtree (abbréviation de directory tree ) affiche une figure représentant l arbre des répertoires et fichiers contenus dans le répertoire courant. Tapez : dtree La figure suivante est affichée. Cette figure représente les répertoires présents dans le répertoire courant (TP1) : -TP1- -courrier--- -programmes- Tapez : dtree -a La figure affichée représente cette fois-ci les répertoires mais aussi les fichiers présents dans le répertoire 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 (abréviation de list) permet d afficher la liste des noms des fichiers et répertoires présents dans le répertoire courant. Tapez : ls Le système doit vous répondre par une liste des noms des fichiers et des répertoires présents dans le répertoire courant : asupprimer chap1 courrier/ curriculum programmes/ Voir le contenu d un fichier texte : commandes less et more L exécution des commandes dtree -a et ls, vous a permis de constater qu un fichier de nom chap1 se trouve dans le répertoire courant. La commande less (ou alternativement la commande more) permet d examiner le contenu d un fichier. Il est évidemment nécessaire de spécifier le nom du fichier dont vous voulez voir le contenu : 12

14 2.4. LE SYSTÈME D EXPLOITATION CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE Tapez : less chap1 Le début du fichier s affiche sur votre écran. Vous pouvez alors effectuer plusieurs types d action permettant de visualiser le contenu du fichier. Les principales actions sont : touche, pour faire apparaître une ligne supplémentaire du fichier, touche, pour revenir en arrière d une ligne, touche / suivie d un mot, pour rechercher ce mot, touche N (abbréviation de Next ), pour chercher le prochain exemplaire du même mot, bien d autres possibilités encore (voir man less)... Effectuez chacune de ces actions tour à tour pour constater leur effet. Pour arrêter l exécution de less, tapez sur la touche Q (abbréviation de Quit ). Contrairement à ce que semble indiquer son nom, la commande more est moins puissante que la commande less. Les actions possibles sont : touche F (abbréviation de Forward ) ou appui sur la barre d espacement, pour avancer d une page, touche B (abbréviation de Backward ), pour revenir en arrière d une page, touche Entrée (ou Entr ), pour avancer d une ligne, touche Q, pour arrêter l exécution de more. Voir le contenu d un fichier texte de petite taille : commande cat La commande cat est très utile pour afficher le contenu d un fichier ne contenant que quelques lignes. Vérifiez au moyen de la commande ls que vous possédez un fichier qui porte le nom asupprimer. Tapez : cat asupprimer La totalité du contenu du fichier est affiché sur votre écran. Détruire un fichier : commande rm Quand on ne désire plus conserver un fichier, on peut le supprimer à l aide de la commande rm (abbréviation de remove ). Détruisez le fichier asupprimer en tapant la commande : rm asupprimer A la question vous demandant si vous souhaitez bien détruire le fichier indiqué, répondez en tapant sur la touche O ( oui ) ou sur la touche Y ( yes ). Utilisez à nouveau ls pour vérifier que le fichier a bien disparu. Attention! : Un fichier supprimé ne peut plus être récupéré. Il faut donc bien réfléchir à ce que l on s apprête à faire avant chaque utilisation de la commande rm... Copier un fichier : commande cp La commande cp (abbréviation de copy ) permet de créer une copie d un fichier. Cette commande est utilisée 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 vérifier qu un nouveau fichier de nom copie-chap1 a bien été créé. Exécutez ensuite la commande less pour vérifier que son contenu est bien le même que celui du fichier chap1. 13

15 2.5. L ÉDITEUR DE TEXTE NEDIT CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE Changer le nom d un fichier : commande mv La commande mv (abbréviation de move ) permet de changer le nom d un fichier 1. Comme la commande 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 créé lors de la manipulation précédente en tapant : mv copie-chap1 copie2-chap1 Utilisez les commandes ls et less pour vérifier que la manipulation s est bien déroulée. Imprimer un fichier texte : commande a2ps Pour imprimer un fichier contenant du texte il suffit d émettre la commande : a2ps < nom de fichier > où < nom de f ichier > désigne le fichier à imprimer. N imprimez aucun fichier pour l instant Exercice Observez le contenu du fichier chap1. Comparez ce contenu avec le début de ce poly. Cherchez la page de ce poly qui correspond à la fin du fichier chap1. Modififez le nom de la copie de chap1 que vous avez créée précédemment : 1. Créez une nouvelle copie du fichier chap1 nommée chap1.copie. 2. Supprimez la première copie. Changez le nom de chap1.copie en chap1.sauv, sans effectuer de copie. 2.5 L éditeur de texte nedit Notion d éditeur de texte Un fichier texte est un fichier contenant des caractères affichables (et imprimables) : lettres, chiffres, caractères de ponctuation. Pour créer ou modifier un fichier texte, on doit utiliser un programme éditeur de texte. Il existe de nombreux éditeurs de texte. Celui qui est utilisé sur les serveurs Unix du DLST a pour nom nedit. Une session d édition de texte se déroule de la façon suivante : Démarrage de l éditeur : l exécution de l éditeur est démarrée au moyen d une commande appropriée tapée dans la fenêtre xterm. Création / ouverture du fichier : si le fichier édité n existait pas auparavant, il faut le créer. Sinon, il faut ouvrir le fichier. Insertion de texte : la plupart des éditeurs de texte sont par défaut en mode insertion : tous les caractères tapés au clavier sont enregistrés. Modification de texte : tout éditeur dispose d un certain nombre de commandes ou opérations permettant de modifier le texte d un fichier. Celles fournies par l éditeur nedit sont présentées dans les sections qui suivent. Sauvegarde du fichier : un éditeur utilise une zone de la mémoire qui lui est propre (appelée tampon ou buffer d édition). Le texte créé ou modifié par l utilisateur est mémorisé par l éditeur dans son tampon d édition. Cette zone mémoire est créée au démarrage de l éditeur et est détruite lorsque l exécution de l éditeur se termine. Il est donc indispensable de sauvegarder dans le fichier concerné le texte contenu dans le tampon d édition, au plus tard avant la fin de la session d édition. 1 Le mot move s explique par le fait que la commande mv a d autres utilisations possibles qui seront présentées ultérieurement. 14

16 2.5. L ÉDITEUR DE TEXTE NEDIT CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE Créer et sauvegarder un nouveau fichier A l aide de la commande ls (ou de la commande dtree -a) vérifiez que vous ne disposez pas d un fichier dont le nom est monfichier. Tapez la commande : nedit monfichier & Une fenêtre d édition s ouvre. Cette fenêtre est vide, elle va servir à éditer (à créer) le fichier monfichier qui n existe pas encore. Remarque : le caractère & à la fin de la commande vous permet de continuer à exécuter des commandes dans la fenêtres Unix tout en travaillant dans la fenêtre graphique de nedit. L absence de ce caractère aurait pour effet de bloquer la fenêtre xterm jusqu à ce que la fenêtre nedit soit refermée. Vous disposez donc maintenant de 2 fenêtres : une fenêtre nommée xterm dans laquelle vous pouvez exécuter des commandes Unix, et une fenêtre d édition de texte. Vous pouvez travailler dans ces deux fenêtres simultanément. Positionner les fenêtres Mettez vous dans de bonnes conditions de travail en faisant en sorte que vos 2 fenêtres (xterm et nedit) soient assez grandes et ne se recouvrent pas totalement. Pour pouvoir travailler dans une fenêtre, il faut qu elle soit active : cliquez dans la fenêtre nedit. Notez qu une barre de menus se trouve tout en haut de la fenêtre de nedit. Cette barre de menus rassemble les menus File, Edit, Search, etc... Créer du texte Tapez plusieurs lignes de texte dans la fenêtre d édition. Sauvegarder du texte Pour sauvegarder le texte tapé, il faut sélectionner la commande Save dans le menu File. Sauvegardez votre texte. Dans la fenêtre xterm vérifiez à l aide de la commande ls qu un fichier nommé monfichier a été créé. Le fichier monfichier a été créé dans le répertoire de travail courant, c est à dire dans le répertoire à partir duquel vous avez invoqué la commande nedit. C est ainsi que vous pourrez créer les fichiers contenant les programmes que vous aurez à écrire par la suite Modifier du texte Exécutez la commande ls dans la fenêtre xterm, et vérifiez que vous disposez bien dans le répertoire courant d un fichier nommé chap1. Vous allez à présent effectuer des manipulations sur le contenu de ce fichier existant. Sélectionnez la commande Open du menu File. L éditeur ouvre une fenêtre où sont affichés les noms de vos fichiers. Cliquez sur chap1, puis dans le bouton graphique OK. Le début du fichier chap1 est affiché dans la fenêtre nedit. Vous devez voir clignoter au début de la première ligne du fichier un symbole ressemblant à un I : ce symbole indique le point d insertion, c est à dire le point du texte où seront ajoutés les 15

17 2.5. L ÉDITEUR DE TEXTE NEDIT CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE prochains caractères tapés au clavier. L éditeur ouvre une nouvelle fenêtre à chaque exécution de la commande Open du menu File. Il est donc possible d éditer plusieurs fichiers en même temps. Défilement du texte La fenêtre de nedit dispose sur sa droite d un dispositif graphique appelé barre de défilement ou ascenseur. Cette barre de défilement représente une glissière dans laquelle peut se déplacer un curseur. Faites défiler le texte dans la fenêtre en utilisant la barre de défilement : Amenez le pointeur de la souris sur le curseur de la barre de défilement et cliquez sur le bouton gauche. Tout en maintenant le bouton gauche de la souris appuyé, faites glisser le curseur de haut en bas. Le texte doit se déplacer dans la fenêtre. Après quelques déplacements, replacez le curseur tout en haut de la barre de défilement, de façon à voir le début du texte. Déplacement du point d insertion La modification (ou l ajout) de texte se fait toujours à partir du point d insertion. Déplacez le point d insertion à l aide des touches,, et. Déplacez le point d insertion en cliquant directement sur un autre point du texte dans la fenêtre d édition. Recherche d une ligne de numéro donné Il est souvent commode de pouvoir placer le point d insertion au début d une ligne dont on connait le numéro. Sélectionnez la commande Goto Line Number... du menu Search. Composez le numéro de la ligne cherchée, 95 par exemple, dans la fenêtre qui est apparue. Cliquez sur le bouton graphique OK, ou tapez. Vérifiez que le point d insertion est à présent placé sur la ligne voulue. Recherche d un mot Il est souvent nécessaire de rechercher un mot précis (on dit aussi : une chaîne de caractères ) dans un texte donné, par exemple pour remplacer ce mot par un autre mot. Placez le point d insertion au début du fichier. Sélectionnez la commande Find du menu Search. Une fenêtre s ouvre. Tapez le texte à rechercher, le mot programme par exemple, puis cliquer sur le bouton Find ou tapez. Vérifiez que le point d insertion est maintenant positionné à la fin du premier exemplaire du mot recherché; remarquez que l exemplaire trouvé est d une couleur différente de celle des mots qui l entourent : on dit que le mot trouvé est sélectionné. La fenêtre de recherche présente différentes options. Parmi elles les options Search Forward et Search Backward permettent de déterminer le sens de la recherche : en avant (c est à dire vers la fin du fichier) ou en arrière (c est à dire vers le début du fichier). 16

18 2.5. L ÉDITEUR DE TEXTE NEDIT CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE Remplacement d un mot par une autre Il s agit d une action complémentaire de celle qui vient d être présentée : Sélectionnez la commande Replace... du menu Search. Une autre fenêtre s ouvre; examinez son contenu (options et boutons) pour en comprendre le fonctionnement, puis essayez de remplacer tous les exemplaires du mot clavier par le mot keyboard (par exemple). Annulation de la dernière commande exécutée Il est toujours possible d annuler l effet de la dernière commande exécutée, au moyen de la commande Undo du menu Edit. Suppression d un caractère, d un mot, d une ligne, d un paragraphe Supprimer un caractère : placez le point d insertion juste après le caractère à supprimer et tapez sur la touche (en haut du clavier). Retapez ensuite le caractère supprimé (ou bien annulez l action de suppression exécutée). Supprimer un bloc de texte sélectionné au moyen de la souris : sélectionnez une partie de votre texte avec la souris. A cet effet, cliquer au début du texte à supprimer, puis faites glisser la souris vers la droite jusqu à la fin de ce texte, tout en maintenant le bouton gauche appuyé. Choisissez ensuite la commande Delete du menu Edit, ou plus simplement tapez sur la touche. Autres opérations d édition Scinder une ligne en deux : placez le point d insertion sur la ligne concernée, à l emplacement précis où vous avez choisi de la scinder. Tapez. Pour annuler la scission, tapez sur la touche (en haut du clavier). Concaténer deux lignes consécutives : Placez le point d insertion après la première ligne, juste avant le premier caractère de la seconde ligne. Tapez sur la touche. Déplacement d un bloc de lignes : Il arrive fréquemment que l on veuille déplacer un bloc de plusieurs lignes consécutives, d un endroit du fichier vers un autre. Sélectionnez un bloc de lignes avec la souris, puis choisissez la commande Cut du menu Edit : les lignes sélectionnées disparaissent, elles ont été coupées et placées dans un pressepapier virtuel (dans la mémoire de l éditeur). Placez ensuite le point d insertion à l endroit où vous voulez coller ces lignes, puis sélectionnez la commande Paste du menu Edit : les lignes coupées ré-apparaissent à l endroit choisi, elles ont été retrouvées par l éditeur dans le presse-papier et collées à cet endroit. Duplication (copie) d un bloc de lignes : Sélectionnez avec la souris un bloc de lignes à copier, puis choisissez la commande Copy du menu Edit : les lignes sélectionnées ont été copiées par l éditeur dans son presse-papier. Placez ensuite le point d insertion à l endroit où vous voulez ajouter les lignes copiées, puis sélectionnez la commande Paste du menu Edit : les lignes copiées apparaissent à l endroit choisi (elles ont été copiées à cet endroit par l éditeur depuis son presse-papier). Annuler toutes les modifications effectuées Lorsqu on est satisfait des modifications appliquées 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 effectuées depuis l ouverture du fichier (ou bien depuis la dernière sauvegarde effectuée). Supposons par exemple, que 17

19 2.5. L ÉDITEUR DE TEXTE NEDIT CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE l on souhaite éliminer toutes les modifications appliquées au fichier courant, le fichier chap1, et réafficher ce fichier dans l état où il se trouvait initialement (c est à dire au début de la section 2.5.3). Pour revenir à la version initiale du fichier chap1, sélectionnez la commande Revert to Saved du menu File. L éditeur ouvre une fenêtre d alerte vous signalant que des modifications non sauvegardées seront perdues si vous confirmez votre demande. Cliquez sur le bouton OK pour éliminer les modifications effectuées et revenir à la version précédente du fichier Quitter l éditeur Pour fermer une seule fenêtre de l éditeur, choisir la commande Close du menu File de cette fenêtre. Pour fermer toutes les fenêtres d édition et quitter nedit, sélectionnez la commande Exit du menu File. 18

20 2.6. LE SYSTÈME DE FICHIERS DE UNIX CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE 2.6 Le système de fichiers de Unix Organisation des fichiers sous Unix Nous avons vu que le premier niveau de structuration des informations mémorisées sur un ordinateur est le fichier. Les fichiers permettent de ne pas conserver les informations en vrac, mais au contraire de la découper en parties. Ces parties doivent bien entendu être chacune composée d informations de même type : un texte simple, un programme, une image, etc. Nous avons vu aussi qu il est nécessaire de pouvoir ranger les fichiers eux-mêmes dans des conteneurs appelés répertoires. Si l on représente graphiquement la relation d appartenance entre fichiers et répertoires, l ensemble des répertoires et fichiers d un système Unix peut être représenté sous la forme d un arbre inversé par le schéma de la figure 2.1. / u HOME a b... d... y z... duchamp dupond dupont durand... Fig. 2.1 Arborescence de fichiers et répertoires Unix Les informations associées aux fichiers et répertoires Un utilisateur gère donc deux types d objets informatiques : les fichiers et les répertoires. Il faut qu il sache avant tout déterminer le type de chaque objet. La commande ls avec l option -l permet d afficher une description détaillée des fichiers : Tapez : ls -l En supposant que vous soyez l utilisateur dont l identifiant est durand, vous devez obtenir un affichage ressemblant à ce qui suit : total 40 -rw-r--r-- 1 durand durand :10 chap1 -rw-r--r-- 1 durand durand :50 chap1.sauv drwxr-xr-x 2 durand durand :45 courrier -rw-r--r-- 1 durand durand :45 curriculum -rw-r--r-- 1 durand durand :45 monfichier drwxr-xr-x 2 durand durand :32 programmes On distingue dans cet affichage 8 colonnes (séparées par un espace) : Le premier caractère de la première colonne est soit la lettre d soit le caractère -. Un d indique que l objet considéré est un répertoire, un- indiquant que l objet est un fichier. Vous pouvez donc constater que les objets monfichier et chap1 sont des fichiers, alors que les objets courrier et programmes sont des répertoires. 19

21 2.6. LE SYSTÈME DE FICHIERS DE UNIX CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE Le nom de chaque objet se trouve en dernière colonne. la colonne 3 indique le nom du propriétaire de l objet, ici durand. la colonne 4 donne le nom du groupe d utilisateurs auquel appartient le propriétaire de l objet. Sur les serveurs du DLST, chaque utilisateur appartient par défaut à un groupe dont le nom est identique à son identifiant, ici le groupe durand. la colonne 5 indique la taille de l objet exprimée en nombre de caractères (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 dernière modification de l objet, par exemple le 16 juin 2008 à 19h50 pour le fichier chap1.sauv. Enfin, les 9 derniers caractères de la première colonne indiquent les droits d accès à l objet : lettre r ( read ) pour une autorisation de lecture, lettre w ( write ) pour une autorisation d écriture, et lettre x ( execute ) pour une autorisation d exécution. Le remplacement de l une de ces trois lettres par le caractère - indique que l accès correspondant n est pas autorisé. Les trois premiers caractères concernent les droits d accès du propriétaire de l objet, les trois suivants s appliquent aux membres du groupe du propriétaire de l objet, les trois derniers caractères s appliquant à tous les autres utilisateurs. Pour le fichier chap1 par exemple, l utilisateur durand peut lire et modifier le fichier, les membres de son groupe et les autres utilisateurs ne pouvant que le lire Changement de répertoire : commande cd On appelle répertoire courant ou répertoire de travail le répertoire dans le contexte duquel s exécutent à un instant donné les commandes Unix et les programmes de l utilisateur. Supposons que vous soyez l utilisateur durand et que votre arborescence de fichiers soit celle représentée par la figure 2.2. durand est le nom de votre répertoire d accueil (ou répertoire d origine). Votre répertoire courant est actuellement le répertoire TP1 qui appartient au répertoire INF111, qui lui même appartient au répertoire durand. durand INF111 TP1 mon_fichier courrier chap1.sauv chap1 curriculum programmes lettre1 lettre2 lettre3 lettre4 boucle.p boucle.c pgcd1.p pgcd1.c... Fig. 2.2 votre arborescence de répertoires Unix. Il est évidemment possible de changer de répertoire courant, au moyen de la commande cd (abbréviation de change directory ). Se placer dans un répertoire appartenant au répertoire courant Votre répertoire courant contient deux répertoires : courrier et programmes. Vous allez maintenant vous placer dans le répertoire courrier : 20

22 2.6. LE SYSTÈME DE FICHIERS DE UNIX CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE Tapez : cd courrier puis : ls -l Votre répertoire courant est à présent le répertoire courrier et vous pouvez constater que ce répertoire contient quatre objets qui sont tous des fichiers. Remarquez d autre part que la commande ls n a affiché que le contenu du répertoire courrier et n a pas listé les fichiers chap1, monfichier, etc. Se placer dans un répertoire auquel appartient le répertoire courant Le répertoire auquel appartient le répertoire courant, appelé répertoire parent, peut être désigné par le nom spécial.. (notez qu il n y a pas d espace entre les deux points). Il n y a pas d ambigüité puisqu un répertoire ne peut avoir qu un seul répertoire parent. A partir du répertoire courrier (répertoire courant actuel) placez-vous dans votre répertoire d accueil en invoquant trois fois la commande : cd.. A l aide des commande ls et dtree, vérifiez qu à présent vous êtes bien placé dans votre répertoire d origine. Tapez : cd.., puis : ls Vous devez voir la liste des étudiants dont le nom commence par la même lettre que le vôtre. Recommencez. Vous devez voir la liste des lettres de l alphabet. Se replacer dans le répertoire d accueil Quelque soit votre répertoire courant, vous devez pouvoir à tout instant vous replacer dans votre répertoire d origine. Tapez la commande : cd Vérifiez que votre répertoire courant est bien votre répertoire d accueil Afficher le nom du répertoire courant : commande pwd Quand on se déplace dans l arborescence, il arrive parfois que l on soit perdu, et que l on ne sache plus où l on est situé. La commande pwd (abbréviation de print working directory ) permet d afficher le nom du répertoire courant. Tapez : pwd Le résultat s interprète sans peine Création de répertoire : commande mkdir Les répertoires sont un moyen très efficace de classement, encore faut-il savoir les créer. Pour cela on doit utiliser la commande mkdir (abbréviation de make directory ). Cette commande requiert un argument : le nom du répertoire que l on souhaite créer. Tapez la commande : cd INF111/TP1 Pour créer un répertoire de nom monrep, tapez la commande : mkdir monrep Utilisez ensuite la commande ls pour vérifier qu un objet de type répertoire et de nom monrep a été créé dans le répertoire courant. Utilisez la commande cd pour vous placer dans ce nouveau répertoire, et ensuite ls pour afficher son contenu. La commande ls n a rien affiché, indiquant ainsi que le répertoire est vide. 21

23 2.6. LE SYSTÈME DE FICHIERS DE UNIX CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE Déplacement d un objet d un répertoire à l autre : commande mv Il est souvent nécessaire de déplacer un objet (fichier ou répertoire) du répertoire où il se trouve vers un autre répertoire. On utilise dans ce cas la commande mv (abbréviation de move ), avec deux arguments : le nom de l objet à déplacer et le nom du répertoire destination. Replacez vous dans le répertoire TP1. Déplacer le fichier monfichier dans le répertoire monrep au moyen de la commande : mv monfichier monrep Vérifiez le résultat obtenu au moyen des commandes ls et dtree Exercice 1 Il est très fortement recommandé de créer pour chaque TP qui sera réalisé cette année un répertoire distinct. Ces répertoires auront pour nom TPn, TPn+1, etc. TP1 est le répertoire consacré au présent TP. Vous allez maintenant créer le répertoire du prochain TP, le répertoire TP2 : Utilisez la commande cd pour vous replacer dans le répertoire INF111. Vérifiez le résultat au moyen de la commande pwd. Créez un répertoire nommé TP2. Créez dans le répertoire TP2 un fichier nommé tp2_1.c, contenant les 3 lignes suivantes : int main(void) { return 0; } Vérifiez que ce fichier se trouve bien dans le répertoiretp2. Si ce n est pas le cas, c est que vous n avez pas effectué correctement les actions requises. Recommencez jusqu à obtenir le résultat voulu. Réfléchissez bien à tous ces noms, et à ce qu ils représentent : le nom du répertoire (TP2), le nom du fichier (tp2_1.c) Exercice 2 Créer dans le répertoire courrier quatre répertoires nommés vincent, francois, paul et lesautres. Déplacez dans ces quatre répertoires les fichiers respectifs lettre1, lettre2, lettre3 et lettre Suppression de répertoire : commande rmdir On peut supprimer un répertoire à l aide de la commande rmdir (abbréviation de remove directory ). Cette suppression ne peut avoir lieu que si le répertoire concerné est vide, c est à dire s il ne contient aucun fichier ou répertoire. Replacez-vous dans le répertoire INF111, puis tapez la commande : rmdir TP2 Vérifiez ensuite à l aide de la commande ls que le répertoire TP2 a bien disparu. Placez-vous maintenant dans le répertoire TP1, puis tapez la commande : rmdir monrep Observez le message affiché Désignation des objets Les fichiers et les répertoires que nous avons manipulés jusqu à présent se trouvaient tous dans le répertoire courant. Il est pourtant tout à fait possible de désigner des objets se trouvant dans n importe quel répertoire de l arborescence Unix. 22

24 2.6. LE SYSTÈME DE FICHIERS DE UNIX CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE L une des façons est de décrire le chemin à parcourir depuis le répertoire courant jusqu à l objet considéré. Les noms des différents répertoires devant être traversés sont séparés par le caractère /. Vérifiez que vous êtes bien dans le répertoire TP1. Tapez ensuite : less courrier/vincent/lettre1 Vous accédez ainsi au fichier lettre1 du répertoire vincent appartenant au répertoire courrier, tout en étant placé dans le répertoire TP1. Tapez : cd courrier pour vous placer dans le répertoire courrier. Tapez ensuite : less../programmes/pgcd1.p Le nom spécial.. vous a permis de traverser le répertoire parent du répertoire courrier, c est à dire le répertoire TP1, puis le répertoire programmes, pour enfin accéder au fichier pgcd1.p Quelques facilités d écriture des noms d objets Certains caractères ont une signification spéciale et permettent d écrire des motifs de noms : le caractère? dans un motif correspond à n importe quel caractère. Le motif fic? correspond donc à la liste des objets du répertoire courant dont le nom comporte quatre caractères exactement et commence par les caractères fic. le caractère * dans un motif correspond à une chaîne (une suite) éventuellement vide de caractères quelconques. Ainsi, l interpréteur remplacera le motif fic*12 par la liste des objets du répertoire courant dont le nom contient cinq caractères au moins, commence par les caractères fic, et se termine par les caractères 12. Par ailleurs, la touche ( Tabulation ) permet dans certains cas de compléter un nom automatiquement. Placez vous dans le répertoire programmes, et utilisez la commande ls pour vérifier que ce répertoire contient bien les fichiers donneespgcd, pgcd1.c, pgcd1.p, pgcd2.c et pgcd2.p. Utilisez la commande ls et les caractères spéciaux? 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 caractères pgcd. Lister tous les fichiers dont le nom contient les caractères pgcd. Tapez : ls -l pg, puis appuyez sur la touche : L interpréteur complète votre commande partiellement en affichant le mot pgcd. Appuyez deux fois sur la touche : L interpréteur affiche la liste des fichiers dont le nom commence par les caractères pgcd puis ré-affiche votre commande incomplète. Pour afficher la ligne de commande complète, il vous faut choisir entre pgcd1.c, pgcd1.p, pgcd2.c et pgcd2.p. Tapez : 1, puis appuyez sur la touche : L interpréteur complète votre commande partiellement en affichant les caractères pgcd1. puis la liste des fichiers dont le nom commence par ces caractères. Il ré-affiche ensuite votre commande incomplète. Il vous reste en effet à choisir entre pgcd1.c et pgcd1.p. Tapez : p, puis appuyez sur la touche : Votre ligne de commande est complète puisqu il n existe dans le répertoire courant aucun autre fichier dont le nom commence par les caractères pgcd1.p. Vous pouvez à présent appuyer sur la touche, l interpréteur accepte votre commande et l exécute. 23

25 2.7. COMPILATION, EXÉCUTION CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE 2.7 Compilation et exécution d un programme Introduction L interpréteur de commandes permet aussi de compiler et d exécuter ensuite un programme. La compilation d un programme consiste à traduire un programme source contenu dans un fichier texte en un programme exécutable contenu dans un fichier binaire. Le programme source est écrit dans un langage de programmation, par exemple le langage Pascal, ou le langage C. Le programme exécutable contient des instructions codées en langage machine, instructions compréhensibles uniquement par le processeur de l ordinateur. La compilation est réalisée par un programme appelé compilateur Compilation d un programme C : commande gcc Le compilateur du langage C utilisé au DLST a pour nom gcc. Le nom du fichier contenant un programme source écrit en langage C doit se terminer par le suffixe.c. La commande permettant de compiler un programme source est constituée du nom du compilateur suivi d un certain nombre d arguments : gcc <fichier-source > -o <fichier-exécutable > Cette commande signifie : compiler le fichier désigné par <fichier-source > et placer le résultat (argument -o) dans le fichier désigné par <fichier-exécutable>. Placez-vous dans le répertoire programmes. Tapez la commande : gcc pgcd1.c -o pgcd1 puis la commande : gcc pgcd2.c -o pgcd2 Pour compiler un programme effectuant des tracés graphiques, la commande devient : gccgraph <fichier-source > -o <fichier-exécutable > Remarque : La commande gccgraph permet d invoquer le compilateur gcc de façon à ce qu il prenne en compte les bibliothèques requises pour afficher des objets graphiques Exécution d un programme Le service le plus important fourni par le système d exploitation de l ordinateur (Unix dans notre cas) est le lancement de l exécution d un programme. Pour exécuter un programme qui se trouve dans le répertoire courant, il suffit de taper les caractères./ suivis (sans espace intermédiaire) du nom du fichier contenant le programme exécutable correspondant : Tapez :./pgcd1 Recommencez avec :./pgcd Redirection des entrées / sorties Généralement, un programme requiert des données et produit des résultats. Par défaut, les données sont tapées ( saisies ) au clavier par l utilisateur et les résultats sont affichés sur son écran (dans la fenêtre xterm). Il est souvent souhaitable de pouvoir préparer les données à traiter dans un fichier, et d enregistrer les résultats produits dans un autre fichier. Ceci peut s obtenir au moyen de ce qu on appelle la redirection des entrées et des sorties : 24

26 2.8. RÉVISION CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE Tapez : pgcd2 < donneespgcd > respgcd Cette commande invoque le programme pgcd2 en lui indiquant de lire les données dans le fichier donneespgcd (redirection de l entrée) et d écrire les résultats dans le fichier respgcd (redirection de la sortie). Observez le contenu du fichier respgcd au moyen de la commande cat Interruption de l exécution d un programme Il peut se produire que suite à une erreur de programmation un programme ne se termine jamais. Il est dans ce cas nécessaire que l utilisateur puisse interrompre l exécution du programme. Le système d exploitation reconnaît à cet effet la combinaison particulière de touches Ctrl C comme une requête d interruption de l exécution du programme en cours. Tapez ls pour vérifier que le répertoire courant contient un fichier ayant pour nom boucle.c. Ce fichier contient le code source d un programme dont l exécution ne s arrête jamais. Compilez ce programme, puis exécutez le en tapant la commande : boucle Le programme affiche indéfiniment le même message. Après quelques secondes d exécution, appuyez sur la touche Ctrl, puis en maintenant cette dernière enfoncée appuyez sur la touche C. Constatez que l exécution du programme s est interrompue Ré-exécution d une commande récente Lorsqu on programme on est très souvent amené à exécuter plusieurs fois la même séquence de commandes, par exemple : éditer le texte d un programme source, compiler ce programme, l exécuter pour le tester, constater que des modifications sont encore nécessaires, modifier le programme source, le compiler, l exécuter, etc. Appuyez sur la touche. Le texte de la toute dernière ligne de commande que vous avez exécutée s affiche. Recommencez. Le texte de l avant dernière ligne de commande exécutée apparaît. Vous pouvez ainsi remonter autant de fois que nécessaire dans l historique des lignes de commande (de la plus récente vers la plus ancienne). Si vous êtes remonté trop haut (trop loin) dans l historique des commandes, vous pouvez le re-parcourir dans l autre sens (de la plus ancienne commande vers la plus récente) : Appuyez sur la touche. Recommencez autant de fois que nécessaire. Lorsque vous avez retrouvé la commande cherchée, il suffit de taper pour que cette commande soit exécutée. 2.8 Révision Exercice 1 Créez dans le répertoire programmes deux sous répertoires nommés respectivement pascal et c dans lesquel vous rangerez les programmes source : les fichiers en langage Pascal dans le répertoire pascal, les fichiers en langage C dans le répertoire c Exercice 2 Le programme exo1.c a pour objet d imprimer un message à l écran. Compilez ce programme : il y a des erreurs. Essayez de les corrigez et de re-compiler le programme jusqu à ce que la compilation s effectue sans message d erreur. Exécutez le programme. 25

27 2.9. FIN D UNE SESSION DE TRAVAIL CHAPITRE 2. PRISE EN MAIN DÉTAILLÉE 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 programme jusqu à ce que la compilation s effectue sans message d erreur. Exécutez le programme. 2.9 Fin d une session de travail En fin de séance, et chaque fois que vous quittez votre poste de travail, vous devez terminer votre session Unix, ainsi que votre session Windows dans le cas d un PC : Pour quitter Unix, taper la commande exit dans la fenêtre xterm. Remarque : la session Unix est fermée, mais le programme XWin32 est toujours actif; une nouvelle session Unix peut être démarrée en cliquant sur l icone X dans la barre des tâches de Windows, à droite. Pour quitter Windows, cliquer sur le menu Démarrer, puis choisir Arrêter. 26

28 Chapitre 3 Exercices 3.1 Exercice : application du cours 1. QCM Question v/f? justification - Le nom du fichier truc.txt est truc - Le père du répertoire courant est le répertoire racine - toto/ désigne le répertoire toto situé dans le répertoire de travail - Sous UNIX, il est indifférent d indiquer TOTO.txt ou toto.txt - cp -r permet de copier uniquement des répertoires, pas des fichiers - less et ls ont la même signification - man ls permet d avoir des informations sur ls - cd signifie create directory (créer un répertoire) - pwd cd > truc.txt crée un fichier truc.txt vide 2. Questions Si je tape gcc monprog.c -o monprog.c, que se passe-t-il? Quel est l intérêt de dtree par rapport à ls? Comment enregistrer l arborescence du répertoire racine dans un fichier nommé arbo.txt, situé dans le répertoire de travail? Exercice : chemins absolu et relatif Soit l arborescence de la figure ci-dessous. Si le répertoire courant est JEUX, comment copier tp.doc dans le répertoire TD? Ecrire la réponse en chemins absolus et en chemins relatifs. 27

29 3.1. EXERCICE : APPLICATION DU COURS CHAPITRE 3. EXERCICES Fig. 3.1 arborescence Exercice : cryptage d un fichier texte A l aide de la commande Remplacer de l éditeur de texte NEdit, modifier un texte quelconque de 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 Exercice : manipulation d arborescence Soit l arborescence de la figure ci-dessous. Donner la liste des commandes unix pour faire les actions suivantes : 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 BeachVolley sans bouger de mon répertoire courant. 5. Je suis dans TP, je veux aller créer un fichier minmax.c dans le répertoire MesProgPerso. 6. Je suis dans essai, je veux créer un répertoire TP4 dans le répertoire TP et y mettre le programme monprog en le laissant aussi dans TP1. 28

30 3.1. EXERCICE : APPLICATION DU COURS CHAPITRE 3. EXERCICES 7. En reprenant l arborescence initiale, réfléchir à ce que font ces commandes : less travail/ (répertoire courant : User) less /Sports/Beachvolley (répertoire courant : User) less /courrier/lettre1 (répertoire courant : User) cd monjeu (répertoire courant : MesProgsPerso) less monprog (répertoire courant : TP1) nedit toto.c nedit monjeu.c (répertoire courant : TP1) Exercice : manipulation d arborescence 1. En supposant que seul le répertoire MOI existe déjà et que c est le répertoire 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 répertoire courant, supprimer les répertoires TpsUNIX et TpsC, et mettre le contenu de TpsC dans MesTps. 3. MOI étant le répertoire courant, je veux modifier Motiv.doc et vérifier le contenu de cv.doc Exercice : manipulation d arborescence Soit l arborescence de la figure ci-dessous (les boîtes sont des répertoires, le reste des fichiers). Pour chaque question, on prend l arborescence initiale, sans prendre en compte les modifications que les questions précédentes auraient pu produire. De plus, à partir de la question 2, on suppose que l on connaît l arborescence. Fig. 3.4 arborescence 29

31 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 créer un répertoire 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 déplacer Planning.txt dans papiers. 7. Je ne sais pas où je suis, et je veux le savoir. 8. Je suis dans papiers et je veux renommer lettremotiv.doc en Motiv1.doc. 30

32 Chapitre 4 L essentiel à savoir 4.1 Editer un texte à partir d Unix : NEdit Le programme que nous utiliserons pour saisir des programmes C s appelle NEdit. Pour créer un nouveau fichier s appellant essai.c, taper en ligne de commande nedit essai.c &. Remarquez que la fenêtre de nedit est bordée en haut par une barre de menus comportant les menus File, Edit, Search, etc. Les commandes Save et Quit du menu File permettent respectivement d enregistrer votre travail et de quitter nedit. Pour plus de détails revoir le TP de prise en main d Unix (chapitre 2). 4.2 Transférer des fichiers entre votre compte et le compte de votre binôme A la fin de chaque séance de TP, il faut impérativement que l étudiant dont le compte a été utilisé pour réaliser le TP copie les répertoires et fichiers qu il a créés pendant la séance vers le compte de son binôme. Pour des raisons de sécurité, la commande cp ne peut être utilisée. Pour effectuer cette copie de compte à compte, il faut utiliser la commande scp, selon la procédure décrite dans les annexes, en section 9.2, page Transférer des fichiers entre votre domicile et votre compte Unix au DLST Pour certains TP et pour le projet vous serez peut-être amenés à vouloir utiliser votre propre ordinateur chez vous pour avancer votre travail. Il vous faudra dans ce cas pouvoir : 1. récupérer le répertoire et les fichiers concernés sur le serveur Unix du DLST et copier le tout sur votre ordinateur à la maison, avant de pouvoir travailler chez vous, et 2. transférer sur le serveur Unix du DLST une copie des fichiers que vous aurez modifiés à la maison, de façon à pouvoir retrouver une version à jour de ces fichiers lors de votre prochaine séance de travail au DLST. Pour effectuer ces deux types de transfert, vous devrez utiliser plusieurs outils, selon les procédures décrites en section 9.3, page

33 4.4. FICHIERS ET RÉPERTOIRES CHAPITRE 4. L ESSENTIEL À SAVOIR 4.4 Fichiers et répertoires Instructions d information sur une arborescence dtree -a Rep ls -l Rep pwd affiche l arborescence de fichiers issue du répertoire Rep (ou du répertoire courant si Rep n est pas spécifié) affiche la liste détaillée des fichiers et répertoires présents dans le répertoire Rep (ou le répertoire courant si Rep n est pas spécifié); selon les systèmes cette liste peut aussi contenir.. (répertoire père) et. (répertoire courant) affiche le nom du répertoire courant Instructions concernant les fichiers cp Fic1 Fic2 cp Fic Rep cat Fic less Fic mv Fic1 Fic2 mv Fic Rep rm Fic si Fic2 n est pas un nom de répertoire existant, duplique le fichier Fic1 dans un fichier nommé Fic2 si Rep est un nom de répertoire existant, place une copie du fichier Fic dans le répertoire Rep affiche le contenu du petit fichier texte Fic affiche le contenu du fichier texte Fic si Fic2 n est pas un nom de répertoire existant, renomme le fichier Fic1 en Fic2 si Rep est un nom de répertoire existant, déplace le fichier Fic dans Rep supprime le fichier Fic Instructions concernant les répertoires cd Rep cp -r RSrc RDest mkdir Rep rmdir Rep mv RSrc RDest Redirection de flux Cmd < Fic Cmd > Fic Cmd >> Fic Cmd1 Cmd2 accède au répertoire Rep place une copie du répertoire RSrc et de tout ce qu il contient dans le répertoire RDest crée le répertoire Rep supprime le répertoire Rep (Rep doit ^etre vide) déplace le répertoire RSrc et tout ce qu il contient dans le répertoire RDest Exécute la commande Cmd en remplaçant les caractères saisis au clavier par le contenu du fichier Fic Enregistre les caractères affichés par la commande Cmd dans le fichier Fic Enregistre les caractères affichés par la commande Cmd à la suite du fichier Fic Exécute la commande Cmd1 puis la commande Cmd2. La commande Cmd2 a pour entrée le résultat de la commande Cmd1. Autres instructions gcc fich.c -o fich lpx Fic man Cmd nedit Fic &./Fic Compile le fichier fich.c en un fichier exécutable fich imprime le contenu du fichier texte Fic sur l imprimante affiche une aide sur la commande UNIX ou C appelée Cmd édite le fichier texte Fic à l aide de l éditeur Nedit; si Fic n est pas un nom de fichier existant, celui-ci est créé si Fic est le nom d un fichier exécutable, exécute les instructions qu il contient 32

34 Deuxième partie PROGRAMMATION EN C 33

35 Chapitre 5 Sujets de TP 5.1 Premiers programmes Avertissement. Les exercices proposés dans ce TP sont indépendants. Cependant ils sont présentés dans un ordre de complexité croissante. Aussi ne passez pas à un exercice avant d avoir terminé l exercice précédent, c est-à-dire avant d avoir testé la bonne exécution des programmes. Conventions. Afin d organiser correctement votre travail, nous vous demandons de respecter les règles suivantes : 1. Si ce n est déjà fait, créer au moyen de la commande mkdir un répertoire INF111 dans votre répertoire d accueil (rappel : votre répertoire d accueil est le répertoire dans lequel vous vous trouvez lorsque vous vous connectez au système Unix). 2. Pour chaque TP, créer dans le répertoireinf111, un répertoiretpi où i est le numéro du TP. C est dans ce répertoire que vous devrez ranger les programmes que vous écrirez pendant le TP courant. Pour ce TP, vous devez donc créer le répertoire TP2. Une fois le répertoire TP2 créé, placez vous dans ce répertoire au moyen de la commande cd. Pour créer le fichier exo.c (ou pour l ouvrir s il existe déjà) utilisez la commande : nedit exo.c & Pour compiler le fichier exo.c (et obtenir le programme exécutable exo utilisez la commande : gcc exo.c -o exo Attention : un programme ne peut être considéré comme correct tant que gcc affiche des messages d erreurs ou des messages d alerte ( warning ). Par ailleurs, afin d identifier clairement vos programmes tout fichier source en langage C devra avoir comme suffixe.c et tout programme exécutable devra avoir le même nom que le fichier source correspondant mais sans le suffixe.c. Remarque : Pour faciliter la coopération entre les deux étudiants d un binôme, on dupliquera les fichiers sous les répertoires de TP des deux membres de ce binôme (utilisez la commande scp, voir annexe 9.2 page

36 5.1. PREMIERS PROGRAMMES CHAPITRE 5. SUJETS DE TP Conversion de températures En utilisant la formule C = 5 9 (F 32), écrire un programme degres.c en langage C qui lit une température exprimée en degrés fahrenheit et affiche sa valeur en degrés celsius. Remarque : Dans l exemple d exécution donné ci-dessous, ce qui est produit par le programme est affiché : comme ceci, ce qui est tapé au clavier par l utilisateur (par vous donc) est affiché : comme cela. Exemple d exécution du programme degres : durand@gallien:~/inf111/tp2$./degres Donnez une température en degrés fahrenheit : 60 Cette température équivaut à 15.6 degrés celsius. durand@gallien:~/inf111/tp2$ Conversion de durées Écrire un programme jhms.c en langage C qui pour un nombre donné de secondes affiche la durée équivalente exprimée en jours, heures (le nombre d heures étant inférieur ou égal à 23), minutes (le nombre de minutes étant inférieur ou égal à 59) et secondes (le nombre de secondes étant inférieur ou égal à 59). Exemple d exécution du programme jhms : durand@gallien:~/inf111/tp2$./jhms Donnez une durée en secondes : 3721 Cette durée correspond à : 0 jours 1 heures 2 minutes 1 secondes durand@gallien:~/inf111/tp2$ Le programme ci-dessus utilise systématiquement le pluriel. Écrire une deuxième version de ce programme appelée jhms2.c qui évite l usage incorrect du pluriel et n affiche pas les valeurs nulles. Exemple d exécution du programme jhms2.c : durand@gallien:~/inf111/tp2$./jhms2 Donnez une durée en secondes : 7260 Cette durée correspond à : 2 heures 1 minute durand@gallien:~/inf111/tp2$ Tri de 3 entiers Écrire un programme tri3.c en langage C qui lit trois entiers et les affiche dans l ordre du plus petit au plus grand. Exemple d exécution du programme tri3 : durand@gallien:~/inf111/tp2$./tri3 Donnez un entier : 25 Donnez un entier : 56 Donnez un entier : 4 Les entiers du plus petit au plus grand sont : durand@gallien:~/inf111/tp2$ 35

37 5.2. ADIBOU CHAPITRE 5. SUJETS DE TP 5.2 Adibou Exercice 1 Ecrire un programme adibou.c qui demande trois entiers a, b et c à l utilisateur, puis lui pose successivement les questions suivantes : 1. a < b < c? 2. un seul nombre impair parmi a, b, c? 3. a, b, c distincts deux à deux? A chaque question, le programme doit afficher réponse correcte, bravo! ou réponse incorrecte selon la réponse de l utilisateur. Le programme doit compter le nombre de bonnes réponses et à la fin afficher le total de points, sous la forme : n bonnes réponses sur 3. Exemple d exécution du programme : durand@gallien:~/inf111/tp3$./adibou a =? : 1 b =? : 4 c =? : 3 Répondre par V (vrai) ou F (faux) : Q1. 1 < 4 < 3? : V réponse incorrecte Q2. un seul nombre impair parmi 1, 4, 3? : F réponse correcte, bravo! Q3. 1, 4, 3 distincts deux à deux? : V réponse correcte, bravo! 2 bonnes réponses sur 3 durand@gallien:~/inf111/tp3$ Exercice 2 Créez une copie du fichier adibou.c nommée adibou2.c. Modifier cette copie de façon à ajouter les questions suivantes au quizz : Quelle est la valeur de a b + b c + c a? Existe-t-il un triangle dont les côtés sont a, b, c? Donner les valeurs de a, b, c dans l ordre croissant Deux des nombres a, b, c sont-ils égaux entre eux? Lesquels? Exercice 3 Créez une copie du fichier adibou2.c nommée adibou3.c. Modifier cette copie de façon à ce que l ensemble des questions soient posées plusieurs fois (par exemple 3 fois) à l utilisateur. Le programme devra vérifier que les nombres a, b et c choisis sont différents à chaque fois. Il devra à la fin afficher le score global obtenu par l utilisateur. Exemple d exécution du programme : 36

38 5.2. ADIBOU CHAPITRE 5. SUJETS DE TP partie 1 ======== a =? : 17 b =? : 5 c =? : -3 Répondez par V (vrai) ou F (faux) : Q1. 17 < 5 < -3? : F réponse correcte, bravo!... 5 bonnes réponses sur 7 partie 2 ======== a =? : 7 b =? : 13 c =? : 25 Répondez par V (vrai) ou F (faux) : Q1. 7 < 13 < 25? : V réponse correcte, bravo!... 3 bonnes réponses sur 7 partie 3 ======== a =? : 7 b =? : 13 c =? : 25 Choisissez 3 nombres différents de ceux déjà choisis! a =? : 77 b =? : 1 c =? : 29 Répondez par V (vrai) ou F (faux) : Q1. 77 < 1 < 29? : V réponse incorrecte... 6 bonnes réponses sur 7 score final : 14 bonnes réponses sur 21 durand@gallien:~/inf111/tp3$ 37

39 5.3. LE JEU DU PRIX DU LOT CHAPITRE 5. SUJETS DE TP 5.3 Le jeu du prix du lot Le prix du lot : version de base Le jeu consiste à découvrir par essais successifs le prix d un lot. Pour chaque essai, le programme affiche un message Trop grand, Trop petit ou BRAVO! Vous avez trouvé en k essais. Le jeu est fini quand le joueur a trouvé le prix du lot. On propose d écrire un programme prixlot1.c qui joue le rôle de meneur de jeu. L exécution de ce programme vous fera tenir le rôle du joueur. Le programme doit définir le prix du lot en tirant un entier aléatoire compris entre 1 et 1000 et dialoguer avec le joueur pendant le jeu. La génération des nombres aléatoires sera obtenue au moyen de la fonction hasard() (voir section page 117 en annexe). Voici un exemple de l exécution du programme prixlot1 (les informations tapées par l utilisateur sont en gras) : durand@gallien:~/inf111/tp4$./prixlot1 Entrer un prix : 566 Trop grand Entrer un prix : 400 Trop grand Entrer un prix : 150 Trop petit Entrer un prix : 200 Trop petit Entrer un prix : 214 BRAVO! Vous avez gagné 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 à 0 initialiser la valeur de l essai à 0 tant que le dernier essai était différent du prix tiré : { nouvel essai } demander au joueur un nouvel essai saisir la valeur jouée afficher le message approprié selon que la valeur saisie est plus grande ou plus petite que le prix tiré incrémenter le compteur d essais { le dernier essai correspondait au prix tiré } afficher le message de félicitations et le nombre d essais joués Le prix du lot : deuxième version Créer une copie nommée prixlot2.c du fichier prixlot1.c. Modifier le fichier prixlot2.c de manière à pouvoir : 1. Enchaîner plusieurs parties consécutives lors d une même exécution du programme. A la fin de chaque partie, il est demandé au joueur de préciser s il veut s arrêter ou jouer une nouvelle partie. 38

40 5.3. LE JEU DU PRIX DU LOT CHAPITRE 5. SUJETS DE TP 2. Limiter le nombre d essais effectués par le joueur au cours d une partie. Au début de chaque partie, le programme demande le nombre maximum d essais autorisés pour la partie qui débute. Exemple d exécution du programme prixlot2 : durand@gallien:~/inf111/tp4$./prixlot2 1ère partie. Nombre maximm d essais : 4 Entrer un prix : 678 Trop petit Entrer un prix : 920 Trop grand Entrer un prix : 860 Trop petit Entrer un prix : 910 Trop petit PERDU! Vous avez épuisé le nombre d essais autorisés Le prix à trouver était : 917 Voulez-vous rejouer (O/N)? : o 2ème partie. Nombre maximm d essais : 8 Entrer un prix : 678 Trop petit Entrer un prix : 333 Trop grand Entrer un prix : 300 Trop petit Entrer un prix : 320 Trop petit Entrer un prix : 324 BRAVO! Vous avez gagné en 5 essais Voulez-vous rejouer (O/N)? : n durand@gallien:~/inf111/tp4$ Le prix du lot : version complète En jouant avec le programme prixlot2, essayer de trouver une stratégie systématique permettant de trouver le prix tiré en un minimum de coups. En déduire un programme prixlot3.c qui fait jouer l ordinateur à votre place suivant la stratégie trouvée. Ce programme aura donc en charge les deux rôles de meneur de jeu et de joueur (joueur virtuel). Pouvez-vous prévoir, pour la stratégie que vous avez choisie, l ordre de grandeur du nombre d essais requis pour trouver le prix tiré? Compléter le programme prixlot3.c en lui faisant effectuer consécutivement 20 parties. Pour chaque partie le programme affichera le prix tiré au sort et le nombre d essais successifs qui ont été nécessaires pour le trouver avec la stratégie utilisée. A la fin des 20 parties, le programme affichera la moyenne des nombres d essais utilisés pour les 20 parties. Vous pourrez ainsi comparer cette moyenne avec l ordre de grandeur que vous aviez prévu. 39

41 5.4. TRI PAR SÉLECTION CHAPITRE 5. SUJETS DE TP 5.4 Tri par sélection La recherche d une donnée dans un ensemble d informations volumineux est grandement facilitée lorsque ces informations sont ordonnées. Ainsi, si les mots d un dictionnaire n étaient pas ordonnés selon l ordre alphabétique, il faudrait parcourir en moyenne la moitié du dictionnaire pour trouver un mot, ce qui rendrait les parties de scrabble interminables! Le tri d un ensemble de données est l opération permettant de ré-arranger ces données selon un ordre choisi. On se propose dans ce TP de trier un tableau de n entiers selon l ordre croissant : à la fin du tri, les n entiers sont rangés du plus petit au plus grand dans les n premières cases du tableau. Le contenu du tableau à trier sera tiré aléatoirement par le programme. L algorithme de tri utilisé dans ce TP s appelle le tri par sélection. Dans un premier temps (paragraphe 5.4.3), on écrira un programme qui trie le tableau et affiche ensuite à l écran les valeurs triées. Dans un deuxième temps (paragraphe 5.4.4), on modifiera le premier programme pour visualiser graphiquement le déroulement du tri Structure du programme Le programme sera construit selon l algorithme général suivant : lire le nombre d éléments à trier remplir le tableau au moyen du générateur aléatoire afficher le contenu du tableau non trié trier le tableau afficher le contenu du tableau trié Les principales informations que le programme aura à traiter sont : Constantes : NMAX : nombre maximun d éléments à 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 éléments à trier n : nombre d éléments à trier Le contenu du tableau à trier sera généré aléatoirement au moyen de la fonction hasard (voir section page 117 en annexe). Pour obtenir une suite de nombres toujours identique à chaque exécution du programme, on pourra utiliser la procédure initialiser_germe (voir section page 117) qu il faut appeler une fois avant de remplir le tableau Première version du programme Ecrire une première version du programme tri.c qui, après avoir déclaré les constantes et variables nécessaires, effectue les actions suivantes : saisir au clavier le nombre n (n NMAX) d éléments que doit contenir le tableau (le tableau comporte NMAX cases, mais nous n utiliserons ici que les cases 0,..., n 1) initialiser le générateur aléatoire (optionnel) remplir le tableautab de n entiers tirés au hasard dans l intervalle [V ALMIN, V ALMAX], les n entiers étant rangés successivement dans les cases 0, 1,..., n 1 afficher le contenu du tableau Remarque : Cette première version du programme n effectue aucun tri. Compiler et tester le programme obtenu. 40

42 5.4. TRI PAR SÉLECTION CHAPITRE 5. SUJETS DE TP Réalisation du tri Algorithme du tri par sélection : principe L algorithme utilisé se déroule en n 1 étapes principales (si n est le nombre d entiers à trier). A chaque étape le contenu du tableau se divise en deux parties disjointes. A la i + 1 eme étape, ces deux parties sont : 1. Les cases d indices 0 à i 1 contiennent les i plus petits éléments du tableau, ces éléments sont déjà triés et ils occupent leur place définitive (résultat des i premières étapes déjà effectuées). 2. Les cases d indices i à n 1 contiennent les éléments non encore triés. partie non éléments triés éléments non triés utilisée i 1 i n 1 NMAX 1 Fig. 5.1 Principe du tri par sélection Les étapes successives du tri se déroulent de la façon suivante : Etape 0 : aucun élément n est trié; on recherche l élément minimum (le plus petit) dans la partie non triée, c est à dire parmi les éléments d indices 0 à n 1; on échange ensuite cet élément minimum avec l élément d indice 0. Résultat : la partie triée comprend un seul élément, l élément d indice 0, lequel élément est à tout élément de la partie non triée (éléments d indice 1 à n 1). Etape 1 : on recherche l élément minimum dans la partie non triée, c est à dire parmi les éléments d indices 1 à n 1 ; on échange ensuite cet élément minimum avec l élément d indice 1. Résultat : l élément d indice 1 est à tout élément de la partie non triée, mais il est aussi à l élément d indice 0. La partie triée est donc à présent constituée des deux éléments d indices 0 et Etape i : on recherche l élément minimum dans la partie non triée, c est à dire parmi les éléments d indices i à n 1; on échange ensuite cet élément minimum avec l élément d indice i. Résultat : l élément d indice i est à tout élément de la partie non triée, mais il est aussi à tout élément de la partie triée. La partie triée est donc à présent constituée des éléments d indices 0 à i.... Etape n 2 : on recherche l élément minimum dans la partie non triée, c est à dire parmi les éléments d indices n 2 et n 1 ; on échange ensuite cet élément minimum avec l élément d indice n 2. Résultat : l élément d indice n 2 est à l élément d indice n 1, mais il est aussi à tout élément de la partie triée. La partie triée est donc à présent constituée des éléments d indices 0 à n 2. Question : Pour quelle raison est-il inutile d effectuer l étape n 1? Réalisation du tri Du principe décrit ci-dessus on déduit l algorithme du tri par sélection (tri par minimum) : i parcourant [0,...,n 2] rechercher le minimum des éléments d indices i à n - 1 échanger cet élément minimum avec l élément d indice i 41

43 5.4. TRI PAR SÉLECTION CHAPITRE 5. SUJETS DE TP Créer une copie du fichier tri.c nommée tri2.c. Modifier cette copie de façon à ce que le programme obtenu effectue les actions suivantes après avoir affiché le contenu initial du tableau : trier le contenu du tableau tab en utilisant l algorithme du tri par sélection. afficher le contenu trié du tableau Visualisation graphique On veut maintenant visualiser sous forme graphique l exécution de l algorithme de tri. La figure 5.2 donne un exemple du résultat à obtenir. Le tracé correspondant sera effectué au moyen d un environnement graphique basé sur la bibliothèque graphsimple dont une documentation détaillée est donnée en annexe (cf. section 9.5 page 120). Le programme utilisant cette bibliothèque aura la forme suivante : /* tri3.c */ #include "graphsimple.h"... int main(void) {... } /* initialisation du contenu du tableau */... /* création d une fen^etre graphique de dimensions 600 x 500 */ Initialiser(600, 500); /* tracé d une représentation graphique des éléments non triés */... /* attente d un clic souris (pour observer le dessin obtenu) */ AttendreClic(); /* exécution du tri */... /* tracé d une représentation graphique des éléments triés */... /* attente d un clic souris (avant fermeture de la fen^etre) */ AttendreClic(); /* fermeture de la fen^etre graphique */ Clore(); return 0; Pour compiler ce programme il faut utiliser la commande : gccgraph tri3.c -o tri3 Réalisation du tracé graphique Rappel : les coordonnées dans la fenêtre graphique sont repérées par rapport au point le plus haut et le plus à gauche de la fenêtre (le point de coordonnées < 0, 0 >). On peut tout d abord dessiner deux axes : 42

44 5.4. TRI PAR SÉLECTION CHAPITRE 5. SUJETS DE TP a b c d e VALMIN 0 i n 1 0 n 1 tab[i] VALMAX avant le tri après le tri Fig. 5.2 Représentation graphique du tableau d entiers L axe des abscisses représente les indices des éléments du tableau. Il est dessiné à une distance e du bord haut de la fenêtre. L axe des ordonnées représente les valeurs de ces mêmes éléments. Il est dessiné à une distance a du bord gauche de la fenêtre. Ces axes seront dessinés au moyen de la procédure Ligne de la bibliothèque graphsimple (voir annexe 9.5 page 120). Chaque élément d indice i du tableau tab est représenté par un rectangle dont le sommet supérieur gauche a pour coordonnées le couple < a + b + i.(d + c), e >, et dont le sommet inférieur droit a pour coordonnées le couple < a + b + i.(d + c) + d, e + tab[i] V ALMIN >. Pour afficher cet élément on utilisera la procédure Rectangle, pour l effacer on utilisera la procédure SuppRectangle. Animation du tracé Pour visualiser l échange des éléments d indices i et j du tableau il faut tout d abord effacer dans la fenêtre les deux rectangles représentant ces éléments, puis effectuer l échange des deux éléments, et enfin re-dessiner deux rectangles représentant les nouvelles valeurs des éléments d indices i et j. Remarque : la procédure AttendreDelai de la bibliothèque graphsimple permet de ralentir l animation lorsque celle-ci est trop rapide. On peut aussi obtenir une exécution pas à pas du programme : Il suffit d invoquer à chaque itération la procédure AttendreClic ou bien la procédure AttendreTaper. Améliorations possibles 1. Le graphique obtenu lors des étapes précédentes a pour principal défaut d être tracé à l envers. Une première amélioration consiste à modifier le programme pour que le tracé soit effectué à l endroit, c est à dire axe des abscisses en bas de la fenêtre graphique et axe des ordonnées dirigé vers le haut de la fenêtre. 2. Pour faciliter l observation du processus de tri on peut utiliser des couleurs autres que le noir et le blanc. On peut par exemple utiliser une première couleur pour les valeurs déjà triées et une seconde couleur pour les valeurs non encore triées. On peut aussi utiliser une troisième couleur pour mettre en évidence la valeur minimum lors du parcours de la partie non triée. 3. On peut enfin améliorer l algorithme de tri en lui-même : Si lors du parcours de la partie présumée non triée (indices i à n 1) la suite des valeurs parcourues s avère être croissante, cela signifie que cette partie est en fait déjà triée. Les éléments de la partie non triée étant tous à ceux de la partie triée, le tableau est dans ce cas totalement trié, il est inutile de poursuivre l exécution du tri. 43

45 5.5. LE VOYAGEUR DE COMMERCE CHAPITRE 5. SUJETS DE TP 5.5 Le voyageur de commerce Le TP sera effectué selon les étapes successives ci-dessous, en respectant l ordre indiqué. A chaque étape, le programme devra avoir été compilé (et si possible testé) avec succès avant que la réalisation ne passe à l étape suivante. Le codage de chaque étape sera basé sur le travail de préparation effectué en TD Déclaration des variables principales Les variables représentant les informations principales du programme sont les suivantes : Nombre de villes : variable nbvilles Numéro de la ville de départ : variable villedepart Distances inter-villes : tableau distances Villes déja visitées : tableau dejavisitee Etapes de l itinéraire : tableau etapes Distances parcourues depuis la ville de départ : tableau distancecumulee Numéro de la ville visitée lors de chaque étape : variable villecourante Remarques : Le nombre de villes maximum est donné par la constante NMAX. La case n o 0 des tableaux n est pas utilisée. Coder puis compiler Saisie des données Les données du programme doivent être saisies au clavier. Ce sont (dans l ordre) : 1. Le nombre de villes à visiter (variable nbvilles) 2. Les distances inter-villes (tableau distances) : Si n est le nombre de villes à visiter, il y a n(n 1)/2 valeurs à saisir : les n 1 premières valeurs sont les distances entre la ville n o 1 et les villes n o 2 à n les n 2 valeurs suivantes sont les distances entre la ville n o 2 et les villes n o 3 à n... la dernière valeur est la distance entre la ville n o n 1 et la ville n o n 3. Le numéro de la ville de départ (variable villedepart) Coder puis compiler et tester Affichage des données saisies Les données saisies seront affichées dans l ordre suivant : 1. Nombre de villes à visiter 2. Numéro de la ville de départ 3. Distances inter-villes : le contenu du tableau distances sera affiché sous la forme d une table à double entrée, sur le modèle de ce qui est produit par le programme de démonstration voyageur-demosparc. Coder puis compiler et tester. 44

46 5.5. LE VOYAGEUR DE COMMERCE CHAPITRE 5. SUJETS DE TP Initialisation des variables de travail et tableaux résultat Les informations suivantes doivent être initialisées avant d entamer la visite des villes : 1. Etat des villes : tableau dejavisitee La ville de départ est visitée. Les autres villes n ont pas encore été visitées. 2. Etapes de l itinéraire : tableau etapes La première étape est la ville de départ. 3. Distance parcourue : tableau distanceparcourue La distance parcourue au départ (étape n o 1) est nulle. 4. Ville en cours de visite : variable villecourante La ville visitée lors de la première étape est la ville de départ. Coder puis compiler et tester Visite des villes Il y a au total nbvilles + 1 villes à visiter : La ville visitée lors de la premère étape est la ville de départ. La ville visitée lors de la dernière étape est aussi la ville de départ. Algorithme Pour chaque étape de n o i, i [2,...,nbVilles] : 1. Rechercher la ville v non visitée la plus proche de la ville courante. 2. Mémoriser dans le tableau dejavisitee le fait que la ville v est visitée. 3. Mémoriser dans le tableau etapes le fait que la ville visitée lors de la i eme étape est la ville v. 4. Calculer la distance parcourue depuis la ville de départ jusqu à la ville v et mémoriser cette distance dans le tableau distancecumulee. Ce calcul doit être effectué en utilisant la distance calculée lors de la i 1 eme étape. 5. Mémoriser le fait que la nouvelle ville en cours de visite est la ville v. Mémoriser dans le tableau etapes le fait que la dernière étape consiste à revenir à la ville de départ. Calculer la distance totale parcourue après avoir visité toutes les villes et être revenu à la ville de départ; mémoriser cette distance dans le tableau distancecumulee. Coder puis compiler et tester Affichage du résultat L itinéraire calculé par le programme sera affiché sous forme tabulaire, sur le modèle de ce qui est produit par le programme de démonstration. Pour chaque étape de l itinéraire devront être affichés : Le numéro de l étape, le numéro de la ville visitée et la distance parcourue depuis la ville de départ. Coder puis compiler et tester. 45

47 5.6. LE JEU DU TAQUIN CHAPITRE 5. SUJETS DE TP 5.6 Le jeu du taquin Le but de ce TP est de réaliser un jeu de taquin. Le taquin se joue avec un plateau de N N cases comme ci-dessous : Fig. 5.3 Exemple de plateau de taquin (N = 3) Chaque case du plateau contient un nombre compris entre 1 et N 2 1 distinct de celui présent dans les autres cases. Le plateau contient nécessairement une case vide. Une case contenant un nombre peut être déplacée vers la case vide, horizontalement ou verticalement uniquement. Le but du jeu est de replacer tous les nombres dans l ordre croissant, de gauche à droite et de haut en bas Première 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 programme fera appel aux procédures remplirtaquin et affichertaquin décrites ci-dessous. Un jeu de taquin est représenté en mémoire par un tableau d entiers (la case vide sera représentée par l entier 0). Pour faciliter le calcul du déplacement d une case (voir paragraphe suivant), ce tableau comportera N + 2 lignes et N + 2 colonnes : la 1ère et la dernière lignes ne seront pas utilisées, de même que la 1ère et la dernière colonnes. Remplissage du taquin Le programme doit déclarer un tableau et l initialiser avec des valeurs tirées au hasard comprises entre 0 (case vide) et N 2 1, toutes différentes les unes des autres. La constante suivante devra être utilisée : #define N 3 /* nombre de lignes et de colonnes du taquin */ Un plateau comme celui de la figure 5.3 peut alors être représenté 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 déplacement des cases, les cases des lignes 0 et N +1 et des colonnes 0 et N +1 devront être initialisées à la valeur 1. Le remplissage (l initialisation) du taquin sera effectuée par le sous-programme : void remplirtaquin(int p[n + 2][N + 2]); Affichage du taquin L affichage du taquin est dans cette première version effectué en mode texte, par le sousprogramme : void affichertaquin(int p[n + 2][N + 2]); Ce sous-programme fera lui-même appel au sous-programme standard printf. Remarque : la case de valeur 0 doit être affichée comme étant vide!... 46

48 5.6. LE JEU DU TAQUIN CHAPITRE 5. SUJETS DE TP Déplacement d une case Compléter le programme précédent pour autoriser le déplacement des cases du plateau de taquin. Les déplacements de case demandés par l utilisateur seront saisis au clavier (sous-programme scanf), sous la forme d un numéro de ligne et d un numéro de colonne. Après l affichage initial du plateau, le programme permet à un joueur de déplacer une case contenant un nombre vers la case vide adjacente : dans l exemple de la figure 5.3 ci-dessus, le joueur peut demander de déplacer la case de valeur 8, ce déplacement est valide puisque la case correspondante est adjacente à la case vide. De même, s il choisit la case de valeur 4. Dans les deux cas, la case choisie et la case vide doivent être interverties. Si par contre il choisit la case de valeur 3, le déplacement n est pas possible, le programme doit dans ce cas re-demander à l utilisateur un coup valide. Si le joueur choisit une case située hors du plateau, le programme se termine. La partie du programme à écrire concernant le déplacement des cases est structurée sous la forme d une itération : attendre que le joueur saisisse un déplacement tant que le joueur a choisi une case située sur le plateau si le joueur a choisi une case valide alors effectuer le déplacement de cette case ré-afficher le taquin sinon informer le joueur que son coup n est pas valide attendre que le joueur saisisse un déplacement Remarque 1 : une case située sur le plateau est une case dont le numéro de ligne et le numéro de colonne sont compris entre 1 et N. Remarque 2 : une case valide est une case qui contient une valeur comprise entre 1 et N 2 1. Initialisation du taquin par le joueur On veut maintenant que l utilisateur puisse initialiser lui-même le taquin. Créer une copie taquin2.c du programme précédent et la modifier de façon à ce que le joueur puisse saisir une valeur initiale comprise entre 0 et 8 pour chacune des cases du taquin. La saisie sera effectuée par le sous-programme : void saisirtaquin(int p[n + 2][N + 2]; Ce sous-programme fera lui-même appel au sous-programme standard scanf. Il devra initialiser correctement les lignes 0 et N + 1 ainsi que les colonnes 0 et N + 1. Jouer avec le programme Créer une copietaquin3.c du programme précédent et la modifier de façon à ce que le programme obtenu informe l utilisateur qu il a gagné lorsque toutes les cases sont rangées dans l ordre croissant de leurs valeurs, de gauche à droite, et de haut en bas. Compléter ensuite le programme pour qu en fin de partie (gain de la partie ou abandon) le joueur puisse soit effectuer une nouvelle partie, soit terminer le programme. On rappelle que l abandon correspond au choix d une case située hors du plateau. Remarque : dans la configuration gagnante, la case vide se trouve en bas et à droite du taquin. 47

49 5.6. LE JEU DU TAQUIN CHAPITRE 5. SUJETS DE TP Seconde version : réalisation d une interface graphique Dans cette version, le programme doit communiquer avec le joueur au moyen d une fenêtre graphique dans laquelle est dessiné le plateau de taquin. Une bordure de largeur égale à celle d une case est réservée autour du plateau de taquin, afin de permettre à l utilisateur de cliquer en dehors du plateau. L algorithme principal du programme devient : initialiser le taquin et la fen^etre graphique dessiner le taquin attendre que le joueur ait cliqué sur une case tant que le joueur a cliqué sur une case située sur le plateau si le joueur a cliqué sur une case valide alors effectuer le déplacement de cette case mettre à jour le dessin du taquin sinon informer le joueur que son coup n est pas valide attendre que le joueur ait cliqué sur une case La constante suivante devra être déclarée : #define MAILLE 80 /* dimensions d une case (en pixels) */ L affichage du dessin sera effectué par la procédure : void dessinertaquin(int p[n + 2][N + 2]); Cette procédure doit faire appel aux sous-programmes de la bibliothèque graphsimple (voir annexe 9.5 page 120). Le programme doit à présent être compilé au moyen de la commande gccgraph (au lieu de gcc). Vous aurez plus particulièrement besoin des procédures suivantes : void Initialiser(int l, int h) pour ouvrir une fenêtre 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 écrire les valeurs des cases en effaçant ce qu il y a dessous (x et y représentent les coordonnées en pixels du centre de la case concernée). Exemple d utilisation : EcrireDessus(xc, yc, "7"); Remarque : pour la conversion d un entier compris entre 0 et 9 en une chaîne de caractères, on utilisera un tableau de 2 caractères que l on remplira soit en utilisant le codage ASCII du chiffre décimal correspondant à cet entier (en prenant garde de terminer la chaîne de caractères par le caractère spécial \0 ), soit au moyen de la procédure sprintf (taper man sprintf pour plus d informations). void AttendreClicXY(int *x, int *y, int *b) qui attend un clic de souris et enregistre ses coordonnées ainsi que le numéro du bouton cliqué dans les variables désignées par les paramètres *x, *y et *b. Attention : ces coordonnées sont représentées dans le repère graphique de l écran; il faut ensuite les convertir en coordonnées (i, j) d une case du tableau représentant le taquin. Exemple d utilisation : AttendreClicXY(&xx, &yy, &bouton); void Clore(void) pour fermer la fenêtre graphique. Exemple d utilisation : Clore(); 48

50 5.7. MANIPULATION DE FICHIERS CHAPITRE 5. SUJETS DE TP 5.7 Manipulation de fichiers Explication préalable Un fichier est un ensemble d informations stockées sur un périphérique d ordinateur, et repéré par un nom. Les données d un fichier ne s effacent pas lorsqu on coupe le courant, à la différence des valeurs des variables utilisées ordinairement pas les programmes. La communication entre l unité centrale et le périphérique, c est-à-dire entre le programme et le fichier, s effectue dans un sens bien déterminé, soit du périphérique vers l unité centrale (lecture), soit de l unité centrale vers le périphérique (écriture), mais pas dans les deux sens à la fois ; les données transitent séquentiellement (à la queue leu leu) depuis le fichier vers le programme, ou dans l autre sens. Les programmes utilisent des variables de type fichier, qui sont des structures permettant le lien entre le programme et le fichier proprement dit; ces structures doivent être renseignées (initialisées) 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 général une réservation de ce fichier par le programme, de façon à empêcher l action d un autre programme en même temps sur le meme fichier; c est pourquoi lorsqu il a terminé son action, le programme doit fermer le fichier afin d annuler la réservation du fichier. Les fichiers peuvent contenir toutes sortes d information, images, videos, sons, etc., mais on n utilisera ici que des fichiers de texte. Voici deux exemples de programmes, l un qui lit un fichier, et affiche le contenu à l écran, l autre qui lit un texte au clavier et écrit 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); /* arr^et 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 répétition pour lire tous les caractères du fichier l un après l autre; cette répétition s arrête lorsqu elle rencontre le caractère spécial EOF, qui indique la fin du fichier : End Of File signifie fin de fichier. La fonction fopen reçoit deux paramètres; le premier est le nom du fichier à ouvrir, le second est r (read : lecture) ou w (write : écriture); la fonction produit une variable de type fichier, qui représentera ensuite le fichier dans le programme; si la fonction ne trouve pas le fichier, elle produit la valeur NULL. #include <stdio.h> /* ce programme ecrit dans un fichier 49

51 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); /* écriture du caractere dans le fichier */ carac = getchar(); /* lecture au clavier du caractere suivant */ } } fclose(fic); /* fermeture du fichier */ return 0; Questions Les programmes des questions qui suivent vont lire et écrire des fichiers; il est important de créer un unique dossier pour ce TP, dans lequel on mettra TOUS les fichiers utilisés, les textes des exemples, les textes des programmes et les programmes compilés. Les programmes que vous écrivez doivent être testés 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 exécuter le programme de lecture de fichier fourni ci-dessus; l exécution doit faire apparaître à l écran le contenu du fichier exemple.txt. Modifier le programme pour qu il demande le nom du fichier à lire. Modifier le programme pour qu il saute une ligne à chaque fin de ligne rencontrée; on rappelle que le caractère de fin de ligne est codé \n en langage C. 2. Ecrire, enregistrer, compiler et exécuter le programme d écriture de fichier fourni ci-dessus. Tester au moins deux fois, avec différents textes : qu arrive-t-il au fichier exemple.txt? 3. Recopie Ecrire un programme copie qui demande le nom d un fichier à lire, le nom d un fichier à écrire, et recopie le contenu du premier dans le deuxième. 4. Fusion 1 Ecrire un programme qui lit deux fichiers source1 et source2, et qui recopie le contenu de source1, suivi du contenu de source2 dans un troisième fichier but. 5. Fusion 2 Ecrire un programme qui lit deux fichiers source1 et source2, et qui recopie un caractère de source1, suivi d un caractère de source2, suivi d un caractère de source1, etc. dans un troisième fichier but, jusqu à épuisement des deux fichiers sources. Voici une description plus précise : Tant qu aucun des deux, source1 et source2, n est épuisé lire un caractère de source1, l écrire dans but lire un caractère de source2, l écrire dans but /* Ici, la répétition s achève : un au moins des fichiers 50

52 5.7. MANIPULATION DE FICHIERS CHAPITRE 5. SUJETS DE TP source1, ou source2, est épuisé */ Recopier la fin de source1 Recopier la fin de source2 /* l un des deux est épuisé, mais on ne sait pas lequel */ 6. Fusion 3 Ecrire un programme qui lit deux fichiers source1 et source2, et qui les fusionne dans un troisième fichier but, ligne après ligne, c est-à-dire une ligne de source1, suivie d une ligne de source2, etc. 51

53 5.8. TRI AVEC SOUS-PROGRAMMES CHAPITRE 5. SUJETS DE TP 5.8 Tri avec sous-programmes Sujet du TP Le but de ce TP est d implémenter deux algorithmes de tri en utilisant des sous-programmes : le tri par sélection vu dans un TP précédent (cf. section 5.4 page 40) et le tri à bulles Structure des programmes L algorithme général qui sera implanté est bâti sur un modèle proche de celui vu pour le tri par sélection (la seule différence notable étant la définition de sous-programmes auxillaires) : lire le nombre n d éléments à trier initialiser le générateur aléatoire (facultatif) remplir le tableau à trier afficher les éléments du tableau non trié trier le tableau afficher les éléments du tableau trié Les constantes suivantes devront être définies : NMAX : nombre maximum d éléments à trier VALMIN : valeur minimale d un élément du tableau VALMAX : valeur maximale d un élément du tableau Remplissage du tableau Les n éléments du tableau à trier sont générés aléatoirement au moyen de la fonction hasard. On peut auparavant appeler la procédure initialiser_germe si l on souhaite obtenir la même série de valeurs à chaque exécution du programme. Définir une procédure remplirtableau qui affecte à chacun des éléments du tableau un entier tiré au hasard. Cette procédure a pour paramètres formels : tableau : le tableau d entiers à remplir nbelem : le nombre d éléments à initialiser dans le tableau Affichage du tableau Définir une procédure affichertableau qui affiche les éléments du tableau. Cette procédure a pour paramètres formels : tableau : le tableau d entiers à afficher nbelem : le nombre d éléments à afficher Tri par sélection Le principe du tri par sélection a déjà été présenté (cf. section page 41). Voici un rappel de l algorithme retenu : i parcourant [0,...,n 2] rechercher le minimum des éléments d indices i à n 1 échanger cet élément minimum avec l élément d indice i Réalisation Trois sous-programmes seront utilisés pour réaliser cet algorithme : 1. procédure echanger : intervertit deux éléments du tableau. Les paramètres formels de cette procédure sont : tableau : le tableau d entiers au sein duquel doit avoir lieu l échange 52

54 5.8. TRI AVEC SOUS-PROGRAMMES CHAPITRE 5. SUJETS DE TP u, v : les indices des éléments à échanger 2. fonction minimum : détermine l indice dans le tableau du plus petit élément se trouvant dans un intervalle d indices donné. Les paramètres formels de cette fonction sont : tableau : le tableau d entiers au sein duquel se trouve la valeur minimum recherchée bi, bs : les bornes de l intervalle d indices délimitant les éléments du tableau contenant le minimum cherché La valeur de la fonction est l indice du plus petit élément trouvé. 3. procédure triselect : effectue le tri selon l algorithme rappelé ci-dessus. Les paramètres formels de cette procédure sont : tableau : le tableau d entiers a trier nbelem : le nombre d éléments à trier Définir les trois sous-programmes permettant d effectuer le tri, puis écrire un programme complet trisel.c utilisant les sous-programmes auxillaires permettant de réaliser l algorithme général présenté en section ci-dessus. Visualisation graphique Dans cette partie du TP on remplace l affichage textuel (dans la console Unix) par un affichage graphique (dans une fenêtre séparée). Pour la représentation graphique du tableau et du processus de tri, on se reportera aux indications et consignes données dans l énoncé du TP Tri par sélection (voir section page 42). On rappelle que cette visualisation graphique repose sur l utilisation de la bibliothèque graphsimple (voir annexe 9.5 page 120) Tri à bulles Principe Le principe du tri à bulles est à la base le même que ceui du tri par sélection tel qu il est présenté en section page 41 : A chaque étape i, il faut placer en position i le plus petit entier se trouvant dans la partie non triée, c est à dire parmi les éléments d indices i à n 1. L algorithme du tri à bulles diffère du tri par sélection uniquement par la façon dont le plus petit élément de la partie non triée est ramené en position i : au lieu d effectuer une recherche de minimum, on permute successivement toutes les paires d éléments consécutifs qui ne sont pas dans le bon ordre. Par exemple, considérons la suite d entiers : S = [7, 5,3, 9]. On veut ramener en 1 ere position le plus petit élément de cette suite, ici la valeur 3. On parcourt la suite en sens inverse, depuis l avant-dernier élément jusqu au premier. A chaque étape on permute l élément d indice j avec l élément d indice j+1, si et seulement si S[j] > S[j+1]. Dans cet exemple, l algorithme se déroule en trois étapes : étape 1 : S 0 = [7, 5,3,9], 3 9 pas de permutation S 1 = [7, 5,3, 9]. étape 2 : S 1 = [7,5,3, 9], 5 > 3 permutation de 5 et 3 S 2 = [7,3, 5, 9]. étape 3 : S 2 = [7,3, 5, 9], 7 > 3 permutation de 7 et 3 S 3 = [3, 7, 5, 9]. Le plus petit élément de la suite est ainsi descendu petit à petit de sa position initiale (comme s il était le plus lourd) pour se retrouver finalement en 1 ere position. Dans cette version de l algorithme les bulles descendent, ce qui n est pas tout à fait conforme au comportement auquel on s attendrait de la part d une bulle 1! 1 On peut obtenir des bulles qui montent en inversant le sens des parcours de l algorithme principal et de l algorithme secondaire. 53

55 5.8. TRI AVEC SOUS-PROGRAMMES CHAPITRE 5. SUJETS DE TP Réalisation L algorithme principal du tri à bulles est donc : i parcourant [0,...,n 2] en utilisant l algorithme des bulles, placer en position i le plus petit des éléments d indices i à n 1 Définir une procédure placerminimum qui réalise l algorithme des bulles selon le principe présenté plus haut. Cette procédure a pour paramètres formels : tableau : le tableau d entiers auquel l algorithme des bulles doit être appliqué bi, bs : les bornes de l intervalle d indices délimitant les éléments du tableau auquels l algorithme doit être appliqué A la fin de l exécution de la procédure le plus petit élément de la partie du tableau délimitée par les indices bi et bs a été placé en position bi. Indication : cette procédure doit utiliser la procédure échanger. Ecrire un programme complet tribulles.c utilisant l algorithme du tri à bulles et structuré selon l algorithme général donné en section Visualisation du tri De la même manière que pour le tri par sélection, modifiez le programme tribulles.c pour visualiser de façon graphique le processus du tri à bulles, en prenant soin d utiliser chaque fois que possible les sous-programmes existants. 54

56 5.9. L ÉDITEUR GRAPHIQUE CHAPITRE 5. SUJETS DE TP 5.9 L éditeur graphique Nous proposons de réaliser un éditeur graphique simplifié. Pour dessiner, l utilisateur spécifie au clavier la forme qu il souhaite dessiner, puis avec la souris les coordonnées sur la zone de dessin. Par exemple, pour dessiner un rectangle, l utilisateur annonce qu il souhaite dessiner un rectangle au clavier, puis effectue deux clics souris dans la zone de dessin pour spécifier la taille et la position du rectangle à créer Dessiner une forme dans la zone de dessin Programme 1 : dessiner1.c Nous considérons trois formes de dessin possible : Rectangle, Cercle, Segment. Les dessins créés dans la zone sont rangés dans des tableaux. Nous considérons un tableau par forme de dessin. Nous avons donc trois tableaux. Afin de limiter la taille de ces tableaux, nous fixons à 10 le nombre maximum de dessins par forme. Modalité de dessin : 1- Pour un rectangle : L utilisateur saisit au clavier r, puis effectue deux clics souris dans la zone de dessin, qui définissent la diagonale du rectangle. Les coordonnées des deux points du rectangle (x1, y1) et (x1, y1 ) sont stockées dans le tableau. x1 y1 x1 y1 x2 y2 x2 y Pour un cercle : L utilisateur saisit au clavier c puis effectue deux clics souris dans la zone de dessin, qui définissent respectivement le centre et un point sur le cercle. Les coordonnées du centre (x1, y1) et le rayon du cercle rayon1 sont stockés dans le tableau. x1 y1 rayon1 x2 y2 rayon Pour un segment : L utilisateur saisit au clavier s puis effectue deux clics souris dans la zone de dessin, qui définissent les deux extrémités de la segment. Les coordonnées des deux extrémités (x1,y1) et (x1, y1 ) sont stockées dans le tableau. x1 y1 x1 y1 x2 y2 x2 y2... Les déclarations correspondantes sont les suivantes : #define MaxForme 10 /* Nb maximum de formes autorisées */ #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 écrire les fonctions et procédures suivantes : 55

57 5.9. L ÉDITEUR GRAPHIQUE CHAPITRE 5. SUJETS DE TP 1- Fonction afficher menu : Cette fonction affiche un menu dans la fenêtre de l interpréteur de commandes et retourne le caractère saisi par l utilisateur. On pourra effectuer la saisie à partir de la fenêtre graphique en utilisant les fonctions TestClavier et Touche (au lieu de passer par la fenêtre de l interpréteur de commandes en utilisant un scanf ). La fonction afficher menu doit vérifier que l utilisateur saisisse un caractère valide. Le menu doit proposer des choix possibles pour l utilisateur. Par exemple si l utilisateur a déjà créé 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 déjà dessiné 10 rectangles, 10 cercles et 10 segments, la seule option restante consiste à quitter l application. La forme du menu pourrait être alors : Voulez-vous quitter l application : tapez la touche q Entrez votre choix : Nous suggérons l introduction d une fonction intermédiaire (choix valide) qui vérifie que la touche saisie par l utilisateur est valide. 2- Procédure creer rectangle Pour dessiner un rectangle, deux clics souris doivent être effectués. La procédure CliquerXY permet d attendre un clic souris et d obtenir les coordonnées (x, y) de ce clic. La procédure creer rectangle range le nouveau rectangle ainsi créé dans le tableau correspondant et le dessine à l écran. Le tableau et le nombre de rectangles étant modifiés, il faut utiliser un passage de paramètres par référence. Déterminer la signature (en-tête) de cette procédure. Réaliser la procédure. 3- Procédure creer cercle Pour dessiner un cercle, deux clics souris doivent être effectués. Le rayon du cercle doit être calculé. La procédure creer cercle range le nouveau cercle ainsi créé dans le tableau correspondant et le dessine à l écran. Le tableau et le nombre de cercles étant modifiés, il faut utiliser un passage de paramètres par référence. Déterminer la signature de cette procédure. Réaliser la procédure. 4- Procédure creer segment Pour dessiner un segment, deux clics souris doivent être effectués. La procédure creer segment range le nouveau segment ainsi créé dans le tableau correspondant et le dessine à l écran. Le tableau et le nombre de segments étant modifiés, il faut utiliser un passage de paramètres par référence. Déterminer la signature de cette procédure. Réaliser la procédure. 5- Programme principal de dessiner1 En utilisant les fonctions et procédures ci-dessus, réaliser le programme principal. 56

58 5.9. L ÉDITEUR GRAPHIQUE CHAPITRE 5. SUJETS DE TP Formes élastiques Programme 2 : dessiner2.c Dupliquer le fichier dessiner1.c en le nommant dessiner2.c. Lorsque nous créons un dessin, nous voulons cette fois que la forme suive le curseur lors de la création jusqu à l occurrence d un deuxième clic souris. Par exemple, si l utilisateur crée un rectangle : 1- L utilisateur saisit la touche r. 2- L utilisateur effectue un clic souris. A partir de ce point, un rectangle est affiché et suit la position du curseur jusqu à ce que l utilisateur effectue le deuxième clic. Ce mécanisme s appelle forme élastique (par analogie avec la déformation d un élastique). 3- A l occurrence du deuxième clic souris le rectangle est créé. 6- Modifier les procédures creer rectangle, creer cercle et creer segment pour afficher les formes élastiques correspondantes. La fonction GlisserXY permet d obtenir les coordonnées (x, y) de la souris lorsqu elle se déplace. int GlisserXY(int *x, int *y); Une solution pour réaliser la forme élastique consiste à : Attendre un clic souris (procédure CliquerXY) Tant qu il n y a pas de deuxième clic souris (procédure Clic) Récupérer les coordonnées de la souris à chaque mouvement (procédure GlisserXY) Effacer la fen^etre et ré-afficher toutes les formes. Afficher la forme à la nouvelle position. Stocker la nouvelle forme et mettre à jour le compteur correspondant. Le traitement s arrête lorsqu un deuxième clic souris est reçu. La fonction Clic permet de savoir si un des boutons de la souris a été enfoncé sans bloquer le programme. Puisque l on affiche toutes les étapes de dessin, on est obligé de ré-afficher toutes les formes à chaque étape. Il est conseillé d utiliser une procédure afficher tout qui efface entièrement la fenêtre graphique (procédure Effacer) et affiche toutes les formes déjà créées Destruction d un dessin dans la zone Programme 3 : dessiner3.c Dupliquer le fichier dessiner2.c en le nommant dessiner3.c. Nous proposons de rajouter une fonction de destruction à notre éditeur. Il s agit tout d abord de rajouter un choix dans notre menu qui correspond à la destruction. Cette destruction se fait par sélection avec la souris du dessin à détruire. 7- Modifier la fonction afficher menu pour rajouter l option détruire. 8- Ecrire la procédure détruire. Cette procédure détruit un dessin qui a été désigné par un clic souris. A partir des coordonnées du clic, il s agit de parcourir les tableaux pour déterminer quel dessin a été sélectionné. Quand plusieurs figures se chevauchent, la priorité sera donc donnée par l ordre dans lequel on effectue les différents parcours. Pour cela nous suggérons la réalisation de trois fonctions intermédiaires : - XYestDansRect (un point, un rectangle) qui rend vrai si le point est à l intérieur du rectangle. - XYestDansCercle (un point, un cercle) qui rend vrai si le point est à l intérieur du cercle. - XYappartientSegment (un point, un segment) qui rend vrai si le point appartient au segment. (Remarque : à cause de l imprécision du tracé et des coordonnées du clic dans la fenêtre graphique, 57

59 5.9. L ÉDITEUR GRAPHIQUE CHAPITRE 5. SUJETS DE TP prévoir une marge de tolérance pour cette fonction) A la destruction d un dessin d une forme donnée, le tableau et le nombre de dessins de la forme doivent être mis à jour. Une fois supprimée du tableau, on peut appeler la procédure afficher tout pour mettre à jour le dessin. Nous suggérons pour la mise à jour du tableau un décalage vers la gauche pour ne pas laisser de cases libres dans le tableau. 9- Modifier le programme principal pour prendre en compte la nouvelle option détruire. 58

60 Chapitre 6 Projets 6.1 Jeu d échecs Principe : le jeu est représenté par un tableau 2D d entiers 8x8. Le chiffre des dizaines correspond à la couleur (1=blanc, 2=noir) et le chiffre des unités au type de pièce (1=pion, 2=tour, 3=cavalier, 4=fou, 5=reine, 6=roi). Un entier nul correspond à une case vide. Pour savoir si une case est blanche ou noir, il suffit de faire la somme des coordonnées de la case : blanc pour une somme paire, noir pour une somme impaire. Exemple de plateau : Librairies : <stdio.h>, <stdlib.h>, et en mode graphique graphsimple.h Variables globales : plateau de jeu : à quel joueur de jouer? (1=blc, 2=noir) type de joueur (1=ordi, 2=humain) : case 0 non utilisée, case 1=blancs, case 2=noirs fin de partie (1=blcs gagnent, 2=noirs gagnent, 3= pat, 4=abandon) : int Plateau[8][8]; int tour=1; int type[3]; int finpartie=0; int main () Cette fonction : appelle la procédure Init tant que la finpartie==0 : si type[tour]==1 appelle joueordi(tour) sinon appelle jouehumain(tour) affiche le plateau 59

61 6.1. JEU D ÉCHECS CHAPITRE 6. PROJETS si tour==1 tour prend la valeur 2, sinon tour prend la valeur 1. appelle la procédure Fin void Init () Cette procédure : initialise le mode graphique (en mode graphique seulement) affiche (éventuellement) un message ou un écran 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 à l aide de la fonction hasard (voir livret rouge)) affiche le plateau void Fin () Cette procédure : affiche un message approprié selon la valeur de FinPartie clot le mode graphique (en mode graphique seulement) void joueordi (int tour) Cette procédure déclare un plateau S de taille 2*16 qui stocke les coordonnées de toutes les pièces du plateau dont la dizaine vaut tour, un entier max et deux tableaux Coup et CoupMax 2x2 d entiers. Puis elle : calcule S et le nombre de pièces restantes dont la dizaine vaut tour appelle calculescoremax pour la première pièce de S (avec CoupMax), stocke le résultat dans max pour chaque pièce 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 procédure prend comme paramètre une pièce (référencée par ses coordonnées sur le plateau) et un coup (référencé par deux couples de coordonnées). Le plateau coup est non rempli au départ. Elle déclare de plus un tableau touscoups de 2x27 entiers (car une pièce a au plus 27 déplacements possibles), 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 résultat dans scoremax et le couple dans coupmax pour chaque couple de touscoups, appelle calculescore (avec unepiece), stocke le résultat 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 procédure prend comme paramètre une pièce (référencée par ses coordonnées sur le plateau), un tableau vide de cases du plateau ou est censée pouvoir aller cette pièce (vide au début) et un entier qui sera rempli avec le nombre de cases du tableau coups rempli à la fin. Elle déclare de plus un plateau PlateauTemp[8][8] d entiers, qui contiendra le plateau une fois chaque coup joué. *nbcases est mis à 0. Selon le type de piece, la procédure essaye les différents coups ; pour chaque coup a priori possible (c est à dire tel que la pièce peut aller sur la case), un plateau de jeu PlateauTemp contenant la nouvelle configuration est généré à partir de Plateau. Si testechec(plateautemp, 60

62 6.1. JEU D ÉCHECS CHAPITRE 6. PROJETS tour) est égal à 0, c est à dire si le fait de jouer cette pièce ne met pas le joueur en échec, ce coup est ajouté à coups et *nbcases est augmenté de 1. int calculescore (int piece[2], int nouvellecase[2]) Cette fonction calcule le score d un coup. C est la seule fonction à changer pour changer la stratégie de l ordinateur. Une possibilité serait : si ce coup met l adversaire en échec et mat (créer un nouveau plateau et tester si testechec donne comme résultat 2), le résultat est 1000 si ce coup met l adversaire en échec, le résultat est 100 si ce coup crée une reine, le résultat est 50 si ce coup permet un roque, le résultat est 10 si ce coup prend : la reine de l adversaire, le résultat est 20 une tour : 5 un fou, un cheval : 4 un pion : 3 sinon, le résultat est de 1 int testechec (int P[8][8], int T) Cette procédure teste si le plateau de jeu P reflète une situation d échec, pour les blancs si T==1, pour les noirs si T==2. Le résultat est 1 s il y a échec et 2 s il y a échec et mat, 3 s il y a pat, 0 dans le cas contraire. Sachant qu il y a échec, pour savoir s il y a échec et mat, pour chaque coup que peuvent faire les blancs si T==1 ou les noirs si T==2 (procedure calculecoups), on crée un nouveau plateau de jeu et on teste si testechec appelé avec le nouveau plateau et T est différent de 0. Si le résultat est différent de 0 pour toutes les pièces, il y a échec et mat. void jouehumain (int Tour) Cette procédure : calcule s il y a pat (testechec vaut 3), si oui finpartie est mis à 3, sinon : 1. demande au joueur d entrer deux couples de coordonnées, un pour la case de départ et un pour la case d arrivée 2. calcule l ensemble E des coups jouables par le joueur Tour (proc. calculecoups) avec la pièce de départ si le coup correspondant n est pas dans E, recommencer l étape 1. s il y a échec et mat, le joueur a gagné, si oui finpartie est mis à Tour 61

63 6.2. NUAGES DE PARTICULES CHAPITRE 6. PROJETS 6.2 Nuages de particules Principe : ce projet a pour but de visualiser une simulation numérique de l évolution d un nuage de particules. Le nuage de particules est représenté par un tableau de 6 lignes (la position du point sur l écran, son vecteur vitesse et son vecteur accélération) et un grand nombre de colonnes (une colonne par particule). Les positions des particules sont calculées toutes les unités de temps et affichées sur l écran. Les particules sont en interaction de masse avec les autres particules, soit une accélération (simplifiée) de a i = pos j pos i pos j i j pos i 3 Librairies : <stdio.h>, <stdlib.h>, <time.h>, <math.h> et graphsimple.h Constantes : DIAM MIN NBPART DELAI NBZONES XMAX, YMAX Diamètre minimal du nuage Nombre de particules Temps (en ms) à attendre entre deux affichages du nuage Nombre de zones de densités différentes Dimensions de la fenêtre en pixels int main () Cette fonction : initialise les positions, vitesses et accélérations des particules (procédure Init) affiche le nuage (procédure affichenuage) attend DELAI ms (procédure usleep, prédéfinie) tant que le diamètre du nuage est supérieur à DIAM MIN (fonction diametre) : calcule les nouvelles positions de chaque particule à partir de sa position prédédente, de sa vitesse et de son accélération (procedure calcule Pos) calcule les nouvelles accélérations de chaque particule à partir des nouvelles positions (procédure calcule Acc) calcule les nouvelles vitesses à partir des nouvelles accélérations (procédure calcule Vit) affiche le nouveau nuage de particules (procédure affichenuage) attend DELAI ms termine le programme (procédure Fin) void Init (float nuage[6][nbpart]) Cette procédure : initialise le mode graphique initialise nuage de la façon suivante : toutes les vitesses sont nulles demande à l utilisateur d effectuer NBZONES fois : deux clics qui délimitent une zone sur l écran entre (x1, y1) et (x2, y2) d indiquer la densité de particules dans cette zone (nombre entre 1 et 100) ces données sont mémorisées dans un tableau tab 6xNBZONES d entiers construit ainsi : 62

64 6.2. NUAGES DE PARTICULES CHAPITRE 6. PROJETS Zone 0 Zone 1 Zone 2... Zone NBZONES-1 x y x y densité densité cumul Pour chacune des NBPART particules : un nombre nb est généré aléatoirement entre 1 et 100 ce nombre détermine la zone i de la particule, qui est telle que tab[6][i-1] nb tab[6][i] (attention au cas particulier de la première zone) ensuite deux entiers sont tirés 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 été calculées, les accélérations doivent être calculées à leur tour (procédure calcule Acc) void Fin () Cette procédure clot le mode graphique. void calcule Pos (float nuage[6][nbpart]) Cette procédure calcule, pour chaque particule, sa position à partir de son ancienne position et de sa vitesse courante à l aide de la formule (simplifiée) : M nouveau M ancien + vitesse void calcule Vit (float nuage[6][nbpart]) Cette procédure calcule, pour chaque particule, sa vitesse à partir de son ancienne vitesse et de son accélération courante à l aide de la formule (simplifiée) : vitesse nouveau vitesse ancien + acceleration void calcule Acc (float nuage[6][nbpart]) Cette procédure calcule, pour chaque particule i, son accélération à partir des positions de toutes les particules à l aide de la formule (simplifiée) : a i = j i float diametre (float nuage[6][nbpart]) pos j pos i pos j pos i 3 Cette procédure calcule la plus grande distance entre deux particules dans le nuage, et retourne ce résultat. 63

65 6.3. COLLISIONS DE PARTICULES CHAPITRE 6. PROJETS 6.3 Collisions de particules Principe : ce projet a pour but de visualiser une simulation numérique de l évolution d un ensemble de particules quantiques. La déviation de ces particules par action distante est supposée négligeable, cette modélisation s intéresse principalement aux collisions. L ensemble des particules est représenté par un tableau de 6 lignes (la position du point sur l écran, son vecteur vitesse, le type de particule et la particule avec laquelle elle est (éventuellement) en collision et autant de colonnes que de particules. Les positions des particules sont calculées toutes les unités de temps et affichées sur l écran. Librairies : <stdio.h>, <stdlib.h>, <time.h>, <math.h> et graphsimple.h Constantes : DIAM PART NBPART DELAI XMAX, YMAX Diamètre d une particule (en pixels) Nombre de particules Temps (en ms) à attendre entre deux affichages successifs Dimensions de la fenêtre en pixels int main () Cette fonction : déclare un tableau DejaVu d entiers contenant autant de colonnes que de particules initialise les positions, vitesses et types des particules (procédure Init) attend DELAI ms (procédure usleep, prédéfinie) tant qu il reste une particule sur l écran (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 marquée en collision (6ème ligne du tableau), appelle calculepropsans si elle est marquée en collision, appelle calculepropavec pour elle-même et l autre particule intervenant dans la collision remplit la ou les cases de DejaVu concernée(s) avec un 1 teste s il y a des particules en collision (fonction encollision); si oui, met dans la 6ème ligne du tableau, aux colonnes concernées, le numéro de l autre particule en collision. affiche les partiules dans leur nouvelle configuration (procédure affichepart) attend DELAI ms termine le programme (procédure Fin) void Init (float nuage[6][nbpart]) Cette procédure : initialise le mode graphique initialise les particules de la façon suivante : NBPART fois : demande à l utilisateur de cliquer sur l écran pour indiquer la pos. d une particule remplit la case de nuage correspondante dessine la particule (AfficheUnePart) demande à l utilisateur de cliquer sur l écran pour indiquer la vitesse de la particule remplit la case de nuage correspondante dessine le vecteur vitesse (AfficheUneVitesse) met à jour le type de la particule teste s il y a des particules en collision (fonction encollision); si oui, met dans la 6ème ligne du tableau, aux colonnes concernées, le numéro de l autre particule en collision. 64

66 6.3. COLLISIONS DE PARTICULES CHAPITRE 6. PROJETS attend DELAI ms void Fin () Cette procédure clot le mode graphique. void calculepropsans (int indice) Calcule la nouvelle position de la particule d indice indice à l aide de son ancienne position et de sa vitesse, sachant que cette particule n est pas en collision, à l aide de la formule (simplifiée) : M nouveau M ancien + vitesse void calculepropavec (int indice1, int indice2) Calcule les nouvelles propriétés (position, vitesse, type) des particules d indices indice1 et indice2 à l aide de leurs anciennes propriétés. Attention, il faut que les positions des deux particules après l appel à cette procédure soient distantes d au moins DIAM PART (i.e. qu elles ne soient plus en collision). Les nouvelles vitesses des particules 1 et 2 pourront être calculées à l aide des formules (simplifiées) : { v 1 = 1 w 1+w v 1 + 2w 1+w v 2 v 2 = 2 1+w v 1 1 w 1+w v 2 avec w = m2 m 1, rapport des masses des deux particules. Si ces masses sont égales, les formules deviennent : { v 1 = v 2 v 2 = v 1 autrement dit les deux vitesses s échangent. Concernant les positions, chaque particule est déplacée d une quantité x fois sa nouvelle vitesse, avec x > d(d DIAMPART) ( v 1 v 2 ). O 1 O 2 où O 1 et O 2 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 écran, 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 i et j de nuage est inférieure à DIAM PART, 0 sinon. void affichepart (float nuage[6][nbpart]) Cette procédure appelle, pour chaque colonne du tableau nuage : la procédure afficheunepart la procédure afficheunevitesse void afficheunepart (float nuage[6][nbpart], int j) Cette procédure affiche un disque sur l écran aux positions de la particule représentée par la 65

67 6.3. COLLISIONS DE PARTICULES CHAPITRE 6. PROJETS colonne j du tableau nuage, et de diamètre DIAM PART. void afficheunevitesse (float nuage[6][nbpart], int j) Cette procédure affiche une flêche partant de la position de la particule, représentant le vecteur vitesse de la particule représentée par la colonne j du tableau nuage. 66

68 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, où deux joueurs joueront alternativement. Pour cela, nous utiliserons l environnement graphique défini dans graphsimple.h (explicité à la fin du polycopié). Pour réaliser un projet correct, il est important de procéder par étapes, et de tester son programme avant chaque nouvelle étape. Vous serez très libres dans vos choix de programmation; cela dit, ce document devrait vous permettre de guider vos premiers pas... Rappelons qu on joue aux dames sur un damier de taille 10*10 : Chaque joueur possède 20 pions de sa couleur, et on se déplace en diagonale uniquement. Dans un premier temps, il est bon de penser à la façon de modéliser ce jeu sous forme informatique. Il paraît tout à fait adapté d utiliser un tableau d entiers à deux dimensions, de taille 10*10, dans lequel on pourra par exemple stocker la valeur 1 dans la case (i,j) si le joueur blanc possède un pion sur la case correspondante du damier, la valeur 2 si c est un pion noir, et 0 si la case n est pas occupée. D autres variables de jeu seront sûrement à définir pour simplifier l accès à certaines données, comme par exemple le nombre de pions restant pour chacun des joueurs. Ecrire une première procédure initialiser damier(int u[n][n]) qui définit la position initiale des pions. Le premier aspect à considérer est l aspect graphique. A l aide de la librairie graphsimple.h, votre programme doit ouvrir une fenêtre graphique de taille 600*600. Le damier va occuper une place de taille 500*500 sur cette fenêtre (carré compris entre les points de coordonnées (0,0) et (500,500)). Construisez une procédure afficher damier() qui affiche dans la fenêtre graphique une grille de jeu de taille 10*10. Puisque le damier aura une taille de 500*500, la taille de chaque case sera donc de 50*50. Testez cette première procédure dans votre main() Il y a aussi la question de l affichage des pions; pour cela, on pourra utiliser les procédures Cercle et CerclePlein de l environnement graphique. On passera en paramètre un rayon de 20, et en ce qui concerne les coordonnées du centre, on a besoin de connaître abscisse et ordonnée d une case (i,j) du damier. Une idée est de créer deux fonctions : int abscisse du centre(int ligne, int colonne) et int ordonnee du centre(int ligne, int colonne), qui retournent respectivement abscisse et ordonnée du centre de la case de coordonnées (ligne,colonne). On peut alors créer une procédure afficher pion(int ligne, int colonne, int couleur) qui affiche un pion dans la case passée en paramètre, de couleur blanche si couleur=0, et noire si couleur=1 (par exemple). Créez de la même façon une procédure effacer pion(int ligne, int colonne, int couleur). Déplacements des pions : le joueur doit tout d abord cliquer sur une des cases, votre programme doit vérifier qu un pion de la bonne couleur est présent à cet emplacement (si ce n est pas le cas, il doit demander au joueur de recommencer), puis le joueur clique sur une deuxième case, qui correspond au déplacement du pion. Dans le cas où votre pion peut manger plusieurs pions d adverses 67

69 6.4. JEU DE DAMES CHAPITRE 6. PROJETS d affilée, l utilisateur cliquera sur les cases correspondantes au fur et à mesure. Pour valider un coup, on demandera par exemple à l utilisateur de cliquer à l extérieur du damier : cela permet de savoir à quel moment on change de joueur. Pour récupérer les coordonnées d un clic de l utilisateur, on utilisera la procédure CliquerXY(int *x, int *y). Bien entendu, il faut transformer les coordonnées en pixels en indices de lignes et colonnes, en créant par exemple une méthode CliquerLigneColonne(int *ligne, int *colonne). Votre procédure donnera les valeurs -1 aux paramètres si le clic est en dehors du damier. Une fois la gestion graphique effectuée, votre programme devra assurer (dans cet ordre) : que les joueurs ne peuvent pas tricher la promotion d un pion en dame la règle souffler n est pas jouer, i.e. si un joueur ne mange pas un pion alors qu il le pouvait, son adversaire lui en ôte un. Squelette du programme principal (on suppose que l utilisateur ne triche pas, il manque les affichages, le cas où des pions sont mangés n est pas traité + la gestion du damier) : #include <stdio.h> #include graphsimple.h #define N 10 int 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 gérer les modifications du damier iprec=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 que Clore(); } 68

70 6.5. TOUT NOIR TOUT BLANC CHAPITRE 6. PROJETS 6.5 Tout noir tout blanc Un problème mathématique : le jeu du tout noir, tout blanc. Le support : une grille à m lignes et n colonnes avec des cases pouvant prendre deux couleurs (noir ou blanc). Au départ, toutes les cases sont noires. En retournant une case, le joueur en change sa couleur ainsi que celle de ses quatre voisines (nord, sud, est, ouest). Le but du jeu est de rendre la grille toute blanche. Exemple sur une grille 5*5 Projet : construire une telle zone de jeu, où l utilisateur qui clique sur une case en change la couleur ainsi que celle des voisines. Proposer des variantes avec d autres règles de jeu, ou des configurations initiales aléatoires. Programmer un algorithme de recherche des solutions de ce problème pour des tailles de grille convenables. L objectif est de vous laisser très libres quant à vos choix de programmation, vos créations de fonctions, et vos idées de résolution de ce problème. Ce papier a pour but de vous décrire le travail attendu, ainsi que de vous fournir un support pour guider vos premiers pas. 1ère partie : la programmation graphique et le jeu. Vous utiliserez l environnement graphique du DLST associé à la librairie graphsimple.h. Deux grilles seront à gérer parallèlement : la grille de jeu (celle qui apparaîtra à l écran), accessible en cliquant sur la souris, et la grille interne, qu on pourra modéliser par un tableau à deux dimensions de taille m*n, et qui stockera l état de chaque case (on mettra par exemple 0 pour les cases noires et 1 pour les blanches). Les variables m et n pourront être déclarées comme globales. A l exécution, votre programme pourra demander au début de rentrer au clavier les entiers m et n, puis vous pourrez déclarer votre grille interne int grille[m][n]. Ecrire ensuite une procédure initialiser 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 fenêtre graphique de taille ((m+1)*50,(n+1)*50) à l aide de la fonction Initialiser de la librairie. Votre grille va occuper une place de taille 50m 50n pixels sur cette fenêtre, la bande restante pouvant être utilisée pour afficher certains paramètres du jeu. Chaque case de ce tableau aura donc une taille de 50*50 pixels. Construisez alors une procédure afficher grille() qui affiche à l écran la zone de jeu avec des cases noires (vous pourrez utiliser pour cela les procédures RectanglePlein et ChangeCouleur ). Testez-la dans votre fonction principale. Pour récupérer les coordonnées d un clic de l utilisateur, on utilisera la procédure CliquerXY(int *x, int *y). Bien entendu, il faut transformer les coordonnées en pixels en indices de lignes et colonnes, en créant par exemple une méthode CliquerLigneColonne(int *ligne, int *colonne). On pourra ensuite créer une procédure appliquer règle(int ligne, int colonne), qui fait changer la couleur de la case grille[ligne][colonne], ainsi que celle de ses voisines. Votre programme pourra aussi afficher à l écran GAGNE lorsque toutes les cases seront devenues blanches, proposer à l utilisateur de recommencer en cliquant sur une zone précise de la fenêtre 69

71 6.5. TOUT NOIR TOUT BLANC CHAPITRE 6. PROJETS graphique, ou encore de marquer d un point rouge les cases ayant été cliquées un nombre impair de fois (celles-ci permettent en effet de reconstituer la solution du problème). 2ème partie : Extensions du jeu On peut définir d autres règles de retournement des cases. En voici trois autres, que vous pourrez proposer à l utilisateur en début de programme : Vous êtes tout à fait libres d en inventer d autres... Une autre option de jeu est d introduire une configuration aléatoire au départ, au lieu de n avoir que des cases noires. A l aide du générateur aléatoire habituel, et si l utilisateur le souhaite, configurez la grille de départ avec un mélange quelconque de cases noires et blanches. 3ème partie : Recherche de solutions Au lieu du mode jeu, votre programme pourra proposer à l utilisateur de résoudre le problème lui-même. A vous de suggérer un algorithme le plus léger possible pour réduire le temps de calcul au maximum. L affichage d une solution pourra se faire comme précédemment en marquant d un point rouge les cases à cliquer. Cherchez également des solutions dans le cas des nouvelles règles ou lorsque la configuration de départ est aléatoire. Attention, l existence de solutions n est pas garantie dans tous les cas... 70

72 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 été étudié en 2002 par des chercheurs du MIT (Demaine et al.), et qui présente des propriétés très intéressantes dans le domaine des jeux combinatoires. A l heure actuelle, nous ne connaissons que très peu de résultats à son sujet. Ce jeu est défini de la façon suivante : sur une grille n*m, on dispose arbitrairement des pierres noires et blanches, comme l illustre l exemple ci-dessous. Il y a un seul joueur et les règles sont les suivantes : le joueur choisir une pierre, et va capturer une pierre voisine (située horizontalement ou verticalement) de l autre couleur. La pierre capturée est retirée du jeu, et l autre pierre prend sa place. Le joueur répète cette action tant que cela est possible. L objectif est de minimiser le nombre de pierres restantes à la fin du jeu. Exemple d exécution sur une grille 1*5 : Nous vous demandons dans un premier temps de créer une interface de jeu qui permette à un utilisateur de jouer. L utilisateur devra au préalable rentrer au clavier la taille (longueur et largeur) de la grille sur laquelle il souhaite jouer, puis votre programme génèrera une disposition aléatoire des pierres. Ensuite, l utilisateur pourra capturer les pierres de la façon 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 les pierres sont bien de couleurs différentes et situées sur des cases voisines, effectuer la capture. Sinon, annuler le coup et recommencer. Lorsque l utilisateur n a plus la possibilité de jouer, il faut le lui faire remarquer en indiquant un message fin du jeu. Votre programme devra ensuite afficher ensuite son score, c est-à-dire le nombre de pierres restantes sur la grille. N.B : Pour constuire une telle interface de jeu, vous aurez sans doute besoin, en plus de la grille graphique, d un tableau à deux dimensions qui stockera ce que contient chaque case de la grille. 71

73 6.6. CLOBBER CHAPITRE 6. PROJETS On pourra par exemple attribuer la valeur 0 pour les cases qui contiennent une pierre blanche, 1 pour celles qui contiennent une pierre noire, et 2 pour les cases ne contenant aucune pierre. 2) Résolution du problème sur une seule ligne On considère le jeu sur une grille 1*m (cf. exemple ci-dessus). Etant donnée n importe quelle disposition des pierres, le problème consiste à déterminer le nombre minimum de pierres que l on peut laisser à la fin (et si possible, savoir comment jouer pour y arriver). On vous demande tout d abord de réfléchir à la forme des configurations pour lesquelles on peut laisser une seule pierre à la fin (celle de l exemple ci-dessus en est une). On appelle ces configurations de jeu des configurations 1-réductibles. a) Construire ensuite un programme qui demande à l utilisateur la longueur de la ligne de jeu, puis qui affiche une configuration aléatoire de cette longueur. Votre programme doit ensuite dire si cette configuration est 1-réductible ou non. b) Si la configuration n est pas 1-réductible, proposez alors un algorithme qui essaie de minimiser le nombre de pierres restantes à la fin (on ne vous demande pas forcément un algorithme qui calcule la valeur optimale, mais qui essaie au moins de s en approcher 2026). Votre programme devra afficher la solution calculée. 3) Améliorations du jeu initial. - Permettre à l utilisateur de recommencer le jeu et d améliorer son score. La configuration initiale aléatoire doit donc être sauvegardée. Dans ce cas, afficher le meilleur score de l utilisateur sur cette configuration. - Changer de règles : la version originale du jeu (Demaine et al., 2002) prévoit que le joueur doit alternativement capturer une pierre blanche puis une noire. Votre programme doit maintenant incorporer cette règle. Il demandera initialement à l utilisateur s il souhaite jouer avec la première ou la seconde règle. 72

74 Chapitre 7 Résumé de cours et exercices 7.1 Types, variables, constantes, expressions, opérateurs, instructions Le type d une donnée est la nature de la valeur qu elle contient. Les mots-clés utilisés en C pour traduire les différents types sont les suivants 1 : Type Traduction Exemple Entier int 30 Réel double Caractère char a Chaîne de caractères char*; char[]; char[n] Hello Booléens int (0=faux, 0=vrai) 0 Pointeur type* (type=type de valeur pointée) &a (a : variable) Une variable est un objet symbolique qui contient une valeur modifiable. En C, le type d une variable est fixé une fois pour toutes. La déclaration d une variable permet de faire connaître son type au système. Elle est obligatoire et peut se faire de deux façons, suivant que l on connaît sa valeur initiale ou non. Soit par exemple à déclarer la variable entière x : on ne connaît pas sa valeur initiale : int x; on connaît sa valeur initiale (0 par exemple) : int x = 0 ; Après la déclaration, l affectation d une valeur à la variable se fait à l aide du signe = (par exemple, x=1;). Lorsque certaines valeurs constantes sont utilisées à plusieurs reprises, il peut être utile de leur donner un nom. Ceci se fait à l aide de la commande define (par exemple, #define PI ). Une expression est une formule qui peut être évaluée 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 combinant des variables, des opérateurs, des appels à fonctions et des parenthèses. La table ci-dessous décrit l ordre de priorité des opérateurs élémentaires. 1 Il est aussi possible de définir ses propres types à l aide de la commande typedef. 73

75 7.1. TYPES, VARIABLES,... CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES Priorité Opérateurs Symbole associativité 1 fonction ( ) 1 tableau [ ] 1 champ de structure ->. 2 négation booléenne! 2 négation bit à bit 2 incrémentation ++ 2 décrémentation unaire unaire + 2 indirection * 2 adresse & 2 taille sizeof 3 casting (type) 4 multiplication * 4 division / 4 modulo % 5 addition + 5 soustraction - 6 décalages << >> 7 relations logiques < <= > >= 8 égalité ==!= 9 ET bit à bit & 10 OU exclusif bit à bit ^ 11 OU bit à bit 12 ET booléen && 13 OU booléen 14 opérateur conditionnel? : 15 affectations(1) = *= /= %= 15 affectations(2) += -= <<= >>= 15 affectations(3) &= ^= = 16 séquence, Fig. 7.1 Ordre de priorité des opérateurs Une expression booléenne est une expression qui est soit vraie, soit fausse. Les expressions booléennes peuvent être combinées par des opérateurs logiques pouvant tous être définis à partir des opérateurs suivants : la négation! ; si x est vrai alors!x est faux et réciproquement. 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 parenthèses () permettent de regrouper les expressions logiques Les règles suivantes permettent de simplifier certaines expressions booléennes :!(x&&y) = (!x) (!y)!(x y) = (!x)&&(!y) (x 1 &&x 2 ) (y 1 &&y 2 ) = (x 1 y 1 )&&(x 1 y 2 )&&(x 2 y 1 )&&(x 2 y 2 ) (x 1 x 2 )&&(y 1 y 2 ) = (x 1 &&y 1 ) (x 1 &&y 2 ) (x 2 &&y 1 ) (x 2 &&y 2 ) Une autre méthode pour simplifier une expression booléenne consiste à écrire sa table de vérité 2 2 une table de vérité décrit l ensemble des valeurs prises par l expression en fonction des valeurs de ses éléments 74

76 7.1. TYPES, VARIABLES,... CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES et à la comparer à des tables de vérité connues. Enfin, une instruction est une action à effectuer, comme printf("bonjour \n");. Lorsqu une instruction est constituée d une expression suivie d un point-virgule, comme a=3; ou printf("bonjour \n"); on parle d instruction-expression Exercice : expression logique Ecrire l expression logique : l entier n est multiple de 4 ou multiple de 6 (indication : considérer le reste de la division euclidienne de a par b (a%b)) Exercice : opérations logiques 1. Compléter les tables de vérité des expressions à valeur booléennes suivantes. a non a a==vrai a==faux 1 vrai 2 faux a b a et b a ou b 3 vrai vrai 4 faux vrai 5 vrai faux 6 faux faux 2. Déduire de ce qui précède une simplification de chacune des deux expressions suivantes : expression 7 a == vrai 8 a == faux forme simplifiée 3. Donner une expression équivalente de chacune des expressions suivantes, en utilisant les opérateurs non et ou mais sans utiliser l opérateur et : expression 9 non a et non b 10 a et b expression équivalente Exercice : Simplifications booléennes Démontrez les règles de simplification présentées à la page précédente. 75

77 7.1. TYPES, VARIABLES,... CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES Exercice : opérateurs arithmétiques et logiques Contexte Expression Type (en C) Valeur a 4, b 7 a + b a 4, b 2.3 a + b a 1, b 2, c 3 a (b c) a 1, b 2, c 3 (a b) c a 1, b 2, c 3 a b c a 10, b 3 a/b a 10, b 3 a%b a 10, b 3.0 a/b a 10, b 3.0 a%b a -5 abs(a) a -5.2 f abs(a) a 2.3 f loor(a) a -2.3 f loor(a) a A a a A a + 2 a vrai, b faux a&&b a vrai, b faux a b a vrai!a a 7, b 4 a < b a 4, b 7, c 5 a < b < c a 7, b 4 a == b a 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)&&c a vrai,b faux, c faux a b&&c a 4, b 7, c 5 (a > b&&a < c) a < b a 4, b 7, c 5 a > b&&(a < c a < b) a 4, b 7, c 5 (a > b&&a < c) a > b a 4, b 7, c 5 (a > b a <= b)&&a < c trouver un contexte (a < b) (a > b) 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 réelles. 76

78 7.1. TYPES, VARIABLES,... CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES Exercice : type et valeur d une variable Donner le type et, si elles ne sont pas évidentes, les valeurs de chacune des expressions suivantes, sachant que P, Q, R et S sont des variables booléennes et que K est une variable entière. 1. sqrt (2) /* racine carrée de 2 */ 2. sqrt (2.0) 3. Z - A 4. ceil (-99.9) /* entier immédiatement supérieur à */ 5. -ceil ( ) 6. - round ( ) /* entier le plus proche de */ / 3 /*quotient de la division euclidienne de 10 par 3 */ 8. 10%3 /*reste de la division euclidienne de 10 par 3 */ / 3 % (K%2 == 0) ((K+1)%2 == 0) 11.! (P && Q) ==! (! P &&! Q) 12. (P && (Q &&! Q))! (R (S! S)) 13. (ceil ( ) < ceil (-65.3)) && P Exercice : simplification d expressions booléennes Donner une forme simplifiée de l expression booléenne a > b&&(a < c a < b) 77

79 7.2. ENTREES, SORTIES CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES 7.2 Entrées-sorties (printf, scanf, putchar, getchar) printf Syntaxe : printf ( [Cha^ıne de caractères contenant des "trous"], [valeur du trou n 1], [valeur du trou n 2],... ) ; Rôle : affiche la chaîne de caractères en substituant les trous par leur valeur Description : la chaîne de caractères est délimitée par des guillemets; elle peut contenir des caractères spéciaux (voir ci-dessous) et des trous, c est à dire des emplacements d une certaine taille, dont la valeur est spécifiée séparément. Caractères spéciaux : Les caractères sont des lettres spéciales permettant d inclure des champs spéciaux dans le texte : Caractère spécial Résultat \n passage à la ligne \t tabulation \ guillemet \\ barre oblique inverse (antislash) \% pourcent \a signal sonore (bip) \0 caractère de fin de chaîne Emplacements : les emplacements sont indiqués par un % suivi d une lettre représentant le type de donnée que l on souhaite afficher : i pour int, f pour float et double, c pour caractère, s pour chaîne de caractères (string) scanf Syntaxe : scanf ( [Cha^ıne de caractères contenant des "trous"], &[variable du trou n 1], &[variable du trou n 2],... ) ; Rôle : Lit la chaîne de caractères tapée par l utilisateur au clavier en stockant la valeur des trous dans les variables correspondantes. Description : Le & devant les noms de variables sont nécessaires pour leur donner des valeurs putchar Syntaxe : putchar (caractère) ; Rôle : Envoie le caractère spécifié sur le périphérique de sortie principal (par défaut : sur l écran). Description : Cette commande est équivalente à printf("%c",caractère) ; Exemple : Le programme suivant affiche l alphabet en majuscules sur l écran (voir le chapitre sur le for) : #include <stdio.h> int main (void) { char c; for (c = A ; c <= Z ; c++) { putchar (c); } return 0; } 78

80 7.2. ENTREES, SORTIES CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES getchar Syntaxe : getchar() Rôle : Lit le caractère suivant sur le périphérique d entrée principal (par défaut : le clavier). Description : getchar n attend pas de retour à la ligne pour lire un caractère, contrairement à scanf. getchar ne prend pas de paramètre et renvoie la valeur du caractère lu. Exemple : Le programme suivant lit et affiche au fur et à mesure une phrase jusqu au caractère de 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; } Exercice : application de scanf et printf Ecrire un programme qui demande deux nombres entiers A1 et A2 à l utilisateur et les affiche de la façon suivante : A1 A2 A1 A2 A1 A2 79

81 7.3. IF CHAPITRE 7. RÉSUMÉ 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>} Rôle : 1. effectue l ensemble d instructions {<instr1>} ssi l expression booléenne <cond1> est vraie 2. idem que 1.; de plus si <cond1> est fausse, effectue {<instr>} 3. effectue l instruction {instri} correspondant à la première expression booléenne (<condi>) vraie rencontrée et n en effectue aucune autre 4. idem que 3.; de plus si aucune expression booléenne n est vraie, effectue <instr> Exercice : comparaison de deux programmes Les deux parties de programmes suivantes sont-elles semblables? Justifier votre réponse. 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; Exercice : étude d un petit programme Considérez la séquence d instructions suivantes (A et B sont deux variables entières prédéclarées et initialisées) :... if (A>B){ if (A>10){ printf ("premier choix \n");} else if (B<9){ printf ("deuxième choix \n");}} else{ if (A==B) {printf ("troisième choix \n");} else {printf ("quatrième choix \n");}} Recopiez la séquence 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? Même question pour les trois autres choix. Est-il possible que rien ne s affiche? 80

82 7.3. IF CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES Exercice : Racines des équations du second degré Ecrire un programme qui lit trois entiers a, b et c, et qui affiche les raçines du polynôme ax 2 +bx+c. Examinez tous les cas de figure Exercice : des chiffres et des lettres Ecrire un programme qui demande à l utilisateur d entrer un nombre entre 20 et 45 et écrit le nombre en toutes lettres (attention aux tirets) Exercice : la cible Soit une cible circulaire centrée sur (0,0), comportant quatre zones délimitées par des cercles concentriques de rayons respectifs 1, 2, 3 et 4. Selon la zone où arrive la fléchette, le joueur gagne respectivement 100, 50, 20 et 10 points (si la fléchette arrive hors de la cible, le joueur ne marque pas de points). Ecrire un programme qui demande à l utilisateur de saisir les coordonnées d une flêchette et affiche le nombre de points réalisés. (Remarque : inclure la librairie math.h pour pouvoir calculer la racine carrée : sqrt) Exercice : quizz des trois entiers Construisez un programme qui demande à l utilisateur de taper trois entiers, puis qui affiche vrai ou faux aux questions suivantes : 1. Les trois entiers sont-ils dans l ordre croissant? 2. Sont-ils tous égaux? 3. Sont-ils distincts deux à 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 réponse. Indiquez le nombre de réponses vraies à la fin du programme. Exemple d exécution du programme : Rentrez le premier entier : 9 Rentrez le deuxième entier : 6 Rentrez le troisième entier : 21 Les trois entiers sont-ils dans l ordre croissant? faux Sont-ils tous égaux? faux Sont-ils distincts deux à 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 réponses vraies. 81

83 7.4. FOR, WHILE CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES 7.4 Itérations (for, while) while (tant que) Syntaxe : while (<expr>) {<instr>} Rôle : Effectue le bloc d instructions {<instr>} plusieurs fois, tant que la condition booléenne <expr> reste vraie for (pour) Syntaxe : for (<var>=<inf>; <var><=<sup>; <var>=<var>+1 ) {<instr>} Rôle : Effectue le bloc d instructions {<instr>} un nombre connu de fois, ce nombre étant déterminé par une borne inférieure <INF> et une borne supérieure <SUP>. L intervalle entre les deux bornes est parcouru par une variable <var>, dont la valeur peut être utilisée dans les instructions {<instr>} Drapeaux Il arrive que la condition pour sortir d un while ne s exprime pas de manière simple, par exemple lorsqu elle dépend des résultats des fonctions appelées dans le corps de la boucle, ou de la valeur de la condition lors des itérations précédentes. Une solution est alors d utiliser des variables spécialisées, les drapeaux qui mémorisent les valeurs utiles et sont utilisées comme condition de sortie du while 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 après : votre nombre est (...) 3. d afficher les entiers compris entre 40 et 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 carrés Exercice : listes d entiers 1. A l aide d une boucle for, écrire un programme qui affiche la liste des entiers pairs de 1 à 50 séparés par des espaces. 2. Même question en utilisant une boucle while. 3. Ecrire un programme qui affiche dans l ordre décroissant la liste des entiers compris entre 1 et 50 séparés par des espaces. 4. Ecrire un programme qui affiche la liste des multiples de 3 et de 5 compris entre 1 et 50 séparés par des virgules et terminée par un point. 5. Même question sauf que les multiples de 15 ne doivent pas être affichés. 6. Ecrire un programme qui affiche la liste des multiples de 3 puis des multiples de 5 compris entre 1 et 50 séparés par des espaces. 82

84 7.4. FOR, WHILE CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES 7. Ecrire un programme qui lit deux entiers n et m au clavier puis affiche les entiers de n à m. Ex : m=1 et n=1, le programme affiche 1 m=1 et n=3, le programme affiche m=5 et n=2, le programme affiche Exercice : suite de Fibonacci Ecrire un programme qui lit un entier n au clavier et affiche le n ieme terme de la suite de Fibonacci. Cette suite est définie par F 0 = 1, F 1 = 1,..., F n = F n 1 + F n Exercice : for imbriqués Ecrire les instructions permettant d afficher les diagrammes suivants : a. ***** b. * c. * d. * ***** ** ** * * ***** *** *** * * ***** **** **** * * ***** ***** ***** * * Exercice : programme mystérieux 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 donnés %i et %i, le résultat est %i \n", ainit, binit, b); return (0) ;} Exercice : suite récursive de Syracuse (while) Soit la suite récursive donnée par u 0 = A,..., u n, avec u n+1 définie par : u n+1 = un 2 si u(n) est pair u n+1 = 3 u(n) + 1 sinon Ecrire un programme qui demande la saisie de d un entier et détermine pour quel n on a : u n = 1. NB : La grande question est de savoir si, pour toute valeur de A /* u 0 = A */ cette suite contient l élément 1. Les matheux n ayant pas resolu ce problème, on dit que ce problème est ouvert. On dit aussi que cette suite passe par 1 quel que soit le point de depart est la conjecture de Syracuse. 83

85 7.4. FOR, WHILE CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES Exercice : jeu du bon nombre (while, for, if) Dans ce jeu, un premier joueur tape un nombre à deviner D, un nombre d essais E et une borne supérieure S, puis l écran est effacé (pour effacer l écran on affichera 50 retours à la ligne successifs). L autre joueur dispose ensuite de E essais pour trouver D, sachant que D est compris entre 1 et S. A chaque essai, le programme indique si le nombre proposé est trop petit ou trop grand. Si le joueur trouve, le programme termine la partie et affiche le nombre de coups; s il ne trouve pas au bout des E coups autorisés, 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 vérifier E et S pour que le deuxième joueur ne soit pas certain de trouver la bonne réponse au bout des E coups? 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 précédent avec : gcc -Wall -ansi Copier.c -o copier puis taper la commande : copier < Copier.c > Nouveau.c Expliquer Exercice : décomptes... En se basant sur le programme de l exercice ci-dessus, faire un programme qui compte les caracteres, les mots, et les lignes d un fichier. Il affiche les trois résultats Exercice : longueur de ligne En se basant sur le programme de l exercice ci-dessus, faire un programme qui cherche et affiche la ligne la plus longue d un fichier Exercice : Sans commentaire... En se basant sur le programme de l exercice ci-dessus, faire un programme qui supprime les commentaires d un programme C. 84

86 7.5. TAB. 1D CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES 7.5 Tableaux à une dimension et chaînes de caractères Un tableau est un ensemble de données repérées par un nombre (ou indice). Il se caractérise par le type des données qu il contient et par le nombre de ces données (longueur). Il est habituellement représenté par un ensemble de cases alignées. Exemple : tableau d entiers de longueur 10 : Indice Valeur Attention : en C, la numérotation des cases commence toujours à 0. Déclaration : En C, comme toute variable, une variable de type tableau doit être déclarée. Par exemple, pour un tableau A de 100 caractères, cette déclaration s effectue de la façon suivante : char A [100] ; Utilisation : Chaque case d un tableau peut être considérée comme une variable indépendante (exception faite de la déclaration). Notation : la case d indice i du tableau tab s écrit : tab[i]. Exemple : les instructions suivantes permettent de remplir puis d afficher la case d indice 3 du tableau de caractères A : printf ("Entrez la valeur de la case : ") ; scanf ("%c",&tab[3]); printf ("%c",tab[3]) ; En langage C, une chaîne de caractères est représentée par un tableau de caractères; la fin de la chaîne de caractères est représentée par le caractère \0. Attention à bien prévoir le \0 dans la taille du tableau. Lorsque la chaîne de caractères est spécifiée explicitement entre guillemets, le \0 est sous-entendu. Exemple : char toto[6] = "hello" ; i toto[i] h e l l o \0 Le symbole représentant les chaînes de caractères pour printf et scanf est %s. Contrairement aux types symples, il ne faut pas mettre de & devant le nom de la variable lors du scanf. Exemple : scanf ("%s",toto) ; <- hello i toto[i] h e l l o \0 printf ("%s***",toto) ; ->hello*** (eq. à : printf ("%s***","hello") ;) Les caractères sont ordonnés selon un ordre pseudo-alphabétique : z >... > a > ; par ailleurs toute majuscule est supérieure à une minuscule : A > z. De même que pour les entiers, il est possible d effectuer des opérations arithmétiques sur les caractères. Exemple : printf ("%c", a +2) ; -> c 85

87 7.5. TAB. 1D CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES Exercice : tableau de caractères Ecrire un programme C qui : 1. initialise un tableau de 50 caractères avec les caractères a... z générés uniformément 2. affiche le tableau 3. calcule la plus petite lettre (ordre alphabetique) de l alphabet présente dans le tableau et donne l indice de sa première occurence 4. affiche les lettres présentes, sans duplication 5. affiche les lettres absentes de ce tableau 6. affiche la fréquence d apparition de chacune des lettres de l alphabet 7. affiche la lettre la plus fréquente Exercice : classement alphabétique Ecrire un programme qui demande à l utilisateur d entrer deux chaînes de caractères (8 caractères maximum) puis les classe par ordre alphabétique. Un exemple d affichage : Donner cha^ıne 1 : bo Donner cha^ıne 2 : baobab Classement : baobab bo Exercice : codage Les lettres A... Z sont codées respectivement par les lettres NBFGRTZXOPKLCEDMHJYUIQSVWA un espace est codé par un espace, on suppose aussi que le texte ne comporte que des lettres majuscules et des espaces. Lire le texte de l utilisateur et afficher la version codée de ce texte. On suppose que le texte à coder est dans un fichier Exercice : cryptage Ecrire un programme qui transforme une chaîne de caractères ainsi : pour chaque lettre, si la lettre est une voyelle, la remplace par un si c est une consonne, la remplace par la lettre situé deux lettres plus loin (y est remplacé par, z par a, etc.) si c est un espace, termine la chaîne de caractères Remarque : l ordre des lettres est le suivant : <espace> a b c... z Exercice : histogramme du jeu de dés Ecrire un programme C qui : génère 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 résultat de ces M parties. Un histogramme horizontal est l affichage d une ligne pour chaque entier de 0 à N. Sur la ligne i on affiche l entier i, suivi d un nombre d étoiles proportionnel aux nombre de parties (parmi les M) qui se sont terminées avec i piles. NB : pour simuler un jeu de pile ou face, utiliser l annexe sur la génération de nombres aléatoires. 86

88 7.5. TAB. 1D CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES Exercice : longueur d une chaînes de caractères Ecrire un programme qui affiche la longueur d une chaîne de caractères saisie par l utilisateur (max. 100 caractères) Exercice : palindrome Ecrire un programme qui demande un mot à l utilisateur et qui affiche si le mot donné est un palindrome. Un palindrome est un mot qui se lit de la même manière de la gauche vers la droite ou de la droite vers la gauche, comme ara ou elle. Ecrire un programme qui demande une phrase à l utilisateur et détermine si la phrase est un vrai palyndrome, un pseudo-palindrome, ou ni l un ni l autre. Dans un vrai palindrome, les espaces sont répartis de manière symétrique dans la phrase (exemple : rats live on no evil star); dans un pseudo palindrome, il y a une symétrie entre les lettres mais pas entre les espaces (exemple : eve reve) Exercice : parcours de tableau Ecrire un programme qui fait remplir à l utilisateur un tableau de 8 flottants, puis affiche les valeurs de ce tableau et détermine la valeur la plus grande du tableau et l indice correspondant Exercice : représentation décimale d un entier Dans cet exercice un entier est représenté par un tableau de 10 entiers. La case 0 contient les unités, la case 1 les dizaines, la case 2 les centaines,... Ecrire un programme qui : 1. demande un entier positif, n1, à 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 représentation de la différence n1-n2 sans utiliser la quantité n1-n2 6. affiche chacun des tableaux N1, N2, N3 sur une ligne différente et dans l ordre de lecture habituel (les centaines avant les dizaines etc.) Exercice : retournement Ecrire un programme qui : demande un mot à l utilisateur affiche le mot donné et le mot à l envers sur une même ligne Exercice : schéma de Horner Un polynome P à coefficients réels, de degré <= 10 est défini par le tableau A de ses coefficients : A[0] + A[1]x + A[2]x A[10]x 10 Ecrire un programme qui initialise le tableau A par lecture de chaque coefficient, calcule et affiche la valeur prise par ce polynome pour une valeur lue de la variable. On demande d utiliser la méthode de Horner : P(x) = (... (((A[10] x + A[9]) x + A[8]) x + A[7]) x +...A[1]) x + A[0] 87

89 7.5. TAB. 1D CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES Exercice : suite croissante Soit un tableau d entiers indicé sur Ecrire un sous-programme qui détermine si la suite d entiers représentée par ce tableau est croissante : c est à dire élément i <= élément i+1 pour tout i Exercice : tri de caractères Ecrire un programme qui trie les caractères d une chaîne de caractères entrée par l utilisateur par ordre alphabétique. Par exemple : Entrez une cha^ıne de caractères : arbre Résultat : aberr Exercice : stockage d entiers Construire un programme qui demande à l utilisateur une succession d entiers compris entre 0 et 99. Le programme cesse de reclamer des entiers quand l utilisateur re-donne pour la première fois un entier déjà donné. Il doit alors afficher tous les entiers donnés par l utilisateur et dans l ordre où celui-ci les a donnés. Imaginez plusieurs méthodes pour résoudre ce problème Exercice : pile ou face Simuler parties de 50 tirages Pile ou Face. Le programme archive les résultats dans un tableau et affiche l histogramme horizontal de ces parties. On appelle ici histogramme horizontal l affichage de 51 lignes, sur chacune desquelles apparaît le numéro de la ligne i (de 0 a 50) et un nombre d étoiles proportionnel au nombre de parties ayant obtenu i Piles Exercice : sur les chaînes de caractères... Ecrire un programme qui : 1. demande à l utilisateur d entrer une chaîne de caractères se terminant par # et la stocke dans un tableau de 50 caractères, jusqu au caractère # exclu (ne pas oublier le \0) 2. calcule la longueur de cette chaîne de caractères (nombre de caractères avant le \0 ) 3. insère dans le tableau avant la chaîne de caractères le mot toto 4. compare la chaîne ainsi obtenue avec la chaîne toto titi 5. affiche la chaîne, mais à 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

90 7.6. TAB. 2D CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES 7.6 Tableaux à deux dimensions Un tableau à deux dimensions (2D) est un tableau dont les cases sont référencées par deux indices. Ses deux dimensions sont son nombre de lignes et son nombre de colonnes. De même que pour un tableau à une dimension, en C, les cases d un tableau 2D sont toutes du même type. La déclaration d un tableau 2D est obligatoire et se fait de la façon suivante (par exemple pour un tableau de 8 lignes et 10 colonnes de caractères) : char NomTableau [8][10] ; Chaque case du tableau peut être considérée comme une variable indépendante. En C, la case de la i me ligne et de la j me colonne du tableau tab se note tab[i][j] ; Attention : en C, la numérotation des lignes et colonnes commence toujours à 0. La représentation la plus commode d un tableau à deux dimensions est la représentation en échiquier, avec l indice de la ligne indiqué sur un axe vertical descendant et l indice de la colonne sur un axe horizontal dirigé vers la droite. Par exemple dans le tableau T ci dessous, l élément T[0][1] vaut 12. i\j Exercice : triangle de Pascal Faire un programme qui affiche les coefficients du développement de l expression (a + b) n. On utilise un tableau à deux dimensions et le triangle de Pascal. On suppose n connu et égal à 10. On suppose aussi que ce premier programme utilise un tableau à deux dimensions. Refaire ce programme avec un seul tableau à une dimension Exercice : carré magique On appelle carré magique 3*3 un tableau carré 3*3 d entiers, qui vérifie : 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 la somme de chaque colonne vaut la somme de chaque diagonale vaut 15. On demande tout d abord de démontrer pourquoi dans un tel tableau : la case du milieu vaut 5 si l on fixe deux cases de la première ligne alors les autres cases sont déterminées par les contraintes (même si le carré alors obtenu n est pas nécessairement magique) l ensemble des carrés ainsi obtenu contient tous les carrés magiques En déduire un programme qui affiche l ensemble des carrés magiques 3*3. Vérifier (visuellement ou par programme (plus difficile)) que ces carrés magiques sont tous équivalents aux symétries ou rotations près. 89

91 7.6. TAB. 2D CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES 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 lignes suivantes pour former une pyramide renversee : sur chaque ligne et entre deux entiers de la ligne precedente l eleve ecrit la somme de ceux-ci. Voyez plutôt sur l exemple ci-dessous : Ecrire un programme qui demande la première ligne à l utilisateur et affiche les suivantes. Même exercice, mais en utilisant un tableau à une dimension Exercice : autour des carrés k-valides On considère un tableau de caractères à deux dimensions de taille N N, où N sera une constante définie dans l entête du programme. Les cases de ce tableau contiennent soit des caractères numériques (valeurs comprises entre 1 et 9), soit le caractère # # 9 5 # # 7 6 # # # # # 5 9 Etant donné un entier k, on dit qu un tel tableau est k-valide si pour chaque bloc de chiffres compris entre deux marqueurs # (ou bien le bord du tableau), la somme des chiffres de ce bloc ne dépasse pas k. On ne considère que les blocs horizontaux ou verticaux. Sur l exemple ci-dessus, le tableau est 14-valide. Question 1 : Construire une fonction booléenne qui prend un tableau de caractères N N et un entier k en paramètres, et qui retourne 1 si le tableau est k-valide, 0 sinon. Question 2 : Ecrire une procédure qui détermine la plus petite valeur k telle que le tableau passé en paramètre soit k-valide Exercice : symétrie Vérifier qu un tableau carré M est symétrique, c est à dire que i, j, M[i][j] = M[j][i] Exercice : initialisations Pendant tout l exercice on considère un tableau 8*8 d entiers. initialiser ce tableau comme une matrice identité et l afficher. l initialiser comme une matrice identité-sym, qui n a que des 0 et des 1, où les 1 sont portés par l autre diagonale. l initialiser comme une matrice 3-identité dont seules les 3 diagonales principales ont des 1. l initialiser avec des 0 et des 1, comme un échiquier. 90

92 7.6. TAB. 2D CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES l initialiser avec des 0, des 1 et des 2, comme un échiquier à trois couleurs. l initialiser avec des diagonales de 0, des diagonales de 1, des diagonales de 2,... comme dans le dessin ci-dessous :

93 7.7. POINTEURS CHAPITRE 7. RÉSUMÉ DE COURS ET EXERCICES 7.7 Les pointeurs Exercice 1 Taper, compiler et exécuter le programme ci-dessous. Expliquer les résultats. #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 = ; 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; } Exercice 2 Taper le programme ci-dessous, le compiler et l exécuter. Puis commenter l exécution. # 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

94 Chapitre 8 Annales 8.1 Examen Examen d informatique L1 INF111 durée : 3h00 Tous les documents sont autorisés à l exception des calculettes. Les barêmes sont donnés à titre indicatif. Les deux exercices et le problème sont indépendants. La qualité de rédaction et la clarté des algorithmes et des programmes sont sérieusement pris en compte dans la note. Lisez toutes les questions avant de commencer. Problème : Les huit Dames ( /15.5pts) Peut on disposer huit dames sur un échiquier (échiquier 8 8) sans qu aucune d elles ne puisse en prendre une autre? Une dame prend une autre dame si cette autre dame est sur la même colonne, sur la même ligne, sur la même diagonale droite ou sur la même diagonale gauche (voir figure ci-dessous où la dame positionnée en ligne 1 et colonne 4 peut prendre n importe quelle pièce situé sur une case marquée). colonne 7 colonne 6 colonne 5 colonne 4 colonne 3 colonne 2 colonne 1 colonne 0 ligne 0 ligne 1 D ligne 2 ligne 3 ligne 4 ligne 5 ligne 6 ligne 7 Il ne peut donc y avoir - plus d une dame sur une colonne (contrainte a) 93

95 8.1. EXAMEN CHAPITRE 8. ANNALES - plus d une dame sur une ligne de l échiquier (contrainte b) - plus d une dame sur une diagonale droite ou gauche (contrainte c). Comme un échiquier a huit colonnes, il est impossible de poser sur celui-ci plus de huit dames (une par colonne) qui ne se prennent pas les unes les autres. Question 0 ( /0.25pts) : Sur l échiquier ci-dessus, donnez un exemple de position d une seconde dame telle que celle-ci et celle positionnée en (1, 4) ne se prennent pas mutuellement. Nous considérons au début de ce problème les configurations de huit dames respectant seulement la contrainte a : une (et exactement une) dame par colonne. On considère deux représentations équivalentes pour définir une telle configuration de huit dames placées sur l échiquier : a) un tableau 8 8 à deux dimensions. Une case à 0 est une case vide, une case à 1 est une case contenant une dame. b) un tableau à une dimension de huit cases. Chaque case correspond à une colonne de l échiquier : la case i contient le numéro de ligne où se trouve la dame de la colonne i de l échiquier. Voici les structures de données retenues : #define MAX 8 int Echiquier[MAX][MAX], NumeroLigne[MAX]; Nous donnons ci-dessous un exemple d une configuration satisfaisant la contrainte a : ligne ligne L = 6, 5, 0, 1, 4, 4, 5, ligne Configuration Echiquier Configuration NumeroLigne Question 1 ( /1pt) : Ecrire une procédure qui prend en paramètre une configuration sous la forme Echiquier et l affiche à l écran sous la forme donnée en partie gauche de l exemple ci-dessus. Cette procédure a pour en-tête : void AfficheEchiquier(int E[MAX][MAX]) Ecrire une procédure qui prend en paramètre une configuration sous la forme NumeroLigne et l affiche à l écran sous la forme donnée en partie droite de l exemple ci-dessus. Cette procédure a pour en-tête : void AfficheLigne(int L[MAX]) Question 2 ( /1pt) : Ecrire une procédure void InitEchiquier(int L[MAX]) qui initialise un tableau passé en paramètre sous la forme NumeroLigne avec les positions de 8 dames rentrées au clavier par l utilisateur. Votre procédure doit lire huit entiers compris entre 0 et 7 (pas nécessairement distincts), les stocker dans chacune des huit cases de L, en demandant à l utilisateur de recommencer tant que chaque valeur n est pas dans l intervalle [0..7]. Question 3 ( /1.25pts) : Ecrire une procédure qui fait passer de la représentation Echiquier à la représentation NumeroLigne. L en-tête de cette procédure est : void RepEversL(int E[MAX][MAX], int L[MAX]) 94

96 8.1. EXAMEN CHAPITRE 8. ANNALES La variable E contient la configuration sous la forme Echiquier que l on veut convertir. On suppose que E contient exactement une dame par colonne. La variable L, modifiée par la procédure, doit contenir à la fin la configuration convertie sous la forme NumeroLigne. Pour chaque valeur j de 0 à (MAX 1), la procédure calcule le seul indice de ligne i tel que E[i][j] = 1, indice qui est alors affecté à L[j]. Question 4 ( /1.25pts) : Ecrire une procédure qui fait passer de la représentation NumeroLigne à la représentation Echiquier. L en-tête de cette procédure 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. La variable E, calculée par la procédure, contient la configuration convertie sous la forme Echiquier, avec une seule dame par ligne et par colonne. Elle initialise chaque case de E à 0, puis pour chaque j de 0 à (MAX 1), affecte 1 à E[L[j]][j]. Question 5 ( /1pt) : Ecrire un programme principal qui demande à l utilisateur de : Rentrer une configuration sous la forme NumeroLigne dans une variable L Afficher L à l écran Calculer la représentation échiquier E de cette configuration associée à L Afficher E à l écran Enfin, le programme doit calculer la représentation NumeroLigne L de E et l afficher à l écran. La dernière valeur calculée de L doit être égale à celle rentrée au début par l utilisateur, mais on ne fera pas la vérification dans le programme. Le programme principal utilise les procédures vues précédemment. On demande la totalité du programme principal, mais l on ne recopiera que les en-têtes des procédures et fonctions. Si l on veut maintenant qu une variable L soit une solution qui réponde davantage au problème des huit dames, il faut que L soit une permutation : la variable L de type NumeroLigne est une permutation si elle contient chaque entier de 0 à 7 une fois et une seule fois. En d autres termes, L représente une permutation si i 0...(MAX 1), L[i] et i j, L[i] L[j]. Dans le cadre du problème si la variable L est une permutation cela signifie que la configuration représentée contient une seule dame par ligne et une seule dame par colonne (la contrainte sur les diagonales n est pas nécessairement satisfaite!). Autrement dit : les contraintes a et b sont respectées, mais pas nécessairement la contrainte c. Question 6 ( /1.5pts) Écrire une procédure qui génère une permutation aléatoire. L en-tête de cette procédure est : void GenPermutation (int L[MAX]) Cette procédure utilise un tableau int DejaVu[MAX]. La case DejaV u[i] contiendra 0 si i n est pas encore dans la permutation L en cours de calcul, contiendra 1 si i est déjà dans la permutation. Au départ la procédure doit initialiser à 0 les cases de DejaV u. Cette procédure utilise aussi un entier CaseAleat. Pour toute valeur j de 0 à MAX 1, elle tire aléatoirement un entier CaseAleat compris entre 0 et 7 tant que cet entier n est pas déjà dans la permutation. Une fois cet entier obtenu, L[j] devient égal à CaseAleat et DejaV u est modifié en conséquence. On rappelle que la fonction int hasard(int inf, int sup), retourne une valeur aléatoire entière comprise dans [inf, sup]. Question 7 ( /1.5pt) Écrire une fonction booléenne qui vérifie qu une permutation est une solution au problème des huit dames. La fonction a un paramètre L de type NumeroLigne. La fonction renvoie VRAI (valeur 1) si la permutation donnée en paramètre est une solution au problème des huit dames, elle renvoie FAUX (valeur 0) sinon. La fonction doit en fait décider si la contrainte c est vérifiée (puisqu une 95

97 8.1. EXAMEN CHAPITRE 8. ANNALES permutation vérifie déjà les contraintes a et b). On appellera cette fonction Solution. Pour cela, l algorithme de la fonction vérifie que pour chaque couple d indices i, j (i < j) on a : abs(l[i] L[j]) abs(i j). Dès qu un couple ne vérifie pas cette condition la fonction renvoie la valeur faux. Sinon la fonction renvoie la valeur vrai. On rappelle que la fonction valeur absolue existe en langage C et se note abs. Question 8 ( /1.25pts) Écrire un programme principal qui engendre une solution au problème des huit dames. Ce programme doit contenir la totalité des en-têtes des fonctions et procédures nécessaires. Ce programme demande une permutation aléatoire au générateur de permutation, tant que la permutation donnée n est pas une solution au problème des huit dames. Lorsque le programme obtient une première solution, il l écrit sous les deux formes : Echiquier et NumeroLigne. Imaginons avoir obtenu une solution L au problème des huit dames. Grâce à cette solution, on peut calculer immédiatement 8 solutions différentes ou non de L. La première de ces solutions est représentée par L, la seconde est celle obtenue par rotation de 90 degrés de l échiquier correspondant à la solution L, la troisième par rotation de 180 degrés de la solution L, la quatrième par rotation de 270 degrés de la solution L. Ces quatre solutions donnent, par symétrie par rapport à leur diagonale principale, quatre autres solutions. Ces 8 solutions ne sont pas nécessairement toutes différentes (elles le sont en général). Question 9 ( /1.5pts) Nous demandons d écrire la procédure void SymDiag(int Linit[MAX], int Lfinal [MAX]) Cette procédure calcule Lf inal, la représentation NumeroLigne de la solution obtenue par symétrie par rapport à la première diagonale de Linit. Indication : la case de coordonnées (i, j) de l échiquier devient de coordonnées (j, i) après symétrie par rapport à la première diagonale. Question 10 ( /1.5pts) Nous demandons d écrire la procédure void Rotation(int Linit[MAX], int Lfinal [MAX]) Cette procédure calcule Lfinal, qui est la représentation NumeroLigne de la solution obtenue par rotation de Linit de 90 degrés. Indication : une case de coordonnées (i, j) de l échiquier devient de coordonnées (MAX 1 j, i) après rotation de 90 degrés. Question 11 ( /1.5pts) Nous demandons d écrire une procédure qui à partir d une solution Linit donnée calcule les huit solutions équivalentes obtenues par symétrie et rotation et les stocke dans un tableau. Pour cela la procédure utilise un tableau St[8][MAX]. L en-tête de la procédure demandée est : void Equivalent(int Linit[MAX], int St[8][MAX]) La procédure stocke dans chacune des lignes du tableau St une des huit solutions sous forme NumeroLigne, y compris celle donnée en paramètre. Question 12 ( /1pt) Nous demandons d écrire un programme principal qui calcule comme ci-dessus (question 8) une première solution, puis calcule les huit solutions obtenues par symétrie et rotation. Le programme écrit les solutions obtenues sous la forme NumeroLigne. La variable utilisée, au niveau du programme principal, pour stocker les solutions aura pour nom Stock. 96

98 8.1. EXAMEN CHAPITRE 8. ANNALES Exercice 1 ( /2.5pts) Considérons la fonction décrite ci-dessous : #define N 6 int mystere(int tab[n], int c) { return tab[c-1]; } Question 1 ( /1pt) Pour quelles valeurs du paramètre c l exécution de la fonction mystere peut-elle provoquer une erreur? Récrire la fonction pour que dans ce cas, elle affiche un message d 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 problème à l exécution du programme, et expliquer pourquoi le cas échéant. S il n y a pas de problème, dire ce qu elle affiche à l écran. Exercice 2 ( /2pts) Question 1 ( /0.5pt) Considérons le programme de Paul présenté 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

99 8.1. EXAMEN CHAPITRE 8. ANNALES } return 0; Malheureusement, le programme de Paul engendre un problème à l exécution. Expliquer son erreur et corrigez-la. Question 2 ( /1.5pts) Paul semble maintenant avoir compris son erreur, il efface donc sa fonction main et en écrit une nouvelle (la procédure secret restant inchangée) : 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 exécuterat-il correctement?). Si oui, donner ce qui est affiché à l écran, si non, expliquer ce qui ne va pas. 98

100 8.2. EXAMEN CHAPITRE 8. ANNALES 8.2 Examen Exercice 1 : suites récurrentes de Mycielski a) 1 points On considère la suite récurrente définie par : { m1 = 2 m k = 2 m k Écrire une fonction mycielski qui prend en paramètre un entier n puis calcule m n (le n ieme terme de la suite) et retourne la valeur de m n. b) 1,5 points On considère maintenant une suite supplémentaire : { c1 = 1 c k = 3 c k 1 + m k 1 où m k 1 désigne le k 1 eme terme de la suite de Mycielski de la question a). Écrire une procédure 1 mycielski2 qui prend en paramètre un entier n, et qui affiche les valeurs des termes m n et c n de la manière suivante : L appel de la procédure mycielski2 avec n = 5 affiche m5 = 47 c5 = 236 c) 1,5 points Écrire un programme complet qui demande à l utilisateur de donner un entier n et affiche les valeurs des terme m n et c n et recommence jusqu à ce que l utilisateur donne l entier 1. Le programme doit respecter les conventions d affichage de l exemple suivant : n=? 5 m5 = 47 c5 = 236 n=? 3 m3 = 11 c3 = 20 n=? -1 Au revoir. 1 Une procédure est une fonction qui ne retourne rien 99

101 8.2. EXAMEN CHAPITRE 8. ANNALES Exercice 2 : que font ces programmes? 1) 2 points Pierre décide d écrire 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.à.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 numéro 1 */ secret(t,1); printf("%i",t[1]); /* bloc numéro 2 */ secret(u,0); affichage(u); /* bloc numéro 3 */ if (v[1]>0){ secret(v,1); } if (v[1]<0){ v[1]=-1; } affichage(v); /* bloc numéro 4 */ for (i=0;i<n/2;i++){ secret(w,i); } affichage(w); /* bloc numéro 5 */ 100

102 8.2. EXAMEN 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 affiché à l écran. 2) 0,5 points Paul, l ami de Pierre, a décidé d écrire la fonction suivante : int mystere (int *a, int b, int *c) { *a=b ; b=*c ; *c=*a ; return *a ; } Que signifient les dans l entête et le corps de la fonction? 3) 2 points Paul cherche maintenant à utiliser sa fonction mystere en écrivant la fonction principale suivante : int main(void) { int x=2,y=8,z=4 ; /* bloc numéro 1 */ printf ("%i", mystere(x,y,z)) ; /* bloc numéro 2 */ x=2;y=8;z=4; printf ("%i", mystere(&x,y,&z)) ; /* bloc numéro 3 */ x=2;y=8;z=4; printf ("%i", mystere(&z,x,&y)) ; /* bloc numéro 4 */ x=2;y=8;z=4; mystere(&x,y,&z); printf ("%i %i %i",&x,y,&z) ; /* bloc numéro 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 exécuterat-il correctement?). Si oui, donner ce qui est affiché à l écran, si non, expliquer ce qui ne va pas. 101

103 8.2. EXAMEN CHAPITRE 8. ANNALES Problème On dispose d une grille 9 9 partiellement remplie (voir exemple). Cette grille 9 9 est subdivisée en 9 sous-carrés 3 3, (voir exemple). Un sous-carré est la partie de grille que l on obtient en sélectionnant 3 lignes et 3 colonnes : les trois premières, les trois du milieu ou les trois dernières Le sous-carré obtenu en sélectionnant les 3 lignes du milieu et les 3 dernières colonnes de l exemple est : Le jeu consiste à remplir chaque case de la grille avec un entier compris entre 1 et 9 en respectant trois 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-carré (contrainte c). Comme chaque ligne contient 9 cases, cela signifie qu elle contient tous les entiers de 1 à 9 exactement une fois. Même remarque pour les colonnes et pour chacun des sous-carrés. Dans ce problème nous réalisons un programme C, qui nous permet d initialiser une grille et de nous aider à la remplir. ATTENTION : Ne cherchez pas à remplir la grille d exemple, ce n est pas le but du problème et cela 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 définissons une constante T et un tableau Grille de la manière suivante : #define T 9 int Grille[T][T]; Le tableau Grille contient le tableau du jeu. Une case contient un entier de 0 à 9. La valeur 0 signifie que le contenu de la case n est pas encore déterminé. 2) 0,5 points Écrire une procédure qui initialise une grille de jeu à 0. L en-tête de cette procédure est : void Initialiser (int G[T][T]); 102

104 8.2. EXAMEN CHAPITRE 8. ANNALES 3) 1,5 points Écrire une procédure qui demande à l utilisateur de donner les cases initialement connues. Pour chaque 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 à la procédure que l initialisation est terminée. À chaque triplet d entiers donné par l utilisateur, la procédure vérifie qu ils sont tous les trois compris entre 1 et 9 ou que k est nul. L en-tête de cette procédure est : 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 terminé, merci. 4) 1 points Écrire une procédure qui prend en paramètre un tableau G de jeu et l affiche à l écran, en séparant les entiers par des ; et en passant à la ligne à chaque fin de ligne du tableau. Cette procédure a pour en-tête : 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 (à 0) de Grille, nous allons calculer la liste des entiers possibles. Un entier, de 1 à 9, est possible pour une case (i,j), si cet entier n est pas déjà dans la ligne i, ou dans la colonne j, ou dans le sous-carré contenant la case (i,j). Pour mémoriser les entiers possibles d une case, nous utilisons le tableau EPossibles déclaré comme ci-dessous : int EPossibles [81][T+1]; 103

105 8.2. EXAMEN CHAPITRE 8. ANNALES Chaque case de EPossibles contient un 0 ou un 1. Chaque ligne de ce tableau correspond à une case du tableau Grille. Chaque colonne de ce tableau correspond à un entier : la colonne d indice j (j de 1 à 9), correspond à l entier j. Nous n utilisons pas la colonne 0. Supposons que la case (i,j) de Grille soit associée à la ligne lg de EPossibles. Alors : EPossibles[lg][c]=1, si c est possible pour (i,j) et EPossibles[lg][c]=0 sinon. Voila par exemple les lignes 44 et 45 du tableau EPossibles : EPossibles[44] EPossibles[45] La ligne 44 correspond à la case (4, 8) pouvant recevoir les entiers 1, 5, 8. La ligne 45 correspond à la case (5, 0) pouvant recevoir les entiers 2, 8. Il est important, pour la suite du problème de bien comprendre la correspondance entre les indices d une case (i,j) du tableau Grille et l indice lg de la ligne qui lui est associée dans EPossibles. Cette correspondance est celle proposée dans le tableau ci-dessous : 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, il donne la correspondance inverse, de lg vers (i,j). On y voit, par exemple que : La case (3,2) de Grille correspond à la ligne 29 du tableau EPossibles. On y voit aussi que la ligne 46 de EPossibles est associée à la case (5,1) de Grille. 5) 1 points Écrire une fonction qui prend en entrée deux paramètres, lig et col, qui sont les indices d une case du tableau Grille. Cette fonction retourne le numéro de la ligne du tableau EPossibles qui lui est associée. L en-tête de cette fonction est : int CaseVersLigne (int lig, int col); 6) 1 points Écrire une procédure qui calcule la ligne et colonne de Grille associés à un numéro de ligne de EPossibles. Cette procédure a trois paramètres et son en-tête 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 du tableau EPossibles). Les variables *lig et *col, modifiées par la procédure doivent contenir, à la fin de celle-ci, l indice de ligne et de colonne de la case associée à IndiceDeLigne. 7) 1 points Écrire une procédure qui calcule les indices de la case du coin en haut à gauche du sous carré contenant une case de la Grille. 104

106 8.2. EXAMEN 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, modifiées par la procédure doivent contenir, à la fin de celle-ci, l indice de ligne et de colonne de la case du coin en haut à gauche du sous carré 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 Écrire la procédure Possibles. Cette procédure a deux paramètres et son en-tête est : 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 qui contient un entier > 0 est connue). Le tableau EP, une fois calculé par la procédure, indique pour chaque case vide de G, les entiers disponibles pour celle-ci. Cette procédure commence par initialiser le tableau EP à 1. Cette procédure parcourt ensuite chacune des cases (i,j) du tableau G : Si la case (i,j) est connue, la procédure met la ligne correspondante de EP à 0. Si la case (i,j) est inconnue, la procédure doit parcourir (contrainte a) la ligne i du tableau G, et mettre EP[lg][c]=0, si c est un entier présent sur cette ligne i de G (lg est ici, la ligne de EP qui correspond à la case (i,j) de G). Puis la procédure continue ce travail avec la colonne j du tableau G (contrainte b), et avec le sous-carré contenant (i,j) (contrainte c). 9) 1 points Écrire la procédure : void AfficherPossibles (int G[T][T], int EP[81][T+1]); Cette procédure a deux paramètres, un paramètre G qui est une Grille partiellement remplie et un second paramètre, EP, qui indique les entiers possibles pour chacune des cases de G. Cette procédure, affiche sur une ligne, pour chacune des cases de Grille, les indices de cette case, et la liste 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 Écrire, le programme principalmain, qui initialise le tableaugrille, l affiche, calcule le tableau EPossibles pour cette variable Grille et enfin affiche pour chaque case vide de Grille la liste des entiers possibles. 11) 1 points Écrire une fonction int Completer (int G[T][T], int EP[81][T+1]); Cette fonction reçoit deux paramètres G (une grille partiellement remplie) et EP le tableau déjà calculé par la procédure Possibles pour G. Cette fonction parcourt le tableau EP. Pour toutes les lignes de EP qui contiennent une seule valeur possible, la fonction attribuera cette valeur à la case 105

107 8.2. EXAMEN CHAPITRE 8. ANNALES correspondante de G. Cette fonction retourne aussi un booléen vrai si le tableau G a été modifié par elle (et faux sinon). 12) 1 points Écrire un programme principal, qui initialise le tableau Grille, l affiche et calcule le tableau EPossibles pour cette variable Grille. Puis le programme modifie le tableau Grille avec la procédure Completer, si c est possible. Chaque fois que Grille est modifié, le programme recommence le processus : calcul de EPossibles et modification de Grille. Quand il n est plus possible de progresser vers la solution du jeu, avec Completer, ou que le tableau Grille est complètement rempli, le programme affiche Grille. Dans le cas où Grille n est pas complètement rempli, le programme affiche aussi le tableau EPossibles. 106

108 8.3. EXAMEN CHAPITRE 8. ANNALES 8.3 Examen Problème : Jeu de Hex Hex est un jeu de reflexion pour 2 joueurs qui se joue sur une grille triangulaire (voir figure ci-dessous). La règle du jeu est très simple : Le joueur blanc pose des pions blancs, le joueur noir pose des pions noirs. Le joueur blanc commence. Chaque joueur pose à son tour un pion sur une intersection libre. Les pions une fois posés ne sont ni retirés ni déplacés. La grille a quatre bords, deux bords opposés sont pour le joueur blanc et les deux autres sont pour le joueur noir (voir la position de départ de la figure). Le joueur qui parvient à former un chemin continu qui rejoint ses deux bords a gagné la partie Position de départ Le joueur noir gagne la partie Dans l exemple, le joueur noir a gagné. Le joueur blanc a perdu : l existence d un chemin gagnant pour une couleur empêche l existence d un chemin gagnant pour l autre couleur. Partie 1 : Modélisation du jeu Nous réalisons un programme en langage C qui permet à 2 joueurs de jouer au jeu de Hex. Dans cette partie, nous ne cherchons pas à savoir quel est le joueur gagnant. Ce sera l objet de la partie suivante. Chaque intersection de la grille est indicée par son indice de ligne et de colonne (voir figure). Nous utilisons un tableau carré à deux dimensions pour modéliser la grille : une case du tableau est une intersection de la grille. Le jeu de Hex peut se jouer sur une grille carrée de taille quelconque (11 pour l exemple). Nous définissons une constante T pour la taille et le tableau Grille de la manière suivante : #define T 11 int Grille[T][T]; Un pion blanc sera modélisé par l entier1et un pion noir par l entier2. L absence de pion sera modélisé par l entier 0. Voici, par exemple, l état du tableau Grille correspondant au deux situations précédentes (les indices de lignes et de colonnes ne font pas partie du tableau). 107

109 8.3. EXAMEN CHAPITRE 8. ANNALES Position de départ Le joueur noir gagne la partie 1) Initialiser Ecrire une procédure qui initialise la grille de jeu à la position de départ. L en-tête de cette procédure est : void initialiser (int G[T][T]); 2) Afficher Pour afficher la grille de jeu, nous ne dessinons pas les lignes de la grille triangulaire mais juste des symboles représentant les pions. Un pion blanc est représenté par le caractère B, un pion noir par le caractère N, l absence de pion par le cartactère.. Ecrire une procédure qui affiche la grille de jeu. L en-tête de cette procédure est : void afficher (int G[T][T]); Voici, par exemple, l affichage correspondant aux deux situations précédentes. 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 Position de départ 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 Le joueur noir gagne la partie 3) Jouer un coup Ecrire une procédure qui demande à un joueur un numéro de ligne et un numéro de colone correspondant à une case ou il peut jouer. La procédure redemande un numéro de ligne et un numéro de colonne, tant que le joueur ne joue pas sur une case valide. Une case est valide si elle correspond à une case de la grille et si elle n est pas occupée par un autre pion. L en-tête de cette procédure est : void jouercoup (int * i, int * j, int G[T][T]); Les variables désignées par les deux premiers paramètres de la procédure, contiennent à la fin de celle-ci le numéro de ligne et de colonne donnés par le joueur. 108

110 8.3. EXAMEN CHAPITRE 8. ANNALES 4) Enregistrer le coup Ecrire une procédure qui utilise la procédure jouercoup pour demander à un joueur un numéro de ligne et de colonne, et qui met un pion du joueur sur la grille. Cette procédure à un paramètre joueur qui vaut 1 ou 2 selon que c est le joueur blanc ou noir qui joue. Cette procédure peut être utilisée pour faire jouer le joueur blanc ou le joueur noir, selon le paramètre joueur. L en-tête de cette procédure est : void enregistrercoup (int joueur, int G[T][T]); 5) Programme principal Ecrire le programme principal main qui permet de faire jouer deux joueur au jeu de Hex. Le programme doit initialiser la grille, l afficher, puis faire jouer alternativement le joueur blanc et le joueur noir jusqu à ce que toutes les cases de la grille soient remplies. Après chaque coup, la grille est affichée. On utilise les procédures définies aux questions précédentes. Il n est pas demandé de déterminer si un joueur a gagné. Partie 2 : Déterminer le gagnant Au jeu de Hex, il y a toujours un gagnant. Une grille qui ne contient aucune case vide possède toujours un chemin gagnant pour le joueur blanc ou le joueur noir et il ne peut exister un chemin gagnant pour les deux joueurs. Dans cette partie, nous allons déterminer, pour une grille complètement remplie, quel est le joueur qui a gagné. 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 déterminer 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 remplaçons tous les 1 de la colonne 1 par des -1. Puis, nous propageons ces -1 dans la grille de jeu sur les positions du joueur blanc : un 1 devient -1 s il a un voisin -1. Si, une fois la propagation terminée, la colonne T-2 contient un -1, le joueur blanc a gagné. Nous remarquons qu une case intérieure de la grille a exactement 6 voisines dans le jeu de Hex ) Coordonnées des cases voisines Ecrire une procédure qui affiche les indices des cases voisines d une case intérieure donnée. L en-tête de cette procédure est : void casesvoisines (int i, int j); Par exemple, l appel à casesvoisines(3,5) doit afficher 2,4 2,5 3,4 3,6 4,5 4,6 7) Initialisation de la propagation Écrire une procédure qui remplace tous les1de la colonne 1 du tableau passé en paramètre par des -1. L en-tête de cette procédure est : void initialisationpropagation (int G[T][T]); 109

111 8.3. EXAMEN CHAPITRE 8. ANNALES 8) Propagation partielle Écrire une fonction qui propage les -1 partiellement. Cette fonction parcours toutes les cases intérieures de la grille, une seule fois, et transforme un 1 en -1 si et seulement si ce 1 a un -1 comme voisin. Cette fonction retourne un booléen vrai si au moins une case a été modifiée et faux sinon. L en-tête de cette fonction est : int propagationpartielle (int G[T][T]); 9) Propagation totale Ecrire une procédure qui propage totalement les-1, c est-à-dire : jusqu à ce que plus aucune propagation ne soit possible. Cette procédure appelle la fonction précédente jusqu à ce qu elle ne réalise plus de modification. L en-tête de cette procédure est : void propagationtotale (int G[T][T]); 10) Test propagation Écrire une fonction qui retourne 1 si la colonne T-2 du tableau passé en paramètre contient un -1 et retourne 0 sinon. L en-tête de cette fonction est : int testpropagation (int G[T][T]); 11) Afficher le gagnant Ecrire une procédure qui prend en paramètre une grille de jeu de Hex ne contenant aucune case vide et qui affiche Victoire du joueur blanc ou Victoire du joueur noir. 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 à Hex, commencez par jouer sur une grille de petite taille puis faites la grossir jusqu à 11x11 cases intérieures ou plus. 110

112 8.3. EXAMEN CHAPITRE 8. ANNALES 111

113 Chapitre 9 Annexes 9.1 Programmer chez soi Si vous avez disposez d un ordinateur vous avez la possibilité de travailler vos exercices de programmation chez vous. Trois solutions sont envisageables : Solution 1 : Connexion directe au serveurs du DLST Cette solution nécessite d être relativement à l aise avec l outil informatique : installation et configuration des outils logiciels requis, compréhension élémentaire du fonctionnement en réseau, etc. Pour ceux qui ne se sentent pas suffisamment à l aise avec les points ci-dessus, les solutions décrites dans les sections suivantes sont conseillées. L idée est de se connecter directement sur les serveurs du DLST (gallien notamment). Pour cela, les outils suivants sont nécessaires : Client VPN de l UJF : cet outil permet d établir une connexion réseau sécurisée entre votre ordinateur et le réseau de l UJF. Une fois cette connexion établie, votre ordinateur fait partie du réseau de l UJF. PUTTY : cet outil permet d ouvrir une session sécurisée sur l un des serveurs Unix du DLST. Il permet en particulier d ouvrir une console de commande analogue à une fenêtre xterm. XMING : il s agit d un simulateur X Window. Il est requis si votre ordinateur fonctionne sous Windows. Il remplace l outil XWin32 et permet d utiliser des logiciels tels que NEdit. L installation de ces outils s effectue selon les trois étapes suivantes : 1. Installer le client VPN : se connecter à l adresse https ://nomadisme.grenet.fr Choisir l établissement (UJF) et s identifier avec son identifiant et son mot de passe habituels. Suivre ensuite les instructions données. 2. Rechercher sur Internet et télécharger PUTTY : le site original se trouve à l adresse Le programme putty.exe est directement utilisable. Pour le configurer, effectuer les actions suivantes : (a) Exécuter 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

114 9.1. PROGRAMMER CHEZ SOI CHAPITRE 9. ANNEXES 3. Rechercher sur Internet et télécharger XMING : le site original se trouve à l adresse Pour installer le logiciel, télécharger puis exécuter le programme Xming setup.exe (ou une version plus récente le cas échéant). Pour démarrer 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 fenêtre de commande sur gallien. Vous pouvez ouvrir un fichier avec nedit, le compiler avec gcc, etc. Solution 2 : Travail en local sous Unix Si vous disposez d un ordinateur de type PC équipé de Linux, ou bien d un ordinateur Mac Intosh équipé de Mac OS X, dans ces deux cas vous n avez rien à faire, les outils de programmation sont en principe inclus d origine. Si l éditeur de texte présent sur votre ordinateur ne vous convient pas, vous pouvez rechercher nedit sur Internet et l installer. Solution 3 : Travail en local sous Windows Si votre ordinateur ne dispose que du système d exploitation Windows, vous pouvez installer l environnement Cygwin, disponible à l adresse Il s agit d un environnement Unix complet fonctionnant sous Windows. Son installation requiert une connexion internet à haut débit. Alternativement, vous pouvez installer l outil DEV C++, disponible à l adresse Il s agit d un environnement de programmation en langage C++ partiellement compatible avec le langage C. Son principal inconvénient est qu il ne permet pas de compiler ni d exécuter les programmes graphiques que vous aurez à réaliser dans la seconde moitié du semestre. 113

115 9.2. TRANSFERT DE FICHIERS DE COMPTE À COMPTE CHAPITRE 9. ANNEXES 9.2 Transférer des fichiers entre votre compte et le compte de votre binôme Il faut utiliser la commande Unix scp. Pour envoyer des fichiers à son binôme, il faut utiliser la commande : scp <nom du fichier local > <identifiant du binôme >@gallien:<nom du répertoire distant > Exemple de session pour copier tous les fichiers.c de mon répertoire de travail courant vers le répertoire TP7 de l étudiant ayant pour identifiant martin : $ scp *.c martin@gallien:inf111/tp7 martin@gallien s password: exo1.c 100% ***************************** :00 exo2.c 100% ***************************** :00 $ Pour récupérer des fichiers depuis le compte de son binôme, il faut utiliser la commande : scp <identifiant du binôme >@gallien:<nom du fichier distant > <nom du répertoire local > Exemple de session pour copier tous les fichiers.c du répertoire du TP7 de l étudiant martin vers le répertoire TP7 se trouvant dans mon répertoire de travail courant : $ scp martin@gallien:inf111/tp7/*.c TP7 martin@gallien s password: exo1.c 100% ***************************** :00 exo2.c 100% ***************************** :00 $ Remarques : 1. Le chemin distant spécifié dans la commande scp est toujours relatif au répertoire d accueil du compte distant, quelque soit le sens du transfert. 2. Le mot de passe à saisir est bien entendu celui du compte distant, c est à dire celui de son binôme. Les deux étudiants doivent donc être présents près du poste de travail pour pouvoir effectuer l opération 1. 1 On rappelle qu il est interdit de communiquer son mot de passe à un tiers

116 9.3. TRANSFERTS ENTRE DOMICILE ET COMPTE CHAPITRE 9. ANNEXES 9.3 Transférer des fichiers entre votre domicile et votre compte Unix au DLST Depuis chez vous vers le DLST Il faut utiliser deux outils : (1) un outil pour transférer vos fichiers depuis votre ordinateur à la maison vers votre compte Windows au DLST, et (2) un outil pour transférer les mêmes fichiers depuis le compte Windows vers le compte Unix. transfert maison compte Windows Pour envoyer des fichiers depuis votre ordinateur à la maison vers votre compte Windows au DLST, la méthode la plus simple est l utilisation d une clé USB. Une autre possibilité est d envoyer (via votre fournisseur d accès) un mail (avec ou sans fichiers attachés) vers votre adresse électronique à l UJF. Cette dernière adresse vous a été communiquée lors de votre inscription. Elle est de la forme : < Prenom >. <Nom >@e.ujf-grenoble.fr Attention : ne pas oublier le préfixe e. dans le nom de domaine. Vous pouvez aussi utiliser, si vous le souhaitez, l adresse électronique qui vous a été communiquée par votre fournisseur d accès, plutôt que votre adresse à l UJF. Si vous utilisez cette possibilité du courrier électronique, le mail envoyé (à vous-même) devra être lu sur l un des PC sous Windows du DLST, au moyen du navigateur Internet Firefox. Pour consulter votre boîte aux lettres à l UJF, vous pouvez passer par l un des URL suivants : Pour accéder à vos messages, il vous faudra saisir votre identifiant de connexion et votre mot de passe. Il s agit des mêmes informations que celles utilisées pour vous connecter localement sur les postes de travail dans les salles de TP. Lors de la consultation d un message, vous pouvez sauvegarder sur votre compte Windows les fichiers qui sont attachés à ce message. transfert compte Windows compte Unix Il faut utiliser l outil WinSCP3, installé sur tous les PC du DLST. Il s agit d un outil graphique, très facile à utiliser (à démarrer sous Windows bien entendu). Cet outil permet d effectuer les transferts (sécurisés) depuis le compte Windows vers le compte Unix, et réciproquement Depuis le DLST vers votre domicile Il y a deux méthodes 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 transférer un fichier texte unique, la commande à utiliser est : mailx -s "<sujet >" <adresse mail > < <nom du fichier texte> Exemple : mailx -s "exo tp7" [email protected] < exo1.c Pour transférer plusieurs fichiers, il faut utiliser la commande mailx autant de fois que nécessaire. 115

117 9.3. TRANSFERTS ENTRE DOMICILE ET COMPTE CHAPITRE 9. ANNEXES Pour transférer un répertoire complet, il faut d abord créer une archive (au moyen de la commande tar) et, si nécessaire, la compresser (au moyen de la commande gzip). Exemple : tar cf TP7.tar TP7 # création 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 format texte avant de pouvoir l envoyer via mailx. L outil à utiliser est uuencode qui s utilise ainsi : uuencode <nom du fichier à encoder > <nom du fichier à encoder >><nom du fichier encodé> Exemple : uuencode TP7.tar.gz TP7.tar.gz > TP7.tar.gz.uu Le fichier encodé obtenu peut ensuite être envoyé via mailx. Exemple : mailx -s "tp7" [email protected] < TP7.tar.gz.uu Il restera dans ce cas à recevoir le fichier à la maison, puis à le décoder. Le fichier décodé devra être ensuite décompressé (s il y a lieu) puis désarchivé. Exemple : uudecode TP7.tar.gz.uu # décodage : TP7.tar.gz.uu -> TP7.tar.gz gunzip TP7.tar.gz # décompression : TP7.tar.gz -> TP7.tar tar xf TP7.tar # désarchivage : TP7.tar -> TP7 Remarque : l utilisation des outils uudecode, gunzip et tar suppose que l étudiant dispose d un système Unix à la maison (Linux, par exemple), et que ces outils soient installés sur ce système. Dans le cas contraire les opérations de décodage et désarchivage devront être effectuées sous Windows, avec l outil approprié... transfert compte Unix maison via le compte Windows Il s agit dans ce cas de transférer les fichiers considérés en deux étapes : transfert du compte Unix vers le compte Windows, puis transfert du compte Windows vers la maison. 1. transfert compte Unix compte Windows : Il faut utiliser l outil WinSCP3, déjà mentionné pour les transferts compte Windows compte Unix. 2. Pour tranférer des fichiers depuis le compte Windows au DLST vers l ordinateur à la maison, il y a là encore deux possibilités : la clé USB, ou le mail. Pour la clé USB, la procédure à suivre est évidente. Pour le mail, l outil à utiliser est le service webmail, déjà mentionné pour les transferts maison compte Windows. 116

118 9.4. GÉNÉRATION ALÉATOIRE DE NOMBRES ENTIERS CHAPITRE 9. ANNEXES 9.4 Génération aléatoire de nombres entiers Certains exercices de ce polycopié sont basés sur l utilisation de suites de nombres entiers tirés au hasard. Un générateur aléatoire simplifié vous est fourni sous la forme de deux sous-programmes : la (pseudo) fonction hasard() et la procédure initialiser_germe(). Ces deux sous-programmes sont rassemblés au sein d une petite bibliothèque : la bibliothèque libhasard Fonction hasard() L entête de ce sous-programme est : int hasard(int inf, int sup); Si bi et bs sont deux entiers tels que bi bs, l exécution de hasard(bi, bs) produit un entier tiré aléatoirement dans l intervalle { bi... bs }. Exemples : v = hasard(12, 57); Après l exécution de cette instruction, la variable v contient un entier aléatoire compris dans l intervalle { }. printf("%d", hasard(-10, 10); L exécution de cette instruction a pour effet d afficher un entier aléatoire compris dans l intervalle { } Procédure initialiser_germe() L entête de ce sous-programme est : void initialiser_germe(unsigned int germe); L exécution de initialiser_germe(g) initialise (ou ré-initialise) le générateur aléatoire avec l entier naturel g : la suite de nombres produite par l invocation de la fonction hasard() (pour un intervalle de valeurs donné) est identique après chaque exécution de initialiser_germe appliquée à une même valeur de germe. Par contre, après deux exécutions de initialiser_germe() appliquées à deux valeurs de germe distinctes, les deux suites d entiers produites par la fonction hasard() seront nécessairement distinctes. Lors des exécutions successives d un même programme n appelant pas la procédure initialiser_germe(), l invocation de la fonction hasard() produira des suites d entiers successives distinctes deux à deux. Exemples : Après chaque exécution de : initialiser_germe(1457); l invocation répétée 5 fois de : v = hasard(12, 57); produira toujours la même suite (par exemple) : 17, 29, 12, 53, 38. Après l exécution de : initialiser_germe(365); l invocation répétée 5 fois de : v = hasard(12, 57); produira la suite (par exemple) : 19, 13, 13, 56, 22. Après l exécution de : initialiser_germe(0); l invocation répétée 5 fois de : v = hasard(12, 57); produira la suite (par exemple) : 49, 57, 45, 15,

119 9.4. GÉNÉRATION ALÉATOIRE DE NOMBRES ENTIERS CHAPITRE 9. ANNEXES Utilisation de la bibliothèque libhasard Les deux sous-programmes hasard() et initialiser_germe() sont déclarés dans le fichier hasard.h. En conséquence, tout programme utilisant le générateur aléatoire, doit comporter en tête de fichier la directive : #include "hasard.h" L accès automatique à la bibliothèque libhasard est obtenu en ajoutant l argument -lhasard à la commande gcc. Par exemple pour compiler le programme monprog.c, il faudra taper la commande : gcc -o monprog monprog.c -lhasard Remarques : L accès à la bibliothèque libhasard n est automatique que si vous avez configuré correctement votre environnement, c est à dire si vous avez en début de semestre exécuté la commande : source /Public/INF111/config.sh. Si vous travaillez sur votre propre ordinateur à la maison, il vous faudra disposer dans votre répertoire de travail des deux fichiers hasard.h et hasard.c. Vous pouvez récupérer une copie de ces deux fichiers sur le serveur gallien du DLST dans le répertoire /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 Exemples de programme Les deux programmes qui suivent affichent 10 entiers aléatoires compris entre 50 et 100 : 1. Sans initialisation du générateur aléatoire /**********************************************************************/ #include "hasard.h" int main(void) { int i; for (i = 1 ; i <= 10 ; i = i + 1) { printf("%i ", hasard(50, 100)); } return 0; } /**********************************************************************/ L exécution de ce programme le 4 septembre à 11 heures 33 minutes et 14 secondes affiche le résultat : Ce même programme exécuté 7 secondes plus tard affiche :

120 9.4. GÉNÉRATION ALÉATOIRE DE NOMBRES ENTIERS CHAPITRE 9. ANNEXES 2. Avec initialisation du générateur aléatoire /**********************************************************************/ #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 exécutions de ce programme afficheront toutes le même résultat : 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

121 9.5. LA BIBLIOTHÈQUE GRAPHSIMPLE CHAPITRE 9. ANNEXES 9.5 La bibliothèque graphsimple Dans plusieurs des TP proposés dans ce poly le programme réalisé doit afficher des figures géométriques dans une fenêtre graphique. Cette fenêtre est distincte de la fenêtre de l interprète de commandes (le shell ) Unix. Elle est créée au moyen de la bibliothèque graphsimple qui permet également d effectuer des tracés graphiques dans cette fenêtre. La bibliothèque graphsimple fournit un ensemble de sous-programmes (procédures et fonctions) prêts à l emploi dont la description est donnée en section ci-après La fenêtre graphique Coordonnées et repère Chaque point (ou pixel ) de la fenêtre graphique est caractérisé par ses coordonnées dans un repère plan constitué de deux axes principaux, l axe des abscisses (X) et l axe des ordonnées (Y ). Ce repère graphique diffère du repère habituel utilisé en mathématiques : L origine (le point de coordonnées < 0, 0 >) est situé tout en haut et à gauche de la partie utile de la fenêtre graphique. L axe des abscisses est dirigé vers la droite. L axe des ordonnées est dirigé vers le bas. Utilisation de la bibliothèque graphsimple Chaque programme devant utiliser la bibliothèque graphsimple doit inclure le fichier graphsimple.h au moyen de la directive suivante (à placer en tout début de programme) : #include "graphsimple.h" La création et l ouverture de la fenêtre graphique sont obtenues au moyen de l instruction : Initialiser(l, h); Cette instruction a pour effet de créer une fenêtre dont la largeur et la hauteur sont données respectivement par les paramètres l et h. Si par exemple l vaut 600 et h vaut 400, une fenêtre graphique de dimensions utiles sera créée et apparaîtra sur l écran de l utilisateur. Une fois la fenêtre graphique créée, il est possible d y réaliser des tracés graphiques au moyen des divers sous-programmes fournis par la bibliothèque graphsimple. Toutefois, l exécution de ces sous-programmes est en général trop rapide pour que l utilisateur puisse avoir le temps d observer le résultat affiché : le programme s exécute puis se termine ce qui provoque la fermeture et la destruction automatiques de la fenêtre graphique. Pour permettre à l utilisateur d observer le contenu de la fenêtre graphique aussi longtemps qu il le souhaite il faut utiliser l instruction suivante : AttendreClic(); Cette instruction a pour effet de bloquer l exécution du programme jusqu à ce que l utilisateur effectue un clic souris dans la fenêtre graphique de ce programme. 120

122 9.5. LA BIBLIOTHÈQUE GRAPHSIMPLE CHAPITRE 9. ANNEXES Il est possible de fermer la fenêtre graphique avant la fin de l exécution du programme. Il faut utiliser l instruction : Clore(); La bibliothèque graphsimple n est pas une bibliothèque standard du langage C. Pour compiler un programme utilisant cette bibliothèque il faut donc utiliser une commande spéciale, la commande gccgraph. Voici un exemple d utilisation de cette commande : durand@gallien:~/inf111/tp5$ gccgraph prog.c -o prog Principaux sous-programmes de la bibliothèque graphsimple Exemple d utilisation de procédures de tracé Spécification 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

123 9.5. LA BIBLIOTHÈQUE 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

124 9.5. LA BIBLIOTHÈQUE 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

125 9.5. LA BIBLIOTHÈQUE 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

126 9.6. FONCTIONS DE LA LIBC CHAPITRE 9. ANNEXES 9.6 Les fonctions de la bibliothèque du langage C On présente ici quelques fonctions de la bibliothèque définie par la norme ANSI. Les fonctions, les types et les macros de la bibliothèque standard sont déclarés dans les fichiers d en-tête : ctype.h, math.h, stdlib.h, stdio.h, string.h, time.h,... Le détail des fonctions et procédures graphiques sera prśenté dans l annexe suivante Les entrées-sorties : < stdio.h > Le prototype de la fonction printf est : int printf ( cha^ıne de caractères, liste d expressions ); Le premier argument est une chaîne de caractères dite chaîne de formatage, les autres arguments sont des expressions. Cette chaîne de formatage contient des caractères qui seront reproduits fidèlement sur la sortie standard (par défaut, l écran) et des spécifications de conversion. Une spécification de conversion est un mot commençant par le caractère % et sera remplacée par une valeur. Chaque spécification de conversion correspond à un argument de printf : la première spécification au deuxième argument, la deuxième spécification au troisième et... ainsi de suite. Chaque spécification précise le format selon lequel on veut imprimer la valeur de l expression associée. Les spécifications sont, entre autres : %c (caractère), %i ou %d (entier sous forme décimale), %f (nombre avec virgule), %s (chaîne de caractères), %p (pour un pointeur). À aucun moment, ni dans la phase de compilation, ni dans la phase d exécution, il n est procédé à une vérification de la cohérence entre spécification de conversion et type de l expression associée. La fonction printf retourne le nombre de caractères écrits. Le prototype de la fonction scanf est : scanf ( cha^ıne de caractères, liste d arguments ); Le premier argument est une chaîne de caractères dite chaîne de formatage, les autres arguments sont des pointeurs (adresses de variables). Cette chaîne de formatage contient, comme ci-dessus, des spécifications de conversions. Chaque spécifications de conversions correspond à un argument de scanf : la première spécification au deuxième argument, la deuxième spécification au troisième et... ainsi de suite. La procédure scanf lit tous les caractères sur l entrée standard ((stdin) par défaut, le clavier). Elle les interprète selon les spécifications incluses dans la chaîne de formatage et stocke les résultats à l adresse associée. Les spécifications de conversion sont, entre autres : %c (caractère), %i ou %d (entier sous forme décimale), %lf (nombre avec virgule de type double), %s (chaîne de caractères), %p (pour un pointeur). La spécification %s est une spécification de conversion indiquant que scanf doit recueillir dans le flux d entrée une chaîne de caractères. Cette fonction considère qu une chaîne de caractères est terminée dès qu elle rencontre un espace, une tabulation, le caractère newline (le 10ième caractère de la table ASCII ou \n ). La fonction scanf retourne le nombre de variables lues. int sprintf (char *s, cha^ıne de caractères, listes d expression ) identique à printf, le résultat (terminé par \0) est écrit dans la chaîne s. int getchar (void) retourne le caractère suivant de l entrée standard, ou EOF en fin de fichier. int put (int c) écrit le caractère c sur la sortie standard. char *gets (char *s) 125

127 9.6. FONCTIONS DE LA LIBC CHAPITRE 9. ANNEXES lit la ligne suivante et la place dans s. Exercice : Comment vider le buffer associé à stdin? Les fonctions de catégorie de caractères : < ctype.h > Toutes ces fonctions ont le même prototype, i.e. int nom-de-fonction (int c); Elles retournent une valeur non nulle si l argument c remplit la condition et zéro 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 majuscule int isalnum (int c) vraie sss c est une lettre ou un digit. int isprint (int c) vraie sss c est un caractère imprimable int islower (int c) vraie sss c est une lettre minuscule int isupper (int c) vraie sss c est une lettre majuscule int isspace (int c) vraie sss c est, sautdepage, \n, retouchariot, tabulatv, tabulath Les fonctions mathématiques : < math.h > Toutes ces fonctions ont le même 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 carrée de x double ceil (double x) plus petit entier supérieur à x double floor (double x) plus grand entier inférieur à x double pow (double x, double y) x puissance y La commande de compilation pour un fichier fich.c utilisant des fonctions mathématiques devient : gcc Wall ansi lm fich.c o fich L adjonction de lm a pour objet de lier notre programme avec la bibliothèque mathématique où sont précompilées les fonctions de la bibliothèque math.h. La commande gcc effectue deux opérations, la compilation du programme et l édition de liens avec des fonctions précompilées archivées dans des bibliothèques. L inclusion du fichier math.h est nécessaire pour la compilation mais est évidemment insuffisante pour obtenir un programme exécutable. Ces codes compilés des 126

128 9.6. FONCTIONS DE LA LIBC CHAPITRE 9. ANNEXES fonctions math.h sont contenues dans la bibliothèque mathématique libm.a et doivent être liées à notre programme pour qu il puisse être exécutable. Par défaut, la commande gcc compile le programme et effectue l édition de liens avec la bibliothèque standard libc.a (usr/lib/libc.a) Les fonctions utilitaires : < stdlib.h > int rand (void) retourne un entier uniformément tiré dans [ 0 et RAND MAX ] void srand (int germe) initialisation du générateur aléatoire 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 à l environnement qui l exécute Les fonctions de traitement des chaînes : < string.h > char *strcpy (sres, sinit) copie la chaîne sinit dans sres. char *strcat (sres, sinit) concatène la chaîne sinit à 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 première occurrence de c dans s ou NULL si aucune 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 écoulées depuis le 01/01/

129 9.7. LE PRÉPROCESSEUR CHAPITRE 9. ANNEXES 9.7 Le préprocesseur La toute première phase du compilateur est confiée au pré-processeur. Il est plus précis de dire que le travail du compilateur commence véritablement après cette phase du pré-processeur. Les instructions du pré-processeur s appellent des directives, commencent par le caractère # et se terminent à la fin d une ligne. Le rôle du pré-processeur : - définir des macros, une définition de macro peut être placée n importe où dans le programme, à condition de figurer avant son utilisation. La directive de définition de macro est # define. - remplacer tout nom de macro par le corps de la macro correspondante, cette opération s appelle une substitution de macro. - inclure des fichiers sources, comme des fichiers d en-tête. La directive d inclusion de fichier est #include. - de réaliser des compilations conditionnelles de certaines parties du programme. Les directives sont #if, #ifdef, #ifndef, #elif. - et aussi de supprimer les backslashs terminaux d une ligne. - et aussi de supprimer les commentaires, préparant ainsi le travail du compilateur. Toutes les directives du pré-processeur commencent par le signe # et se termine par un passage à la ligne. Les directives les plus courantes sont : #define, #include, #undef, #if, #elif, #else, #ifdef, #endif. Le directive #define demande au pré-processeur de remplacer chaque occurrence d une chaîne par une autre chaîne. Voici des exemples : #define PI #define PAYS France #define SOMME (12+8) Chaque occurrence de PI sera remplacée par dans toute la suite du fichier.... Certains auteurs utilisent cette directive pour remédier au fait que le langage C ne connaît pas le type booléen : #define bool int #define VRAI (0 == 0) #define FAUX! VRAI La directive #undef annule la définition de la macro pour toute la suite du fichier. Ex : #undef PAYS à partir de cette directive PAYS n est plus considérée comme une macro. Il est assez fréquent de vouloir, dans une phase de mise au point d un programme, supprimer (cacher) une partie du code. L idée de mettre cette partie en commentaire n est souvent pas utilisable, puisque le langage C n accepte pas les commentaires emboîtés. Nous donnons des exemples sans les expliquer de suppression de code : #if 0... ici le code ne sera pas compilé... #endif #if NEXISTEPAS... si NEXITEPAS est une macro non définie alors le code ici n est pas compilé

130 9.7. LE PRÉPROCESSEUR CHAPITRE 9. ANNEXES #endif L expression associée au #if est évaluée. Si celle-ci vaut 1 le code qui suit le #if jusqu au prochain #endif, #elif ou #else est évalué. Il n est pas évalué si l expression vaut 0. Un identificateur de macro est remplacé par 1 si la macro est définie et 0 sinon. Un nom de macro peut être suivi d un ou plusieurs arguments, ce qui permet de l utiliser comme une fonction, dans ce cas, il ne faut pas de blanc entre le nom de la macro et la parenthèse ouvrante. 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 dernière macro n impose pas de type à ses paramètres, ce qui ne serait pas le cas d une fonction équivalente. 129

131 9.8. BIBLIOGRAPHIE CHAPITRE 9. ANNEXES 9.8 Bibliographie Liens et références générales http ://dmoz.org/world/français/informatique/programmation/langages/c/ (Liens vers des cours et exercices corrigés de langage C.) Hansel, G. et Champarnaud, J-M. Passeport pour Unix et C. International Thomson Publishing France Drix, P. Langage C norme ANSI, vers une approche orientée objet. Masson Cassagne, B. Introduction au Langage C. Accessible à 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 2 ime édition 2000 (Livre écrit par les deux concepteurs du langage C.) Braquelaire J-P. Méthodologie de la programmation en langage C, principes et applications. Masson 2 ime édition Trau, P. Cours de langage C. http ://www-ipst.u-strasbg.fr/pat/program/tpc.htm (Un cours clair comprenant les notions abordées en cours et quelques autres.) http :// rumeau/fclc/ (Une FAQ sérieuse et complète sur le langage C) Références dans d autres langues Le livre de Kernighan et Ritchie a été traduit dans un très grand nombre de langues. Les références de ces traductions sont disponibles sur le site http ://cm.bell-labs.com/cm/cs/cbook/. Pour se procurer un de ces ouvrages, il est possible de le commander sur un site de vente par correspondance comme http :// 130

TP1 - Prise en main de l environnement Unix.

TP1 - Prise en main de l environnement Unix. Mise à niveau UNIX Licence Bio-informatique TP1 - Prise en main de l environnement Unix. Les sujets de TP sont disponibles à l adresse http://www.pps.jussieu.fr/~tasson/enseignement/bioinfo/ Les documents

Plus en détail

TP 1 Prise en main de l environnement Unix

TP 1 Prise en main de l environnement Unix Introduction aux systèmes d exploitation (IS1) TP 1 Prise en main de l environnement Unix Le but de ce premier TP est de commencer à vous familiariser avec l environnement Unix. 1 Ouverture de session

Plus en détail

Mon aide mémoire traitement de texte (Microsoft Word)

Mon aide mémoire traitement de texte (Microsoft Word) . Philippe Ratat Mon aide mémoire traitement de texte (Microsoft Word) Département Ressources, Technologies et Communication Décembre 2006. Sommaire PRÉSENTATION DU DOCUMENT 1 Objectif principal 1 Deux

Plus en détail

1 CRÉER UN TABLEAU. IADE Outils et Méthodes de gestion de l information

1 CRÉER UN TABLEAU. IADE Outils et Méthodes de gestion de l information TP Numéro 2 CRÉER ET MANIPULER DES TABLEAUX (Mise en forme, insertion, suppression, tri...) 1 CRÉER UN TABLEAU 1.1 Présentation Pour organiser et présenter des données sous forme d un tableau, Word propose

Plus en détail

Unix/Linux I. 1 ere année DUT. Université marne la vallée

Unix/Linux I. 1 ere année DUT. Université marne la vallée Unix/Linux I 1 ere année DUT Université marne la vallée 1 Introduction 2 Fonctions et spécifité d Unix Architecture 3 4 5 Fichier Unix Arborescence de fichiers Quelques commandes sur les fichiers Chemins

Plus en détail

Outils pour la pratique

Outils pour la pratique Cinquième partie Outils pour la pratique 121 CHAPITRE 1 Les bases des séances de TP Avant de lire cettre section, il est suggéré de relire vos notes de cours se rapportant au système d exploitation Unix.

Plus en détail

l'ordinateur les bases

l'ordinateur les bases l'ordinateur les bases Démarrage de l'ordinateur - Le bureau, mon espace de travail - J'utilise la souris - Ouvertes ou fermées, les fenêtres - Dans l'ordinateur, tout est fichier - Le clavier : écrire,

Plus en détail

TP1 : Initiation à l algorithmique (1 séance)

TP1 : Initiation à l algorithmique (1 séance) Université de Versailles Vanessa Vitse IUT de Vélizy - Algorithmique 2006/2007 TP1 : Initiation à l algorithmique (1 séance) 1 Prise en main de l environnement Unix : rappels et compléments Le but de la

Plus en détail

Démarrer et quitter... 13

Démarrer et quitter... 13 Démarrer et quitter... 13 Astuce 1 - Ouvrir, modifier, ajouter un élément dans le Registre... 14 Astuce 2 - Créer un point de restauration... 18 Astuce 3 - Rétablir un point de restauration... 21 Astuce

Plus en détail

VOCABULAIRE LIÉ AUX ORDINATEURS ET À INTERNET

VOCABULAIRE LIÉ AUX ORDINATEURS ET À INTERNET VOCABULAIRE LIÉ AUX ORDINATEURS ET À INTERNET Brancher / débrancher l ordinateur de la prise Allumer / éteindre l ordinateur : pour allumer ou éteindre l ordinateur vous devez appuyer sur le bouton On/off

Plus en détail

26 Centre de Sécurité et de

26 Centre de Sécurité et de 26 Centre de Sécurité et de Maintenance La fenêtre du Centre de sécurité et de maintenance (CSM) rassemble tous les outils nécessaires au contrôle, à l analyse, à la maintenance, à la sauvegarde et au

Plus en détail

La mémoire. Un ordinateur. L'octet. Le bit

La mémoire. Un ordinateur. L'octet. Le bit Introduction à l informatique et à la programmation Un ordinateur Un ordinateur est une machine à calculer composée de : un processeur (ou unité centrale) qui effectue les calculs une mémoire qui conserve

Plus en détail

Cahier n o 6. Mon ordinateur. Fichiers et dossiers Sauvegarde et classement

Cahier n o 6. Mon ordinateur. Fichiers et dossiers Sauvegarde et classement Cahier n o 6 Mon ordinateur Fichiers et dossiers Sauvegarde et classement ISBN : 978-2-922881-10-3 2 Table des matières Fichiers et dossiers Sauvegarde et classement La sauvegarde 4 Enregistrer 4 De quelle

Plus en détail

TIC INFORMATIQUE Ce que je dois retenir

TIC INFORMATIQUE Ce que je dois retenir TIC INFORMATIQUE Ce que je dois retenir 6 ème Synthèse N 1 Rappel : - L informatique est un outil utilisé dans toutes les matières, et est présente, de plus en plus, dans les foyers. - Les compétences

Plus en détail

La Clé informatique. Formation Excel XP Aide-mémoire

La Clé informatique. Formation Excel XP Aide-mémoire La Clé informatique Formation Excel XP Aide-mémoire Septembre 2005 Table des matières Qu est-ce que le logiciel Microsoft Excel?... 3 Classeur... 4 Cellule... 5 Barre d outil dans Excel...6 Fonctions habituelles

Plus en détail

Access 2007 FF Access FR FR Base

Access 2007 FF Access FR FR Base ACCESS Basic Albertlaan 88 Avenue Albert Brussel B-1190 Bruxelles T +32 2 340 05 70 F +32 2 340 05 75 E-mail [email protected] Website www.keyjob-training.com BTW TVA BE 0425 439 228 Access 2007

Plus en détail

iil est désormais courant de trouver sur Internet un document

iil est désormais courant de trouver sur Internet un document Matériels et systèmes L Acrobat qui cherche dans les PDF Michel NARCY - Formateur TICE et Médialog Bulletin officiel, programmes d enseignement, articles de quotidiens ou de revues scientifiques... De

Plus en détail

TD séances n 3 et n 4 Répertoires et Fichiers sous Unix

TD séances n 3 et n 4 Répertoires et Fichiers sous Unix Ce TP est destiné à vous familiariser avec les fichiers sous l'environnement UNIX. Fortement axé sur la pratique, il aborde la création, la manipulation et la suppression des répertoires et fichiers. 1

Plus en détail

Organiser le disque dur Dossiers Fichiers

Organiser le disque dur Dossiers Fichiers Ce document contient des éléments empruntés aux pages d aide de Microsoft Organiser le disque dur Dossiers Fichiers Généralités La connaissance de la logique d organisation des données sur le disque dur

Plus en détail

Placez vous au préalable à l endroit voulu dans l arborescence avant de cliquer sur l icône Nouveau Répertoire

Placez vous au préalable à l endroit voulu dans l arborescence avant de cliquer sur l icône Nouveau Répertoire L espace de stockage garantit aux utilisateurs une sauvegarde de leurs fichiers dans une arborescence à construire par eux-mêmes. L avantage de cet espace de stockage est son accessibilité de l intérieur

Plus en détail

L ARBORESCENCE. Qu est-ce qu un dossier? L arborescence?

L ARBORESCENCE. Qu est-ce qu un dossier? L arborescence? L ARBORESCENCE Qu est-ce qu un dossier? Un dossier est une pochette vide dans laquelle on peut disposer des documents créés à l aide de l outil informatique. Comme les systèmes utilisés dans la vie courante

Plus en détail

Réparer un disque dur passé en RAW

Réparer un disque dur passé en RAW Réparer un disque dur passé en RAW Vous branchez comme d habitude votre disque dur externe à votre ordinateur afin de récupérer son contenu ou de lui ajouter des fichiers quand Windows vous propose de

Plus en détail

1. Ouvrir Internet Explorer 2. 2. Faire défiler une page 2. 3. Naviguer dans un site Internet 2. 4. Changer d adresse Internet (URL) 2

1. Ouvrir Internet Explorer 2. 2. Faire défiler une page 2. 3. Naviguer dans un site Internet 2. 4. Changer d adresse Internet (URL) 2 1. Ouvrir Internet Explorer 2 2. Faire défiler une page 2 3. Naviguer dans un site Internet 2 4. Changer d adresse Internet (URL) 2 5. Gérer l affichage des pages Internet 3 6. Pages précédentes et suivantes

Plus en détail

INSERER DES OBJETS - LE RUBAN INSERTION... 3 TABLEAUX

INSERER DES OBJETS - LE RUBAN INSERTION... 3 TABLEAUX TABLE DES MATIERES Livret Utilisateur Excel 2007 Niveau 2 INSERER DES OBJETS - LE RUBAN INSERTION... 3 TABLEAUX... 4 Les tableaux croisés dynamiques... 4 Création d un tableau croisé... 5 Comparer des

Plus en détail

8. Gestionnaire de budgets

8. Gestionnaire de budgets 8. Gestionnaire de budgets 8.1 Introduction Le Gestionnaire de budgets (Budget Workbench) permet aux utilisateurs de travailler sur les données budgétaires qu ils ont importées sur leur station de travail

Plus en détail

PRISE EN MAIN D UN TABLEUR. Version OPEN OFFICE

PRISE EN MAIN D UN TABLEUR. Version OPEN OFFICE PRISE EN MAIN D UN TABLEUR Version OPEN OFFICE Prise en main d un tableur page 2 1. L utilisation de la souris Pour faire fonctionner un tableur, on utilise le clavier mais aussi la souris. Rappelons,

Plus en détail

GUIDE Excel (version débutante) Version 2013

GUIDE Excel (version débutante) Version 2013 Table des matières GUIDE Excel (version débutante) Version 2013 1. Créer un nouveau document Excel... 3 2. Modifier un document Excel... 3 3. La fenêtre Excel... 4 4. Les rubans... 4 5. Saisir du texte

Plus en détail

Cliquez sur le site que vous souhaitez consulter, il s affichera directement dans le navigateur.

Cliquez sur le site que vous souhaitez consulter, il s affichera directement dans le navigateur. GERER SES FAVORIS AVEC INTERNET EXPLORER Un favori est un marque-page virtuel qui permet de mémoriser l'adresse URL d'une page web. Cette adresse est donc enregistrée par le logiciel de navigation. Un

Plus en détail

COURS BARDON - EXCEL 2010

COURS BARDON - EXCEL 2010 COURS BARDON - EXCEL 2010 Sommaire EXCEL 2010 - INTRODUCTION 3 FONDAMENTAUX OFFICE 2010 3 EXCEL 3 1. L ECRAN 3 2. BARRE D ETAT : CALCULS ET MODES D AFFICHAGE 7 3. PARAMETRAGE DU LOGICIEL 7 Chapitre 1 GESTION

Plus en détail

Le langage C. Séance n 4

Le langage C. Séance n 4 Université Paris-Sud 11 Institut de Formation des Ingénieurs Remise à niveau INFORMATIQUE Année 2007-2008 Travaux pratiques d informatique Le langage C Séance n 4 But : Vous devez maîtriser à la fin de

Plus en détail

Vous allez le voir au cours de ce premier chapitre, 1. Découvrir l ipad

Vous allez le voir au cours de ce premier chapitre, 1. Découvrir l ipad 1. Découvrir l ipad Vous allez le voir au cours de ce premier chapitre, l utilisation de l ipad est très intuitive et, surtout, votre tablette obéit au doigt et à l œil. Vous ne pourrez bientôt plus vous

Plus en détail

Tutoriel. Votre site web en 30 minutes

Tutoriel. Votre site web en 30 minutes Tutoriel Votre site web en 30 minutes But du tutoriel Nous allons vous présenter comment réaliser rapidement votre site avec Web Creator Pro 6 en vous basant sur l utilisation des modèles fournis avec

Plus en détail

Document d accompagnement pour l utilisation du Cartable en ligne Lycée des Métiers Fernand LÉGER 2013/2014

Document d accompagnement pour l utilisation du Cartable en ligne Lycée des Métiers Fernand LÉGER 2013/2014 Document d accompagnement pour l utilisation du Cartable en ligne Lycée des Métiers Fernand LÉGER 2013/2014 Le Cartable en ligne est un Environnement numérique de travail (ENT) dont la vocation est de

Plus en détail

1 - Se connecter au Cartable en ligne

1 - Se connecter au Cartable en ligne Le Cartable en ligne est un Environnement numérique de travail (ENT) dont la vocation est de proposer un ensemble de services en ligne, personnalisés et sécurisés, accessibles aux élèves et aux professeurs,

Plus en détail

RACCOURCIS CLAVIERS. DEFINITION : Une «combinaison de touches» est un appui simultané sur plusieurs touches.

RACCOURCIS CLAVIERS. DEFINITION : Une «combinaison de touches» est un appui simultané sur plusieurs touches. S Vous n aimez pas la souris Les raccourcis clavier sont là pour vous faciliter la vie! INTRODUCTION : Vous avez du mal à vous habituer à la manipulation de la souris Des solutions existent : les raccourcis

Plus en détail

TP 4 de familiarisation avec Unix

TP 4 de familiarisation avec Unix TP 4 de familiarisation avec Unix Réseau Filtres (suite) Variables Scripts Vincent Berry - [email protected] IMPORTANT : la prise de notes est une pratique très importante et pourtant négligée, elle est

Plus en détail

Réparer un disque dur passé en RAW

Réparer un disque dur passé en RAW Réparer un disque dur passé en RAW Vous branchez comme d habitude votre disque dur externe à votre ordinateur afin de récupérer son contenu ou de lui ajouter des fichiers quand Windows vous propose de

Plus en détail

Your Detecting Connection. Manuel de l utilisateur. [email protected]

Your Detecting Connection. Manuel de l utilisateur. support@xchange2.net Your Detecting Connection Manuel de l utilisateur [email protected] 4901-0128-5 ii Table des matières Table des matières Installation... 4 Conditions d utilisation de XChange 2...4 Définir vos Préférences

Plus en détail

Traitement de texte : Quelques rappels de quelques notions de base

Traitement de texte : Quelques rappels de quelques notions de base Traitement de texte : Quelques rappels de quelques notions de base 1 Quelques rappels sur le fonctionnement du clavier Voici quelques rappels, ou quelques appels (selon un de mes profs, quelque chose qui

Plus en détail

0.1 Mail & News : Thunderbird

0.1 Mail & News : Thunderbird 0.1 Mail & News : Thunderbird 1 0.1 Mail & News : Thunderbird Thunderbird est le lecteur de mail, de newsgroup et de flux RSS de la fondation Mozilla. Il est disponible pour Linux (en version gtk2), pour

Plus en détail

GESTION DU LOGO. 1. Comment gérer votre logo? 2. 2.1. Format de l image 7 2.2. Dimensions de l image 8 2.3. Taille de l image 9

GESTION DU LOGO. 1. Comment gérer votre logo? 2. 2.1. Format de l image 7 2.2. Dimensions de l image 8 2.3. Taille de l image 9 GESTION DU LOGO 1. Comment gérer votre logo? 2 1.1. Insérer un logo 3 1.1.1. Insérer un logo dans le bandeau 3 1.1.2. Insérer un logo dans les éditions 4 1.2. Supprimer un logo 6 1.2.1. Supprimer un logo

Plus en détail

SOMMAIRE ÉTAPES OBLIGATOIRES. Récupérer le connecteur... 3

SOMMAIRE ÉTAPES OBLIGATOIRES. Récupérer le connecteur... 3 SOMMAIRE Futur Telecom a fait évoluer son service de messagerie professionnel Futur Office. Le présent document va vous accompagner pas à pas vers la récupération de vos divers éléments de messagerie suite

Plus en détail

sommaire ÉTAPES OBLIGATOIRES Récupérer le connecteur... 3

sommaire ÉTAPES OBLIGATOIRES Récupérer le connecteur... 3 sommaire Futur Telecom a fait évoluer son service de messagerie professionnel Futur Office. Le présent document va vous accompagner pas à pas vers la récupération de vos divers éléments de messagerie suite

Plus en détail

Créer un premier document avec Pages

Créer un premier document avec Pages 1 Créer un premier document avec Pages Dans ce chapitre, vous aborderez les fonctions élémentaires de Pages par le biais de la rédaction d une lettre et de la réalisation d une carte d anniversaire à l

Plus en détail

1. Démarrage de l ordinateur

1. Démarrage de l ordinateur Atelier réalisé par Patricia Wasko Netsteward Administration Communale de Seneffe Service Informatique 1. Démarrage de l ordinateur Au démarrage de votre ordinateur, vous devez tout d abord ouvrir une

Plus en détail

Gestion des documents avec ALFRESCO

Gestion des documents avec ALFRESCO Gestion des documents avec ALFRESCO 1 INTRODUCTION : 2 1.1 A quoi sert ALFRESCO? 2 1.2 Comment s en servir? 2 2 Créer d un site collaboratif 3 2.1 Créer le site 3 2.2 Inviter des membres 4 3 Accéder à

Plus en détail

Securexam Consignes pour l EFU Les 2, 3 et 4 juin 2015

Securexam Consignes pour l EFU Les 2, 3 et 4 juin 2015 Securexam Consignes pour l EFU Les 2, 3 et 4 juin 2015 ATTENTION : Consignes aux candidats qui doivent encrypter leur clé USB : Une fois votre ordinateur démarré, avant de lancer Securexam (CA), procédez

Plus en détail

LES TOUT PREMIERS PAS

LES TOUT PREMIERS PAS DESMODO, un logiciel de gestion d idées http://www.desmodo.net/ LES TOUT PREMIERS PAS Desmodo est un logiciel (libre) qui permet, entre autre, de visualiser et de synthétiser, de manière organisée, sous

Plus en détail

PROCÉDURE D AIDE AU PARAMÉTRAGE

PROCÉDURE D AIDE AU PARAMÉTRAGE PROCÉDURE D AIDE AU PARAMÉTRAGE SOMMAIRE Futur a fait évoluer son service de messagerie professionnel Futur Office. Le présent document va vous accompagner pas à pas vers la récupération de vos divers

Plus en détail

Débuter avec Excel. Excel 2007-2010

Débuter avec Excel. Excel 2007-2010 Débuter avec Excel Excel 2007-2010 Fabienne ROUX Conseils & Formation 10/04/2010 TABLE DES MATIÈRES LE RUBAN 4 LE CLASSEUR 4 RENOMMER LES FEUILLES DU CLASSEUR 4 SUPPRIMER DES FEUILLES D UN CLASSEUR 4 AJOUTER

Plus en détail

USTL - Licence ST-A 1ère année 2005-2006 Initiation à la programmation TP 1

USTL - Licence ST-A 1ère année 2005-2006 Initiation à la programmation TP 1 USTL - Licence ST-A 1ère année 2005-2006 Initiation à la programmation TP 1 Objectifs du TP Ce TP a pour but de vous faire découvrir l environnement de travail que vous utiliserez dans le cadre des TP

Plus en détail

1.1 L EXPLORATEUR WINDOWS

1.1 L EXPLORATEUR WINDOWS Gérer les fichiers et les dossiers Cette partie du T.P. a pour objectifs de vous familiariser avec les méthodes pour copier, déplacer, effacer, renommer des dossiers et des fichiers. 1.1 L EXPLORATEUR

Plus en détail

WinTask x64 Le Planificateur de tâches sous Windows 7 64 bits, Windows 8/8.1 64 bits, Windows 2008 R2 et Windows 2012 64 bits

WinTask x64 Le Planificateur de tâches sous Windows 7 64 bits, Windows 8/8.1 64 bits, Windows 2008 R2 et Windows 2012 64 bits WinTask x64 Le Planificateur de tâches sous Windows 7 64 bits, Windows 8/8.1 64 bits, Windows 2008 R2 et Windows 2012 64 bits Manuel d initiation du Planificateur 2 INTRODUCTION 5 CHAPITRE I : INSTALLATION

Plus en détail

Atelier La notion de session utilisateur sous Linux

Atelier La notion de session utilisateur sous Linux Chapitre 6 Atelier La notion de session utilisateur sous Linux I Présentation Nous allons voir la notion de session et d utilisateur sous linux, ainsi que quelques commandes de base afin de mieux comprendre

Plus en détail

PAGE 1. L écran du logiciel d Open Office Draw. Barre de menu: Les commandes du logiciel

PAGE 1. L écran du logiciel d Open Office Draw. Barre de menu: Les commandes du logiciel PAGE L écran du logiciel d Open Office Draw Nom du document : Nom d enregistrement Barre de mise forme: Ligne, couleurs, fond,... Barre de menu: Les commandes du logiciel Barre d outils: Les boutons de

Plus en détail

La saisie d un texte

La saisie d un texte La saisie d un texte On utilise le clavier pour la saisie des textes. C est une partie importante du travail. Il est indispensable de respecter un certain nombre de règles pour que le travail soit plus

Plus en détail

Rapports d activités et financiers par Internet. Manuel Utilisateur

Rapports d activités et financiers par Internet. Manuel Utilisateur Rapports d activités et financiers par Internet Manuel Utilisateur Table des matières 1. Introduction... 3 2. Pré requis... 3 3. Principe de fonctionnement... 3 4. Connexion au site Internet... 4 5. Remplir

Plus en détail

Saisissez le login et le mot de passe (attention aux minuscules et majuscules) qui vous ont

Saisissez le login et le mot de passe (attention aux minuscules et majuscules) qui vous ont I Open Boutique Sommaire : I Open Boutique... 1 Onglet «Saisie des Produits»... 3 Création d'une nouvelle fiche boutique :... 3 Création d'une nouvelle fiche lieux de retraits :... 10 Création d'une nouvelle

Plus en détail

Installation du logiciel Windows Suivant Démarrer Tous les programmes Démarrer Tous les programmes Marketing Manager Marketing Manager Linux ici Mac

Installation du logiciel Windows Suivant Démarrer Tous les programmes Démarrer Tous les programmes Marketing Manager Marketing Manager Linux ici Mac Le Marketing Manager de bluevizia est un outil informatique facile à utiliser et moderne pour le développement et la gestion des processus marketing. Installation du logiciel Windows Double cliquez avec

Plus en détail

Utiliser un tableau de données

Utiliser un tableau de données Utiliser un tableau de données OBJECTIFS : - Définir une Base de Données. - Présentation : tableau de données. - Création d un tableau de données - Gestion d un tableau de données. - Trier et Filtrer des

Plus en détail

Club informatique Mont-Bruno Séances du 08 et 20 novembre 2013 Présentateur : Guy Bélanger Co-auteur : Réjean Côté

Club informatique Mont-Bruno Séances du 08 et 20 novembre 2013 Présentateur : Guy Bélanger Co-auteur : Réjean Côté Contenu de la rencontre Club informatique Mont-Bruno Séances du 08 et 20 novembre 2013 Présentateur : Guy Bélanger Co-auteur : Réjean Côté Les fonctions de base de Windows Live Mail - Le démarrage - L

Plus en détail

Club informatique Mont-Bruno Séances du 05 octobre et du 24 octobre 2012 Présentateurs : Réjean Côté

Club informatique Mont-Bruno Séances du 05 octobre et du 24 octobre 2012 Présentateurs : Réjean Côté Contenu de la rencontre Club informatique Mont-Bruno Séances du 05 octobre et du 24 octobre 2012 Présentateurs : Réjean Côté Les fonctions de base de Windows Live Mail, Windows Mail et Outlook Express

Plus en détail

[WINDOWS 7 - LES FICHIERS] 28 avril 2010. Logiciel / Windows

[WINDOWS 7 - LES FICHIERS] 28 avril 2010. Logiciel / Windows Ce dossier a une forme un peu différente des précédentes : c est un ensemble de «fiches» décrivant chacune une des opérations que l on peut effectuer avec un fichier (enregistrer, renommer, etc.). Chaque

Plus en détail

COURS WINDEV NUMERO 3

COURS WINDEV NUMERO 3 COURS WINDEV NUMERO 3 01/02/2015 Travailler avec un fichier de données Etude du gestionnaire d analyse, Manipulation des tables mémoires, Manipulation de données, Création d états, Pré requis : Cours WinDev

Plus en détail

Setting Up PC MACLAN File Server

Setting Up PC MACLAN File Server Setting Up PC MACLAN File Server Setting Up PC MACLAN File Server Ce chapitre explique comment paramètrer le Serveur de fichiers PC MACLAN, une fois la procédure d installation terminée. Les sujets sont

Plus en détail

C.M. 1 & 2 : Prise en main de Linux

C.M. 1 & 2 : Prise en main de Linux Grégory Bonnet [email protected] GREYC Université Caen Basse Normandie Diaporama original : Jean-Philippe Métivier - Boris Lesner But de cet enseignement 1 - Apprendre à manipuler un système Unix/Linux

Plus en détail

FICHIERS ET DOSSIERS

FICHIERS ET DOSSIERS La différence entre fichier et dossier FICHIERS ET DOSSIERS La première notion à acquérir est la différence entre un dossier et un fichier Un dossier est une sorte de classeur dans lequel on range divers

Plus en détail

Comment configurer Kubuntu

Comment configurer Kubuntu Comment configurer Kubuntu Configuration du réseau... 1 Configurer votre système Linux sur le réseau...1 Vérifier manuellement l adresse IP...5 Connecter un lecteur réseau distant Windows/Mac grâce au

Plus en détail

Installation ou mise à jour du logiciel système Fiery

Installation ou mise à jour du logiciel système Fiery Installation ou mise à jour du logiciel système Fiery Le présent document explique comment installer ou mettre à jour le logiciel système sur le Fiery Network Controller pour DocuColor 240/250. REMARQUE

Plus en détail

MO-Call pour les Ordinateurs. Guide de l utilisateur

MO-Call pour les Ordinateurs. Guide de l utilisateur MO-Call pour les Ordinateurs Guide de l utilisateur Sommaire MO-CALL POUR ORDINATEURS...1 GUIDE DE L UTILISATEUR...1 SOMMAIRE...2 BIENVENUE CHEZ MO-CALL...4 MISE EN ROUTE...5 CONNEXION...5 APPELS...7 COMPOSITION

Plus en détail

RECOPLUS LOGICIEL DE GESTION DES RECOMMANDES NOTICE D UTILISATION DE RECOPLUS RESEAU. N de série

RECOPLUS LOGICIEL DE GESTION DES RECOMMANDES NOTICE D UTILISATION DE RECOPLUS RESEAU. N de série RECOPLUS LOGICIEL DE GESTION DES RECOMMANDES NOTICE D UTILISATION DE RECOPLUS RESEAU N de série Siège social 107, rue Henri Barbusse BP305-92111 CLICHY Cedex 1 Sommaire Description 1. Installation 2. Mise

Plus en détail

EXCEL TUTORIEL 2012/2013

EXCEL TUTORIEL 2012/2013 EXCEL TUTORIEL 2012/2013 Excel est un tableur, c est-à-dire un logiciel de gestion de tableaux. Il permet de réaliser des calculs avec des valeurs numériques, mais aussi avec des dates et des textes. Ainsi

Plus en détail

PRISE EN MAIN D ILLUSTRATOR

PRISE EN MAIN D ILLUSTRATOR CHAPITRE 1 PRISE EN MAIN D ILLUSTRATOR Présentation... 13 Contenu du livre... 13 Les nouveautés... 14 Composants de l interface... 15 Afficher les documents... 20 Organiser son espace de travail... 21

Plus en détail

FORMATION EXCEL 2010 Groupe LUCAS LOGICIA

FORMATION EXCEL 2010 Groupe LUCAS LOGICIA FORMATION EXCEL 2010 Groupe LUCAS LOGICIA 1 TABLE DES MATIERES 1. L INTERFACE... 3 2. LES OPTIONS D AFFICHAGE... 5 3. LES MODELES... 8 4. LES CLASSEURS... 9 5. GESTION DES CELLULES... 14 6. SAISIE DES

Plus en détail

1) Installation de Dev-C++ Téléchargez le fichier devcpp4990setup.exe dans un répertoire de votre PC, puis double-cliquez dessus :

1) Installation de Dev-C++ Téléchargez le fichier devcpp4990setup.exe dans un répertoire de votre PC, puis double-cliquez dessus : 1) Installation de Dev-C++ Téléchargez le fichier devcpp4990setup.exe dans un répertoire de votre PC, puis double-cliquez dessus : La procédure d installation démarre. La fenêtre suivante vous indique

Plus en détail

Tutorial Terminal Server sous

Tutorial Terminal Server sous Tutorial Terminal Server sous réalisé par Olivier BOHER Adresse @mail : [email protected] Site Internet : http://xenon33.free.fr/ Tutorial version 1a Page 1 sur 1 Index 1. Installation des services Terminal

Plus en détail

Table des matières A. Introduction... 4 B. Principes généraux... 5 C. Exemple de formule (à réaliser) :... 7 D. Exercice pour réaliser une facture

Table des matières A. Introduction... 4 B. Principes généraux... 5 C. Exemple de formule (à réaliser) :... 7 D. Exercice pour réaliser une facture Excel 2007 -2- Avertissement Ce document accompagne le cours qui a été conçu spécialement pour les stagiaires des cours de Denis Belot. Le cours a été réalisé en réponse aux diverses questions posées par

Plus en détail

MEDIAplus elearning. version 6.6

MEDIAplus elearning. version 6.6 MEDIAplus elearning version 6.6 L'interface d administration MEDIAplus Sommaire 1. L'interface d administration MEDIAplus... 5 2. Principes de l administration MEDIAplus... 8 2.1. Organisations et administrateurs...

Plus en détail

Apprendre à manipuler le clavier Médiathèque de Bussy Saint-Georges APPRENDRE A MANIPULER LE CLAVIER

Apprendre à manipuler le clavier Médiathèque de Bussy Saint-Georges APPRENDRE A MANIPULER LE CLAVIER APPRENDRE A MANIPULER LE CLAVIER Apprendre à manipuler le clavier SOMMAIRE : I APPRENDRE A TAPER AU CLAVIER... PAGES 3-11 1.1 - Positionnement des touches d'un clavier... Page 3 1.2 - Les touches importantes

Plus en détail

Module : Informatique Générale 1. Les commandes MS-DOS

Module : Informatique Générale 1. Les commandes MS-DOS 1 Les commandes MS-DOS I. Introduction Le DOS est le système d'exploitation le plus connu, sa version la plus commercialisée est celle de Microsoft, baptisée MS-DOS (Microsoft Disk Operating Système).MS-DOS

Plus en détail

Créer et partager des fichiers

Créer et partager des fichiers Créer et partager des fichiers Le rôle Services de fichiers... 246 Les autorisations de fichiers NTFS... 255 Recherche de comptes d utilisateurs et d ordinateurs dans Active Directory... 262 Délégation

Plus en détail

Manuel utilisateur Netviewer one2one

Manuel utilisateur Netviewer one2one Manuel utilisateur Netviewer one2one INDEX 1. Etablissement de la connexion...2 1.1. Client... 2 2. Travailler avec Netviewer en mode Show...3 2.1. Vue écran... 3 2.2. Le panneau Netviewer... 3 2.3. Caractéristiques...

Plus en détail

NETWORK & SOFTWARE ENGINEERING MANUEL D UTILISATEUR. Logiciel TIJARA. NETWORK AND SOFTWARE ENGINEERING Manuel d'utilisateur "TIJARA" 1

NETWORK & SOFTWARE ENGINEERING MANUEL D UTILISATEUR. Logiciel TIJARA. NETWORK AND SOFTWARE ENGINEERING Manuel d'utilisateur TIJARA 1 NETWORK & SOFTWARE ENGINEERING MANUEL D UTILISATEUR Logiciel TIJARA Manuel d'utilisateur "TIJARA" 1 SOMMAIRE Introduction Première partie Chapitre 1 : Installation et démarrage Chapitre 2 : Architecture

Plus en détail

Utilisation de l éditeur.

Utilisation de l éditeur. Utilisation de l éditeur. Préambule...2 Configuration du navigateur...3 Débloquez les pop-up...5 Mise en évidence du texte...6 Mise en évidence du texte...6 Mise en page du texte...7 Utilisation de tableaux....7

Plus en détail

MANUEL D INSTALLATION Sous WINDOWS

MANUEL D INSTALLATION Sous WINDOWS MANUEL D INSTALLATION Sous WINDOWS Pré requis Avant l installation SOFiE veuillez vous assurer que : 1. Vous avez des droits administrateur sur votre PC et, si vous passez par un «Firewall» ou un «Proxy»,

Plus en détail

AIDE à l utilisation du cédérom «L athlétisme à l école» Niveau Primaire SOMMAIRE

AIDE à l utilisation du cédérom «L athlétisme à l école» Niveau Primaire SOMMAIRE AIDE à l utilisation du cédérom «L athlétisme à l école» Niveau Primaire SOMMAIRE Arborescence du cédérom (page 2) Lancement du Cédérom et configuration minimale de votre ordinateur (page 3). Loupe, page

Plus en détail

L espace de travail de Photoshop

L espace de travail de Photoshop L espace de travail de Photoshop 1 Au cours de cette leçon, vous apprendrez à : ouvrir les fichiers Photoshop ; sélectionner et employer certains des outils dans le panneau Outils ; définir les options

Plus en détail

Prise en main rapide

Prise en main rapide Prise en main rapide 4 Dans cette leçon, vous découvrirez les fonctionnalités de création de page web de Dreamweaver et apprendrez à les utiliser dans l espace de travail. Vous apprendrez à : définir un

Plus en détail

CAISSE. Ce logiciel nécessite une licence pour fonctionner.

CAISSE. Ce logiciel nécessite une licence pour fonctionner. Ce logiciel nécessite une licence pour fonctionner. CAISSE Le logiciel de caisse permet la vente des articles seulement. Elle est utilisable avec un écran tactile, des douchettes code barre, des imprimantes

Plus en détail

MANUEL TBI - INTERWRITE

MANUEL TBI - INTERWRITE MANUEL TBI - INTERWRITE TBIIW TITRE Manuel InterWrite WorkSpace INTITULE Manuel d'utilisation du logiciel InterWrite accompagnant le tableau blanc interactif CALCOMP OBJECTIF Aide mémoire sur les fonctionnalités

Plus en détail

ENDNOTE X2 SOMMAIRE. 1. La bibliothèque EndNote 1.1. Créer une nouvelle bibliothèque 1.2. Ouvrir une bibliothèque EndNote 1.3. Fermer une bibliothèque

ENDNOTE X2 SOMMAIRE. 1. La bibliothèque EndNote 1.1. Créer une nouvelle bibliothèque 1.2. Ouvrir une bibliothèque EndNote 1.3. Fermer une bibliothèque 1 ENDNOTE X2 SOMMAIRE 1. La bibliothèque EndNote 1.1. Créer une nouvelle bibliothèque 1.2. Ouvrir une bibliothèque EndNote 1.3. Fermer une bibliothèque 2. Manipuler une bibliothèque EndNote 2.1. La saisie

Plus en détail

Plan. Traitement de texte et PAO 4/10/06. Initiation à Word 2002 1

Plan. Traitement de texte et PAO 4/10/06. Initiation à Word 2002 1 Plan Initiation A Microsoft Word 2002 Quelques grandes fonctionnalités Comment se présente Microsoft Word La mise en page La typographie Lettrines, puces et illustrations Créer des tableaux Ecrivez sans

Plus en détail

Leçon N 5 PICASA Généralités

Leçon N 5 PICASA Généralités Leçon N 5 PICASA Généralités Avec cette leçon N 5, nous allons commencer l étude du traitement de vos photos avec le logiciel de GOOGLE, PICASA, que vous avez téléchargé dans la leçon N 3. 1 Présentation

Plus en détail

Préparation à l installation d Active Directory

Préparation à l installation d Active Directory Laboratoire 03 Étape 1 : Installation d Active Directory et du service DNS Noter que vous ne pourrez pas réaliser ce laboratoire sans avoir fait le précédent laboratoire. Avant de commencer, le professeur

Plus en détail

Avant-propos FICHES PRATIQUES EXERCICES DE PRISE EN MAIN CAS PRATIQUES

Avant-propos FICHES PRATIQUES EXERCICES DE PRISE EN MAIN CAS PRATIQUES Avant-propos Conçu par des pédagogues expérimentés, son originalité est d être à la fois un manuel de formation et un manuel de référence complet présentant les bonnes pratiques d utilisation. FICHES PRATIQUES

Plus en détail

Menu Fédérateur. Procédure de réinstallation du logiciel EIC Menu Fédérateur d un ancien poste vers un nouveau poste

Menu Fédérateur. Procédure de réinstallation du logiciel EIC Menu Fédérateur d un ancien poste vers un nouveau poste Menu Fédérateur Procédure de réinstallation du logiciel EIC Menu Fédérateur d un ancien poste vers un nouveau poste Manipulations à réaliser sur le poste à désinstaller 1. Sauvegarde des données Dans le

Plus en détail

Mode Opératoire Windows XP

Mode Opératoire Windows XP Mode Opératoire Windows XP C. Terrier Reproduction autorisée pour des formateurs dans un cadre pédagogique et non commercial après autorisation de l'auteur [email protected] - http://www.cterrier.com

Plus en détail

À propos de cette page... 27. Recommandations pour le mot de passe... 26

À propos de cette page... 27. Recommandations pour le mot de passe... 26 Rebit 5 Help Table des matières Apprentissage... 1 Création du premier point de restauration... 1 Que fait le disque de sauvegarde Rebit 5?... 1 Fonctions de Rebit 5... 1 Création du premier point de restauration...

Plus en détail