Je pense que c'est une bonne idée
Mais je pense qu'il faudra équilibrer avec les autres catégories : pas plus de 4-5 exercices dans cette section Car je pense que les propositions d'exercices sera plutôt énorme
Ok merci.
__________________________________________________________________________________
__________________________________________________________________________________
Correction de l'exercice: Température de processeur
Apparemment, mon programme a du mal avec les vieux processeurs, mais marche très bien sur les gammes i3, i5 et i7.
Si vous n'êtes pas arrivé a faire le programme, regardez rapidement sur la correction le bout de programme que vous n'avez pas compris puis réessayez, ainsi de suite...
J'aimerai aussi savoir si le programme tourne sur linux.
Voici sans plus attendre la correction:
Fichier cpp
main.cpp
Il n'y avait que un fichier cpp a mettre dans le projet.
Cette source est l'un des points de départ que j'ai créé pour lire les informations bas niveau du processeur. La source a été testée et validé sur un certains nombres de processeur, au minimum je garanti sur Core 2 + Phenom.
Ce projet est assez vieux (tout comme la lecture de la fréquence processeur), il utilise lui aussi WinRing0 + MSR pour lire une information nommée "Tj" qui est un indicateur fournit par le processeur indiquant la distance entre 100° (ou 75° suivant les processeurs) et sa température actuelle.
Par exemple, on peut obtenir -59°, ce qui indique que le processeur se trouve actuellement à 100 - 59, soit 41°.
Si mes souvenirs sont bon, Tj est apparut sur les premiers Intel Core, et l'équivalent AMD, il est encore d'actualité sur les derniers Core 7/Atom.
Techniquement, ce système est la base utilisé par des programmes comme Real Temp ou CoreTemp.
Précédemment sur ce topic, j'ai proposé un exercice portant sur la création d'un logiciel permettant de calculer la moyenne d'une série de nombre et plus particulièrement pour des notes. Je propose ce mois ci sur mon site le même exercice un peu amélioré et une correction en 4 partie qui apparaîtront au fil du mois.
Cette correction est en C++ et en diaporama sur Google Document et la première partie est publié et elle porte surtout sur les pré-requis. Voici la suite :
Après il y aura un diapo sur comment calculer la moyenne d'une série de notes classé par matières (on calcule d'abord chaque moyenne de chaque matière puis on fait la moyenne de toute les maatières.
Après, on met un coefficient pour les notes.
Après, on met un coefficient pour les matières.
Cela fait en tout une cinquantaine de diapo avec toute la progression détaillé.
Un petit exercice supplémentaire que j'ai eu à faire pour mes cours en Java. Mais en C++ c'est pareil ou n'importe quelle langage. Pour ma part, il fallut que je le fasse d'abord avec Algobox : c'était comique et plus dur qu'avec Eclipse mais bon...
C'est un convertisseur.
But du jeu :
On rentre un nombre binaire, décimal ou hexadécimal et il faut convertir le nombre dans les deux autre types. Et bien sûr sans utiliser les fonctions toutes faîtes mais en utilisant que les types de variables de base... Essayez d'abord avec les nombres entiers positifs puis négatifs puis décimaux...
Pour ceux qui ont du temps à perdre comme moi, je propose de tenter de coder un jeu de bataille navale
------------------------
Bataille navale
------------------------
Generation d'une grille pour l'utilisateur...
Generation terminee !
Appuyez sur entree pour commencer...
Vous jouez - Entrez une coordonnee (LETTRECHIFFRE)
A3
L'ordinateur : Dans l'eau !
L'ordinateur joue : D5
Vous : Dans l'eau !
Vous jouez - Entrez une coordonnee (LETTRECHIFFRE)
_
Voici au moins à ce quoi il faudra penser :
La bataille navale se compose normalement de :
-1 porte-avion (5 cases)
-1 croiseur (4 cases)
-1 contre-torpilleur (3 cases)
-1 torpilleur (2 cases)
-1 sous-marin (1 case)
Lorsqu'on touche, on rejoue.
Respecter la règle des coordonnées de la bataille navale : Une lettre et un chiffre.
Créer une grille pour les deux joueurs : L'utilisateur et l'ordinateur
Les navires entièrement détruits envoient "coulé !".
Le jeu demande à l'utilisateur une taille pour le tableau supérieure à 5 cases (1 porte-avion), de plus, il ne peut pas excéder 26 cases (L'alphabet, en fait), puisque l'une des coordonnées est une lettre.
Les navires sont placés aléatoirement, et ne doivent pas sortir de la grille.
Le jeu s'arrête lorsque tous les navires d'un joueur ont été détruits.
L'ordinateur n'est pas (si) stupide, faites en sorte que lorsqu'il touche un bâtiment, il ait l'intelligence de faire un coup à proximité.
Pour vous aider, voici une floppée d'indices pour mener à bien cette tâche inutile :
Indice 1 :
Il faudra commencer par créer la grille !
pour cela, on peut très bien se contenter d'un tableau de int :
bool grilleDeMonOrdi[10][10];
Pourquoi des bool ? Parce que c'est plus simple de s'en servir et ils ne prennent que deux valeurs : true ou false. Dans notre situation, une case du tableau sera true si elle est une partie d'un navire.
Indice 2 :
Comme vous le voyez sur mon exemple plus haut, on entre deux coordonnées...mais l'un est en lettres !
Il vous faudra donc ruser et créer un second tableau qui sera utilisé pour comparer les lettres :
char monTableau[26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//Un tableau de char est une chaîne de caractères !
Et pour tester la lettre, on fera une boucle :
string choix("A5"); //Les coordonnées entrées par l'utilisateur
int position1(-1); //L'axe x qu'il faudra tester - Cette valeur nous dira si le caractère récupéré n'est pas une lettre
for (int i = 0; i < monTableau.size(); i++)
{
if (choix[0] == monTableau[i]) //Rappel : Un tableau commence par 0 et string est (presque) un tableau de char
{
position1 = i; //On récupère la valeur de la lettre entrée
break;
}
}
//En sortant de la boucle, position1 a deux valeurs possibles : Soit celle de la case du tableau, soit -1, qui signifie que la lettre n'a pas été trouvée
if (position1 == -1)
{
cout << "Erreur - Coordonnee invalide"
}
Indice 3 :
Vous avez lu l'indice 2 ? Parce que j'ai volontairement omis quelques détails...
Vous ne voyez pas...?
...
Le tableau est sensible à la casse !
Sensible à la casse signifie que pour l'ordinateur, 'A' et 'a', c'est pas la même chose !
Pour régler ce petit problème, il vous faudra l'en-tête suivant :
#include <cctype>
Et rajouter ceci dans notre petite boucle de l'indice 2 :
#include <cctype> //On n'oublie pas !!!
#include <string> //Puisqu'on est dans les #include, autant tous les mettre.
using namespace std; //Idem.
string choix("a5"); //Les coordonnées entrées par l'utilisateur
int position1(0); //L'axe x qu'il faudra tester
choix[0] = toupper(choix[0]); //Rend le premier élément du tableau majuscule
for (int i = 0; i < monTableau.size(); i++)
{
if (choix[0] == monTableau[i])
{
position1 = i; //On récupère la valeur de la lettre entrée
break;
}
}
Indice 4 :
Ici, on va s'attaquer à l'aléatoire !
Bon, je vais pas vous donner la solution, je vais juste vous montrer comment on s'en sert :
#include <cstdlib> //Important !!!
#include <ctime> //Important aussi !!!
using namespace std;
srand(time(0));
int const tailleTableau(12); //Bon, on veut un nombre aléatoire pour un tableau de cette taille
int nombreAleatoire = rand() % tailleTableau;
Et voilà ! srand(time(0)) "initialise" notre futur nombre aléatoire, et rand() % tailleTableau nous renvoie ce nombre aléatoire compris entre 0 et tailleTableau.
Indice 5 :
Voici quelques conseils en pagaille :
Faites attention de ne pas chercher une valeur du tableau qui n'existe pas ! Pour ça, testez ce que rentre l'utilisateur !
Les navires sont des objets, rappelez-vous en ! Vous verrez que pour le conseil suivant, vérifier les différentes parties de l'objet sera plus facile que de le faire à l'arrache dans une énorme fonction.
Pour créer cette pseudo-intelligence artificielle qui va tirer à proximité d'un "touché", il faudra que votre ordinateur fasse littéralement "coordonnée précédente +1 case vers une autre direction", et si ce coup est "dans l'eau", changer de direction. Une fois que le navire est coulé (on vérifie toute ses parties par une méthode), l'ordinateur se remettra à tirer aléatoirement.
N'hésitez pas à créer un tableau dynamique (ou un tableau statique de la même taille que la grille)qui contiendra toutes les coordonnées déjà essayées par l'ordinateur et l'utilisateur, afin que les deux évitent de refaire les mêmes coordonnées en boucle (surtout l'ordinateur : Il n'est pas très...intelligent).
Pour ceux qui veulent aller plus loin...
Si vous ne trouvez pas le défi suffisamment gourmand, je vous propose une liste de plus à votre bataille navale :
Faites en sorte que la console affiche la grille de l'utilisateur et la grille de l'ordinateur qu'on a déjà essayé (rentré les coordonnées). La grille de l'utilisateur affiche l'état des bâtiments, la grille et les coordonnées, celle de l'ordinateur juste la grille, les coordonnées et les bâtiments touchés.
Exemple :
Votre grille :
A B C D E F G H I
1[ ][ ][ ][ ][ ][ ][ ][x][ ]
2[o][ ][ ][o][ ][ ][ ][x][ ]
3[o][ ][ ][o][ ][ ][ ][ ][ ]
4[x][ ][ ][o][ ][ ][ ][ ][ ]
5[ ][ ][ ][ ][ ][ ][ ][ ][ ]
6[ ][ ][ ][ ][ ][ ][ ][ ][ ]
7[ ][ ][ ][o][o][o][o][ ][ ]
8[ ][ ][ ][ ][ ][ ][ ][ ][ ]
9[x][x][x][x][x][ ][ ][ ][ ]
Nombre de batiments : 5
Nombre de batiments detruits : 2
Nombre de x : 8
Nombre de o : 9
Score actuel : 6 contre 8
Comme vous pouvez le voir, n'hésitez pas à afficher des informations utiles en dessous !
Ensuite, essayez de dépasser cette limite de 26 cases en créant un système qui va séparer toutes les lettres et tous les chiffres : Par exemple, la colonne numéro 27 aura pour coordonnée AA et la ligne 87 (je suis fou !), ben 87.
Vu qu'on va dépasser cette limite de 26 cases, la grille va légèrement être décalée par rapport à sa numérotation : Trouvez un moyen de contourner ce pépin.
Exemple concret pour un tableau à 26+26+26 cases (3 lettres comme coordonnées maximum) :
La console n'est pas élastique, si vous en faites trop, la console ne va pas pouvoir afficher l'intégralité du tableau et fera un "vieux" retour à la ligne, pour cela, trouvez un moyen de tronquer le tableau en plusieurs bouts affichables correctement dans cette antiquité.
Soyez encore plus fou : Autorisez le déplacement des navire !
Créez un système de gestion entièrement en console qui vous permettra de sélectionner un navire et de le faire bouger dans une direction !
En contrepartie, l'ordinateur en face peut faire de même, c'est pourquoi il faudra créer une autre intelligence artificielle capable de sélectionner et déplacer un navire en mauvaise posture.
Faites attention à ne pas sortir de la grille, pour cela, je propose que lorsque le navire "sors" dans un bord, il réapparaisse sur la ligne suivante, enfin, innovez.
Bien sûr, il n'est pas possible de déplacer des navires détruits, ou même, rajoutez une option qui fait que si votre navire est détruit à plus de 50%, il est dans l'incapacité de se déplacer !
Complexifiez encore plus, on peut aller plus loin : Lorsque qu'un navire bouge, il est détecté par les radars de l'ennemi : Vous (ou l'ordinateur) recevez un intervalle de tir dans lequel un bateau est susceptible de se trouver.
Le bout de la bataille navale, c'est de créer tout simplement le jeu concret : Une grille et des navires qui s'affrontent...dans la console...C'est bizzare mais faisable pourtant, il faut juste avoir beaucoup de temps à perdre.
A propos de ces "objets"...
Cette partie est réservée à ceux qui ne voient pas pourquoi je parle d'objets.
On parle d'objets parce qu'un navire, c'est plusieurs éléments susceptibles de changer durant la partie. Ces éléments ont deux coordonnées : l'axe x et l'axe y dans le tableau. Ce sont les attributs.
Pour voir si le navire a coulé, on a juste à voir si tous les éléments du navire sont détruits.
Pour déplacer le navire, il suffit d'ajouter ou de soustraire le même nombre aux attributs.
Pour récupérer un intervalle, il suffit de faire une moyenne sur une marge d'erreur avec les attributs.
Au final, j'ai déjà écrit trois méthodes grossières.
A vous de faire le reste !
Le mot de la fin
Je mettrais à jour ce message selon ce qui me viendra à l'esprit, puis je posterais une solution de l'exercice lorsque j'aurais réussi moi-même à le faire, soit dans...longtemps
Pas mal... ça change un peu, un vrai exercice.
Mais juste un truc, pour répondre aux indices 2 et 3 :
Plutôt que de faire un gros tableau, et de tout tester (d'ailleurs, tu devrais plutôt remplir ton tableau avec une chaîne de caractères : chartableau[27]="abcdefghijklmnopqrstuvwxyz";. Enfin, c'est à mon avis plus propre. D'ailleurs, si tu commences les indices à 1 (cf ton remplissage) il faut rester cohérent, rajouter une case au tableau pour que tout tienne, et adapter ta boucle)
Tu pourrais partir du postulat que, sur la très grande majorité des ordis, 'b'='a'+1, etc.
Du coup, on a la correspondance :
int toNumber(char c) // 'a' = 0. Rajouter 1 si on veut (mauvaise idée à mon avis)
{
if ('a' <= c && c <= 'z')
return c - 'a';
if ('A' <= c && c <= 'Z')
return c - 'A';
// Erreur : c n'est pas une lettre
}
char toLetter(int n)
{
if (0 <= n && n < 26)
return n + 'A';
// Erreur : n n'est pas représentable par une lettre.
}
C'est plus simple, plus compréhensible, plus rapide, moins bogué, et ça marche presque partout (les personnes ayant un ordi pour lequel ça ne marche pas en sont totalement au courant, en plus d'être rarissimes)
Pas mal... ça change un peu, un vrai exercice.
Mais juste un truc, pour répondre aux indices 2 et 3 :
Plutôt que de faire un gros tableau, et de tout tester (d'ailleurs, tu devrais plutôt remplir ton tableau avec une chaîne de caractères : chartableau[27]="abcdefghijklmnopqrstuvwxyz";. Enfin, c'est à mon avis plus propre. D'ailleurs, si tu commences les indices à 1 (cf ton remplissage) il faut rester cohérent, rajouter une case au tableau pour que tout tienne, et adapter ta boucle)
Tu pourrais partir du postulat que, sur la très grande majorité des ordis, 'b'='a'+1, etc.
Du coup, on a la correspondance :
int toNumber(char c) // 'a' = 0. Rajouter 1 si on veut (mauvaise idée à mon avis)
{
if ('a' <= c && c <= 'z')
return c - 'a';
if ('A' <= c && c <= 'Z')
return c - 'A';
// Erreur : c n'est pas une lettre
}
char toLetter(int n)
{
if (0 <= n && n < 26)
return n + 'A';
// Erreur : n n'est pas représentable par une lettre.
}
C'est plus simple, plus compréhensible, plus rapide, moins bogué, et ça marche presque partout (les personnes ayant un ordi pour lequel ça ne marche pas en sont totalement au courant, en plus d'être rarissimes)
A chaque fois je me fais avoir et j'oublie que les tableaux de char sont des chaînes de caractère
Je corrige !
EDIT : J'ai pas tout pigé, si ce n'est que non, je ne commence pas par l'indice 1, je teste bêtement la lettre au tableau, avec un for, C'est clair, rapide, précis, et on sort de la boucle si la lettre n'est pas trouvée. J'y pense, je n'ai pas mis la gestion de cette erreur
D'accord, si tu ne veux pas aborder ça, c'est un choix...
C'est souvent pratique de supposer que les lettres entre 'a' et 'z' se suivent. Mais vu que c'est pas très clair, et pas toujours vrai, je ne peux pas te le reprocher.
Par contre :
monTableau est un tableau normal, tu ne peux pas faire "monTableau.size()"... Il faut mettre un chiffre "en dur", ou alors un #define.
Et puis, pour l'indice 3, j'aurais simplement dit qu'il faut faire un toupper(), c'est plus concis, et ça évite les erreurs de copier-collé (tu n'as pas implémenté ta gestion d'erreurs dans l'indice 3.
Pour l'indice 4, je préciserai aussi qu'il ne faut initialiser l'aléatoire qu'une seule fois, au début du main par exemple. On ne le répète jamais assez. Au pire, mets un lien vers le (très bon) tuto SDZ sur le sujet...
Il me semble que certains des exercices que j'ai trouvé (dans les derniers) n'étaient pas sur le 1e post, mais comme je les ai trouvé intéressants je les ai ajoutés également à la liste.
PS : je n'ai pas pris de liens pour les corrections, mais en cherchant un peu les visiteurs devraient en trouver une ou 2 après le sujet d'exo
voila je suis totalement débutant dans le monde la programmation et j'aimerai savoir ce que vos penser de ma version de biblio++ , histoire d'amélioré tout ça, a savoir qu'a l'heur ou je écris ici ne j en suis qu'a "Programmez avec le langage C partis 2 fins de " l'héritage" début " polymorphisme" et j'ai vaguement survolé le chapitre qui parle de QT et attention aux fautes dsl je sais sa pique les yeux : s
comme vous pouvez le voir j'ai pour projet de l'adapterà mes besoin gestion K7 vidéoDVDetc
main.h
#include <iostream>
#include <fstream>
#include "menuConsole.h"
using namespace std;
int main(int argc, char *argv[])
{
ofstream fluxLogMenu("log.txt");
fluxLogMenu<<"lancement de biblio++"<<endl;
;
cout<<"bienvenue dans biblio++ gestion de mediatheque"<<endl<<endl<<endl;
MenuConsol Menu1;
Menu1.MenuPrincipal();
fluxLogMenu<<"fermeture de biblio++"<<endl;
return 0 ;
}
menuConsole.h
include <string>
#include "livre.h"
class MenuConsol
{
public:
MenuConsol();
void MenuPrincipal();
void MenuLivre();
private:
int ID,IDmembre;
int choixMenuPrincipal,choixMenuLivre,choixMenuDvd,choixMenuJeux,choixMenuK7;
std::string fichierLivre,fichierDvd;
std::string fichierJeux,fichierK7;
std::string titre,auteur,genre;
std::string nom, prenom;
LivreList *Livre =NULLL;
};
#endif
int i(1); do{ cout<<"quel voulez vous faire ?"<<endl<<endl<<endl<<"1:Afficher d'un livre"<<endl<<"2:Ajouter un livre"<<endl<<"3:Supprimer un livre"<<endl<<"4:Modifier les données d'un livre"<<endl<<"5:afficher la Biliotheque"<<endl; cout<<"6:ajouter un membre"<<endl<<"7:Afficher la liste des livres empruntés par un membre"<<endl<<"8:enprunter"<<endl<<"9:rendre"<<endl<<"0:retour au menu principal"<<endl<<endl; cin>>choixMenuLivre;
if(choixMenuLivre == 1) {// affiche livre cout<<"taper l'ID du livre a afficher"<<endl; cin>>ID; Livre->LireFichier(); Livre->afficherObjet(ID); }
if(choixMenuLivre == 2) {// ajoute livre cout<<endl<<"vous avez choisis d ajouter un livre"<<endl<<"enter le nom du livre"<<endl; cin>>titre; cout<<"enter le nom de l auteur"<<endl; cin>>auteur; cout<<"enter le genre du livre"<<endl; cin>>genre; Livre->LireFichier(); Livre->ajouteObjet(titre,auteur,genre); }
if(choixMenuLivre == 4) { //modifier les donne livre cout<<"taper l'ID du livre a modifier"<<endl; cin>>ID; Livre->LireFichier(); Livre->modifierObjet(ID); Livre->saveListe(); }
if(choixMenuLivre == 5) { //afficher media Livre->LireFichier(); Livre->afficheListObjet(); }
if(choixMenuLivre == 6) {// ajoute un membre cout<<endl<<"vous avez choisis d ajouter du nouveau Membre"<<endl; cout<<"enter le nom du nouveau Membre"<<endl; cin>>nom; cout<<"enter le prenom du nouveau Membre"<<endl; cin>>prenom; Livre->Membre->LireFichierMembre(); Livre->Membre->ajouteMembre(nom,prenom); }
if(choixMenuLivre ==7) {// affiche la liste des objet enpruinter par menbre
cout<<endl<<"vous avez choisis d afficher la liste des objet louer par ce Membre"<<endl; cout<<"enter l'ID du Membre"<<endl; cin>>IDmembre; Livre->LireFichier(); Livre->Membre->LireFichierMembre(); Livre->afficheObjetEmprunter(IDmembre); }
#include <iostream>
#include <fstream>
#include <string>
#include "objet.h"
#include "menuConsole.h"
using namespace std;
ObjetList::ObjetList()
{
}
ObjetList::ObjetList(string fichier)
{
nomObjet= ("objet");
log ="log.txt";
espace = " ";
fluxLog.open(log.c_str(),ios_base::app);
fluxEcrire.open(fichier.c_str(),ios_base::app);
nomDuFichier = fichier;
}
void ObjetList::LireFichier()
{
fluxLog<<"lancement de la fonction 'lireLivre'"<<endl;
///////////////////////////////////////////
int taillelistLivre;
taillelistLivre=ListLivre.size();
fluxLire.open(nomDuFichier.c_str(),ios::in);
while(taillelistLivre>=1)
{
fluxLog<<"supprime les case des vector"<<endl;
IDList.resize(0);
ListLivre.resize(0);
IenpruntList.resize(0);
IDLoueur.resize(0);
taillelistLivre=ListLivre.size();
}
while(getline(fluxLire, TMPfichierLus))// compteur
{
m_IDLus=0,Ienprunte=0,m_IDloueurLus=0;
fluxLire>>Ienprunte>>m_IDLus>>chaine1>>chaine2>>chaine3>>m_IDloueurLus;
TMPfichierLus=espace+chaine1+espace+chaine2+espace+chaine3;
IDList.push_back(m_IDLus);
ListLivre.push_back(TMPfichierLus);
IenpruntList.push_back(Ienprunte);
IDLoueur.push_back(m_IDloueurLus);
}
IDList.pop_back();//je n est pas sus faire autrement sans
ListLivre.pop_back();
IenpruntList.pop_back();//quoi il y a une case de trop
IDLoueur.pop_back();
fluxLire.close();
/////////////////////////////////
fluxLog<<"fin de la fonction 'LireLivre'"<<endl;
}
void ObjetList::ajouteObjet(string titre, string auteur, string genre)
{
int i(0),newID(0);
i= IDList.size();// taille du tableau donne une variable a i car la taille est un chiffre
newID =1+IDList[i];
fluxLog<<"lancement de la fonction 'ajouteLivre'"<<endl;
Ienprunte=0;
fluxEcrire<<Ienprunte<<" "<<newID<<" "<<titre<<" "<<auteur<<" "<<genre<<" "<<"0000"<<endl;
cout<<"un "<<nomObjet<<"a ete ajouter a la mediatheque avec l'ID"<<newID<<endl;
fluxLog<<"fin de la fonction 'ajouteLivre'"<<endl;
}
int ObjetList::rechercheObjet(int IDrechercher)
{
fluxLog<<"lancement de la fonction 'rechercheObjet'"<<endl;
int resultat(0);
int IDLus;
int i(0);
for(i=0;IDLus!=IDrechercher;i++)
{
IDLus=IDList[i];
}
resultat= 1-i;
return resultat;
fluxLog<<"fin de la fonction 'rechercheObjet'"<<endl;
}
void ObjetList::deleteObjet(int ID)
{
fluxLog<<"lancement de la fonction 'deleteLivre'"<<endl;
int i=0;
int tmpID;
int tailleIDlist;
tailleIDlist=IDList.size();
ofstream fluxSave(nomDuFichier.c_str(),ios::trunc);
fluxSave<<"1000//////////// "<<nomObjet<<" //////////////////"<<endl;
while(i <tailleIDlist)
{
tmpID=IDList[i];
if(tmpID == ID)
{
i++;
cout<<"le "<<nomObjet<<" rechercher a ete trouver et effacer"<<endl;
}
else
{
fluxSave<<IenpruntList[i]<<espace<<IDList[i]<<espace<<ListLivre[i]<<espace<<IDLoueur[i]<<endl;
i++;
}
}
fluxSave.close();
fluxLog<<"fin de la fonction 'deleteLivre'"<<endl;
}
void ObjetList::afficheListObjet()
{
fluxLog<<"lancement de la fonction 'afficheListLivre'"<<endl;
int taillelistLivre;
taillelistLivre= ListLivre.size();
cout<<"voici la liste des "<<nomObjet<<endl<<" il y a "<<taillelistLivre<<espace<<nomObjet<<endl;;
for(int i=0; i <taillelistLivre;i++)
{
cout<<IDList[i]<<espace<<ListLivre[i]<<endl;
}
fluxLog<<"fin de la fonction 'afficheListLivre'"<<endl;
}
void ObjetList::afficherObjet(int ID)
{
fluxLog<<"lancement de la fonction 'afficheLivre'"<<endl;
int i(0);
i= rechercheObjet(ID);
cout<<"le "<<nomObjet<<" demander est :"<<endl;
cout<<IDList[i]<<espace<<ListLivre[i]<<endl<<endl<<endl;
fluxLog<<"fin de la fonction 'afficheLivre'"<<endl;
}
void ObjetList::afficheObjetEmprunter(int IDmembreRechercher)
{
fluxLog<<"lancement de la fonction 'afficheObjetEmprunter'"<<endl;
/**recherche dans la liste des objet si l ID du loueur egale a L id demander**/
int IDLus(0);
int i(0),j(0);
int tailleMax = ListLivre.size();
for(i=0;i<tailleMax;i++)
{
IDLus=IDLoueur[i];
if(IDLus==IDmembreRechercher)
{
j++;
cout<<ListLivre[i]<<" est enprunter par "<<Membre->getMembreLoueur(IDmembreRechercher)<<endl;
}
}
if(j == 0)
{
cout<<"cette personne n'a pas louer de "<<nomObjet<<endl;
}
fluxLog<<"fin de la fonction 'afficheObjetEmprunter'"<<endl;
}
void ObjetList::modifierObjet(int ID)
{
fluxLog<<"lancement de la fonction 'modifierLivre'"<<endl;
int i(0);
i=rechercheObjet(ID);
string TmpTitre,TmpAuteur,TmpGenre;
cout<<endl<<"vous avez choisis de mofichier un "<<nomObjet<<endl;
cout<<"enter le nom du "<<nomObjet<<endl;
cin>>TmpTitre;
cout<<"enter le nom de l auteur du "<<nomObjet<<endl;
cin>>TmpAuteur;
cout<<"enter le genre du "<<nomObjet<<endl;
cin>>TmpGenre;
ListLivre[i] = TmpTitre+ espace + TmpAuteur + espace + TmpGenre;// dans un tableau des strung
fluxLog<<"fin de la fonction 'modifierList'"<<endl;
}
void ObjetList::saveListe()
{
fluxLog<<"lancement de la fonction 'SaveListe'"<<endl;
int i=0;
int tailleIDlist;
tailleIDlist=IDList.size();
fluxSave.open(nomDuFichier.c_str(),ios::trunc);
fluxSave<<"0 1000//////////// "<<nomObjet<<" //////////////////"<<endl;
while(i <tailleIDlist)
{
fluxSave<<IenpruntList[i]<<espace<<IDList[i]<<espace<<ListLivre[i]<<espace<<IDLoueur[i]<<endl;
i++;
}
fluxSave.close();
fluxLog<<"fin de la fonction 'saveListe'"<<endl;
}
void ObjetList::enprunterObjet(int IDMembre,int IDObjet)
{
fluxLog<<"lancement de la fonction 'enprunterObjet'"<<endl;
/** regarde dans la list des objet si enprunter si oui arreter fonction et le dire
sinon changer l'IenprunterList et et changer l'IDlouer**/
int i(0);
string result = Membre->getMembreLoueur(IDMembre);
i = rechercheObjet(IDObjet);
cout<<rechercheObjet(IDObjet)<< i<<IenpruntList[i]<<ListLivre[i]<<endl;
if(IenpruntList[i]==0)
{
IenpruntList[i] = 1 ;
IDLoueur[i] = IDMembre;
cout<< "ce "<<nomObjet<<" vien d etre enprunter par "<<result<<endl<<endl;
}
else(IenpruntList[i]==1);
{
cout<<"non cette objet et deja enprunter par"<<IDLoueur[i]<<endl<<endl;
}
fluxLog<<"fin de la fonction 'enprunterObjet'"<<endl;
}
void ObjetList::rendreObjet(int IDMembre,int IDObjet)
{
fluxLog<<"lancement de la fonction 'rendreObjet'"<<endl;
int i(0);
string result =Membre->getMembreLoueur(IDMembre);
i = rechercheObjet(IDObjet);
cout<<rechercheObjet(IDObjet)<< i<<IenpruntList[i]<<ListLivre[i]<<endl;
if(IDLoueur[i]!=IDMembre)
{
cout<<"cette personne("<<result<<")n'a pas louer ce"<<nomObjet<<endl;
}
if(IDLoueur[i]==IDMembre)
{
if(IenpruntList[i]==1)
{
IenpruntList[i] = 0 ;
IDLoueur[i] = 0000;
cout<< "ce "<<nomObjet<<" vien d etre rendu par "<<result<<endl<<endl;
}
else(IenpruntList[i]==0);
{
cout<<"non cette objet et n est pas enprunter"<<endl<<endl;
}
}
fluxLog<<"fin de la fonction 'rendreObjet'"<<endl;
}
#include <iostream>
#include <fstream>
#include <string>
#include "membre.h"
using namespace std;
MembreList::MembreList()
{
nomObjet= "MembreList";
fluxEcrireMembre.open("data/listmembre.biblio",ios::app);
fluxLog.open("log.txt,ios_base::app");
}
void MembreList::LireFichierMembre()
{
fluxLog<<"lancement de la fonction 'LireFichierMembre'"<<endl;
///////////////////////////////////////////
int taillelistMembre;
taillelistMembre=ListMembre.size();
fluxLireMembre.open("data/listmembre.biblio",ios::in);
while(taillelistMembre>=1)
{
fluxLog<<"supprime les case des vector"<<endl;
IDListMembre.resize(0);
ListMembre.resize(0);
taillelistMembre=ListMembre.size();
}
string espace(" ");
while(getline(fluxLireMembre, TMPfichierMembreLus))// compteur
{
fluxLireMembre>>m_IDMembreLus>>chaine1>>chaine2;
TMPfichierMembreLus=espace+chaine1+espace+chaine2;
IDListMembre.push_back(m_IDMembreLus);
ListMembre.push_back(TMPfichierMembreLus);
}
IDListMembre.pop_back();//je n est pas sus faire autrement sans
ListMembre.pop_back();//quoi il y a une case de trop
fluxLireMembre.close();
/////////////////////////////////
fluxLog<<"fin de la fonction 'LireFichierMembre'"<<endl;
}
void MembreList::ajouteMembre(std::string nom,std::string prenom)
{
fluxLog<<"lancement de la fonction 'ajouteMembre'"<<endl;
int i(0),newID(0);
i= IDListMembre.size();
newID =1+IDListMembre[i];
fluxEcrireMembre<<newID<<" "<<nom<<" "<<prenom<<endl;
cout<<"un "<<nomObjet<<"a ete ajouter a la mediatheque avec l'ID"<<newID<<endl;
fluxLog<<"fin de la fonction 'ajouteLivre'"<<endl;
fluxLog<<"fin de la fonction 'ajouteMembre'"<<endl;
}
string MembreList::getMembreLoueur(int IDmenbre)
{
fluxLog<<"lancement de la fonction 'afficheObjetEmprunter'"<<endl;
string resultat;
int IDLus;
int i;
for(i=0;IDLus!=IDmenbre;i++)
{
IDLus=IDListMembre[i];
}
i--;
resultat = ListMembre[i];
return resultat;
fluxLog<<"fin de la fonction 'afficheObjetEmprunter'"<<endl;
}
void MembreList::savelisteMembre()
{
fluxLog<<"lancement de la fonction 'SaveListeMembre'"<<endl;
int tailleIDlistMembre;
tailleIDlistMembre=IDListMembre.size();
fluxSaveMembre.open("data/listmembre.biblio",ios::trunc);
fluxSaveMembre<<"9000//////////// "<<nomObjet<<" //////////////////"<<endl;
int i(0);
while(i <tailleIDlistMembre)
{
fluxSaveMembre<<IDListMembre[i]<<" "<<ListMembre[i]<<" "<<endl;
i++;
}
fluxSaveMembre.close();
fluxLog<<"fin de la fonction 'saveListe'"<<endl;
}
Voilà comme vous pouvez le voir j'ai un kif personnel j'aimeécrire dans un fichier log.txt si une fonction est en cours ou non je même pas sur que ne se servent àgrand-chose
int main()
{
prettyCalc(ZFraction(85,36),'+',ZFraction(4,5));
prettyCalc(ZFraction(8,13),'*',ZFraction(13,2));
prettyCalc(ZFraction(4,7),'-',ZFraction(1,14));
prettyCalc(ZFraction(21,8),'/',ZFraction(3,2));
return 0;
}
Si vous procédez comme moi, vous aurez besoin de ceci :
Convertir un int en string :
#include <sstream>
ostringstream oss; //Déclaration d'un objet de type flux de sortie
int nombre=8;
oss << nombre; //Cela agit comme cout << nombre, sauf que c'est écrit dans oss
string chaine=oss.str(); //Le contenu de oss est copié dans chaine : chaine vaut désormais "8"
oss.str(""); //Efface le contenu de oss (ça devrait servir)
Connaître le nombre de chiffres d'un nombre :
#include <cmath>
int nombre=12345;
int nombreChiffres=int(log10(nombre))+1; //Partie entière du logarithme base 10 de nombre, plus un
//nombreChiffres vaut désormais 5
Conseil : utilisez 3 chaînes de caractères, une pour chaque ligne.
Bon travail !
(PS: si quelqu'un me dit où est passée la balise <spoiler>, je mettrai des indices)
Si ça peut aider, voici une implémentation perso de tostring.
tostring.h
/**
* \file tostring.h
* \author Caduchon
* \brief Tools to convert values to the string format
*/
#pragma once
#ifndef _CADUCHON_INCLUDE__TOSTRING_H_
#define _CADUCHON_INCLUDE__TOSTRING_H_
#include <sstream>
#include <iomanip>
/**
* \def FLOAT_SCIENTIFIC
* \brief Print with scientific mode
*/
#define FLOAT_SCIENTIFIC true
/**
* \def FLOAT_NO_SCIENTIFIC
* \brief Print with not scientific mode
*/
#define FLOAT_NO_SCIENTIFIC false
/**
* \def BOOL_ALPHABETIC
* \brief Print boolean values as "true" or "false"
*/
#define BOOL_ALPHABETIC true
/**
* \def BOOL_NUMERIC
* \brief Print boolean values as "1" or "0"
*/
#define BOOL_NUMERIC false
#define DEFAULT_BOOL_ALPHA BOOL_ALPHABETIC
#define DEFAULT_FLOAT_PRECISION 6
#define DEFAULT_FLOAT_SCIENTIFIC FLOAT_NO_SCIENTIFIC
#define DEFAULT_DOUBLE_PRECISION 14
#define DEFAULT_DOUBLE_SCIENTIFIC FLOAT_NO_SCIENTIFIC
namespace caduchon
{
/**
* \brief Convert the value to the string format
* \attention The template type T must implement \code std::ostream& operator<<(std::ostream&,const T&) \endcode
*/
template <typename T>
std::string tostring(const T& value);
/** \brief Convert any boolean value to the string format */
template <>
std::string tostring<bool>(const bool& value);
/** \brief Convert any float value to the string format */
template <>
std::string tostring<float>(const float& value);
/** \brief Convert any double value to the string format */
template <>
std::string tostring<double>(const double& value);
/**
* \brief Convert integer values to the string format
* \param value The value to be converted to string
* \param width The fixed length of the string
* \param fill Symbol used to fill the string when it's needed
*/
template <typename T>
std::string tostring(const T& value, unsigned short int width, char fill);
/**
* \brief Convert real values to the string format
* \param value The value to be converted to string
* \param scientific If true, the scientific mode is used (use FLOAT_SCIENTIFIC or FLOAT_NO_SCIENTIFIC)
* \param precision Precision of the number
* \param width The fixed length of the string
* \param fill Symbol used to fill the string when it's needed
*/
template <typename T>
std::string tostring(const T& value, bool scientific, unsigned short int precision, unsigned short int width, char fill);
/**
* \brief Convert boolean values to the string format
* \param value The value to be converted to string
* \param alphabetic If true, the alphabetic version is used
*/
std::string tostring(bool value, bool alphabetic);
// ------------------------------------
// ---------- Implementation ----------
// ------------------------------------
/** \author Caduchon */
template <typename T>
std::string tostring(const T& value)
{
std::ostringstream oss;
oss << value;
return oss.str();
}
/** \author Caduchon */
template <typename T>
std::string tostring(const T& value, unsigned short int width, char fill)
{
std::ostringstream oss;
oss << std::setfill(fill) << std::setw(width) << value;
return oss.str();
}
/** \author Caduchon */
template <typename T>
std::string tostring(const T& value, bool scientific, unsigned short int precision, unsigned short int width, char fill)
{
std::ostringstream oss;
oss << (scientific ? std::scientific : std::fixed) << std::setprecision(precision);
if(width > 0)
oss << std::setfill(fill) << std::setw(width);
oss << (value == 0.0 ? 0.0 : value);
return oss.str();
}
}
#endif
Bonjour à tous, j'ai fait l'exercice Biblio++ jusqu’au niveau 5 (je n'ai pas utilisé le système de Dewey, juste 1, 2, 3,....). Je voudrais donc avoir un avis sur mon code (il est assez long), il manque quelque truc mais il est opérationnel. Voici un lien pour le telecharger : ici (projet code::blocks). Merci à tous.
Au cours de mes lectures diverses sur le C++, j'ai pensé à un petit exercice facile (ou pas, j'ai du mal à évaluer la difficulté). L'énoncé est simple :
Que retourne cette fonction ? (identifier tous les cas possibles selon les valeurs passées en arguments)
int set_and_add_values(int* a, int* b) {
*a = 1;
*b = 2;
return (*a + *b);
}
(laissez un peu les gens réfléchir, ne donnez pas tout de suite la réponse si vous la connaissez)
Tu demandes a ce qu'on ne réponde pas pour que les autres cherche
Sa n'est pas un exercice de codage, sa n'est qu'une question, c'est beaucoup moins intéressant qu'un exercice ou les participants doivent coder quelque chose
× 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
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Discord NaN. Mon site.
Discord NaN. Mon site.