PROGRAMMATION EN LANGAGE C L1 Année 2004 - 2005 Cahier de TD PROGRAMMATION EN LANGAGE C L1 Année 2004 - 2005 THEME 1 : VRAI/FAUX, DEFINITION DE STRUCTURES ......................................................... 1 VRAI/FAUX........................................................................................................................................... 1 CHOISISSEZ, POUR LES EXEMPLES SUIVANTS : ..................................................................................... 1 →'......................................................................................... 3 MANIPULATIONS DE BASE : LE '.' ET LA '→ THEME 2 : FONCTIONS ET STRUCTURES .................................................................................. 3 LES OPERATIONS DE ROUTINE : ............................................................................................................... 5 LES OPERATIONS DE TRANSFORMATION :................................................................................................ 5 THEME 3 : THEME DE SYNTHESE : UN PETIT CATALOGUE ASTRONOMIQUE............. 7 THEME 4 : THEME DE SYNTHESE : LES NOMBRES COMPLEXES ...................................... 9 THEME 5 : TABLEAUX DE STRUCTURES, BASES DE DONNEES .......................................... 9 Cahier de TD PROGRAMMATION EN LANGAGE C L1 Année 2004 - 2005 Thème 1 : Vrai/faux, définition de structures VRAI/FAUX • Une structure est un type VRAI • Une structure est un type défini par l'utilisateur VRAI • Une structure a au moins un champ de type entier FAUX • Un champ est une structure FAUX • Un champ comporte des structures FAUX • Une structure comporte un ou des champs VRAI • Un champ est défini uniquement par son type FAUX • Un champ est défini uniquement par son nom FAUX • Un champ peut être de n'importe quel type VRAI • On ne peut pas définir de variable dont le type est une structure FAUX • L'accès à un champ d'une structure se fait par la syntaxe : '*' FAUX • On peut définir un pointeur sur une structure VRAI choisissez, pour les exemples suivants : les types et les noms des champs pour les objets listés, et écrivez la définition de la structure associée (pas plus de 5/6 champs par structure) : j'en profite pour donner la syntaxe de définition d'un type en algorithmique : structure nom_du_type { type_champ1 nom_champ1; … type_champ_n nom_champ_n; }; par convention typographique, le nom du type commence toujours par 't_'. • une adresse postale structure t_adr_post { entier numéro; caractere *nom_rue; entier code_postal; caractere ville[50]; } Cahier de TD 1 PROGRAMMATION EN LANGAGE C L1 Année 2004 - 2005 • un CD musical structure t_CD_audio { caractere titre[30]; entier nb_pistes; caractere *auteur; entier annee; } • un client d'une banque structure t_client { caractere *nom, *prenom; adr_post adresse; // on reprend le type adr_post déjà défini entier solde_compte; entier possede_CB; entier numero_compte; } • un chien (cela peut paraître saugrenu au premier abord…utilité de ce type défini ? par exemple, pour la gestion d'un cabinet vétérinaire ou de vente/achat de chiens de race) structure t_chien { caractere nom[20]; t_race race; // t_race peut être un type énuméré par exemple ou un entier entier age; entier num_tatouage; reel prix_estime; } • une émission télévisée structure t_emission { t_date date_diffus; // on peut définir un type date, toujours utile caractere *nom; entier chaîne; entier duree; } • un joueur de football structure t_joueur { caractere *nom; entier nationalite; entier age; caractere *poste; reel salaire; } • une équipe de football Cahier de TD 2 PROGRAMMATION EN LANGAGE C L1 Année 2004 - 2005 structure t_f_team { caractere *ville; caractere nom_club[30]; entier annee_creation; t_joueur effectif[30]; entier classement; } Manipulations de base : le '.' et la '→' Dans les exemples de programme suivants, indiquez quelles écritures sont correctes syntaxiquement. structure ordi { entier capa; // capacité de la mémoire entier freq; // fréquence du proco caractere marque[30]; // marque du PC et du processeur entier hd; // capacité du disque dur }; programme ordi_struct ordi mon_pc; entier hd; //OK //OK afficher(mon_pc); // non, afficher() seulement pour types de base ordi.capa ← 512; // non, ordi est un nom de type mon_pc.marque ← "DELL AMD Athlon 2200+"; // NON car mon_pc.marque // est une chaîne de caracteres, il faut utiliser la fonction copie // (strcpy) mon_pc.freq ← 1800; // OK hd ← 120; //OK mon_pc.hd ← hd; // OK Thème 2 : Fonctions et structures Les fonctions sont très souvent associées aux structures, pour la simple et bonne raison qu'une structure ne se manipule pas comme une variable de type classique, et il faut donc prévoir des fonctions pour toutes les opérations classiques que l'on doit réaliser. Nous avons abordé en cours les nombres complexes, à titre d'exemple, nous allons continuer par un peu d'algèbre linéaire et son application à un certain domaine de l'informatique qui est l'imagerie de synthèse. Cahier de TD 3 PROGRAMMATION EN LANGAGE C L1 Année 2004 - 2005 L'imagerie de synthèse, utilisée aussi bien dans les trucages de films que dans les jeux en 3D, est basée sur une représentation 3D d'objets simples (cubes, pyramides, polygones) que l'on sait assez aisément manipuler. Nous allons donc nous intéresser à cette représentation en définissant les types dont nous aurons besoin et en listant les fonctions qui peuvent nous être utiles. Pour cela, nous définirons : des points en …4 dimensions et des matrices 4x4 ! 4 dimensions ? Il s'agit juste d'une astuce utilisée pour accélérer quelques calculs. Définition de points en 3D : un point est défini par ses 3 coordonnées dans l'espace x,y et z, sa quatrième coordonnée vaut 1. Ecrivez la définition du type correspondant. Il y a deux possibilités, la deuxième sera plus intéressante pour les calculs futurs ! structure t_p3d { reel x,y,z; reel ch; // ch : coordonnée homogène } ou structure t_point3d { reel coords[4]; } Une facette de type triangulaire est définie par ses 3 sommets qui sont des points Ecrivez la définition du type correspondant. structure t_facette { t_point3d sommets[3]; } ou structure t_facette { t_point3d som1, som2, som3; } Enfin, on définit les matrices de transformations (pour animer les objets ou créer les images en 2D correspondantes) comme des matrices de réels 4x4. Ecrivez la définition de type correspondant. structure t_mat { reel valeurs[4][4]; } ou Cahier de TD 4 PROGRAMMATION EN LANGAGE C L1 Année 2004 - 2005 structure t_mat { reel **valeurs; } Les opérations de routine : Ecrivez les définitions des fonctions permettant de saisir et afficher un point, puis saisir et afficher une facette. Que constatez-vous ? On considère que les fonctions de saisie et d'affichage de matrices sont déjà écrites (ouf). Les opérations de transformation : Translation : une translation en 3D est donnée par un vecteur de déplacement (Tx, Ty, 1 0 0 Tx 0 1 0 Ty 0 0 1 Tz 0 valeurs 0 1 Tx, Ty, et Tz et Ecrire la définition d'une fonction à laquelle on donne les 0trois Tz). La matrice 4x4 associée en synthèse d'images est : qui donne la matrice associée Rotation : une rotation d'angle θ autour de l'axe Ox est donnée par : 0 1 0 cosθ 0 sin θ 0 0 0 − sin θ cosθ 0 0 0 0 1 Ecrire la définition d'une fonction à laquelle on donne la valeur θ et qui donne la matrice associée Homothétie : une homothétie de facteur k par rapport à l'origine est donnée par : k 0 0 0 0 k 0 0 0 0 k 0 0 0 0 1 Ecrire la définition d'une fonction à laquelle on donne la valeur k et qui donne la matrice associée. Composition : pour effectuer la rotation autour d'un axe horizontal quelconque d'un point P représenté par un vecteur à 4 coordonnées X, on doit lui appliquer : une translation (de matrice T) , une rotation autour de l'axe Ox (de matrice R), puis la translation inverse (de Cahier de TD 5 PROGRAMMATION EN LANGAGE C L1 Année 2004 - 2005 matrice T'). on obtient le point Y donné par Y = T'.R.T.X (le . dénote la multiplication entre matrices). Ecrire les définitions d'une fonction faisant le produit de deux matrices 4x4, et d'une fonction faisant la multiplication d'une matrice 4x4 par un vecteur à 4 coordonnées. En réfléchissant un peu, vous pourrez n'écrire qu'une fonction. Note : le fait que les matrices soient des matrices 4x4 permet de faire facilement ces calculs. Les opérations de rendu à l'écran : perspectives et projections Enfin, pour effectuer le rendu d'un objet 3D (une facette par exemple), il faut effectuer une projection de cet objet 3D sur la surface de l'écran, qui est une surface 2D. Pour cela, il existe plusieurs techniques, parmi lesquelles la projection cavalière, qui ne tient pas compte de la perspective, et la projection perspective. Exemple de la projection cavalière : xe Oe z O y α x ye Oe est l'origine pour l'écran : (0,0) en haut à gauche, xe et ye sont les coordonnées 2D à l'écran, celles que vous manipulez par exemple avec gotoxy(). O est l'origine des axes pour les objets 3D, x, y et z sont les axes de coordonnées pour les objets 3D. En admettant que le point O sera situé au milieu de l'écran, et que la taille de l'écran est de 1024x768, quelles seront les coordonnées, sur l'écran, résultant de la projection de ce point O ? On cherche maintenant à calculer les coordonnées Xe et Ye à l'écran résultant de la projection cavalière d'un point 3D de coordonnées X, Y et Z : Faire une projection cavalière revient à faire une multiplication par une matrice…Ecrivez la définition d'une fonction qui prend en entrée un angle α, et qui calcule la matrice de projection cavalière Pcav associée. (pour procéder petit à petit, prenez le cas où seule la coordonnée X du point 3D n'est pas nulle, puis faites de même avec Y et Z). Vous devriez trouver : Pcav = cos α sin α Cahier de TD − cos α sin α 512 − 1 384 0 6 PROGRAMMATION EN LANGAGE C L1 Année 2004 - 2005 Vous avez maintenant toutes les fonctions nécessaires pour démarrer un petit moteur 3D ! Thème 3 : Thème de synthèse : un petit catalogue astronomique On cherche maintenant à créer une petite base de données contenant des informations sur quelques étoiles de notre galaxie et sur le système solaire. Nous allons dissocier deux types d'objets : les étoiles, qui a priori sont relativement solitaires les unes par rapport aux autres, et qui n'ont pas d'interaction (ou si peu), et les satellites, qui sont des objets dépendant d'un objet plus massif. Ainsi, la Terre est un satellite du soleil, la lune est un satellite de la Terre, Mars est un satellite du soleil, et Phobos et Deimos sont deux (et les deux seuls) satellites de Mars. Pour les étoiles, on stockera : leur type spectral (parmi O, B, A, F ,G, K, M, Special), leur masse (en nombre de masse solaires), leur diamètre (en nombre de diamètres solaires), leur distance en soleil (en années lumière) et leur(s) satellite(s). Certaines de ces données peuvent être inconnues, elles sont notées N/A (Not Available) Pour les satellites, on stockera : leur nom, leur rayon (en nombre de rayon terrestre), leur masse (en nombre de masse terrestre), leur distance (moyenne) à l'astre duquel il gravite (en km); la durée du jour et la durée de l'année, (en nombre de jours terrestres et/ou en heures) et leurs satellites éventuels…Certaines de ces données peuvent être inconnues Cahier de TD 7 PROGRAMMATION EN LANGAGE C L1 Année 2004 - 2005 Pour information : voici les informations concernant quelques planètes et satellites du système solaire. Nom rayon masse distance jour année Satellites Mercure 0.38 0,055 57.9.106 58 j 16 h 88 j 0 Venus 0.95 0.815 108.2.106 243 j 225 j 0 Terre 1 1 150.106 1j 365 j 1 Mars 0.53 0.107 229.106 24 h 37 mn 1.88 an 2 Jupiter 11.21 317.9 779.4.106 9 h 55 mn 11.87 an 63 Saturne 9.45 95.2 1433.9.106 10 h 39 mn 29.48 an 31 Uranus 4.01 14.6 2877.2.106 15 h 35 mn 84.70 an 27 164.90 an 13 247.85 an 1 6 Neptune 3.96 17.2 4504.4.10 18 h 25 mn Pluton 0.18 0.003 5872.3.106 153 h 16 mn Quelques étoiles (dont un monstre…) Nom type Masse diamètre Distance Satellites Betelgeuse M 20 662 427 N/A Rigel B 17 62 733 N/A Procyon F 1.78 1.443 11.41 N/A Cygnus X-1 A B 25 20 7200 N/A Cygnus X-1 B Special 12 0.0000518 7200 N/A Capella G 3 10.8 42.2 N/A Vega A 3.07 3.151 25.30 N/A Sol G 1 1 0 9 Aldebaran K 2.5 51.5 65.1 N/A Définissez les types : étoiles et satellite Ecrivez les fonctions suivantes : Affichage des valeurs relatives à un satellite, en incluant le nom de ses propres satellites Affichage des valeurs relatives à une étoile, en incluant les valeurs relatives à ses satellites Cahier de TD 8 PROGRAMMATION EN LANGAGE C L1 Année 2004 - 2005 Calcul de la densité d'une planète, calcul de la densité d'une étoile (prenez comme exemple Sol et Cygnus X-1 B pour application numérique…) en kg/cm3 Données numériques : Masse de la terre : 5,9.1024 kg Diamètre de la terre : 12 700 km Masse du soleil : 2.1030 kg Diamètre du soleil : 1 390 000 km Définissez un tableau stockant les informations sur toutes les étoiles disponibles : et écrivez les fonctions suivantes : recherche par nom, par type spectral, affichage de tous les satellites d'une étoile, saisie d'une nouvelle étoile et insertion dans le tableau : vous avez programmé le début d'une base de données ! Cet exercice sera continué en TP. Thème 4 : thème de synthèse : les nombres complexes Nous allons écrire un module complet pour traiter la majorité des opérations sur les nombres complexes Fonctions : saisie Somme, soustraction, multiplication, conjugaison, module, division iθ Ecriture sous forme ρ .e Définir le type permettant de stocker un complexe sous cette forme, puis une fonction permettant de convertir une forme dans une autre. Ecrire la fonction de division pour deux complexes écrits sous forme ρ .eiθ Ecrire une fonction de saisie pour un complexe sous cette forme, en faisant bien attention à la validité des valeurs rentrées. Ecrire une fonction calculant une racine n-ième d'un complexe. Cet exercice sera continué en TP Thème 5 : tableaux de structures, bases de données Les bases de données sont des moyens de stocker de nombreuses informations qui sont en relation les unes avec les autres. Pour créer une base de données, il est très souvent nécessaire d'identifier les différents objets qui seront modélisés et stockés, pour éviter de Cahier de TD 9 PROGRAMMATION EN LANGAGE C L1 Année 2004 - 2005 stocker des informations de manière redondante. Nous allons simuler une petite base de données cinématographique contenant des films. Découpage et organisation des données : Pour chaque film, il faudra stocker : • Son titre • Son année de sortie • Son réalisateur • Ses acteurs principaux (de 1 à 4) • Sa durée en minutes • Un ou plusieurs genres, parmi : Action, Horreur, Comédie, Documentaire, Policier, Drame, Animation, Science-Fiction (un film a au maximum 2 genres) Pour chaque réalisateur et chaque acteur, il faudra stocker : • Son nom • Son prénom • Sa date de naissance • Sa nationalité Une telle base de données peut être interrogée ou traitée par ce que l'on appelle des requêtes. Par exemple, on peut demander à afficher tous les éléments d'un film, à créer ou supprimer un film, à modifier certaines informations. Une opération classique consiste, par exemple, à établir toute la filmographie d'un acteur ou d'un réalisateur. Pour cela, est-il nécessaire de stocker, pour chaque réalisateur ou acteur, l'ensemble des films associés ? De la même manière, un réalisateur ou acteur a souvent plusieurs films à son actif. Par exemple, David Fincher (né le10 mai 1962 à Denver, aux USA) a réalise Fight Club, Seven et The Game, entre autres. Est-il nécessaire, pour chacun des films cités, de stocker à chaque fois ces informations sur le réalisateur ? Comment pourrait-on éviter de dupliquer ces informations ? Définissez les types : film, acteur, réalisateur. Ecrivez les définitions de 3 tableaux : un comportant des films, un comportant les réalisateurs, un comportant les acteurs. Cahier de TD 10 PROGRAMMATION EN LANGAGE C L1 Année 2004 - 2005 Ecrire les fonctions suivantes : Affichage des informations relatives à un film exemple de résultat demandé : Fiche FILM Fight Club (1999) Réalisateur : David Fincher Acteurs : Brad Pitt, Edward Norton, Helena Bonham Carter Durée : 2h15 Genre : Action Affichage d'un acteur ou réalisateur Exemple de résultat demandé Fiche REALISATEUR Nom : David Fincher Date de naissance : 10 mai 1962 Nationalité : américaine Recherche d'un film par son nom, et affichage si le film existe Liste des titres de film par genre Exemple de résultat demandé : Entrez le genre : Action Résultats : Fight Club (1999) Matrix (1999) Doberman (1996) Filmographie d'un acteur ou réalisateur : Exemple de résultat demandé : Entrez le nom de l'acteur : Spacey Résultats : Spacey (Kevin) Seven (1995) Usual Suspects (1994) American Beauty (1999) Minuit dans le jardin du bien et du mal (1997) Terre Neuve (2001) Cahier de TD 11