TP Interface graphique et C++ numéro 1

Transcription

TP Interface graphique et C++ numéro 1
TP Interface graphique et C++ numéro 1
Master IGC - 1re année
année 2010-2011
Ce premier TP a pour objectif de vous familiariser avec le compilateur C++, les entréessorties du langage et l’utilisation d’une classe existante.
Préliminaires
Dans votre répertoire racine, créez le répertoire TPC++ ; ce répertoire devra contenir
l’ensemble des TP qui seront faits dans ce module. Créez ensuite un sous-répertoire nommé
TP1 dans TPC++ ; tous les exercices réalisés dans le cadre de ce premier TP devront s’y
trouver.
Exercice 1
Tapez le source C++ suivant dans un fichier nommé
≪
exo1.cpp≫ :
#include <cstdio>
int main(int argc, char *argv[]){
printf("Hello C++ World !!!\n");
return 0;
}
Vous compilerez ce fichier à l’aide de la commande suivante :
g++ exo1.cpp
Lorsque la compilation a été effectuée avec succès (pas de message d’erreurs ...), inspectez le contenu du répertoire courant pour voir quels sont les fichiers qui ont été générés
(vous pouvez utiliser la commande ls -l pour afficher le contenu du répertoire). Quel
fichier représente l’exécutable de votre application ? Lancez l’application pour vérifier son
fonctionnement.
Compilez ensuite le fichier source C++ à l’aide de la commande suivante :
1
g++ exo1.cpp -o exo1
L’option -o permet de spécifier le nom de l’exécutable que doit générer le compilateur.
Ce nom doit suivre immédiatement cette option. Vérifiez que le fichier exo1 a bien été
généré et, en lançant sont exécution, qu’il correspond bien a ce qui est attendu.
Exercice 2
Recopiez le fichier exo1.cpp dans un fichier nommé exo2.cpp. Vous allez à présent
modifier ce fichier pour utiliser les entrées-sorties propres au langage C++.
1. Remplacez l’inclusion de la bibliothèque d’entrées-sorties C <cstdio> par l’inclusion
de la biblothèque propre à C++ : <iostream>.
2. Remplacez l’appel à la fonction printf dans le programme principal (fonction main)
par la ligne suivante :
std::cout
<< "Hello C++ World !!!" << std::endl;
Cette ligne demande au programme d’envoyer sur le flot standard de sortie (ici votre
écran) le texte Hello C World !!!, suivi d’un retour à la ligne (endl. Notez l’utilisation de l’espace de nom standar (std) de la bibliothèque C++ devant le flot cout
et le retour à la ligne endl.
3. Compilez le fichier exo2.cpp de manière à générer un exécutable nommé exo2 puis
testez cet exécutable.
4. L’utilisation de l’espace de nom std devant chaque identificateur lié aux entréessorties C++ devient rapidement pénible (si, si ...). Pour éviter cette utilisation
systématique, il est possible de préciser dès le départ du programme que l’on souhaite
utiliser cet espace de nom et n’utiliser ensuite que l’identificateur souhaité. Modifiez
donc votre programme de manière à ce qu’il corresponde à ce qui suit ...
#include <iostream>
using namespace std;
int main(int argc, char *argv[]){
cout
<< "Hello C++ World !!!" << endl;
return 0;
}
Exercice 3
Recopiez le fichier exo2.cpp dans un fichier nommé exo3.cpp. Dans ce nouveau fichier,
déclarez une variable interne à la fonction main, nommée entier, de type entier (int), que
2
vous initialiserez à la valeur 10. Modifiez le code de la fonction main de manière à faire
afficher le contenu de cette variable à la suite (sur la même ligne) du message Hello C++
World !!!. Vous compilerez votre fichier source dans un fichier exécutable nommé exo3 et
en testerez la validité.
Exercice 4
Dans l’exercice précédent, la valeur numérique de la variable entier est fixée une fois
pour toute. Vous allez modifier votre programme de telle sorte qu’il demande à l’utilisateur
une valeur entière, saisisse cette valeur puis l’affiche. Concrétement, ce que vous devrez
voir apparaı̂tre au moment de l’exécution de l’application exo4 correspondra aux étapes
suivantes :
1. lancement de l’application :
entrez une valeur entière :
2. choix de la valeur à entrer : (ici 123)
entrez une valeur entière : 123
3. saisie de cette valeur et affichage :
entrez une valeur entière : 123
valeur saisie : 123
Ecrire le fichier source exo4.cpp qui contiendra le programme correspondant à ce qui
est demandé. On rappelle que la lecture depuis l’entrée standard d’une donnée se fait par
l’intermédiaire du flot d’entrée cin et de l’opérateur >>.
Exemple
...
int v; float w;
cin >> v; // lecture d’un entier et rangement dans v
cin >> w; // lecture d’un réel et rangement dans w
...
3
Exercice 5
Ecrire un programme nommé divise (fichier source divise.cpp) qui saisisse 2 nombres
réels et affiche le résultat de la division du premier par le second. L’exécution du programme
devra donner un affichage de la forme suivante :
entrez le premier nombre réel : 12.5
entrez le second nombre réel : 2.0
12.5 divisé par 2 vaut 6.25
Exercice 6
Modifiez le programme précédent de manière à ce qu’un message d’erreur soit affiché
si la valeur du diviseur est nulle (division par 0 interdite ...). On rappelle qu’un test peut
être fait via la structure de if(...) { ... } else { ... } et que le test d’égalité entre
2 valeurs s’effectue avec l’opérateur ==.
Exercice 7
La librairie standard du C++ fournit une classe permettant de représenter les chaı̂nes
de caractères et de les manipuler via un certain nombre de méthodes. Cette classe se nomme
string et nécessite pour être utilisée d’inclure la bibliothèque <string>. Ce premier exercice va vous permettre de voir différentes manières d’instancier (créer) des variables de
cette classe.
Instancier une chaı̂ne vide
La déclaration suivante :
string chn;
permet d’instancier un objet de la classe string (une variable de type string), qui sera
initialisé comme étant vide (aucun caractère dans la chaı̂ne). À partir de cette déclaration,
la chaı̂ne nommée chn peut être utilisée comme n’importe quelle variable. Ainsi, le code
suivant permet d’afficher le contenu de la chaı̂ne :
cout << "ma chaine = " << chn << endl;
Écrire un programme nommé exo7 (fichier source exo7.cpp) qui instancie une chaı̂ne
vide et affiche son contenu.
4
Instancier une chaı̂ne avec un contenu
La classe string possède les deux constructeurs suivants :
string( const char *s);
string( const string& s);
Le premier permet d’instancier une chaı̂ne et de l’initialiser avec le contenu de la chaı̂ne
de caractères s. La seconde instancie une nouvelle chaı̂ne et l’initialise à partir du contenu
de l’instance de la classe string qui est passée en paramètre.
Exemples
string chaine1("premiere chaine");// chaine1 vaut "premiere chaine"
string chaine2("second essai");
// chaine2 vaut "second essai"
string chaine3(chaine2);
// chaine3 vaut "second essai"
Modifiez le programme précédent de manière à créer les 3 chaı̂nes proposées dans
l’exemple ci-dessus et à afficher leur contenu afin de vérifier que ce qui est indiqué en
commentaire sur la partie droite est bien correct.
Exercice 8
La classe string possède de nombreuses méthodes qui facilitent la manipulation des
chaı̂nes de caractères.
Affectation
Il est possible d’utiliser l’opérateur d’affectation standard (=) pour recopier une chaı̂ne
dans une autre.
Exemple
string chaine1("premiere chaine");
string chaine2("second essai");
string chaine3;
chaine2 = chaine1;
chaine3 = "un texte quelconque";
Question : Que valent chaine2 et chaine3 après exécution de cet exemple ? vérifiez-le
en modifiant votre programme en conséquence.
5
Concaténation
Il est possible d’utiliser l’opérateur d’addition standard (+) pour concaténer des chaı̂nes
de caractères.
Exemple
string chaine1("premiere chaine");
string chaine2("second essai");
string chaine3;
chaine3 = chaine1 + chaine2;
chaine1 = chaine1 + "un texte quelconque";
Question : Que valent chaine3 et chaine1 après exécution de cet exemple ? vérifiez-le
en modifiant votre programme en conséquence.
Comparaison
La classe string fournit une méthode nommée compare qui permet de comparer deux
chaı̂nes de caractères. La comparaison se fait suivant l’ordre lexicographique (ordre du
dictionnaire ...) ; la méthode fournit la valeur 0 si les deux chaı̂nes sont égales, une valeur
négative si la première chaı̂ne (l’instance appelante) est située avant la seconde dans l’ordre
lexicographique et positive dans le cas contraire.
Exemple
string
string
string
string
chaine1("alphabet");
chaine2("second essai");
chaine3("troisieme");
chaine4="alphabet";
int res1 = chaine1.compare(chaine4);
int res2 = chaine2.compare(chaine3);
int res3 = chaine3.compare("trois");
Question : Que valent res1, res2 et res3 après exécution de cet exemple (0, < 0 ou
> 0) ? Vérifiez-le en modifiant votre programme en conséquence.
Exercice 9
Ecrire un programme qui saisisse deux chaı̂nes de caractères (sans espace dans les
chaı̂nes) et qui affiche leur ordre lexicographique.
6
Exemple
entrez la premiere chaine : toto
entrez la seconde chaine : toto
toto = toto
entrez la premiere chaine : alphabet
entrez la seconde chaine : alpha
alphabet > alpha
Exercice 10 (optionnel)
Écrire un programme qui saisisse une suite de chaı̂nes de caractères terminée par la
chaı̂ne ”FIN” et qui affiche la chaı̂ne la plus ≪ petite≫ par rapport à l’ordre lexicographique.
Il sera nécessaire d’utiliser une boucle while.
7