Académique Documents
Professionnel Documents
Culture Documents
INTRODUCTION AU LANGAGE C
I - Historique
L'histoire du langage C est intimement liée à celle du système d'exploitation UNIX. En
1969, Ken Thompson, qui travaillait pour Bell Laboratories, mit au point un système
d'exploitation denommé d'Unics (Uniplexed Information and Computing System) qui
ne tarda pas à être définitivement changé en UNIX.
La popularité du langage C est telle que son style et sa syntaxe ont influencé de
nombreux langages :
II - Les avantages du C :
• La portabilité : Un programme développé en C sur une machine donnée peut
être porté sur d'autres machines sans le modifier.
• Une grande bibliothèque de fonctions: Le C dispose d'un grand nombre de
fonctions, que ce soit des fonctions mathématiques, de gestion de fichiers ou
d'entrées / sorties.
• Proche de la machine: Le C est très proche de la machine en pouvant accéder
aux adresses des variables.
Chaque fichier objet est incomplet, insuffisant pour être exécuté, car il contient des appels de
fonctions ou des références à des variables qui ne sont pas définies dans le même fichier. Par
exemple, les programmes que vous écrirez contiennent des fonctions comme printf que vous
n'aurez certainement pas écrite vous-même. L'édition de liens est l'opération par laquelle
plusieurs fichiers objets sont mis ensemble pour se compléter mutuellement : un fichier apporte
des définitions de fonctions et de variables auxquelles un autre fichier fait référence et
réciproquement.
L'éditeur de liens (ou linker ) prend en entrée plusieurs fichiers objets et bibliothèques (une
variété particulière de fichiers objets) et produit un unique fichier exécutable. L'éditeur de liens
est largement indépendant du langage de programmation utilisé pour écrire les fichiers
sources, qui peuvent même avoir été écrits dans des langages différents.
Chaque fichier source entrant dans la composition d'un programme exécutable est fait d'une
succession d'un nombre quelconque d'éléments indépendants, qui sont :
•
En C on n'a pas une structure syntaxique englobant tout, comme la construction « Program
... end. » du langage Pascal ; un programme n'est qu'une collection de fonctions assortie d'un
ensemble de variables globales. D'où la question : par ou l'exécution doit-elle commencer ?
La règle généralement suivie par l'éditeur de liens est la suivante : parmi les fonctions données
il doit en exister une dont le nom est main. C'est par elle que l'exécution commencera ; le
lancement du programme équivaut à l'appel de cette fonction par le système d'exploitation.
Notez bien que, à part cela, main est une fonction comme les autres, sans aucune autre
propriété spécifique ; en particulier, les variables internes à main sont locales, tout comme
celles des autres fonctions.
• Règles de bases:
En Langage C, il est souvent nécessaire d'inclure des fichiers dit d'en-tête
(HEADER:*.H) contenant la déclaration de variables, constantes ou de
procédures élémentaires. Le fichier à inclure se trouve en général dans le
répertoire des fichiers d'en-têtes (Include ) alors on écrira:
#Include <Nom_du_fichier.H>.
Si le fichier se trouve dans le répertoire courant, on écrira:
#Include "Nom_du_fichier.H"
• Toutes instructions ou actions se terminent par un point-virgule ;
• Une ligne de commentaires doit commencer par /* et se terminer par */.
• Un bloc d'instructions commence par { et se termine par }.
• Le langage C est sensible à la « casse » : les mots du langage doivent être
écrits en minuscules ; les noms de variables, constantes, fonctions doivent
toujours être écrits de la même façon : Ma_Fonction ≠ ma_fonction ≠
MA_FONCTION.
Remarque: Lors de l'affectation des variables si on met 0 avant la valeur, elle sera en
Octal et si on met 0x devant une valeur elle sera hexadécimale.
Exemple :
#include <stdio.h>
main()
{
/* Déclaration d'une variable locale */
int i;
i=1; /* Initialisation de i */
printf("%d",i); /* Affichage de i */
}
Dans l'exemple ci-dessus la variable i est locale au bloc main. La valeur de i
n’est accessible
que dans le bloc main.
#include <stdio.h>
main()
{
{ /* Début de bloc */
int i; /* Déclaration d'une variable locale i*/
i=1; /* Initialisation de i */
printf("i = %d\n",i); /* Affichage de i */
/* \n provoque un retour à la ligne */
} /* Fin du bloc */
printf("i = %d\n",i); /* Affichage de i */
}
Si vous tapez l'exemple ci-dessus, le compilateur va refuser d'exécuter le
programme car la
variable locale i existe seulement dans le bloc où elle a été créée.
Codes d'affichage:
Exemple :
#include <stdio.h>
int i; /* Déclaration de variable globale */
main()
{
i=23; /* Initialisation de i */
printf(" i(dec) = %d\n",i); /* Affichage de i en décimal */
printf(" i(octal) =%o\n",i); /* Affichage de i en octal */
printf(" i(hex)= %x\n",i); /* Affichage de i en Hexadécimal */
}
On peut aussi mettre des codes de contrôles :
Exemple :
#include <stdio.h>
main()
{
printf("Salut je suis:\n\t Le roi \n\t\t A bientôt\a");
}
On peut aussi définir le type d'affichage des variables pour les nombres signés ou
flottants en rajoutant des caractères de remplissage.
• Un caractère de remplissage '0' au lieu de ' ' pour les numériques.
• Un caractère de remplissage '-' qui permet de justifier à gauche l'affichage sur la
taille minimale (défaut à droite).
• Un caractère de remplissage '+' qui permet de forcer l'affichage du signe.
• Un nombre qui précise le nombre de caractères qui doit être affiché suivi d'un point
et d'un nombre précisant combien de chiffres après la virgule doivent être affichés.
Syntaxe:
<Nb caractères affichés>.<Nombre de chiffres significatifs>
Exemple:
#include <stdio.h>
float i;
main()
{
i=15.6;
/* Affichage de i normal */
printf("%f\n",i);
/* Affichage de i avec 10 caractères */
printf("%10f\n",i);
/* Affichage de i avec 10 caractères
et 2 chiffres après la virgule */
printf("%10.2f\n",i);
/* Affichage de i avec 10 caractères
et 2 chiffres après la virgule
et à gauche */
printf("%-10.2f\n",i);
/* Affichage de i avec 10 caractères
et 2 chiffres après la virgule
et à gauche
avec l'affichage du signe */
printf("%+-10.2f\n",i);
/* Affichage de i avec 10 caractères
et 2 chiffres après la virgule
avec des zéros avant le valeur */
printf("%010.2f\n",i);
}
putchar('\n');
}
• Puts
Puts: Elle permet d'afficher une chaîne de caractères à l'écran.
Syntaxe:
puts(identificateur de chaîne de caractères);
Exemple:
#include <stdio.h>
#include <string.h>
/* Déclaration et Initialisation de message1 */
char message1[10]="Bonjour";
/* Déclaration de message2 */
char message2[10];
main()
{
/* Initialisation de message2 */
strcpy(message2,"Monsieur");
/* Affichage du message1 */
puts(message1);
/* Affichage du message2 */
puts(message2);
}
Exemple
La bibliothèque mathématique
En langage C, il existe ce qu'on appelle des bibliothèques "standard", c'est-à-dire des
bibliothèques toujours utilisables. Ce sont en quelque sorte des bibliothèques "de
base" qu'on utilise très souvent.
La bibliothèque mathématique contient de nombreuses autres fonctions dont vous
aurez très probablement besoin.
Pour pouvoir utiliser les fonctions de la bibliothèque mathématique, il est
indispensable de mettre la directive de
préprocesseur suivante en haut de votre programme :
#include <math.h>
Fabs
Cette fonction retourne la valeur absolue d'un nombre.
ceil
Cette fonction renvoie le premier nombre entier après le nombre décimal qu'on lui
donne.
C'est une sorte d'arrondi. On arrondit en fait toujours au nombre entier supérieur.
Par exemple, si on lui donne 26.512, la fonction renvoie 27.
floor
C'est l'inverse de la fonction précédente, cette fois elle renvoie le nombre
directement en dessous.
Si vous lui donnez 37.91, la fonction floor vous renverra donc 37
pow
Cette fonction permet de calculer la puissance d'un nombre. Vous devez lui indiquer
2 valeurs : le nombre, et la
puissance à laquelle vous voulez l'élever. Voici le schéma de la fonction :
pow(nombre, puissance);
Code : C
double resultat = 0, nombre = 2;
resultat = pow(nombre, 3); // resultat vaudra 2^3 = 8
sqrt
Cette fonction calcule la racine carrée d'un nombre. Elle renvoie un double.
Code : C
double resultat = 0, nombre = 100;
resultat = sqrt(nombre); // resultat vaudra 10
Log
Cette fonction calcule le logarithme népérien d'un nombre (que l'on note aussi "ln")
log10
Cette fonction calcule le logarithme base 10 d'un nombre.
VI - Opérateurs logiques
Vrai ou faux
La valeur Vrai peut être assimilée à la valeur numérique 1. En programmation C, la
valeur Vrai est associée à toute valeur non nulle.
La valeur Faux peut être assimilée à la valeur numérique 0.
L'opérateur Ou (||) correspond alors à une addition :
En logique pure, on écrira plus 1+1=1 du fait que toute valeur non nulle est
considérée comme Vrai.
L'opérateur Et (&&) correspond alors à une multiplication :
Combinaison
Toutes les opérations logiques peuvent se combiner entre elles. Il faut néanmoins
veiller aux différentes priorités des opérateurs et il faut que la condition dans sa
totalité soit entourée de ().
Les exemples suivants montrent ce qui est possible et ce qui ne l'est pas :
Opérateur modulo
L'opérateur qui donne le reste de la division entière (opérateur modulo) est noté %
en C. Ainsi, 10%2 vaut 0 car la division entière de 10 par 2 donne 5 et il n'y a pas de
reste. En revanche, 10%3 vaut 1 car la division entière de
10 par 3 donne 3 et il reste 1. Par exemple :
int z;
z=10%2;
printf("10 modulo 2=%d\n",z);
z=10%3;
printf("10 modulo 3=%d\n",z); …va nous afficher :
10 modulo 2=0
10 modulo 3=1
Nombres pseudo‐aléatoires
Voici un petit exemple de programme qui permet d'obtenir des nombres pseudo‐
aléatoires entre 0 et 99 :
#include <stdio.h>
#include <stdlib.h> // sert pour les fonctions srand et rand
#include <time.h>
int main() {
int nb_alea=0;
/* Initialisation du générateur de nombres
basée sur la date et l'heure */
srand (time (NULL));
nb_alea = rand() % 100;
printf ("Nombre aléatoire : %d\n",nb_alea);
return 0;
}
• srand (time (NULL)) permet d'initialiser le générateur de nombres pseudo‐aléatoire.
Nous reviendrons sur ce
Fonction toupper()
La fonction toupper qui transforme un caractère minuscule en majuscule. Pour
l'utiliser, il faut inclure le fichier d'en‐tête ctype.h par : ‐include <ctype.h>.
La fonction toupper s'utilise de la façon suivante :
#include <stdio.h>
#include <ctype.h>
int main () {
char car;
char car_min;
car_min = 'a';
car = toupper (car_min);
printf ("%c",car);
return 0;
}
Ce programme affichera : A
message[0]='R';
message[1]='E';
message[2]='N';
message[3]='E';
message[4]='\0'; /* Caractère de fin */
}
ou
Exemple :
int main()
{
char chaine1[] = "Texte à comparer", chaine2[] = " Texte à comparer ";
if (strcmp(chaine1, chaine2) == 0) // Si strcmp renvoie 0 (chaînes
identiques)
{
printf("Les chaines sont identiques\n");
}
else
{
printf("Les chaines sont differentes\n");
}
return 0;
}
Exemple :
int main()
{
char chaine[] = "Texte de recherche", *suiteChaine = NULL;
suiteChaine = strchr(chaine, 'd');
if (suiteChaine != NULL) // Si on a trouvé quelque chose
{
printf("Voici la fin de la chaine à partir du premier d : %s", suiteChaine);
}
return 0;
}
Par exemple, si on forme la chaîne "xds" et qu'on en fait une recherche dans "Texte
de test", la fonction renvoie un pointeur vers le premier de ces caractères qu'elle a
trouvé dedans. En l'occurrence, le premier caractère de "xds" qu'elle trouve dans
"Texte de test" est le x, donc strpbrk renverra un pointeur sur 'x'.
Prototype
char* strpbrk(const char* chaine, const char* lettresARechercher);
Test :
Exemple :
int main()
{
char *suiteChaine;
// On cherche la première occurrence de x, d ou s dans "Texte de test"
suiteChaine = strpbrk("Texte de test", "xds");
if (suiteChaine != NULL)
{
printf("Voici la fin de la chaine a partir du premier des caracteres trouves : %s",
suiteChaine);
}
return 0;
}
Cette fonction ressemble énormément au printf que vous connaissez mais, au lieu
d'écrire à l'écran, sprintf écrit dans une chaîne ! D'où son nom d'ailleurs, qui
commence par le "s" de "string" (chaîne en anglais).
C'est une fonction très pratique pour mettre en forme une chaîne.
Exemple :
#include <stdio.h>
#include <stdlib.h>
int main()
{
char chaine[100];
int age = 15;
// On écrit "Tu as 15 ans" dans chaine
sprintf(chaine, "Tu as %d ans !", age);
// On affiche chaine pour vérifier qu'elle contient bien cela :
printf("%s", chaine);
return 0;
}