Uploaded by Nivine Haris

Cours info 2270

advertisement
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.
Download