====== Entrées, input ====== Prenons l'exemple d'un programme destiné à calculer l'imc connaissant poids et taille. Je rappelle que la formule est $IMC = \frac{poids}{taillle^2}$, avec le poids en kg et la taille en m. ===== En Python ===== # imc.py poids = int(input("poids en kg ? ")) taille = float(input("taille en m ?")) imc = poids / taille**2 print("imc = {:.2f}".format(imc)) Je vous rappelle que les 2 inputs, même si on écrit un nombre au clavier, comprendrons ces nombres comme de simples suites de caractères. C'est pourquoi, pour ''%%poids%%'' on fait une conversion ''%%int%%'' et pour ''%%taille%%'' une conversion ''%%float%%'' - //en effet, a priori, la taille sera un nombre à virgule.// Notez au passage le formatage en dernière ligne : ''%%{:.2f}%%'' qui indique que l'on veut afficher ''%%imc%%'' avec 2 chiffres après la virgule. ===== En C ===== // fichier imc.c #include int main() { int poids; float taille; printf("poids en kg ? "); scanf("%d", &poids); printf("taille en m ? "); scanf("%f", &taille); float imc = poids / (taille * taille); printf("imc = %.2f\n", imc); return 0; } Comme pour le cas de **helloworld** on retrouve la fonction ''%%main%%'' indispensable. == lignes 5 et 6 == On doit déclarer une variable avant de l'utiliser et on doit aussi spécifier son type. ''%%poids%%'' est de type entier et ''%%taille%%'' de type flottant. Il existe d'autre types notamment, vous verrez souvent le type ''%%double%%'' qui est identique à ''%%float%%'' mais avec une précision deux fois plus grande, d'où le nom : //double précision//. == lignes 7 et 8 == On ne dispose pas comme dans Python d'une fonction ''%%input%%'' qui affiche un message puis attend la réponse de l'utilisateur. Ici on doit d'abord afficher un message avec ''%%printf%%'' puis attendre la réponse clavier avec ''%%scanf%%''. Remarquez que je n'ai pas mis de ''%%\n%%'' en fin du ''%%printf%%'' de sorte que quand l'utilisateur écrit, le curseur se trouve à la suite de ''%%"poids en kg ? "%%''. Dans ''%%scanf%%'' on a précisé l'argument ''%%"%d"%%'' qui indique que l'entrée attendue devra être un nombre entier. Autre élément important : on a noté ''%%&poids%%'' et pas simplement ''%%poids%%''. Cela signifie que l'on transmet à ''%%scanf%%'' non pas la valeur de la variable ''%%poids%%'' , mais la variable elle-même, ou dit autrement l'**adresse** de la case mémoire où se trouve ''%%poids%%''. Cela indique à ''%%scanf%%'' où il doit écrire le résultat de la lecture clavier. == lignes 9 et 10 == Même chose pour la taille en m. Seule différence, on utilse ''%%"%f"%%'' pour la lecture de nombre à virgule de type ''%%float%%''. On aurait utilisé ''%%"%lf"%%'', c'est à dire //long float// si c'était une variable de type ''%%double%%''. == ligne 11 == Vous constatez que l'on doit d'abord déclarer ''%%imc%%'' avec ''%%float imc%%'' mais que dans le même mouvement on peut assigner une valeur à ''%%imc%%''. Vous constatez aussi qu'on ne peut pas calculer le carré de ''%%taille%%'' avec une puissance ! On ne dispose pas d'opérateur comme ''%%^2%%'' ou ''%%**2%%''. Il existe une fonction ''%%pow%%'' mais il faut alors utiliser la bibliothèque mathématique. == ligne 12 == Là, ça ressemble à Python. Remarquez notamment le formatage ave ''%%%.2f%%''. ==== Utiliser les arguments ==== On a vu dans [[.:hello_world|helloworld]] que les arguments ''%%argc%%'' et ''%%argv%%'' de ''%%main%%'' permettaient de passer des options au programme. On pourrait donc imaginer de transmettre le poids et la taille de cette façon. On écrirait par exemple en ligne de commande ''%%imc.exe 70 1.75%%'' pour passer le poids et la taille. Si l'on fait cela, ''%%argc%%'' aura la valeur ''%%3%%'' et ''%%argv%%'' contiendra ''%%{"imc.exe", "70", "1.75"}%%''. Il faudra donc convertir les deux chaînes de caractères en ''%%int%%'' et en ''%%float%%''. On utilisera les fonctions ''%%atoi%%'' et ''%%atof%%'' présentes dans la bibliothèque ''%%stdlib%%''. Avec cette modification on aura : // fichier imc.c #include #include int main(int argc, const char* argv[]) { int poids = atoi(argv[1]); float taille = atof(argv[2]); float imc = poids / (taille * taille); printf("imc = %.2f\n", imc); return 0; } Vous pouvez voir que l'accès aux éléments du tableau ''%%argv%%'' est identique à Python. Il faudrait s'assurer que l'utilisateur a bien entré les bons arguments. Généralement on prévoit un test au moins pour vérifier que l'on a donné assez d'arguments. On aura alors : // fichier imc.c #include #include int main(int argc, const char* argv[]) { if (argc < 3) { printf("Vous devez écrire 'imc.exe ' !\n"); return 1; } int poids = atoi(argv[1]); float taille = atof(argv[2]); float imc = poids / (taille * taille); printf("imc = %.2f\n", imc); return 0; } Le test vérifie qu'il y a bien 3 éléments dans ''%%argv%%''. Le premier est toujours le nom de l'exécutable ''%%"imc.exe"%%''. S'il n'y a pas assez d'argument, on envoie un message d'erreur à l'écran et on renvoie un code d'erreur ce qui termine l'exécution du programme. **Petite remarque pour finir :** Si on n'écrit n'importe quoi comme arguments ''%%poids%%'' et ''%%taille%%'', la conversion donne par défaut ''%%0%%'' ce qui provoquera le calcul ''%%0/0%%''. Le résultat étant indéfini, on obtient le résultat ''%%nan%%'' qui signifie //not a number//. Si ''%%poids%%'' a une valeur normale et que ''%%taille%%'' est à ''%%0%%'', le résultat sera cette fois ''%%inf%%''. Cela n'entraîne pas d'erreur. ''%%imc%%'' est un ''%%float%%'' et le codage des nombres ''%%float%%'' prévoit des cas pour ''%%inf%%'' et ''%%nan%%''.