J'ai rajouté une classe qui "gère" l'application (saisie utilisateur et lancement des actions correspondantes).
J'ai aussi changé l'utilisation de std::vector en std::list, ce qui m'a valu un peu de reflexion sur les itérateurs, mais rien d'insurmontable.
Bonjour,
Je voulais vous montrer mon code pour l'exo "Site Du Zero" de Nanoc :
Main.cpp
<secret>
#include <iostream>
#include <cstdlib>
#include "TutoLib.hpp"
using namespace std;
int main()
{
//L'ensemble des tutos
VosTutos sdz;
//Un Big-Tuto
BigTuto Big("Le C++ pour les nuls"); //Nom : "Le C++ pour les nuls"
MiniTuto Chap1("Les bases", 5); //Nom : "Les bases", Nb de parties : 5
MiniTuto Chap2("Notions Avancées", 6);
MiniTuto Chap3("Index", 10);
Big.AddChapter(Chap1);
Big.AddChapter(Chap2); //On insert les 3 mini-tutos dans le big-tuto
Big.AddChapter(Chap3);
//Mini-Tutos
MiniTuto Mini1("[C++] Les templates", 7);
MiniTuto Mini2("[C++] Les TP concrets", 4);
//Articles
Article Boost("Boost", "www.boost.org"); //Nom : "Boost", Lien : "www.boost.org"
Article SFML("SFML", "www.sfml-dev.org");
//A enlever/modifier si vous n'etes pas sous windows
system("Pause");
cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
//SDZ
sdz.Add(Big); //On ajoute le Big-Tuto grâce à "Add()"
sdz + Mini1; //On ajoute le Mini-Tuto grâce à "+"
sdz + Mini2; //(Juste pour ecrire plus vite )
sdz.Add(Boost);
sdz.Add(SFML);
//Affichage des tutos
sdz.Afficher();
//Suppression des tutos
sdz.Sup(1); // Supprimme le Tuto n°1 (Le BigTuto) grâce à "Sup()"
sdz - 3; // Suppression les 3 derniers tutos (Mini1, Mini2, Boost)
sdz --; //Supprimme le dernier tuto(SFML)
sdz - 100; //Vide les tutos
//A enlever/modifier si vous n'etes pas sous windows
system("Pause");
cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
return 0;
}
</secret>
Tutos.hpp :
<secret>
#ifndef TUTOS_HPP_INCLUDED
#define TUTOS_HPP_INCLUDED
#include <string>
#include <vector>
class Tuto;
class BigTuto;
class MiniTuto;
class Article;
class Tuto
{
public :
Tuto(std::string _name);
virtual ~Tuto()=0;
std::string Name();
virtual void Display();
protected :
void Creation();
void Destruction();
std::string mName;
};
class BigTuto : public Tuto
{
public :
BigTuto(std::string _name);
~BigTuto();
void AddChapter(MiniTuto & _Chap);
void Display();
protected :
std::vector<MiniTuto> mChapter;
};
class MiniTuto : public Tuto
{
public :
MiniTuto(std::string _name, unsigned int _numberOfChap);
~MiniTuto();
void Display();
void DisplayForBigTuto();
protected :
unsigned int mNumberOfChapter;
};
class Article : public Tuto
{
public :
Article(std::string _name, std::string _link);
~Article();
void Display();
protected :
std::string mLink;
};
#endif // TUTOS_HPP_INCLUDED
#include "TutoLib.hpp"
#include <iostream>
VosTutos::VosTutos()
{}
VosTutos::~VosTutos()
{}
void VosTutos::Add(Tuto& tuto)
{
*this + tuto;
}
void VosTutos::operator+(Tuto& tuto)
{
mTutos.push_back(&tuto);
std::cout << "Vos Tutos : Ajout du tuto '" << tuto.Name() << "'" << std::endl;;
}
void VosTutos::Sup(int index)
{
try
{
std::cout << "Le tuto '" << mTutos.at(index-1)->Name() << "' a bien ete supprime" << std::endl;
mTutos.erase(mTutos.begin() + index-1);
}
catch(...)
{
std::cout << "Pas de tuto a cet emplacement" << std::endl;
}
}
void VosTutos::operator-(unsigned int index)
{
if(index > mTutos.size())
index = mTutos.size();
int diff = mTutos.size() - (index);
for(unsigned int i(mTutos.size()); i > diff; --i)
Sup(i);
}
void VosTutos::operator--(int)
{
if(!mTutos.empty())
mTutos.erase(mTutos.end()-1);
}
void VosTutos::Afficher()
{
for(unsigned int j(0); j < mTutos.size(); ++j)
{
std::cout<< j+1 << ") ";
mTutos.at(j)->Display();
}
}
</secret>
Voila, il est facile à utiliser, pas mal de solutions pour une même action (cf. : Supprimmer/Ajouter des tutos)
Je pense rajouter une base de donnée, mais j'ai pas forcement le temps/envie de le faire Alors je verrais.
Toutes critiques sont acceptées et seront prisent en compte
Merci d'avance.
Et merci à Nanoc pour l'exo
Si c'est toujours maintenu ... je vais commencer à participer à ce topic alors
Par contre un petit point que je ne comprend pas dans le topic de présentation.
Dans la section Je souhaite proposer une solution, comment faire ? vous dîtes :
#include <iostream>
#include <cstdlib>
#include <vector>
#include <string>
using namespace std;
// Fonction qui retourne une chaîne d'un même char (passé en second paramètre)
string line(int nbr, char x)
{
string line;
for(int i = 0; i < nbr; i++)
line += x;
return line;
}
// Fonction qui retourne une chaîne d'espaces
string spaces(int nbr)
{
string line;
for(int i = 0; i < nbr; i++)
line += " ";
return line;
}
int main(int argc, char * argv[])
{
// On récupère les arguments de la ligne de commande
vector<string> args;
for(int i = 1; i < argc; i++)
args.push_back(argv[i]);
// On vérifie que seule la chaîne à afficher a été donné
if(args.size() != 1)
return EXIT_FAILURE;
unsigned int maxSizeLine(30);
vector<string> lines;
string sentence(args[0]);
// Découpage des lignes
while(sentence.size() > maxSizeLine)
{
int indice(maxSizeLine - 1);
for(int i = indice; i >= 0; --i)
{
if(sentence[i] == ' ')
{
indice = i;
break;
}
}
lines.push_back(sentence.substr(0, indice));
sentence = sentence.substr(indice);
}
lines.push_back(sentence);
// Affichage de la bulle
if(lines.size() == 1)
{
cout << " " << line(lines[0].size(), '_') << endl;
cout << " < " << lines[0] << " > " << endl;
cout << " " << line(lines[0].size(), '-') << endl;
}
else
{
cout << " " << line(30, '_') << endl;
for(int i = 0; i < lines.size(); i++)
cout << " < " << lines[i] << spaces(29 - lines[i].size()) << "> " << endl;
cout << " " << line(30, '-') << endl;
}
// Affichage de la jolie petite vache !
cout << " ^__^ " << endl;
cout << " (oo)________ " << endl;
cout << " (__) )/ " << endl;
cout << " ||----w | " << endl;
cout << " || || " << endl;
return EXIT_SUCCESS;
}
Le code est surement horrible et le sujet n'est pas fignolé (problème d'espaces au niveau du découpage des lignes par exemple) mais j'ai passé beaucoup de temps sur cet exercice (surement un peu sous-estimé le sujet).
Désolé de rendre un tel code mais je n'ai plus le temps de le continuer donc j'ai quand même décidé de le poster ici.
On n'a pas dit que les solutions devaient être parfaites
Par contre, si tu veux améliorer ton code, je t'en prie ! (le bouton edit est très pratique !)
Et un cas d'échec (en considérant une longueur maximale de ligne de 10) : cowsay "aaaaaa aaaaaa aaaaaa aaaaaa" (l'affichage pourrait être réduit en largeur).
Ah, et une dernière : tu définis maxSizeLine, mais ne l'utilises pas partout ... ?
Je sais vraiment pas si vous devriez vraiment mettre ce code en référence ^^"
Il ne coupe pas au bonne endroit, il ne récupère qu'un argument du main, il n'y a aucune option de gérer, le cadre est totalement différent, la vache est également différente, ...
Bref, vous faites ce que vous voulez ... Après, je suis peut-être un peu dur ...
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles- ♡ Copying is an act of love.
Hello les zeros
Il y a peux j'ai codé un démineur car je me fessait grave chi*r, et je voulais un peu comparé les codes sachant que je code toujours avec un code clair et simple donc histoire de trouver un peu plus optimisé
Donc je propose dans la catégorie jeu, le célèbre démineur.
L’exercice va se divisé en 3 partie (car moi il m'en a fallut 3 )
Création du plateau de jeu
Les fonction de jeu (creuser et drapeau)
Le creusage automatique
Création du plateau de jeu
A cette étape; il vous faudra créer un tableau (réelle, en prog c'est vous qui voyez ) qui va contenir les mines. Il existe différente version avec des propriété différente, pour ma part le mien est en 9x9 avec 10mines.
Je vous conseil de "cacher" les mines après avoir vérifier que toutes les mines sont la.
Les fonction de jeu (creuser et drapeau)
Ici il vous faudra créer une fonction qui permettra de dévoile une case, si elle est vide le jeu continue, sinon boom échec
A chaque case vide il faut indiquez combien de mines se situe autour de cette case, sinon le jeu serait impossible
Vous inclurez également les drapeau qui signale une mines que vous connaissez (attention, si vous essayer de creuser sur un drapeau sa ne doit pas marcher )
Vous pouvez ajouté la fonction qui met un "?" mais personnellement je ne l'utilise jamais donc je ne l'ai pas inclut.
A cette partie faite une petite interface qui demande quelle action faire puis a quelle case.
Le creusage automatique
La partie qui m'a pris le plus de temps
Alors là vous devez codé une fonction (c'est un conseil ) qui va, si vous creuser une case vide, va creuser toute les case vide autours et les case numéroté (seulement a la découverte des cases numéroté, la fonction ne creuse pas d’avantage). En résumé de mon charabia, la fonction creuse les case vide et les premières cases numérotée jusqu’à formé un troue bordé par des chiffres
Pour ceux qui ne comprennent pas, voila un exemple, je n'ai cliqué qu'une fois :
ATTENTION ici case vide != case sans mine !!!!! Une case vide est une case ne contenant pas de numéro, mine, drapeau, etc.... C'est le vide total ceci n'est évidement pas valable pour la deuxième partie
Petit conseil (si vous n'y arriver pas, tricher pas ok ):
Cette fonction doit être récursive ou du moins c'est surement ce qu'il y a de plus simple
Je poste un exo qui requiert Qt, cet exo sert à s'entraîner avec les boîtes de dialogues usuelles, les boutons, les liens, les SIGNAL/SLOT ainsi que les if-else if-else.
Jongler avec les boîtes de dialogues
Cet exercice requiert de savoir
-Afficher une boîte de dialogue de n'importe quel type
-Créer ses propres signaux et slots
-Faire un bouton
-Créer un lien
Il faut afficher successivement plusieurs boîtes de dialogue de différents types (information, question...) afin de permettre à l'utilisateur de cliquer sur des liens HTML. Bref, il faut s'amuser avec les liens et les conditions tout en maîtrisant l'affichage des boîtes de dialogues.
Attention: quelques connaissances en HTML sont néanmoins nécessaires !
Bonne chance !
Merci de me contacter pour des précisions
Solution
S'il vous plaît, ne trichez pas !
J'ai conscience que c'est sur le même post, mais faîtes quand même mon exercice
//MaFenetre.h
#ifndef DEF_MAFENETRE
#define DEF_MAFENETRE
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QMessageBox>
class MaFenetre : public QWidget
{
Q_OBJECT
public:
MaFenetre();
public slots:
void ouvrirDialogue();
void mail();
private:
QPushButton *m_boutonDialogue;
QPushButton *m_mail;
};
#endif
//MaFenetre.cpp
#include "MaFenetre.h"
MaFenetre::MaFenetre() : QWidget()
{
setFixedSize(345, 190);
m_boutonDialogue = new QPushButton("Ouvrir la boîte de dialogue", this);
m_boutonDialogue->move(40, 50);
m_boutonDialogue->setFont(QFont("Vivaldi", 24));
m_mail = new QPushButton("M'envoyer un mail", this);
m_mail->move(40, 115);
m_mail->setFont(QFont("Vivaldi", 24));
QObject::connect(m_boutonDialogue, SIGNAL(clicked()), this, SLOT(ouvrirDialogue()));
QObject::connect(m_mail, SIGNAL(clicked()), this, SLOT(mail()));
}
void MaFenetre::mail()
{
QMessageBox::warning(this, "Programmeur", "Merci de ne pas m'envoyer d'e-mails intempestifs. Mon adresse: <strong><i>samuel.joshua1@free.fr</i></strong>.");
}
void MaFenetre::ouvrirDialogue()
{
QMessageBox::warning(this, "Site du Zéro", "Attention ! Vous allez ouvrir une boîte de dialogue réservée aux Zéros <strong> uniquement </strong>");
int reponse = QMessageBox::question(this, "Interrogatoire", "Etes-vous un Zéro ?", QMessageBox::Yes|QMessageBox::No);
if (reponse == QMessageBox::Yes)
{
QMessageBox::information(this, "Site du Zéro", "Adresse du site: <a href='http://www.siteduzero.com'>Site du Zéro </a>");
int mail = QMessageBox::question(this, "Programmeur", "Bluffant hein ? Ca vous tenterait d'écrire un mail au geek qui a fait ce programme tout simplement <i> génial </i> ?", QMessageBox::Yes|QMessageBox::No);
if (mail == QMessageBox::Yes)
{
QMessageBox::information(this, "Programmeur", "Ahhh ! Je me doutais bien que vous voudriez m'envoyez un mail !!!");
int mailEncore = QMessageBox::question(this, "Programmeur", "Êtes-vous certain de vouloir m'envoyer un mail ??? Vous ne pourrez pas revenir en arrière ! Enfin si, mais bon.", QMessageBox::Yes|QMessageBox::No);
if (mailEncore == QMessageBox::Yes)
{
QMessageBox::information(this, "Programmeur", "Mon adresse e-mail: <strong><i>samuel.joshua1@free.fr</i></strong>.");
}
}
else
{
QMessageBox::critical(this, "Programmeur", "Grrr ! Essayez de faire pareil, <font color=brown><strong>minable</strong></font> !");
}
}
else if (reponse == QMessageBox::No)
{
QMessageBox::critical(this, "Site du Zéro", "<strong> ACCES <font color = red> REFUSE </font> </strong>");
}
}
//main.cpp
#include <QtGui>
#include "MaFenetre.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QString locale = QLocale::system().name().section('_', 0, 0);
QTranslator translator;
translator.load(QString("qt_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&translator);
MaFenetre fenetre;
fenetre.show();
return app.exec();
}
//Qt.pro
HEADERS += \
MaFenetre.h
SOURCES += \
MaFenetre.cpp \
main.cpp
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Cours de C++ moderne
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.