
Questions? Get live answers at PBwiki's weekly office hours (1 PM Eastern, Weds September 3)
Apprenez à programmer en C
/!\ Mise en garde avant de commencer /!\
Ce tutorial est un mélange des tutos que j'ai trouvé sur le net (reformulés) et de mes expériences personnelles.
Il se peut qu'il contienne des erreurs, d'autant plus que je ne suis pas un expert en C, très loin de là (^^).
C'est pourquoi je vous renvoie à la fin de ce tutorial vers d'autres tutos sur le net, pour corriger/compléter mes erreurs. Voilà c'est tout :D
Marre du TI-Basic ? envie d'un langage plus puissant ?
Vous avez déjà jeté un oeil à l'assembleur...trop compliqué...beaucoup trop compliqué...que faire alors ?
Heureusement, une alternative existe : il s'agit du C !! Oui, le C, très rapide et quasiment aussi simple, c'est l'idéal !
Oui, il existe déjà beaucoup de tutorials sur la programmation en C, mais j'avais envie de faire le mien...^^
On va donc apprendre les bases de la programmation C, assez en tout cas pour que vous puissiez écrire vos programmes vous-mêmes, plus tard
I Pour commencer
De quoi ai-je besoin pour programmer en C ?
Telle est la question à laquelle on va tenter de répondre (enfin tenter, on va y répondre tout court :))
Chapitre court qui fait plus office d'introduction
Pour programmer en C c'est très simple, il faut une TI68k (c'est à dire 89 ou +) et un compilateur
Compilateur ? qu'est-ce que c'est ?
En langage humain, il s'agit d'un traducteur.
En effet, la machine ne comprend pas quand on lui dit "efface moi l'écran", ni quand on lui dit "clrscr();" (qui est l'instruction C utilisée pour effacer l'écran) alors c'est là où le compilateur intervient : il va traduire l'instruction en langage machine, qui est le langage binaire, constitué uniquement de 0 et de 1 pour que la TI puisse comprendre ce qu'on lui dit
Le compilateur le plus populaire est TIGCC, mais il est sur PC. Pour ceux qui veulent programmer partout, directement sur la calculatrice il existe des compilateurs spécialement développés pour, tels que cc/as ou le meilleur actuellement, GTC (que j'utilise personnellement)
C'est tout. Tout est inclus dedans on peut directement attaquer !
II Et maintenant ?
Très bonne question. Que fait-on maintenant qu'on a le programme installé ?
Bah on code !
Et le premier programme que code un programmeur est très simple, il s'agit du programme "Hello World!" qui aurait été programmé par celui qui créa le C il y a déjà plusieurs décennies :)
[Ok, mais comment va t-on le faire ?]
J'y viens ! Un peu de patience, que diable ! :D
Je balance le code, je l'expliquerais juste après
|
#include <stdio.h> #include <kbd.h>
void _main(void) { clrscr(); printf("Hello world"); ngetchx(); } |
Code : C
Bien. Passons aux explications :
Les 2 premières lignes font appellent à des headers.
[Head...quoi ?]
Des headers. Ce sont des programmes déjà définis contenant des fonctions que nous allons utiliser dans le programme principal.
Ici il s'agit du header stdio.h qui contient notamment la fonction printf(), qui sert à afficher un texte, un nombre ou autre
et le header nommé kbd.h qui contient des routines pour le clavier, et notamment la fonction ngetchx()
[Ok...compris.]
Bien. Passons alors à la suite.
void...qu'est-ce que c'est ?
bah void en anglais veut dire nul. Il s'agit en fait d'un mot-clé indiquant que la fonction _main, qui est la fonction principale, ne retournera aucune valeur lorsqu'elle aura fini sa tâche. Nous reverrons cela en détail plus tard.
[Mais pourquoi y a t-il 2 void ?]
Encore une fois, on en parlera plus tard lorsque nous étudierons les fonctions. Le void entre parenthèses veut dire que la fonction _main ne prend aucun argument.
Voyons la suite. L'accolade ouverte sert à commencer la fonction, l'accolade fermante...à la terminer. Ces accolades seront souvent utilisées, notamment pour les conditions ou pour les boucles.
Et nous arrivons à la première instruction : clrscr();
[Le ";" c'est fait exprès ?]
Oui ! En C, le point virgule sert à marquer la fin d'une instruction. Sans celle-ci, le compilateur ne reconnaitra pas la fonction, mais reconnaitra un nom de variable. Si vous utilisez un nom de fonction pour une variable, le compilateur peut ainsi sortir une erreur
(essayez de faire 1->ClrHome pour les programmeurs basic. Ici c'est exactement la même chose)
De même, n'oubliez pas les parenthèses !
Il est également à préciser que le C est sensible à la casse, c'est à dire qu'un même mot n'est pas reconnu de la même façon par le compilateur d'après les majuscules et minuscules
TaMa, tamA, taMA, etc... seront des variables différentes pour le compilateur
Bon, fin de la parenthèse, revenons en à nos moutons. L'instruction clrscr(), pour clear screen, sert donc à effacer l'écran, mais contrairement aux programmes TI-Basic, à l'effacer complètement ! (Pas de barre de menu ou de status line...)
Vient ensuite l'instruction "printf"
Très intéressante instruction...elle sert à afficher un nombre/un texte à l'écran. Ici, elle affichera seulement le texte "Hello World" en haut à gauche.
On verra comment afficher des nombres plus tard.
Enfin la dernière instruction avant la fin de ce premier programme, l'instruction ngetchx();
Cette instruction attend l'appui de n'importe quelle touche puis continue. Il s'agit donc d'une instruction "Pause" (pour les programmeurs TI-Basic) qui s'applique à n'importe quelle touche.
C'est "l'équivalent" du code TI-Basic suivant :
|
... 0->K While K=0 GetKey()->K End ... |
Code : TI-Basic
Comme en basic ou dans tout autre langage, il existe différents types de variables, mais ces variables seront précédées d'un mot-clé différent selon ce qu'elles contiennent !
[Oulala...Je crains le pire.]
Rassurez-vous, rien de bien méchant. Il faut tout simplement savoir que les variables sont stockés en mémoire, et que selon le nombre, la mémoire qui sera utilisée sera différente : le nombre 255 tient sur 8 bits, alors que le nombre 65535 tient sur 16 bits, ils ne vont pas prendre la même place en mémoire.
C'est pourquoi nous utilisons des mots-clés pour que le compilateur sache combien de bits le nombre va utiliser.
Voici donc le tableau des différents mots clés utilisés, et leur limite :
| Mot-clé | Limites |
| char | -128 à 127 |
| unsigned char | 0 à 255 |
| short | -32768 à 32767 |
| unsigned short | 0 à 65535 |
| int | -32768 à 32767 |
| unsigned int | 0 à 65535 |
| long | -2147483648 à 2147483647 |
| unsigned long | 0 à 4294967296 |
| long long | -9223372036854775808 à 9223372036854775807 |
| unsigned long long | 0 à 18446744073709551615 |
Bon, bien sûr pour les longues valeurs (à partir de long), on ne cherche pas à connaitre exactement les limites (enfin on peut, mais c'est sans intérêt).
Signalons enfin que tout ce tableau ne fonctionne que pour les entiers, pour les nombres décimaux il existe tout simplement les mots clés float et double.
[Ok...et maintenant ?]
Bah maintenant on va apprendre comment déclarer une variable en C.
[Intéressant]
N'est-ce pas ? De plus, l'avantage du C est qu'on peut déclarer plusieurs variables, et mieux ne pas les déclarer !
[Haha très drôle...on peut faire ça dans tous les langages...]
Oui mais peut-on dans tous les langages (le TI-Basic, au hasard) déclarer une variable sans lui donner de valeur
[Euh...non...]
Et bien en C on peut !
Voyons tout de suite la syntaxe pour initialiser (déclarer) une (ou plusieurs) variable(s) :
La syntaxe est la suivante :
Mot-clé nomdelavariable[=valeur]
Entre crochets, c'est facultatif...
Par exemple, pour une variable a de valeur 40000, b de valeur 12 et c de valeur -145000, et d de type short, comment allons-nous les déclarer ?
...
...
Allez, on réfléchit ;)
...
...
...
Toujours pas ?
Réfléchissez au mots-clés qu'il faut utiliser à l'aide du tableau...
...
...
...
Bon, voici les lignes de code :
|
unsigned short a=40000; short b=12, d; long c=-145000; |
Code : C
|
#include <stdio.h> #include <kbd.h>
void _main() { int a=55; //on déclare a clrscr(); //on efface l'écran printf(a); //on affiche a ngetchx(); } |
Code : C
Lors de la compilation, il y aura seulement un warning mais l'exécuter ne donnera pas 55, mais une valeur complètement inattendue.
|
#include <stdio.h> #include <kbd.h>
void _main() { int a=55; //on déclare a clrscr(); //on efface l'écran printf("%i",a); //on affiche a ngetchx(); } |
Code : C
| ... printf("La variable a vaut %i",a); //on affiche a ... |
Code : C
Remarquons qu'il est possible de prendre directement la valeur qu'une fonction retourne et de la stocker dans une variable, ce qui est bien sûr pratique
le code :
| short a=ngetchx(); |
Code : C
est tout à fait valable : ce code est l'équivalent du code suivant en TI-Basic :
|
Local a 0->a While a=0 GetKey()->a EndWhile |
Code : TI-Basic
N'est-ce pas magnifique ? tout ces lignes de code regroupées en une seule ligne !
Pour ceux qui ne comprennent pas ce code, à l'exécution, la TI va simplement attendre qu'une touche soit appuyée puis stocker le code de la touche pressée dans la variable a de type short.
Revenons-en à nos moutons :
Dans la chaine de l'instruction printf, on peut afficher plusieurs variables en même temps :
|
#include <stdio.h> #include <kbd.h>
void _main() { int a=55, b=400; //on déclare a clrscr(); //on efface l'écran printf("a vaut %i et b vaut %i",a,b); //on affiche a ET b ngetchx(); } |
Code : C
...affichera à l'écran : a vaut 55 et b vaut 400
(le compilateur saura distinguer les deux "%i")
[Ouah...ça marche pas avec des long...]
Oui, car "%i" est spécifique aux int. Pour les autres "balises", référrez vous au tableau suivant :
(d'après la doc de tigcc : tigcc.ticalc.org/doc)
| Type | Meaning |
| d, i | Signed decimal integer |
| u | Unsigned decimal integer |
| x | Lowercase hexadecimal integer |
| X | Uppercase hexadecimal integer |
| e | Floating point, format [-]d.dddde[sign]ddd (exponential format) |
| E | Like 'e' but with uppercase letter for the exponent |
| f | Floating point, format [-]dddd.dddd |
| g | Floating point: most compact float format available ('e' or 'f'); this is the most common option, used for most dialog floats |
| G | Like 'g' but with uppercase letter for the exponent |
| r | Floating point, engineering form (this option is non-ANSI, i.e. TI specific) |
| R | Like 'r' but with uppercase letter for the exponent |
| y | Floating point, mode specified float format (this option is non-ANSI, i.e. TI specific) |
| Y | Like 'y' but with uppercase letter for the exponent |
| c | Character |
| s | String |
| p | Pointer; principally the same as 'x' - do not use without 'l' modifier |
| % | None; the character '%' is printed instead |
Enfin, avant de clore ce paragraphe, signalons que l'instruction printf_xy permet également d'afficher du texte, mais à un endroit précis de l'écran. Sa syntaxe est : printf_xy(pos_x,pos_y,"texte"[,variable(s)])
Voilà c'est tout ce qui faut savoir sur les nombres. Cette partie est essentielle pour la suite alors si vous n'avez pas tout compris, relisez encore une fois !
|
short a=50; a=a*5; //a vaut 250 |
Code : C
|
//Ces 3 codes sont équivalents
short a=50; a=a+1; //a vaut 51
short a=50; a++; //a vaut 51, cette opération s'appelle l'incrémentation, soit ajouter 1 à une variable (uniquement 1)
short a=50; a+=1 //on ajoute 1 à la variable a
//Il en est de même pour la soustraction : //Combien vaudra b après ces 3 opérations ?
short b=50; b=b-20; b-=15; b--;
//Réponse : //b=50-20-15-1=4 |
Code : C
|
short a=30; short b=50; short c=a++ + ++b + a*(b--) |
Code : C
Ces écritures sont toutefois à éviter dans la mesure du possible car elles ne sont pas du tout pratiques pour la relecture
Décryptons tout de même ensemble les opérations pour trouver la valeur de c :
c=a++ + ++b + a*(b--)
c= a+1 + b+1 + a*(b-1)
En prenant les valeurs :
c=30+1 + 50+1 + 30*(50-1)
c=82+1500-30=82+1470=1552
Le code suivant :
|
short a=9000; a=a*10; |
Code : C
|
short a=9000; //On stocke 9000 dans a printf("%lu",(long)a*10); //On change a en long pour pouvoir afficher 9000 |
Code : C
On reparlera de ça lorsqu'on parlera des pointeurs. En attendant retenez bien cette opération : "cast".
IV Les instructions d'entrée-sortie
IX Programmation avancée
Crée le 04 Novembre 2007
Dernière modification le 09 Novembre 2007 par Tama
Page Information
|
Wiki Information |
Recent PBwiki Blog Posts |