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