Ecrire un tantque avec un pour ?
Modérateur : xcasadmin
Ecrire un tantque avec un pour ?
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.
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.
Re: Ecrire un tantque avec un pour ?
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;}
Re: Ecrire un tantque avec un pour ?
Pour info, Gödel et Kleene ont trouvé une manière plus pompeuse d'exprimer cela:alb a écrit :je pensais pouvoir écrire un tantque avec un pour mais manifestement non.
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)
Re: Ecrire un tantque avec un pour ?
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:
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
Et s'ils ne la bouclent toujours pas je leur demande un repeter...jusqua...
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;
}
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

Et s'ils ne la bouclent toujours pas je leur demande un repeter...jusqua...

Re: Ecrire un tantque avec un pour ?
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 ... article453alb a écrit :Et s'ils ne la bouclent toujours pas je leur demande un repeter
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...
Re: Ecrire un tantque avec un pour ?
Le debugueur appliqué à ces 4 fonctions montre bien comment tout est interprété avec des for:
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 ?
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;
}
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 ?
Re: Ecrire un tantque avec un pour ?
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é.
Re: Ecrire un tantque avec un pour ?
Moi qui écrivais le contraire juste au-dessus: c'est comme deux serpents dont chacun mange l'autre par la queue: Génial!parisse a écrit :une boucle repeter jusqua test est en fait une boucle for

Re: Ecrire un tantque avec un pour ?
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é.
Re: Ecrire un tantque avec un pour ?
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:
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};
}
:;
Re: Ecrire un tantque avec un pour ?
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;
pour j de 1 jusque 10 faire j:=1 fpour;