TD 1: Bases: Terminal, g++

Corrigés: 2.cc 3.2.cc 3.3.cc 3.6.cc td1.tar

Note: le corrigé du 3.3.cc présenté ci-dessus ne donne pas la meilleure note car il n'est pas archi-optimisé. On peut gagner un peu de vitesse en n'itérant que sur les nombres pairs, et encore plus de vitesse en n'itérant que sur les nombres congrus à 1 ou 5 modulo 6 (ce qui suffit alors pour avoir le score max). Un corrigé "optimisé" qui rentre (de justesse) dans la limite de temps est dispo ici: 3.3.cc

Outils


Exercice 1: Premier programme. Boucle for

  1. Ouvrir un fichier 1.cc et coller le contenu suivant:
    #include <iostream>
    using namespace std;
    
    int main() {
      cout << "Hello\n";
      int result = 1;
      for (int i = 1; i <= 10; i++) {
        result *= i;
      }
      cout << "Result: " << result << endl;
    }
    
  2. Faites-le tourner! cf instructions ci-dessus.
    Avant de passer à la suite, vous devez tout comprendre de cet exemple (je vous expliquerai au besoin).

Exercice 2: Erreurs de compilation et d'éxecution

  1. Voilà un programme avec quelques erreurs. Copiez-le dans un fichier 2.cc:
    #include <iostream>
    #include <cmath
    using namespace std
    
    int main() {
      cout << "Hello\n";
      double sum;
      int N = 100000000;
      for (int i = 1; i < n; i+++) {
        sum = sum + 1 / i;
      }
      ccout << "Harmonic sum: " << sum << endl;
      cout << "Log(N):       " << log(N) << endl;
    }
    
    Et tentez de le compiler:
    g++ 2.cc
    Vous devriez voir pas mal d'erreurs de compilation.

    Réparez toutes les erreurs de compilation en modifiant 2.cc avec votre editeur de texte, et en relançant g++ 2.cc, jusqu'à ce que ça marche.
  2. Le résultat n'est pas celui escompté. Pourquoi? Indice: division entière.
    Réparez le programme pour qu'il calcule bien la somme de la série harmonique de 1 à 9999999

  3. Modifiez votre programme pour qu'il affiche la valeur (approchée) de la constante d'Euler, sur une quatrième ligne, après un caractère ':'.
    Voir la page wikipedia sur la Série Harmonique.

  4. Modifiez votre programme pour qu'il calcule le coefficient du prochain terme dans le dévelopement limité (utilisez la valeur de la constante d'Euler donnée sur Wikipedia), et l'affiche sur une cinquième ligne après un caractère ':'.
RENDU: 2.cc

Exercice 3: cin; Primalité

  1. Sauvez ce programme dans 3.1.cc et faites-le tourner:
    #include <iostream>
    using namespace std;
    
    int main() {
      int x;
      cout << "Entrez un nombre et appuyez sur [Enter]: ";
      cin >> x;
      cout << "Ce nombre est ";
      if (x % 2 == 0) {
        cout << "pair";
      } else {
        cout << "impair";
      }
      cout << "\n";
    }
    
  2. Copiez le code dans un autre fichier 3.2.cc et Modifiez-le pour qu'il demande 2 entiers a et b à l'utilisateur (l'un après l'autre), et qu'il teste la divisibilité de a par b. Il devra afficher "est divisible" si b divise a, et "n'est pas divisible" sinon.

    RENDU: 3.2.cc

  3. Copiez le code dans un autre fichier 3.3.cc et Modifiez-le avec une boucle for pour qu'il teste la primalité d'un nombre n donné par l'utilisateur (i.e. le nombre n est-il premier?). Il devra afficher "premier" si le nombre est premier, et "composite" si le nombre n'est pas premier.
    Indications:
    RENDU: 3.3.cc

  4. Faites tourner votre programme pour n = 2 milliards + 11: 2000000011.
    Optimisez votre programme pour qu'il tourne instantanément.
    Vérifiez-le sur: 9, 11, 14, 25, 2000000011, 2000000017. Lesquel(s) sont premiers?

  5. Utilisez le type long long au lieu de int pour utiliser des entiers 64 bits, qui vont jusqu'à 8 milliards de milliards (en gros). Essayer votre programme sur 1000000000000000001 et sur 1000000000000000003.
    RENDU: toujours 3.3.cc, amélioré.

  6. Modifiez-le pour afficher la décomposition en facteurs premiers du nombre (un facteur premier par ligne, dans l'ordre croissant).
    Essayez-le sur 6, 7, 60, 81 et 152415790094497781.
    RENDU: 3.6.cc.