$ mkdir
rep_de_mon_projet
$ cd rep_de_mon_projet$ emacs tutoriel.cpp
Vous êtes alors prêts pour
taper
votre code !#include
<stdio.h>
int main(void)
{
printf("bonjour!");
return
0;
}
$ gcc tutoriel.cpp
Cette action aura pour effet de
générer un fichier binaire a.out dans
le
répertoire courant.for (;;)
{
for (;;)
{
if (true)
{
// niveau 3 d'indentation
}
}
}
les indents ne sont pas obligatoires mais améliorent
largement la lisibilité du programme.long SuperFonction(int
arg1); // ceci est une déclaration de
fonction, autrement dit, un prototype.short toto; // ceci
est la déclaration de la variable toto
| désignation du type |
nom du type |
taille occupée |
| int |
integer |
4 octets |
| long |
long integer |
4 octets |
| long long |
long long integer |
8 octets |
| float |
floating point single precision |
4 octets |
| double | floating point double precision | 8 octets |
| short |
short integer |
2 octets |
| char |
character |
1 octet |
| long double |
floating point very large
precision |
10 octets |
| bool |
booléen |
1 octet |
signed int truc;
unsigned short variable;
Ce code à pour effet de créer une variable truc
qui peut stocker des nombres de -2 147 483 648 à +2147483647.
#include <stdio.h>
int main(void)
{
int nombre;
double nb2;
nombre = 55;
nb2 = nombre;
nb2 = nb2 +
nombre;
printf("nombre
vaut: %d\nnb2 vaut: %f\n", nombre, nb2);
nb2 = nb2 + 0.5;
printf("maintenant nombre vaut: %d\net nb2 vaut: %f\n", nombre, nb2);
return 0;
}int var;
var = 4500;
printf("%d", var);printf("%d%d%d", var1, var2, var3);
Il existe aussi la possibilité de passer
à la ligne avec la séqence d'échappement \n.typedef unsigned char byte;
byte supervar;char var;
char* PointeurVersChar;
PointeurVersChar = &var;
char
var = 0;
char* Pointeur = 0;
par exemple.long var;
var = 0;long var;
long* ptr;
ptr = &var; // assignement de l'adresse de la variable
'var'
*ptr = 0; // indirectionconst unsigned char c = 2;
une constante
est OBLIGATOIREMENT initialisée, car par la suite elle est
inaccessible en écriture, donc elle serait inutile
non-initialisée.
#define SUPERCONSTANTE 500
cette
ligne aura pour effet de remplacer toutes les occurences du texte
SUPERCONSTANTE par 500 dans le code avant la compilation (au passage du
préprocesseur)
int var = 0;
var = var + 9;int MonTablo[50];unsigned char MonTabloDeChars[22];double GrosTablo[20][40];MonTableau[0] = 85;
ce
bout de code assigne la valeur 85 à la première variable
du tableau 'MonTablo', 85 est un nombre acceptable puisque ce tableau
est de type int.type table[2][3];
la figure suivant représente tous les
éléments de
ce tableau:
#include <stdio.h>
#include <time.h>
int main(void)
{
float table[5];
int var = 0;
table[var] = time(0) % 80 + 0.5f;
table[1] = table[var];
table[2] = table[1] - 89.23f;
var = 4;
table[3] = table[var] = table[2] + 11.1f; //
ligne n°13
printf("voici un affichage de la liste:\n%f %f %f %f
%f\n", table[0], table[1], table[2], table[3], table[4]);
return 0;
}int Tablo3Dims[10][20][40];Tablo3Dims;
&Tablo3Dims[0];
des alias !*Tablo3Dims;
Tablo3Dims[0];
en réalité l'opérateur [x] déréférence le
pointeur
pour acceder à la variable contenue à l'adresse
"débuttableau + x * tailledutype".
long vardetypelong;
sizeof(long);
sizeof(vardetypelong);double tablo[5];
tablo + 4; // ceci pointe sur le dernier
élément du tableau
&tablo[4]; // cette ligne est un alias de la
ligne du dessus !int
tab[5];*(tab + 2)
est l'équivalent de tab[2]printf("je suis un humain\n");
ceci
est l'appel le plus simple de la fonction printf, on ne lui envoie
qu'un seul argument.#include <stdio.h>
#include <string.h>
int main(void)
{
char chaine[400];
strcpy(chaine, "super voila ma chaine");
printf("%s", chaine);
printf("\nlongueur du texte: %d caracteres\n",
strlen(chaine));
strcat(chaine, ", de plus etant donne sa taille on
peut l agrandir");
printf("\n\n%s\n\n", chaine);
return 0;
}short toto = 50;
ceci est une initialisation, mais aussi un assignement,
on assigne 50
à la variable toto.int var1 = 20, var2 =
3; // il est possible de déclarer plusieurs variable
de type int en séparant par des virgules
float resultat;
resultat = var 1 / var2; // resultat va contenir la
division entière de 20 par 3, soit 6.
printf("sans cast: %f\n", resultat);
/* tandis que dans un cas comme celui la: */
resultat = (float)var1 / var2;
printf("avec cast: %f\n", resultat);
-
le %int var1 = 20, var2 = 3, resultat,
reste;
resultat = var1 / var2;
reste = var1 % var2;
printf("division de %d par %d, quotient: %d, reste: %d\n", var1, var2,
resultat, reste);
-
le ++ et le --int var 0;
var++;
// maintenant var vaut 1
var--;
maintenant var vaut de nouveau 0
en fait ce sont les équivalents de var = var + 1
ou var =
var - 1 mais avouez que c'est plus rapide à écrire ! :)int var;
var = var + 50; // est équivalent à:
var += 50;
ou:
int var;
var = var / 2; // est équivalent à:
var /= 2;
ou encore:
int var;
var = var * 5; // est équivalent à:
var *= 5;
-
2 - 2 - les opérateurs de bitbool b, c;
b = true;
c = !b;bool b, c, d;
b = false;
c = true;
d = b && c; // b est l'opérande de gauche, c
celle de droite
x = x << 2;x >>= 1;x = ~x;int main(int argc, char* argv[])
Il s'agit d'une
déclaration/définition classique de la fonction main.#include <stdio.h>
int ajoute(int nombre1, int nombre2); // prototype de la fonction
"ajoute" (on parle souvent de déclaration)
int main(void)
{
printf("ajout de 500 avec 400: %d\n", ajoute(500,
400)); /* c'est grace au prototype que le compilateur sais ce que
veut dire "ajoute" à cet endroit du programme */
return 0;
}
int ajoute(int nombre1, int nombre2) // ceci est la
définition = l'endroit où a été
codée la dite fonction
{
return nombre1 + nombre2;
}
comme vous le
voyez cette fois il y a 2 blocs de fonctions dans notre programme, le
2eme bloc est la definition de
notre fonction.#include
<stdio.h>
int
ajoute(int nombre1, int nombre2)
{
return nombre1 + nombre2;
}
int main(void)
{
printf("ajout de 500 avec 400: %d\n", ajoute(500,
400)); /* c'est parce que la fonction a été
définie au dessus que le compilateur connais le mot 'ajoute' */
return 0;
}
Les arguments
ici sont nombre1 et nombre2. la valeur de retour de la fonction est de
type int. les 2 arguments sont du meme type.#include <stdio.h>
void retour(void);
int main(void)
{
printf("salut");
retour();
printf("c'est moi");
retour();
return 0;
}
void retour(void)
{
printf("\n");
}
Il est impossible de déclarer une variable
du type void, par contre void* oui car c'est un type
pointeur donc de taille connue, cependant le compilateur ne pourra pas
vous aider lors des déréférencements sur les
prédicats des types à respecter.#include <stdio.h>
void changevar(int valeur);
int main(void)
{
int var;
changevar(56);
printf("%d", var);
return 0;
}
void changevar(int valeur)
{
var = valeur;
}
si vous essayez de compiler ceci vous vous apperçeverez
que votre compilateur râle.#include <stdio.h>
void changevar(int valeur);
int var; // var étant déclarée à
l'exterieur de main, elle est maintenant globale
int main(void)
{
changevar(56);
printf("%d\n", var);
return 0;
}
void changevar(int valeur)
{
var = valeur;
}
vous pourrez constater que ceci compile et s'execute
parfaitement.#include <stdio.h>
void ajoute(int nb1, int nb2, int resultat);
int main(void)
{
int res = 0;
ajoute(2, 3, res);
printf("%d\n", res);
return 0;
}
void ajoute(int nb1, int nb2, int resultat)
{
resultat = nb1 + nb2;
return; // ce return est facultatif dans un
cas ou la fonction est de type void.
}
#include <stdio.h>
void ajoute(int nb1, int nb2, int* resultat);
int main(void)
{
int res = 0;
ajoute(2, 3, &res);
printf("%d\n", res);
return 0;
}
void ajoute(int nb1, int nb2, int* resultat)
{
*resultat = nb1 + nb2;
return; // ce return est facultatif dans un
cas ou la fonction est de type void.
}#include <stdio.h>
#include <time.h>
int main(void)
{
int pif;
pif = time(0) % 2; // pif est
pseudo-aléatoire entre 0 et 1
if (pif == 0)
{
printf("vaut 0\n");
}
else
{
printf("vaut 1\n");
}
return 0;
}
voici un
programme qui affiche une phrase différente selon la valeur de
pif, si pif vaut 0, ou si pif vaut autre chose.
#include <stdio.h>
int main(void)
{
int var;
scanf("%d", &var);
if (var > 0)
{
printf("var positive\n");
}
else if (var == 0) // c'est
possible car > 0 n'inclu pas 0
{
printf("la var vaut
précisement 0\n");
}
else
{
printf("var
négative\n"); // si ce n'est pas supérieur
à 0 ou égal à 0.
}
return 0;
}
Dans ce programme j'utilise la fonction scanf qui
permet de
récupérer une entrée au clavier de l'utilisateur.
Ici un nombre entier décimal que l'on stockera dans var, c'est
pour cela que scanf demande un pointeur; j'ai donc
déréferencé var grâce à
l'opérateur adress-of (&).var == 0 équivaut à !varvar != 0 équivaut à var
switch#include <stdio.h>
int main(void)
{
int var;
scanf("%d", &var);
switch (var)
{
case 0:
printf("var vaut 0\n");
break;
case 1:
printf("var vaut 1\n");
break;
default:
printf("var vaut autre chose que
1 ou 0\n");
break;
}
return 0;
}
break est une instruction du langage qui permet
les saut dans le code, un break dans le cas d'un switch sort du bloc du
switch.#include <stdio.h>
int main(void)
{
int i;
for (i = 0; i < 50; i++)
{
printf("%d\n", i);
}
return 0;
}
Il est necessaire de commenter
l'instruction for utilisée ici.#include <stdio.h>
#include <time.h>
int main(void)
{
int limite;
if (time(0) % 20 < 10)
{
limite = 10;
}
else
{
limite = 19;
}
do
{
} while (time(0) % 20 < limite);
return 0;
}#include <stdio.h>
#include <time.h>
int main(void)
{
do
{
} while (time(0) % 10 < 9);
return 0;
}#include <conio.h>
int main(void)
{
while (!_kbhit())
{
}
return 0;
}
Dans ce programme le while
est placé au dessus, dans ce cas, le do ne doit pas être
écrit.#include <conio.h>
#include <stdio.h>
#include <windows.h>
void attentouche(void);
void cls(HANDLE h);
void posi(HANDLE h, short x, short y);
void couleur(HANDLE h, WORD coul);
int main(void)
{
// change le titre de la console:
SetConsoleTitle("tutoriel de Lightness1024!");
// affiche une phrase de bienvenue:
printf("Bienvenue au programme du tutoriel de
Lightness1024!\n");
printf("appuyez sur une touche");
// attend l'appuis sur une touche, cette fonction
à été définie plus bas
attentouche();
HANDLE cons; // un handle est une "poignée"
en anglais, ce handle va permettre la gestion de la console
cons = GetStdHandle(STD_OUTPUT_HANDLE); //
récupère le handle de la sortie standard
// vous pouvez remarquer que la valeur
STD_OUTPUT_HANDLE est une constante, elle a été
définie dans le header windows.h
bool exitboucle = false; // ce type de
variable de controle est un flag (drapeau)
for(;;) // boucle infinie sans condition, je
préfère ceci a 'do {..} while(true)' car ca ne
génère pas de warnings
{
cls(cons); // efface la
console
couleur(cons, 11); // bleu
clair
posi(cons, 20, 0); //
change la position du curseur
printf("---Menu---");
couleur(cons, 10); // vert
clair
posi(cons, 5, 7);
printf("1 - c'est parti !");
posi(cons, 5, 8);
printf("2 - a propos");
posi(cons, 5, 9);
printf("3 - quitter");
int clavier;
clavier = _getch(); //
récupération d'une touche
switch (clavier) // quoi
faire en fonction de la touche appuyée
{
case '1':
exitboucle =
true;
break;
// le break positionné ici sort du switch
case '2':
cls(cons);
printf("Lightness1024! ProgrammatO E.U.R.L.\n");
printf("programme associe au tutoriel C++\n");
attentouche();
break;
case '3':
return
0; // sort de la fonction main, donc arrête le programme
}
// pour une seule instruction,
les {} ne sont pas necessaires
if (exitboucle)
break;
// le break positionné ici sort de la boucle for
}
cls(cons);
for (int coul = 0; coul < 32; coul++)
{
char ch;
couleur(cons, coul);
for (ch = 33; ch < 127; ch++)
{
printf("%c",
ch);
}
printf("\n");
}
attentouche();
return 0;
}
void attentouche(void)
{
while (!_kbhit())
{
}
_getch();
}
void cls(HANDLE h)
{
COORD c; // structure contenant un x et un y
c.X = 0;
c.Y = 0;
FillConsoleOutputCharacter(h, ' ', 1000, c,
NULL); // pour effacer on remplis de bcp de caractere espace
SetConsoleCursorPosition(h, c); // ensuite on
remet le curseur en haut
}
void posi(HANDLE h, short x, short y)
{
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(h, pos);
}
void couleur(HANDLE h, WORD coul)
{
SetConsoleTextAttribute(h, coul); // les
couleurs sont les 16 couleurs classiques
// 0 = noir
// 1 = bleu foncé
// 2 = vert foncé
// 3 = bleu gris foncé
// 4 = rouge foncé
// 5 = majenta foncé
// 6 = marrons foncé
// 7 = gris clair
// 8 = gris foncé
// ajoutez 8 aux valeurs pour avoir du clair
// ajoutez 16 pour que ca soit le fond du texte
}struct NomDeLaStructure
{
TypeDeDonnee VariableQuelquonque;
TypeAutre AutreVariable;
....
....
};struct NomDeLaStructure NomDeLaVar;
Acceder
aux éléments comme ceci:NomDeLaVar.VariableQuelquonque =
MachinDeTypeCompatible;#include <stdio.h>
typedef struct JOUEUR_
{
bool humain;
char* nom;
long points;
bool actif;
} JOUEUR; // ceci est la différence entre un tag et un nom
de structure, ici le type JOUEUR existe désormais
int main(void)
{
JOUEUR joueur[5]; // on créer 5 joueurs
int nb;
printf("combien voulez vous de joueurs ? (entre 2 et
5):\n");
scanf("%d", &nb);
if (nb > 5)
nb = 5; //
sécurité au cas ou l'utilisateur ait tapé plus de 5
if (nb < 2)
nb = 2;
char noms[4][30]; // la zone de mémoire
ou sont réelement stockés les noms !
int i;
for (i = 1; i < nb; i++)
{
joueur[i].actif = true;
joueur[i].humain = true;
joueur[i].points = 0;
printf("quel est le nom du joueur
%d ?:", i);
scanf("%29s", noms[i - 1]);
// le 29 permet de ne copier qu'un maximum de 29 caractères dans
l'espace mémoire
joueur[i].nom = noms[i -
1]; // ceci n'est qu'un pointeur vers le nom !
}
for (i = nb; i < 5; i++) // on initialise
tout de meme le reste
{
joueur[i].actif = false;
}
joueur[0].humain = false; // le premier joueur
c'est l'ordinateur
joueur[0].nom = "ordinateur";
printf("\nnous avons donc:\n");
for (i = 0; i < nb; i++)
{
printf("%s, joueur %d\n",
joueur[i].nom, i);
}
return 0;
}MegaStruct maStruct;
MegaStruct* p_maStruct = &maStruct;
(*maStruct).uneVariableMembre = ceci;MegaStruct maStruct;
MegaStruct* p_maStruct =
&maStruct;
maStruct->uneVariableMembre =
ceci;
#include <stdio.h>
#define PI 3.14159 // constante
#define Radian(degres) ((degres) * (PI / 180.0f)) // macro
int main(void)
{
float angle;
angle = 360;
angle = Radian(360);
printf("%f\n", angle);
return 0;
}
Il
existe presque le même principe avec les fonctions, ce sont les
fonctions déclarées inline.
#define MAX(x, y) (x > y ? x : y)
si vous décidez d'appeller cette
macro en faisant comme ceci: MAX(var1++, var2);