___________________________________________________________________________ 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.
© Copyright 2024 Paperzz