IN103 : Sujet du TP1
Groupe ESIEE, Denis BUREAU, février 2006.
Attention ! Le sujet peut être modifié jusqu'à la veille du TP.

1  Les objectifs

Être capable de réaliser à partir d'un terminal sous linux des programmes en C.
Rappel : De nombreux liens sur C sont disponibles sur la page web de l'unité IN103.

2  Prise en mains

2.1  L'éditeur nedit

Taper   nedit hello.c &   pour créer le fichier hello.c qui contiendra le programme ci-dessous
(il est également possible de lancer nedit par le menu "Démarrer").

2.2  Premier programme

#include <stdio.h>
int main( void )
{
  printf( "Bonjour !\n" );
} /* main() */
  

2.3  La compilation

Pour utiliser la bonne version du C, il faut préciser au compilateur gcc quelques options.
Pour éviter d'avoir à les retaper à chaque compilation, linux nous permet de créer un alias.
Pour éviter d'avoir recréer l'alias à chaque login, il faut le stocker dans le fichier .cshrc à la racine de votre compte, car ce fichier est automatiquement lu au début de chaque session.
Pour cela, lancer l'éditeur sur ce fichier et insérer la ligne suivante :
alias mcc  gcc -ansi -pedantic -W -Wall
Fermer la fenêtre Terminal et en ouvrir une nouvelle pour prendre en compte ce nouvel alias. Revenir dans le bon répertoire de travail.
Pour lancer la phase de compilation, taper   mcc -c hello.c   ; un message d'erreur s'affiche ; ajouter l'instruction manquante puis relancer la commande de compilation jusqu'à ce qu'il n'y ait plus de message d'erreur ; le fichier hello.o doit être créé ; le vérifier.
Info : le pré-processeur est automatiquement lancé avant la compilation proprement dite et interprète toutes les lignes commençant par # .
La liste des options peut être obtenue par   man gcc  .

2.4  L'édition de liens

Pour lancer cette phase, taper   gcc -lm hello.o -o hello   ; si aucun message d'erreur ne s'affiche, le fichier hello doit être créé ; le vérifier.
Info : le lien avec la librairie mathématique n'est utile que lorsque le programme utilise des fonctions déclarées dans <math.h> .

2.5  L'exécution

Pour lancer le programme, taper simplement   ./hello   ; vérifier l'affichage.

2.6  Modification du programme

Modifier le programme pour qu'il pose la question "numero ? ", qu'il saisisse un entier (par exemple 6), puis qu'il affiche "Bonjour numero 6 !" .

2.7  Compilation / édition de liens

Pour lancer les 2 phases automatiquement, taper   mcc -lm hello.c -o hello   ; si aucun message d'erreur ne s'affiche, le fichier hello doit avoir été modifié ; le vérifier.
Attention !    Ne pas lancer les 2 phases séparément est certainement une facilité lorsque tout se passe bien, mais peut être un handicap lorsqu'il y a des erreurs. Il faut alors déterminer si c'est une erreur de compilation ou bien une erreur d'édition de liens.
Par exemple dans l'exercice 3.4 ci-dessous, oublier la ligne #include <math.h> provoquera une erreur de compilation car la fonction sqrt sera inconnue du compilateur, mais oublier l'option -lm provoquera une erreur de l'éditeur de liens car il ne trouvera pas le code compilé de la fonction sqrt.
En général, tout message d'erreur ne commençant pas par fichier.c:LL:CC provient de l'éditeur de liens (LL = n° de ligne, CC = n° de colonne).

Pour chaque exercice ci-après (sections 3, 4, et 5) :
Utiliser une fonction main() pour tester chaque exercice ; le schéma sera toujours le même :
affichage d'un message, saisie de valeurs, appel de la fonction, affichage du résultat ;
ou si c'est une procédure, affichage d'un message, saisie de valeurs, appel de la procédure.

3  Exercices de IN101.TD3 section 6 ( < 1h)


  1. Écrire en C une fonction totalCm qui prend en paramètre deux nombres entiers correspondant au nombre de mètres et au nombre de centimètres d'une longueur, et qui retourne le nombre total de centimètres.
    Exemple: paramètres : 3 , 72 ® 372 cm
  2. Écrire en C une fonction real qui prend en paramètre deux nombres entiers correspondant au numérateur et au dénominateur d'un rationnel, et qui retourne la valeur réelle correspondante.
    Exemple: paramètres : 9 , 2 ® 4.5
    Aide: format d'affichage pour un double :  %g
  3. Écrire en C une fonction sommeJusquA qui prend en paramètre un nombre entier N, et qui retourne la somme des N premiers entiers (sans faire de boucle !).
    Exemple: paramètre : 10 ® 55
  4. Écrire en C une fonction periode qui prend en paramètre un nombre réel correspondant à la longueur d'un pendule, et qui retourne la période correspondante. (rappel: t = 2pÖ{[L/g]} )
    Chercher  PI  dans le fichier math.h et définir G en constante.
    Attention ! Il semble y avoir un bug dans le compilateur gcc : pour pouvoir utiliser les constantes mathématiques, il faut faire précéder l'inclusion de math.h par la ligne #define __USE_BSD
    Exemple: paramètre : 2.4525 ® 3.141592653589793 ("%.15g" Þ 15 chiffres après la virgule)
    Aide: format de saisie pour un double :  %lf
  5. Écrire en C une fonction surface qui prend en paramètres trois nombres réels correspondant aux longueurs des trois côtés d'un triangle, et qui retourne sa surface.
    (rappel: s = Ö{p (p-a)(p-b)(p-c)}  où p est le demi-périmètre du triangle)
    Exemple: paramètres : 1.5 , 2. , 2.5 ® 1.5
  6. Écrire en C une fonction estSur qui prend en paramètres 5 réels correspondant d'une part aux coordonnées du centre et au diamètre d'un cercle, et d'autre part aux coordonnées d'un point. Cette fonction doit retourner 1 (vrai) si le point est sur le cercle, et 0 (faux) sinon (attention aux problèmes de précision...).
    Contrainte: définir la précision souhaitée en constante.
    Exemple: paramètres : 0.0 0.0 2.0 0.707107 0.707107 ® 1 (à 10-6 près)

4  Exercices de IN101.TD5.1 sections 5 à 7 ( < 1h)

  1. Écrire en C une procédure typeCarac qui affiche le type du caractère passé en paramètre.
    Exemples : 'b' ® minuscule, 'B' ® majuscule, '3' ® chiffre, '+' ® divers.
  2. Écrire en C une fonction max qui retourne le plus grand des 3 entiers passés en paramètres.
    Contrainte : n'utiliser qu'un seul return  dans cette fonction.
    Exemple :   paramètres : 5 , 3 , 5 ® 5
  3. Écrire en C une procédure calc qui simule une mini-calculatrice permettant les 4 opérations usuelles plus l'élévation à la puissance (pow() ) . Elle prendra en paramètres d'entrée deux nombres réels, et un caractère représentant l'opération à effectuer entre ces deux nombres ; elle effectuera le calcul, puis affichera le résultat comme ci-dessous.
    Aide :  scanf(" %c",&op);   l'espace permet "d'avaler" un espace ou un retour à la ligne.
    Exemples :
    paramètres : 2 , 3.14 , '*' ® affichage : 2 * 3.14 = 6.28
    paramètres : 2 , 3 , '^' ® affichage : 2 ^ 3 = 8
    paramètres : 2 , 0 , '/' ® affichage : Division par zero !
    paramètres : 2 , 3.14 , '#' ® affichage : Operation inconnue !
  4. Si cet exercice fonctionne déjà en Java (sinon, passer à la suite) :
    Écrire en C une fonction isCPOS déterminant si deux droites sont Confondues ou Parallèles ou Orthogonales ou Sécantes. La fonction prendra les 2 × 3 coefficients réels en paramètre et retournera un caractère 'c', 'p', 'o', ou 's'. Hiérarchiser les 4 cas, et ne pas oublier les cas particuliers tels que les droites horizontales ou verticales, ainsi que les coefficients qui ne définissent pas une équation de droite (on se contentera d'une précision de 10-6).
    Vérifier son bon fonctionnement sur, notamment, chacun des exemples suivants :
    - les droites [1, 2, 3] et [3, 6, 9], qui sont confondues;
    - les droites [2, 0, 3] et [9, 0, 5], ou [0, 2, 3] et [0, 9, 5], qui sont parallèles;
    - les droites [2, 2, 0] et [1, -1, 1], ou [1, -1, 1] et [2, 2, 0], qui sont orthogonales;
    - les droites [1.23456789, 9.87654321, 2] et [9.8765432, -1.2345678, 3], qui sont orthogonales;
    - les droites [0, 1, 2] et [1, 2, 0], qui sont simplement sécantes;
    - [0, 0, 9] et [0, 0, 0], qui ne définissent pas des droites.
  5. Si cet exercice fonctionne déjà en Java (sinon, passer à la suite) :
    Écrire en C une procédure dernierDimanche permettant, à partir d'une date quelconque (sous la forme jour/quantième/mois/année), de calculer et d'afficher la date du dernier dimanche du mois en question.
    Les paramètres d'entrée respecteront les règles syntaxiques suivantes :
              <jour>      ::= 'l' | 'm' | 'M' | 'j' | 'v' | 's' | 'd' 
              <quantieme> ::= 1 | 2 | 3 | ... | 30 | 31 
              <mois>      ::= 1 | 2 | 3 | ... | 11 | 12 
              <annee>     ::= 1583 | 1584 | ... | 2999 | 3000
              
    
    On suppose les données fournies correctes et conformes aux spécifications.
    Exemple :
    paramètres : j , 9 , 12 , 1999 ® affichage : Le dernier dimanche du mois est le 26/12/1999
    Contrainte : n'oubliez pas qu'il est interdit d'utiliser une boucle !

5  Exercices de IN101.TD5.2 sections 5 à 7

  1. Écrire en C une fonction voyelleMin qui essaie de saisir une voyelle minuscule au maximum 3 fois.
  2. Écrire en C une fonction factorielle qui accepte les nombres négatifs : si n < 0, n! vaudra  - (-n)!  .
    Rappels : 0! = 1 et n! = n ×(n-1) ×(n-2) ×¼×2 ×1.
    Questions à se poser :
    Quel est le nombre maximum dont on peut calculer la factorielle avec cette fonction ?
    Pourquoi, simplement en voyant le résultat de 17!, sait-on immédiatement que le maximum est inférieur à 17 ? et pour 13!  ?
    Pourquoi ce maximum est-il inférieur à celui de la version Java ?
    Exemples :
    paramètre : 5 ® 120
    paramètre : -6 ® -720
  3. Écrire en C la fonction chiffresMots qui affiche la suite de mots correspondant aux chiffres d'un nombre entier strictement inférieur à 1000000, passé en paramètre.
    Contraintes : ne pas effectuer de calcul de puissance et ne pas afficher de zéro en tête du nombre.
    Exemple : paramètre : 42307 ® quatre deux trois zéro sept
  4. - Écrire en C une fonction auxilliaire rom qui prend comme paramètres un chiffre (1 ou 5) et une puissance de 10, et qui retourne le caractère romain correspondant.
    Exemple : paramètres : 5, 100 ® 'D'.
    - Écrire en C (dans le même fichier que la fonction rom ) une procédure dec2rom qui affiche le nombre en chiffres romains correspondant à l'entier compris entre 1 et 3999 passé en paramètre.
    Contraintes : utiliser la fonction auxilliaire définie précédemment et ne pas recalculer la puissance à chaque fois.
    Exemples :
    2443 ® MMCDXLIII, 1998 ® MCMXCVIII, 7 ® VII, 3215 ® MMMCCXV,
    2999 ® MMCMXCIX, 1444 ® MCDXLIV, 506 ® DVI, 3888 ® MMMDCCCLXXXVIII
  5. Écrire en C une procédure calMois() permettant, à partir d'une date quelconque (mêmes paramètres qu'à l'exercice 4.5), de calculer et d'afficher le calendrier du mois en question comme ci-dessous (M majuscule pour Mercredi).
    Exemple : m, 6, 11, 2001 ®
     Calendrier du mois de novembre 2001 :
        lundi    mardi Mercredi    jeudi vendredi   samedi dimanche
            .        .        .        1        2        3        4
            5        6        7        8        9       10       11
           12       13       14       15       16       17       18
           19       20       21       22       23       24       25
           26       27       28       29       30        .        .
              
    
    Contrainte : tenir compte des années bissextiles.
    Rappel :

6  Travail personnel

Terminer tous les exercices en utilisant ce qui a déjà été écrit en Java pendant l'unité IN101 pour gagner du temps, ou en repartant de zéro si rien n'avait été écrit en Java.


File translated from TEX by TTH, version 3.70.
On 20 Feb 2006, 20:51.