Tutorial NWScript :: 9. Exercices :: La Bibiliothéque de Neverwinter Nights - version imprimable

9. Exercices


Bien, une fois que vous avez vu à peu près comment fonctionne le langage NWScript, on va pouvoir faire des exercices :

1. Cherchez les erreurs :

int a = 0;
int b = 1;
float c, d = 0.0f;

c = a + c;
a = a * b;
a = a / b;
b = b / a;
a = c + d;

2. Quel est le problème dans ce code ?

void main()
{
  int i = 0;

  while ( i == 0 )
    continue;
}

3. Simplifiez :

Soit a, b deux conditions.

if ( ( a || b ) && !( a && b ) )
  if ( a )
    instruction;
  else if ( b )
    instruction;

Soit i, j deux entiers :

i = i + 1;
j = i * 3;

Soit a une condition et i, j deux entiers :

if ( a )
  j = i * 3;
else if ( b )
  j = i * 4;

4. Cherchez les erreurs : ici a est une condition

void Foo()
{
  int i, j, k = 10;

  if ( I = j )
  {
    i = j * k
  }
  else if ( a && i + j == k )
  {
    break;
  }

  i = ( a ) k : i;
}

5. Valeur de VAR_GLOBALE : La fonction Foo est définie comme ci-dessous et doit normalement changer la valeur de la variable globale VAR_GLOBALE. Elle renvoie la valeur de cette même variable.

int VAR_GLOBALE = 1;
int Foo()
{
   return VAR_GLOBALE;

   VAR_GLOBALE += 3;
}

Quelle est la valeur de VAR_GLOBALE ?




La correction est plus bas. Cliquez ici pour y accéder (assurez vous d'avoir bien répondu à toutes les questions... ne trichez pas ! N'essayez même pas!)

































Correction
1. Cherchez les erreurs :
  • c = a + c : c est un nombre décimal, on peut donc lui ajouter une valeur entière.
  • a = a * b : il n'y pas de problème ici.
  • a = a / b : il n'y pas de problème ici.
  • b = b / a : ici, il ne s'agit que de maths, pas de type de variable : vous remarquerez que a vaut 0, et il est impossible de diviser un nombre par 0.
  • a = c + d : a est un entier, on ne peut lui donner une valeur décimale. Dans ce cas, il faudrait se servir de FloatToInt.

2. Quel est le problème dans ce code ? Le problème dans le code est que la boucle ne peut jamais se fermer; il s'agit d'une boucle infinie.

3. Simplifiez :
  • On peut simplifier la condition ainsi :
    if ( a && !b )
    instruction;
    else if ( !a && b )
    instruction;
  • L'opération peut s'écrire ainsi :
    j = (++i) * 3;
  • On peut réécrire l'opération sous deux formes :
    j = ( a ) ? (i * 3): (i * 4);
    // ou :
    j = i;
    j *= ( a ) ? 3 : 4;
4. Cherchez les erreurs
  • "I" n'est pas la même chose que "i". Ici vous auriez du déclarer et définir "I" ou changer I par i.
  • I = j : à supposer que I soit déclarée et définie : l'opération consistant à donner à I la valeur de j est tout le temps vraie sauf en cas d'erreur. Ici, on aurait du utiliser le signe " == ".
  • Il manque un ";" après le " k ".
  • Ce n'est pas une erreur, néanmoins :
    ( a && i + j == k )
    N'hésitez pas à mettre des parenthèses même si elles vous paraissent superflues :
    ( ( a ) && ( ( i + j ) == k ) )
    Imaginez un instant que "a" soit une condition compliquée...
  • Le "break" n'a rien à faire ici. Ce n'est pas une boucle ni un switch.
  • C'est sûrement une des erreurs les plus fréquentes dans l'utilisation des opérateurs ternaires : l'oubli du point d'interrogation " ? " (ou du deux points ":")

5. Valeur de VAR_GLOBALE: Ici, VAR_GLOBALE vaudra toujours " 1 " même après passage par Foo. Pour que VAR_GLOBALE soit changée il aurait fallu mettre le return VAR_GLOBALE après l'instruction " VAR_GLOBALE += 3 ".









8. La « norme »
Navigation rapide: