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)
- É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
- É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
- É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
- É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
- É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
- É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)
- É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.
- É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
- É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 !
- 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.
- 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
- Écrire en C une fonction voyelleMin
qui essaie de saisir une voyelle minuscule au maximum 3 fois.
- É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
- É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
- - É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
- É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 :
- une année est bissextile si elle est divisible par 4
- exception : elle n'est pas bissextile si elle est
divisible par 100
- exception de l'exception : elle est néanmoins
bissextile si elle est divisible par 400
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.