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
Coucou, pas tres bien compris l'histoire du &, en faite sa sert a aller chercher la variable age qui est definie par int ??? sans tous reecrire ???
RépondreSupprimerSi oui, sa s'ecrirait comment sinon ???