Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale...

30
“Rappels” de C ECP – Option SA Henri Fallon <[email protected]>

Transcript of Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale...

Page 1: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

“Rappels” de C

ECP – Option SAHenri Fallon <[email protected]>

Page 2: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Objectifs

Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent déjà coder : retournez

dormir :-)

Page 3: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Syntaxe basique

Les instructions se terminent par un ' ; ' Les instructions peuvent se regroupper avec

des accollades : { .... } Les commentaires entre /* et */

Page 4: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Premier programme

Source ExécutableCompilation

Compréhensible par un humain (un peu entrainé)

Non utilisable par la machine

Incompréhensible par un humain (ou alors vraiment très entrainé !)

Utilisable par la machine

Page 5: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Premier programme (2)

int main(void) {

fputs(“hello world\n”);

}

implémentation

Page 6: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Premier programme (3)

int main(void) {puts("hello world\n");

}compilation

implémentation

$ gcc -out hello hello.c

Page 7: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Premier programme (4)

int main(void) {puts("hello world\n");

}compilation

implémentation

$ gcc -out hello hello.cexécution

$ ./hellohello world$

Page 8: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Les variables

Se déclarent avant les instructions

Ont un type Entier (int, short, ...) éventuellement “unsigned” Caractère (char) décimaux (float, double, ...)

Se convertissent

int i;float f;char c;

Page 9: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Utilisation de variablesint main( void ) {

int i;i = 0;if( i == 0 ) {

puts("i est nul\n"); }i=5;if( i == 0 ) {

puts("i est encore nul\n"); }

}

$ ./programme2i est nul$

Page 10: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Instructions conditionnelles

utilisation de « if »

pas de point-virgule après if ou else bonne habitude : toujours grouper les

instructions avec ' {' et '}' comparaisons

(a==b) (a!=b) (a<b) (a>b) (a) ...

if( condition ) {instructions;

} else {autres_instructions;

}

Page 11: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Boucles utilisation de « for »

exemple

for( initialisation; condition; iteration ) {instructions;

}

int main( void ) {int i;for( i=0; i<3; i++ ) {

printf("i vaut %d\n", i);}

}

$ ./programme_boucle_fori vaut 0i vaut 1i vaut 2$

Page 12: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Boucles (2)

while( condition ) {instructions;

}

int main( void ) {int i = 3;while( i < 6 ) {

puts("proj\n");i++;

}}

utilisation de « while »

exemple

$ ./programme_boucle_whileprojprojproj$

Page 13: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Boucles (3)

do {instructions;

} while( condition ) ;

autre utilisation de « while »

différence : le bloc « instructions » est toujours exécuté au moins une fois

A l'utilisation d'une boucle, toujours penser aux conditions d'entrée et de sortie.

Page 14: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Boucles : pratique

Pour un nombre de fois determiné :for( i=0; i<nb; i++ ) { instructions; }

Tant qu'une condition est vraiewhile( condition ) { instructions; }

Au moins une fois, et tant qu'une condition est vraie do { instructions } while ( condition );

En utilisant while, il faut que condition ait une chance de changer !!

Page 15: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Tests et conditions

sur les nombres : == != < > <= >= implicitement : '!=0'

opérateurs logiques (!cond) (cond1)&&(cond2) (cond1)||(cond2) importance des parenthèses

if( i ) {puts("i non nul");

}

int i=12;if( ((i%2)&&(i<6))|| (i>10) ) { ... } /*vrai*/if( (i%2) && ((i<6))||(i>10)) ) { ... } /*faux*/

Page 16: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Trucs et astuces

dans le doute, mettre des parenthèses et des accollades

les opérateurs unitaires ++ et - - pratiques à utiliser de préférence seuls

i++if( i ) { ... }/* plus lisible que */

if( ++i ) { ... }

Page 17: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Les fonctions Don't repeat yourself : factoriser le code

gain de place et de lisibilité code maintenable travail distribuable dans une équipe

int main(void) {int i=0;

i++;

i++;

i++;

}

printf("i vaut %d, et i-1 vaut %d",i,i-1);

printf("i vaut %d, et i-1 vaut %d",i,i-1);

printf("i vaut %d, et i-1 vaut %d",i,i-1);

int main(void) {int i=0;

affiche( i );i++;

affiche( i );i++;

affiche( i );i++;

}

void affiche( int v ) {printf("v vaut %d et v-1 vaut %d\n",v,

v-1);}

Page 18: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Les fonctions

ont un type de retour, ou void ne s'utilisent qu'après

avoir été implémentées avoir été déclarées .... et notre premier programme ?

$ gcc -Wall -out hello hello.chello.c: In function `main´:hello.c: warning: implicit declaration of function `puts´hello.c: warning: control reaches end of non-void function

Page 19: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Retour à hello.c

directive #include valeur de retour

#include <stdio.h>

int main(void) {fputs(“hello world\n”);return 0;

}

Page 20: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Pointeurs

c'est une variable qui contient une adresse memoire

il est typé : « pointeur vers un int », « pointeur vers un unsigned short », ...

« double sens » de la déclaration

a est un « int * » *a est un « int »

int *a;

Page 21: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Pointeurs accès à l'adresse d'une variable : par

l'opérateur & accès à la variable depuis le pointeur : par

l'opérateur *#include <stdio.h>int main( void ) {

int i = 0;int *p;p = &i;printf( "i=%d p=%p\n",i,p);i=5;printf( "i=%d p=%p\n",i,p);*p = 12;printf( "i=%d p=%p\n",i,p);

}

Page 22: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Tableaux

tableaux et pointeurs sont très proches déclaration:

p pointe vers le premier entier du tableau (p+1) pointe vers le second entier du tableau accès direct : p[0], p[1], ... plus rapide que (*(p+1))...

affectation à la déclaration :

int p[12];

int p[3] = { 2, 12, 42 };

Page 23: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Tableaux#include <stdio.h>

int main() { int foo [ ] = { 2, 12, 42 } ; int *p = foo; /* p vaut foo, donc &(foo[0]) */

printf("%d %d %d\n", foo[0], foo[1], foo[2]); printf("%d %d %d\n", p[0], p[1], p[2]); printf("%d %d %d\n", *foo, *(foo+1), *(foo+2));}

$ ./programme_tableau2 12 422 12 422 12 42$

Page 24: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Chaines de caractères

En C, pas de type spécifique On utilise des tableaux de char Qui se termine par un caractère nul : '\0'

char string1[] = { 'c','o','m','p','l','i','q','u','é',0};char string2[] = "plus simple";/* et même, pour les char* uniquement */char * string3 = "à la déclaration";

dernier caractère p[5] = 0 p[5] = '\0'

Page 25: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

« Hands on » !

Et n'oubliez pas ! Identez Faites des fonctions Privilégiez la lisibilité

Et en pratique Compilez avec « -Wall » Lisez les messages d'erreur !

Page 26: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Exercice 1

déclarer un tableau et le remplir d'entiers de 1 à 30 à l'aide d'une boucle

afficher son contenu afficher son contenu en ordre inverse

printf("la case %d vaut %d\n", indice, valeur );

Page 27: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Exercice 2

Lire une ligne tapée au clavier L'afficher Recommencer jusqu'à ce qu'on tape une ligne

vide (juste <entrée>)

fgets( ) ..... stdin

scanf(« %s » ......

Page 28: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Exercice 3

Même chose en affichant la ligne à l'envers.

Page 29: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Exercice 4

Lire plusieurs lignes au clavier jusqu'à l'entrée d'une ligne vide

Les afficher dans l'ordre inverse de saisie

Page 30: Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.

Pour les rapides

Ecrire une fonction qui inverse deux variables