Ecrire un tantque avec un pour ?

Utilisation de Xcas

Modérateur : xcasadmin

Répondre
alb
Messages : 1331
Inscription : ven. août 28, 2009 3:34 pm

Ecrire un tantque avec un pour ?

Message par alb » ven. mai 13, 2011 4:37 pm

Lu dans le manuel:
Avec pour, on précise avec les mots de, jusque et pas, la valeur de départ, la condition d’arrêt etc...
J'ai envie d'essayer:
s:=0;pour j de 3 jusque 1/j>=0.125 faire s:=s+j fpour
mais ça ne fonctionne pas
sachant qu'on peut écrire un while avec un for
je pensais pouvoir écrire un tantque avec un pour mais manifestement non.

parisse
Messages : 5894
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Ecrire un tantque avec un pour ?

Message par parisse » ven. mai 13, 2011 6:43 pm

Il faut utiliser la syntaxe de type C de for ou pour pour faire cela

Code : Tout sélectionner

s:=0;pour(j:=3;1/j>=0.125;j++) { s:=s+j;}

alain974
Messages : 104
Inscription : lun. mai 24, 2010 11:15 am

Re: Ecrire un tantque avec un pour ?

Message par alain974 » sam. mai 14, 2011 7:03 am

alb a écrit :je pensais pouvoir écrire un tantque avec un pour mais manifestement non.
Pour info, Gödel et Kleene ont trouvé une manière plus pompeuse d'exprimer cela:

Toute fonction récursive primitive est récursive, la réciproque n'est pas vraie

On sait jamais, dans un dîner où on veut se la péter, ça peut servir...

Plus de détails ici: http://fr.wikipedia.org/wiki/Fonction_r ... _primitive, et la version de Turing est ici: http://fr.wikipedia.org/wiki/Probl%C3%A ... arr%C3%AAt (en gros, une poucle "pour", on sait qu'elle s'arrêtera un jour, une boucle "tant que", on ne sait pas et on ne peut pas savoir et on ne pourra jamais savoir)

alb
Messages : 1331
Inscription : ven. août 28, 2009 3:34 pm

Re: Ecrire un tantque avec un pour ?

Message par alb » sam. mai 14, 2011 9:52 am

Je dévalise le stock d'aspirine de mon pharmacien et je me penche sur le sujet !
Le but modestement était de proposer à des petits malins, astucieux mais pas toujours travailleurs:

Code : Tout sélectionner

PunitionPour(n):={
local s,j;
s:=0;
pour(j:=3;j^2<=n;j++){
 afficher("Je dois travailler le weekend");
}
retourne j-3;
}
:;
PunitionTantque(n):={
local s,j;
s:0;
j:=3;
tantque j^2<=n faire
  afficher("Je dois travailler le weekend");
  j:=j+1;
ftantque;
retourne j-3;
}
et de poser la question:
Trouver toutes les valeurs de n telles que chacun des deux programmes renvoie 100
Le fait de trouver les dispense bien entendu de la punition :wink:
Et s'ils ne la bouclent toujours pas je leur demande un repeter...jusqua... :evil:

alain974
Messages : 104
Inscription : lun. mai 24, 2010 11:15 am

Re: Ecrire un tantque avec un pour ?

Message par alain974 » sam. mai 14, 2011 6:50 pm

alb a écrit :Et s'ils ne la bouclent toujours pas je leur demande un repeter
Boucler ou la boucler, là est la question: Il est vrai que la boucle "for" de Xcas est en réalité une boucle "tant que " cachée. Et cela permet du code court, par exemple avec les sujets du bac L: http://www.reunion.iufm.fr/recherche/ir ... article453

Mais du coup puisque c'est une boucle "tant que", on n'a pas la garantie qu'elle ne va pas boucler sans fin comme dans celle-ci faite par un de mes élèves:

Code : Tout sélectionner

for(n=0;n>=-10;n++)


Et le théorème de Turing dit juste qu'il n'existe pas d'algorithme permettant d'empêcher un élève de faire ce genre de boucle, c'est à l'élève lui-même de faire attention...

alb
Messages : 1331
Inscription : ven. août 28, 2009 3:34 pm

Re: Ecrire un tantque avec un pour ?

Message par alb » sam. mai 14, 2011 9:16 pm

Le debugueur appliqué à ces 4 fonctions montre bien comment tout est interprété avec des for:

Code : Tout sélectionner

Pgm1():={
local s,k;
s:=0;
pour k de 3 jusque 10 faire s:=s+1 fpour;
}
:;
Pgm2():={
local s,k;
s:=0;
k:=3;
tantque k<=10 faire k:=k+1;s:=s+1 ftantque;
}
:;
Pgm3():={
local s,k;
s:=0;
pour(k:=3;k<=10;k++){s:=s+1};
}
:;
Pgm4():={
local s,k;
s:=0;
k:=3;
repeter k:=k+1;s:=s+1 jusqua k>10;
}
Sauf erreur de ma part les 4 devraient renvoyer 8
Or le dernier renvoie 'break' (sauf si on rajoute retourne s)
D'ailleurs l'instruction:
a:=1000;repeter a:=a-100 jusqua a<=250
donne aussi 'break'
Est-ce normal ?

parisse
Messages : 5894
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Ecrire un tantque avec un pour ?

Message par parisse » dim. mai 15, 2011 6:08 am

une boucle repeter jusqua test est en fait une boucle for avec un if (test) break; à la fin du corps de la boucle. A l'arret, de la boucle c'est donc toujours un break qui est évalué, donc la boucle renvoie comme valeur d'évaluation break; (toute instruction est algébrique en Xcas, y compris les structures de programmation). Si un programme n'évalue pas d'autre instruction, en particulier une instruction return, ce sera donc un break qui sera renvoyé.

alain974
Messages : 104
Inscription : lun. mai 24, 2010 11:15 am

Re: Ecrire un tantque avec un pour ?

Message par alain974 » dim. mai 15, 2011 7:05 am

parisse a écrit :une boucle repeter jusqua test est en fait une boucle for
Moi qui écrivais le contraire juste au-dessus: c'est comme deux serpents dont chacun mange l'autre par la queue: Génial! :idea:

parisse
Messages : 5894
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Ecrire un tantque avec un pour ?

Message par parisse » dim. mai 15, 2011 9:27 am

c'est une question de vocabulaire, je parlais d'une boucle for au sens qu'on lui donne quand on écrit for(init;tantque;increment) en C (toute boucle pouvant s'écrire de cette façon), d'un point de vue pratique alors que vous parliez d'une boucle définie d'un point de vue théorique encore que en pratique je pense qu'un corps de boucle modifiant l'index fera exécuter un nombre modifiable d'instructions. En pratique en effet, une boucle for est forcément implémentée par un saut du microprocesseur d'une adresse de code à une autre si un test est réalisé.

alb
Messages : 1331
Inscription : ven. août 28, 2009 3:34 pm

Re: Ecrire un tantque avec un pour ?

Message par alb » dim. mai 15, 2011 9:29 am

Puis-je affirmer que:
1/ pour...de...jusque...pas...fpour s'arrête nécessairement (je ne vois pas de contre-exemple)
2/ pour(...;...;...){...} peut ne pas s'arrêter comme dans l'exemple de l'élève d'alain974:

Code : Tout sélectionner

essai():={
local s,j;
s:=5;
pour(j:=1;j>=0;j++){s:=s+1};
}
:;

parisse
Messages : 5894
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Ecrire un tantque avec un pour ?

Message par parisse » dim. mai 15, 2011 10:02 am

Si, si le 1/ peut tourner indéfiniment si on change la valeur de l'index dans la boucle; par exemple
pour j de 1 jusque 10 faire j:=1 fpour;

Répondre