Langage C - LSIS · Progression : 1. Notion d'algorithme et de programme 2. Premiers pas en C...

Preview:

Citation preview

Langage C

Rémy Bulot

remy.bulot@univ-amu.fr

Progression :

1.  Notion d'algorithme et de programme 2.  Premiers pas en C 3.  Type entier, réel, constantes et variables 4.  Les entrées-sorties simplifiées 5.  Expressions arithmétiques et logiques 6.  Syntaxe des instructions

7.  Les entrées-sorties 8.  Quelques compléments commodes 9.  Variables indexées (tableaux) 10.  Adresse et pointeur 11.  Les Fonctions 12.  Les objets structurés 13.  Les fichiers 14.  Piles, files, listes chaînées

I.

Notion d’algorithme

Un parallèle culinaire

Une recette de cuisine

Ingrédients

Recette

Plat

Algorithme

Données (entrées)

Algorithme

Résultat (sorties)

a) Définition

•  Suite finie et non ambiguë d’instructions

•  dans un langage pseudo-naturel simple

•  permettant de décrire une méthode pour répondre à un problème

•  en s’affranchissant des aspects matériels de mise en œuvre (type de machine, langage de programmation utilisé, …)

L’étape suivante sera de traduire cet algorithme dans un langage de programmation « compréhensible » et exécutable par une machine

problème algorithme programme solutions

données

b) Analyse préliminaire et développement d’un algorithme

•  Poser clairement le problème o  Spécification des données à partir de l'énoncé du problème, d'hypothèses, ou de

source d'informations externes, ... o  Spécification des buts à atteindre à partir des résultats attendus, des suites

d'opérations à effectuer, ... o  S'assurer que le problème puisse être traité (il y a des problèmes indécidable !) o  Simplifier éventuellement le problème (ex : calcul des décimales de π ...)

•  Définir l'algorithme o  Tout objet manipulé doit être clairement défini (nature et rôle) avant son usage. o  Définir une suite d’instructions simples :

o  non ambiguë o  exécutable en un nombre fini d’opérations o  dans un temps limité o  et qui doit produire un résultat

a) Définir un premier algorithme très général

•  ensemble d’actions de haut niveau •  à réaliser de manière séquentielle Recette des crêpes au nutella :

I.  Définir les ingrédients (350g de farine, ½ litre de lait, 3 œufs) II.  Faire la pâte à crêpe III. Cuire une crêpe dans une poêle IV. Étaler du nutella sur la crêpe

b) Raffinement des tâches

Chaque action (ou tâche) peut-être vue comme un sous problème •  avec ses données et son résultat spécifiques •  et qui peut être résolu isolément

â  raffinement de chaque tâche

On enchaîne des raffinements successifs : â  Conception structurée

Raffinement successifs :Recette des crêpes au nutella : I.  Définir les ingrédients II.  Faire une pâte à crêpe

1.  Mettre 350g de farine dans un bol 2.  Ajouter ½ litre de lait 3.  Mélanger 4.  Ajouter 3 œufs 5.  Mélanger

III.  Cuire une crêpe dans une poêle IV.  Étaler du nutella sur la crêpe

Action Mélanger : répétition d’une action élémentaire : Tant que le mélange n’est pas homogène,

-  tourner la pâte avec une cuillère

3. Eléments de base pour écrire un algorithme Une recette de cuisine Un algorithme •  ingrédients (farine, beurre, …) données •  récipients (plat, bol, …) variables •  outils (couteaux, mixeur…) opérateurs •  instructions simples (verser, …) affectation, … •  instructions conditionnelles si-alors-sinon •  instructions répétitives tant-que

"Outils" de base pour écrire un algorithme a)  définition d'une variable b)  lecture/écriture c)  expressions arithmétiques et logiques d)  affectation e)  instruction conditionnelle f)  répétition d’une action

a) Définir une variable ð  nommer au début les variables utilisées (contenants) ð  en précisant la nature du contenu (entier, réel, caractère…) ex : soient a, b, c trois réels

b) Instruction de lecture/écriture ð  pour représenter les échanges homme-machine

•  lire (variable) homme -> machine •  écrire(variable) homme <- machine

c) Expressions ð  Expression arithmétique (dans N, Z, R…)

ex : b2-4ac

ð  Expression logique (résultat VRAI ou FAUX) avec les opérateurs ET, OU, NON, = , ≠ , < , ≤ ex : 0 < b2-4ac

ET vrai faux

vrai vrai faux

Faux faux faux

OU vrai faux

vrai vrai vrai

faux vrai faux

d) Affectation : •  Une variable ne peut contenir qu’une seule information

variable <- expression •  l’affectation qui initialise

x <- 1 s <- x+1

•  l’affectation qui modifie s <- s+x

Remarques : •  lire est une forme d’affectation •  variable à droite de <- : désigne le contenu (la valeur) •  variable à gauche de <- : désigne le contenant (zone mémoire)

s <- s+x

e) Instruction alternative

•  Action liée à une condition

si (condition) action1 sinon action2 fin-si suite de l’algorithme

Remarques : •  les actions sont des suites d’instructions élémentaires •  délimitées par si, sinon et fin-si •  sinon action2 est facultatif •  présentation : il faut indenter les instructions de chaque action

oui condition

action1 non

action2

f) Instruction répétitive

•  Action répétée sous condition

tant-que (condition) action fin tant-que suite de l’algorithme

condition

non

oui

action

5. Quelques exemples : •  l’algorithme pour la résolution de l’équation du 2ème degré •  l’algorithme mystérieux soient a, b, r entiers;

lire(a) ;

lire(b) ;

r <- 0 ;

tant-que (b ≠ 0)

si (b est pair)

b <- b/2 ;

a <- 2*a ;

sinon

b <- b-1 ;

r <- r+a ;

fin-si

fin tant-que

ecrire(r) ;

Résumé chap. I •  Un algorithme est une recette obtenu par affinements successifs •  Il manipule des contenants (variables) et des contenus (valeurs)

•  Il s'affranchit des contraintes spécifiques aux langages •  Les outils disponibles :

o  définir les variables : soient a un réel, i un entier, c un caractère o  les opérateurs arithmétiques et logiques (≠ , = , < , ≤ , et , ou , non) o  initialiser une variable : a <- 2*3.14 i <- 0 c <- 'Z' o  modifier une variable : a <- a*a i <- i+1 c <- c-'A'+'a' o  si condition alors action fin si o  tant que condition faire action fin tant que

•  Recommandations : o  ne jamais utiliser une variable non initialisée (contenu "aléatoire")

o  simuler les départs de boucle et les fins de boucle en étudiant le contenus des variables pour valider vos algorithmes

o  connaître les algo. de bases : compter et accumuler (moyenne,...), calculer des suites (xn, x!, ...), chercher une valeur particulière dans une suite (min, ...), ...

II.

Premiers pas en C

Introduction Langage de programmation : •  syntaxe non ambigüe qui permet de retranscrire un algorithme en une suite

d'instructions qui seront ensuite converties en langage machine •  prend en compte les spécificités techniques de la machine (contrairement à un

algorithme) •  Cette suite d'instructions est désignée "code source"

Compilateur : •  spécifique au langage •  programme qui permet de traduire le texte du programme (code source) en

instructions machines de bas niveau (code exécutable) •  prend en compte les spécificités techniques de la machine

problème algo. code exécut. solutions

données

Code source Compilation

Le C a été mis au point par D.Ritchie et B.W.Kernighan

•  Au début des années 70

•  Pour écrire un système d'exploitation portable : UNIX

•  Le succès d'UNIX a entraîné celui de C :

•  un des langages le plus utilisé (gestion des réseaux, …).

La première définition de ce langage a été donnée dans leur livre

« The C programming language ». Ce langage a été normalisé en 1989 : C-ANSI

(American National Standards Institute)

Quelques caractéristiques du langage : •  adapté aux programmes de taille moyenne •  programmation de bas niveau (proche assembleur) •  comme de haut niveau (programmation structurée) •  indépendant de la machine (portabilité) •  C original et C-ANSI (1989) plus fiable au niveau syntaxique

Ce cours : un sous-ensemble du C-ANSI

Premières remarques sur la constitution d’un programme C : •  Programme C : fichier texte

•  Commentaires : /* coucou */

1. Développement d’un programme

1 : L’algorithme : « recette » décrite en pseudo-français 2 : Code source : transcription de l’algorithme dans le langage fichier construit sous un éditeur de texte 3 : Compilation : traduction du code source en code machine exécutable 4 : Edition de lien : (link) compléter le code avec des fonctions prédéfinies

déjà compilées (sin , sqrt, …)

â  Fichier exécutable : résultat de cette séquence d’opérations

Développer un programme : •  réaliser les 4 étapes •  tester l'exécution avec différents jeux de données •  recommencer la séquence jusqu'à obtention d'un fonctionnement satisfaisant

2. Code source Un fichier source est une succession d'un nbre quelconque d'éléments indépendants :

•  directives pour le préprocesseur (lignes qui débutent par # ) •  construction de types

•  déclaration de variables et de fcts externes

•  définition de variables (réservation d'espace mémoire)

•  définition de fcts dont la fct principale main( ) !!!

3. Compiler/executer

Fichier source salut.c!/* Auteur : Melanie Zettofret! Objectif : afficher coucou ! */!!

#include <stdio.h>!!

void main(void)!{ !! printf("coucou !\n");!}!

!!

Dans une console UNIX : Compiler avec la commande gcc salut.c –o salut

lancer l’exécution du code en tapant ./salut !

III.

Constantes, types et variables

1.  Constantes 2.  Identifiateurs 3.  Variables 4.  Affectation

1.  Les constantes Ce sont les valeurs définies explicitement. On distingue : - les caractères alphanumérique-étendus

‘a‘    ‘A‘    ‘1‘    ‘ ‘    ‘@‘    ‘\n‘

- les entiers 0 -1 32767

- les réels 0. 3.14 0.314e1 0.314E1

ATTENTION : 1 est différent de ‘1‘

2. Identificateur

•  Pourquoi faire ? donner des noms aux variables et aux actions

•  31 caractères max, majuscule ≠ minuscule

identificateur : lettre[lettresOuChiffresOu_ ] •  Exemple : x x1 delta Delta Bond_007

•  Mots réservés du langage (voir fiche résumé) : o  une trentaine o  tous en minuscule

!

3. Variable •  un emplacement mémoire (1, 2, 4 octets ou plus) •  on en crée (presque) autant qu’on veut •  en donnant des noms qui suggèrent bien leurs rôles

compteur, somme, valeurMin, ... •  le contenu peut changer dans le temps •  contient toujours quelque chose !!! Une variable sera toujours définie avant utilisation par : •  un type (sa nature qui détermine sa taille) •  et un identificateur (son nom)!

3.1 Type d’une variable •  convention de codage de l'information •  dans un emplacement de taille préfixée

7 types de base en C : ü  char : petit entier codé sur 1 octet (entre –128 et 127) ü  short : entier de taille moyenne sur 2 octets (de –32768 à 32767) ü  long : grand entier sur 8 octets (jusqu’à 19 chiffres) ü  int : entier dont la taille est liée au processeur (mot machine) ü  float : réel avec 7 chiffres significatifs ü  double : réel de grande précision ü  long double : réel de très grande précision

Le qualificatif unsigned : redéfinit l’intervalle de validité à partir de 0 Un unsigned short est dans [0, 65535] Un unsigned char est dans [0, 255]

3.2 Définition d'une variable : Objectifs : •  réserver un emplacement mémoire •  qui soit adapté au codage de l’information •  associer un nom (identificateur) à cet emplacement Syntaxe pour la définition de variable :

-> type variableInit [ , variableInit ] ; où variableInit : -> identificateur -> identificateur = expression constante

Exemple : !float x;!!long i, j=1, k ;!!char c1='1', c2 = 2 ;!

!Exemples d’erreur :!!int i=0, j=i+1 ;!!char a=300 ;!

!!

Remarques : •  Le C ne fait pas de différence entre les petits entiers et les caractères qui sont déclarés indifféremment comme des char

char c ;

•  Le code ASCII des lettres et des chiffres respecte l’ordre partiel

intuitif des caractères alphanumériques ‘a’ (97), ‘b’ (98), … ‘A’ (65), ‘B’ (66), … ‘0’ (48), ‘1’ (49), ‘2’ (50), …

binaire

petit entier codé en binaire

Caractère représenté par son code ASCII (65)

0 1 0 0 0 0 0 1

65 ‘A‘

4. Affectation d'une variable : Syntaxe simplifiée de l'instruction d'affectation :

variable = expression ; Exemple : /* définition d'une variable */

short cpt;

/* affectation d'une variable */ cpt = 0 ; cpt = cpt+1 ;

Résumé chap. II et III •  Comprendre les types et leur codage (nbre d'octets occupés, capacité de codage)

o  float a, b ; double x ; long double distTerreLune ; o  char i ; short compteur ; int moyenne ; long numTel ; o  char carCourant ; o  unsigned long distance ; unsigned char pixRouge, pixVert, pixBleu ;

•  Affectation d'une variable : •  compteur = 0 ; •  compteur = compteur+1 ;

•  Remarques et Recommandations : o  Les char représentent à la fois les caractères et les petits entiers (le code ASCII

qui représente un caractère est un petit entier) o  Ils ne se distinguent que par les opérations de lecture/écriture

o  Les calculs doivent respecter la capacité de codage de chaque type (risque de "débordement")

o  Utiliser des noms de variables mnémoniques

Recommended