| 
  • If you are citizen of an European Union member nation, you may not use this service unless you are at least 16 years old.

  • You already know Dokkio is an AI-powered assistant to organize & manage your digital files & messages. Very soon, Dokkio will support Outlook as well as One Drive. Check it out today!

View
 

Tuto : Programmation C

Page history last edited by PBworks 16 years, 5 months ago

 

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

Il est bien sûr ensuite possible de récupérer le code de la touche appuyé, comme dans l'exemple donné.

 

Et voilà le premier programme. Maintenant on va passer aux choses sérieuses !
III Les variables
  1) Les nombres
  • Les différents types de variables

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

 

[Attends, attends, pourquoi y a b=12 et d sur la même ligne ?]
J'y viens. Tout d'abord remarquons qu'on aurait pu utiliser un long au lieu d'un unsigned short pour la variable a.
Maintenant, répondons à la question : pourquoi b et d sont-ils sur la même ligne ?
Tout simplement parce qu'ils sont du même type, à savoir le type short !
[Ce qui veut donc dire qu'on peut déclarer plusieurs variables ensembles si elles sont du même type ?]
Exactement !
Voilà vous savez maintenant déclarer des variables.
Maintenant un autre problème : comment afficher la valeur d'une variable à l'écran ?
C'est là qu'on va reprendre le II, et plus particulièrement l'instruction printf();
*fouille dans les archives*
Bon, comment allons nous afficher la variable ?
[Facile ! printf(variable); !]
Justement non ! C'est ce qui semblerait effectivement le plus logique, mais ce n'est pas le cas
En effet, il faut indiquer au compilateur quel type de variable on veut afficher !
Et donc le printf(variable) ne suffira pas, contrairement au Disp en basic
Essayez de compiler le code suivant :

 

#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.

Bien, maintenant corrigeons ce code :
a est de type int. Pour afficher un nombre, nous allons utiliser "%i"
[Huh?]
Ok.
Voici le code exact :

#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

 

En gras, vous vous en doutez, la ligne exacte et corrigée.
On dit tout simplement : je veux afficher un nombre de type int qui est le nombre a.
L'avantage de cette notation est qu'on peut enchainer ce qu'on veut afficher et le nombre à afficher, exactement de la même manière que, en TI-Basic, Disp "...."&string(a)
Ainsi, si on veut afficher "La variable a vaut valeur de a", on utilisera directement

...

   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 :

Le code suivant :

#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
D'autres balises existent encore pour avoir des options supplémentaires, par exemple forcer le nombre 99 à s'écrire "099" (avec 3 chiffres)
Pour plus d'informations, rendez-vous sur la doc officielle : ici

 

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 !

    2) Les opérations sur les variables

[Bon, c'est bien intéressant tout ça...maintenant j'aimerais pouvoir utiliser ces variables...]
Pas de problème ! On va tout de suite voir ça :
Pour ceux qui ont déjà programmé en un autre langage (le TI-Basic par exemple) bah c'est très simple, c'est le même principe :
On prend l'ancienne valeur, on fait ce qu'on veut avec, puis on stocke la nouvelle valeur dans la variable :
Une série de codes pour tout expliquer :

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

Ces différentes opérations donnent des opérations tordues, telles que :

 

 

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

 

 

 

Attention toutefois, comme ce sont des variables/nombres il faut faire attention au type !

Le code suivant :

 

short a=9000;

a=a*10;

Code : C

 

pose un problème !
En effet les nombres de type short doivent être compris entre -32767 et 32768, or 9000*10=90000
Essayez de l'afficher par la suite : ce n'est pas du tout le résultat attendu : et c'est logique !
[Bah, on n'a qu'à passer au rang d'au-dessus, les long]
On peut prévoir des dépassement des limites du short et passer effectivement au rang supérieur, à savoir les long.
Mais supposons dans ce cas que ce soit imprévu. Comment allons-nous l'afficher ?
[Je vois pas...]
On va effectuer une opération qu'on appelle "cast" qui consiste à changer le type d'une variable pour l'utiliser.
Le "cast" est très simple, il suffit de mettre le nouveau type entre parenthèses.
Le bon code sera alors :

 

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".

    3) Les tableaux
  • Tableau
  • Ecrire et lire d'un tableau

 

    4)Les chaines
  • Afficher une chaine
  • Chaine=tableau de char
  • Opérations sur des chaines.

 

IV Les instructions d'entrée-sortie

  • printf
  • printf_xy
  • scanf
  • gets/getc/fgetchar
  • écrire/lire dans un fichier à l'aide des fonctions de <stdio.h>

 

 V Les conditions
  • If...then...else
  • Logique

 

VI Les boucles
  • For...
  • While...
  • Do...while...

 

VII Les pointeurs

 

  • Adresse
  • Utilisation

 

VIII Programmation avancée
  • VAT
  • Graphismes ?

 

IX Programmation avancée

  • Commentaire d'un programme complet

 

X Conclusion
Voilà. Le tutorial s'achève ici. :(
Mais ce n'est pas le dernier que j'écrirais, je compte bien en écrire encore quelques uns ^^
Maintenant je peux vous donner des conseils pour progresser en programmation C : allez chercher sur des forums des informations, parcourez les sites, cherchez des codes en C et surtout n'oubliez pas de vous faire plaisir !
En attendant, moi je remercie d'abord TI-Wiki, le site qui m'a (encore une fois) motivé pour créer ce tutorial, les membres du forum de tibank qui se reconnaitront ainsi que ceux de la tama's team et tout ceux qui m'ont aidé moi pour programmer :) sans oublier ceux que j'ai oubliés :D
Et pour ceux qui n'auraient pas compris le tutorial il en existe de nombreux autres sur le net, comme celui du site du zéro, de squalenet ou autre. Vous pouvez donc y aller pour compléter votre apprentissage :)
Comme je le disais avant de commencer ce tutorial, voici une liste de tutorials utiles et de sites/forums pour compléter mon tutorial et/ou corriger mes erreurs :

 

Tama

 Crée le 04 Novembre 2007

 

Dernière modification le 09 Novembre 2007 par Tama

 

Comments (0)

You don't have permission to comment on this page.