Langage C 2013-2014 2013-2014 Ceci est le compte-rendu / cours fait par Groupe n°2 du GE1S4 (ENIS). Ce cours de C utilise le support de cours de Mr Hafedh Trabelsi, professeur à l’ENIS ainsi que ses remarques données (et collectés) en classes. En addition de quelques petites informations/petit projets extraits depuis les outils de « Ahmed Yahia Kallel » et sources codes des projets/jeux codés en C. Cours :: Compte- Rendu Par Groupe 2 : Ahmed Yahia KALLEL , Ahmed Derbel , Ahmed Kammoun, Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane Professeur : Mr Hafedh Trabelsi
Ceci est un cours-compte-rendu concernant la programmation en langage C. Les notions abordés sont de bases avec un peu de notions avancés où on a expliqué ce qu'il faut savoir lors de la programmation.
Basé sur le cours de Mr Trabelsi Hafedh
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Langage C
2013-2014
2013-2014Ceci est le compte-rendu / cours fait par Groupe n°2 du GE1S4 (ENIS). Ce cours de C utilise le support de cours de Mr Hafedh Trabelsi, professeur à l’ENIS ainsi que ses remarques données (et collectés) en classes. En addition de quelques petites informations/petit projets extraits depuis les outils de « Ahmed Yahia Kallel » et sources codes des projets/jeux codés en C.
Cours :: Compte-Rendu
Par Groupe 2 :
Ahmed Yahia KALLEL , Ahmed Derbel , Ahmed Kammoun, Aymen Baccari, Ghazi Zouari, Mohamed Allouch,
Wassef Chaaben, Zied Omrane
Professeur :
Mr Hafedh Trabelsi
GE1 S4 Journal de C
1 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
Journée 1 : Introduction…!
Pourquoi programmer en C ?
Elle est proche du langage machine
Elle est rapide et plus performant (excluant le cas du CLR)
Elle est très populaire et utilisé partout
C, depuis quand ?
Langage C est plus ou moins ancienne (développé par Dennis Ritchie et co. en 1972). Mais, ceci ne reflète pas la
fréquence d’utilisation du C (et C++) aujourd’hui, en effet : ordre de popularité :
- C et C++
- C# et Visual Basic
- Java
C ou C++ ?
Le C et C++ sont 2 langages différents. En effet, C++ c’est C avec les classes.
Ceci ne veut pas dire que C++ est la nouvelle version de C ! En effet il est possible d’avoir un code qui ne marche que
sur C et un code qui ne marche que sur C++.
C’est comme l’Arabe et L’arabe de dialecte Tunisienne : On ajoute des mots dans les 2 dictionnaires, essayez de dire
dans un contexte Tunisien, la réponse (avancer) « زلفت » dans un essai en arabe ! De même, essayez de dire « وقتاش »
va être « Qu’est-ce que vous avez avalez » et pas comme en Arabe native « Qu’est-ce que s’est avancé ».
C, B , A ,D ! ?
Oui, Avant C, il y avait ADA c’est « A », puis BCPL c’est « B », alors si on voulait ajouter un autre langage ça serait
« C ». Il y a aussi des autres langages tel que D, F# etc…
Au cours de notre « cours- compte-rendu » on a utilisé Word, Notepad++, Code ::Blocks et Visual C++ 2008 Express.
GE1 S4 Journal de C
2 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
Passons alors vers une chose plus sérieuse !
Le processus de création d’un exécutable
Le compilateur essaie de lire tout le programme d’un seul coup :
1. Il cherche s’il y a des erreurs de syntaxes
2. Vérifie les variables
3. Crée un fichier d’extension .o ou .obj qui contient tout ce qui est nécessaire pour compiler le programme
4. Il édit les liens (vers les bibliothèques)
5. Il exécute le programme
Par exemple : l’output du compilateur de Visual STUDIO 9 (2008) sur son IDE principal
Process terminated with status 0 (0 minutes, 3 seconds)
0 errors, 1 warnings (0 minutes, 3 seconds)
Enfin, il faut brièvement mentionner qu’il existe trop d’IDE de C, nous en citons : - Code :: Blocks (Windows, Linux et MacOS) - Visual Studio (Windows) - CodeLite (Windows, Linux) - Dev-C++ (Windows…) - Eclipse et NetBeans (avec Plugin C++) [Windows, Linux et MacOS]
Baah, and pour les professionnels, vous avez toujours votre ‘Emacs’ ou Notepad++
Compilation Edition de liens Exécution
GE1 S4 Journal de C
3 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
Journée 2 : Langage++, Réel et entiers !
Se familiariser avec C
Comment coder : Commentaires, Puts, printf, scanf
S’introduire aux nombres
Journée 2
1. Hello world
2. Header
3. Body :
a) printf
b) les entiers
c) les décimaux
d) différentes bases
[par cast]
4. Exercice d’application
5. Formatage
GE1 S4 Journal de C
4 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
Hello World !
#include <stdio.h>
#include <conio.h>
//notre fonction : Hello World !
void main() {
puts("Bonjour!");
int a,b, somme;
a = 2;
b = 1;
somme = a+b;
printf("Votre Somme est:%d",somme);
}
Donc, voici notre premier code en C ! Maintenant, pour comprendre tout le programme, il faut comprendre comment on code en C ! Chaque code codé en C comporte un « header » et un « body ».
Header
#include <stdio.h>
#include <conio.h>
#include permet d’importer des bibliothèques les fonctions nécessaires pour faire marcher le code : Sans « stdio.h » par exemple, on ne peut pas utiliser « printf ». Par exemple, dans le code source du ‘object.cpp’ tiré du jeu vidéo « Re-Volt » , le header est ceci (modifié un peu) :
#include "weapon.h" //$REVISIT: Hack to fix improper freeing of electro pulse
GE1 S4 Journal de C
5 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
Body
C’est la partie « programme ! » //notre fonction : Hello World !
void main() {
puts("Bonjour!");
int a,b, somme;
a = 2; /* a reçoit 2*/
b = 1;
somme = a+b;
printf("Votre Somme est:%d",somme);
}
Il est noté que pour faire un commentaire (remarques, ne sera pas exécuté) on peut :
- Ajouter « // » avant la phrase - Ajouter « /* » avant la phrase/paragraphe et finir par « */ » (dite commentaire multi-ligne)
Donc, notre programme est
void main() {
puts("Bonjour!");
int a,b, somme;
a = 2;
b = 1;
somme = a+b;
printf("Votre Somme est:%d",somme);
}
Dans les langages C (C, C++, Java, QT, Javascript, C# etc…) le mot fonction n’existe vraiment pas. Devant chaque nom de fonction, on écrit le type d’output de la fonction. Exemple, on voulait coder une fonction f(x) = 2*x + 1
float f(x) {
return x*2+1;
}
(voir les types des variables)
Ainsi, notre fonction « main » ne va pas vraiment de retourner une variable, donc pour cela on écrit « void » main où void = vide/rien (en fr.)
Et comme C est un langage C-ien , les variables et instructions doivent finir par « ; » Et doivent être case-sensitive ! On n’écrit pas « float A ; » puis printf(« %d »,a) ;
Pour afficher un message et revenir en ligne on écrit :
puts("Bonjour!");
Ceci est pratiquement équivalent avec printf("Bonjour!\n");
GE1 S4 Journal de C
6 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
ATTENTION :
Pour pouvoir utiliser puts il faut importer conio.h
et pour utiliser printf il faut importer stdio.h
Pour les variables, en C, il existe plusieurs types de variables tels que :
Type Keyword Exemple
Entier* int int a ; a = 2.5 ; a = 2
Réel* float float a ; a=5.0/2 ; a = 2.5
Caractère* char char c; c=’a’; c= ‘a’
Void (le rien) void void main()
Le caractère est une représentation d’un entier en tant qu’un dessin ASCII, ainsi, on utilisera le char comme un entier.
Entiers
Type Range Exemple Taille mémoire Formatage
char -27 27 - 1 char a ; a=65 ; a=’A’
1 octet %c
unsigned char 0 28 unsigned char b ; 1 octet
short -215 215 - 1 short a ; 2 octets
Unsigned short 0 216 unsigned short a ; 2 octets
int -231 231 - 1 int a ; 4 octets %d
unsigned int 0 232 unsigned int c ; 4 octets %u long -2
63 2
63 - 1 long a ; 8 octets %ld
unsigned long 0 264
unsigned long alpha ; 8 octets
Note : Long n’est pas toujours défini (les anciens compilateurs ne le comprennent pas), mais fait partie du C90 !
Réel
Type Exemple Taille mémoire Formatage
float float a ; 4 octets %f et %g
double double b ; 8 octets %f et %g
2ème programme ! (combinaison exercices 1 et 2)
On veut programmer un programme qui 1. lit un entier non signé 2. Affiche son code ASCII 3. Affiche son code hexadécimal 4. Affiche son code octal
GE1 S4 Journal de C
7 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
#include <conio.h>
#include <stdio.h>
void main() {
unsigned int a;
printf("Donner un entier non signé :");
scanf("%u",&a);
printf("code ascii: %c\n",a);
printf("code hex: %x\n",a);
printf("code oct: %o\n",a);
getch();
}
On a déclaré notre variable « unsigned int a; » (Mon entier n’est pas signé , Hélas……)
On a écrit à l’utilisateur de donner un entier printf("Donner un entier non signé :");
Puis on a commandé l’ordinateur de lire la valeur du clavier à travers « scanf » scanf("%u",&a);
Enfin, on a fini par lecture d’un caractère getch();
Puis, on a converti le code entré en utilisant les formats
Clôturons !
printf Permet de formatter et afficher un texte
scanf Permet de lire en format un entré (du clavier) getch Lit un seul caractère
Formatage
On dit qu’un texte est formaté s’il est écrit sous une forme prédéfinie !
Pour formater un texte en C, il suffit juste d’écrire :
printf("%d+%d=%d!!!",a,b,a+b);
Pour comprendre comment ça marche, soient a = 3, b = 12
printf("%d+%d=%d!!!",a,b,a+b);
donne
Execution
3+12=15!!!
Les listes des formats sont affichés ci-dessus. On peut aussi ajouter :
%x : afficher en base hexadécimal
%o : Afficher en base octale
GE1 S4 Journal de C
8 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
Journée 3 : C
Maîtriser Printf / différents méthodes de E/S
Voir les différentes Opérateurs (normales et combinés)
S’introduire aux constantes
Voir comment on peut faire des « casts »
S’introduire à « if » et « while » ainsi que les expressions logiques
Journée 3
1. Caractère spéciaux
2. Opérateurs
3. Fonctions
d’affichage/entrer
4. getchar(), getch() ?
5. Petit projet sur
« Décalage »
6. sizeof()
7. Opérateurs combinés
8. Constantes
9. Cast
10. Boucles et conditions
(1)
a) If
b) expression logiques
c) petit projet
d) while
GE1 S4 Journal de C
9 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
\r\n est la retour à la ligne utilisé sur Windows (eq. CRLF)
Exercice 1 : Créer un programme qui permet d’entrer un chiffre flottant (réel)
#include <stdio.h> #include <conio.h>
void main()
{
float f;
printf("Donner un Reel:");
scanf("%f",&f);
printf("Vous avez entré %f!",f);
getch();
}
Donner un Réel: 12.3
Vous avez entré 12.300000!
Exercice 2(SUPPORT=4): Tester le programme suivant et conclure
#include <stdio.h>
#include <conio.h>
void main()
{
char c;
c = 'A';
printf("decimal = %d \t ASCII = %c\n",c,c); //c est le caractère alphanumérique A
puts("Pour continuer frapper une touche...");
getch(); //attente d'une saisie de clavier
}
Réponse : Type char est un entier !
decimal = 65 ASCII = A
Pour continuer frapper une touche...
GE1 S4 Journal de C
10 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
Opérateurs
Réels : + - * /
Entiers : + - * / %
Booléens : & | ~ << >>
Exercice 3(SUPPORT =8): a, b sont des réels : a=-21.43 b=4.782.
Calculer et afficher a+b, a-b, a*b, a/b en soignant l’interface homme/machine
#include <stdio.h>
#include <conio.h>
void main()
{
float a,b;
a=-21.43;b=4.782;
printf("%.3f+%.3f=%.3f\n",a,b,a+b);
printf("%.3f-%.3f=%.3f\n",a,b,a-b);
printf("%.3f*%.3f=%.3f\n",a,b,a*b);
printf("%.3f/%.3f=%.3f\n",a,b,a/b);
getch();
}
-21.430+4.782=-16.648
-21.430-4.782=-26.212
-21.430*4.782=-102.478
-21.430/4.782=-4.481
%.3f = Affiche 3 chiffres après la virgule. (%.2f = 2 chiffres après la virgule)
Exercice 4: a, b sont des entiers : a=-21 b=4.
Calculer et afficher a+b, a-b, a*b, a/b et a%b en soignant l’interface homme/machine
#include <stdio.h>
#include <conio.h>
void main()
{
int a,b;
a=-21;b=4;
printf("%d+%d=%d\n",a,b,a+b);
printf("%d-%d=%d\n",a,b,a-b);
printf("%d*%d=%d\n",a,b,a*b);
printf("%d/%d=%d\n",a,b,a/b);
getch();
}
Reste de
la division
Quotient de
la division
Division
normale
ET OU Complément
à 1 Décalage à
gauche
Décalage à
droite
GE1 S4 Journal de C
11 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
Exécution
-21+4=-17
-21-4=-25
-21*4=-84
-21/4=-5
Autres fonctions de sorties
Commande Equivalent
puts(str) printf(str) ;printf(‘’\n’’) ;
putchar(car) printf(“%c”,car);printf(“\n”);
c=getch()
c=getchar() scanf(“%c”,&c);
Getchar et GetCh
getchar() et getch(), tous les deux appartiennent à « stdio.h ».
- getch() retourne le code du caractère juste après taper une touche .
- getchar() attend jusqu’à ce que « entrée » est appuyé puis retourne le premier caractère. equiv.
scanf(“%c”,&c);
c =getch() ;
« attendre jusqu’à ce qu’une touche est tapée » « Retourne le code ASCII du caractère » (fin fonction)
c=getchar() ;
« Une fois code tapé, affiche le dans le console » « Retourne le premier caractère » (fin fonction)
Décalage ? C’est quoi ça ???
PETIT PROJET A: Chaque couleur (sur l’écran) peut être représenté sous la forme de « couleur 24-bits » (RGB) ou « couleur 32-bits » (ARGB ou RGBA)
Chaque couleur est le mélange de 3 couleurs principaux codés chacun sur un octet (Rouge, Vert (Green) et Bleu) d’où le nom RGB.
Par exemple
Rouge : R=255 , G=0, B=0
Noir : R=0, G = 0, B = 0
Blanc : R=255, G=255, B=255
Ainsi on peut coder alpha qui définit l’opacité du couleur, (dit bit d’opacité ou bit de transparence) de la manière suivante : Alpha = 255 opaque , Alpha = 0
transparent, alpha = 128 semi transparent
Pour minimiser le taux de transfert, on code le couleur sous la forme d’un « code couleur » compréhensible par la carte graphique.
De nos jours, la plupart des cartes graphiques supporte « code couleur 32-bits » (auparavant était juste 16-bits puis 24-bits)
GE1 S4 Journal de C
12 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
Un code ARGB est codé de la manière suivante :
Alpha Rouge Vert Bleu
Bits : 32 24 16 8 0
Par exemple : pour ARGB = (255,0,128,0) : le code couleur est : 4278222848
Notre groupe se propose d’écrire un code C qui permet de coder un code couleur !
Et pour simplifier le programme :
on va utiliser « int » au lieu d’ « unsigned char » (byte)
On va assumer qu’existe un type dit « uint » (unsigned integer) défini comme ci-suit (avant void main) : typedef unsigned int uint;
On ne va pas utiliser la somme, mais les remplacer par « ou » (pour éviter directcast à chaque décalage)
#include <stdio.h>
typedef unsigned int uint;
void main()
{
int a,r,g,b;
uint c;
printf("Donner Alpha:");
scanf("%d",&a);
printf("Donner R:");
scanf("%d",&r);
printf("Donner G:");
scanf("%d",&g);
printf("Donner B:");
scanf("%d",&b);
c = (a<<24) | (b<<16) | (g <<8) | b;
printf("Votre Code Couleur est: %u",c);
getch();
}
GDI et DirectX utilise ce code couleur. OpenGL utilise glcolor3f() ou glcolor4f() qui permet d’entrer un couleur défini avec des
nombres allant de 0 vers 1.
sizeof()
Le sizeof() peut ou ne peut pas être important pour le moment. Mais pour ceux qui veulent importer
les données d’un fichier binaire, ce code sauve la vie !
sizeof() permet de retourner le nombre d’octets qu’un objet utilise.
Par exemple :
char c;
printf(« %d », sizeof(c));
Donne “1” qui est vrai car c est défini entre -128 et 127 (0 vers 255 pour certains compilateurs) soit un octet.
GE1 S4 Journal de C
13 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
++ , -- et Opérateurs combinés
En langages de type C tel que C, on peut simplifier le code du programme énormément :
Ces instructions sont équivalentes :
Instruction 1 Instruction 2 Instruction 3
i = i + 1 i+=1 i++ i = i - 1 i -=1 i-- a = a+b a+=b a = a-b a-=b a = a * b a *= b a = a / b a /= b a = a & b a &= b a = a | b a |= b
Constantes
Pour déclarer les constantes, on a deux types :
#define PI 3.1415926536
Ceci permet de compiler PI en tant qu’un Keyword
Ou bien
const float PI = 3.1415926536;
Ceci permet de mettre PI une constante (invariante)
Peut n’importe, les détails ne sont pas importants, il faut retenir que ces deux méthodes sont équivalentes (presque….)
Cast (dite aussi DirectCast)
En C, il est possible de passer d’un type vers un autre :
Par exemple, pour passer de réel (float) entier (int)
float a ;
a = 2.5;
int b;
b = (int)a;
GE1 S4 Journal de C
14 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
Boucles et Conditions
If
if (expression Logique) {
//SI EXPRESSION EST VRAIE, CE BLOC SERA EXECUTE
} else {
//SI EXPRESSION EST FAUSSE, CE BLOC SERA EXECUTE
}
Expression Logique (binaire) :
C’est une expression qui lorsque est évaluée, elle donne « 1 » si l’expression est vraie et « 0 » sinon.
Langage C étant basé sur C90, le type booléen n’existe pas par défaut dans le compilateur (on peut importer
stdbool.h ou bien windef.h).
Mais, on peut toujours définir « TRUE » et « FALSE » comme constantes de compilateurs :
#define TRUE 1
#define FALSE 0
Les expressions logiques possible :
Fonctionnement Expression Résultat
Test d’égalité a==b 1 si a = b 0 sinon
Test de non égalité
a != b 1 si a ≠ b 0 sinon
Comparaison a<b a>b a<=b a>=b
1 si l’expression est vrai 0 sinon
ET a&&b 1 si A ET B = vrai 0 sinon
OU a||b 1 si A OU B = vrai 0 sinon
NON !a 1 si a = faux 0 si a = vrai
PETIT PROJET B: Surtout dans les jeux et les programmes avancés, on utilise les flags : Un nombre composé (qui peut être lit en tant qu’un entier) qui donne l’état
d’un objet (ou du programme).
Par exemple, dans Re-Volt (modifié pour simplifier), on définit le polygone (qui peut être composé soit par 3 points [triangle] soit par 4 points dit [QUAD]) par des données
tel que texture (image), positions, normal ET aussi par un flag :
#define POLY_QUAD 1 //4 points, et pas 3 points
#define POLY_SEMITRANS 4 //semi transparent
#define POLY_MIRROR 128 //réflective
#define POLY_TEXANIM 512 //contient animation de texture
GE1 S4 Journal de C
15 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
Ainsi par exemple, un polygone de 4 points et animé est de flag 512 + 1 = 513.
Un QUAD qui est semi transparent et réflectif :1+ 4+128=133.
On se propose de composer un code qui teste (avec l’opérateur LOGIQUE ET et non testeur logique ET) le flag d’un polygone et donne ses propriétés.
A noter :
513 & 1 = 1
513 & 128 = 0
#include <stdio.h>
#include <conio.h>
#define POLY_QUAD 1 //4 points, et pas 3 points
#define POLY_SEMITRANS 4 //semi transparent
#define POLY_MIRROR 128 //reflective
#define POLY_TEXANIM 512 //contient animation de texture
void main()
{
int p;
printf("Donner le flag d'un polygone:");
scanf("%d",&p);
if (p & POLY_QUAD) puts("\tQUAD");
if (p & POLY_SEMITRANS) puts("\tSemi-transparent");
if (p & POLY_MIRROR) puts("\tRéflectif");
if (p & POLY_TEXANIM) puts("\tAnimé");
getch();
}
Note : En C, on peut omettre {} si on ne veut exécuter qu’une seule instruction et on doit l’ajouter sinon !
Exemple :
if (p & POLY_QUAD)
puts("\tQUAD");
else{
printf("NON!");
printf("N'est pas QUAADD!!\n");
}
Majuscule, minuscule
Exercice 5: Ecrire un programme qui permet de transformer une lettre majuscule vers une lettre minuscule ;
#include <stdio.h>
#include <conio.h>
void main() {
char c;
printf("Donner une lettre en majuscule:");
scanf("%c",&c);
if (c>='A' && c <= 'Z') {
printf("En minuscule ça devient:%c!",c-'A'+'a');
} else {
puts("Erreur!");
}
GE1 S4 Journal de C
16 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
getch();
}
While
while (expression)
{
//Jusqu'à ce que l'expression devient fausse, ceci va être exécuté
}
GE1 S4 Journal de C
17 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
Journée 4 : Boucles et Conditions (2)
Mettre If et « While » en poche
S’introduire à Pour
Convertir Pour en while
Cas particulier : Boucle infini
Journée 4
1. Exercice d’application
sur if et while
2. Pour
3. Conversion pour_while
4. Petit projet
5. Boucle infini
GE1 S4 Journal de C
18 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
Exercice 1 : Transformer le programme de l’exercice précédent (5 dans notre journal) de manière qu’il répète ce procédé jusqu’à l’intervention de l’utilisateur
Proposition 1
#include <stdio.h>
#include <conio.h>
void main() {
char c;
c='o'; //init..
while(c=='o') {
printf("Donner une lettre en majuscule:");
scanf("%c",&c);
if (c>='A' && c <= 'Z') {
printf("En minuscule ca devient:%c!\n",c-'A'+'a');
} else {
puts("Erreur!");
}
printf("Appuyez sur 'o' pour répéter...\n");
c = getch();
}
}
Proposition 2
#include <stdio.h>
#include <conio.h>
#define TRUE 1
#define FALSE 0
void main() {
char c;
int test = TRUE;
while(test) {
printf("Donner une lettre en majuscule:");
scanf("%c",&c);
if (c>='A' && c <= 'Z') {
printf("En minuscule ça devient:%c!\n",c-'A'+'a');
} else {
puts("Erreur!");
}
printf("Appuyez sur 'o' pour répéter...");
test = getch()=='o';
}
}
Ces programmes ne marchent pas parfaitement ! En effet c’est un défaut de C qui était fixé en C++ !
Mais on peut le fixer en C ;)
Le problème est ici : scanf("%c",&c); va lire le caractère ainsi que le caractère « entrée » (13).
GE1 S4 Journal de C
19 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
Lorsque on démarre un autre code de scan clavier (getch(), getchar() ou scanf()), « entrée » (13) va être lu automatiquement sans l’intervention de l’utilisateur. Ainsi, on ajoute un code qui lit l’ « entrée » (tour à vide)
Programme modifié :
#include <stdio.h>
#include <conio.h>
#define TRUE 1
#define FALSE 0
void main() {
char c;
int test = TRUE;
while(test) {
printf("Donner une lettre en majuscule:");
scanf("%c",&c);
if (c>='A' && c <= 'Z') {
printf("En minuscule ca devient:%c!\n",c-'A'+'a');
} else {
puts("Erreur!");
}
scanf("%c",&c);
printf("Appuyez sur 'o' pour répéter...\n");
test = (getch()=='o');
}
}
For (Pour)
La boucle Pour a un goût spécial en langage basé sur C !
En effet, C, C#, C++, D, Java, Javascript, PHP tous utilise un système similaire pour « pour »
for ( INITIALISATION ; CONDITION DE MARCHE ; INSTRUCTION REPETITIVE ) {
// Votre Code ici !
}
INITIALISATION :
C’est le code a exécuté avant entrer la boucle (par exemple : i = 0 )
CONDITION DE MARCHE :
L’expression logique à tester, si elle donne oui on continue sinon on sort (par exemple : i < MAX_I )
INSTRUCTION REPETITIVE:
Le code a exécuté à la fin de chaque cycle du boucle (par exemple : i=i+1 i++ )
GE1 S4 Journal de C
20 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
for ( INITIALISATION ; CONDITION DE MARCHE ; INSTRUCTION REPETITIVE ) {
// Votre Code ici !
}
INITIALISATION
while(CONDITION DE MARCHE) {
//VOTRE CODE ICI
INSTRUCTION REPETITIVE
}
Exercice 2 : Faire un programme qui permet de calculer le factoriel d’un nombre :
#include <stdio.h>
#include <conio.h>
void main() {
int n=-1;
while (n<0)
{
printf("Donner un nombre positif:");
scanf("%d",&n);
}
int i = 0;
unsigned int p = 1;
for(i=1;i<=n;i++) p*=i;
printf("%d!=%u",n,p);
getch();
}
Exercice 3 : Transformer le programme ci-dessus avec « while » :
#include <stdio.h>
#include <conio.h>
void main() {
int n=-1;
while (n<0)
{
printf("Donner un nombre positif:");
scanf("%d",&n);
}
int i = 1;
unsigned int p = 1;
while(i<=n){
p*=i;
i++;
}
printf("%d!=%u",n,p);
getch();
}
GE1 S4 Journal de C
21 Groupe n°2 Ahmed Derbel , Ahmed Kammoun, Ahmed Yahia Kallel , Aymen Baccari, Ghazi Zouari, Mohamed Allouch, Wassef Chaaben, Zied Omrane
2013/2014 Support de cours : Mr Hafedh Trabelsi
Les C++iens utilisent for(int i = 0 ; i < MAX ; i++) qui ne marche que sur std-C99 et versions plus récentes. Autrement dit, ne l’utilisez PAS ! Il valait mieux d’initialiser « i » avant de l’utiliser dans la boucle
PETIT PROJET C: Le perceptron (vu mathématiquement) est une fonction mathématique qui donne {-1,1} comme résultat.
Nous voulons faire un petit programme de perceptron 1D (positive ray, rayon positif) qui choisit des nombres entiers aléatoires de -100..100 et donne combien des points
sont positifs et combiens ils sont négatifs.
Ci-dessous un programme qui permet de générer un nombre aléatoire entier compris entre 0 et 200 !
#include <stdio.h>
#include <conio.h>
#include <time.h>
void main() {
printf("%d",rand()%200); //aléatoire, un nombre de 0 à 200
}
On peut aussi ajouter un « Random_seed » (générateur de nombre aléatoire) mais rand() tout seul va aller !
srand(time(NULL)); //randomize, a declare une seule fois