Comportement étrange dans les boucles

Ceux qui souhaitent signaler des erreurs éventuelles du logiciel sont les bienvenus ici (soyez précis svp !).
Répondre
jerome
Messages : 173
Enregistré le : mar. nov. 06, 2007 8:20 pm
Localisation : Saint-Brieuc

Comportement étrange dans les boucles

Message par jerome »

Voici un script qui fonctionne :

Code : Tout sélectionner

a=-2;
b=3;
N=10;
//a=Input("a ?");
//b=Input("b ?");
//N=Input("N ?");
Println(a);
Println(b);
Println(N);
h=(b-a)/N;
Println(h);
for (i=0; i<=N; i=i+1){
	Println(i);
	x=a+i*h;
	Println(x);
	Point(x,x*x);
}
Un autre qui ne fonctionne pas : le même, en commentant les 3 premières lignes, décommentant les trois suivantes, répondant -2, 3, 10 aux questions posées.

D'où vient le problème ?

monique31
Messages : 373
Enregistré le : sam. nov. 03, 2007 3:33 pm
Localisation : Toulouse

Message par monique31 »

Manifestement avec la seconde méthode a est compris comme une chaîne de caractères et a+i*h comme une concaténation de chaînes de caractères. Alors, je viens de regarder sur le net sur un site qui s'appelle "Introduction à Javascript", et j'ai trouvé une instruction qui convertit une chaine de caractères en nombre : parseFloat. Du coup, çà marche ; mais c'est pas joli-joli. Attendons le secours des spécialistes !!! Je suis absolument nulle en programmation :(

Code : Tout sélectionner

//a=-2;
//b=3;
//N=10;
a=Input("a ?");a=parseFloat(a);
b=Input("b ?");
N=Input("N ?");
Println(a);
Println(b);
Println(N);
h=(b-a)/N;
Println(h);
for (i=0; i<=N; i=i+1){
   Println(i);
   x=a+i*h;
   Println(x);
   Point(x,x*x);
}

jerome
Messages : 173
Enregistré le : mar. nov. 06, 2007 8:20 pm
Localisation : Saint-Brieuc

Message par jerome »

monique31 a écrit :Manifestement avec la seconde méthode a est compris comme une chaîne de caractères
Ah oui. Je n'y avais pas songé, mais c'est cohérent. Sauf que dans un logiciel de maths il serait bon que, par défaut, les valeurs entrées dans un Input soient avant tout interprétées comme des nombres.

Hesperion
Messages : 260
Enregistré le : dim. nov. 11, 2007 2:14 pm
Localisation : Blois

Message par Hesperion »

Pour convertir une chaine de caractères numérique en nombre, j'utilise la commande "eval", mais ParseFloat est aussi très bien.

Code : Tout sélectionner

a=eval( Input("a ?") );
jerome a écrit :Sauf que dans un logiciel de maths il serait bon que, par défaut, les valeurs entrées dans un Input soient avant tout interprétées comme des nombres.
Moi je dirai non car c'est du JavaScript et il ne faut pas que le langage utilisé dans CaRMetal soit trop spécialisé pour permettre une bonne compatibilité (au moins intellectuelle) avec ce que l'on trouve ailleurs.

jerome
Messages : 173
Enregistré le : mar. nov. 06, 2007 8:20 pm
Localisation : Saint-Brieuc

Message par jerome »

Dans les manuels de seconde que nous venons de recevoir, les algorithmes proposés sont parfois transformés en programmes pour calculatrices ou logiciels. Pour tous (?), il est sous-entendu que Input(a) retourne un nombre. Il me semble dommage que CaRMetal, qui est avant tout pour les élèves, s'en démarque.
Je ne connais pas JavaSCript. Mais qu'un langage de programmation puisse interpréter a+b soit comme une somme, soit comme une concaténation, me gêne assez, si on doit l'utiliser en classe.

Hesperion
Messages : 260
Enregistré le : dim. nov. 11, 2007 2:14 pm
Localisation : Blois

Message par Hesperion »

Par définition, un "Input" est une entrée de données dans un algorithme définie par l'utilisateur.
Le fait que le type par défaut soit une chaine de caractères me semble logique, puisque l'ensemble des nombres est inclus strictement dans l'ensemble des chaine de caractères.

C'est peut-être justement les fabricants de calculatrices qui ont fait un choix trop restreint en imposant que cela soit un nombre...
Bon, je reconnais qu'on utilise très peu des opérations sur les chaines de caractères au lycée...

Il suffit juste de convertir avec "eval" dès la saisie et il n'y a plus de problème ensuite.

monique31
Messages : 373
Enregistré le : sam. nov. 03, 2007 3:33 pm
Localisation : Toulouse

Message par monique31 »

Quelques remarques quand même :
- il me semble qu'en javascript les chaînes de caractères doivent être entourées de guillemets (pour les différencier des nombres justement)
- si dans le script proposé on remplace le + par un - il n'y a pas de problème ; ce qui prouve bien que c'est le + qui a fait que la ligne en question a été "reconnue" comme chaîne ... et c'est là que c'est bizarre.

Ajouter des eval ou des parseFloat ici ne me semble pas normal du tout.

monique31
Messages : 373
Enregistré le : sam. nov. 03, 2007 3:33 pm
Localisation : Toulouse

Message par monique31 »

Bon, j'ai dit une bêtise dans le post d'avant (pour les guillemets). Mais si vous essayez ceci, soit avec d'abord avec une somme, puis avec une différence ... toujours ce même petit souci !

Code : Tout sélectionner

a=Input("Premier nombre ?");
b=Input("Deuxième ?");
s=a+b;
Println("Réponse : _s");

Hesperion
Messages : 260
Enregistré le : dim. nov. 11, 2007 2:14 pm
Localisation : Blois

Message par Hesperion »

monique31 a écrit :ce qui prouve bien que c'est le + qui a fait que la ligne en question a été "reconnue" comme chaîne ... et c'est là que c'est bizarre.
Tout vient du fait que "+" sert à la fois comme opérateur de concaténation et comme opérateur additif, selon le type des opérandes.
Si on essaye de soustraire deux chaines de caractères, JavaScript se charge tout seul de convertir les opérandes dans le bon type, lorsque cela est possible.

En reprenant le bout de code ci-dessus, et en faisant faire une soustraction, si on saisit au clavier des lettres, on obtient la réponse NaN (Not a Number).

Le fait d'ajouter "eval" permet aussi d'utiliser de valeurs approchées à 10^-12 de nombres rationnels et irrationnels.

Code : Tout sélectionner

a=eval(Input("Entrer un nombre"));
Alert(a);
Si on saisit 3/7, cela nous retourne une valeur approchée.
Idem avec Math.sqrt(2)


On peut tout de même typer un peu plus les variables, mais attention à la syntaxe :

Code : Tout sélectionner

var a = new Number(Input("Nombre :"));

var b = new Number();
b=Input("Nombre :");

Println("a est du type : " + typeof(a));
Println("b est du type : " + typeof(b));

a=a+1;
b=b+1;

Println("a est du type : " + typeof(a));
Println("b est du type : " + typeof(b));

monique31
Messages : 373
Enregistré le : sam. nov. 03, 2007 3:33 pm
Localisation : Toulouse

Message par monique31 »

Hesperion a écrit :Tout vient du fait que "+" sert à la fois comme opérateur de concaténation et comme opérateur additif, selon le type des opérandes.
De même que certains ont "reproché" à javascript d'utiliser le signe "=" pour l'affectation de variables. Alors il m'est venu une réflexion en remplissant en ligne ma déclaration d'impôts :) : javascript ça sert dans la vraie vie ! ce n'est pas un langage spécial éducation nationale ; donc il n'y a aucune raison de "l'adapter" . Reste à expliquer tout ça aux élèves ... ce qui ne doit pas être trop compliqué quand même.

Avatar du membre
yves974
Messages : 268
Enregistré le : mar. oct. 30, 2007 3:11 am
Localisation : Réunion

Message par yves974 »

D'accord avec Monique sur le dernier point, a priori on utilise un "vrai javascript"

Cela dit le p semblat persistant, peut-être que Eric pourrait programmer pour le Input (quand on clic sur le lien) quelque chose qui écrirait eval(Input( ...));

ça peut être un choix pertinent ... à discuter.

Avatar du membre
alain974
Messages : 150
Enregistré le : sam. juin 13, 2009 9:08 am
Localisation : Réunion

Message par alain974 »

Quand des enseignants se posent des problèmes sur la notation "+" pour la concaténation de chaînes de caractères, alors que les élèves jonglent avec le typage dynamique, c'est peut-être que le problème est en réalité un faux problème, non?

Exemple de ce que produisent mes élèves (dès le TP numéro 2!):

Code : Tout sélectionner

Println("L'image de "+"+" par la fonction est "+f(x));
Pareil à l'épreuve expérimentale du bac S sous GeoGebra: Ils produisent des affichages avec mélange de texte et de nombres (transformés en texte) avec une virtuosité impressionnante.

Comme ils disent:
Cass pa la têt èk ça!

projetmbc
Messages : 83
Enregistré le : sam. déc. 15, 2007 12:31 pm
Localisation : France

Message par projetmbc »

+1

De plus, dans la mesure où on ne fera pas faire de raisonnements mathématiques avec des chaînes de caractères aux élèves, je ne vois pas où il y a un problème.

jerome
Messages : 173
Enregistré le : mar. nov. 06, 2007 8:20 pm
Localisation : Saint-Brieuc

Message par jerome »

projetmbc a écrit : De plus, dans la mesure où on ne fera pas faire de raisonnements mathématiques avec des chaînes de caractères aux élèves, je ne vois pas où il y a un problème.
Eh eh, on s'est pas mal égaré depuis ma remarque initiale. Du coup je la reformule : l'utilisateur lambda raisonne sur des nombres, alors que javascript travaille avec des chaînes, donc l'utilisateur lambda est bien forcé de faire des raisonnements sur des chaînes. Ne serait que pour comprendre pourquoi, parfois, 2+3=23.

Mais maintenant que j'ai compris que tout passait par les chaînes, ça m'est beaucoup plus simple d'appréhender comment on peut passer d'un CaRscript aux objets de CaRMetal, et ça m'ouvre pas mal de portes.

Répondre