Premiers pas

Apprendre par l'exemple

L'un des meilleurs moyens d'apprendre à programmer dans un nouveau langage consiste à examiner de très nombreux exemples de programmes. La meilleure chose à faire est de copier et coller chaque programme ci-dessous dans un fichier texte et de le compiler. Ensuite, effectuez des tests. En étendant ces exemples de programmes, vous vous familiariserez avec différents aspects de C++ et vous vous sentirez plus à l'aise au moment d'écrire des programmes à partir de zéro.

Exemple 1: Faire fonctionner votre compilateur

Si vous ne l'avez pas déjà fait, copiez et collez le programme classique suivant dans un fichier texte, puis compilez-le. Les instructions sur la compilation sont disponibles sur cette page.

Il est possible que vous ayez passé en revue les détails de ce programme dans le tutoriel. Nous ne vous fournirons donc pas de description ligne par ligne ici. Il y a toutefois quelques points à noter concernant la lisibilité. Il s'agit des commentaires et de la mise en forme qui contribuent à rendre les programmes faciles à lire, à comprendre et à gérer.

  • Chaque programme que nous écrivons commence par un commentaire d'en-tête, fournissant le nom de l'auteur, ses coordonnées, une brève description et son utilisation (le cas échéant). Chaque fonction commence par un commentaire sur l'opération et l'utilisation.
  • Nous ajoutons des commentaires explicatifs à l'aide de phrases complètes lorsque le code ne se documente pas, par exemple si le traitement est délicat, non évident, intéressant ou important.
  • Utilisez toujours des noms descriptifs: les variables sont des mots en minuscules séparés par _, comme dans "my_variable". Les noms de fonctions utilisent des lettres majuscules pour marquer les mots, comme dans MyExcitingFunction(). Les constantes commencent par un "k" et utilisent des lettres majuscules pour marquer les mots, comme dans kDaysInWeek.
  • La mise en retrait est par multiples de deux. Le premier niveau est composé de deux espaces. Si un retrait supplémentaire est nécessaire, nous utilisons quatre espaces, six espaces, etc.
// hello.cpp: Maggie Johnson
// Description: a program that prints the immortal saying "hello world"

#include <iostream>
using namespace std;

int main() {
  cout << "Hello World!" << endl;
  return 0;
}

Voici quelques tests à essayer:

  • Le plus important est de vous assurer que vous pouvez compiler et exécuter ce programme.
  • Modifiez le programme ci-dessus pour afficher "Hello World!". Quatre fois par ligne de 6 lignes, chacune étant imprimée dans un champ de 17 espaces. Pour ce faire, utilisez des boucles for. Cliquez ici pour en savoir plus sur le formatage de la sortie avec cout. Cliquez ici pour afficher la solution.
  • À l'aide du programme que vous venez de terminer, découvrez comment imprimer "Hello World!" aligné à gauche dans les champs de 17 espaces (la valeur par défaut est généralement alignée à droite). Cliquez ici pour consulter la solution.

Exemple 2: Obtenir des données

Il est facile d’obtenir une entrée à partir du clavier en C++ à l’aide de cin. Voici un exemple :

// get_input.cpp: Maggie Johnson
// Description: Illustrate the use of cin to get input.

#include <iostream>
using namespace std;

int main() {
  int input_var = 0;
  // Enter the do while loop and stay there until either
  // a non-numeric is entered, or -1 is entered. Note that
  // cin will accept any integer, 4, 40, 400, etc.
  do {
    cout << "Enter a number (-1 = quit): ";
    // The following line accepts input from the keyboard into
    // variable input_var.
    // cin returns false if an input operation fails, that is, if
    // something other than an int (the type of input_var) is entered.
    if (!(cin >> input_var)) {
      cout << "You entered a non-numeric. Exiting..." << endl;
      break;
      // exit the do while loop
    }
    if (input_var != -1) {
      cout << "You entered " << input_var << endl;
    }
  } while (input_var != -1);
  cout << "All done." << endl;
  return 0;
}

Un test:

  • Lorsqu'une erreur d'entrée se produit, le flux "s'interrompt", cin renvoie la valeur "false" et le programme s'arrête. Il est très important de se prémunir contre de telles erreurs, comme nous l'avons fait dans le programme ci-dessus. Mais que se passe-t-il si nous voulons récupérer de l'erreur plutôt que de laisser le programme s'arrêter ? Pour résoudre une erreur, suivez les deux étapes ci-dessous :
    1. Effacer l'erreur avec cin.clear().
    2. Supprimez les caractères incorrects du flux. Pour ce faire, vous pouvez utiliser cin.ignore().

Suivez ces deux étapes pour écrire un programme qui répare les saisies incorrectes. Utilisez Google pour rechercher le fonctionnement de ces méthodes. Cliquez ici pour consulter notre solution.

Exemple 3: Que produit ce programme ?

#include <iostream>
using namespace std;

int main() {
  cout << " 1\t2\t3\t4\t5\t6\t7\t8\t9" << endl << "" << endl;
  for (int c = 1; c < 10; c++) {
    cout << c << "| ";
    for (int i = 1; i < 10; i++) {
      cout << i * c << '\t';
    }
    cout << endl;
  }
  return 0;
} 

Exemple 4: La décomposition facilite les choses...

Il est temps pour nous de commencer à écrire des jeux vidéo ! La première étape sera un peu simple, mais c'est un début. Notre tâche consiste à écrire un programme implémentant un jeu de devinettes. Notre programme génère un nombre aléatoire compris entre 0 et 100. Le joueur doit deviner le nombre secret. Le programme fournit des indices tels que "c'est trop élevé" ou "c'est trop bas" jusqu'à ce que le joueur devine enfin le chiffre secret.

Nous allons travailler sur ce jeu en trois étapes. 

  1. Déterminer comment générer un nombre aléatoire dans une plage de valeurs donnée
  2. Créez une fonction principale qui traite la proposition du joueur et fournit des indications.
  3. Ajoutez les éléments nécessaires pour permettre plusieurs propositions jusqu'à ce que le joueur devine le nombre.

Ce processus de développement est appelé "décomposition", ce qui signifie que vous devez diviser une tâche en sous-tâches, chacune d'entre elles étant facile à effectuer.

À partir de l'étape 1, effectuez une recherche Google pour voir comment générer un nombre aléatoire à l'aide de C++. Essayez de rechercher "rand C++". Pour savoir comment procéder, consultez cette page

Pour l'étape 2, nous devons recevoir une entrée entière du lecteur (avec une vérification d'erreur appropriée sur cin) et la comparer au nombre secret. Essayez d'écrire cette partie du jeu vous-même avant de consulter notre solution.

Enfin, nous devons ajouter une boucle qui continue de collecter les réponses du joueur jusqu'à ce qu'il devine le nombre secret. Une fois cette partie du programme terminée, vous pouvez consulter notre solution.

La décomposition est l'une des compétences les plus importantes à apprendre pour un programmeur. Être capable de décomposer une tâche en éléments gérables, puis de les terminer une par une, est essentiel, quelle que soit la taille du projet. Voici d'autres opportunités pour vous exercer à la décomposition.

  • De nombreuses tâches quotidiennes offrent des occasions de développer des compétences en décomposition. Vous pourriez être surpris de découvrir que votre esprit fonctionne parfaitement de cette façon !

    Par exemple, si je dois nettoyer une cuisine en désordre (peut-être que certaines filles viennent de préparer un gâteau), je décompose les tâches pour fournir un plan et m'assurer de ne pas avoir à refaire le travail plus tard. Je ne veux pas laver le sol en premier s'il y a toutes sortes de choses à nettoyer sur les comptoirs. Je devrai probablement refaire le sol plus tard. Je vais donc d'abord ranger tous les ingrédients, placer la vaisselle dans l'évier, nettoyer les plans de travail, laver la vaisselle et enfin nettoyer le sol. Il existe d'autres façons d'effectuer cette tâche, mais en réfléchissant d'abord, cela m'aide à définir un plan qui ne nécessitera pas de travail supplémentaire.

    Utilisez les tâches quotidiennes comme exemples pour développer vos compétences de décomposition. Qui sait, cette technologie pourrait même vous rendre plus efficace dans votre maison !

  • Le plus grand diviseur commun de deux entiers est le plus grand nombre qui les divise de manière égale. Par exemple, gcd(12, 18) = 6, gcd(−4, 14) = 2. Le moyen le plus efficace de calculer gcd consiste à utiliser l'algorithme euclidien. Écrivez un programme avec une fonction permettant de calculer gcd pour deux entiers. Essayez d'abord d'exécuter la fonction sans récursion. Cela vous aidera à comprendre le fonctionnement de l'algorithme.

    Définissez explicitement vos sous-tâches. Par exemple, recherchez le code de l'algorithme euclidien, créez une fonction non récursive pour l'algorithme, etc. Voici notre solution sur cette page.

Exemple 5: Puzzles mathématiques

L'une des capacités de l'informatique est la possibilité de rechercher par force brute une solution à un problème. Des essais et erreurs fonctionnent très bien pour certains problèmes. En fait, les ordinateurs peuvent être particulièrement doués pour de tels problèmes. Réfléchissez aux points suivants:

Les chevaux coûtent 10 $, les cochons 3 $et les lapins seulement 0, 50 $. Un agriculteur achète 100 animaux pour 100 $. Combien de chaque animal a-t-il acheté ? 

Il existe une solution remarquable à ce problème. Essayez de le trouver avant de regarder le nôtre.

En voici un autre à essayer:
De combien de façons est-il possible de disposer six livres différents sur une étagère, de gauche à droite ?

Cette fois, nous allons vous donner la solution et vous permettre d'écrire le programme : 720.

Exemple 6: Chaînes à prendre en compte

Que produit le programme suivant ?

#include <iostream>
using namespace std;

int main() {
  string str1 = "To be or not to be, that is the question";
  string str2 = "only ";
  string str3 = str1.substr(6, 12);
  str1.insert(32, str2);
  str1.replace(str1.find("to be", 0), 5, "to jump");
  str1.erase(9, 4);
  cout << str1 << endl;
  for (int i = 0; i < str3.length(); i++)
    cout << str3[i]; cout << endl;
}

Cliquez ici pour obtenir de l'aide.

Exemple 7: Prochaines étapes avec décomposition – Votre premier jour de travail

Vous venez d'obtenir un poste de vendeur pour la société ExerShoe, spécialisée dans les chaussures d'exercice haut de gamme coûtant environ 225 $par paire. Votre patron vous a proposé trois options de rémunération, que vous devez choisir avant de commencer votre premier jour:

  1. Salaire direct de 600 $par semaine ;
  2. Un salaire de 7 $de l'heure plus une commission de 10% sur les ventes ;
  3. Aucun salaire, mais 20% de commissions et 20 $pour chaque paire de chaussures vendue

En tant que programmeur C++ expert, vous savez que vous pouvez écrire un programme pour vous aider à choisir le meilleur choix de rémunération.

Une approche courante pour effectuer la décomposition pour un programme plus important consiste à créer une fonction principale qui se lit comme un aperçu pour résoudre le problème. Ensuite, nous écrivons les fonctions permettant d'effectuer chaque tâche.

Voici un premier passage au programme principal:

  GetInput(WeeklySales);
  CalcMethod1(WeeklySales);
  CalcMethod2(WeeklySales);
  CalcMethod3(WeeklySales); 

Vérifiez si vous pouvez mettre en œuvre chacune de ces fonctions avant d'examiner notre solution.

Exemple 8: Où sont disponibles les produits ou services ?

Quelle est la sortie du programme suivant ?

// scope.cpp, Maggie Johnson
// Description: A program to illustrate different scopes

#include <iostream>
using namespace std;

int a = 18;
int b = 6;

int function1(int a, int b) {
  return a - b;
}

int function2() {
  int c;
  c = a + b;
  return c;
}

int main() {
  int b = 12;
  int c = 0;
  a = function1(b, a);
  c = function2();
  cout << "a: " << a << " b: " << b << " c: " << c << endl;
}

Une fois que vous avez trouvé la réponse à votre question, consultez la version commentée du code sur cette page.

Exemple 9: Traitement des fichiers

Le traitement des fichiers en C++ est effectué à l'aide de fstream. Pour enregistrer dans un fichier, nous déclarons un flux d'entrée (ofstream) et l'ouvrons en mode "out". Découvrez ce point dans l'exemple suivant.

// file.cpp, Maggie Johnson
// Description: An illustration of file processing
#include <fstream>
#include <iostream>
using namespace std;

int main() {
  char first_name[30], last_name[30]; int age;
  char file_name[20];
  // Collect the data.
  cout << "Enter First Name: "; cin >> first_name;
  cout << "Enter Last Name: "; cin >> last_name;
  cout << "Enter Age: "; cin >> age;
  cout << endl << "Enter the name of the file: "; cin >> file_name;

  // Create an ofstream called People, open the stream for output.
  ofstream People(file_name, ios::out);
  // Write the output to the stream.
  People << first_name << endl << last_name << endl << age << endl; return 0;
} 
  • Essayez de comprendre comment ouvrir le fichier que vous venez de créer et d'afficher les données.Voici la solution.
  • Voyons maintenant si vous pouvez modifier ce programme pour permettre à l'utilisateur de saisir de nombreux enregistrements de données à l'aide d'une boucle. Nous voulons également relire toutes les données, un enregistrement à la fois.Voici la solution.

Vous êtes maintenant prêt à essayer des exercices et projets par vous-même !

C'est ce que c'est que de travailler pour un ingénieur logiciel chez Google

Pour en savoir plus sur ce que cela signifie de travailler chez Google, consultez ce site Web.

Exercices et projets

Les exercices suivants vous permettront de vous exercer davantage avec le C++ de base. Nous ne fournissons pas de solutions pour ces exercices et projets, car nous aimerions que vous travailliez avec d'autres étudiants de ce cours.

  1. Les bips courants d'un cricket sur le terrain sont en rapport direct avec la température actuelle. Nous obtenons la température en additionnant 40 au nombre de bips d'un grillon en une minute, puis en divisant cette valeur par 4. Écrivez un programme qui reçoit le nombre de stridulations par minute et imprime la température actuelle. Exemple :
    Number of chirps: 120
    The temperature is: 40.0 degrees. 
  2. Rédigez un programme qui calculera votre note finale pour un cours de programmation que vous suivez. Voici le schéma de notation :
    Final grades will be based on the following:
    40% Assignments   15% Midterm Examination
    35% Final Examination
    10% Class Participation Grade 

    Votre programme doit demander à l'utilisateur les quatre notes aux devoirs : les notes de milieu de trimestre, de fin et de section. Ensuite, le score final est calculé et imprimé. Pour effectuer les calculs, vous calculez la moyenne des quatre notes d'attribution, puis vous la multipliez par 0,4 (40%). Vous multipliez ensuite la note de milieu de trimestre par 0,15, la note finale par 0,35 et la note de participation par 0,1. Ensuite, vous additionnez tous les résultats de ces multiplications.

    Utilisez des fonctions partout où vous le pouvez dans ce programme. Vous pouvez créer une fonction pour obtenir l'entrée en transmettant en tant que paramètre la chaîne à afficher dans un cout explicatif. Voici un exemple d'exécution:

    Enter the score for the first assignment. 75
    Enter the score for the second assignment. 85
    Enter the score for the third assignment. 82
    Enter the score for the fourth assignment. 94
    Enter the score for the midterm. 81
    Enter the score for the final. 89
    Enter the score for the section grade. 100
    The final grade is: 86.9
  3. À mesure que les chronomètres électroniques deviendront moins chers et de plus en plus précis, nous serons sans doute inondés de mesures de temps incroyablement précises. Écrivez un programme qui prend en entrée une période donnée en secondes et génère le nombre d'heures, de minutes et de secondes qu'il représente. Exemple :
    Number of seconds: 3662
    Hours: 1
    Minutes: 1
    Seconds: 2     
  4. Dans l'exemple suivant, effectuez la décomposition avant d'écrire votre programme. Dans la mesure du possible, utilisez des fonctions pour créer des programmes bien structurés.

  5. Supposons que nous voulions imprimer une bannière pour les éléments suivants:

    "GERZY BREEZE FERMET TROIS FLÈCHES"

    Étant donné qu'il s'agit d'une bannière, nous souhaitons que les lettres soient assez grandes:

    FFFFF
    F
    FFF
    F
    F
    
    EEEEE
    E
    EEE
    E
    EEEEE
    
    , etc.

    Comme vous avez un bon décomposeur de problème, vous avez probablement remarqué qu'au lieu de placer tous les couts dans la fonction principale, il serait beaucoup plus efficace de les placer dans des fonctions. Nous pourrions donc avoir une fonction "printE" et une fonction "printZ", et ainsi de suite.

    Écrivez un programme avec des fonctions qui créent une bannière contenant un mot ou une expression avec de nombreuses lettres répétées. Plusieurs possibilités:

    FREEZY BREEZE MAKES FLEAS
    SNEEZE TWEETLE BEETLE PADDLE BATTLE
    SIX SICK CHICKS KICK
    SUE SEWS SUE'S SOCKS
    BEN BENDS BIM'S BROOM 
  6. Voici un problème de "nombre magique" : demandez à un utilisateur de saisir un numéro à trois chiffres dont le premier chiffre est supérieur au dernier. Votre programme inverse le nombre et soustrait cette annulation du nombre d'origine. Enfin, inversez le nombre obtenu et ajoutez-le à sa forme non inversée. Générez le résultat final. Le nombre d'origine saisi par l'utilisateur doit être de type entier (et non composé de trois caractères). Réfléchissez à la façon d'écrire une fonction en utilisant un nombre entier comme entrée et en renvoyant l'inverse de ce nombre. Exemple :
    input number: 901
    reverse it: 109
    subtract: 901 - 109 = 792
    reverse it: 297
    add: 297 + 792 = 1089   
  7. La loi exige que les fabricants de produits alimentaires fixent des dates d'expiration sur leurs produits, mais il existe une faille dans la loi: elle n'exige pas que la date d'expiration soit indiquée sous une forme particulière. Cela peut donc être écrit en swahili tout en restant légal.

    Nadine, troisième cousine de Ralph Nader, est une espionne qualité alimentaire. Elle a appris que de nombreux fabricants de produits alimentaires ont commencé à encoder les dates d'expiration des produits pour empêcher les clients de connaître leur âge.

    Toutefois, l'encodage permet aux supermarchés de déterminer les dates d'expiration s'ils le souhaitent.

    Une méthode d'encodage populaire:

    • encoder les mois de janvier à décembre sous la forme de "A" à "L"
    • encoder chaque chiffre de la date entre "Q" et "Z"
    • encoder l'année sous la forme de "A" à "Z", ce qui signifie de 1 à 26, qui est ensuite ajouté à 1995.

    Nadine a trouvé une miche de pain particulièrement discutable à cette date: l'ARZM. Écrivez un programme pour déterminer la date.

  8. C'est une analogie avec un célèbre tour de carte. Demandez à l'utilisateur de saisir un numéro à trois chiffres. Considérez le nombre comme ABC (A, B et C étant les trois chiffres du nombre). Maintenant, déterminez les restes des nombres formés par ABC, BCA et CAB, divisés par 11. Nous appellerons ces restes X, Y, Z. Additionnez-les au format X+Y, Y+Z, Z+X. Si l'une des sommes est impaire, augmentez-la ou diminuez-la de 11 (quelle que soit l'opération qui donne un nombre positif inférieur à 20 ; notez que si la somme est égale à 9, signalez-la et arrêtez le processus). Enfin, divisez chacune des sommes en deux. Les chiffres résultants sont A, B et C. Écrivez un programme qui implémente cet algorithme.

Application: visualiser de la musique avec des animations

Les ingénieurs logiciels créent une grande variété d'applications souvent intéressantes et innovantes. Dans chaque module de ce cours, nous présentons une application différente conçue et mise en œuvre par des ingénieurs pour vous aider à comprendre tous les domaines dans lesquels ils travaillent.

Voici une application intéressante conçue pour visualiser de la musique.