Vous êtes sur la page 1sur 19

Procédures et

fonctions
Procédures et fonctions
• Pour la résolution d’un problème complexe,
• Il est préférable de décomposer le problème en des
sous problèmes.
• Pour chacun de ces sous problèmes on écrit un sous
programme qui sera appelé par l’algorithme principal.
• Un sous programme peut être une procédure ou une
fonction.
• Un sous programme (fonction ou procédure) est spécifié
par un nom, un type de retour et éventuellement une
liste de paramètres.
Procédures et fonctions
• Paramètres formels
Paramètres déclarés dans l’algorithme principal et qu’on
spécifie lors de l’appel d’un sous-programme
• Paramètres effectifs
Paramètres déclarés dans le sous-programme Formel
Exemple
void main ()
{int a; void pair (int b)
printf("Saisir un entier"); {if (b%2==0)
Effectif scanf("%d",&a); printf("%d est pair", b);}
pair(a);}
Procédures
Algorithme Exemple
Procédure Nom (paramètres formels) Procédure pair (a :entier)
Déclaration des variables locales Début
Début Si a mod 2 =0 alors
Liste des actions ecrire(a, " est pair")
Fin Fin si
Fin
Langage C Exemple
void Nom (paramètres formels) void pair (int a)
{ Déclaration des variables locales; {if (a%2==0)
actions; printf("%d est pair", a);
} }
Fonctions
Exemple
Algorithme Fonction pair (a :entier) : booleén
fonction Nom (paramètres formels) : Type retour
Début
Déclaration des variables locales
Si a mod 2 =0 alors
Début
retourner vrai
Liste des actions
sinon retourner faux
retourner resultat
Fin si
Fin
Fin
Langage C Exemple
int pair (int a)
type Nom (paramètres formels)
{if (a%2==0)
{ Déclaration des variables locales;
return 1;
actions;
else
return resultat; }
return 0;}
Procédures et fonctions :Types des
paramètres formels
• Paramètres données (in): ils ne changent pas de
valeur dans le sous programme. Leurs valeurs sont
plutôt utilisées.

• Paramètres résultats (out): ils n’ont une signification


qu’après l’exécution du sous programme.

• Paramètres données / résultats (in/out): ils ont une


valeur avant l’exécution du sous programme et qui peut
changer après l’exécution.
Procédures et fonctions :Mode de
passage des paramètres
• Passage par valeur : (paramètres données) le paramètre
formel représente une variable locale au sous programme
et tout changement n’a pas d’effet sur le paramètre
effectif.

• Passage par adresse : (paramètres données/résultats ou


paramètres résultats) le principe consiste à associer aux
paramètres formels l’adresse des paramètres effectifs.
Toute modification apportée aux paramètres formels
affecte les paramètres effectifs. Les paramètres passés par
adresse sont précédés du mot clé Var.
Procédures et fonctions :Mode de
passage des paramètres
Par valeur Par adresse
fonction fact (x :entier) : entier procédure fact (x :entier, var f: entier)
f , i : entier i : entier
Début Début
F← 1 f←1
pour i de 2 à x faire pour i de 2 à x faire
f←f*i f←f*i
fin pour fin pour
retourner f retourner f
Fin Fin
Procédures et fonctions :Mode de
passage des paramètresPar valeur Par adresse
void main() void fact (int x, int * R)
{int n, R; {int i,f;
printf("Saisir un entier"); f = 1;
scanf("%d",& n); for(i=2; i<=x; i++)
fact(n, &R); f = f * i;
printf(" %d! = %d", n, R); *R=f;}
}
La récursivité
• La récursivité est analogique aux traitements itératifs
• La récursivité se base sur 2 éléments:
• La condition d’arrêt : contenant les cas particuliers et les
arrêts de traitement itératif
• L’appel récursif :La fonction s’appelle elle-même.
Exemple
int factR (int x)
{if (x==0 || x==1) Condition d’arrêt
return 1 ;
else
return x * factR(x-1); Appel récursif
}
Les chaînes de
caractères
Déclaration
• Déclaration
Algo : Nom_variable : chaîne
Langage C : char nom_variable[taille];
Exemple : Char nom[20];

• Mémorisation
Le nom d'une chaîne est le représentant de l'adresse du premier
caractère de la chaîne. Pour mémoriser une variable qui doit être capable
de contenir un texte de N caractères, nous avons besoin de N+1 octets en
mémoire:
char TXT[10] = "BONJOUR !";
Chaînes constantes
• 'x' est un caractère constant, qui a une valeur numérique:
'x' a la valeur 120 dans le code ASCII.

• "x" est un tableau de caractères qui contient deux caractères:


la lettre 'x' et le caractère NUL: '\0'

• char CHAINE[] = {'S','a','l','u','t','\0'};


• char CHAINE[] = "Salut";
• char CHAINE[6] = "Salut";

• char CHAINE[5] = "Salut";  Erreur lors de l’éxécution


• char CHAINE[4] = "Salut";  Erreur lors de la compilation
Précédence
• La précédence des caractères dans l'alphabet d'une machine est dépendante
du code de caractères utilisé. Pour le code ASCII, nous pouvons constater l'ordre
suivant:
. . . ,0,1,2, ... ,9, . . . ,A,B,C, ... ,Z, . . . ,a,b,c, ... ,z, . . .
'0' est inférieur à 'Z' et noter '0' < 'Z'

• La comparaison se fait lettre par lettre sachant que La chaîne vide "" précède
toutes les autres chaînes et le caractère vide '' précède tous les autres
caractères.

• Il est facile, de convertir des lettres majuscules dans des minuscules:


if (C>='A' && C<='Z') C = C-'A'+'a';
if (C>='a' && C<='z') C = C-'a'+'A';
Conversion
• Chaîne --> Nombre
Le symbole <s> est une chaîne de caractères

• Conversion de chaînes de caractères en nombres


atoi(<s>) retourne la valeur numérique représentée par <s> comme int
atol(<s>) retourne la valeur numérique représentée par <s> comme long
atof(<s>) retourne la valeur numérique représentée par <s> comme
double

• Conversion de nombres en chaînes de caractères


itoa (<n_int>, <s>, <b>)
#include <string.h>
• <n> représente un nombre du type int. Les symboles <s> et <t> peuvent être remplacés par
:
• une chaîne de caractères constante
• le nom d'une variable déclarée comme tableau de char
• un pointeur sur char

• strlen(<s>) fournit la longueur de la chaîne sans compter le '\0' final


• strcpy(<s>, <t>) copie <t> vers <s>
• strcat(<s>, <t>) ajoute <t> à la fin de <s>
• strcmp(<s>, <t>) compare <s> et <t> et fournit un résultat:
• négatif si <s> précède <t>
• zéro si <s> est égal à <t>
• positif si <s> suit <t>
• strncpy(<s>, <t>, <n>) copie au plus <n> caractères de <t> vers <s>
• strncat(<s>, <t>, <n>) ajoute au plus <n> caractères de <t> à la fin de <s>
• strstr((<s>, <t>) recherche <t> dans <s>
#include <ctype.h>
La fonction: retourne une valeur différente de zéro,
• isupper(<c>) si <c> est une majuscule ('A'...'Z')
• islower(<c>) si <c> est une minuscule ('a'...'z')
• isdigit(<c>) si <c> est un chiffre décimal ('0'...'9')
• isalpha(<c>) si islower(<c>) ou isupper(<c>)
• isalnum(<c>) si isalpha(<c>) ou isdigit(<c>)
• isxdigit(<c>) si <c> est un chiffre hexadécimal ('0'...'9' ou 'A'...'F' ou 'a'...'f’)

• isspace(<c>) si <c> est un signe d'espacement (' ', '\t', '\n', '\r', '\f’)
• tolower(<c>) retourne <c> converti en minuscule si <c> est une majuscule
• toupper(<c>) retourne <c> converti en majuscule si <c> est une
minuscule
Tableaux de chaînes de caractères
• Déclaration
char tableau_chaine[taille_tableau][taille_chaine];

• Exemple
char JOUR[7][9];
char JOUR[7][9]= {"lundi", "mardi", "mercredi", "jeudi",
"vendredi", "samedi", "dimanche"};
int i = 2;
printf("Aujourd'hui, c'est %s !\n", JOUR[i]);
Application
Lesquelles des chaînes suivantes sont initialisées correctement ? Corrigez les
déclarations fausses et indiquez pour chaque chaîne de caractères le nombre
d'octets qui sera réservé en mémoire.
a) char a[] = "un\ndeux\ntrois\n";
b) char b[12] = "un deux trois";
c) char c[] = 'abcdefg';
d) char d[10] = 'x';
e) char e[5] = "cinq";
f) char f[] = "Cette " "phrase" "est coupée";
g) char g[2] = {'a', '\0'};
h) char h[4] = {'a', 'b', 'c'};
i) char i[4] = "'o'";

Vous aimerez peut-être aussi