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 :
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 :
- On peut réécrire l'opération sous deux formes :
j = ( a ) ? (i * 3): (i * 4);
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 :
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 ".