En rédaction...

La programmation, c'est facile !

Aux lecteurs

Qui peut lire ce cours ?

Ce cours est destiné pour tout le monde, plus précisément les personnes de 7 ans et plus. Si vous êtes un adulte, et que vous voulez apprendre, ce cours vous fera apprendre la programmation très facilement. Si vous êtes un adulte, vous pouvez apprendre à vos enfants la programmation.

Il vaut mieux éviter qu'un enfant trop jeune lise ce cours lui-même. Il faut plutôt qu'un adulte le fasse, avec des gestes, lentement, en lui demandant souvent de répéter, s'il a compris, et en le faisant écrire tous les exemples de code. Aussi, ne lui lisez pas les titres, ils contiennent des termes "techniques" qui perdraient l'enfant.

Objectif : la pédagogie

N'utilisez pas trop de termes comme "fonctions", "opérateur", et même programmation trop tôt dans le cours. Il faut présenter chacune des notions avec des mots simples, qui se basent sur ce que l'enfant connaît déj&agra;ve, et on ne peut en donner le nom que lorsque la notion lui est familière. Présentez la programmation comme une activité amusante, qui permet de faire des trucs intéressants avec un ordinateur, autre que le jeu, sinon, il ne sera pas motivé pour essayer

Dans ce cours, on parle très simplement, pour que les enfants comprennent, et on répète beaucoup de fois les mêmes choses pour bien apprendre.

Il ne faut pas savoir grand-chose pour le comprendre :

C'est quoi, la programmation ?

Vous devez vous demander : c'est quoi la programmation ? Ca veut dire quoi programmer ? En fait, ca permet de créer plein de choses sur un ordinateur : des jeux vidéo, des sites internet, et tout ce qui existe dans un ordinateur, et mê sur Wii, PS3, XBox, DS, PSP, etc.

On va donc apprendre à programmer en commençant par des trucs très faciles et petit à petit on ce sera plus intéressant et un peu plus compliqué. À la fin, vous pourrez faire des jeux vidéo, et d'autres choses géniales ! Vous allez voir que c'est facile.

C'est très amusant, tellement amusant que certaines personnes passent des journées et des nutis entières à en faire !

En plus, vous allez devenir plus intelligent. C'est normal : quand on apprend des nouvelles choses, on devient plus intelligent.

Pour finir, comme c'est une activité très nouvelle, on trouve beaucoup de métiers de programmation quand on est adulte.

Premiers pas

Pour programmer, on va aller sur [url=http://tryhaskell.org/]un site spécial[/url]. Sur ce site, il faut taper les nombres, les signes, et tout le reste au clavier dans le gros cadre au milieu.

On va d'abord utiliser l'ordinateur pour faire des mathématiques ! Comme une calculatrice.

Ecrivons des nombres :

5
=> 5
10
=> 10

Quand on écrit quelque-chose, ça affiche le résultat en-dessous, après une flèche "=>". Si on écrit simplement un nombre, le nombre est réécrit en-dessous.

Des mathématiques de base

On va faire une addition : on met deux nombres ensemble, et ça en fait un plus grand. Regardez :

1 + 2
=> 3

On peut faire plusieurs additions sur une seule ligne :

10 + 3 + 2
=> 15
C'est pareil que de faire
10 + 5
=> 15
ou
13 + 2
=> 15

Vous voyez ? Quand on écrit une ligne longue et compliquée, après, elle devient plus petite au fur et à mesure, et à la fin ça devient le résultat, qui est le plus petit.

Maintenant, faisons une soustraction. On fait un nombre plus petit avec deux nombres.

5 - 3
=> 2

On peut utiliser les deux ensemble.

5 + 6 - 1
=> 10
C'est pareil que de faire :
5 + 5
=> 10
ou
11 - 1
=> 10

La multiplication : c'est comme faire plusieurs fois des additions.

2 * 2
=> 4
2 + 2
=> 4
2 * 3
=> 6
2 + 2 +2
=>  6
6 * 1
=> 6
1 + 1 + 1 + 1 + 1 + 1
=> 6
10 * 10
=> 100
10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10
=> 100
C'est super pratique, la multiplication.

Vous connaissez la division ? C'est très simple.

10 / 2
=> 5
4 / 1
=> 4
4 / 4
=> 1
6 / 2
=> 3
6 / 3
=> 2
En fait, diviser, c'est comme "couper" le premier nombre avec le deuxième. Quand on coupe 10 en 2, on a bien 5 et 5. Quand on coupe 4 en 1, ça veut dire qu'on le coupe pas, donc on a toujours 4. Et quand on coupe 4 en 4 morceaux, on a des 1 !

On peut faire tout ces calculs de tête, mais on peut aussi écrire des calculs très compliqués que seul l'ordinateur peut faire : 1 + 3 + 584754 * 38383498 / 3434234 - 324249 => 6211391.182476791

Maintenant, on va faire des choses plus intéressantes ! On a vu l'addition, la soustraction, etc. et maintenant on va voir une nouvelle chose : la racine carrée :

sqrt 100
=> 10.0
Donc on écrit "sqrt", puis un nombre, et on a un résultat. Vous vous souvenez de la multiplication ? Quand on fait 10 * 10, ça fait 100. Quand on fait 2 * 2, ça fait 4. Quand on fait 3 * 3, ça fait 9. En fait, quand on multiplie le même nombre, le résultat s'appelle le carré de ce nombre. Le carré de 10, c'est 100, parce-que 10 * 10 = 100. Vous avez compris ? Donc dans 10 * 10 = 100, 100 s'appelle le carré, et 100 s'appelle la racine carrée.
10 * 10
=> 100
sqrt 100
=> 10
En fait, c'est comme aller à l'envers. Essayez de trouver la racine carrée de ces nombres : 1, 4, 9, 16, 25, 36, 49, 64, 81, 100 dans votre tête, et après vérifiez sur l'ordinateur avec sqrt. Un indice : vous avez les réponses dans vos tables de multiplication.
sqrt 1
=> 1
1 * 1
=> 1
sqrt 4
=> 2
2 * 2
=> 4
sqrt 9
=> 3
3 * 3
=> 9
sqrt 16
=> 4
4 * 4
=> 16
sqrt 25
=> 5
5 * 5
=> 25
sqrt 36
=> 6
6 * 6
=> 36
sqrt 49
=> 7
7 * 7
=> 49
sqrt 64
=> 8
8 * 8
=> 64
sqrt 81
=> 9
9 * 9
=> 81
Ouf ! On a tout vérifié.

Syntaxe de base des opérateurs et des fonctions Donc, on a vu que :

Un autre type : les chaînes de caractères

Jusqu'à là, on a utilisé que des nombres et on a fait que des mathématiques. Vous devez un peu en avoir marre. Maintenant, on va utiliser des mots ! Oui, c'est possible. Essayez d'écrire :
"bonjour"
=> "bonjour"
"hello"
=> "hello"
En fait, j'appelle ça des mots, mais on peut écrire n'importe-quoi dedans :
"dshfbdhbhdfg"
=> "dshfbdhbhdfg"
même des chiffres et d'autres trucs :
"abifgr132435:;;++)sfdf"
=> "abifgr132435:;;++)sfdf"
mais on va quand-même dire que c'est des mots pour faire simple. Les mots, il faut les écrire entre guillemets : ". Sinon, l'ordinateur les mélange avec les trucs comme + et sqrt Ecrire "+" et +, ce n'est pas la même chose !

Des fonctions sur chaînes de caractères

Vous vous souvenez de sqrt ? Il faut écrire un nombre après, et après on a un autre nombre comme résultat.

sqrt 100
=> 10
Eh bien, il existe aussi des trucs comme sqrt, mais qui marchent sur les mots. On écrit un mot après, et on a un mot comme résultat !
trucCommeSqrt motApres
=> motRésultat
On va utiliser quelque-chose qui met un mot à l'envers, et qui s'appelle reverse (ça veut dire "retourner" en français) :
reverse "bonjour"
=> "ruojnob"
reverse "azerty"
=> "ytreza"
reverse "gnocchi"
=> "ikcong"
reverse met la première lettre du mot à la fin, la dernière lettre au début, etc. essayez quelque-chose d'amusant : mettez votre prénom à l'envers :
reverse "romain"
=> "niamor"

reverse est très amusant, et il n'est pas tout seul. il y a encore plein d'autres trucs ou il faut écrire un mot à côté pour avoir un autre mot en résultat. Par exemple, sort (qui veut dire "ranger" en anglais). Essayons-le, et essayez de deviner ce qu'il fait en regardant les résultats !

sort "ballon"
=> "abolln"
sort "abeille"
=> "abeeill"
sort "zyx"
=> "xyz"
sort "abc"
=> "abc"
Vous avez deviné ? sort range les lettres du mot écrit à droite dans l'ordre alphabétique. C'est pour ça que "abc", qui est déjà dans l'ordre alphabétique, reste "abc" dans le résultat. Pour rappel, voici l'alphabet : abcdeghijklmnopqrstuvwxyz Essayez d'utiliser sort sur votre prénom ! Pour moi, ça donne
sort "romain"
=> "aimnor"

Donc, on a vu que sort et reverse pour les mots, c'est un peu comme sqrt pour les nombres ! On va en découvrir encore plein d'autres plus tard.

Les listes

[1, 2, 3]
=> [1, 2, 3]

> [1,2,10,30,1000]
=> [1,2,10,30,1000]
> map (+1) [1,2,10,30,1000]
=> [2,3,11,31,1001]
> map (*10) [1, 2, 3, 4, 50]
=> [10,20,30,40,500]
> map (*150) [345,128,3456,1234567890]
=> [51750,19200,518400,185185183500]
> map (/2) [123,46454,5767676,354434,1234567890]
=> [61.5,23227.0,2883838.0,177217.0,6.17283945e8]
> ["Anna", "Jeanne", "Edouard", "Romain"]
=> ["Anna", "Jeanne", "Edouard", "Romain"]
> map reverse ["Anna", "Jeanne", "Edouard", "Romain"]
=> ["annA","ennaeJ","drauodE","mianoR"]
> sort "Jeanne"
=> "aeennJ"
> sort "reptiles"
=> "eeilprst"
> map sort ["Anna", "Jeanne", "Edouard", "Romain"]
=> ["annA", "aeennJ", "addoruE", "aimnoR"]


Fonctions
elles prennent des ingrédients : elles font un plat avec
elles prennent des matériaux (briques, ciment) : et font une maison avec
elle prennent des trucs : les utilisent ensemble, et créent une nouvelle chose avec
par exemple sqrt

combiner des fonctions
sort trie dans l'ordre alphabétique : abcdefg
mais comment on fait si on veut dans le sens contraire ? zyx...
il n'y a pas de fonction sortinverse, mais on peut quand même le faire
reverse (sort "bazyx")

exercice : donner les types des fonctions
après les avoir utilisées, dire quels genres de trucs elles prennent

créer ses fonctions
double 2
"double" prend 2, fait un truc avec, et crée 4

faire que ce soit amusant
la fonction "reverse" amuse les enfants. lire son nom à l'envers

à chaque fois, montrer les étapes avec la substitution

> reverse "Jeanne"
=> "ennaeJ"
> sort "zab"
=> "abz"
> reverse "abz"
=> "zba"
> reverse (sort "zab")
=> "zba"
> reverse (sort "wcg")
=> "wgc"
> --anagramme
not an expression: `--anagramme'
> 5 == 4
=> False
> 5 == 5
=> True
> "CACA" == "CACA"
=> True
> "caca" == "prout"
=> False
> "Romain" == "Rom"
=> False
> sort "manoir" == sort "romain"
=> True
> sort "abc" == sort "acb"
=> True
> sort "abc" == sort "Romain"
=> False
> sort "abc" == sort "acb"
=> True

> 1 * 2
=> 2
> 2 * 2
=> 4
> 5 * 
:1:5: parse error (possibly incorrect indentation)
> 5 * 2
=> 10
> 10 * 2
=> 20
> 100 * 2
=> 200
> 19327847834 * 2
=> 38655695668
> 1.243487 * 2
=> 2.486974
> 0.1 * 2
=> 0.2

les fonctions
• Monsieur Anagramme, dites-moi si ce mot : "romain" et celui-là : "manoir", sont des anagrammes * donne à mr anagramme *
• attendez, je vais vérifier et je reviens tout de suite. *...* Oui, tenez, voilà le résultat. * donne à utilisateur *
• Ah, True, merci.
anagramme "romain" "manoir"
True
anagramme "OLOLILALA" "a"
False
en fait, monsieur anagramme, quand il est parti faire son calcul, est allé demander aux jumeaux messieurs sort de donner le résultat de leurs mots à monsieur ==, qui a donné son résultat à monsieur anagramme, qui est venu nous le donner.

Plus sur les listes
on a déjà vu des listes
[1, 2, 3, 10]
["Bonjour", "Hello", "Konichiwa"]

on a utilisé des listes de nombres, des listes de mots, maintenant on va faire des listes de caractères.
un caractère, c'est quoi ? c'est une lettre, un chiffre, un signe de ponctuation. mais c'est juste un seul truc, c'est pas comme les mots entre guillements
'a'
'z'
'?'
'5'
eux, on les écrit entre guillemets simples
et les mots sont écrits comme ça
"ofkdgjfig2'34/"
entre guillemets doubles

en fait, vous savez ce que sont les "mots" entre guillemets ?

Haskell fait la différence entre les majuscules et les minuscules.
'a' == 'a'
=> True
'a' == 'A'
=> False

il y a donc un problème dans notre fonction anagramme
jusqu'à là, on a écrit le prénom "romain" en minuscule, mais si on l'écrit comme il faut, avec une majuscule, on a :
anagramme "Romain" "manoir"
=> False
à la place de
anagramme "romain" "manoir"
=> True

on fait donc des listes avec eux
['b', 'o', '5', '?', 'z']

vous vous souvenez quand on rangeait les nombres du plus petit au plus grand ou les mots dans l'ordre alphabétique ?
sort [4, 1, 10]
=> [1, 4, 10]
sort "azyxo"
=> "aoxyz"

on peut aussi ranger des listes de caractères
sort ['z', 'a', 'b', 'x', 'y']
=> ['a', 'b', 'x', 'y', 'z']
ça marche ! on a rangé des caractères dans l'ordre alphabétique ? vous ne remarquez pas quelque chose ? regardez :
sort "zabxy"
=> "abxyz"
sort ['z', 'a', 'b', 'x', 'y']
=> ['a', 'b', 'x', 'y', 'z']
vous voyez ? les mots et les listes de caractères se ressemblent beaucoup. quand on les range, ils sont tous les deux dans l'ordre alphabétique. en fait, ils sont pareils. les mots sont juste des listes de lettres, de chiffres, de caractère. c'est logique, non ? donc faire
['a', 'b', 'c'] c'est pareil que d'écrire "abc"
en fait, "abc" est plus rapide à écrire. on met juste des guillemets au lieu de mettre des crochets et des virgules

vous vous souvenez au début, quand on faisait
map sqrt [100, 16, 25, 2]
=> [10, 4, 5, 1...]

si on a utilisé map sur des listes de nombres, ça veut dire qu'on peut aussi l'utiliser sur des listes de caractères, sur des mots !

regardez :
map toUpper ['a', 'b', 'z']
=> ['A', 'B', 'Z']

ça a marché ! toUpper a mis toutes les lettres en majuscule

on peut aussi faire
map toUpper "abz"
=> "ABZ"
puisque utiliser des guillemets ou des crochets et des virgules c'est pareil pour les listes de caractères

on vient d'apprendre que les mots sont aussi des listes

capitalize x = toUpper (head x) : (tail x)

exercice intéressant : regarder quelqu'un en train de programmer
lire le code source en mode "r" sur un autre écran pour naviguer à souhait
on voit comment il navigue, se corrige, dans quel ordre tape les expressions, ...

faire un reverse
reverseOrder "caca pourri"
=> "acac irruop"
et non pas
reverse "caca pourri"
=> "irruop acac"
reverseOrdrer x = map reverse (words x)

avec les exemples du début, ou on retourne son prénom, ou on le sort, remettre la majuscule à sa place et l'enlever au début