• Aucun résultat trouvé

Techniques de Programmation Techniques de Programmation Algorithmique & Langage C Algorithmique & Langage C

N/A
N/A
Protected

Academic year: 2022

Partager "Techniques de Programmation Techniques de Programmation Algorithmique & Langage C Algorithmique & Langage C"

Copied!
253
0
0

Texte intégral

(1)

Techniques de Programmation Techniques de Programmation

Algorithmique & Langage C Algorithmique & Langage C

Manuel Munier

IUT des Pays de l’Adour - Mont de Marsan Département GTR

2004-2005

(2)

Plan du cours

Algorithmique & Python

– variables, opérateurs, expressions – séquence d’instructions

– conditionnelle (if) – boucles (while, for) – fonctions

Langage C

– types, instructions C, compilation, fonctions, tableaux, pointeurs, listes, arbres, fichiers,

(3)

Partie n°2 Partie n°2

Langage C

Langage C

Norme ANSI

Norme ANSI

(4)

Quelques liens

http://www.multimania.com/dancel

http://www.inf.enst.fr/~charon/CFacile

http://www.ltam.lu/Tutoriel_Ansi_C

http://www.esil.univ-mrs.fr/~tourai/main/Enseignement.html

http://www-ipst.u-strasbg.fr/pat/program/index.htm

http://www-igm.univ-mlv.fr/~dr/Cours.html

CC

(5)

Introduction

Historique

– 1971 : D.Ritchie et K.Thompson pour Unix – 1983 : début de normalisation par l’A.N.S.I.

– 1988 : norme "C ANSI" approuvée en 1988

Evolution

– C++ : langage C enrichi des concepts objet – Java : langage orienté objets (GTR2)

CC

(6)

Introduction

Caractéristiques

– Structuré, typé, "portable", puissant, flexible

– À mi-chemin entre un langage de haut niveau et un assembleur

– Langage réduit mais complété par des bibliothèques de fonctions normalisées

– Utilisable sur matériel et système quelconque CC

(7)

Généralités

Structure d’un programme C (3 niveaux)

CC

variables du fichier fonction1

fonctionn

en-tête de fonction bloc (corps de la fonction)

{

variables du bloc <suite

d’instructions>

}

Fichier Fonction Bloc

(8)

Généralités

Création d’un programme C

CC

Éditeur de texte

Pré-processeur C

fichier source

fichier source modifié

Compilateur C

fichier

autres fichiers objet, bibliothèques standard

(9)

Généralités

Premier programme en C

CC

#include <stdio.h> /* fichiers d’en-têtes */

#include <math.h>

main() /* En-tête de la fonction principale */

{ /* Début du corps de la fonction principale */

float x; /* Variable de bloc (de la fonction) */

printf("Entrez le nombre dont vous voulez la racine carree\n");

scanf("%f",&x);

if (x<0.)

printf("Le nombre %f ne possède pas de racine carree\n",x);

else {

float racx; /* Variable locale à ce bloc */

racx = sqrt(x);

(10)

Généralités

Quelques règles d’écriture

– Notion d’identificateur

– Lettres, chiffres, caractère souligné

corrects : iut_gtr2 GTR54_14

incorrects : 6_de_pique 66

– Différence minuscules/majuscules

GTR, gtr et Gtr sont 3 identificateurs différents

CC

(11)

Généralités

Mots réservés (toujours en minuscules !)

CC

auto break case char const

continue default do

else enum extern float for goto if int

register return short signed sizeof static struct switch

union

unsigned void

volatile while

(12)

Généralités

Mise en forme

– Séparateurs entre les mots (espace, return) – Indentation  meilleure lisibilité

Commentaires

– Texte explicatif destiné au lecteur

/* ceci est un commentaire */

/* ceci est un commentaire

CC

(13)

Généralités

Fichiers en-tête

– Ensemble de déclarations et de définitions pour l’utilisation de fonctions prédéfinies

Directive d’inclusion

#include nom_fichier

#include <stdio.h>

CC

<assert.h>

<ctype.h>

<errno.h>

<float.h>

<limits.h>

<locale.h>

<math.h>

<setjmp.h>

<signal.h>

<stdarg.h>

<stddef.h>

<stdio.h>

<stdlib.h>

<string.h>

<time.h>

(14)

Plan

Instructions élémentaires

– types,variables, opérateurs, expressions

– affichage/lecture de données (printf/scanf)

Instructions de contrôle

– exécution conditionnelle (if,switch) – boucles (for,while,do…while)

Tableaux, chaînes de caractères

Fonctions

Pointeurs

CC

(15)

Types & Variables

Notion de type (de données)

– Pourquoi des types ?

– A quoi fait référence un type ?

Signification de l’information

Règles de représentation technologique: codage

Ensemble de définitions et d’opérateurs

– Taille d’un type

Nombre d’octets nécessaires pour représenter les

CC

(16)

Types & Variables

Types simples

– Donnée élémentaire: entier, réel, caractère – Type identifié par un seul mot-clé

Types dérivés

CC

Type Mot-clé nombre entier int

nombre réel float caractère char

(17)

Types & Variables

Déclaration de variable

[<id_classe_stockage>] <id_type> <id_variable> ;

– Exemples

int compteur; /* variable entière */

float moyenne; /* variable réelle */

char reponse; /* variable caractère */

static int i; /* entier i avec

classe de stockage */

CC

(18)

Types & Variables

Déclaration étendue

int i,j,k,t;

Initialisation à la déclaration

int i = 1;

float moy = 0.0;

char rep = 'O';

CC

(19)

Types & Variables

Les types entiers

int

short /* abréviation de short int */

long /* abréviation de long int */

Les entiers non signés

CC

Type Taille habituelle Borne inférieure Borne supérieure

short 2 octets -32 768 +32 767

2 octets -32 768 +32 767

ou

4 octets -2 147 483 648 +2 147 483 647 long 4 octets -2 147 483 648 +2 147 483 647

int

(20)

Types & Variables

Notation des constantes entières

– Notation décimale

56 +467 -140

1896534L /* constante entier long */

55228U /* constante entier non signé */

– Notation octale

0177

027

– Notation hexadécimale

CC

(21)

Types & Variables

Rapidement…

– Déclarer des variables entières

int a,i,j;

short cpt;

unsigned int stock;

long lim_inf = -2563424L, lim_sup;

– Lire des variables entières

scanf("%d",&a); /* un int */

scanf("%d%d",&i,&j); /* 2 entiers i et j */

scanf("%hd",&cpt); /* un short */

CC

(22)

Types & Variables

Rapidement…

– Déclarer des variables entières

int a,i,j;

short cpt;

unsigned int stock;

long lim_inf = -2563424L, lim_sup;

– Afficher des variables entières

printf("%d",a); /* un int */

printf("%hd",cpt); /* un short */

CC

(23)

Types & Variables

Les types flottants

float /* simple précision (erreur < à 10-6) */

double /* double précision (erreur < à 10-10) */

long double /* précision étendue */

Notations de constantes réelles

– Notation décimale

56. -140.125 .14 /* doubles par défaut */

326.46F /* simple précision */

-125365474.L /* flottant long */

– Notation scientifique

CC

(24)

Types & Variables

Rapidement…

– Déclarer des variables réelles

float note,montant;

double mesure;

long double dist = 2563424L;

...

– Lire et afficher des variables réelles

...

scanf("%f",&note); /* lire un float */

CC

(25)

Types & Variables

Le type caractère: char

– Codé sur un octet

– Considéré comme un type entier

Notations des constantes

– Caractères imprimables:

'a' 'B' '+' '$'

– Caractères spéciaux:

notation particulière telle que '\n' ou '\t'

– Notations octales et héxadécimales:

CC

(26)

Types & Variables

Rapidement…

– Lire et afficher un caractère: 1ère méthode

char rep;

...

scanf("%c",&rep); fflush(stdin);

printf("%c",rep); fflush(stdout);

– Lire et afficher un caractère: 2ème méthode (on considère ici le caractère comme un entier)

int rep;

CC

(27)

Types & Variables

Les chaînes de caractères

– Plus vraiment un type simple

– Suite de caractères (tableau) terminée par un caractère '\0'

Notations

"Bonjour" "Bonjour\n" "\t\tBonjour\n"

"B" " " ""

Édition de constantes chaînes

CC

(28)

Types & Variables

Un type spécial: le type indéfini void

– Ex: quand une fonction de renvoie pas résultat

Et les valeurs logiques ?

– Pas de type booléen en C – Convention:

FAUX ⇔ zéro (valeur nulle du type)

CC

(29)

Types & Variables

Les constantes littérales

– Directive du pré-processeur

#define <nom_symbolique> <constante>

– Notations

#define PI 3.14159

#define FAUX 0

#define VRAI 1

#define LIMITE 326

– Utilisation

void main()

{ float rayon = 3.54;

CC

(30)

Types & Variables

Les constantes littérales (suite)

– En fait, la directive #define indique au pré-processeur de remplacer chaque occurrence du nom symbolique par la valeur indiquée

Les variables à valeur constante

const float e = 2.7183;

CC

(31)

Opérateurs

Généralités

– Notion d’opérateur

opérateurs unaires, binaires

– Notion d’expression

combinaison d’opérateurs, de constantes, d’identificateurs et/ou d’expressions

– Comment une expression est-elle évaluée ? – Et les expressions mixtes ?

CC

(32)

Opérateurs

Les opérateurs arithmétiques

CC

Nombre Type Type

d'opérandes opérande(s) résultat

unaire valeur positive entier entier

réel réel

- unaire valeur opposée idem idem

binaire addition entier entier

réel réel

entier,réel réel

- binaire soustraction idem idem

* binaire multiplication idem idem

Opération +

+ Symbole

(33)

Opérateurs

Expressions mixtes: règles de conversion

– Conversion d’ajustement de type

int → long → float → double → long double

Promotion numérique (conversion systématique)

char → int

CC

(34)

Opérateurs

Les opérateurs relationnels

Les opérateurs logiques

CC

Symbole Opération

== égal à

!= différent de

< inférieur strictement à

<= inférieur ou égal à

> supérieur strictement à

>= supérieur ou égal à

Symbole Opération

FAUX 0 VRAI 1

(35)

Opérateurs

Table de vérité des opérateurs logiques

CC

Opérande 1 Opération Opérande 2 Résultat

0 && 0 0

0 && Non Zéro 0

Non Zéro && 0 0

Non Zéro && Non Zéro 1

0 || 0 0

0 || Non Zéro 1

Non Zéro || 0 1

Non Zéro || Non Zéro 1

! 0 1

! Non Zéro 0

FAUX 0 VRAI 1

(36)

Opérateurs

Particularités des opérateurs logiques en C

– Dans le cas d’un ET, l’évaluation des opérandes s’arrête dès qu’un des opérandes est évalué à FAUX

faux ET qqch faux

– Dans le cas d’un OU, l’évaluation s’arrête dès qu’un opérande est évalué à VRAI

CC

(37)

Opérateurs

L’opérateur d’affectation simple

– Notion de lvalue (left value) – Syntaxe d’une affectation

<lvalue> = <expression>

– Principe d’évaluation

on évalue l’expression à droite du signe =

le résultat (une valeur) est recopié dans la lvalue

– Dans le cas d’expression mixte

CC

(38)

Opérateurs

Les opérateurs d’affectation élargie

– la notation

<lvalue> <op>= <expression>

– est équivalente à

<lvalue> = <lvalue> <op> (<expression>)

– avec

<op> ∈ { +, -, *, /, %, >>, <<, &, |, ^ }

CC

+= -= *= /= %= >>= <<= &= |= ^=

(39)

Opérateurs

Quelques opérateurs spéciaux

– post in(dé)crémentation

<lvalue> ++ /* post incrémentation */

<lvalue> -- /* post décrémentation */

– pré in(dé)crémentation

++ <lvalue> /* pré incrémentation */

-- <lvalue> /* pré décrémentation */

– Fonction: ajouter (soustraire) 1 à une lvalue CC

(40)

Opérateurs

Quelques opérateurs spéciaux

– Exemple de post incrémentation

a=5; b=3; c=0; /* a vaut 5, b vaut 3, c vaut 0 */

a++; /* a vaut 6, b vaut 3, c vaut 0 */

c=b+(a++); /* a vaut 7, b vaut 3, c vaut 9 */

– Exemple de pré incrémentation

a=5; b=3; c=0; /* a vaut 5, b vaut 3, c vaut 0 */

++a; /* a vaut 6, b vaut 3, c vaut 0 */

CC

(41)

Opérateurs

L’opérateur de conversion de type (cast)

(<type_cible>) <opérande_expression>

– Exemple:

...

int n=7, p=2, q_entier;

float q_reel;

...

q_entier = n/p; /* q_entier vaut 3 */

q_reel = (float)(n/p); /* q_reel vaut 3.0 */

q_reel = (float)n/p; /* q_reel vaut 3.5 */

CC

(42)

Opérateurs

L’opérateur sizeof

– Renvoie la taille en octets...

sizeof <objet> /* taille d’une variable */

sizeof (<id_type>) /* taille d’un type */

– Exemples:

...

double x;

int a;

...

CC

(43)

Opérateurs

L’opérateur séquentiel

<expression_1>, <expression_2>

– Exemple:

i++, j+=k; /* est équivalent à i++; j+=k; */

L’opérateur conditionnel

<expr_1> ? <expr_2> : <expr_3>

– Exemple:

max = (a>b) ? a : b; /* max reçoit le plus grand

CC

(44)

Opérateurs (priorités)

CC

Catégorie Opérateurs Associativité

référence ( ) [ ] -> .

unaires + - ++ -- ! * & (cast) sizeof

multiplicatifs * / %

additifs + -

décalage << >>

relationnels < <= > >=

relationnels == !=

manip. bits &

manip. bits ^

manip. bits |

logique &&

logique ||

priori décroissante

(45)

Opérateurs & Expressions

CC

Instructions x y z expr. gauche

int x,y,z;

x = -3 + 4 * 5 - 6;

x = 3 + 4 % 5 - 6;

x = -3 * 4 % 6 + 5;

x *= 3 + 5;

x *= (y = (z = 4));

x = y == z;

x == (y = z);

x=0; y=-1; z=0;

x = x && y || z;

z = x++ - 1;

(46)

Opérateurs & Expressions

CC

Instructions x y z expr. gauche

int x,y,z;

x = (((-3) + (4 * 5)) - 6); 11 11

x = 3 + 4 % 5 - 6;

x = -3 * 4 % 6 + 5;

x *= 3 + 5;

x *= (y = (z = 4));

x = y == z;

x == (y = z);

x=0; y=-1; z=0;

x = x && y || z;

(47)

Opérateurs & Expressions

CC

Instructions x y z expr. gauche

int x,y,z;

x = (((-3) + (4 * 5)) - 6); 11 11

x = ((3 + (4 % 5) - 6); 1 1

x = -3 * 4 % 6 + 5;

x *= 3 + 5;

x *= (y = (z = 4));

x = y == z;

x == (y = z);

x=0; y=-1; z=0;

x = x && y || z;

z = x++ - 1;

(48)

Opérateurs & Expressions

CC

Instructions x y z expr. gauche

int x,y,z;

x = (((-3) + (4 * 5)) - 6); 11 11

x = ((3 + (4 % 5) - 6); 1 1

x = ((((-3) * 4) % 6) + 5); 5 5

x *= 3 + 5;

x *= (y = (z = 4));

x = y == z;

x == (y = z);

x=0; y=-1; z=0;

x = x && y || z;

(49)

Opérateurs & Expressions

CC

Instructions x y z expr. gauche

int x,y,z;

x = (((-3) + (4 * 5)) - 6); 11 11

x = ((3 + (4 % 5) - 6); 1 1

x = ((((-3) * 4) % 6) + 5); 5 5

x *= (3 + 5); 40 40

x *= (y = (z = 4));

x = y == z;

x == (y = z);

x=0; y=-1; z=0;

x = x && y || z;

z = x++ - 1;

(50)

Opérateurs & Expressions

CC

Instructions x y z expr. gauche

int x,y,z;

x = (((-3) + (4 * 5)) - 6); 11 11

x = ((3 + (4 % 5) - 6); 1 1

x = ((((-3) * 4) % 6) + 5); 5 5

x *= (3 + 5); 40 40

x *= (y = (z = 4)); 160 4 4 160

x = y == z;

x == (y = z);

x=0; y=-1; z=0;

x = x && y || z;

(51)

Opérateurs & Expressions

CC

Instructions x y z expr. gauche

int x,y,z;

x = (((-3) + (4 * 5)) - 6); 11 11

x = ((3 + (4 % 5) - 6); 1 1

x = ((((-3) * 4) % 6) + 5); 5 5

x *= (3 + 5); 40 40

x *= (y = (z = 4)); 160 4 4 160

x = (y == z); 1 4 4 1

x == (y = z);

x=0; y=-1; z=0;

x = x && y || z;

z = x++ - 1;

(52)

Opérateurs & Expressions

CC

Instructions x y z expr. gauche

int x,y,z;

x = (((-3) + (4 * 5)) - 6); 11 11

x = ((3 + (4 % 5) - 6); 1 1

x = ((((-3) * 4) % 6) + 5); 5 5

x *= (3 + 5); 40 40

x *= (y = (z = 4)); 160 4 4 160

x = (y == z); 1 4 4 1

x == (y = z); 1 4 4 0

x=0; y=-1; z=0;

x = x && y || z;

(53)

Opérateurs & Expressions

CC

Instructions x y z expr. gauche

int x,y,z;

x = (((-3) + (4 * 5)) - 6); 11 11

x = ((3 + (4 % 5) - 6); 1 1

x = ((((-3) * 4) % 6) + 5); 5 5

x *= (3 + 5); 40 40

x *= (y = (z = 4)); 160 4 4 160

x = (y == z); 1 4 4 1

x == (y = z); 0 4 4 0

x=0; y=-1; z=0; 0 -1 0

x = x && y || z;

z = x++ - 1;

(54)

Opérateurs & Expressions

CC

Instructions x y z expr. gauche

int x,y,z;

x = (((-3) + (4 * 5)) - 6); 11 11

x = ((3 + (4 % 5) - 6); 1 1

x = ((((-3) * 4) % 6) + 5); 5 5

x *= (3 + 5); 40 40

x *= (y = (z = 4)); 160 4 4 160

x = (y == z); 1 4 4 1

x == (y = z); 0 4 4 0

x=0; y=-1; z=0; 0 -1 0

x = ((x && y) || z); 0 -1 0 0

(55)

Opérateurs & Expressions

CC

Instructions x y z expr. gauche

int x,y,z;

x = (((-3) + (4 * 5)) - 6); 11 11

x = ((3 + (4 % 5) - 6); 1 1

x = ((((-3) * 4) % 6) + 5); 5 5

x *= (3 + 5); 40 40

x *= (y = (z = 4)); 160 4 4 160

x = (y == z); 1 4 4 1

x == (y = z); 0 4 4 0

x=0; y=-1; z=0; 0 -1 0

x = ((x && y) || z); 0 -1 0 0

z = (x++) - 1; 1 -1 -1 -1

(56)

Opérateurs & Expressions

CC

Instructions x y z expr. gauche

int x,y,z;

x = (((-3) + (4 * 5)) - 6); 11 11

x = ((3 + (4 % 5) - 6); 1 1

x = ((((-3) * 4) % 6) + 5); 5 5

x *= (3 + 5); 40 40

x *= (y = (z = 4)); 160 4 4 160

x = (y == z); 1 4 4 1

x == (y = z); 0 4 4 0

x=0; y=-1; z=0; 0 -1 0

x = ((x && y) || z); 0 -1 0 0

(57)

Opérateurs & Expressions

CC

Instructions x y z expr. gauche

int x,y,z;

x = (((-3) + (4 * 5)) - 6); 11 11

x = ((3 + (4 % 5) - 6); 1 1

x = ((((-3) * 4) % 6) + 5); 5 5

x *= (3 + 5); 40 40

x *= (y = (z = 4)); 160 4 4 160

x = (y == z); 1 4 4 1

x == (y = z); 0 4 4 0

x=0; y=-1; z=0; 0 -1 0

x = ((x && y) || z); 0 -1 0 0

z = (x++) - 1; 1 -1 -1 -1

(58)

Plan

Instructions élémentaires

– types,variables, opérateurs, expressions

– affichage/lecture de données (printf/scanf)

Instructions de contrôle

– exécution conditionnelle (if,switch) – boucles (for,while,do…while)

Tableaux, chaînes de caractères

Fonctions

Pointeurs

CC

(59)

Instructions

4 "catégories" d’instructions:

– instruction nulle

syntaxe:

– instruction simple

syntaxe:

– instruction composée (ou bloc d’instructions)

syntaxe:

CC

<expression> ;

{ <liste de déclarations>

<liste d’instructions>

}

;

!

ANSI C

(60)

Instructions de contrôle

Objectif (rappel): modifier la structure séquentielle du programme

– répétition

– prise de décision conditionnelle – déroutement inconditionnel

2 catégories

CC

(61)

Instructions de contrôle

Classification:

CC

instructions instructions structurées de branchement for

while

do … while if [… else]

else if

break continue return boucles

choix

déroutements

switch

(62)

Conditionnelle if

Instruction if

if (<expression_booleenne>) <instruction>

– Ex (instruction simple ou expression)

float note;

scanf("%f",&note);

if ( (note>=0.0) && (note<=20.0) ) print("Note valide\n");

CC

(63)

Conditionnelle if

Instruction if

if (<expression_booleenne>) <instruction>

– Ex (instruction composée ou bloc)

...

delta = b*b - (4*a*c);

if (delta > 0.0) { float x1,x2;

x1 = (-b - sqrt(delta)) / (2*a);

x2 = (-b + sqrt(delta)) / (2*a);

CC

(64)

Conditionnelle if

/* Programme qui calcule, à partir d’un horaire donné

(hh:mm:ss), l’horaire une seconde après (même format) */

#include <stdio.h>

main()

{ short h,m,s;

printf("Entrer Heures/Minutes/Secondes\n");

scanf("%hd %hd %hd",&h,&m,&s);

s++;

if (s==60) { s=0; m++;

if (m==60) { m=0; h++;

if (h==24) h=0;

CC

(65)

Conditionnelle if

Instruction if ... else

if (<expression_booleenne>) <instruction_1>

else

<instruction_2>

– Exemple

...

if (moyenne >= 10.0)

printf("Etudiant RECU\n");

else

CC

(66)

Conditionnelle if

Instruction if ... else

– Règle (imbrication des if): un else se rapporte toujours au dernier if rencontré auquel aucun else n’a encore été attribué

– Exemple

if (a<=b) if (b<=c) printf("Vrai\n");

else printf("Faux\n");

Ce programme affiche:

CC

(67)

Conditionnelle switch

Passage du if ... else au switch

CC

/* Programme qui simule une calculatrice arithmétique */

#include <stdio.h>

main()

{ int a,b; /* les 2 opérandes */

char op; /* le symbole de l’opérateur */

printf("Entrer les deux opérandes entières:\n");

scanf("%d %d",&a,&b);

printf("Entrer un opérateur (+,-,* ou /):\n");

scanf("%c",&op);

printf("Le résultat est: ");

if (op=='+') printf("%d\n",a+b);

else if (op=='-') printf("%d\n",a-b);

else if (op=='*') printf("%d\n",a*b);

(68)

Conditionnelle switch

Instruction switch

– Syntaxe:

switch (<expression_entière>)

{ case <constante_1>: [<suite_inst_1>];

case <constante_2>: [<suite_inst_2>];

...

case <constante_n>: [<suite_inst_n>];

[default: <suite_inst_par_defaut>]

}

CC

(69)

Conditionnelle switch

Instruction switch

CC

/* Programme qui simule une calculatrice arithmétique */

#include <stdio.h>

main()

{ int a,b; /* les 2 opérandes */

char op; /* le symbole de l’opérateur */

...

switch (op) {

case '+': printf("%d\n",a+b);

case '-': printf("%d\n",a-b);

case '*': printf("%d\n",a*b);

case '/': printf("%d\n",a/b);

(70)

Conditionnelle switch

Instruction switch

CC

Entrer les deux opérandes entières:

3 4

Entrer un opérateur (+,-,* ou /):

+

Le résultat est: 7 -1

12 0

cas + cas -

cas *

cas / default

(71)

Conditionnelle switch

Instruction switch + break

CC

/* Programme qui simule une calculatrice arithmétique */

#include <stdio.h>

main()

{ int a,b; /* les 2 opérandes */

char op; /* le symbole de l’opérateur */

...

switch (op) {

case '+': printf("%d\n",a+b); break;

case '-': printf("%d\n",a-b); break;

case '*': printf("%d\n",a*b); break;

case '/': printf("%d\n",a/b); break;

!

notez l’absence de bloc pour les différents cas

(72)

Conditionnelle switch

Instruction switch + break

– Le break interrompt l’exécution du switch

en fait, on n’a qu’un seul bloc d’instructions

les différents case peuvent être vus comme des

« étiquettes »

pas de délimiteur de bloc pour les cas

– C’est la seule et uniqueseule et unique utilisation du break qui CC

(73)

Boucle while

Instruction while

while (<expression_booléenne>) <instruction>

CC

/* Nombre de chiffres composant un nombre */

#include <stdio.h>

main()

{ int n,q,nbc;

printf("Entrer un nombre entier:\n"); scanf("%d",&n);

nbc = 1;

q = n/10;

while (q != 0) { q = q/10;

nbc++;

(74)

Boucle while

Variante: instruction do ... while

do

<instruction>

while (<expression_booléenne>)

CC

/* Contrôle de la validité d’une valeur numérique */

...

do {

printf("Entrer la note de l’étudiant:\n");

scanf("%f",&note);

(75)

Boucle while

while do...while

CC

exécuter l’instruction

évaluer la évaluer la condition condition

...

faux vrai

évaluer la évaluer la condition condition

exécuter l’instruction

...

faux vrai

(76)

Boucle for

Instruction for

for (<expr_init>;<expr_bool>;<expr_evol>) <instruction>

<expr_init> : initialisation de la boucle

exécutée une seule fois avant d’entrer dans la boucle

<expr_bool> : condition booléenne

on continue tant que cette condition est évaluée à vrai

<expr_evol> : modification des itérateurs CC

(77)

Boucle for

Instruction for

for (<expr_init>;<expr_bool>;<expr_evol>) <instruction>

CC

exécuter <expr_init>

évaluer <expr_bool>

évaluer <expr_bool>

<instruction>

exécuter <expr_evol>

vrai faux

(78)

Boucle for

CC

/* Moyenne des notes */

#include <stdio.h>

main() {

int i,n;

float note,somme=0.0;

printf("Entrer le nombre de notes:\n");

scanf("%d",&n);

for (i=1; i<=n; i++) {

printf("Note %d:\n",i);

scanf("%f",&note);

(79)

Boucle for

Exemple

/* somme des n premiers entiers */

somme = 0;

for (i=1; i<=n; i++) somme = somme+i;

Formes particulières

– regroupement

/* dans la partie initialisation */

for (i=1,somme=0; i<=n; i++) {...}

CC

(80)

Boucle for

Formes particulières

– absence

/* partie initialisation absente */

/* => on suppose i initialisé avant le for */

for (; i<=n; i++) {...}

/* partie évolution absente */

/* (ici, condition et évolution sont regroupées) */

for (i=1,somme=0; i++<=n;) {...}

/* corps vide */

for (i=1,somme=0; i<=n; somme+=i++);

CC

(81)

Instructions prohibées prohibées

Instruction break

– Permet de sortir immédiatement de la boucle la plus interne

CC

/* exemple de break dans une boucle for */

...

printf("Vous avez 10 essais pour trouver le nombre caché\n");

for (i=1; i<=10; i++) { scanf("%d",&nb);

if (nb == 963) break;

}

if (i>10)

printf("PERDU...\n");

(82)

Instructions prohibées prohibées

Même programme sans break

CC

/* comment se passer d’un break */

...

printf("Vous avez 10 essais pour trouver le nombre caché\n");

i=1;

do {

scanf("%d",&nb);

i++;

} while ( (i<=10) && (nb!=963) );

if (nb!=963)

(83)

Instructions prohibées prohibées

Instruction continue

– Interrompt l’exécution du corps de la boucle et passe directement à l’évaluation de la condition

CC

/* on ne veut traiter que les valeurs positives */

...

for (somme=0.0,i=1; i<=n; i++) {

scanf("%d",&nb);

if (nb<=0) continue;

somme += sqrt(nb);

}

(84)

Instructions prohibées prohibées

Même programme sans continue

CC

/* comment se passer d’un continue */

...

for (somme=0.0,i=1; i<=n; i++) {

scanf("%d",&nb);

if (nb>0) /* condition opposée */

{

/* ce qu’on voulait éviter avec le continue */

somme += sqrt(nb);

} }

(85)

Instructions prohibées prohibées

Instruction goto

– On n’en parlera même pas;

vous risqueriez de casser la machine en l’utilisant ;-)

CC

goto

(86)

Plan

Instructions élémentaires

– types,variables, opérateurs, expressions

– affichage/lecture de données (printf/scanf)

Instructions de contrôle

– exécution conditionnelle (if,switch) – boucles (for,while,do…while)

Tableaux, chaînes de caractères

Fonctions

Pointeurs

CC

(87)

Tableaux

Rappel

– Un tableau permet de mémoriser un ensemble de valeurs de même type avec une seule variable

Vocabulaire

– taille: nombre maximum d’éléments (de valeurs)

à vous de gérer le nombre réel d’éléments (une variable entière par ex)

– rang d’un élément: sa position dans le tableau CC

(88)

Tableaux

Syntaxe: déclarateur []

<id_type_elts> <id_tab>[<cste_taille>];

– Ceci déclare une variable tableau

dont le nom est <id_tab>,

pouvant contenir <cste_taille> éléments,

chaque élément étant du type <id_type_elts>

– Allocation statique (octets contigus)

CC

(89)

Tableaux

Exemples

– Déclarations correctes

/* tableau de 5 entiers (int) */

int tab[5];

/* tableau de 12 entiers courts (short) */

#define NBMOIS 12 short tmois[NBMOIS];

– A ne jamais faire !!!

int n;

float tnotes[n]; /* à cet instant n vaut 0 ! */

CC

(90)

Tableaux

Accès aux éléments

– Syntaxe: opérateur []

<id_tableau>[<indice>]

– Illustration:

CC

tab 23 tab[0]

48 tab[1]

57 tab[2]

12 tab[3]

14 tab[4]

tab[5]

les éléments sont numérotés à partir de 0

débordement d’indice

 sortie du tableau

(91)

Tableaux

CC

#include <stdio.h>

main() {

int n; /* nombre d'étudiants au contrôle */

int i; /* compteur de notes (indice du tab.) */

int nbSup; /* nbre de notes sup. à la moyenne */

float somme; /* somme de toutes les notes */

float moy; /* moyenne de toutes les notes */

float tabNotes[72]; /* tableau contenant les notes */

/* Lecture du nombre de notes à saisir */

printf("Entrer le nombre de notes à saisir: ");

scanf("%d",&n);

(92)

Tableaux

CC

/* Lecture des notes. Au fur et à mesure que celles-ci sont enregistrées dans le tableau, on en profite

également pour faire la somme de toutes ces notes */

for (somme=0.0,i=0; i<n; i++) {

printf("Entrer le note N°%d: ",i);

scanf("%f",&tabNotes[i]&tabNotes[i]);

somme += tabNotes[i]tabNotes[i];

}

/* Calcul et édition de la moyenne de la promo pour ce contrôle */

moy = somme/n;

printf("La moyenne est de %f\n",moy);

(93)

Tableaux

CC

/* Calcul et édition du nombre de notes supérieures à la moyenne du contrôle */

for (nbSup=0,i=0; i<n; i++) if (tabNotes[i]tabNotes[i] >= moy) nbSup++;

printf("Il y a %d notes sup. à cette moyenne\n",nbSup);

} /* fin du programme (main) */

(94)

Tableaux

Initialisation lors de la déclaration

– Initialisation complète

int tab[5] = {23, 48, 57, 12, 14};

short tmois[NBMOIS] = {21,28,31,30,31,30,31,31,30,31,30,31};

– Initialisation partielle

int tab2[5] = {23, 48, 57}; /* 23, 48, 57, ??, ?? */

static int tab3[5] = {23, 48, 57}; /* 23, 48, 57, 0, 0 */

– Taille non précisée

CC

(95)

Tableaux

Tableaux à plusieurs dimensions

– Déclaration d’une matrice

<id_type_elts> <id_tab>[<nb_lignes>][<nb_col>];

Exemple: int mat[5][3];

/* délaration d’un tableau de 15 entiers organisés en 5 lignes comportant chacune 3 éléments */

– Accès à un élément

<id_tab>[<indice_ligne>][<indice_colonne>]

CC

(96)

Tableaux

Tableaux à plusieurs dimensions

– Rangement en mémoire

tableau « à plat »

tous les éléments se suivent

– Initialisation d’une matrice

int mat2[3][4]={ {12,23,-4,36}, /* 1ère ligne */

{33,-2,21,78}, /* 2ème ligne */

CC

mat[0][0]

mat[0][1]

mat[0][2]

mat[1][0]

mat[1][1]

mat[1][2]

mat[4][0]

mat[4][1]

mat[4][2]

(97)

Chaînes de caractères

Convention de représentation

– « suite d’octets terminée par un \0 »

Constantes chaînes

sizeof("IUT GTR") 8

CC

'I' 'U' 'T' ' ' 'G' 'T' 'R' '\0'

(98)

Chaînes de caractères

Variables chaînes

– Principe

pas de type prédéfini

on utilise un tableau de caractères pour y affecter une suite de caractères qui respecte la convention du \0 (NULL)

– Déclaration (idem tableaux)

char prenom[31];

char nom[]; /* interdit */

CC

(99)

Chaînes de caractères

Initialisation des variables chaînes lors de la déclaration

– Vision éléments

char prenom1[31]={'C','a','m','i','l','l','e','\0'};

prenom1 peut être manipulée en tant que chaîne; 31 octets sont réservés

char prenom2[31] = {'C','a','m','i','l','l','e'};

prenom2 ne peut pas être manipulée en tant que chaîne (pas de \0 à la fin)

char prenom3[] = {'C','a','m','i','l','l','e','\0'};

CC

(100)

Chaînes de caractères

Initialisation des variables chaînes lors de la déclaration

– Vision globale

char prenom4[31] = "Camille";

prenom4 peut être manipulée en tant que chaîne; 31 octets sont réservés

initialisation équivalente à celle de prenom1

char prenom5[] = "Camille";

prenom5 peut être manipulée en tant que chaîne; 8

CC

(101)

Chaînes de caractères

Utilisation des chaînes

– Au niveau éléments

– Au niveau global

CC

#include <stdio.h>

main()

{ char chaine[]="Lorraine: pays de la mirabelle";

short i,cpt; /* indice, compteur de 'a' */

for (cpt=0,i=0; chaine[i]!='\0'; i++) if (chaine[i]=='a') cpt++;

printf("Le caractère 'a' apparaît %d fois\n",cpt);

}

Références

Documents relatifs

Les instructions d’un programme sont décrites à l’aide d’un langage langage machine. langage d’assemblage langage de

Début algorithme : Ouverture de la porte d’un garage.

[r]

Chapitre 4 : Listes chaînées Mise à

Chaîne formée, de gauche à droite, de la valeur!. des feuilles

[r]

Un arbre binaire qui n’est pas vide est form´e d’un nœud, sa racine, et de deux sous-arbres binaires, l’un appel´e le fils gauche, l’autre le fils droit.. Nous nous

Nous allons voir un nouveau type de données très important pour résoudre ce genre de problèmes : le type