Upload
others
View
16
Download
0
Embed Size (px)
Citation preview
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