Le but de cette série d'exercices est de vous permettre de continuer à pratiquer les bases de la programmation en C sur des exemples plus avancés utilisant des structures de contrôle et des fonctions.
Avez-vous pris connaissance des conseils relatifs à ces séries d'exercices ?
Votre programme devra produire la sortie suivante à l'écran :
Tables de multiplication Table de 2 : 1 * 2 = 2 ... 10 * 2 = 20 ... Table de 5 : 1 * 5 = 5 2 * 5 = 10 ... ... Table de 10 : 1 * 10 = 10 ... 10 * 10 = 100
Utilisez deux structures d'itération for imbriquées l'une dans l'autre.
Lorsqu'une balle tombe d'une hauteur initiale h, sa vitesse à l'arrivée au sol est . Immédiatement après le rebond, sa vitesse est v1=eps*v (où eps est une constante et v la vitesse avant le rebond). Elle remonte alors à la hauteur .
Le but est d'écrire un programme (rebonds1.c) qui calcule la hauteur à laquelle la balle remonte après un nombre NBR de rebonds.
Votre programme devra utiliser la constante g, de valeur 9,81 et demander à l'utilisateur d'entrer les valeurs de
Au 20ème rebond, la hauteur sera de 0.147809 m.
Remarque :
gcc monfichier.c -o monfichier -lm
scanf()
, on utilise "%d"
pour lire un entier et "%lf"
pour lire un double
.
Écrivez le programme rebonds2.c qui
affiche le nombre de rebonds à l'écran.
Il devra utiliser une boucle do...while, et
demander à l'utilisateur d'entrer les valeurs de :
Nombre de rebonds : 15
Une banque fait un prêt à une personne X pour un montant total de S0 francs. X rembourse chaque mois un montant r et paye un intérêt ir*S où S est la somme restant à rembourser et ir le taux d'intérêt employé.
Quelle est la somme des intérêts encaissés par la banque quand X a remboursé la totalité de son prêt ?Écrivez le programme pret.c qui calcule la
somme des intérêts encaissés et la durée en mois du remboursement,
puis qui affiche ces informations à l'écran.
Contraintes :
Somme des intérêts encaissés : 3612.00 (sur 24 mois).
Le nombre n'est pas premier, car il est divisible par Doù D est un diviseur de n autre que 1 et n.
Je crois fortement que ce nombre est premier
Écrivez un programme formules.c qui :
Expression indéfinie : ioù i est le numéro de l'expression considérée.
Pour utiliser les fonctions mathématiques, vous devez ajouter
en début de programme la ligne :
#include <math.h> et l'option -lm à la fin de votre commande de compilation :gcc monfichier.c -o monfichier -lm(ce genre d'instructions seront expliquées plus tard dans le cours). |
|
Vous pouvez alors utiliser les fonctions log pour le logarithme, sqrt pour
la racine carré (SQuare RooT), exp
pour l'exponentielle, et sin pour le
sinus. Pour l'élévation au carré, utilisez plutôt la multiplication que la fonction pow (man pow), qui est plus lente. |
Testez votre programme avec les valeurs : -1, 0, 1, 2, 3, 8
Résultas attendus:
Entrez un nombre réel : -1 Expression 1 : -1.581977 Expression 2 : non définie Expression 3 : -0.666667 Expression 4 : non définie Entrez un nombre réel : 0 Expression 1 : non définie Expression 2 : non définie Expression 3 : -0.000000 Expression 4 : non définie Entrez un nombre réel : 1 Expression 1 : -0.581977 Expression 2 : non définie Expression 3 : non définie Expression 4 : non définie Entrez un nombre réel : 2 Expression 1 : -0.313035 Expression 2 : 10.243407 Expression 3 : non définie Expression 4 : 0.711989 Entrez un nombre réel : 3 Expression 1 : -0.157187 Expression 2 : 8.959013 Expression 3 : non définie Expression 4 : non définie Entrez un nombre réel : 8 Expression 1 : -0.002685 Expression 2 : 22.137106 Expression 3 : 1.333333 Expression 4 : 1.106779
Indications - commencer par calculer :
Q = | |
R = | |
D = | Q3 + R2 |
Démonstration des formules à la page : http://mathworld.wolfram.com/CubicEquation.html
Si D < 0, on calcule les trois solutions réelles ainsi
:
cos-1 est la fonction acos de C, fournie par <math.h>, i.e. il faut inclure ce fichier en début de programme | ||
z1 = | ||
z2 = | ||
z3 = |
Sinon, on calcule :
S = | la racine cubique de x est obtenue par "pow(x,1.0/3.0)" en C. Notez que la racine cubique de (-x) est l'opposé de la racine cubique de x. Il faut en effet traiter séparément le cas où x < 0 du cas x >= 0, car C ne l'accepte pas dans la fonction pow. |
|
T = |
Si D=0 et S+T != 0, il y a 2 racines :
z1 = | ||
z2 = | (racine double) |
Sinon, il y a une racine unique : z1 ci-dessus.
Écrivez un programme proto.c dans lequel vous définissez une fonction demander_nombre() respectant le prototype suivant :
int demander_nombre(void);
Cette fonction doit demander un entier à l'utilisateur et retourner sa valeur.
On peut montrer que pour une fonction suffisamment régulière
(disons ici C-infinie), on a la majoration suivante :
où M8 est un majorant de la dérivée huitième de f sur le
segment [a,b].
Écrivez un programme calculant la valeur approchée d'une intégrale à l'aide de cette formule, c'est-à-dire par :
Où les valeurs a et b sont entrées par l'utilisateur.
Pour cela écrivez 3 fonctions :
#include <math.h>en début de programme et compiler avec l'option -lm.
Utilisez ces fonctions dans le main() pour réaliser votre programme.
Note : Vous pourrez trouver ici une démonstration de la formule donnée plus haut.
Question subsidiaire (Niveau 3) : | ||
Comment faire pour ne pas recompiler le programme pour chaque nouvelle fonction ?
En tant que tel, c'est-à-dire laisser l'utilisateur saisir lui-même
sa formule, cela est beaucoup trop compliqué pour ce cours d'introduction. |
Écrivez le programme cos.c qui calcule une approximation de la fonction cosinus cos(x) (pour x dans [0, 2*pi])
Pour calculer cos(x), utilisez la série définie par :
Écrivez les fonctions (appellées depuis la fonction cos(x))
N sera demandé en entrée à l'utilisateur dans la fonction main() (vous pouvez utiliser ici la fonction demander_nombre de l'exercice 1), puis tant que l'utilisateur n'entre pas 0.0, le programme calcule et affiche le cosinus du nombre entré.
Remarques :
Le 31 Décembre 2008, la version 30 Go du Zune player, un lecteur audio de Microsoft, se bloquait au démarrage. La solution officielle fût d'attendre le 1er janvier. Un bug à été découvert dans la gestion des années bissextiles.
Voici le code qui se trouvait dans la version buggée du Zune player. Le nombre de jours écoulés depuis le 01/01/1980 (« l'epoch » Microsoft), à compter de 1, est enregistré dans une puce. Au démarrage, le Zune player lit le nombre de jours et le convertit en date.
int days = 10593; /* 31 décembre 2008, normalement lu depuis la puce */ int year = ORIGINYEAR; /* 1980, l'epoch pour Microsoft */ while (days > 365) { if (IsLeapYear(year)) { /* 2008 est une année bissextile */ if (days > 366) { days -= 366; year += 1; } } else { days -= 365; year += 1; } }
Trouvez l'erreur et proposez une solution (supposez que la fonction IsLeapYear est correcte).
Implémentez et vérifiez votre solution dans un nouveau programme nommé zune.c qui demande un entier supérieur ou égal à 1, représentant le nombre de jours écoulés depuis le 31/12/1979 (1 correspond au 01/01/1980 et 10593 au 31 décembre 2008), puis affiche la date correspondante sur la sortie standard.
Exemples d'exécution :
$ ./zune Entrez etc. : 10593 31/12/2008 $ ./zune Entrez etc. : 42 11/02/1980 $ ./zune Entrez etc. : 1 01/01/1980 $ ./zune Entrez etc. : 1337 29/08/1983
Indices :
int DaysForMonth(int year, int month)
Pour continuer sur le même thème...
Le «timestamp» UNIX est le nombre de secondes écoulées depuis le 01/01/1970 à 00:00. En utilisant la fonction time de la bibliothèque time.h («man 2 time» pour plus de détails), écrivez un programme unix-time.c qui affiche la date et l'heure actuelle.
Exemple d'exécution :
$ ./unix-time 1235583855 secondes se sont ecoulees depuis le 1.1.1970 a minuit. Nous sommes donc le 25/02/2009 a 17:44:15.
Comparez la sortie de votre programme à la date actuelle. Y'a-t-il une différence ? Si oui, expliquez pourquoi.