Nous allons continuer l’implémentation du programme sum que nous avons commencé précédemment. Pour cela, nous allons implémenter la fonctionnalité qui somme la valeur des entiers passés en paramètres sur la ligne de commande, puis qui affiche la valeur obtenu.
Par exemple:
./sum 3 4
renvoie la valeur 7.
Ce travail va se décomposer en deux sous-problèmes:
- convertir une chaine de caractère en entiers.
- afficher le résultat du calcul.
Exercice 1: conversion de chaine de caractères en entiers. Dans cet exercice, vous allez devoir compléter le code fournis dans le fichier TP_INF104/TP1and2/part2_C_basics/material/sum.c. Copiez collez votre solution au TP précédent ou copiez la solution fournie dans TP_INF104/TP1and2/part1_args/solution/sum.c.
Pour convertir une chaine de caractère contenant des nombres en une valeur entière, vous allez procéder ainsi:
- coder la fonction char charToInteger(char c), qui renvoie la valeur de c sous la forme d’un entier. Notez que le corps de cette fonction sera très similaire au corps de la fonction isCharInteger que vous avez codée à l’aide d’un switch/case.
- coder la fonction char stringToInteger(char * c), qui renvoie la valeur de c (un tableau de caractère représentant des entiers) sous la forme d’un entier.
Exercice 2: pour afficher le résultat du calcul, nous allons avoir besoin d’utiliser une fonction d’entrée sortie. Comme pour beaucoup de fonctions fournies par le système d’exploitation, vous trouverez beaucoup de documentation sur les fonctions d’entré/sortie. Encore faut-il les connaitre. Dans cet exercice, nous allons utiliser la fonction de sortie la plus simple: printf. Pour accéder à sa documentation depuis le terminal, tapez:
$man printf
il faudra taper sur la lettre q pour sortir (quit) du manuel. Si le manuel ne vous a pas suffit, voici quelques mots sur l’utilisation de la fonction printf.
Pour commencer, sa signature:
int printf( const char *format [, arg1 [, arg2]...]);
Les paramètres de cette fonction sont:
- une chaine de caractères format, qui contient du texte, et peut également contenir des caractères de formatage dont nous expliquerons le rôle par la suite. Les caractères de formatage sont facile à identifier: ils commencent par le caractère %.
- une suite d’arguments de longueur indéfini: la présence de crochets indique que les arguments sont optionnels, la présence des points de suspension indique que le nombre d’arguments possible est indéfini.
L’utilisation de printf est en fait assez aisée: lorsque printf est appelé, le texte contenu dans format s’affiche dans le terminal. Mais alors, à quoi servent les caractères de formatages et les arguments arg1, arg2, etc. ? C’est simple: avant d’être affiché sur le terminal, la chaine de caractère format est transformée: chaque caractère de formatage sera remplacé par la valeur d’un des arguments (arg1, arg2, etc.). Quel caractère de formatage est remplacé par quel argument? C’est simple: le premier caractère de formatage est remplacé par le premier argument, le deuxième caractère de formatage est remplacé par le deuxième argument, et ainsi de suite…
Voici des exemples d’utilisation:
#include <stdio.h> int main(char argc, char* argv[]){ printf("Bienvenue en TP de INF104.\n"); }
l’exécution de cette ligne de code produit l’affichage: Bienvenue en TP de INF104.
#include <stdio.h> int main(char argc, char* argv[]){ printf("%d arguments sur la ligne de commande\n", argc); }
L’exécution de ce programme va afficher le nombre d’argument passés sur la ligne de commande.
Modifiez votre programme dans sum.c pour afficher le résultat donné par la somme des entiers passés en ligne de commande.
Testez votre programme comme suit:
$./sum 21 21
$./sum 21 -21
Une fois que vous aurez obtenu le chiffre 42 en résultat du premier test, et 0 au deuxième test, passez au test suivant:
$./sum 1024 1024
Le résultat obtenu n’est pas 2048… Pourquoi?
NOTE1: il existe déjà, dans la librairie standard du c (stdlib), une fonction qui convertit une chaine de caractère en une valeur numérique entière. Cette fonction s’appelle atoi, et vous pouvez l’utiliser en remplacement de stringToInteger
NOTE2: notez que nous avons utilisé la fonction printf sans l’avoir déclaré… En fait si, nous l’avons déclarée grâce au #include <stdio.h>. La signification de ce #include vous sera donné plus tard dans le cours. Notez aussi l’utilisation du caractère spécial ‘\n’: il s’agit simplement d’un caractère de retour à la ligne.