Skip to article frontmatterSkip to article content

TP2 : Comment renommer les choses ?

IUT d'Orsay, Université Paris-Saclay

Objectifs

Le but de ce TP est de comprendre les points suivants :

Exercice 1 : Magic numbers

magic-numbers.cpp
#include <iostream>
#include <string>

using namespace std;

bool qualifiesForDiscount(double originalPrice) {
    return originalPrice >= 10;
}

double calculateDiscountPercentage(double originalPrice, bool isStudent, bool isLoyalCustomer) {
    double discountPercentage = 0.0;

    if (qualifiesForDiscount(originalPrice)) {
        if (isStudent) {
            discountPercentage += 10; 
        }
        if (isLoyalCustomer) {
            discountPercentage += 10;
        }
    }

    return discountPercentage;
}

double calculateDiscountAmount(double originalPrice, double discountPercentage) {
    return originalPrice * discountPercentage/100;
}

double calculateFinalPrice(double originalPrice, bool isStudent, bool isLoyalCustomer){
    double discountPercentage = calculateDiscountPercentage(originalPrice, isStudent, isLoyalCustomer);
    double discountAmount = calculateDiscountAmount(originalPrice, discountPercentage);
    double finalPrice = originalPrice - discountAmount;
    return finalPrice;
}

double redeemStudentPoints(double discountAmount){
    return discountAmount*(100-10)/100;
}

double redeemLoyaltyPoints(double discountAmount){
    return discountAmount*(100-2*10)/100;
}

double calculateRewardPoints(double discountAmount, bool isStudent, bool isLoyalCustomer){
    double rewardPoints = 0.0;
    if (isStudent){
        rewardPoints = redeemStudentPoints(discountAmount);
    } else if (isLoyalCustomer){
        rewardPoints = redeemLoyaltyPoints(discountAmount);
    }
    return rewardPoints;
}

int main() {
    const double originalPrice = 100;
    const bool isStudent = true;
    const bool isLoyalCustomer = true;

    cout << "Original price: " << originalPrice << " euros." << endl;

    double finalPrice = calculateFinalPrice(originalPrice,isStudent,isLoyalCustomer);
    cout << "Final price with student and loyalty discounts: " << finalPrice << " euros." << endl;

    double discountAmount = originalPrice - finalPrice;
    cout << "Your reward points: " << calculateRewardPoints(discountAmount,isStudent,isLoyalCustomer) << endl;

    return 0;
}
  1. Enregistrez puis compilez le code (avec g++ -o magic-numbers magic-numbers.cpp).
  1. Exécutez ./magic-numbers.

  2. Comprenez-vous ce que fait ce code ?

  1. Bien que les noms des éléments soient appropriés, ce code n’est pas propre. En voyez-vous les raisons ?
  1. Nommez les magic numbers.

User input

Pour éviter de recompiler le code à chaque fois que vous modifiez originalPrice, isStudent et isLoyalCustomer, nous pouvons récupérer les valeurs par clavier lors de l’exécution.

  1. Remplacez les lignes suivantes par le code qui suit.
const double originalPrice = 100;
const bool isStudent = true;
const bool isLoyalCustomer = true;
double userOriginalPrice;
cout << "Enter the original price: ";
cin >> userOriginalPrice;
const double& originalPrice = userOriginalPrice;

bool userIsStudent;
cout << "Are you a student? (1:Yes, 0:No) ";
cin >> userIsStudent;
const bool& isStudent = userIsStudent;

bool userIsLoyalCustomer;
cout << "Do you have a loyalty card? (1:Yes, 0:No) ";
cin >> userIsLoyalCustomer;
const bool& isLoyalCustomer = userIsLoyalCustomer;
  1. Testez votre code et répondez aux questions du Quiz.

Exercice 2 : Classes et méthodes

classes-et-methodes.cpp
#include <iostream>
using namespace std;

double b1 = 0.0;
double b2 = 100.0;

void d1(double x) {
    b1 += x;
}

void d2(double x) {
    b1 += x;
}

void w1(double x) {
    if (x + 4 <= b1) {
        b1 -= (x + 4);
    } else {
        cout << "Insufficient funds!" << endl;
    }
}

void w2(double x) {
    if (x + 2 <= b2) {
        b2 -= (x + 2);
    } else {
        cout << "Insufficient funds!" << endl;
    }
}

int main() {
    d1(100.0);
    w1(50.0);
    w2(50.0);
    cout << "First account balance: " << b1 << endl;
    cout << "Second account balance: " << b2 << endl;
    return 0;
}
  1. Comprenez-vous ce que fait ce code ?
  1. Quiz : Lequel des deux comptes dispose du solde le plus élevé après ces transactions ?

  2. Remplacez les transactions précédentes par les suivantes :

d1(100.0);
w1(50.0);
d2(100.0);
w2(50.0);
  1. Quiz : Maintenant, quel est le compte qui dispose du solde le plus élevé ?
  1. Pour améliorer ce code, nous allons le réécrire de la manière suivante :
classes-et-methodes.cpp
#include <iostream>
using namespace std;

enum t {B, S};

class b {
private:
    double mB1;
    t mT;
    double mF;

public:
    b(double b1, t t1) : mB1(b1), mT(t1) {
        switch(t1){
            case B:
                mF = 4;
                break;
            case S: 
                mF = 2;
                break;
        }
    }

    void d(double x) {
        mB1 += x;
    }

    void w(double x) {
        if (x + mF <= mB1) {
            mB1 -= (x + mF);
        } else {
            cout << "Insufficient funds!" << endl;
        }
    }

    double getB1() const {
        return mB1;
    }

    string tToString() const {
        switch(mT){
            case B: return "Basic";
            case S: return "Standard";
            default: return "Unknown";
        }
    }
};

int main() {
    b a1(0.0,B);
    b a2(100.0,S);
    a1.d(100.0);
    a1.w(50.0);
    a2.d(100.0);
    a2.w(50.0);
    cout << "First account type: " << a1.tToString() << " and balance: " << a1.getB1() << endl;
    cout << "Second account type: " << a2.tToString() << " and balance: " << a2.getB1() << endl;
    return 0;
}
  1. Comprenez-vous ce que fait ce code ?
  1. Quiz : Cette fois, quel est le compte qui dispose du solde le plus élevé ?

  2. Ce code compile et fonctionne comme il se doit, mais il est une véritable atrocité pour les yeux. Il me fait mal au cœur. Il est impératif de renommer ces horreurs.

  1. Recompilez et testez votre code.

  2. Ajoutez un troisième type “Premium” avec un frais de retrait de 1 euro.

  3. Dans la fonction int main(), remplacez le code existant par les instructions suivantes :

  1. Quiz : Quelle est la somme des soldes des trois comptes ?

Revenez aux objectifs et cochez les points que vous avez maîtrisés. Revenez sur les points que vous n’avez pas encore bien compris. Appelez votre encadrant si besoin.