Programmer avec le langage Linotte
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

Programmer avec le langage LinotteConnexion

Besoin d'un conseil sur la programmation en Linotte ?

Le Deal du moment : -17%
(Black Friday) Apple watch Apple SE GPS + Cellular ...
Voir le deal
249 €

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] [résolu] Suite de Syracuse

more_horiz
A mon tour :

La suite de Syracuse est définie ainsi :
- on part d'un entier ;

- s'il est pair, on le divise par 2 ;
sinon, on le multiplie par 3 et on ajoute 1 ;

- on recommence la même opération sur l'entier obtenu, et ainsi de suite ;
la suite s'arrête si on arrive à 1.

Par exemple, si on part de 10, on obtient successivement 10/2=5, puis 3*5+1=16, puis 16/2=8, puis 4, puis 2, puis 1.

On pense (mais personne ne sait le montrer...) qu'une telle suite se termine toujours par 1, et on appelle durée de vol le nombre d'opérations nécessaires pour y arriver. Par exemple, en partant de 10, on voit qu'il a fallu 6 opérations : la durée de vol de l'entier 10 est égal à 6.

La question posée est donc d'écrire un programme qui, un entier étant donné par l'utilisateur, calcule et affiche sa durée de vol.

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
Voila ma proposition

Code:

Livre :
Saute mouton

Paragraphe :
Il était une fois
Les rôles :

benji & ricola est un nombre vide
Les actions :

Tu questionnes benji sur "Choisis un nombre !"
Tu vas vers l'iliad

Paragraphe :
iliad
Les rôles :

benji & ricola est un nombre
pitisuisse est un drapeau vide
rolala est un nombre valant 1
Les actions :

pitisuisse vaut benji inf rolala
Si benji est égal à rolala alors tu vas vers l'odysse
Si pitisuisse est égal à vrai alors tu vas vers l'évèque de Rome
Sinon, tu vas vers l'analogie

Paragraphe :
odysse
Les rôles :

finou est un texte valant "Si tu choisis 1, ce n'est pas très interessant.
.
.
"
Les actions :

Tu affiches finou
Tu vas vers Il était une fois

Paragraphe :
évèque de Rome
Les rôles :

finui est un texte valant "Choisis un nombre superieur à 1 !!!"
Les actions :

Tu affiches finui
Tu vas vers Il était une fois

Paragraphe :
analogie
Les rôles :

benji & ricola est un nombre
rififi & brouhaha est un nombre vide
Les actions :

brouhaha vaut benji/2
rififi vaut décimal brouhaha
Si rififi est égal à 0 alors tu vas vers la quiche
Sinon, tu vas vers la foire

Paragraphe :
quiche
Les rôles :

benji & ricola est un nombre
Les actions :

benji vaut benji/2
ricola vaut ricola+1
Si benji est égal à 1 alors tu vas vers le final
Sinon, tu vas vers l'analogie

Paragraphe :
foire
Les rôles :

benji & ricola est un nombre
Les actions :

benji vaut 3*benji+1
ricola vaut ricola+1
Si benji est égal à 1 alors tu vas vers le final
Sinon, tu vas vers l'analogie

Paragraphe :
final
Les rôles :

ricola est un nombre
vol est un texte valant "La durée de vol est de "
Les actions :

Tu ajoutes ricola dans le vol
Tu affiches le vol
Tu termines

Je sais pas trop comment ça marche, surtout au niveau du "paire/pas paire", mais ça marche <img src=" title="Big Grin" />

Édition : amélioration de la bête avec contournement des erreur " x<
1 ou x=1"

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
Bon, comme l'espèce drapeau n'est pas définie chez moi, j'ai dû modifier en conséquence le début du programme, mais sinon ça marche très bien... Bravo !

Mais on peut faire plus court (et en un seul paragraphe) avec l'instruction "tant que"... Veux-tu essayer ?

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
Faire court Surprised ! C'est pas vraiment mon truc, et je ne suis pas bien à l'aise avec les bouboucles, mais bon, pourquoi pas...

Petite question, juste comme ça, il y a un moyen de savoir directement si un nombre est pair avec Linotte ?
Autre question : Est-il possible de faire de sous-sous-paragraphes ?

Édition : Question supplémentaire !

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
Pour le test de parité, le plus simple est sans doute d'utiliser l'instruction mod, qui donne le reste de la division d'un entier par un autre.

Par exemple, n mod 2 donne le reste de la division de n par 2. S'il vaut 1, c'est que n est impair, et s'il vaut 0 c'est que n est pair.

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
Mouais, je vais faire de la récup, ça revient au même <img src=" title="Smile" />.

Autre question : Est-il possible de faire de sous-sous-paragraphes ?

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
bien sûr :
tu peux faire autant de sous-sous-sous-sous-(etc...)-sous-paragraphes que tu veux avec les instructions "lis" et "ferme".
Par contre, pour garder un livre clair, n'oublie d' indenter le livre ..

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
Voici ma proposition :

Code:

Syracuse :

("
La suite de Syracuse est définie ainsi :

- on part d'un entier ;

- s'il est pair, on le divise par 2 ;
sinon, on le multiplie par 3 et on ajoute 1 ;

- on recommence la même opération sur l'entier obtenu, et ainsi de suite ;
la suite s'arrête si on arrive à 1.

")

Principal :

Rôles :

durée est un nombre vide
e est un nombre
Actions :

demande e
tant que e est différent de 1, lis
durée vaut durée + 1
Si (e mod 2) est égal à 0 alors e vaut e / 2
Sinon, e vaut e * 3 + 1
Ferme
affiche durée
termine

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
Avec 0, j'ai une boucle infinie !

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
Un exemple avec une imbrication de sous-paragraphes. Il affiche les solutions à cet algorithme pour les entiers de 1 à 1000 :

Code:

Syracuse :

("
La suite de Syracuse est définie ainsi :

- on part d'un entier ;

- s'il est pair, on le divise par 2 ;
sinon, on le multiplie par 3 et on ajoute 1 ;

- on recommence la même opération sur l'entier obtenu, et ainsi de suite ;
la suite s'arrête si on arrive à 1.

")

Principal :

Rôles :

durée est un nombre vide
e est un nombre valant 1
b est un nombre valant 1
Actions :

tant que b est plus petit que 1001, lis
e vaut b
durée vaut 0
tant que e est différent de 1, lis
durée vaut durée + 1
Si (e mod 2) est égal à 0 alors e vaut e / 2
Sinon, e vaut e * 3 + 1
Ferme
affiche "Si l'entier vaut " + b + ", alors la durée est :
" + durée
b vaut b + 1
Ferme
termine

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
Un autre exemple !
Cette fois-ci, ce livre calcule la durée maximum trouvé entre 1 et 10000 :

Code:

Syracuse :

("
La suite de Syracuse est définie ainsi :

- on part d'un entier ;

- s'il est pair, on le divise par 2 ;
sinon, on le multiplie par 3 et on ajoute 1 ;

- on recommence la même opération sur l'entier obtenu, et ainsi de suite ;
la suite s'arrête si on arrive à 1.

")

Principal :

Rôles :

durée est un nombre vide
e est un nombre valant 1
b est un nombre valant 1
e_max est un nombre vide
durée_max est un nombre vide
Actions :

tant que b est plus petit que 10001, lis
e vaut b
durée vaut 0
tant que e est différent de 1, lis
durée vaut durée + 1
Si (e mod 2) est égal à 0 alors e vaut e / 2
Sinon, e vaut e * 3 + 1
Ferme
Si durée est plus grand que durée_max alors lis
e_max vaut b
durée_max vaut durée
Ferme
b vaut b + 1
Ferme
affiche "Si l'entier vaut " + e_max + ", alors la durée vaut :
" + durée_max
termine

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
même si ce n'est pas obligatoire, on peut aussi faire par récursion:

Code:

syracuse récursif :


entrée :

rôles :

n est un nombre
actions :

demande n
n = abs( arrondi( n )) ("pour s'assurer qu'il s'agit bien d'un entier positif ")
parcours syracuse avec n
affiche "la durée du vol est " + n
termine

syracuse :

rôles :

*x est un nombre
actions :

si arrondi(x / 2) est égal à (x / 2) alors x = x / 2
sinon , x = 3 * x + 1
si x est plus grand que 1 alors parcours syracuse avec x
sinon , x = 0
x = x + 1
reviens

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
Oula, ça part sur du compliquer Surprised. C'est sympa <img src=" title="Smile" />

Voila où j'en étais pour le "1 paragraphe" :

Code:

Livre :
Saute éléphant

Paragraphe :
Tell me more ("Grease power")
Les rôles :

cristal & émeraude & diamant est un nombre
rubis est un texte valant "La durée de vol est de "
Les actions :

Tu questionnes le cristal sur "Choisis un nombre strictement superieur à 1 =) !"
Le diamant vaut le cristal/2
Le diamant vaut décimal diamant
Si le cristal est égal à 1 alors tu lis
Tu ajoutes l'émeraude dans le rubis
Tu affiches le rubis
Tu termines
Tu fermes
Sinon, tu lis
Si le diamant est égal à 0 alors tu lis
Le cristal vaut le cristal/2
L'émeraude vaut l'émeraude+1
Tu fermes
Sinon, tu lis
Le cristal vaut 3*cristal+1
L'émeraude vaut l'émeraude+1
Tu fermes
Tu vas vers Tell me more

Mais l'atelier surligne "Sinon, tu lis" et me dit que "La structure du sous-paragraphe est incorrecte".

Où est mon erreur ?

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
rien de grave :
c'est juste que le dernier sous-paragraphe n'est pas refermé.
il faut que tu ajoutes "tu fermes" à la fin de ton livre.




.

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
Ha, oui... Merci :p !

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
[quote=cpc]Avec 0, j'ai une boucle infinie ![/quote]
Effectivement, j'aurais dû préciser que l'entier de départ était supérieur ou égal à 1...

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
Je ne pense pas que le programme "Saute éléphant" puisse fonctionner tel quel, parce que l'ordinateur va redemander l'entier à chaque fois qu'on reprend le paragraphe.

Si on ne veut pas utiliser l'instruction "Tant que", je pense que deux paragraphes sont nécessaires : un pour demander l'entier, l'autre pour calculer la durée de vol.

La solution de Ronan est celle à laquelle je pensais, mais celle de $imon ne manque pas d'élégance...

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
J'ai un doute sur la méthode récursive. Je me demande si la suite de Syracuse si prête ! Mais je ne sais pas le prouver mathématiquement...

description[simple-moyen] [résolu] Suite de Syracuse Empty[simple-moyen] Suite de Syracuse

more_horiz
Si si ça marche très bien, je l'ai testée.

Au fait, comment fait-on pour modifier le titre du topic (pour préciser qu'il est résolu) ?

description[simple-moyen] [résolu] Suite de Syracuse EmptyRe: [simple-moyen] [résolu] Suite de Syracuse

more_horiz
privacy_tip Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
power_settings_newSe connecter pour répondre