Comportement étrange dans les boucles

Ceux qui souhaitent signaler des erreurs éventuelles du logiciel sont les bienvenus ici (soyez précis svp !).
Post Reply
jerome
Posts: 173
Joined: Tue Nov 06, 2007 8:20 pm
Location: Saint-Brieuc

Comportement étrange dans les boucles

Post by jerome » Fri May 28, 2010 5:34 pm

Voici un script qui fonctionne :

Code: Select all

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
Posts: 373
Joined: Sat Nov 03, 2007 3:33 pm
Location: Toulouse

Post by monique31 » Fri May 28, 2010 10:42 pm

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: Select all

//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
Posts: 173
Joined: Tue Nov 06, 2007 8:20 pm
Location: Saint-Brieuc

Post by jerome » Sat May 29, 2010 1:15 am

monique31 wrote: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
Posts: 260
Joined: Sun Nov 11, 2007 2:14 pm
Location: Blois

Post by Hesperion » Sat May 29, 2010 11:50 am

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

Code: Select all

a=eval( Input("a ?") );
jerome wrote: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
Posts: 173
Joined: Tue Nov 06, 2007 8:20 pm
Location: Saint-Brieuc

Post by jerome » Sat May 29, 2010 1:05 pm

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
Posts: 260
Joined: Sun Nov 11, 2007 2:14 pm
Location: Blois

Post by Hesperion » Sat May 29, 2010 11:15 pm

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
Posts: 373
Joined: Sat Nov 03, 2007 3:33 pm
Location: Toulouse

Post by monique31 » Sun May 30, 2010 9:02 am

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
Posts: 373
Joined: Sat Nov 03, 2007 3:33 pm
Location: Toulouse

Post by monique31 » Sun May 30, 2010 12:01 pm

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: Select all

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

Hesperion
Posts: 260
Joined: Sun Nov 11, 2007 2:14 pm
Location: Blois

Post by Hesperion » Sun May 30, 2010 2:12 pm

monique31 wrote: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: Select all

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: Select all

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
Posts: 373
Joined: Sat Nov 03, 2007 3:33 pm
Location: Toulouse

Post by monique31 » Sun Jun 06, 2010 2:33 pm

Hesperion wrote: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.

User avatar
yves974
Posts: 268
Joined: Tue Oct 30, 2007 3:11 am
Location: Réunion

Post by yves974 » Sun Jun 06, 2010 3:24 pm

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.

User avatar
alain974
Posts: 150
Joined: Sat Jun 13, 2009 9:08 am
Location: Réunion

Post by alain974 » Fri Jun 25, 2010 6:23 pm

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: Select all

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
Posts: 83
Joined: Sat Dec 15, 2007 12:31 pm
Location: France

Post by projetmbc » Fri Jun 25, 2010 7:15 pm

+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
Posts: 173
Joined: Tue Nov 06, 2007 8:20 pm
Location: Saint-Brieuc

Post by jerome » Fri Jun 25, 2010 8:09 pm

projetmbc wrote: 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.

Post Reply