Cours - Introduction au C

Introduction

Contenu

Cours et Exercices (TD: Sur papier, TP : Sur machine).

Séance Objectifs
S1-1 Cours-TD : Introduction au C
S1-2 TP : Prise en main et premier programme
S1-3 Cours-TD : Structures de contrôle (Conditions et Boucles)
S1-4 TP : Le jeu du plus ou moins
S1-5 Cours-TD : Les Tableaux
S1-6 Devoir surveillé
S1-7 Cours-TD : Déclaration de types et Structure
S1-8 TP : Mastermind
S1-9 Cours-TD : Lire et écrire dans des fichiers
S1-10 TP : Sujet à définir
S1-11 Cours-TD : Manipulation de types avancées
S1-12 TP : Sujet à définir

Notation

  1. Devoir surveillé au milieu de semestre (Séance 6) - 50% de la note
  2. Examen de fin de semestre - 50% de la note

Langage de programmation : C

Avantages

  • Très rapide
  • Fortement typé, évite donc des erreurs
  • Portable (marche sur tous les systèmes d’exploitation)
  • Très utilisé

Inconvénients

  • Langage bas niveau (difficile à lire)
  • Gestion de la mémoire manuelle
  • Ne possède pas les fonctions pratiques : longueur d’une chaîne de caractère, comparaison, etc. Il faut, soit utiliser des bibliothèques, soit les développer soi-même.

Un premier programme

Un simple Hello World !

main.c

#include <stdio.h>
#include <stdlib.h>
/* ceci est un commentaire */
int main(int argc, char *argv[]) {
    printf("Hello World !\n");
    return 0; // Valeur de retour : 0 = EXIT_SUCCESS
}

Pas de panique, on va détailler ligne par ligne ce programme !

Les directives préprocesseur

Les directives préprocesseurs sont faciles à reconnaitre, elle commencent par le symbole #. Ce sont des lignes qui donnent des instructions à la compilation pour la bonne exécution du programme.

Ligne 1 et 2

 #include <stdio.h> 
 #include <stdlib.h>

La directive #include sert à inclure des fichiers au programme. Ici on inclut deux bibliothèques : stdio (standard input output) et stdlib (standard library).

Ces deux bibliothèques permettent d’accéder à un ensemble de fonctions très pratique, et en particulier de gérer les entrées/sorties, notamment afficher et écrire du texte.

La fonction principale : main

Tout programme C doit avoir une fonction principale: la fonction main. C’est la toute première fonction qui sera appelée au début du programme et qui devra gérer tout le reste.

Ligne 4

int main(int argc, char *argv[]) { ... }

Cela ressemble un peu à la déclaration d’une fonction python, mais avec des petites différences:

  • À la place de def vous avez le type de retour de la fonction (ici un entier : int)
  • Ensuite le nom de la fonction : la fonction principale DOIT s’appeler main

  • Les paramètres de la fonction entre parenthèses : la fonction principale en a 2, nous ne les détaillerons pas ici. Sachez qu’on peut écrire aussi tout simplement int main() { ...} si l’on a pas besoin de ces paramètres.
  • L’indentation pour le bloc d’instruction n’est pas obligatoire (mais fortement conseillée), un bloc d’instructions est encadré par { }

Afficher du texte : prinft

À l’intérieur de la fonction main, on exécute des instructions. ATTENTION: Chaque instruction doit se terminer par un ; sinon le compilateur va vous insulter !

Ligne 5

 printf("Hello World!\n");

Cela ressemble très fortement à ce que vous avez vu en python avec la fonction print de python, sauf qu’ici on doit mettre un ; à la fin de la fonction.

La valeur de retour

Enfin, la dernière instruction, c’est la valeur de retour de la fonction principale. Comme en Python, cela se fait avec le mot-clé return et comme il s’agit d’une instruction, on oublie pas le ;

Ligne 6

 return 0;

Pourquoi renvoyer le nombre 0 ? Il s’agit d’un code respectant la norme des programmes C (Norme POSIX). 0 correspond au code EXIT_SUCCESS c’est-à-dire que tout s’est bien passé. À l’inverse, 1 correspond au code EXIT_FAILURE qui indique qu’une erreur est survenue.

Les commentaires

En C, on distingue deux sortes de commentaires :

Commentaires multilignes

/* Je suis un 
commentaire sur plusieurs
lignes */

Commentaires sur une ligne

// Un commentaire, comme le # en python

Compilation et exécution

Une des particularités du C, est qu’il s’agit d’un langage compilé à l’inverse de Python qui est un langage interprété.

  • Un langage interprété utilise un interpréteur pour lire et exécuter du code.
  • Un langage compilé utilise un compilateur pour traduire le code d’un langage en code machine. Cela fournit un exécutable qui peut être lancé sur toutes les machines sans avoir besoin d’installer tous les prérequis du langage.

De plus, généralement, un langage compilé est beaucoup plus rapide qu’un langage interprété, car tout le code est lu et traduit en langage machine avant toute exécution, à l’inverse du langage interprété qui listet traduit pendant exécution, ce qui ralentit le programme. (Cela n’est plus aussi vrai de nos jours, mais cela l’a été pendant longtemps).

Les variables

Contrairement au Python, où les variables sont caractérisées uniquement par un nom et une valeur, ici en C, on a besoin de spécifier en plus son type.

Syntaxe des variables

 int age = 28;

Note: Une déclaration de variable se termine aussi par un ;

Les types des variables

On a vu comment déclarer un entier, voici d’autres types possibles :

Type Valeur
char Entier de -127 à 127
int Entier de -32 768 à 32 767
long Entier de -2 147 483 648 à 2 147 483 647
float Nombre flottant de -1 * 10^37 et 1 * 10^37
double Nombre flottant de -1 * 10 ^37 et 1 * 10^37

De plus, chacun des types existe en version non signée, il suffit de rajouter le mot-clé unsigned. Par exemple, le type unsigned char peut avoir une valeur comprise entre 0 et 255. (Pas de valeur négative, et une valeur maximale deux fois plus grande).

Les opérations avec les variables

Toutes les opérations que vous avez vues avec Python fonctionnent aussi en C.

Les opérations

int i = 28;
i = i + 10; // i = 38
i++; // incrémentation de 1, i = 39
i--; // décrémentation de 1, i = 38
i += 10; // équivalent à i = i + 10, i = 48
i /= 2; // équivalent à i = i / 2, i = 24

Afficher la valeur d’une variable

En C, c’est un peu plus difficile qu’en Python d’afficher la valeur d’une variable. On doit utiliser la fonction printf d’une façon un peu particulière…

Code

int nbVie = 3;
printf("Vous avez %d vies", nbVie);

Résultat

Vous avez 3 vies

%d est un symbole spécial indiquant mettre la valeur d'une variable de type int, ensuite après la chaîne de caractère, on ajoute un paramètre supplémentaire, la variable à afficher


Il est bien entendu possible de faire la même chose avec plusieurs variables d’un coup :

Code

int nbVie = 3;
int pieces = 300;
printf("Vous avez %d vies et %d pieces", nbVie, pieces);

Résultat

Vous avez 3 vies et 300 pieces

Notez que les symboles spéciaux seront remplacés par les variables dans le même ordre que celui des paramètres.


%d n’est pas le seul caractère spécial, il en existe plusieurs en fonction du type attendu, en voici quelques-uns qui sont à connaître !

Format Type
%d int
%ld long
%f float ou double

Il existe d’autres symboles, notamment pour les chaînes de caractères, mais nous verrons cela plus tard…

Saisir la valeur d’une variable

Ce n’est pas beaucoup plus compliqué que l’affichage, il faut cette fois utiliser la fonction scanf

Code

int age;
printf("Quel age avez-vous ? ");
scanf("%d", &age);
printf("Vous avez %d ans.",age);

Résultat

Quel age avez-vous ? 28
Vous avez 28 ans.

Tout comme pour le printf, on spécifie le type attendu avec le caractère spécial, suivi de la variable dans laquelle on veut stocker la valeur. Attention, la variable doit être précédée du symbole &.


Attention, pour l’utilisation des symboles spéciaux, une distinction est faite ici entre float et double :

Format Type
%d int
%ld long
%f float
%lf double

Les fonctions

Schéma d’une fonction

Vous avez déjà eu l’exemple avec la fonction main, mais de façon plus générale, une fonction est définie de la façon suivante :

Schéma d’une fonction

 type nomFonction(parametres) {     
    // Vos instructions 
 }
  • type : correspond au type de retour de la fonction. Par exemple un int si elle retourne un entier. Une fonction peut ne rien renvoyer, dans ce cas, le type est void (vide).
  • Le reste, c’est comme en python. À la différence que le type des paramètres doivent être spécifiés.

De plus, vos fonctions DOIVENT (pour le moment) être placées AVANT votre fonction main, sinon, votre code ne fonctionnera pas.

Exemples simples

Aire d’un rectangle

int aireRectangle(int l, int L) {
    return l * L;
}

Dire bonjour

void bonjour() {
    printf("Bonjour");
}