Chapitre 2 : Les bases du C, partie 1Chapitre 2 : Les bases du C, partie 1 Alexandre Blondin Mass e...

Post on 24-Aug-2020

12 views 0 download

Transcript of Chapitre 2 : Les bases du C, partie 1Chapitre 2 : Les bases du C, partie 1 Alexandre Blondin Mass e...

Chapitre 2 : Les bases du C, partie 1

Alexandre Blondin Masse

Departement d’informatiqueUniversite du Quebec a Montreal

8 mai 2018Construction et maintenance de logiciels

INF3135

A. Blondin Masse (UQAM) 8 mai 2018 1 / 40

Table des matieres

1. Presentation du TP1

2. Variables et constantes

3. Structures de controle

4. Operateurs et conversions

5. Tableaux

6. Developper sous Git

A. Blondin Masse (UQAM) 8 mai 2018 2 / 40

Table des matieres

1. Presentation du TP1

2. Variables et constantes

3. Structures de controle

4. Operateurs et conversions

5. Tableaux

6. Developper sous Git

A. Blondin Masse (UQAM) 8 mai 2018 3 / 40

Table des matieres

1. Presentation du TP1

2. Variables et constantes

3. Structures de controle

4. Operateurs et conversions

5. Tableaux

6. Developper sous Git

A. Blondin Masse (UQAM) 8 mai 2018 4 / 40

Types de base

I Types numeriques :

Type Taille

char (signe ou pas) 1 octetshort (signe ou pas) 2 octetsint(signe ou pas) 2 ou 4 octetslong (signe ou pas) 4 octetsfloat 4 octetsdouble 8 octetslong double 16 octets

I Type vide : void. Definit le type d’une fonction sansvaleur de retour ou la valeur nulle pour les pointeurs.

A. Blondin Masse (UQAM) 8 mai 2018 5 / 40

Booleens

I Pas de type booleen natif.

I En C, la valeur 0 est consideree comme faux alors quetoutes les autres valeurs entieres sont considerees commevrai.

I Depuis le standard C99, il existe la librairie stdbool.hqui definit les constantes true et false ainsi que le typebool.

#include <stdbool.h>...bool valide = true;if (valide) {

printf("OK\n");} else {

printf("ERREUR\n");}valide = !valide;

A. Blondin Masse (UQAM) 8 mai 2018 6 / 40

Declaration des variables

Une variable

I doit etre declaree avant son utilisation, en debut de bloc;

I est visible seulement dans le bloc ou elle est declaree;

I peut etre initialisee lors de la declaration;

I non initialisee a un comportement imprevisible,puisque la valeur qu’elle contient peut etre quelconque;

char c = 'e';int a, b = 4;float x, y;unsigned int d = fact(10);

A. Blondin Masse (UQAM) 8 mai 2018 7 / 40

Constantes

I A l’aide de l’instruction #define :

#define PI 3.141592654

I Avec le mot reserve const :

const float PI = 3.141592654;// Ne fonctionne pas pour les dimensions des

tableaux

I A l’aide d’un type enumeratif :

enum {MAX_SIZE = 34

};// Seulement pour les constantes entieres

I Il est essentiel de declarer des constantes plutot que desvaleurs (magiques) directement dans les programmes.

A. Blondin Masse (UQAM) 8 mai 2018 8 / 40

Notation

I le suffixe u ou U pour indiquer une valeur non signee;

I le suffixe l ou L pour indiquer une valeur longue.

I le prefixe 0 indique une valeur octale; Par exemple, 064denote le nombre decimal 6× 81 + 4× 80 = 52.

I le prefixe 0x indique une valeur hexadecimale; Parexemple, 0X34 denote ce meme decimal3× 161 + 4× 160 = 52.

I Un caractere, entre apostrophes ’, est un nombre; Parexemple, ’4’ correspond au decimal 52 (code ASCII).

char i = 52, j = 064, k = 0X34, l = '4';printf("%d %d %d %d\n", i, j, k, l);// affiche : 52 52 52 52

A. Blondin Masse (UQAM) 8 mai 2018 9 / 40

Caracteres speciaux

Quelques caracteres utiles :

I \n, le caractere de fin de ligne;

I \t, le caractere de tabulation;

I \\, le caractere “backslash”;

I \’, l’apostrophe;

I \", les guillemets.

A. Blondin Masse (UQAM) 8 mai 2018 10 / 40

Table des matieres

1. Presentation du TP1

2. Variables et constantes

3. Structures de controle

4. Operateurs et conversions

5. Tableaux

6. Developper sous Git

A. Blondin Masse (UQAM) 8 mai 2018 11 / 40

Instruction for

for (<initialisation>; <condition>; <incrementation>){<instruction 1><instruction 2>...<instruction n>

}

I <initialisation> est evaluee une seule fois, avantl’execution de la boucle.

I <condition> est evaluee lors de chaque passage, avantd’executer les instructions dans le corps de la boucle;

I <incrementation> est evaluee lors de chaque passage,apres avoir execute les instructions dans le corps de laboucle.

A. Blondin Masse (UQAM) 8 mai 2018 12 / 40

Difference avec Java

I Attention, on ne peut declarer le type de l’iterateurdans l’initialisation qu’avec le standard C99.

I Par exemple, le fragment de code suivant ne compile pasavec le standard ANSI :

for (int i = 0; i < 10; ++i) {printf("Valeur %d du tableau : %d", i, tab[i])

}

I Il faut plutot ecrire

int i;for (i = 0; i < 10; ++i) {

printf("Valeur %d du tableau : %d", i, tab[i])}

A. Blondin Masse (UQAM) 8 mai 2018 13 / 40

Instructions if, else if and else

if (<condition>) {<instruction>

}

if (<condition>) {<instruction 1>

} else {<instruction 2>

}

if (<condition 1>) {<instruction 1>

} else if (<condition 2>)<instruction 2>

}

A. Blondin Masse (UQAM) 8 mai 2018 14 / 40

Blocs

I Un bloc est un ensemble d’instructions delimitees par desaccolades;

I Les accolades sont facultatives dans les structuresconditionnelles s’il n’y a qu’une seule instruction;

I Ainsi, les fragments suivants sont equivalents :

1.

if (!valide) printf("ERREUR");

2.

if (!valide)printf("ERREUR");

3.

if (!valide) {printf("ERREUR");

}

A. Blondin Masse (UQAM) 8 mai 2018 15 / 40

Instruction switch

switch (<variable>) {case <valeur 1> : <instruction 1>case <valeur 2> : <instruction 2>...case <valeur n> : <instruction n>default : <instruction n + 1>

}

I Les instructions case sont parcourues sequentiellement,jusqu’a ce qu’il y ait une correspondance.

I Si c’est le cas, l’instruction correspondante est executee,ainsi que toutes les instructions suivantes, tant que le motreserve break n’est pas rencontre.

I L’ordre d’enumeration n’est pas important si on trouveune instruction break dans chaque cas.

I Le cas default est optionnel.

A. Blondin Masse (UQAM) 8 mai 2018 16 / 40

Boucles while et do-while

Syntaxe :

while (<condition>) {<instruction 1><instruction 2>...<instruction n>

}

do {<instruction 1><instruction 2>...<instruction n>

} while (<condition>);

A. Blondin Masse (UQAM) 8 mai 2018 17 / 40

Instruction break et continue

I break permet de sortir de la boucle;

I continue permet de passer immediatement a l’iterationsuivante;

I Il est generalement a eviter d’utiliser plusieursinstructions break et continue dans la meme boucle.

A. Blondin Masse (UQAM) 8 mai 2018 18 / 40

Table des matieres

1. Presentation du TP1

2. Variables et constantes

3. Structures de controle

4. Operateurs et conversions

5. Tableaux

6. Developper sous Git

A. Blondin Masse (UQAM) 8 mai 2018 19 / 40

Operateurs arithmetiques

Operateur Operation Utilisation

+ addition x + y- soustraction x - y

* multiplication x * y/ division x / y% modulo x % y

Lorsque les deux operandes de la division sont des typesentiers, alors la division est entiere egalement.

A. Blondin Masse (UQAM) 8 mai 2018 20 / 40

Representation interne

Representation par le complement a deux :

-128

-127

-2

-1

0

1

2

127

=

=

=

=

=

=

=

=

sign

e

1

1

1

1

0

0

0

0

0 0 0 0 0

0 0 0 0 0

1 1 1 1 1

1 1 1 1 1

0 0 0 0 0

0 0 0 0 0

0 0 0 0 0

1 1 1 1 1

0

0

1

1

0

0

1

1

0

1

0

1

0

1

0

1

S’il y a debordement, il n’y a pas d’erreur :

signed char c = 127, c1 = c + 1;printf("%d %d\n", c, c1);// Affiche 127 -128

A. Blondin Masse (UQAM) 8 mai 2018 21 / 40

Operateurs de comparaison et logiques

Operateurs de comparaison

Operateur Operation Utilisation

== egalite x == y!= inegalite x != y> stricte superiorite x > y>= superiorite x >= y< stricte inferiorite x < y<= inferiorite x <= y

Operateurs logiques

Operateur Operation Utilisation

! negation !x&& et x && y|| ou x || y

Evaluation paresseuse pour && et ||.

A. Blondin Masse (UQAM) 8 mai 2018 22 / 40

Operateurs d’affectation et de sequencage

I =, +=, -=, *=, /=, %=;

int x = 1, y, z, t;t = y = x; // Equivaut a t = (y = x)x *= y + x; // Equivaut a x = x * (y + x)

I Incrementation et decrementation : ++ et --;

int x = 1, y, z;y = x++; // y = 1, x = 2z = ++x; // z = 3, x = 3

I Operation de sequencage : evalue d’abord les expressionset retourne la derniere.

int a = 1, b;b = (a++, a + 2);printf("%d\n", b);// Affiche 4

A. Blondin Masse (UQAM) 8 mai 2018 23 / 40

Operateur ternaire

<condition> ? <instruction si vrai> : <instruction si faux>

I Tres utile pour alleger le code;

I Tres utilise.

Quelles sont les valeurs affichees par le programme suivant ?

#include <stdio.h>

int main() {int x = 1, y, z;y = (x-- == 0 ? 1 : 2);z = (++x == 1 ? 1 : 2);

printf("%d %d\n", y, z);}

A. Blondin Masse (UQAM) 8 mai 2018 24 / 40

Operations bit a bit

Operateur Operation Utilisation

& et x & y| ou x | yˆ ou exclusif x ˆ y

I Souvent utilises pour combiner des options (flags);

I Par exemple, la fonction SDL Init :

...if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {

fprintf(stderr, "SDL failed to initialize: %s\n",SDL_GetError());

return NULL;}...

A. Blondin Masse (UQAM) 8 mai 2018 25 / 40

Types numeriques de base

I Plusieurs converstions (cast) se font automatiquement;

I Si un des operandes est long double, alors le resultat estegalement long double.

I Sinon, si un des operandes est double, alors le resultat estegalement double.

I Sinon, si un des operandes est float, alors le resultat estegalement float.

I Sinon, il y a promotion vers le type int et unsigned.

I Bref, evitez de melanger les types dans une memeoperation ou montrez les conversions de facon explicite.

A. Blondin Masse (UQAM) 8 mai 2018 26 / 40

Conversions implicites

Attention aux conversions implicites entre types signes et nonsignes.

#include <stdio.h>

int main() {char x = -1, y = 20, v;unsigned char z = 254;unsigned short t;unsigned short u;

t = x;u = y;v = z;printf("%d %d %d\n", t, u, v);// Affiche 65535 20 -2

}

A. Blondin Masse (UQAM) 8 mai 2018 27 / 40

Conversion de types

#include <stdio.h>

int main() {unsigned char x = 255;printf("%d\n", x);// Affiche 255printf("%d\n", (signed char)x);// Affiche -1int y = 3, z = 4;printf("%d %f\n", z / y, ((float)z) / y);// Affiche 1 1.333333

}

A. Blondin Masse (UQAM) 8 mai 2018 28 / 40

Priorite des operateurs

Arite Associativite Par priorite decroissante

2 gauche, droite ( ), [ ]2 gauche, droite ->, .1 droite, gauche !, ++, --, +, -, (int), *, &, sizeof2 gauche, droite *, /, %2 gauche, droite +, -2 gauche, droite <, <=, >, >=2 gauche, droite ==, !=2 gauche, droite &&2 gauche, droite ||3 gauche, droite ? :1 droite, gauche =, +=, -=, *=, /=, %=2 gauche, droite ,

A. Blondin Masse (UQAM) 8 mai 2018 29 / 40

Table des matieres

1. Presentation du TP1

2. Variables et constantes

3. Structures de controle

4. Operateurs et conversions

5. Tableaux

6. Developper sous Git

A. Blondin Masse (UQAM) 8 mai 2018 30 / 40

Tableaux

I Collection de donnees de meme type;

I Declaration :

int donnees[10];// Reserve 10 "cases" de type "int" en memoireint donnees[taille];// Seulement avec C99 et allocation sur la pile

I Definition et initialisation :

int toto[] = {12,-12,34,13,43};

I Stockees de facon contigue en memoire;

12 -12 34 13 43

A. Blondin Masse (UQAM) 8 mai 2018 31 / 40

Acces

I A l’aide de l’operateur [ ] :

#include <stdio.h>

int main() {int donnees[] = {12,-12,34,13,43};int a, b;a = donnees[2];b = donnees[5];

printf("%d %d\n", a, b);/* que vaut b ? */

}

I Le premier element est a l’indice 0;

I S’il y a depassement de borne, aucune erreur ou unavertissement (warning).

I Source frequente de segfault.

A. Blondin Masse (UQAM) 8 mai 2018 32 / 40

Chaınes de caracteres

I Les chaınes de caracteres sont representees par destableaux de caracteres;

I Les chaınes constantes sont delimitees par les symboles deguillemets " ".

I Les deux declarations suivantes sont equivalentes :

char chaine[] = "tomate";char chaine[] = {'t','o','m','a','t','e','\0'};

I Termine par le caractere \0;

I Longueur de la chaıne "tomate" : 6;

I Taille du tableau de la chaıne "tomate" : 7.

A. Blondin Masse (UQAM) 8 mai 2018 33 / 40

Table des matieres

1. Presentation du TP1

2. Variables et constantes

3. Structures de controle

4. Operateurs et conversions

5. Tableaux

6. Developper sous Git

A. Blondin Masse (UQAM) 8 mai 2018 34 / 40

Developper seul

I On entend parfois dire a tort que le logiciel Git n’est utileque lorsqu’on travaille en equipe.

I C’est pourtant tres utile :

I Permet de recuperer une ancienne version;

I Fournit naturellement une copie de sauvegarde;

I Permet de structurer le developpement;

I Constitue un aide-memoire de tout ce qui s’estpasse, etc.

I Dans votre TP1, vous aurez l’occasion de vous familiariseravec un developpement solitaire.

A. Blondin Masse (UQAM) 8 mai 2018 35 / 40

Depot Git

I Un depot Git est simplement un repertoire muni d’unhistorique Git;

I Tout l’historique se trouve dans un repertoire cache nomme.git, disponible a la racine du projet;

I Ainsi, si vous supprimez ce dossier cache, vous supprimezpar la meme occasion tout l’historique;

I Il existe des plateformes qui permettent d’heberger desdepots : Github, Bitbucket, GitLab, etc.

I On communique avec ces plateformes via des connexionsSSH ou HTTPS;

I Dans le cadre de ce cours, vous utiliserez GitLab.

A. Blondin Masse (UQAM) 8 mai 2018 36 / 40

Flux operationnel (workflow)

Initialisationgit initgit clone

Ajout/modificationgit add

Sauvegarde localegit commit

Sauvegarde distantegit push

Mise a jourgit pull

Dans le cadre du TP1 :

I Machine personnelle : utilise rarement git pull;

I Serveur Malt/Java : utilise rarement git push;

A. Blondin Masse (UQAM) 8 mai 2018 37 / 40

Initialisation

I Il y a deux facons possibles d’initialiser un repertoireversionne par Git :

I Avec la commande git init, lorsqu’on demarre unnouveau projet;

I Avec la commande git clone, lorsqu’on souhaiterecuperer une copie d’un projet existant.

I TP1, TP2 : vous devrez cloner des projets;

I TP3 : vous initialiserez vous-memes le projet.

I Si vous travaillez sur votre machine personnelle et quevous souhaitez verifier le comportement de votre projet surMalt ou Java, il suffira de cloner votre projet.

A. Blondin Masse (UQAM) 8 mai 2018 38 / 40

Commit (1/2)

I Un commit est une sauvegarde de l’etat de votre projet;

I git add pour ajouter un fichier ou une modification;

I Avant de faire un commit :

I Verifier l’etat de votre projet avec git status;

I Au besoin, verifiez les modifications avec git diff;

I Apres avoir fait un commit :

I Le projet devient en etat propre (clean);

I Il est ensuite possible de faire git push, mais pasnecessaire.

A. Blondin Masse (UQAM) 8 mai 2018 39 / 40

Commit (2/2)

I Le message de commit est tres important :

I La premiere ligne doit etre courte (50 caracteres oumoins);

I Si necessaire, on ajoute des paragraphes, separes pardes lignes vides;

I Eviter les messages bilingues : choisir une langue ets’y tenir.

I Il faut faire des commits atomiques, c’est-a-dire qu’ilseffectuent une modification tres precise, qu’on peutdecrire facilement;

I git log devrait bien resumer l’histoire du projet;

I TP1 : visez entre 10 et 40 commits.

A. Blondin Masse (UQAM) 8 mai 2018 40 / 40