Aller au contenu

Exercice3

Exercice 3 : Affichage 7-segments

Écrivez un programme en C++ qui simule un affichage à sept segments.

L’interface publique de la classe Segments est donnée :

class Segments {
public:
    Segments(int n = 1);
    void Set(int v);
    void Draw(int w = 3, int h = 2, int dx = 1);
private:
    // TODO
};

L’argument du constructeur indique le nombre de “digits” qui compose l’affichage. La méthode Set définit le nombre à afficher. La méthode Draw simule l’affichage avec des segments horizontaux de w caractères, des segments verticaux de h caractères et un espace de dx entre deux segments.

Testez avec le programme principal suivant :

int main()
{
    Segments s(4) ;
    s.Set(639);
    s.Draw();
}

Le résultat devrait ressembler à ça :

 ---   ---   ---   --- 
|   | |         | |   |
|   | |         | |   |
       ---   ---   --- 
|   | |   |     |     |
|   | |   |     |     |
 ---   ---   ---   --- 

Pour l’affichage, vous pouvez utiliser la classe Canvas que nous vous donnons ci-dessous, mais vous pouvez aussi faire autrement si vous voulez :

#include <iostream>
#include <vector>
#include <stdint.h>

class Canvas {
public:
    Canvas (int w, int h);
    virtual ~Canvas() {}; 
    void Clear (char c = '.');
    void HLine(int x, int y, int len, char c = '*');
    void VLine(int x, int y, int len, char c = '*');
    void Print();
private:
    std::vector<std::vector<char>> canvas_;
}; 

Canvas::Canvas (int w, int h) {
    canvas_.resize(h);
    for (int y = 0; y < h; y++) {
        canvas_[y].resize(w, ' ');
    }
}

void Canvas::Clear (char c) {
    for (int y = 0; y < canvas_.size(); y++) {
        for (int x = 0; x < canvas_[y].size(); x++) {
            canvas_[y][x] = c;
        }
    }
}

void Canvas::HLine(int x, int y, int len, char c) {
    for (int i = 0; i < len; i++) {
        canvas_[y][x+i] = c;
    }
}

void Canvas::VLine(int x, int y, int len, char c) {
    for (int i = 0; i < len; i++) {
        canvas_[y+i][x] = c;
    }
}

void Canvas::Print() {
    for (auto row: canvas_) {
        for (auto c: row) {
            std::cout << c;
        }
        std::cout << std::endl;
    }
}