Worldedit
  Worldedit
Le site sur l'éditeur de warcraft 3 !
 
  FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs   medals.php?sid=114023b97a79f926e1f18d5c4fb3e423Médailles   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 
  FAQFAQ World Editor   UploadUploader une map ou une image    UploadAjouter sa map à l'annuaire   UploadConsulter l'annuaire

Débuter en JASS
Aller à la page Précédente  1, 2
 
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Tutoriels
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
 Tirlititi



Inscrit le: 21 Fév 2010
Messages: 1785
Sujets: 22
Spécialité en worldedit: La modestie
Médailles: 1 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 03/09/10 10:45    Sujet du message: Citer

Hum, Hum. Je suis pas du tout convaincu par ton exposé sur les boucles.
En quoi ces schémas sont-ils une base de toutes les boucles envisageables en programmation?
J'ai l'impression qu'avec une seule d'entre elles, on obtient une base...

Déjà, la différence entre le repeat/until et le while est minime : on peut passer de l'un à l'autre. Par exemple :
Code:
int i=0,j=0;
do {
    i=i+j;
    j=j+1;
} while (i<=j);

c'est pareil que :
Code:
int i=0,j=0;
i=i+j;
j=j+1;
while (i<=j) {
    i=i+j;
    j=j+1;
}

Et pour le sens inverse, on peut utiliser un if/then.

De même, le for semble ne produire que des boucles à fin finies et prévisibles mais...
Code:
int i,j=0;
for (i=0;i<=j;j++) {
    i=i+j;
}

On peut aussi utiliser des conditions du genre " i%2==0 " ou d'autres trucs farfelus.

Une boucle présentée comme ça serait vraiment différente, pour moi :
Code:
int i=0,j=0;
Boucler 4 {
    i=i+j;
    j=j+1;
}

Quand il faut spécifier explicitement le nombre de fois qu'on répète, ça donne une boucle moins puissante.
C'est bien sûr des exemples, ça fait pas office de preuve, mais si tu peux me trouver un contre-exemple - c'est-à-dire un for, un repeat/until ou un while qui ne peut s'écrire que sous une forme - ou si tu me dis que c'était pas ce que tu entendais par "base", tu me convaincras ^^.

Ce que tu as présenté, ça m'a juste l'air d'être les différentes boucles en C...
_________________
Warcraft III, c'était mieux avant. Y'avait des purs chefs-d'oeuvres du mapping !
Road Of Glory (par moi)
Casse-briques (par moi)
Temple de Glace (par moi)
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Magus
Membre a fort taux de post


Inscrit le: 13 Oct 2007
Messages: 994
Sujets: 25
Spécialité en worldedit: Codeur


MessagePosté le: 03/09/10 16:47    Sujet du message: Citer

Les schémas que j'ai présente sont les 3 schémas de boucles utilisés pour faire des preuves de programme. Ce n'est pas limité au C. C'est utilisé en algorithmie et dans les preuves de programmes axiomatiques.

Pour les exemples que tu donnes, ce sont des exemples précis. Tu sais le code que tu as dedans. Donc tu vois à l'oeil nu que les 2 premiers exemples que tu donnes sont équivalent. Et c'est bien normal.
Les preuves de programmes ne se limitent pas à des cas simples et unitaires comme ceux qui tu as montré.

Avec un cas plus complexe, il est dans la pratique énormément difficile de prouver qu'une boucle est équivalente à une autre. Sauf par les axiomes.

Pour les "for" avec des conditions autre que "index < fin", ce sont des while. Car la condition ne permet plus de savoir "combien de fois" la boucle va s'itérer.
Le reste n'est que de la syntaxe, absolument pas de la sémantique.

Il faut toujours du sens à ton code. Sinon tu finiras toujours pas t'emmêler les pinceaux quelque part.
Quand tu fais une boucle, il faut que tu saches pourquoi tu utilises celle la et pas une autre.

Si tu choisis une boucle au pif et qu'on te demande de prouver ton programme (et je parle de vrai preuves de programmes. Des preuves qui ressemblent beaucoup aux preuves mathématiques) tu vas pourquoi commencer à sangloter doucement.
_________________
- La théorie c'est quand rien ne fonctionne mais tout le monde sait pourquoi.
- La pratique c'est quand tout fonctionne mais personne ne sait pourquoi.
- Chez moi la théorie et la pratique sont réunies, rien ne fonctionne et personne ne sait pourquoi.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 Tirlititi



Inscrit le: 21 Fév 2010
Messages: 1785
Sujets: 22
Spécialité en worldedit: La modestie
Médailles: 1 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 03/09/10 19:29    Sujet du message: Citer

Bon, allez, j'ai donné des exemples parce que je pensais que ça te suffirait...

Soit le code b, une boucle de type repeat/until, équivalent au code C :
Code:
do {
    code k
} while (condition w);

Et soit le code b' équivalent au code C :
Code:
code k
while (condition w) {
    code k
}

Le type booléen étant dans une logique de tiers-exclu, la condition w ne peut renvoyer que TRUE ou FALSE à chaque fois qu'elle est testée lors de l'exécution du code.

Cas 1 : w renvoi FALSE après la première exécution de k.
Dans ce cas, le code b exécute le code k une fois puis, w retournant FALSE, abandonne la boucle et se fini. De même, le code b' exécute le code k puis, w retournant FASLE, ignore la boucle et se fini.
Donc b <=> b'.

Cas 2 : w renvoi systématiquement TRUE après l'exécution de k.
Dans ce cas, le code b exécute le code k puis, w retournant TRUE, ré-exécute le code k. Comme w retourne TRUE indéfiniment, la boucle ne se finit jamais et k est exécuté jusqu'à une interruption externe.
De même, le code b' exécute le code k puis, w retournant TRUE, entame une boucle infinie qui ne se finira qu'avec une interruption externe.
Donc b <=> b'.

Cas 3 : w renvoi TRUE jusqu'à la n-ième exécution de k (n>0) après quoi il renvoi FALSE au moins une fois.
Dans ce cas, le code b exécute le code k puis, w retournant TRUE n-1 fois, ré-exécute k n-1 après quoi w renvoi FALSE et b se fini.
De même, le code b' exécute k une fois puis entame une boucle qui exécute k n-1 fois, après quoi w renvoi FALSE et la boucle et le code b' se finissent.
Donc b <=> b'.

Dans les cas où w est munie d'une fonction de randomisation ou, plus généralement, lorsque le résultat de w dépend de l'environnement lors de l'exécution, les code b et b' réagissent de la même façon (admis).

Donc le code b, qui est le prototype des boucles de type repeat/until, est équivalent au code b' qui n'utilise pas de boucle repeat/until mais une boucle while.
Donc les boucles repeat/until peuvent être codées à partir d'une boucle while.
Donc aucune base de l'ensemble des boucles programmables ne pourra contenir les boucles de type repeat/until et while en même temps (puisque while est de puissance supérieure ou égale à repeat/until).

Et hop, repeat/until est programmable à partir de while... Je pourrait prouver la réciproque mais je vois pas trop l'intérêt...

Citation:
Le reste n'est que de la syntaxe, absolument pas de la sémantique.

Ce que je te reproche c'est justement de faire passer ce que tu crois être une base "sémantique" (c-à-d que, à chaque fois que tu fais une boucle, tu as dans l'idée d'utiliser la fonction d'un de ces 3 types de boucles) pour une base "de puissance".

Donner du sens à un code, je veux bien mais c'est uniquement avec la syntaxe que tu donnes du sens (sinon, on coderait en langage machine). Et la syntaxe que tu emploies, c'est celle du C. En jass, par exemple, quelqu'un qui veut répéter une action 10 fois, il utilisera la même syntaxe que s'il veut répéter l'action jusqu'à ce que l'unité meurt et ça ne lui posera pas de problème d'expliquer à quoi sert la boucle puisqu'il regardera directement la condition et qu'elle indique à elle seule le sens de la boucle.

Et puis si on te demande de "prouver" ton programme, t'as plutôt intérêt à en connaître le fonctionnement aussi bien voire mieux que lorsque tu l'as écrit et que t'as choisi le type de boucle que tu voulais mettre...
_________________
Warcraft III, c'était mieux avant. Y'avait des purs chefs-d'oeuvres du mapping !
Road Of Glory (par moi)
Casse-briques (par moi)
Temple de Glace (par moi)
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Magus
Membre a fort taux de post


Inscrit le: 13 Oct 2007
Messages: 994
Sujets: 25
Spécialité en worldedit: Codeur


MessagePosté le: 04/09/10 18:34    Sujet du message: Citer

Tes 2 exemples sont faux. Enfin faux ... ils sont pas faux dans le sens ou c'est du code qui fonctionne, mais ça ne correspond pas à ce que j'ai dit.

Mais en fait je viens de me rendre compte que j'ai mis une erreur dans mon poste c'est moche.
Le vrai schéma du while (quand on a les yeux en face des trous et qu'on est réveillé) :

Code:
Récupération du premier élément
while (!(condition_de_fin)) {
    ... //traitement
    Récupération de l'élément suivant
}


Toutefois, il restera toujours possible de l'écrire autrement avec un repeat / until (ou un do / while) si tu as envie. Mais ce que tu n'as pas compris c'est que c'est pas l'intérêt en fait :/
L'idée est pas d'avoir un truc qu'on peut pas ré-écrire autrement. L'idée est simplement d'avoir 3 briques de bases qu'on utilisent ensuite partout. En sachant que ces 3 briques ont des propriétés connus et précises qui peuvent utilisés dans tous les sens possibles pour les preuves de programmes.

Citation:
Donner du sens à un code, je veux bien mais c'est uniquement avec la syntaxe que tu donnes du sens (sinon, on coderait en langage machine).

C'est la base de l'algorithmie. Coder en "algorithme". Un langage assez "humain" complètement abstrait. Avec l'expérience cette étape est en général faite automatiquement. On la fait de tête. Mais elle existe toujours.
Il est évident qu'on va pas tous coder en langage machine ça va un peu piquer ...

La syntaxe d'un langage ne doit pas donner plus de sens à un algorithme. L'algorithme que l'on va coder doit déjà avoir du sens, avant même qu'on commence à le coder, et ce dans n'importe quel langage.
Laisse tomber la syntaxe dans mes posts. J'ai pris une syntaxe qui ressemble à du C mais si tu veux tu peux ré-écrire mes boucles avec du pascal ou ce que tu as envie. C'est juste qu'en Jass le seul mot clé qu'on a c'est "loop", c'est pas très parlant de dire que "cette boucle c'est un while" avec un "loop" :/
_________________
- La théorie c'est quand rien ne fonctionne mais tout le monde sait pourquoi.
- La pratique c'est quand tout fonctionne mais personne ne sait pourquoi.
- Chez moi la théorie et la pratique sont réunies, rien ne fonctionne et personne ne sait pourquoi.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 Tirlititi



Inscrit le: 21 Fév 2010
Messages: 1785
Sujets: 22
Spécialité en worldedit: La modestie
Médailles: 1 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 05/09/10 09:56    Sujet du message: Citer

Magus a écrit:
Ces 3 schémas de boucles (le for, le while et le repeat until (ou le do while) sont la bases de toutes les boucles en programmation et n'importe quelle assemblage de boucle peut au final se ré-écrire avec ces 3 schémas.

Tirlititi a écrit:
J'ai l'impression qu'avec une seule d'entre elles, on obtient une base...

Déjà, la différence entre le repeat/until et le while est minime : on peut passer de l'un à l'autre.

Magus a écrit:
Pour les exemples que tu donnes, ce sont des exemples précis. Tu sais le code que tu as dedans. Donc tu vois à l'oeil nu que les 2 premiers exemples que tu donnes sont équivalent. Et c'est bien normal.
Les preuves de programmes ne se limitent pas à des cas simples et unitaires comme ceux qui tu as montré.

Tirlititi a écrit:
Donc le code b, qui est le prototype des boucles de type repeat/until, est équivalent au code b' qui n'utilise pas de boucle repeat/until mais une boucle while.
Donc les boucles repeat/until peuvent être codées à partir d'une boucle while.

Magus a écrit:
Tes 2 exemples sont faux. Enfin faux ... ils sont pas faux dans le sens ou c'est du code qui fonctionne, mais ça ne correspond pas à ce que j'ai dit.

J'espère que tu te rends compte de ta mauvaise foi... Au passage, ce ne sont pas des exemples mais une preuve, le code b pouvant représenter n'importe quelle boucle repeat/until...

Magus a écrit:
La syntaxe d'un langage ne doit pas donner plus de sens à un algorithme. L'algorithme que l'on va coder doit déjà avoir du sens, avant même qu'on commence à le coder, et ce dans n'importe quel langage.

Ce que je t'ai dit dans mon dernier post, c'est qu'il est inutile et illusoire de faire de l'algorithmique sans savoir dans quel langage tu vas coder ensuite. Je t'ai prouvé que ces 3 schémas de boucles ne formaient pas une base mathématique ou logique : il s'agit simplement des 3 formes des boucles en C et dans les langages qui y ressemblent de ce point de vue-là...

C'est déplacé de faire la distinction entre ces 3 schémas en jass. Ce qui est utile dans un langage ne l'est pas forcément dans un autre.
Si tu as fait la distinction quand tu as fait de l'algorithmique, c'est parce qu'on te préparait à coder en C. On m'a fait la même chose : l'algorithmique telle que je l'ai apprise en cours, c'était du C avec les mots en français et une syntaxe simplifiée. Sur le coup, ça ne m'a pas choqué et c'est comme ça que ça fonctionne, mais il faut en être conscient et pas juste penser que l'algorithmique est pure et indépendante du langage que tu vas utiliser ensuite.

Je précise que, d'habitude, j'aime pas dire les chose catégoriquement mais j'arriverais pas à te faire douter de quoi que ce soit si je ne le fais pas...
_________________
Warcraft III, c'était mieux avant. Y'avait des purs chefs-d'oeuvres du mapping !
Road Of Glory (par moi)
Casse-briques (par moi)
Temple de Glace (par moi)
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Magus
Membre a fort taux de post


Inscrit le: 13 Oct 2007
Messages: 994
Sujets: 25
Spécialité en worldedit: Codeur


MessagePosté le: 05/09/10 17:47    Sujet du message: Citer

Citation:
Mais ce que tu n'as pas compris c'est que c'est pas l'intérêt en fait :/
L'idée est pas d'avoir un truc qu'on peut pas ré-écrire autrement. L'idée est simplement d'avoir 3 briques de bases qu'on utilisent ensuite partout. En sachant que ces 3 briques ont des propriétés connus et précises qui peuvent utilisés dans tous les sens possibles pour les preuves de programmes.


Quitte à quoter mon message autant quoter ce qui est important hein. Parce que si on commence a parler de mauvaise fois ça risque de mal finir Very Happy

Citation:
Ce que je t'ai dit dans mon dernier post, c'est qu'il est inutile et illusoire de faire de l'algorithmique sans savoir dans quel langage tu vas coder ensuite.


Pourquoi donc ? Qu'est ce que cela change ?
Si on prend pas un langage "nul". On va donc éviter de parler du brainfuck et compagnie ici.

Tu écris un algorithme.
Qu'est ce que cela change si ensuite tu l'écris en Jass, en Php, en Java, en C, en smalltalk, en python ?
Si on met la syntaxe de côté (surtout la syntaxe du Jass qui est parfois peu un bizarre), il n'y a aucune différence. L'algorithme restera précisément le même, quelque soit le langage. Et encore heureux sinon ça poserait pas mal de problème si un langage oblige de modifier un algorithme.

Citation:
Je t'ai prouvé que ces 3 schémas de boucles ne formaient pas une base mathématique ou logique : il s'agit simplement des 3 formes des boucles en C et dans les langages qui y ressemblent de ce point de vue-là...

Même si les preuves de programme sont assez proche des mathématiques dans l'esprit, elles en sont bien loin dans l'application. Les 3 schémas de boucles ne sont pas comme des formules de mathématiques. Ce ne sont pas des théorèmes uniques et/ou complémentaires qui forment des axiomes sur lesquelles repose toute une science à elle tout seule.

Ce sont juste des "schémas de base" aux quels ont se rapporte quand on veut prouver un programme. Tout simplement parce qu'on en connait les propriétés et qu'elles ont déjà été prouvées plusieurs fois.

Citation:
C'est déplacé de faire la distinction entre ces 3 schémas en jass. Ce qui est utile dans un langage ne l'est pas forcément dans un autre.
Si tu as fait la distinction quand tu as fait de l'algorithmique, c'est parce qu'on te préparait à coder en C. On m'a fait la même chose : l'algorithmique telle que je l'ai apprise en cours, c'était du C avec les mots en français et une syntaxe simplifiée. Sur le coup, ça ne m'a pas choqué et c'est comme ça que ça fonctionne, mais il faut en être conscient et pas juste penser que l'algorithmique est pure et indépendante du langage que tu vas utiliser ensuite.


On a pas eu les mêmes cours je pense. Mes cours d'algorithmies sur les axiomes et les preuves des programmes ne reposaient sur aucun langage. Pour tout dire, la matière qui contenait environ 40h (20h de cours et 20h de TD), on a pas codé une seule fois et on a fait référence à aucun langage "pratique". Seulement des langages théoriques comme le Pi-calcul, le langage utilisé pour les preuves avec les axiomes (j'ai oublié son nom. C'est un langage qui fait beaucoup penser aux mathématiques des fois) ...

Et je peux te confirmer que ces 3 schémas de boucles n'ont absolument rien à voir avec le C ou n'importe quel autre langage. En recherchant sur le net et dans des livres d'algorithmie tu pourras retrouver les explications et les propriétés précises de ces 3 schémas de boucle.

Et encore une fois, je rappel que le but du jeu c'est pas d'écrire 3 corps uniques. Il est évident qu'on peut ré-écrire un while avec un repeat ou même un for avec un while si on veut. Mais oublie les mots clés, ce n'est absolument pas le but de ce que j'essaie d'expliquer ici :/
_________________
- La théorie c'est quand rien ne fonctionne mais tout le monde sait pourquoi.
- La pratique c'est quand tout fonctionne mais personne ne sait pourquoi.
- Chez moi la théorie et la pratique sont réunies, rien ne fonctionne et personne ne sait pourquoi.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Tutoriels Toutes les heures sont au format GMT + 1 Heure
Aller à la page Précédente  1, 2
Page 2 sur 2

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com