___________________________________________________________________________
Exercice 0
Deuxième programme : Conversion des degrés Celsius en degrés Fahrenheit.
[°F] = [°C] * 9 / 5 + 32
Écrire un programme qui permette de :
- saisir une température en °C au clavier ;
- calculer et afficher sa valeur en °F à l’écran
Exercice 0 - bis
Même exercice que précédemment, mais en déclarant et en appelant une fonction, dont le prototype
sera :
float convertir(float celcius) ;
Exercice 1 (optionnel)
Écrire un programme qui :
- Lit deux entiers au clavier
- Affiche les parties entière et fractionnaire de leur rapport
Exercice 2 - Calcul des racines d’une équation du second degré (optionnel)
Écrire un programme qui :
- demande les coefficients a, b, c de l’équation
;
- calcule les deux racines réelles (aujourd’hui, on supposera que l’utilisateur ne donne que des
valeurs a, b, c telles que ≥ 0) ;
- affiche le résultat à l’écran.
Le main réalisera les saisies clavier (scanf) puis appellera une fonction
void resoudre_second_degre(float a, float b, float c)
qui fera les calculs et affichera les résultats a l’écran.
Exercice 2bis - Calcul des racines d’une équation du second degré (optionnel)
Écrire un programme qui :
- demande les coefficients a, b, c de l’équation a x²+ b x + c = 0 ;
- calcule les deux racines ;
- affiche le résultat à l’écran.
On traitera TOUS les cas possibles.
Le main réalisera les saisies clavier (scanf) puis appellera une fonction
void resoudre_second_degre(float a, float b, float c)
qui fera les calculs et affichera les résultats a l’écran.
___________________________________________________________________________
Exercice 2ter - Calcul des racines d’une équation du second degré suite et fin
Écrire un programme qui :
- demande les coefficients a, b, c de l’équation a x²+ b x + c = 0 dans le main()
- calcule les deux racines dans une fonction qui « retourne » les deux racines
- affiche le résultat à l’écran dans le main()
On traitera TOUS les cas possibles.
On implantera une fonction de résolution qui prend en paramètres les valeurs des coefficients
et « renvoie » les solutions. Cette fonction ne fera aucune entrée/sortie. Son prototype sera :
// Stocke les racines dans *px1 et *px2
// et retourne le nombre de solutions (0 1 ou 2)
int solve(float a, float b, float c, float *px1, float *px2) ;
Exercice 3
Écrire un programme qui calcule la factorielle d’un nombre entier.
On implantera une fonction fact qui prend un entier et renvoie sa factorielle.
Exercice 4 (optionnel)
Définir une variable x de type float.
En utilisant x et uniquement x :
initialiser x à la valeur de votre choix,
afficher cette valeur à l’écran,
afficher l’adresse de x à l’écran.
Définir une variable p_x de type pointeur vers un float.
Faire pointer ce pointeur vers x.
En utilisant p_x et uniquement p_x :
initialiser la valeur de x à la valeur de votre choix,
afficher cette valeur à l’écran,
afficher l’adresse de x à l’écran.
Conclusion ?
Exercice 5 (optionnel)
Ecrire une fonction qui prend 2 flottant en paramètre et « retourne » la somme et
le produit de ces deux flottants.
___________________________________________________________________________
Exercice 6
Test de primalité
Écrire une fonction qui :
- demande un entier n à l’utilisateur ;
- vérifie si cet entier est premier ou non.
Avec une boucle for ou une boucle while, on testera si 2, puis 3, puis 4.... puis n/2 divise n.
Rappel : l’opérateur modulo % calcule le reste de la division entière de deux entiers.
Exemple : 4%2 vaut 0. 4%3 vaut 1.
Ecrire un main() permettant de tester votre fonction.
Améliorer le programme fin de pouvoir faire plusieurs tests sans relancer l’exécutable
- à la fin du test, demander à l’utilisateur, s’il souhaite faire un nouveau test ;
- recommencer tant que l’utilisateur répond 1
Exercice 7. Calcul de pi (optionnel)
Calculer Pi par la limite à l’aide de la formule
p
1 1 1 1 1
=1 − + − + − + ...
4
3 5 7 9 11
Exercice 8 : contrat, prototype et corps de fonctions simples
€
Dans la suite, le terme « fonction » désigne indépendamment une fonction ou une procédure.
Pour chacune des questions suivantes,
1) Définissez soigneusement le prototype de la fonction et réfléchissez à son contrat
2) Implantez la fonction
3) Assurez vous de la tester en ajoutant, de façon incrémentale, des instructions à la
fonction main().
a)
b)
c)
d)
e)
f)
g)
h)
i)
Fonction qui renvoie la valeur absolue d’un entier.
Fonction qui renvoie le produit de 3 nombres réels passés en paramètres
Fonction qui calcule la factorielle d’un nombre entier passé en un paramètre
Fonction permettant de calculer une puissance entière d’un nombre double
Faire une fonction qui prend 2 entiers en paramètres, ajoute un au premier et soustrait un
au second.
Fonction qui prend 2 flottant en paramètre et « retourne » la somme et le produit de
ces deux flottants.
Fonction qui prend un tableau de n éléments de type double en paramètre et met
tous les éléments à 89.12.
Fonction qui résoudrait l’équation du second degré dans R.
Écrire une fonction qui calcule le pgcd de a et b (elle peut être récursive…)
___________________________________________________________________________
Exercice 9 – dosage (optionnel)
Dichotomie
On considère le dosage de l’acide éthanoïque, noté AH, par la soude :
AH
+ OH→
A+
H2 0
ca , va
cb , vb
Données : Ke = 10 -14 ; Ka = 10 -4,8
ca , va , cb , vb concentrations et volumes d’acide et de base versés.
On posera a = ca va / (va + vb ) et b = cb vb / (va + vb )
On admet, mais vous pouvez le démontrer, que le pH à l’équilibre est solution de :
f ( pH ) = Ke 10 pH + a / ( 1 + 10 -pH / Ka ) – 10 -pH – b = 0
Écrire un programme qui calcule par dichotomie le pH à l’équilibre à e = 10-2 près.
On cherchera le pH entre 0 et 14. On admet, mais vous pouvez le démontrer, que pour des
valeurs usuelles de concentrations et de volumes, on a :
f (x) < 0 pour 0 ≤ x < pHeq et f (x) > 0 pour pHeq < x ≤ 14.
Exercice 10 (optionnel)
Nombre de Harshad
Harshad2.c
Un nombre de Harshad est un entier qui est divisible par la somme de ses chiffres dans une
base donnée.
Exemple :
84
8+4=12
84/12=7
Autres exemples : 10, 12, 18, 54, 84, 102
Ecrire un programme permettant de tester « n’importe quel » entier.
Exercice 11 (optionnel)
Nombre de Keith
Keith.c
Un nombre de Keith est un entier qui apparaît dans une suite récurrente basée sur la somme de
ses chiffres dans une base donnée.
Exemples :
14
1+4=5
4+5=9
5+9=14
197 1+9+7=17
9+7+17=33 7+17+33=57 17+33+57=107
33+57+107=197
Autres exemples : 19, 28, 47, 61, 75
Tester pour 102 ;
Tester pour 742 ;
Ecrire un programme permettant de tester « n’importe quel » entier.
___________________________________________________________________________
Exercice 12 : complexes (optionnel)
Définir un type structure struct complexe qui permettra de manipuler des nombres complexes.
Écrire un programme qui permet de
calculer le produit de 2 nombres complexes.
Calculer la norme d’un complexe
Exercice 13
Faire un programme qui crée 3 tableaux de 5 réels, initialise les deux premiers par lecture au
clavier, ajoute ces 2 premiers tableaux dans le troisième et affiche ce dernier tableau.
Exercice 14
Recherche d’un miminum
1. Définir un tableau de N float.
2. Initialiser aléatoirement le tableau de réels avec des nombres entre 1 et 100.
Afficher les éléments du tableau pour vérification avec des indices pointeur
3. Rechercher l’indice et la valeur du plus petit élément du tableau.
Pour le tirage aléatoire aléatoire :
#include <stdlib.h>
#include <time.h>
// srand, rand
// time
int main( )
{
int alea ;
srand(time(NULL)) ;
// initialisation de la suite pseudo aléatoire. À faire UNE SEULE FOIS !
// désormais CHAQUE appel de rand( ) donne un nouveau terme de la suite
// % 100 ramène le résultat entre 0 et 99.
alea = rand() % 100 ;
}
Exercice 15 (optionnel)
Triangle de Pascal
Définir un tableau d’entiers N x N.
On pourra prendre N = 10 pour commencer.
Demander une valeur n à l’utilisateur puis calculer et afficher
les nères lignes du Triangle de Pascal.
___________________________________________________________________________
Exercice 16 (optionnel)
Suite de Fibonnacci
Calculer puis afficher les n premiers éléments de la suite de Fibonnacci.
F1=F2=1
Fn=Fn-1+Fn-2
Exercice 17 (optionnel)
Tri par insertion
1. Définir un tableau de N entiers.
2. Initialiser aléatoirement le tableau avec des nombres entre 1 et 100.
3. Trier le tableau par ordre croissant en utilisant le tri par insertion :
C’est la méthode de tri la plus simple et la plus naturelle (mais pas la plus efficace) :
- chercher le plus petit élément parmi 0, …, N-1 et le placer en 0 ;
- chercher le plus petit élément parmi 1, …, N-1 et le placer en 1 ;
-…
- chercher le plus petit élément parmi N-2, N-1 et le placer en N-2.
Écrire le squelette du programme sur papier.
Programmer le tri par insertion.
Exercice 18
Tri à bulles
1. Définir un tableau de N entiers.
2. Initialiser aléatoirement le tableau avec des nombres entre 1 et 100.
3. Trier le tableau par ordre croissant en utilisant le tri à bulles :
Le principe de ce tri est de faire remonter progressivement les plus petits éléments
du tableau, comme des bulles d’air qui remontent à la surface d’un liquide :
- Tant qu’on n’est pas sûr que le tableau soit trié
- parcourir les cases du tableau
- si la case i (bulle i) est plus lourde que la case i+1 (bulle i+1)
- échanger les deux bulles ; le tableau n’est peut-être pas encore trié !
Écrire le squelette du programme sur papier.
Programmer le tri à bulles.
Entre le tri par insertion et le tri à bulle, lequel est le plus efficace ? Pourquoi ?
___________________________________________________________________________
Exercice 19 – param du main
Modifiez le programme de résolution des équations du second degré de telle sorte que le
programme puisse soit :
- soit être lancé avec trois paramètres réels passés au lancement du programme depuis le
Terminal (les coefficients)
-
soit être lancé sans paramètre (le programme demande alors les coefficients à
l’utilisateur)
Exercice 20 – param du main (optionnel)
Écrire un programme qui :
Ouvre un fichier "note.bin" contenant des entiers
Lit tous les entiers dans un tableau
Recherche la note minimum
On réutilisera la fonction de recherche de minimum de l’exercice 14 « recherche de
minimum »
La lecture du fichier sera faite par une fonction écrite dans un fichier source fichier.c
La recherche du minimum sera faite par une fonction écrite dans un fichier fonction.c
Le main sera dans un fichier main.c
Exercice 21 (optionnel)
On dispose d’un fichier population.txt dans lequel sont stockées le nombre d’habitants de
plusieurs agglomérations en France, classées par ordre alphabétique.
Le format du fichier est le suivant
<ville1> \t<nbhabitants>
Un exemple de fichier est donc :
Grenoble
156659
Paris 2211297
Ecrivez un programme qui lit toutes les données du fichier dans un tableau, et recherche la
ville ayant :
- le plus grand nombre d’habitants
- le nom le plus court
___________________________________________________________________________
Exercice 22 (optionnel)
Manipulation d’images…
Introduction Une image numérique est un ensemble de pixels (largeur x hauteur). Chaque pixel est coloré.
Codage des couleurs :
Dans le standard de couleur RGB (Red Green Blue), les couleurs sont codées de la façon
suivante :
- une intensité pour le rouge entre 0 et 255,
- une intensité pour le vert entre 0 et 255,
- une intensité pour le bleu entre 0 et 255.
Exemples :
La couleur rouge est codée par les trois valeurs 255 0 0 ;
La couleur noir est codée par les trois valeurs 0 0 0 ;
La couleur blanc est codée par les trois valeurs 255 255 255 ;
La couleur jaune est codée par les trois valeurs 255 255 0
Fichier Image :
Il existe de nombreux formats de fichier pour les images (bmp, gif, jpeg).
Un des plus simples est le format ppm.
Les fichiers ppm peuvent être créés et affichés par exemple avec le logiciel The Gimp,
disponible à l’Ecole sur tous les ordinateurs.
Ce sont des fichiers texte ; leur contenu peut être visualisé dans GEdit par exemple.
Un fichier ppm est composé de :
- une ligne qui contient la chaîne "P3" (identification du type du fichier) ;
- une ligne qui contient une chaîne "# CREATOR: GIMP PNM Filter Version 1.1" ;
- deux entiers qui représentent la largeur et la hauteur de l’image en pixels ;
- un entier qui est la valeur maximale des couleurs (255 en général) ;
- (largeur x hauteur x 3) entiers qui codent les couleurs de chaque pixel.
Exemple de fichier ppm :
P3
# CREATOR: GIMP PNM Filter Version 1.1
500 375
255
28 39 25 27 36 101 …
___________________________________________________________________________
Pour stocker une image en mémoire, on utilisera le type suivant :
#define MAX 175000
typedef struct im {
int nbc ;
// nombre de colonnes (largeur)
int nbl ;
// nombre de lignes (hauteur)
// pix : les valeurs R V B des pixels
//de gauche à droite et de haut en bas
int pix[MAX] ;
} image_t ;
On définira également les constantes :
#define R 0
// indice composante rouge
#define V 1
// indice composante vert
#define B 2
// indice composante bleu
Ce type sera défini dans le fichier type.h.
Un module fileppm.h / fileppm.c regroupera les fonctions d’entrée/sortie fichier.
Un module fonctions.h / fonctions.c regroupera les fonctions de traitement.
Accès aux pixels d’une image Compte tenu du type image_t, on dispose d’une variable
image_t im ;
correctement initialisée (qui contient une image), alors :
la composante R du pixel (i,j) est
im.pix[ i * im.nbc*3 + j*3 + R]
la composante V du pixel (i,j) est
im.pix[ i * im.nbc*3 + j *3+ V]
la composante B du pixel (i,j) est
im.pix[ i * im.nbc*3 + j*3 + B]
Ecrire une fonction
int pix_id ( int nbc, int i, int j, int coul ) ;
qui renvoit l’id du pixel de à la ligne i et à la colonne j de couleur coul (R, V, ou B)
dans le tableau des valeurs d’une image, sachant que l’image a nbc colonnes et nbl lignes.
Création d’une image Ecrire une fonction
image_t creer_image ( int nbc, int nbl) ;
qui crée en mémoire une image de taille nbc colonnes et nbl lignes, dont le haut est
rouge et le bas est bleu.
Ecriture d’une image Ecrire une fonction
int sauver_image_ppm( char filename[], image_t im) ;
qui sauve l’image im dans le fichier de nom filename au format ppm.
___________________________________________________________________________
Première fonction main() Ecrire une fonction main() qui crée en mémoire une image de taille 100x200 pixels et la
sauve dans un fichier nommé « test.ppm ».
Compiler et exécuter ce programme.
Lecture d’un fichier ppm Ecrire une fonction
int lire_image_ppm( char filename[], image_t * p_im) ;
1) ouvre un fichier .ppm (avec la fonction fgets() )
2) lit les deux premières chaînes d’un fichier ppm et les affiche à l’écran ;
2) lit les 3 entiers suivants, les affiche à l’écran et les stocke dans l’image *p_im
4) lit les composantes rgb de tous les pixels et les stocke dans l’image *p_im
Cette fonction retournera 0 si tout se passe bien, un autre entier en cas d’erreur.
Modifier le main de telle sorte qu’il :
1/ lise le fichier exemple.ppm
2/ écrive l’image (sans modification) dans un fichier copie.ppm
Suppression de composante Ecrire une fonction qui supprime l’une des composante de couleur (R, V ou B) dans une
image passée en paramètre.
Vous choisirez le prototype de cette fonction.
Modifier le main de telle sorte qu’il lise l’image exemple.ppm, supprime la composante bleue
de l’image, et sauve l’image dans un nouveau fichier modifie.ppm.
Traitements… Complétez votre programme en ajoutant divers traitements d’image, par exemple :
- négatif
- passage en noir et blanc
- inversion droite / gauche ou haut / bas de l’image
- saturation des couleurs
- rotation à 90°
- etc !
Chaque traitement sera réalisé par une fonction spécifique.
Dans le main, vous programmerez un menu en ligne de commande (Switch sur un entier par
exemple).
Passage des paramètres au programme depuis le Terminal Modifiez la main pour qu’il accepte 3 paramètres depuis le Terminal :
1/ le nom de l’image à ouvrir
2/ le nom de l’image à sauver après traitement
3/ un entier qui encode le numéro du traitement à réaliser.