Info 2270 Algorithmique et programmation Dr. Racha El Hajj Racha.elhajj@hotmail.com Université Libanaise, faculté des sciences I 1.1 Définition Un algorithme est l‟énoncé des opérations nécessaires à la réalisation d‟une tâche donnée (en particulier par un ordinateur). Caractéristiques : Aucune ambiguïté Le résultat doit être fourni en un nombre fini d‟opérations L‟algorithme est indépendant du langage de programmation utilisé Méthodologie : Définition du problème Spécification des données et des hypothèses sur les données Spécification des buts à atteindre (résultats) Spécification des contraintes Recherche d‟une méthode Décomposer en sous problèmes Raffinements successifs Ecriture de l‟algorithme Suite d‟instructions élémentaires Les instructions sont séparées par un retour à la ligne (ou un ;) Les instructions sont les actions sur les données et les variables du problème Exemples : 1. Algorithme décrivant comment sortir la voiture du garage (non destiné à un ordinateur !) Actions : 2. Algorithme décrivant la résolution d‟une équation du premier degré de la forme Ax+B=0. Algorithme pour calculer l‟inverse de x Actions : 1.2 Données et Variables Une donnée C‟est un symbole dont la valeur est connue au départ. (Elle est donnée par l‟utilisateur ou par un autre algorithme) Une donnée n‟a pas vocation à être modifiée par l‟algorithme. Exemples : 1.Voiture, clef, garage sont des données 2. A et B sont des données à valeurs réelles On doit définir la nature (le type) des données : réel, entier, caractère. Une variable est un symbole dont la valeur (inconnue au départ) est susceptible de changer en cours d‟exécution de l‟algorithme. Le résultat d‟un algorithme (sortie) est très souvent associé à une ou plusieurs variables. On doit définir la nature (le type) des variables : réel, entier, caractère… Exemples : 1. Pas de variables 2. x est une variable à valeur réelle. Une constante est un symbole dont la valeur est introduite initialement et qui ne peut pas être modifiée lors de l‟exécution de l‟algorithme. Le type d‟une constante est conditionné par la valeur attribuée à celle-ci Exemples : 1. Pi = 3,14157 2. MAX =100 Exemples : Calculer le périmètre d‟un cercle Entrée : rayon R Sortie : Périmètre réel P Constante : Pi = 3,14157 P = 2 * Pi * R 1.3 Les actions élémentaires 1- L'affectation C‟est l‟opération qui consiste à attribuer une valeur à une variable pendant l‟exécution de l‟algorithme. Notation : ← x prend la valeur de –b/a s‟écrit x ← -b/a L‟affectation est la seule action élémentaire qui permet de modifier l‟état des variables. Situation avant : y vaut 1 Action y ← y+1 Situation après : y vaut 2 On doit définir la nature (le type) des données : réel, entier, caractère. Exemple 1 : Données : x, y entiers Actions : x ← x + y y←x–y x←x–y Remarque 1 : cet algorithme modifie l‟état des données Question : que fait cet algorithme ? Réponse : il permute les valeurs de x et y. Remarque 2 : Ce n‟est pas un bon algorithme de permutation il y a plus simple et plus lisible. Données : x, y entiers Variable: t entier Actions : t ← x x←y y←t 2- L'alternative C‟est l‟opération qui consiste à effectuer une action après le test d‟une condition. Notation : SI … ALORS …SINON SI ALORS SINON Alternative simple : Le SINON est omis SI ALORS Exemple 1: calcul de la valeur absolue d‟un nombre réel Donnée : x réel Variable: VA réel valeur absolue Actions : SI x >= 0 ALORS VA ← x SINON VA ← -x Exemple 2 : calcul du maximum de 2 nombres réels Données : a, b réel Variable: VA réel valeur absolue Variable: max réel max de 2 réels Actions : SI a >= b ALORS max ← a SINON max ← b Remarque : dans ces exemples actions1 et actions2 sont des affectations. Librairies : - stdio.h - stdlib.h - math.h 1. Déclaration d'une variable Syntaxe : Carte d‟identité nom (identificateur) type adresse valeur Exemple : int x = 4; Identificateur : Commence par une lettre puis une suite de chiffres ou de lettres sans accent. Nombre maximum de caractères : défini par le compilateur majuscules et minuscules différenciées. Adresse : lieu de stockage dans la mémoire. Avant d‟être stockée une variable est codée suivant son type. Son codage peut utiliser un ou plusieurs « mots » mémoires. Types => types simples : Les types de base du langage « C » définissent la taille de l‟emplacement mémoire et leur codage. Il existe des mécanismes de conversion de type. 2. Les types simples Ils dépendent de la machine. Entiers : int (- 32768 → + 32767) 16 bits short (½ * int) (- 128 → + 127) 8 bits long 2 x int (- 2147483648 → + 2147483647) 32 bits Exemple : int i, j, x ; Caractères : char 8 bits Codé par son code ASCII : (Tableau ASCII) Exemple : char a, b ; Réels : float ± 3.4 x 1038 : 6 chiffres après la virgule double ± 1.8 x 10308 : 15 chiffres après la virgule Déclaration des variables : - type : int (16 bits), long (32 bits), float (64 bits), double, char (8 bits) ... Commentaires : // /* */ Identificateurs : Constantes (#define) Variables (locale et globale) Opérateurs : -, *, +, ++; Délimiteurs ; → termine une déclaration de variables ou une instruction , → sépare deux éléments dans une liste ( ) → encadre une liste d‟arguments ou de paramètres [ ] → encadre une dimension ou l‟indice d‟un tableau { } → encadre un bloc d‟instructions ou une liste de valeurs d‟initialisations Fonctions connues : main 1- Ecrire un programme qui définit la constante PI en respectant les majuscules (#define) 2- Ajouter la déclaration d'une variable entière dont l'identificateur sera rayon (int) 3- Ajouter les instructions qui permettent d'initialiser la variable rayon avec la valeur 10, puis calculer la surface du cercle en stockant le résultat dans une variable dont l'identificateur sera resultat. Cette dernière variable sera de type réel 4- Ecrire un programme qui déclare deux variables L et l et les initialise respectivement par les valeurs : 8 et 10. 5- Ajouter les instructions nécessaires pour calculer le périmètre et l‟aire du rectangle de longueur L et de largeur l. 6- Calculer le volume du parallélépipède pour une hauteur égale à 5 7- Ecrire un programme en C qui inverse le contenu de deux nombres entiers x et y Opérations sur les variables : i ++ ; i-- ; ++i ; --i ; i+=2 ; i*=5 i=1 j=++i priorite a faire le ++ => i=2 et j=2; i=1 j=i++ on fait le ++ a la fin => i=2 et j=1; Division de deux entiers 8- Ecrire un programme qui initialise 4 variables et calcule leur moyenne 9- Ecrire un programme qui déclare les variables entières a, b et c ; qui affecte à c la valeur 7, qui l'incrémente, qui affecte a avec la valeur de c puis incrémente c, qui décrémente c puis affecte sa valeur à b puis qui décrémente b et affecte sa valeur à la variable a, que valent respectivement a, b et c ? 10- Donner les valeurs de a, b et c à la fin de ce code : #include<stdio.h> #include<conio.h> #include<math.h> void main( ){ int a = 2; int b = 4; float c; a ++; b--; a += b; a ++; c = a/b; } 11- Écrire un programme qui permute et affiche les valeurs de trois variables A, B, C de type entier qui sont entrées au clavier : A ==> B, B ==> C , C ==> A 12- Écrire un programme C qui lit de l‟utilisateur la température en Fahrenheit et la convertit en degré Celsius selon l‟expression : = (5/9) * ( - 32). 13- Ecrire un programme qui calcule le quotient et le reste de la division entière de deux nombres entiers entrés au clavier ainsi que le quotient rationnel de ces nombres. 14- Ecrire un programme qui calcule la distance DIST (type double) entre deux points A et B du plan dont les coordonnées (XA, YA) et (XB, YB) Printf(« Text to display on the output »); Print(« Hello »); Printf(« Text with the content of a variable »); %d -------------- integer %f -------------- float int a = 5; float s = 3.2; printf(“the value of the variable a is : %d”, a); printf(“La valeur de s est : %f », s) ; a=7 ; s=4.5 ; printf(« La valeur de a est %d et celle de s est %f », a, f) ; Interdit : printf(« La valeur de a est %f et celle de s est %d », a, f) ; printf(« La valeur de a est %d et celle de s est %f », a) ; printf(« La valeur de a est %d et celle de s est », a, f) ; int radius = 5; float surface; Surface = 3.14*radius*radius; Printf(“The surface of a circle of radius %d is %f”, radius, surface); printf(“The surface of a circle of radius %d is %f”, radius, 3.14*Radius*Radius); \n ---------- go to a new line \t ---------- do a tab (big space) printf(« La valeur de a est %d \n celle de s est %f », a, f) ; printf(« La valeur de a est %d \t celle de s est %f », a, f) ; printf(« La valeur de a est %d », a) ; printf(« celle de s est %f », f) ; Il les ecrit sur la meme ligne ! Il faut mettre \n &a ---- address of the variable a; int a ; float s ; scanf (“%d”, &a); scanf(“%d%f”, &a, &s); 15- Ecrire un programme qui demande de l‟utilisateur de donner un nombre entier et puis calcule son double et affiche le résultat int a; int d; printf(“give the value of a”); scanf(“%d”, &a); d=2*a; printf(“Le double de %d est %d”, a, d); 1- Write a program that ask the user to give two integer values, calculate their sum and then display the result 2- Write a program that takes from the user the length and the width of a rectangular and calculate its perimeter and its surface and display the results 3- Ecrire un programme qui lit de l‟utilisateur 4 nombre entiers et calcule leur moyenne 4- Ecrire un programme qui lit de l‟utilisateur les deux côtes d‟un triangle rectangle et calcule son hypoténuse 5- Écrire un programme qui affiche la résistance équivalente en série et en parallèle à trois résistances R1, R2 et R3 (type entier), lus de l‟utilisateur. On affichera à la fin du code la résistance équivalente. A noter que : si les résistances sont branchées en série : si les résistances sont branchées en parallèle: Caractère : char var; // 8 bits var = „a‟; A character is represented by its ASCII code A → 65 B → 66 C → 67 Z → 90 a → 97 b → 98 c → 99 z → 122 Exemple : char var1; var1=‟a‟; printf(« le caractere est %c », var1); printf(« son code ASCII est %d », var1); var1=99; printf(« L‟entier %d est le code ASCII du caractere %c», var1, var1); printf(« le caractere correspondant est %c », var1); int var2 = 105; var2 = var1; // var2 prend le code ASCII de var1 var1 = var2; // var1 est le caractere correspondant au code ASCII var2 char c; printf(« Give a character »); scanf(“%c”,&c); printf(“The ASCII code of the character %c is %d”, c, c); 1- Ecrire un programme qui calcule et affiche le nombre de caractères compris entre le 'a' et le 'A' dans la table des codes ASCII 2- Ecrire un programme qui calcule et affiche le nombre de caractères compris entre deux caractères saisis de l‟utilisateur int x; x= var1-var2 +1; // x represente le nombre de caractères entre var1 et var2 Blocs if(condition) { … … … } else { … … … } Operations relationnelles (usually used in the tests) < > <= >= == != 3- Ecrire un programme qui détermine le maximum entre deux entiers a et b lus de l‟utilisateur 4- Ecrire un programme qui affiche la différence en valeur absolue entre a et b sans utiliser la fonction abs 5- Write a program that calculates the absolute value of an integer x taken from the user 6- Écrire un programme qui affiche la résistance équivalente à trois résistances R1, R2 et R3 (type entier), lus de l‟utilisateur. L‟utilisateur indiquera aussi le type de branchement des trois résistances (« s » pour série et « p » pour parallèle). On affichera à la fin du code la résistance équivalente. A noter que : si les résistances sont branchées en série : si les résistances sont branchées en parallèle: If(x%2==0) 7- Ecrire un programme qui test si un entier lu de l‟utilisateur est pair ou impair ou egal a 0. 8- Écrire un programme qui teste si une année est bissextile (possède 366 jours), on rappelle qu'il y a une année bissextile tous les 4 ans. Logical operations && || if ( A && B) if (A || B) if ( (A||B) && C) 9- Write a program that test if an integer taken from the user is between 2 et 7. It displays 1 on the screen if the condition is respected and 0 otherwise. (Write program which affects the value of B to A if A is between 2 and 7) 10- Write a program that takes an integer from the user and check if it is between 8 and 18 or is equal to 127. 11- Write a program that checks if a character taken from the user is an uppercase or a lowercase or a number between 0 and 9. 12- Ecrire un programme qui lit un caractere de l‟utilisateur et le transforme en majuscule s‟il est minuscule et en minuscule s‟il est majuscule Switch case (Ce qui est complique avec if if if if else) int a; scanf(“%d”, &a); Switch (a){ Case 1 : printf(“one”); break; Case 2 : printf(“two”); break; default : printf(“n‟est pas compris entre 0 et 1”); } Write a program that prints out on the screen the number given by the user in letters (ex: if the user gives the number 1, it print out one, etc…) 1- Ecrire un programme qui affiche tous les nombres de 1 à 10 2- Ecrire un programme qui prend de l’utilisateur 10 entiers positifs Printf(« Donner 10 entiers positifs »); for (i=1; i<=10; i++) { Scanf(“%d”, &a); } i=1 : condition initiale i<=10 : condition d’arrêt, à tester avant chaque rentrée i++ : incrémentation après chaque itération 1- Initialisation de i 2- Tester la condition d’arret Si oui Execution de toutes les instructions. Incrémenter i Revenir à 2 Sinon arêter 3- Ecrire un programme qui affiche tous les caractères entre a et z 1- Ecrire un programme qui calcule et affiche la suite définie par S0 = 1; Si = Si-1 + 7 jusqu’à i=10 2- Ecrire un programme qui calcule le factoriel de n, lu de l’utilisateur. On note que la fonction factorielle est définie par F0 = 1; Fi = i*Fi-1 3- Ecrire un programme qui lit de l’utilisateur 5 entiers positifs et détermine leur minimum 4- Ecrire un programme qui lit de l’utilisateur 5 entiers positifs et détermine leur maximum 5- Ecrire un programme qui affiche la matrice suivante : 1 2 11 12 : 91 92 93 3 ... 4 5 6 7 ... 6- Ecrire un programme qui affiche la matrice suivante : ********** ********** ********** 8 9 100 10 ********** ********** ********** ********** ********** ********** ********** for(i=1; i<=10; i++){ printf(« * »); if(i%10==1){ printf(« \n »); } } OU for(i=1; i<=10; i++){ for(j=1; j<=10; j++){ printf(« * »); } Printf(« \n »); } 7- Ecrire un programme qui prend des entiers de l’utilisateur tant que l’entier est positif int a=1; while(a >0) { Printf(“Donner un entier positif”); Scanf(“%d”,&a); } Condition initiale dehors Condition d’arret dedans 8- Ecrire un programme qui lit de l’utilisateur des entiers positifs et affiche à la fin leur moyenne. Le programme s’arrête quand l’utilisateur donne un entier négatif. 9- Appliquer boucle for sur while : a=1; while(i<=10) { Scanf(“%d”, &a); i++; } 10- Écrire un programme qui lit de l‟utilisateur son salaire et retranche : 5% du salaire s‟il est compris entre 200 $ et 500 $ (y compris le 200 et le 500) 10% du salaire s‟il est strictement supérieur à 500 $ On affichera à la fin du code le montant restant du salaire de l‟utilisateur. On note que si le salaire est strictement inférieur à 200$ on ne retranche rien et on affiche sur l‟écran « ton salaire reste le même ». 11- Écrire un programme permettant au guichetier d‟un musée de calculer le tarif d‟entrée dans le musée. Le tarif normal d‟entrée est de 10 000. Pour certains cas particuliers, il y a des réductions effectuées au prix du billet : si le visiteur a moins de 18 ans, l‟entrée est gratuite si le visiteur a entre 18 et 25 ans, et s‟il est étudiant, il a une réduction de 50%, mais s‟il n‟est pas étudiant la réduction n‟est que de 30% si le visiteur a plus de 25 ans, mais est quand même étudiant, alors il a une réduction de 30% si le visiteur a plus de 60 ans, il paie demi-tarif Le guichetier doit demander au visiteur son âge et s‟il possède une carte d‟étudiant pour qu‟il puisse calculer le prix du billet. 12- Ecrire un programme qui affiche tous les nombres pairs entre deux entiers a et b lus de l‟utilisateur 13- Ecrire un programme qui affiche la somme de tous les nombres impairs entre 1 et 100 14- Ecrire un programme qui calcule ab (a et b lu de l‟utilisateur) 15- Ecrire un programme qui lit de l‟utilisateur l‟annee et le numero du mois et affiche le nombre de jours de ce mois 16- Ecrire un programme qui determine le nombre de chiffres d‟un entier while(n!=0)n=n/10; 17- Ecrire un programme qui converti un nombre binaire en un nombre decimal void main() { int binary, decimal=0; int N=0; printf("Enter any binary number: "); scanf("%d", &binary); while(binary!=0) { decimal += binary%10 * pow(2, N); N++; binary = binary / 10; } } 18- Ecrire un programme qui lit des caractères au clavier et affiche sur l’écran c’est un bon caractère si le caractère est parmi les caractères {O, P, Q} qui s'arrête quand on tape le caractère S. On affichera à la fin le nombre de caractères lus * ** *** **** ***** ****** ******* ******** ********* ********** for(i=1; i<=10; i++){ for(j=1; j<=i; j++){ printf("*"); } printf("\n"); } ********** ********* ******** ******* ****** ***** **** *** ** * for(i=1; i<=10; i++){ for(j=1; j<=10-i+1; j++){ printf("*"); } printf("\n"); } ********** ********* ******** ******* ****** ***** **** *** ** * * ** *** **** ***** ****** ******* ******** ********* ********** for(i=1; i<=10; i++){ for(j=1; j<=i-1; j++){ printf(" "); } for(j=1; j<=10-i+1; j++){ printf("*"); } printf("\n"); } 19- Ecrire un programme qui affiche la table de multiplication 1 2 3 4 5 6 7 8 2 4 6 8 10 12 14 16 3 6 9 12 15 18 21 24 : 9 18 27 for(i=1; i<=10; i++){ for(j=1; j<=10-i; j++){ printf(" "); } for(j=1; j<=i; j++){ printf("*"); } printf("\n"); } 10 20 30 10 20 30 40 50 60 70 80 90 100 Tableau : int tab[5]; float tab[8]; les indices commencent de 0 tab[0] : premier element tab[1] : deuxieme element C’est interdit de declarer un tableau de 15 casiers et dire je veux tab[20] -> erreur 20- Ecrire les instructions rempli un tableau de 5 elements par les valeurs allant de 1 a 5 int tab[5]; tab[0] = 1; tab[1] = 2; tab[2] = 3; tab[3] = 4; tab[4] = 5; OU int tab[5] = {1, 2, 3, 4, 5} RAPPEL : comme toute variable une case d’un tableau doit être initialisée avant d’être utilisée. int i ; int tab[5] ; i=3; tab[i] = 4 ; DONC int i ; float tab [20] ; printƒ("entrer 20 valeurs réelles ") ; for (i = 0 ; i < 20 ; i ++) scanf(" %f ", &tab[ i ]); Remarquons d'abord que l'on commence à l'indice 0 (zero), et que la dernière case que l'on va remplir est bien la case d'indice 19 = 20-1. Ensuite tab[i] est une variable de type entier et donc &tab[i] est bien son adresse mémoire, ce dont a besoin le scanf pour ranger l'information lue au clavier puis formatée en entier constant : la taille d'un tableau doit être connue à la compilation la taille d'un tableau ne peut être modifiée au cours de l'exécution d'un programme problème : on ne connaît pas le nombre d'éléments que l'on va ranger dans le tableau, mais on sait qu'il n'y en aura pas plus que 1000 par exemple. Méthode : on définit une taille maximum (constante) MAX on définit un tableau de taille MAX Exemple : # define MAX 100 ; int tab [MAX] ; 21- Ecrire un programme qui saisit 10 entiers positifs de l‟utilisateur et les remplit dans un tableau puis determine leur maximum, minimum et moyenne 22- Ecrire un programme qui determine le nombre de fois le maximum apparait dans le tableau 23- Ecrire un programme qui lit de l‟utilisateur des entiers positifs et s‟arrete avec un entier negatif puis retourne la frequence des entiers pairs et impairs presents dans le tableau 24- Ecrire un programme qui determine le maximum d’un tableau saisi de l’utilisateur max=tab[0]; for(i=1; i<n;i++){ if(tab[i]>max){ max=tab[i]; } } printf(“Le maximum est %d”,max); 25- Ecrire un programme qui donne le nombre de fois le maximum apparait dans le tableau. for(i=0; i<n; i++){ if(tab[i]==max){ j++; } } 26- Ecrire un programme qui remplit un tableau de 10 entiers saisis de l’utilisateur et retourne le nombre d’entiers pairs et impairs presents dans le tableau for(i=0;i<n;i++){ if(tab[i]%2==0){ pair++; } else { impair++; } } printf(« Le nombre d’entiers pair est %d et celui des impairs est %d »,pair,impair); 27- Ecrire un programme qui inverse un tableau de tableau. entiers sans utiliser un deuxième 28- Ecrire un programme qui saisit de l‟utilisateur 10 valeurs entières et les remplit dans un tableau. Puis saisit un entier c de l‟utilisateur et vérifie le nombre de fois cet entier se répète dans le tableau (s‟il existe dedans). On affichera à chaque fois la position de l‟entier c dans le tableau 29- Soit la suite suivante : { ( ) Ecrire un programme qui prend de l’utilisateur un entier n et calcule le nième terme de la suite. 30- La suite de Fibonacci est une séquence de nombres dans laquelle les deux premiers nombres de la séquence sont 1 et 1. Ensuite, chaque nombre de Fibonacci supplémentaire représente la somme des deux nombres précédents de la séquence: Écrire un programme qui lit un entier la suite de Fibonacci. et calcule et imprime sur l'écran le terme de 31- Ecrire un programme qui prend de l’utilisateur le degré et les coefficients d’un polynome et Calcule le résultat du polynome pour une valeur x prise de l’utilisateur int i, n, x; float y; int tab[1000]; print(“Donner le degree du polynome”); scanf(“%d”,&n); printf(“Donner les n coefficients du polynome”); for(i=0; i<n; i++){ scanf(“%d”,&tab*i+); } printf(“Donner la valeur de x”); scanf(“%d”,&x); for(i=0; i<n; i++){ y+=tab[i]*x^i; } printf(“y=%f”,y); Tableau à double dimension : int tab[5]={1, 2, 3, 4, 5}; int tab[2][5]={{1,2,3,4,5},{6,7,8,9,10}}; scanf(“%d”, &tab*i][j]); 32- Ecrire un programme qui remplit dans un tableau la table de multiplication jusqu’à 10x10 33- Ecrire un programme qui additionne deux matrices A et B et met les résultats dans la matrice C for(i=0; i<n; i++){ for(j=0; j<n;j++){ C[i][j]=A[i][j]+B[i][j]; } } 34- Ecrire un programme qui cherche le minimum d’un tableau et affiche sur l’écran le minimum et sa position 35- Ecrire un programme qui remplit le tableau suivant, avec le plus petit nombre d’instructions possible : 1 4 9 16 25 36- Écrire un programme qui lit de l‟utilisateur 10 entiers et les remplit dans un tableau tab. Puis extrait du tableau les entiers pairs et impairs et les remplit dans deux tableaux : tab_pair contenant les pairs et tab_impair pour les impairs. 37- Ecrire un programme qui permet d'inverser un vecteur T1 à n éléments entiers (n constant) dans un autre vecteur T2 de la même taille for(i=0 ; i<n ; i++){ tab2[i]=tab1[n-i-1] ; } 38- On considère un tableau trié par ordre croissant, ecrire un algorithme qui insère un élément dans le tableau dans le bon endroit. while(tab[i]<c){ i++; } for(j=n-1; j>=i; j--){ tab[j+1]=tab[j]; } Tab[i]=c; 39- Ecrire un programme qui effectue la multiplication de deux matrices A (n x m) et B (m x p) et met le résultat dans la matrice C (n x p) for(i=0; i<n; i++){ for(k=0; k<p; k++){ s=0; for(j=0; j<m; j++){ s+=A[i][j]*B[j][k]; } C[i][k]=s; } } 40- Ecrire un programme qui trie un tableau (on pourra créer un deuxième tableau) int tab[10]; int tab_tri[10]; for(i=0; i<n; i++){ While(tab_tri[j]<tab[i]){ j++; } for(k=i; k>j; k--){ tab[k+1]=tab[k]; } Tab_tri[j]=c; } Chapitre 7 Les fonctions 7.1 Définition d’une fonction Ecrire un programme qui calcule la c = ab et z = xy void main(){ int a, b, c=1, x, y, z=1; printf(“Donner a et b”); scanf(« %d%d », &a, &b) ; for(i=0 ;i<b ; i++){ c=c*a ; } Printf(“%d^%d=%d”, a, b, c); printf(“Donner x et y”); scanf(« %d%d », &x, &y) ; for(i=0 ;i<y ; i++){ z=z*x ; } Printf(“%d^%d=%d”, x, y, z); } Pour conserver la professionalite, on peut ecrire cette portion du code dans un endroit a part et puis demander a chaque fois de repeter ce travail quand voulu Déclaration d’une fonction Type : type de la valeur retournée par la fonction (inv, char, float, …) si pas de retour => void (procédure). Identificateur : nom de la fonction, il doit qualifier le type de traitement effectué par la fonction. Paramètres : variables qui effectuent l‟interface avec la tâche appelante Déclarations de variables : variables qui seront utilisées dans la fonction pas en dehors. Important : Une fonction doit être déclarée avant d‟être utilisée => 2 solutions. int ma_fonction (….) { / * bloc * / } void main ( ) { /* appel de ma_fonction */ ma_fonction(....) ; } Retour de l‟appel : Une fonction retourne une valeur à la tâche qui l‟a appelée => return expression → return i ; => type de l‟expression → type de la fonction si void => sans return int puissance (){ int a, b, c=1 ; for(i=0 ;i<b ; i++){ c=c*a ; } printf(“%d^%d=%d”, a, b, c); Return c; } void main(){ int a, b, c, x, y, z ; printf(“Donner a et b”); scanf(« %d%d », &a, &b) ; c=puissance(a, b); printf(“Donner x et y”); scanf(« %d%d », &x, &y) ; z=puissance(x, y); } 7.2 Appel d’une fonction Exemple 1 : calcul du minimum # include < stdio. h > / * pour le calcul du minimum * / int min (int i, int j) { if (i < j ) return i ; else return j ; } void main ( ) { int x, y, z ; printf ("entrez deux nombres : " ) ; scanf" % d % d ", & x, & y) ; z = min (x, y) ; } Exemple 2 : Puissance d‟un nombre positif ou nul. double puiss. (double x, int y) { double p ; int i ; for (p = 1, i = o ; i < y ; i ++) p=p*x return p ; } void main ( ) { double m ; m = puis (10.5, 3) ; } 1- Ecrire une fonction somme (2 paramètres) qui calcule et retourne la somme de deux entiers. Tester cette fonction dans le main 2- Ecrire une fonction my_swap (2 paramètres) qui échange le contenu de deux entiers 7.3 Passage des paramètres Déclaration : liste de paramètres entre ( ) séparés par, liste vide => void. Appel : - liste d‟arguments entre ( ) → variables, expressions. Paramètre est un objet (variable) de la routine → Il a une valeur initiale par le fait de l‟appel qui copie la valeur de l‟argument dans le paramètre Exemple : La déclaration de la variable est valable jusqu‟à la fin du bloc de la fonction. La correspondance entre paramètres et arguments se fait suivant l‟ordre dans la liste. o concordance de types o même nombre Exemple : void Ma fonction (int i, float k, char c) { ……………….. ………………. } Ma Fonction (k, g, i) ; Passage de paramètres par valeur : (paramètre d‟entrée) : lors de l‟appel → copie de la valeur de l‟argument dans le paramètre. exécution de la fonction → dans le paramètre = valeur de l‟argument. Le paramètre est une variable, on peut donc modifier sa valeur. retour à la routine appelante → la valeur de l‟argument n‟est pas affectée par les modifications éventuelles du paramètre. Exemple : int plus (int x) { x = x ++ ; return x ; } void main ( ) { int x, y ; x=5;y=0; y = plus (x) ; } void plus (int x, int y) { y = x ++ ; return ; } Passage de paramètres par adresse : (par référence) transmettre l‟adresse de l‟argument de telle sorte qu‟elle devienne la valeur du paramètre. Les mêmes règles que pour le passage par valeur sont appliquées. différence : le contenu de l‟adresse indiquée peut-être modifié. utilisé lorsque le rôle de la routine est de modifier l‟état de ses paramètres. Exemple : permutation de deux variables. void permute ( int *x, int *y ) { int t ; t = *x ; *x=*y ; *y = t ; } void main ( ) { int x, y, a, b ; x = 12 ; y = 24 ; a=2;b=4; permute (& x, & y) ; permute (& a, & b) ; } Important : Lorsque la valeur du paramètre doit changer dans la fonction, il faut alors impérativement passer les paramètres par adresse. Les modifications du contenu des objets désignés par leur adresse en paramètre ont des répercussions dans la routine appelante. Attention : Int plus (int * x) { *x=*x+1; return (* x) ; } void main ( ) { int x, y y = plus (&x) ; } Equivalence : fonction – procédure Fonction : typeA f (….) { typef résultat ; résultat = …….. ; return résultat ; } Procédure : void calculf(……., typeA *v) { typeA résultat ; …. Résultat = …… ; *v = résultat ; return ; } Appel dans le main : Fonction valeur = f(……..) ; Procédure calculf (……., & valeur) ; 1- a- Ecrire une fonction C qui prend un entier positif n comme argument et renvoie 1 si n est premier et 0 sinon. b- Ecrire un programme qui affiche tous les nombres premiers entre deux entiers a et b lus de l‟utilisateur. 2- a- Ecrire une fonction qui détermine les diviseurs d‟un entier envoyé comme paramètre. b- Ecrire une fonction qui détermine si un entier est abondant. Un entier est dit abondant s‟il est égal à la somme de ses diviseurs. c- Ecrire une fonction main qui affiche tous les entiers abondants entre deux entiers a et b lus de l‟utilisateur. 1- Utiliser une fonction qui retourne la somme et la soustraction entre 2 entiers envoyés en arguments : void Somme_Sous(int a, int b, int R[2]){ { R[0]=a+b ; R[1]=a-b ; } Void main(){ int a, b, R[2] ; printf(« Donne 2 entiers ») ; scanf(« %d%d », &a, &b) ; Somme_Sous(a, b, R) ; Printf(« La somme est %d et la soustraction est %d », R[0], R[1]) ; } 2- Ecrire une fonction qui determine le maximum et le minimum et la moyenne d‟un tableau de 10 entiers 3- Ecrire une fonction qui effectue la somme de deux matrices A et B lus en parametres (les tailles de ses matrices sont connues) 4- Ecrire une fonction qui effectue la somme de deux matrices A et B lus en parametres (les tailles de ses matrices ne sont pas connues, a chaque fois on fait appel a cette fonction avec des matrices de tailles differentes) void sum_matrix(int A[][], int B[][], int C[][], int l, int c){ int i, j ; For(i=0 ; i<l ; i++){ For(j=0; j<c; j++){ C[i][j] = A[i][j] + B[i][j]; } } } 5- Ecrire une function qui affiche sur l‟ecran une matrice envoyee en parameter 6- Ecrire un programme qui effectue l‟operation C = A + 2*B tel que A et B sont deux matrices lues de l‟utilisateur puis affiche les trois matrices en utilisant les deux fonctions precedentes 7- Ecrire une fonction qui prend comme argument un tableau de 10 entiers et un entier c et determine le nombre d‟occurrence des differents elements du tableau 8- Ecrire une fonction qui prend en argument un tableau d‟entiers et sépare les nombres pairs et les nombres impairs dans deux tableaux distincts 9- Ecrire une fonction qui prend en argument deux matrices et vérifie si elles sont égales 10- Ecrire une fonction pour trouver le second plus grand élément d'un tableau. 11- Ecrire une fonction qui vérifie si la matrice est symétrique.