Skip to article frontmatterSkip to article content

TP3 : Initiation à la refactorisation

IUT d'Orsay, Université Paris-Saclay

Objectifs

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

Exercice 1 : Short functions

Organisation du code

  1. Créez un répertoire short-functions/ dans TP3/.

  2. Créez les fichiers suivants dans short-functions/.

product.h
product.cpp
display-prices.h
display-prices.cpp
main.cpp
#ifndef PRODUCT_H
#define PRODUCT_H

#include <string>

class Product {
private:
    std::string mName;
    double mPrice; // in euros
    int mQuantity; // in units

public:
    Product(const std::string& name, double price, int quantity);
    std::string getName() const;
    double getPrice() const;
    int getQuantity() const;
    bool operator<(const Product& other) const;
};

#endif
  1. Compilez le code avec g++ -o short-functions main.cpp display-prices.cpp product.cpp (l’ordre des .cpp n’a pas d’importance).
  1. Exécutez ./short-functions.

Refactorisation du code

  1. Que fait ce code ?
  1. Quiz : Quels sont les problèmes du code de displayAvailableProductsByNonDecreasingPriceAndDisplayTotalPrice ?

  2. Refactorisez le code de display-prices.cpp (en modifiant les autres fichiers concernés comme le header, le main).

Exercice 2 : Classify it

  1. Créez un répertoire classify-it/ (dans lequel le code sera organisé dans plusieurs fichiers différents).

  2. Dans classify-it/, créez le fichier suivant :

main.cpp
#include <iostream>
#include <string>
#include <vector>

double calculateAverage(const std::vector<double>& scores) {
    double sum = 0;
    for (double score : scores) {
        sum += score;
    }
    return sum / scores.size();
}

void printScores(const std::string& studentName, int studentId, const std::vector<double>& scores) {
    std::cout << std::endl << "Scores for " << studentName << " (Id: " << studentId << "): ";
    for (size_t i = 0; i < scores.size(); i++) {
        std::cout << "[" << i+1 << "] " << scores[i] << " ";
    }
    std::cout << std::endl;
}

void printAverage(const std::vector<double>& scores){
    std::cout << "Average: " << calculateAverage(scores) << std::endl;
}

int main() {
    std::string studentName;
    int studentId;
    std::vector<double> scores;

    studentId = 12345;
    studentName = "Alice";

    scores.push_back(11);
    scores.push_back(12.5);
    scores.push_back(14.75);
    scores.push_back(19);

    printScores(studentName, studentId, scores);

    return 0;
}
  1. Que fait ce code ?

Il est difficile d’ajouter des étudiants et leurs notes.
Nous allons donc créer une classe Student avec les trois attributs suivants :

  1. Créez la classe Student avec les méthodes appropriées (en incluant les fichiers .h et .cpp correspondants), et ajoutez-y les fonctions pour calculer la moyenne et afficher les notes.

  2. Modifiez les directives de main.cpp pour inclure student.h et les bibliothèques nécessaires.

User input (Bonus)

L’intérêt d’avoir une classe Student est de faciliter l’entrée des données de plusieurs étudiants.
Pour pouvoir saisir les informations de plusieurs étudiants, nous allons écrire plusieurs fonctions pour gérer les saisies utilisateur.

  1. Créez un fichier user-input.cpp ainsi que le fichier header associé.

  2. Voici des déclarations de fonctions pour vous aider :

void inputNumberOfStudents(int& number);
void inputStudentId(int& id);
void inputStudentName(Student& student);
void inputStudentScores(Student& student);
Student createStudentFromInput();
void printAllScoresAndAverages(const std::vector<Student>& students);
  1. Voici le code de inputStudentScores pour vous aider :
void inputStudentScores(Student& student) {
    double score;
    std::cout << "Enter score (-1 to stop): ";
    std::cin >> score;

    while (score != -1) {
        student.appendScore(score);
        std::cout << "Enter score (-1 to stop): ";
        std::cin >> score;
    }
}
  1. Implémentez les fonctions données et modifiez le main pour récupérer les saisies utilisateur et afficher les notes ainsi que les moyennes de chaque étudiant.

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.