Table des matières

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 <stdio.h>

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 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 <stdio.h>
#include <stdlib.h>

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 <stdio.h>
#include <stdlib.h>

int main(int argc, const char* argv[]) {
  if (argc < 3) {
    printf("Vous devez écrire 'imc.exe <poids> <taille>' !\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.