Académique Documents
Professionnel Documents
Culture Documents
Intro C
Intro C
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
3 Variables 3.1 Quest ce quune variable ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Dnition dune variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Types fondamentaux 4.1 Les entiers . . . . . . . . 4.2 Les rels . . . . . . . . . 4.3 Les boolens . . . . . . 4.4 Les caractres . . . . . . 4.5 Les chanes de caractres 5 Constantes 6 Expressions 7 Instructions dentre/sorties 7.1 Opration dentre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Opration de sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Affectation
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Cours C, Semaine 1
c INPTPAD
1/26
A LGORITHMIQUE
ET PROGRAMMATION
9 Structures de contrle 9.1 Enchanement squentiel . . . . . . . . . 9.2 Instructions conditionnelles . . . . . . . . 9.2.1 Conditionnelle Si ... Alors ... 9.2.2 Conditionnelle Si ... Alors ... 9.2.3 La clause SinonSi . . . . . . . . 9.2.4 Conditionnelle Selon . . . . . . . 9.3 Instructions de rptitions . . . . . . . . . 9.3.1 Rptition TantQue . . . . . . . . 9.3.2 Rptition Rpter ... Jusqu . . 9.3.3 Rptition Pour . . . . . . . . . . 9.3.4 Quelle rptition choisir ? . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
13 13 13 13 15 16 18 19 19 22 25 26
Cours C, Semaine 1
c INPTPAD
2/26
A LGORITHMIQUE
ET PROGRAMMATION
/********************************************************************** * Auteur : Xavier Crgut <cregut@enseeiht.fr> * Version : 1.1 : Dterminer le primtre dun cercle partir de son rayon. * Titre *********************************************************************/ #include <stdio.h> #include <stdlib.h> #define PI 3.1415 int main() { double rayon; double perimetre;
/* Saisir le rayon */ printf("Rayon = "); scanf("%lf", &rayon); /* Calculer le primtre */ perimetre = 2 * PI * rayon; /* par dfinition */ /*{ perimetre == 2 * PI * rayon }*/ /* Afficher le primtre */ printf("Le primtre est : %4.2f\n", perimetre); return EXIT_SUCCESS; }
c INPTPAD
3/26
A LGORITHMIQUE
ET PROGRAMMATION
la bibliothque standard du C et donne accs des fonctions dj dnies. Par exemple les fonctions dafchage (printf) et de lecture (scanf) sont dnies dans stdio.h. La constante EXIT_SUCCESS est dnie dans stdlib.h. Si on ne met pas ces #include, on ne peut pas utiliser ces fonctions ou constantes. Le #define suivant permet de dnir la constante PI. Il correspond donc une dnition. Finalement, les dclarations et instructions sont regroupes entre les accolades qui suivent int main(), dabord les dclarations, puis les instructions. main est la fonction principale, cest-dire que cest elle qui est excute quand le programme sera lanc. Les instructions sont les mmes que cette prsentes dans lalgorithme mme si elles ont une forme un peu diffrente.
2.3 Identicateurs
Un identicateur est un mot de la forme : une lettre (y compris le soulign) suivie dun nombre quelconque de lettres et de chiffres. Attention, il nest pas possible dutiliser les lettres accentues en C.
2.4 Commentaires
Les commentaires commencent par /* et se terminent par */. Attention, les commentaires ne peuvent pas tre imbriqus. Pour reprsenter une proprit du programme, nous utiliserons / *{ ... }*/. Le langage C++ ajoute les commentaires qui commencent par // et se termine avec la n de la ligne (comme --). Ils peuvent tre utiliss la o on met -- en algorithmique.
3 Variables
3.1 Quest ce quune variable ? 3.2 Dnition dune variable
En C, on commence par mettre le type suivi du nom de la variable et un point-virgule.
double prix_unitaire; int quantite; char nom[20]; /* prix unitaire dun article (en euros) */ /* quantit darticles commands */ /* nom de larticle */
Les types et leur signication seront prsents dans la suite du cours. Il est possible de dclarer plusieurs variables du mme type en les sparant par des virgules mais ceci est dconseill sauf si le mme commentaire sapplique toutes les variables.
int a, b, c; /* trois entiers */
Cours C, Semaine 1
c INPTPAD
4/26
A LGORITHMIQUE
ET PROGRAMMATION
4 Types fondamentaux
Les oprateurs de comparaison se notent : <, >, <=, >=, == et !=. Notez bien que lgalit est note avec deux fois le caractre =.
sils sont signs ou non. Par dfaut, les entiers sont signs (positifs ou ngatif). Si lon prcise unsigned devant le type, ils ne peuvent pas tre ngatifs.
unsigned int n; unsigned short s; /* un entier non sign */ /* un entier court non sign */
Le reste de la division entire se note % et la division entire se note tous simplement /. Il faut faire attention ne pas la confondre avec la division sur les rels.
10 % 3 10 / 3 1 / 2 abs(-5) /* /* /* /* 1 3 0 5 (le reste de la division entire de (le quotient de la division entire (le quotient de la division entire (lentier est mis entre parenthses 10 par 3) */ de 10 par 3) */ de 1 par 2) */ (cf sous-programmes)) */
Notons que les dbordement de capacit sur les oprations entires ne provoquent aucune erreur lexcution... mais le rsultat calcul est bien sr faux par rapport au rsultat attendu !. Remarque : Le type char (caractre, section 4.4) fait partie des entiers.
c INPTPAD
5/26
A LGORITHMIQUE
ET PROGRAMMATION
Cependant, il existe un module standard (<stdbool.h>) qui dnit un type boolen bool avec les deux valeurs true et false. Les oprateurs logiques se notent && pour Et, || pour Ou et ! pour Non.
1 2 3
&& || !
*/ */ */
Les expressions boolennes sont values en court-circuit (on parle dvaluation partielle), cest--dire que ds que le rsultat dune expression est connu, lvaluation sarrte. Par exemple, true || expression sera value true sans calculer la valeur de expression.
Enn, si c est un caractre correspondant un chiffre (c >= 0&& c <= 9), c - 0 est la valeur entire de ce chiffre (entre 0 et 9).
5 Constantes
Les constantes sont dnies en utilisant #define :
#define #define #define #define #define PI 3.1415 /* Valeur de PI */ MAJORIT 18 /* ge correspondant la majorit */ TVA 19.6 /* Taux de TVA en vigueur au 15/09/2000 (en %) */ CAPACIT 120 /* Nombre maximum dtudiants dans une promotion */ INTITUL "Algorithmique et programmation" /* par exemple */
Attention : Ne surtout pas mettre de point-virgule ( ; ) aprs la dclaration dune constante avec #define. #define nest pas traite par le compilateur mais par le prprocesseur qui fait btement du remplacement de texte. Le point-virgule provoquera donc des erreurs l o est utilise la macro et non o elle est dnie !
Cours C, Semaine 1
c INPTPAD
6/26
A LGORITHMIQUE
ET PROGRAMMATION
6 Expressions
La priorit des oprateurs est diffrente. Voici la table des priorits de C.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2
-> . (unaires) sizeof ++ -- ~ ! + - * & (cast) * / % + << >> < <= > >= == != & ^ | && || ?: (si arithmtique) = *= /= %= += -= <<= >>= &= |= ^= , // G : associativit gauche ((a + b) + c) + d // D : associativit droite x = (y = (z = t))
a + b + c + d x = y = z = t
Le dernier exemple correspond laffectation. Solution : Pour lexercice Parenthser, on obtient donc un rsultat diffrent :
(2 + (x * 3)) (((- x) + (3 * y)) <= (10 + 3)) ((x == 0) Ou (y == 0)) -- ok si x Entier (ou Rel) -- ok si x et y entiers (ou rels) -- ok si x et y entiers (ou rels)
7 Instructions dentre/sorties
7.1 Opration dentre
On utilise scanf qui est une fonction de saisie qui fonctionne avec un format dcrivant la nature de linformation lire et donc la conversion effectuer.
1 2 3 4 5 6 7 8 9 10
char un_caractere; int un_entier; float un_reel; double un_double; scanf("%c", &un_caractere); scanf("%d", &un_entier); scanf("%f", &un_reel); scanf("%lf", &un_double); scanf("%c%d%lf", &un_caractere, &un_entier, &un_double);
Chaque % rencontr dans le format (la chane de caractres) est suivi dun caractre indiquant la nature de linformation lire (c pour caractre, d pour entier, etc.). chaque % doit c INPTPAD 7/26
Cours C, Semaine 1
A LGORITHMIQUE
ET PROGRAMMATION
correspondre une variable donne aprs le format. Les variables sont spares par des virgules et sont prcdes du signe & (voir sous-programmes). Le & indique que lon donne ladresse de la variable de qui permet scanf de changer la valeur de la variable. En faisant #include <iostream>, on peut utiliser loprateur >> :
1 2 3 4 5 6 7 8 9 10
char un_caractere; int un_entier; float un_reel; double un_double; std::cin std::cin std::cin std::cin std::cin >> >> >> >> >> un_caractere; un_entier; un_reel; un_double; un_caractere >> un_entier >> un_double;
Notons que std::cin dsigne lentre standard, le clavier par dfaut. Il ny a plus faire attention ni au format utilis, ni au nombre de variables fournies.
char un_caractere = A; int un_entier = 10; float un_reel = 3.14; double un_double = 1.10e-2; printf("%c\n", printf("%d\n", printf("%f\n", printf("%f\n", printf("2 * %d printf("c = %c un_caractere); un_entier); un_reel); un_double); = %d\n", un_entier, un_entier * 2); et nb = %f\n", un_caractere, un_double);
Notons que std::cout dsigne la sortie standard, lcran par dfaut. std::cerr dsigne la sortie en erreur (galement relie lcran par dfaut). Le programme afche alors :
1 2 3 4 5 6
Notons que lon ne met pas de & devant lexpression. En C++ : En faisant #include <iostream>, on peut utiliser loprateur << :
1 2
Cours C, Semaine 1
c INPTPAD
8/26
A LGORITHMIQUE
ET PROGRAMMATION
3 4 5 6 7 8 9 10 11 12
float un_reel = 3.14; double un_double = 1.10e-2; std::cout std::cout std::cout std::cout std::cout std::cout << << << << << << un_caractere << std::endl; un_entier << std::endl; un_reel << std::endl; un_double << std::endl; "2 * " << un_entier << " = " << un_entier * 2 << std::endl ; "c = " << un_caractere << " et nb = " << un_double << std::endl;
Remarque : Malheureusement, le scanf et le printf de C ne sont pas polymorphes et cest pour cette raison que le programmeur doit prciser le format. Les oprateurs << et >> de C++ sont, quant eux, polymorphes. Exercice 1 : Cube dun rel crire un programme qui afche le cube dun nombre rel saisi au clavier. Solution :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9
R0 : Afficher le cube dun nombre rel Tests : 0 -> 0 1 -> 1 2 -> 8 -2 -> -8 1.1 -> 1,331 R1 : Raffinage De Afficher le cube dun nombre rel | Saisir un nombre rel x: out Rel | Afficher le cube de x x: in Rel R2 : Raffinage De Afficher le cube de x | crire(x * x * x) /********************************************************************* : Xavier Crgut <cregut@enseeiht.fr> * Auteur Version : 1.2 * * Objectif : afficher le cube dun nombre rel ********************************************************************/ #include <stdio.h> #include <stdlib.h>
Cours C, Semaine 1
c INPTPAD
9/26
A LGORITHMIQUE
ET PROGRAMMATION
10 11 12 13 14 15 16 17 18 19 20 21 22
/* Saisir un nombre rel */ printf("Nombre = "); scanf("%lf", &x); /* Afficher le cube de x */ printf("Son cube est : %f\n", x * x * x); return EXIT_SUCCESS; }
8 Affectation
Laffectation se note avec un signe =. Remarque : Laffectation peut tre enchane : a = b = c = 0; consiste initialiser c, b puis a avec la valeur 0. Cest quivalent a = (b = (c = 0));. Attention : Il ne faut pas confondre = (affectation) et == (galit). Il exite des formes condenses de laffectation. Par exemple, x = x + y peut se noter x += y. Ces formes condenses fonctionnent avec la plupart des oprateurs mais elles sont viter dans le cas gnral car elles peuvent nuire la lisibilit.
x += x -= x %= x |= ... y y y y /* /* /* /* x x x x = = = = x x x x + % | y y y y */ */ */ */
Ces oprateurs peuvent tre utiliss dans des instructions (ce qui nest gnralement pas recommand). On parle de post ou de pr car il sont respectivement excuts avant et avant linstruction elle-mme. Ainsi x = ++y; est quivalent :
++y; x = y;
Cours C, Semaine 1
c INPTPAD
10/26
A LGORITHMIQUE
ET PROGRAMMATION
int x = y = z = t = u =
u;
/* x == 4, y == 7, z == 4, t == ?, u == ? */ /* x == 4, y == 6, z == 4, t == 7, u == ? */ /* x == 5, y == 5, z == 4, t == 7, u == 9 */
Exercice 2 : Permuter deux caractres crire un programme qui permute la valeur de deux variables c1 et c2 de type caractre. Solution : Le principe est dutiliser une variable intermdiaire (tout comme on utilise un rcipient intermdiaire si lon veut changer le contenu de deux bouteilles).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/********************************************************************* : Xavier Crgut <cregut@enseeiht.fr> * Auteur Version : 1.2 * * Objectif : Permuter deux caractres c1 et c2 ********************************************************************/ #include <stdio.h> #include <stdlib.h> int main() { char c1, c2; char tmp;
/* initialiser c1 et c2 */ c1 = A; c2 = Z; /* permuter c1 et c2 */ tmp = c1; c1 = c2; c2 = tmp; /* afficher pour vrifier */ printf("c1 = %c et c2 = %c\n", c1, c2); return EXIT_SUCCESS; }
Exercice 3 : Cube dun rel (avec une variable) Reprenons lexercice 1. 3.1 Utiliser une variable intermdiaire pour le rsoudre. Solution : On reprend le mme R0 et les mmes tests. En fait, seule la manire de rsoudre le problme change.
Cours C, Semaine 1
c INPTPAD
11/26
A LGORITHMIQUE
ET PROGRAMMATION
1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
R1 : Raffinage De Afficher le cube dun nombre rel | Saisir un nombre rel x: out Rel | Calculer le cube de x x: in Rel ; cube: out Rel | Afficher le cube R2 : Raffinage De Afficher le cube de x | cube <- x * x * x /********************************************************************* : Xavier Crgut <cregut@enseeiht.fr> * Auteur Version : 1.1 * * Objectif : afficher le cube dun nombre rel ********************************************************************/ #include <stdio.h> #include <stdlib.h> int main() { double x; double cube;
/* Saisir un nombre rel */ printf("Nombre = "); scanf("%lf", &x); /* Calculer le cube de x */ cube = x * x * x; /* Afficher le cube */ printf("Son cube est : %f\n", cube); return EXIT_SUCCESS; }
3.2 Quel est lintrt dutiliser une telle variable ? Solution : Lintrt dutiliser une variable intermdiaire est damliorer la lisibilit du programme car elle permet de mettre un nom sur une donne manipule. Ici on nomme cube la donne x * x * x. De plus, ceci nous a permis, au niveau du rafnage, de dcoupler le calcul du cube de son afchage. Il est toujours souhaitable de sparer calcul des oprations dentres/sorties car linterface avec lutilisateur est la partie dune application qui a le plus de risque dvoluer. 3.3 Excuter la main lalgorithme ainsi crit. Solution : faire soi-mme ! On peut galement lexcuter sous le dbogueur. La seule diffrence cest que le dbogueur nindique pas les variables qui ont une valeur indtermine.
Cours C, Semaine 1
c INPTPAD
12/26
A LGORITHMIQUE
ET PROGRAMMATION
9 Structures de contrle
9.1 Enchanement squentiel
La squence sexprime comme en algorithmique. Pour bien mettre en vidence une squence dinstructions, on peut la mettre entre accolades. On parle alors de bloc dinstructions. Lintrt des accolades est alors double : il permet de considrer lensemble des instructions dans les accolades comme une seule instruction ; il permet de dclarer des variables (locales ce bloc).
Cette deuxime forme est largement prfrable car dans la premire on ne peut mettre quune seule instruction contrle par le if alors que dans la seconde, on peut en mettre autant quon veut, grce aux accolades. Dans la suite, nous utiliserons pour toutes les structures de contrle la forme avec les accolades mais il existe la forme sans accolades (et donc avec une seule instruction) que nous dconseillons fortement dutiliser ! Exercice 4 : Une valeur entire est-elle paire ? crire un algorithme qui lit une valeur entire au clavier et afche paire si elle est paire. Solution :
1 2 3 4 5 6 7 8 9 10 11 12 13 14
R0 : Afficher paire si une valeur entire saisie au clavier est paire tests 2 5 0 : -> paire -> -----> paire
R1 : Raffinage De Afficher ... | Saisir la valeur entire n | Afficher le verdict de parit R2 : Raffinage De Afficher le verdict de parit | Si n est paire Alors | | crire("paire")
Cours C, Semaine 1
c INPTPAD
13/26
A LGORITHMIQUE
ET PROGRAMMATION
15 16 17 18
Dans le rafnage prcdent un point est noter. Il sagit du rafnage R2 qui dcompose Afcher le verdict de parit . Nous navons pas directement mis la formule n Mod 2 = 0 . Lintrt est que la formulation n est paire est plus facile comprendre. Avec la formule, il faut dabord comprendre la formule, puis en dduire sa signication. n est paire nous indique ce qui nous intresse comme information (facile lire et comprendre) et son rafnage (R3) explique comment on dtermine si n est paire. Le lecteur peut alors vrier la formule en sachant ce quelle est sense reprsenter. Rafner est quelque chose de compliquer car on a souvent tendance descendre trop vite dans les dtails de la solution sans sarrter sur les tapes intermdiaires du rafnage alors que ce sont elles qui permettent dexpliquer et de donner du sens la solution. Dans cet exercice, vous vous tes peut-tre pos la question : mais comment sait-on que n est paire . Si vous avez trouv la solution vous avez peut-re donne directement la formule alors que le point cl est la question. Il faut la conserver dans lexpression de votre algorithme ou programme, donc en faire une tape du rafnage. Si vous arrivez sur une tape que vous avez du mal dcrire, ce sera toujours une indication dune tape qui doit apparatre dans le rafnage. Cependant, mme pour quelque chose de simple, que vous savez faire directement, il faut tre capable de donner les tapes intermdiaires qui conduisent vers et expliquent la solution propose. Ceci fait partie de lactivit de construction dun programme ou algorithme. Remarque : Il est gnralement conseill dviter de mlanger traitement et entres/sorties. Cest pourtant ce qui a t fait ci-dessus. On aurait pu crire le premier niveau de rafnage diffremment en faisant.
1 2 3 4 5 6 7 8 9 10 11 12
R1 : Raffinage De Afficher ... | Saisir la valeur entire | Dterminer la parit de n | Afficher le verdict de parit
R2 : Raffinage De Dterminer la parit de n | parit <- (n Mod 2) = 0 R2 : Raffinage De Afficher le verdict de parit | Si paire Alors | | crire("paire") | FinSi
On constate ici que la variable intermdiaire paire permet davoir un programme plus lisible car on a donn un nom la quantit (n Mod 2) = 0.
1 2 3 4 5
/********************************************************************* : Xavier Crgut <cregut@enseeiht.fr> * Auteur Version : Revision : 1.1 * * Objectif : Afficher paire si une valeur entire est paire. ********************************************************************/
Cours C, Semaine 1
c INPTPAD
14/26
A LGORITHMIQUE
ET PROGRAMMATION
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/* Saisir la valeur entire n */ printf("Valeur = "); scanf("%d", &n); /* Afficher le verdict de parit */ if (n % 2 == 0) { /*{ n est paire }*/ printf("paire\n"); } return EXIT_SUCCESS; }
/* squence2 */
Exercice 5 : Maximum de deux valeurs relles tant donnes deux valeurs relles lues au clavier, afcher lcran la plus grande des deux. Solution :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
R0 : Afficher le plus grand de deux rels saisis au clavier tests 1 2 3 : et 2 -> 2 et 1 -> 1 et 3 -> 3
R1 : Raffinage De Afficher le plus grand de deux rels ... | Saisir les deux rels x1, x2 : out Rel | Dterminer le maximum x1, x2 : in ; max : out Rel | Afficher le maximum R2 : Raffinage De Dterminer le maximum | Si x1 > x2 Alors | | max <- x1
Cours C, Semaine 1
c INPTPAD
15/26
A LGORITHMIQUE
ET PROGRAMMATION
16 17 18 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| Sinon | | max <- x2 | FinSi /********************************************************************* : Xavier Crgut <cregut@enseeiht.fr> * Auteur Version : 1.1 * * Objectif : Afficher le plus grand de deux rels saisis au clavier ********************************************************************/ #include <stdio.h> #include <stdlib.h> int main() { double x1, x2; double max;
/* Saisir les deux rels */ printf("Deux rels : "); scanf("%lf%lf", &x1, &x2); /* Dterminer le maximum */ if (x1 > x2) { max = x1; } else { max = x2; } /* Afficher le maximum */ printf("max(%f, %f) = %f\n", x1, x2, max); return EXIT_SUCCESS; }
Cours C, Semaine 1
c INPTPAD
16/26