Le langage de Programmation C
Généralités
1. Structure d’un programme en langage C
Voici un exemple simple de programme en C
#include<stdio.h>
main()
{
printf(« Bonjour tout le monde \n ») ;
}
• Une entête de fonction. Une fonction imposée main() qui est exécutée au
lancement du programme. Cette ligne est obligatoire en C, elle définit le
« point d’entrée » du programme, c'est-à-dire l’endroit où débutera l’exécution
du programme.
• Un bloc d’instructions, délimité par des accolades {}. Chaque instruction se
termine par un point virgule « ; ».
• Des commentaires sont placés entre /* et */ (facultatifs)
On utilise les abréviations short et long pour désigner respectivement un short int et un long int.
Le type int désigne selon les compilateurs soit un short soit un long. On peut également
spécifier explicitement qu’un type est signé en ajoutant signed (unsigned pour dire non signé).
• Constante (const)
Const est un qualificateur de type. On peut initialiser un identificateur const, mais on ne peut rien
lui affecter par la suite. La variable se comporte dès lors comme une constante typée. La variable
est placée en mémoire morte. Ex : cons tint n=29 ;
• Réel (float)
float 4 octets Simple précision 1.18 E+/-38
double 8 octets Double précision 6.46 E -308 …1.8 E 308
long double 10 octets
• Caractère (char)
Un caractère est représenté en machine par un entier, ainsi ‘c’ désigne la valeur entière du
caractère dans la table ASCII.
char 1 octets -128 … 127
unsigned char 1 octets 0 … 255
1
int est facultatif dans ces déclarations
4. Opérateurs et expressions
4.1 Opérateurs d’affectation
En langage C, l’affectation = est un opérateur et on peut l’utiliser dans les expressions.
4.2 Opérateurs arithmétiques
+,-,*,/, % (reste de la division entière)
Exemple :
+=;-=;*=;/=
Exemple :
i + =2 ; est équivalent à i = i + 2 ;
Exemple :
Exemple :
putchar(c ) /* permet d’afficher le caractère lu dans la variable c */
Remarque :
Exemple :
gets(ch)
Remarque :
Exemple :
puts(ch ) /* permet d’afficher la chaîne de caractères stockée dans la variable ch */
Remarque :
2
Si instruction est composée d’un bloc d’instructions il faut alors les délimiter par {et }
If (expression1)
Instruction1 ;
else
if (expression 2)
Instruction2 ;
else
if (expression 3)
Instruction3 ;
….
else
if (expression N)
Instruction N ;
else
Instruction N+1 ;
switch (expression)
{
case valeur 1 : { instructions 1;
break ;}
case valeur 2 : { instructions 2;
break ;}
……
case valeur N : { instructions N;
break ;}
default : {instructions ;}
}
Remarques :
- Expression est une variable de type entier ou caractère
- Valeur ne peut en aucun cas être une variable
- L’étiquette « default » est facultative et l’instruction correspondante à elle-ci est
exécutée lorsque aucun branchement n’a été effectué.
- On peut rattacher plusieurs cas à une même instruction comme suit :
switch (expression)
{
case valeur 1 :
case valeur 2 :
case valeur 3 : { instructions1;
break ;}
case valeur 4 :
case valeur 5 :
case valeur 6 : { instructions2;
break ;}
default : {instructions ;}
}
- Do … while
do
{ instructions ; }
while (expression) ;
- return [expression]
Exécute une sortie d’une fonction en rendant le contrôle à la fonction appelante, tout en
retournant la valeur d’une expression si la fonction appelée l’autorise (≠ void).
Les
Les tableaux (unidimensionnels et bidimensionnels) et les chaînes de
caractères
1. Les tableaux
Un tableau est un type structuré homogène3.
Chaque élément du tableau est repéré par un indice précisant sa position au sein de l’ensemble.
1.1 Les tableaux unidimensionnels :
Déclaration
Remarques :
Syntaxe : nom_tableau[numero_case]
Initialisation
On peut initialiser un tableau lors de sa déclaration :
float tab[5] = { 1, 2, 3, 4, 5} ; /* init. de tous les éléments de tab */
float toto[10] = {2, 4, 6} ; /* equ. à toto[0]=2 ; toto[1]=4 ; toto[2]=6 ; */
/* les autres éléments de toto sont mis à 0. */
3
Toutes les données sont de même type
- Déclaration
On peut imaginer le tableau sous la forme d'un rectangle avec taille_dim1 qui représente le
nombre de lignes et taille_dim2 qui représente le nombre de colonnes.
Syntaxe : nom_tableau[numero_case_dim1][numero_case_dim2]
syntaxe :
type nom_tableau[N][P] = {val1, val2, ..., valN+P} ;
ou
type nom_tableau[N][P] = { {valN1_1, valN1_2, ..., valN1_P}, {valN2_1, valN2_2, ...,
valN2_P} ..., {valN_1, valN_2, ..., valN_P}} ;
Exemple : Mat[2][3]={{1,2,3},{4,5,6}}.
Ou encore Mat[2][3]={1,2,3,4,5,6}
- Initialisation :
Char Nom[20]={‘M’,’O’,’H’,’A’,’M’,’E’,’D’,’\0’} ;
Ou encore :
Char Nom[20]= « Mohamed » ;
Ex : scanf(« %s »,Nom) ;
gets : permet de lire une chaîne de caractères.
Syntaxe : gets(var_chaine) ;
Ex : gets(Nom)
Remarque :
Remarque :
Syntaxe : putchar(var_caractère) ;
Syntaxe : Nom_chaine[indice]
Exercice 1:
Ecrire un programme qui lit une ligne de texte (ne dépassant pas 200 caractères), la mémorise
dans une variable TXT et affiche ensuite :
1. la longueur L de la chaîne. Utilisez une boucle FOR. (NB : n’utilisez pas la fonction
prédéfinie strlen.)
2. le nombre de ‘e’ contenus dans le texte
3. toute la phrase à rebours, sans changer le contenu de la variable TXT
4. toute la phrase à rebours, après avoir inversé l’ordre des caractères dans TXT.
Ex : voici une petite phrase !
! esarhp etitep enu iciov
Exercice 2 :
Ecrire un programme C qui lit deux chaînes de caractères CH1 et CH2 et qui copie la
première moitié de CH1 et la première moitié de CH2 dans une troisième chaîne CH3.
Afficher le résultat.
a) Utilisez les fonctions spéciales de <string.h>
b) Utilisez uniquement gets et puts.
- Déclaration
int a ;
int *p ;
a=10 ;
p=&a ; // p pointe maintenant sur la variable a
*p=150 ;
printf (« la valeur de a=%d\n » ;a) ; // a=150 ;
a+=10;
printf(“a=%d ; *p=%d\n”;a,*p); // a = 160 ; *p= 160
*p+=40;
printf(“a=%d ; *p=%d\n”;a,*p); // a = 200 ; *p= 200
tab ≅ &tab[0]
tab+1 ≅ &tab[1]
tab+i ≅&tab[i]
par contre :
tab[i] ≅ *(tab+i)
Exemple :
Le programme ci-dessous permet de lire 10 nombres entiers dans un
tableau et de chercher la valeur maximale et minimale. Modifiez ce
programme en utilisant le formalise pointeur.
for(i=1;i<Nbre;i++)
{ if (T[i]>max) // if (*(T+i) > max)
max=T[i]; // max = *(T+i);
If (T[i]<min) // if (*(T+i) < min)
min=T[i]; // min = *(T+i);
}
printf (“La valeur maximale est %d\n”,max);
printf (“La valeur minimale est %d\n”,min);
En résumé : P:
int A[10] ; •
int *P ;
ainsi, après l’instruction
P=A ;
Le pointeur P pointe sur A[0], et A: ………..
*(P+1) Désigne le contenu de A[1]
*(P+2) Désigne le contenu de A[2]
….
*(P+i) Désigne le contenu de A[i]
main()
{
int A = 1;
int B = 2;
int C = 3;
int *P1, *P2;
P1=&A;
P2=&C;
*P1=(*P2)++;
P1=P2;
P2=&B;
*P1-=*P2;
++*P2;
*P1*=*P2;
A=++*P2**P1;
2. Les fonctions
Exemple :
- Déclaration
Ou :
Type_Résultat_Retour NomFonction (NomPar1 , NomPar2 , . . . )
TypePar1 NomPar1 , TypePar2 NomPar2 ,… ;
{
Déclarations locales;
Instructions;
}
Exemple :
Ex 1: Ex 2:
int somme carre (int i ,int j ) int somme carre (i,j)
{ int i , int j ;
int resultat ; // déclaration locale {
resultat = i * i + j* j ; int resultat;
return ( resultat) ; resultat = i * i + j* j ;
} return ( resultat ) ;
}
Remarques :
- Si une fonction ne fournit pas de résultat, il faut indiquer void (vide)
comme type du résultat.
- Si une fonction n’a pas de paramètres, on peut déclarer la liste des
paramètres comme (void) ou simplement comme ().
• Prototype :
Un prototype de fonction permet au compilateur de savoir ce que la fonction attend en
paramètre, et le type de ce qu’elle retournera, même si le code correspondant à la fonction est
écrit ailleurs, ou plus loin dans le fichier source.
Le prototype d’une fonction reprend exactement l’en-tête de la fonction, mais pas son corps, qui
est remplacé par un point-virgule.
Dans l’écriture d’un prototype de fonction, les noms de paramètres sont optionnels :
Exemple :
void fonction1(void) ;
void fonction2(int A,int B) ;
int fonction3 (int,int) ;
Exemple :
int fonction_carre(int a)
{ // cette fonction calcule le carré du nombre qui lui est passé en paramètre
int resultat = a*a ;
return resultat ;
}
Exemple :
Ecrire un programme C qui permet d’additionner deux nombres a et b et d’afficher le résultat.
Utiliser deux fonctions :
int addition(int a,int b)
void affichage(int c);
main()
{
int a,b,c ;
scanf(« %d %d »,&a,&b) ;
c=addition(a,b) ;
affichage(c);
}
int addition(x,y)
int x,y ;
{
return(x+y) ;
}
void affichage (int z)
{
printf (« Résultat = %d\n »,z) ;
}
#include<stdio.h>
void echange(int a, int b) ;
main()
{int a=10;
int b=20;
printf(“Avant : a = %d ; b = %d\n”,a,b);
echange(a,b);
printf(“Après : a = %d ; b = %d\n”,a,b);
}
void echange(int a, int b)
{
int temp ;
printf(« Début : a = %d ; b = %d\n”,a,b);
temp=a ;
a=b ;
b=temp ;
printf(« Fin : a = %d ; b = %d\n”,a,b);
Crée par : }F. CHAKER KHARRAT Algorithmique et Programmation C
Exécution :
Avant : a = 10 ; b = 20 ;
Début : a = 10 ; b = 20 ;
Fin : a =20 ; b = 10 ;
Après : a = 10 ; b =20 ;
Remarque : Une variable locale est détruite lorsqu’on quitte la fonction dans laquelle elle
est déclarée
- Passage des paramètres par adresse
Le passage des paramètres par valeur empêche la fonction de modifier les variables appartenant à
la portion du code appelante. Les pointeurs permettent de résoudre ce problème en passant en
argument des pointeurs sur les valeurs à modifier : on parle de passage par adresse. En effet, les
arguments de type pointeurs permettent d’accéder aux objets de la fonction appelante et de les
modifier.
Exemple :
#include<stdio.h>
void echange(int *, int *) ; // prototype
main()
{int a=10;
int b=20;
printf(“Avant : a = %d ; b = %d\n”,a,b);
echange(&a,&b);
printf(“Après : a = %d ; b = %d\n”,a,b);
}
void echange(int *pa, int *pb)
{
int temp ;
printf(« Début : *pa = %d ; *pb = %d\n”,*pa,*pb);
temp=*a ;
*a=*b ;
*b=temp ;
printf(« Fin : *pa = %d ; *pb = %d\n”,*pa,*pb);
}
Remarques :
Lors du passage par adresse, la déclaration du prototype de la fonction se fait
comme suit :
Dans une fonction on ne peut faire passer que les types de base (int, char,
float, short, etc.) même chose pour les valeurs de retour des fonctions. Pour pouvoir manipuler
les tableaux dans les fonctions nous utilisons le passage par adresse.
Exemple :
Exercice :
Écrire une fonction int compter_occurrences(char car,int taille,char *mot) qui retourne le
nombre d'occurrences d’un caractère dans un mot de longueur « taille ». Utilisez cette fonction
dans le main afin de compter et d’afficher le nombre d’occurrence de caque lettre composant le
mot lu
Solution:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
return compteur;
}
int main(void)
{
int taille; // taille du mot
int i;
int nboccur; // nb d'occurrences de la lettre
char texte[125];
taille = strlen(texte);
return 0;
}