samedi 1 mai 2010
vendredi 30 avril 2010
Améliorations de Hello World
Alors vu que tu essayes d'améliorer notre Hello World en ajoutant des questions auxquels l'utilisateur peut répondre, on va partir là dessus.
Première chose, comment on demande à l'utilisateur de taper quelque chose et comment on récupère cette info ?
toi tu as utilisé la fonction scanf, pourquoi pas, la doc est ici http://www.cplusplus.com/reference/clibrary/cstdio/scanf/ .
c'est aussi une fonction standard que l'on peut donc trouver dans stdio.h, tu peux jeter un oeil à tout ce que tu peux y trouver dedans d'ailleurs, il te suffit d'ouvrir ce fichier qui se trouve dans c:/mingw/include. tu verras y a plein de truc dans stdio, en fait ça signifie standard input/output.
donc d'après la doc scanf ça lis les données de stdin et ça les stockent dans les paramètres passés à la fonction. comme tu as dû le voir dans stdio.h, la fonction scanf a cette signature :
Première chose, comment on demande à l'utilisateur de taper quelque chose et comment on récupère cette info ?
toi tu as utilisé la fonction scanf, pourquoi pas, la doc est ici http://www.cplusplus.com/reference/clibrary/cstdio/scanf/ .
c'est aussi une fonction standard que l'on peut donc trouver dans stdio.h, tu peux jeter un oeil à tout ce que tu peux y trouver dedans d'ailleurs, il te suffit d'ouvrir ce fichier qui se trouve dans c:/mingw/include. tu verras y a plein de truc dans stdio, en fait ça signifie standard input/output.
donc d'après la doc scanf ça lis les données de stdin et ça les stockent dans les paramètres passés à la fonction. comme tu as dû le voir dans stdio.h, la fonction scanf a cette signature :
int scanf (const char*, ...);
ça c'est une nouvelle syntaxe pour toi. quatre choses dont je ne t'ai pas encore parlé :
- const : ça signifie que le truc qui va suivre ne pourra pas être modifié
- char : un char est un nombre qui va de 0 à 255, il prend donc un mémoire 1 octet ou 8 bits. c'est utile quand tu veux stocker un caractère de texte parce que le texte ASCII va justement de 0 à 255 caractères (http://en.wikipedia.org/wiki/ASCII). par exemple en ascii le caractère Z vaut 90. donc si j'écris
char z = 90;
printf("%c", z);
ça affichera Z.
- * : une étoile en c indique un pointeur. un pointeur signifie que la variable ne contiendra pas directement la donnée mais contiendra l'adresse en mémoire où se trouve la donnée. http://en.wikipedia.org/wiki/Pointer_(computing)#C_pointers
comment ça marche un pointeur ? en c la mémoire est quelque chose d'important. la mémoire pour le coup c'est la mémoire vive de ton ordinateur (même si c'est pas exactement comme ça avec les os d'aujourd'hui). en gros quand tu écris :
char z = 90;
printf("%c", z);
en mémoire il va y avoir un char (1 octet) de réservé pour stocker la valeur de ton z. donc juste en écrivant cette ligne tu consomme un octet.
maintenant si à la place de mettre un seul char, tu crée un tableau de char comme tu l'as fait dans ton programme :
char alphabet[26];
cette ligne va te créer un espace mémoire avec 26 caractères. un tableau ça s'appelle. imagine que tu veux pouvoir passer à une fonction cet alphabet, tu peux pas t'amuser à copier 26 caractères à chaque fois, ça prend trop de temps et de place, donc ce qu'on fait ben on passe l'adresse en mémoire de l'alphabet et donc la fonction aura ton alphabet sans avoir eu a tout copier.
les pointeurs en c sont super pratique et très souvent utilisé. tiens d'ailleurs tu veux savoir pourquoi jusqu'à y a pas longtemps un ordinateur était limité à 4go de mémoire ? tu sais certainement que windows était jusqu'à xp en 32 bits non ? tu sais combien c'est la valeur max d'un nombre 32 bits ? c'est 4294967295, et ça fait combien ça ? 4go ! c'est quoi le rapport avec les pointeurs ? simple, un pointeur je t'ai dis, c'est une adresse mémoire, eh ben sur un système 32 bits, l'adresse mémoire est stockée sur 32 bits et donc un pointeur ne pouvait pas avoir une valeur plus grande que 4294967295.
maintenant on a des systèmes 64bits, la limite est donc poussée à 18446744073709551615, gros quoi. on aura un peu de temps avant de l'atteindre.
bon pour en revenir à notre programme, le dernier truc de nouveau avec scanf c'est : ...
... c'est un truc particulier en c, ça veut dire que tu peux mettre un nombre de paramètre variable, c'est utile dans certain cas comme le printf ou le scanf parce que ces fonctions ne peuvent pas connaître le nombre de paramètre qu'elles vont avoir.
une dernière chose a propos de scanf (et printf aussi en fait). dans la doc ils expliquent que le premier paramètre de ces fonctions est un char* indiquant un format (donc on doit passer un pointeur vers un char qui indiquera un format). le format permet à scanf et printf de comprendre comment lire ou afficher les données qu'on va leur passer en paramètre. lis bien la doc de scanf parce que dedans tu comprendras c'est quoi un format. tu vas avoir certainement plein de question mais bon on expliquera au fur et à mesure.
dans notre programme on va demander à l'utilisateur son age et son prénom et on affichera un message genre "marc a 24 ans et toutes ces dents".
on reprend donc notre premier programme et on utilise scanf pour demander à l'utilisateur son age et son prénom :
#include
int main(int argc, char* argv[]) {
int age;
char prenom[51];
printf("Bonjour, quel est votre prenom ?\n");
scanf("%50s", prenom);
printf("Quel est votre age ?\n");
scanf("%d", &age);
printf("%s a %d et toutes ces dents\n", prenom, age);
return 0;
}
alors pas à pas ça donne quoi ?
on inclut stdio.h pour printf et scanf
#include
on déclare notre fonction principale
int main(int argc, char* argv[]) {
on déclare deux variables, age et prenom, age est un nombre entier sur 32 bits (4 octets) et prenom est un tableau de 51 char (51 octets).
int age;
char prenom[51];
on affiche un message invitant l'utilisateur a taper son prénom
printf("Bonjour, quel est votre prenom ?\n");
on prend les données de stdin et on les stockent dans prenom. %50s signifie : un maximum de 50 caractères. parce que notre tableau fait 51 caractères, si l'utilisateur s'amuse a taper un prénom de 67 caractères, il va nous exploser notre mémoire en écrivant trop de données dans notre tableau, donc on limite à 50. en c quand on stocke une string (un tableau de caractère) on fait toujours bien attention que cette string se termine par 0 pour bien indiquer où se situe la fin en mémoire de notre tableau.
scanf("%50s", prenom);
on affiche la deuxième question :
printf("Quel est votre age ?\n");
on récupère les infos tapée. alors là tu vois on utilise &, ça c'est spécial en c, ça veut dire, donne moi l'adresse de la variable qui suit, ça sert à justement passé à des fonctions des pointeurs en mémoire et pas les variables en entier. scanf en plus ne prend pas de valeur, que des pointeurs si tu regarde bien la doc. en gros on aurait pu aussi passer par une variable temporaire : int* pAge = &age;.
scanf("%d", &age);
et enfin on affiche notre message en passant à la fonction printf le prenom et l'age.
printf("%s a %d et toutes ces dents\n", prenom, age);
return 0;
}
ouf, eh ben voilà, on y est arrivé. je te conseille de jouer un peu avec tout ça pour voir un peu comment ça marche. tu peux lire ça aussi en français, c'est pas mal et tu pourras me poser des questions quand tu comprendra pas trop :
http://fr.wikibooks.org/wiki/Programmation_C
jeudi 29 avril 2010
Hello World
La première chose qu'un codeur apprend à coder c'est un hello world, juste affiché ce message, c'est le plus simple possible.
alors on va faire ça, tu te crée un répertoire marc dans c:\mingw
dans ce dossier c:\mingw\marc, tu te crée un fichier hello.c, ce sera le code de ton programme, l'extension .c signifie que le fichier contiendra un programme en c.
je te conseille notepad++ pour éditer ton fichier dans la mesure où il t'affichera ton code avec des couleurs. http://notepad-plus.sourceforge.net/uk/site.htm
ok, bon d'abord on vérifie que ton compilo fonctionne, met toi en ligne de commande dans le répertoire marc et lance gcc pour voir si ça répond :
- démarrer/exécuter/cmd
- cd c:\mingw\marc
- gcc -v
ça doit finir par te dire gcc version 3.4.5 (mingw-vista special r3) normalement.
si c'est pas le cas, ton installation de mingw n'est pas bonne, dis moi je regarderais.
bon apparemment ça marche, maintenant on va taper un peu de code.
ouvre le fichier hello.c dans ton editeur de texte et tape ça :
#include <stdio.h>
int main(int argc, char* argv[]) {
printf("hello world\n");
return 0;
}
ensuite tu sauves ton fichier et dans la ligne de commande de tout à l'heure tu lance :
- gcc hello.c -o hello.exe
- hello
et tu devrais avoir dans ta console un petit "hello world" non ?
alors je t'explique :
#include ça veut dire qu'on demande au preprocesseur d'inclure le fichier stdio.h. le preprocesseur ça n'a rien à voir avec le processeur de ton ordi, c'est un truc qui est exécuté avant la compilation du fichier et qui permet de remplacer du texte, inclure des fichiers et d'autres trucs. là en l'occurrence on utilise la directive include.
à quoi ça sert d'inclure stdio.h ? je t'explique plus tard.
ensuite tu vois un int main(...) ça c'est la façon en c de déclarer une fonction. une fonction ça permet de mettre des bouts de code que tu utilises souvent dans un coin et de les appeler quand tu en as besoin dans ton code par leur nom (ici main).
alors là main à une signification particulière, tout les exécutables (TOUS) ont une fonction main, c'est le point d'entrée de chaque programme, la première de tes fonctions qui est appelée (presque, je t'expliquerais ça plus tard).
donc là en gros, on sait que dès que le système aura lancé notre exécutable, on se trouvera dans la fonction main.
une fonction tu la déclare comme ça :
type_retour nom_fonction(type_paramètre nom_paramètre) {}
type_retour ça indique quel sera le type renvoyé par la fonction. tu peux voir ici les types en c :
http://fr.wikipedia.org/wiki/C_(langage)#Types
dans notre cas, le type de retour est int c'est à dire un nombre entier (sans chiffres après la virgule)
nom_fonction c'est le nom de ta fonction, ce que tu veux ou presque, dans notre cas, main.
type_paramètre c'est le type du paramètre, au choix dans les mêmes types que ce de retour, dans notre cas encore int et char*[] pour le deuxième paramètre.
et enfin nom_paramètre correspond au nom que l'on donne au paramètre, ici argc et argv.
donc la notre main c'est une fonction qui renvoi un int et prend en paramètre un int et un char*[]. char*[] c'est pas clair mais j'y reviendrais plus tard.
le contenu de ta fonction doit toujours se trouver entre des accolades {}.
aller, ligne suivante, printf("hello world\n");
alors là tu vois comment on appelle une fonction, en l'occurrence printf et comment on lui passe des paramètres en l'occurrence "hello world\n".
cette fonction printf fait partie d'un ensemble de fonction standard livré avec les compiilateurs. le compilateur pour générer le code machine doit connaître toutes les fonctions, sinon il compile pas. le problème c'est que comme tu le vois, cette fonction n'existe pas dans notre fichier. eh ben en fait c'est l'include de tout à l'heure qui contient cette fonction. voilà pourquoi en premier il y a cette include, il permet de dire au compilateur que la fonction printf existe et quelle est sa signature (la signature c'est le nom, la valeur de retour et les paramètres d'une fonction).
donc printf est déclaré dans stdio.h et ça sert à afficher un truc dans la console. c'est une fonction super utile et très très très souvent utilisé pour plein de chose.
donc printf ici nous à afficher dans la console notre petit message hello world.
d'ailleurs tu vois aussi ici comment on déclare un texte en c. guillemet le texte fermé les guillemets. le \n que tu vois à la fin du texte ça permet d'aller à la ligne c'est un code standard aussi.
ah et le ";" à la fin, toutes les instructions en c doivent se terminer par un ; ça indique au compilateur qu'il peut passer à la prochaine instruction.
on termine notre programme par return 0;.
return c'est un mot clé pour dire quelle sera la valeur que la fonction va renvoyer. tu te rappelles que main renvoi un int, ben voilà, avec return on dit juste qu'on renvoie 0 à la personne qui a appelé main.
pourquoi renvoyer 0 ? parce que comme je te l'ai dis, main c'est une fonction standard pour les exécutables. et il est défini qu'un exécutable peut prendre des paramètres (argc pour le nombre de paramètre et argv pour la valeur des paramètres) et doit renvoyer si le programme s'est bien terminé ou non. 0 c'est le code pour dire que tout s'est bien terminé sans erreur.
ok. on termine par la compilation : gcc hello.c -o hello.exe
ici on appelle gcc le compilateur et on lui dit de prendre le fichier hello.c et de compiler dans le fichier hello.exe, c'est tout, si tu as mal tapé quelque chose ben tu auras un message d'erreur de la part de gcc.
je te conseille de lire vite fait le wikipedia sur le c :
http://fr.wikipedia.org/wiki/C_(langage)
ce que tu peux essayer de faire dans ce petit programme c'est de changer le message renvoyé par exemple tu peux mettre good bye world.
tu peux aussi essayer de te créer une fonction qui fait des additions ou des trucs du genre et qui te renvoies la valeur.
enfin essaye de trafiquer un peu tout ça pour voir si tu comprends bien. voilà, bonne chance !
MingW c'est quoi ?
c'est juste une suite de logiciel qui vont nous permettre de compiler du code c.
on va utiliser le compilateur gcc (http://fr.wikipedia.org/wiki/GNU_Compiler_Collection) parce qu'il est gratuit, simple, et surtout tu le trouveras sur tout les os du monde pratiquement.
en gros la compilation ça te convertit du language "humain" en language machine. le language machine est complexe et long a écrire même pour de simple opération, c'est pour ça qu'on a un language de programmation qui simplifie les opérations et un compilateur qui est capable de faire la traduction.
MingW
Pour commencer il te faut un environnement de travail, c'est à dire :
- un système d'exploitation (en l'occurrence ton windows)
- un répertoire de travail (on va prendre la même chose, c:\mingw)
- des outils de base (mingw+msys)
- un compilateur (gcc)
première étape, on créer un répertoire mingw à la racine de ton disque c.
ensuite on télécharge ça :
http://downloads.sourceforge.net/project/mingw/Automated%20MinGW%20Installer/MinGW%205.1.6/MinGW-5.1.6.exe?use_mirror=freefr
on installe (download and install, package current, full dans C:\MinGW)
Début
Pourquoi ? en fait pourquoi pas ?
C'est simple, on va partir de la base, te préparer un petit environnement où tu pourras tester tout plein de trucs et pour te rendre autonome pour plus tard.
On commence, tu comprends pas, tu laisses un commentaire, ça marche pas, tu cherches et tu demandes, mais tu ne passes jamais trop de temps à chercher quand ça marche pas, tu me demandes et tu passes à autres chose.
Inscription à :
Commentaires (Atom)
