Bonjour à toutes et à tous,
Voici le premier projet que vous avez à faire en devoir personnel. Les livrables (ci-dessous) sont à rendre le 26/10/2016 à 23h59mn59s au plus tard par l'envoi d'un courriel à [email protected] indiquant l'URL du projet (Cf. infra). Le projet consiste en :
«
La saisie, la conversion et l'affichage sous forme d'une chaîne de caractères
représentant les bits (0,1) de nombres réels en simple précision (32 bits)
conformément à la norme IEE 754 (Cf. https://fr.wikipedia.org/wiki/IEEE_754).
Le logiciel permettra la saisie d'un nombre et l'affichage de sa représentation
textuelle.
Le choix du langage est laissé à l'appréciation de chacun-e.
Le livrable attendu est un projet sur gitlab (sous votre compte dans le groupe
TSI2106) avec le code source (analyse, code, chaîne de compilation/livraison) et une
vidéo démontrant le résultat (pas plus de 2mn).
»
La structure du logiciel sera la base de l'évaluation (découpage, ré-utilisabilité, complexité à maintenir, documentation, tests et utilisation par l'équipe pédagogique !).
Un bonus +1 sera attribué au premier livrable (dans la date de réception des
courriels indiquant que le projet est livré) qui obtiendra une note supérieure
strictement à 10.
Un bonus +1 sera attribué pour la documentation du livrable (modélisation,
algorithmie, code source, choix effectués, vidéo).
La remise des livrables hors délai sera sanctionnée par un malus de -2.
Une note de 0 sera attribuée en cas de plagiat ou similitude des livrables.
Bon courage
Le code source se trouve dans le répertoire "code".
Le code a été écrit en C++11 dans Qt Creator 4.1.0 basé sur Qt 5.7.0 (MSVC 2013, 32 bit) et compilé sous MinGW 32bit (Debug, Profile, Release).
Voici la seule classe utilisée dans ce projet et écrite dans "fenetre.h". Il s'agit d'une classe Qt qui permet la construction d'une simple fenêtre composée au moins d'un champs d'entrée et d'un bouton de validation. A cette classe est attachée une unique fonction connectée au bouton et qui lance le programme principal.
fenetre : public QWidget
public:
fenetre(QWidget * owner = nullptr)
private:
QLabel *titre
QLineEdit *reel
QPushButton *conversion
QLabel *resultat
public slots:
void onClick()
Après l'appel du constructeur de la fenêtre dans "main.cpp", le code se divise en deux parties.
Dans "fenetre.cpp" se trouve le constructeur de la fenêtre et la fonction connectée au bouton :
fenetre::fenetre(QWidget *owner):QWidget{owner},titre{new QLabel{"",this}},reel{new QLineEdit{"",this}},conversion{new QPushButton{"run_project",this}},resultat{new QLabel{"",this}}{...}
Cette classe gère les paramètres de la fenêtre.
void fenetre::onClick(){...}
Cette fonction s'assure que le réel à convertir est correctement écrit.
Dans "norme_ieee_754.cpp" se trouve la fonction principale appelée dans "fenetre.cpp" et toutes les fonctions annexes :
void norme_ieee_754(const char *const_reel, char *binaire_ieee_754){...}
Il s'agit du programme principale qui appelle dans l'ordre les fonctions en annexes.
Elle prend en entrée 2 chaînes de caractères : une constante et une à remplir.
void f_signe(char *reel, char *binaire_ieee_754){...}
Cette fonction ajoute 1 ou 0 au binaire en fonction du signe du reel en entrée.
void f_binaire(char *reel, char *binaire_sans_signe){...}
Cette fonction fabrique simplement le binaire du reel en entrée.
Elle appelle cependant les deux fonctions "binaire_post_coma" et "binaire_post_coma" pour traiter le réel en deux parties avant de concaténer les 2 binaires obtenus.
int f_virgule_mantisse(char *binaire_sans_signe, char *reel){...}
Cette fonction fabrique la mantisse du binaire normé en procédant au décalage de la virgule en fonction du réel d'entrée. Le décalage est renvoyé en sortie. La chaîne de caractères ainsi modifiée doit contenir toujours 25 caractères à la fin, à savoir la taille de la mantisse plus la virgule et le binaire implicite. On procède donc à un rajout ou à une suppression de bits.
void f_exposant(char *binaire_exposant, char *reel, int decalage){...}
Cette fonction fabrique l'exposant de taille 9 en fonction du décalage mesuré. Certaines exceptions sont prises en compte dans le processus d'où la présence du réel en entrée.
int binaire_ante_coma(int quotient, char *b_a_c){...}
Cette fonction convertie en binaire la partie entière d'un réel.
void binaire_post_coma(float decimale, int t_b_a_c, char *b_p_c){...}
Cette fonction convertie en binaire la partie décimale d'un réel.
void remove_coma(char *binaire_exposant){...}
Cette fonction supprime la virgule et le bit implicite de la mantisse. La mantisse possède donc bien 23 bits.
void affichage_console(char *binaire_ieee_754, char *reel){...}
Cette fonction gère un affichage propre du résultat final dans le terminal.
Pour utiliser l'application (testée uniquement sur Windows 10), il suffit tout simplement de lancer un des exécutables suivants :
build-code-Desktop_Qt_5_7_0_MinGW_32bit-Debug\debug\code.exe
build-code-Desktop_Qt_5_7_0_MinGW_32bit-Profile\release\code.exe
build-code-Desktop_Qt_5_7_0_MinGW_32bit-Release\release\code.exe
Pour d'autre OS, une recompilation du code source est possible et nécessaire.
Compiler votre première fenêtre Qt
Convertisseur décimal, hexadécimal, binaire
Format simple précision (32 bits) exemple
How to convert QString to const char
Représentation des nombres réels dite à virgule fixe
Standard IEEE 754 des nombres à virgule flottante
[ Tutoriel ] un guide pour bien commencer avec markdown
Merci à tous ceux qui m'ont aidé en résolvant mes problèmes rencontrés :
Passage de valeur par la méthode "connect" Qt
Conversion : QString -> const char
Démonstration :