SpixSh@dow Production
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.


Developpement Amateur de SpixSh@dow
 
AccueilPortailDernières imagesRechercherS'enregistrerConnexion

 

 [Cours 02] Structures de controle

Aller en bas 
AuteurMessage
Sekoda
Admin
Admin



Nombre de messages : 1631
Date d'inscription : 04/01/2007

[Cours 02] Structures de controle Empty
MessageSujet: [Cours 02] Structures de controle   [Cours 02] Structures de controle Icon_minitimeDim 18 Fév - 17:52

Bienvenue au second cours de C Very Happy

Nous allons commencer a aborder les structures de controle qui vous permettront de commencer a developper des programmes efficaces Smile.


Arrow C'est quoi une structure de controle Question

Bonne question Laughing
C'est pourtant une chose que vous connaissez bien Wink.
En effet, il s'agit de toutes les syntaxes qui, par rapport a une condition donnee, va influer sur le deroulement du programme.
Il y a par exemple :
Code:
if (condition)
    execution;
ou alors
Code:
while (condition)
    execution;
Et ainsi de suite Wink.


Dernière édition par le Dim 18 Fév - 20:10, édité 1 fois
Revenir en haut Aller en bas
Sekoda
Admin
Admin



Nombre de messages : 1631
Date d'inscription : 04/01/2007

[Cours 02] Structures de controle Empty
MessageSujet: Re: [Cours 02] Structures de controle   [Cours 02] Structures de controle Icon_minitimeDim 18 Fév - 18:17

If... Else

Voici la structure la plus connue de tous : la condition "Si".

Le code exacte est le suivant :
Code:
if (condition)
    {
          instruction;
    }
else if (condition)
    {
          instruction;
    }
else
    {
          instruction;
    }

:arrow:C'est quoi ce charabia Question

Pour mieux comprendre, on va decouper tout ca Wink.

A savoir, apres les mots-cles "if" ou "else if", il y a la "(condition)". Ce qui signifie, que l'on va executer le bout de code qui suit entre "{ }", uniquement si la condition est respectee. Autrement, on passe a la condition suivante sans executer le code. Si aucune condition n'est respectee, on saute tout symplement l'ensemble des "if".

Apres, si jamais la condition est respectee, le programme execute toutes les instructions qui seront entre "{ }".

L'instruction "else", permet d'executer des instructions seulement si toutes les conditions precedentes, ne sont pas respectees. Cependant, elle n'est pas obligatoire. J'entends par la que si jamais vous ne voulez executer des instructions seulement dans un cas precis, et sans aucune autre action, vous n'etes pas oblige de la mettre.

Exemple :
Code:
if (joueur.vie == 0)
    {
          Ecran de GAME OVER;
    }
else
    {
          Continuer le jeu;
    }

Dans ce code, on demande de passer a l'ecran GAME OVER, dans le cas ou le joueur n'a plus de vie. Cependant, si vous avez au prealable, bien structure votre code, il apparaitra evident que la suite du code contient des donnees relatives a la suite du jeu.

Ainsi,
Code:
if (joueur.vie == 0)
    {
          Ecran de GAME OVER;
    }
ce code la suffit amplement.

Bon, ce n'est pas le meilleur exemple, mais vous comprendrez tres rapidement ses subtilites Laughing.

En cas de doute, laisser "else".

Exclamation On ne peut utiliser la commande "else", sans avoir au prealable appele la syntaxe "if". Autrement, il ne saura pas a quoi se comparer pour pouvoir realiser ses actions.


Concernant le "else if", il permet d'attribuer une autre instruction par rapport a une nouvelle condition.

Exemple tout simple Laughing :
Code:
if (bouton.A appuye)
    {
          Joueur tire;
    }
else if (bouton.B appuye)
    {
          Joueur saute;
    }
else if ...
...
...
...

Voici un exemple de code ou le "else" est inutile. En effet, si vous faites une condition pour chaque touche possible, le "else" ne sert a rien vu qu'il y aura forcement une touche appuye Wink.

Cependant, je vous deconeille d'utiliser cette methode pour realiser les actions du joueur, il y a une methode beaucoup plus simple Wink.

Idea Certains me diront surement qu'il y a une autre facon de procerder pour realiser une instruction en "if... else", et ils ont tout a fait raison Very Happy.

On appelle cette methode, la methode ternaire.

On passe donc de
Code:
if (condition)
    {
          instruction;
    }
else
    {
          instruction;
    }
a
Code:
(condition) ? instruction si vrai : instruction si faux;

Cependant, si on veut utiliser un certain nombre de "else if", il faudra faire des "if" imbrique, ce qui devient tres tres vite illisible scratch !
A utiliser avec moderation Wink.
Revenir en haut Aller en bas
Sekoda
Admin
Admin



Nombre de messages : 1631
Date d'inscription : 04/01/2007

[Cours 02] Structures de controle Empty
MessageSujet: Re: [Cours 02] Structures de controle   [Cours 02] Structures de controle Icon_minitimeDim 18 Fév - 18:34

While

Code:
while (condition)
    {
          instruction;
    }

Les fameuses boucles Very Happy!

Il faut entendre par la, que tant que la condition est vrai, les instructions contenues dans la boucl s'executertont.

Ainsi :
Code:
while (bouton.A est appuye)
    {
          personnage tire avec sa mitraillette;
    }

il faut en tirer que tant que l'on appuie sur le bouton A, notre petit personnage va envoyer une rafale de balle Laughing.

Exclamation Attention au condition infinie Exclamation
En prennant pour exemple un extrait du code de la PAlib :
Code:
while (1)
    {
          PA_WaitForVBL();
    }

Il apparait que "Tant que 1 existe, on realise les instructions ci-dessous."
Ainsi, jusqu'a la mort, la boucle executera ses instructions (en fait, ce n'est pas exactement vrai, car adviendra le jour ou la machine n'aura plus d'energie et sa resoudera le probleme Laughing).
C'est ce qui se passe pour le cas des jeux consoles. Le jeu ne peut-etre quitte autrement que par coupure de la console. Autrement, il repetera indefinement ce qu'il doit executer.

Un code plus embetant :
Code:
int    compte_a_rebour()
{
  int  i;

  i = 0;
  while (i < 100)
        {
            Afficher la valeur de "i";
        }
  return (0);

Quel est le probleme ici ? Very Happy
On declare donc la variable "i" de type nombre entier.
On l'initialise ensuite a la valeur 0.
Puis on dit que tant que "i" est inferieur a 100, on affiche sa valeur.
Cependant, "i" restera tout le temps a 0, donc non seulement on verra un beau 0 s'afficher a l'ecran, mais en plus, le programme restera indefiniment dans cet etat.
Il fallait pour eviter cela, rajouter :
Code:
int    compte_a_rebour()
{
  int  i;

  i = 0;
  while (i < 100)
        {
            Afficher la valeur de "i";
            i++;
        }
  return (0);
qui ajoute 1a la valeur de "i".
Ainsi, apres 100 boucles, on sort de la boucle car "i" ne sera plus inferieur a 100 Wink.

C'est l'une des erreurs les plus frequentes avec l'utilisation des boucles. Je vous conseille donc, avant toute chose, de mettre l'instruction qui permet de sortir de la boucle.
Ici, j'aurais donc du commencer par ecrire :
Code:
while (i < 100)
    {
          i++;
    }
avant d'ecrire les differentes instructions Wink.


Dernière édition par le Dim 18 Fév - 18:41, édité 1 fois
Revenir en haut Aller en bas
Sekoda
Admin
Admin



Nombre de messages : 1631
Date d'inscription : 04/01/2007

[Cours 02] Structures de controle Empty
MessageSujet: Re: [Cours 02] Structures de controle   [Cours 02] Structures de controle Icon_minitimeDim 18 Fév - 18:40

Break

Arrow Mais si on veut sortir de la boucle sans verifier l'etat de condition Question

On utilise donc la commande break, qui permet de sortir d'une boucle quelque soit l'etat de la condition (vraie ou fausse).

Ainsi, avec l'exemple de tout a l'heure, on a donc :
Code:
int    tirer()
{
  int  nbr_balle;

  nbr_balle = 500;
  while (bouton.A appuye)
        {
            personnage tire;
            nbr_balle--;
            if (nbr_balle == 0)
                  {
                      break;
                  }
        }
  return (0);
}
Dans cet exemple, le programme fait tirer le personnage uniquement dans le cas ou il reste de balles dans la mitraillette, et seulement pendant que le joueur appuie sur A Wink.
Autrement, meme si le joueur appuie sur A, s'il n'y a plus de balle, ben il ne peut plus tirer ! Logique, non ? Laughing

Cependant, ce n'est pas la meilleur solution ^^'.
Vous le verrez juste apres Smile.


Dernière édition par le Dim 18 Fév - 18:55, édité 2 fois
Revenir en haut Aller en bas
Sekoda
Admin
Admin



Nombre de messages : 1631
Date d'inscription : 04/01/2007

[Cours 02] Structures de controle Empty
MessageSujet: Re: [Cours 02] Structures de controle   [Cours 02] Structures de controle Icon_minitimeDim 18 Fév - 18:55

Continue

Arrow Mais si on veut rester dans la boucle sans executer une partie du code Question

A savoir, la commande "continue" est tres peu utilisee, car avec des "if", on arrive a s'en sortir.
Cependant, il arrive quelques fois, ou cette commande est tres utile.

Exemple :
Code:
int    tirer()
{
  int    nbr_balle;
  int    free_shoot;

  nbr_balle = 500;
  free_shoot  = 30;
  while (bouton.A appuyer && nbr_balle > 0)
        {
            personnage tire;
            if (free_shoot > 0)
                  {
                      free_shoot--;
                      continue;
                  }
            nbr_balle--;
        }
  return (0);
}

L'exemple que je me suis imagine est le suivant : on commence le jeu avec 500 balles. Or tout a coup, on trouve un petit item qui permet de tirer 30 fois gratuitement, sans toucher au reservoir de balle (avec le personnage qui clignote et toussa Laughing). Ainsi, dans la boucle, on a mentionne notre desir de recommencer la boucle sans toucher aux balles, tant qu'il nous reste du free_shoot.

Cependant, ici comme pour le break, ce n'est pas la meilleur solution ^^'.
Mais au moins vous connaissez l'existence de ces commandes et leur utilisation Wink.
Revenir en haut Aller en bas
Sekoda
Admin
Admin



Nombre de messages : 1631
Date d'inscription : 04/01/2007

[Cours 02] Structures de controle Empty
MessageSujet: Re: [Cours 02] Structures de controle   [Cours 02] Structures de controle Icon_minitimeDim 18 Fév - 19:09

For

Ce mot-cle, est comme son nom l'indique, tres fort Laughing.
Bref, il est tres utile et je l'emploi tres souvent Wink.

Exemple :
Code:
  i = 0;
  while (i < 100)
        {
            Afficher la valeur de "i";
            i++;
        }

Vous vous rappelez de cet exemple ? Smile
Il y a l'initialisation, la boucle et le moyen de sortir de la boucle.
Comme je le disais, on oublie souvent de mettre l'instruction qui permet de sortir de la boucle apres X repetition.
Pour pallier ce probleme "d'omission", il existe la commande "for" Very Happy.

Explication :
Code:
initialisation
while (condition)
    {
          intstruction;
          sortie;
    }
----->
for (initialisation; condition; sortie)
    {
          instruction;
    }

Voila ! Facile, hein ? Laughing.

En gros, par rapport a l'exemple, on a donc :
Code:
for (i = 0; i < 100; i++)
    {
          Afficher la valeur de "i";
    }

Plus simple et plus voyant Wink

Exclamation Vous n'etes pas oblige d'utiliser les 3 parametres de "for" (sauf la condition quand meme ! Laughing). Cependant, si tel est le cas, le mieux est d'utiliser un "while", c'est plus propre Wink.
Code:
i = 0;
for ( ; i < 100; )
    {
          Afficher la valeur de "i";
          i++;
    }

Ce code marche egalement, mais "while" devient plus simple dans cette situation. Il faut toujours que les 3 parametres du "for", apparaissent, meme si ils sont vides. Chaque parametre est separe par un ';'.

Ainsi, on peut aussi avoir :
Code:
int    i;
int    j;

for (i = 0, j = 100; i < j; i++, j++)
    {
          Afficher le resultat de "j - i";
    }

On separe plusieurs initialisation ou sortie par une virgule ','.

Pour le reste, "for' reste en tout point similaire a "while" (possibilite d'utiliser "break" et "continue" avec "for").


Dernière édition par le Dim 18 Fév - 19:27, édité 1 fois
Revenir en haut Aller en bas
Sekoda
Admin
Admin



Nombre de messages : 1631
Date d'inscription : 04/01/2007

[Cours 02] Structures de controle Empty
MessageSujet: Re: [Cours 02] Structures de controle   [Cours 02] Structures de controle Icon_minitimeDim 18 Fév - 19:20

Do... While

Arrow Mais que fait-on si on veut executer le code au moins une fois meme, si la condition de while est fausse Question

Dans l'immediat, il faudrait faire :
Code:
instruction;
while (condition)
    {
          la meme instruction;
          sortie;
    }

Cependant, c'est idiot et c'est lourd a lire.

Le plus simple est donc d'utiliser la commande "do... while" qui se presente de cette facon :
Code:
do
    {
          instruction;
          sortie;
    } while (condition);

Ainsi, il execute au moins une fois l'instruction avec de checker la condition Wink.
Apres, pour le reste, c'est exactement pareil (break, continue, etc...).
Revenir en haut Aller en bas
Sekoda
Admin
Admin



Nombre de messages : 1631
Date d'inscription : 04/01/2007

[Cours 02] Structures de controle Empty
MessageSujet: Re: [Cours 02] Structures de controle   [Cours 02] Structures de controle Icon_minitimeDim 18 Fév - 19:44

Operation

Arrow Comment faire pour poser des conditions Question

Generalement, on realise des comparaisons de valeurs pour realiser une condition.

Est-ce que x est plus grand que y ?
Est-ce que tel resultat est vrai ou faux ?
...

Pour ce faire, il faut utiliser des operateurs.
Voici la liste :
Code:
 x = x + y : on ajoute a x, la valeur de y.
x += y : idem, forme simplifiee.
z = x + y : on prends le resultat de l'addition sans modifier x et y.

idem avec '-' soustraction, '*' multiplication, '/' division.


x > y : est-ce que la valeur de x est plus grande de y ?
x < y : est-ce que y est plus grand que x ?
x == y : est-ce que x est egale a y ?
x >= y : est-ce que x est superieur ou egale a y ?
x <= y : est-ce que x est inferieur ou egale a y ?
( ) : Priorite a l'interieur des parentheses.
condition || condition : la condition est respectee seulement si l'une des deux conditions est respectee.
condition && condition : la condition est respectee UNIQUEMENT si les DEUX conditions sont respectees.

Concernant les deux dernieres valeurs, si vous etes observateurs, vous avez pu vous rendre compte que je l'ai deja utilise Very Happy :

Code:
while (bouton.A appuyer && nbr_balle > 0)
Cela signifie que pour entrer dans la boucle "while", il faut que le bouton A soit appuye et qu'il nous reste suffisament de balle Wink.

Apres, on peut combiner des instructions :
Code:
while (bouton.A appuye && (nbr_balle > 0 || free_shoot > 0))

A savoir, "&&" ('et') est prioritaire a "||" ('ou'). Ce qu'il faut donc comprendre du code ci-dessus, est donc : "Tant que le bouton A est appuye ET qu'il me reste SOIT des balles SOIT du free_shoot, alors je peux executer les instructions ci-dessous".

Cela viendra avec un peu de pratique et permet d'eviter plusieurs "if" consecutives pour realiser les instructions lies a plusieurs conditions Wink.


Dernière édition par le Sam 24 Mar - 21:10, édité 1 fois
Revenir en haut Aller en bas
Sekoda
Admin
Admin



Nombre de messages : 1631
Date d'inscription : 04/01/2007

[Cours 02] Structures de controle Empty
MessageSujet: Re: [Cours 02] Structures de controle   [Cours 02] Structures de controle Icon_minitimeDim 18 Fév - 19:57

Utilisation

-Tout d'abord, pour faciliter la lecture, on mettra un espace autour de chaque operateur :
-Pas de : x>y
-Mais : x > y

-Faire attention entre "x == y" et "x = y".
Dans le premier, on demande si x a la meme valeur que y. Mais on ne modifie en aucun cas la valeur de x ou de y.
Dans le deuxieme cas, on donne la valeur de y vers x, et non dans l'autre sens. On va du membre droite, vers le membre gauche Wink.

-Arrow Sommes-nous obliges d'utiliser les accolades Question

Oui et non. Si jamais vous n'avez qu'une seule instruction, vous pouvez vous en passer.
Code:
if (condition)
    {
          instruction;
    }
devient donc :
Code:
if (condition)
    instruction;
Cependant, a partir de deux instructions, il ne devient plus capable de faire la distinction entre une instruction conditionnelle ou non. Par default, il executera l'instruction qui sera consideree hors-condition. Il faudra donc penser a mettre les accolades Wink.

-Concernant les "&&" et "||", le programme lit de gauche a droit :
Code:
if (condition1 && condition2)
    instruction;
Si la condition1 n'est pas respectee, la condition2 ne sera pas verifiee.
Vous me direz surement pourquoi je vous dis ca ?
Tout simplement parce que dans certains cas de figure, vous aurez besoin de mettre une prioritee dans l'ordre de verification des conditions, notamment si dans vos conditions, vous mettes non pas des variables, mais des fonctions Laughing.

Mettez bien deux fois le caracteres '&' et '|', car l'operateur '&' et '|' a simple caractere existe. Mais je reviendrais bien plus tard dessus, si je vois leur utilite dans le developpement NDS.

-On me dira aussi que je ne vous ai pas tout presente, notamment la fonction "Switch".

C'est tout a fait vrai Laughing.
Je n'aime pas trop l'utilisation du switch qui break a tout va. Il y a une methode beaucoup plus simple que je vous apprendrais apres les pointeurs Wink.
Revenir en haut Aller en bas
Sekoda
Admin
Admin



Nombre de messages : 1631
Date d'inscription : 04/01/2007

[Cours 02] Structures de controle Empty
MessageSujet: Re: [Cours 02] Structures de controle   [Cours 02] Structures de controle Icon_minitimeDim 18 Fév - 20:01

Conclusion

Voila, vous etes pares a manipuler vos programmes comme bon vous semble Smile (si j'ai ete suffisament clair ^^').

N'hesitez surtout pas, a faire part de vos incomprehension.
J'essairai de rendre plus clair que possible mon cours afin qu'il soit plus explicite Wink.

Si jamais j'ai oublie d'aborder certains points (ce qui est fort possible), n'hesitez pas a m'en faire part, j'y remedierai le plus vite possible Very Happy.

Bon courage avec les exos Laughing

Prochain cours : les pointeurs et les tableaux Very Happy.
Revenir en haut Aller en bas
Contenu sponsorisé





[Cours 02] Structures de controle Empty
MessageSujet: Re: [Cours 02] Structures de controle   [Cours 02] Structures de controle Icon_minitime

Revenir en haut Aller en bas
 
[Cours 02] Structures de controle
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [Cours 04] Vos questions.
» [Cours 02] Vos questions.
» [Cours 01] Vos questions !
» [Exercices] Cours 05
» [Cours 05] Vos questions.

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
SpixSh@dow Production :: SpixSh@dow Production :: Tuto :: Developpement :: Apprentissage du language C-
Sauter vers: