Powered by Invision Power Board


Forum Rules Bienvenue dans la Distillerie d'entraide

Quelques soient vos problèmes, nous sommes là !

  Closed TopicStart new topicStart Poll

> Help! J'ai un GROS prob, en C++
Krokador
Écrit le : Mercredi 08 Juin 2005 à 14h06


Pantoufle maléfique
Group Icon

Groupe : Citoyennes
Messages : 463
Membre n° : 646
Inscrit le : 12/02/2005




bon voilà tout: Je dois faire ce super tp (travail pratique) et le remettre vendredi (donc me reste environ 2 jours). Le code, même s'il est un peu bâclé et étrange vu qu'on est 2 à gosser dessus (travail d'équipe) et qu'on manque de temps, est tout de même compréhensible, et ne semble pas avoir de gros défauts majeurs... Cependant, lorsqu'on fait fonctionner le programme, et qu'on regarde en pas à pas, on se rend compte que le compilateur fait des choses qui ne sont même pas écrites.

Hmm, ah oui, c'est un code fait pour le compilateur C++ Borland V.5.0. dans Visual Studio, il reconnait pas la foutue bibliothèque iostream...

Note: je viens tout de même de me rendre compte que j'avais inversé un tableau dans une accumulation, ce qui pourrait bien expliquer et corriger le problème, mais je peux pas tester... et de toute façon y'a pas que ça qui fonctionne pas.

N'empêche, même si j'avais corriger le prob, la vue de quelqu'un d'autre sur le code pourrait être utile, donc si z'avez la gentillesse de le survoler et de me signaler ce que vous croyez mauvais (en laissant de côté les variables globales qui pourraient être locale, ça c'est un détail final... ) Je vous en serais infiniment reconnaissante (même si je passe déjà le cours même si je remets pas le travail. Je tiens à ma moyenne de 90 + %)

Tiens, autre prob que je viens de me rappeller... On arrive pas non plus à écrire sur le fichier Biblio.str à parti de ce programme, et pourtant les énoncés sont bien faits... Il me semble en tout cas. :s

Vala le code: (surtout, faut mexcuser pour l'alignement, c'est la faute du bloc-note...)
QUOTE
/*Noms : Vincent Blouin & Melyssa St-Hilaire
//Groupe : 4118
//Projet : Travail Pratique 3
//But : Permettre la consultation et la mise à jour d'un fichier obtenu suite à
        l'étape 1.  Un relevé de cumulatifs sera produit à la fin.

Bibliothèques */

#include <iostream.h>
#include <fstream.h>
//#include "CHN.CPP"
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>

//Structures

struct Index
{
int Num;
bool Tem;
};

struct Bibliotheque
{
  int Num;
  char Titre[20];
  char Auteur[20];
  char Categ;
  int Total;
  int Sortis;
  float Val;
  bool Tem;
};

//Prototypes

void OuvrirFichier();
void CreerIndex();
void Traitement();
void AfficherMenu();
void LireChoix();
void Travail();
void ConsultTitre(int pos);
void ConsultAll();
void SupprTitre(int pos);
void ModifTitre(int pos);
void Accumulation();
void AccumulationNb(int Nb);
int Confirmation();
void Verification(int Num, int &Pos);
int  Validation(char X[]);
void AffStruct();
void AfficherStruct(char X);
void EcritStruct();
void AfficherStats();
void FermerFichier();
void LireStruct();
void LireStructPos(int pos);
void NettoyerEcran();

//Variables Globales

fstream Fichier;
Index Ind[20];
Bibliotheque Biblio;
int Long=(sizeof(Bibliotheque)),L,choix,pos;
int V[3][2]; //tableau des cumulatifs

//Fonction Principale

void main()
{
OuvrirFichier();
CreerIndex();
Traitement();
AfficherStats();
FermerFichier();
}

void OuvrirFichier()
{
Fichier.open("Biblio.str", ios::in|ios::out|ios::binary);
}

void CreerIndex()
{
L=0;
Fichier.clear();
Fichier.seekg(0);
  LireStruct();
while (Fichier!=0)
  {
  Ind[L].Num=Biblio.Num;
  Ind[L].Tem=Biblio.Tem;
  Accumulation();
  L++;
      LireStruct();
  }
}

void Traitement()
{
AfficherMenu();
LireChoix();
while (choix!=5)
  {
    Travail();
    LireChoix();
  }
}

void AfficherMenu()
{
clrscr();
cout << "1. Consultation d'un titre (selon le numéro du livre)" << endl;
cout << "2. Consultation de tous les titres (actifs ou tous)" << endl;
cout << "3. Suppression d'un titre (si toutes les copies sont retournées)" <<endl;
cout << "4. Modification d'un titre (autre choix après)" << endl;
cout << "5. Terminer" << endl;
}

void LireChoix()
{
NettoyerEcran();
gotoxy(1,7);
cout << "Entrez votre choix : ";
cin >> choix;
}

void Travail()
{
int pos=-1;
switch (choix)
  {
    case 1: ConsultTitre(pos);
          break;
    case 2: ConsultAll();
          break;
    case 3: SupprTitre(pos);
          break;
    case 4: ModifTitre(pos);
          break;
  }
}

void ConsultTitre(int pos)
{
pos = Confirmation();
  if (pos!=-1)
    AffStruct();
}


void ConsultAll()
{
char X;
cout << "Voulez-vous tout afficher sans distinctions? (o/n) ";
cin >> X;
if (X=='o'|| X=='O')
  {
    Fichier.clear();
    Fichier.seekg(0);
      LireStruct();
    while (Fichier != 0)
    {
      AffStruct();
        LireStruct();
    }
  }
else
  {
    Fichier.clear();
  Fichier.seekg(0);
      LireStruct();
    while (Fichier != 0)
      {
      if (Biblio.Tem==true)
        AffStruct();
        LireStruct();
    }
  }
}

void SupprTitre(int pos)
{
pos = Confirmation();
if (pos!=-1)
  {
    LireStructPos(pos);
    if (Biblio.Sortis==0)
    {
      Ind[pos].Tem=false;
      Biblio.Tem=false;
      Fichier.clear();
      Fichier.seekg(pos*Long);
      EcritStruct();
      cout << "Le titre a été supprimé";
        getch();
      }
    else
    {
      cout << "Certains exemplaires n'ont pas ete retournes!";
      getch();
    }
  }
else
  {
    cout << "Le numero de livre n'a pas ete trouve";
    getch();
  }
}

void ModifTitre(int pos)
{
int Nb;
choix=0;
cout << "1. Retour de livre" << endl;
cout << "2. Emprunt d'un livre" << endl;
cout << "3. Terminer" << endl;
cin >> choix;
if (choix==1)
  {
    pos = Confirmation();
  if (pos!=-1)
    {
    LireStructPos(pos);
    cout << "Combien de livres ont ete retournes? ";
    cin >> Nb;
    Biblio.Sortis-=Nb;
    Nb= -(Nb);
    Fichier.clear();
    Fichier.seekg(pos*Long);
    EcritStruct();
    AccumulationNb(Nb);
    }
  else
  {
    cout << "Le titre n'existe pas";
    getch();
  }
  }
if (choix==2)
  {
    pos = Confirmation();
    if (pos!=0)
      {
      LireStructPos(pos);
      cout << "Combien de livres ont ete empruntes? ";
      cin >> Nb;
      Biblio.Sortis+=Nb;
      Fichier.clear();
      Fichier.seekg(pos * Long);
      EcritStruct();
      AccumulationNb(Nb);
      }
  }
}

void Accumulation()
{
switch (Biblio.Categ)
{
  case 'E' :  {V[0][0]+=Biblio.Total;
            V[0][1]+=Biblio.Sortis;
            break;}
  case 'S' :  {V[1][0]+=Biblio.Total;
            V[1][1]+=Biblio.Sortis;
            break; }
  case 'R' :  {V[2][0]+=Biblio.Total;
            V[2][1]+=Biblio.Sortis;
            break; }
}  /* devrait avoir lair de ça...
    R T25 S7

  E T9  S2

  S T4  S3*/
}

void AccumulationNb(int Nb)
{
switch (Biblio.Categ)
{
  case 'E' : V[0][1]+=Nb;
            break;
  case 'S' : V[1][1]+=Nb;
            break;
  case 'R' : V[2][1]+=Nb;
            break;
  }
}


int Confirmation()
{
int Num; char NumTemp[10];
int Pos=-1;
cout << "Quel numero voulez-vous consulter? ";
if (Validation(NumTemp)==1)
{
  Num = atoi(NumTemp);
    Verification(Num, Pos);
    while (Pos==-1)
    {
  clreol();
      cout << " Veuillez entrer a nouveau le numero";
        if (Validation(NumTemp)==1)
  {
    Num = atoi(NumTemp);
      Verification(Num, Pos);
      }
    }
  }
  else
  {
    NettoyerEcran();
    cout << "Le numéro que vous avez entre n'est pas numerique, veuillez recommencer";
      getch();
      NettoyerEcran();
      Pos=-1;
  }
  return pos;
}

int Validation(char X[])
{
int Res = 1;
int i=0;
  char Car;
  do
    {
    Car = getche();
        if (Car != 13)
          X[i] = Car;
        if (!isdigit(X[i]) && X[i] != ' ' && Car != 13)
    {
            Res=0;
      }
        else
        {
          i++;
        }
      }
  while (Car != 13 && Res == 1);
  X[i-1]='\0';
  return Res;
}

void Verification(int Num, int &Pos)
{
int i=0;
while (i<L)
  {
    if (Ind[i].Num==Num)
    {
    Pos = i;
      LireStructPos(Pos);
      i=L+2;
    }
    else
    i++;
  }
if (i==L)
  {
  clreol();
    cout <<"Numero inexistant!";
    getch();
    Pos=-1;
  }
}

void AffStruct()
{
gotoxy(1,9);
cout << "Numero : " << Biblio.Num << endl;
cout << "Titre : " << Biblio.Titre << endl;
cout << "Auteur : " << Biblio.Auteur << endl;
cout << "Categorie : " << Biblio.Categ << endl;
cout << "Exemplaires disponibles : " << Biblio.Total << endl;
cout << "Exemplaires en circulation : " << Biblio.Sortis << endl;
cout << "Valeur : " << Biblio.Val;
getch();
NettoyerEcran();
}

void EcritStruct()
{
Fichier.write((char*)&Biblio,Long);
}

void AfficherStats()
{
NettoyerEcran();
cout << "Statistiques";
gotoxy (2,8);
cout << "Categorie Education :";
gotoxy (3,9);
cout << "Nombre total d'exemplaires : " << V[0][0];
gotoxy (3,10);
cout << "Nombre d'exemplaires en circulation : " << V[0][1];
gotoxy (2,11);
cout << "Categorie Science";
gotoxy (3,12);
cout << "Nombre total d'exemplaires : " << V[1][0];
gotoxy (3,13);
cout << "Nombre d'exemplaires en circulation : " << V[2][1];
gotoxy (2,14);
cout << "Categorie Roman";
gotoxy (3,15);
cout << "Nombre total d'exemplaires : " << V[2][0];
gotoxy (3,16);
cout << "Nombre d'exemplaires en circulation : " << V[2][1];
getch();
}

void FermerFichier()
{
Fichier.close();
}

void LireStructPos(int pos)
{
Fichier.clear();
Fichier.seekg((long)pos*Long);
Fichier.read((char*)&Biblio,Long);
}

void LireStruct()
{
Fichier.read((char*)&Biblio,Long);
}

void NettoyerEcran()
{
  for (int i=20; i>6; i--)
    {
    gotoxy(1,i);
  clreol();
      }
}


Bon, comme je L,ai dit plutôt, le code est bâclé, pas en ordre et pas aligner... Mais bon, faut faire avec le temps qu'on a, donc moi j'avais fait la partie du pseudo-code, mon coéquipier a fait le premier jet de code, et ensuite quand je suis venu pour déboguer m'a fallu 2 heures pour redonner un semblant d'ordre au code... J'en avais pas plus à mettre là-dessus.

Alors voilà, tout commentaire constructif est apprécié, mais avant vendredi SVP!

Edit: finalement yavait beaucoup de probs dans le code, mais là il marche presque à 100%... j'ai remplacé le pas bon par le un peu meilleur.


--------------------
user posted image
PMEmail PosterUsers Website
Top
Forty-two
Écrit le : Mercredi 08 Juin 2005 à 22h13


Script Master
Group Icon

Groupe : Admin
Messages : 364
Membre n° : 262
Inscrit le : 04/08/2003




Je vais commencer à lire...

En attendant, une remarque : VC++ gère parfaitement iostream, seulement faut utiliser la syntaxe standard :
CODE
#include <iostream>
#include <fstream>
using namespace std;


#include <iostream.h> n'est pas standard et n'est introduit que pour raison de compatibilité.

Idem pour conio.h, qui n'est pas standard (spécifique Borland) et qui fait râler VC++.


EDIT

Voilà fini Wink.gif

En fait, je ne vois pas trop ce que tu reproches au code ! Après avoir créé un fichier de bibliothèque bidon, on peut faire joujou avec le programme sans rencontrer de bug. Le plus gros ennui est le maximum de 20 livres, imposé en dur dans le code. Il faudrait utiliser un truc genre vector<> pour stocker les structures Index, au lieu d'un tableau de taille fixée.

Bref, rien de bien méchant, ce sont surtout plein de petits détails pour améliorer un peu le code. Comme tu l'as dit toi-même, les variables globales, c'est mâââl smile.gif Y'a aussi la fonction Validation() qui n'est pas très utile. Il vaudrait mieux à mon avis lire le nombre avec echo (c'est mieux quand on voit ce qu'on tape), en utilisant simplement int nombre; cin >> nombre;

On pourrait aussi factoriser les fonctions Accumulation(), en créant une fonction "IndexDeCategorie" qui fait la conversion 'E' -> 0, 'S' -> 1, et 'R' -> 2. Ensuite les fonctions Accumulation() et AccumulationNb() ne feraient que quelques lignes. Et au passage, créer une structure pour les catégories (au lieu d'un tableau à 2 dimensions), et en profiter pour faire une boucle dans la fonction AfficherStats().

En gros, ça donnerait :

CODE
struct Categorie
{
   int Total;
   int Sortis;
};

// ...

int IndexDeCategorie();

// ...

const int nbCategories = 3;
Categorie V[nbCategories]; // tableau des cumulatifs
static const char* categories[nbCategories] = { "Education", "Science", "Roman" };


// ...

int IndexDeCategorie()
{
   for (int i = 0; i < nbCategories; i++)
       if (Biblio.Categ == categories[i][0])
           return i;
   return -1;
}

void Accumulation()
{
   const int categ = IndexDeCategorie();
   if (categ >= 0) {
       V[categ].Total  += Biblio.Total;
       V[categ].Sortis += Biblio.Sortis;
   }
}

void AccumulationNb(int Nb)
{
   const int categ = IndexDeCategorie();
   if (categ >= 0)
       V[categ].Sortis += Nb;
}

// ...

void AfficherStats()
{
   NettoyerEcran();
   cout << "Statistiques";
   
   for (int i = 0; i < nbCategories; i++) {
       gotoxy(2, 8 + 3*i);
       cout << "Categorie " << categories[i] << " :";
       gotoxy(3, 9 + 3*i);
       cout << "Nombre total d'exemplaires : " << V[i].Total;
       gotoxy(3, 10 + 3*i);
       cout << "Nombre d'exemplaires en circulation : " << V[i].Sortis;
   }
   getch();
}


--------------------
#define QUESTION ((2b) || !(2b))
#define ANSWER 42

mon site perso
PMEmail PosterUsers Website
Top
Krokador
Écrit le : Mercredi 08 Juin 2005 à 23h11


Pantoufle maléfique
Group Icon

Groupe : Citoyennes
Messages : 463
Membre n° : 646
Inscrit le : 12/02/2005




J'ai retravailler le code encore (L'ai pas sous la main pour le moment) et il fonctionnait relativement bien. Mais c'et sur que, vu la vitesse à laquelle ce programme a été fait, il reste des défauts que je pourrai pas corriger (et ça me met en rogne).

Mais bon, pour le moment jai un oral danglais à aller passer, donc je vais y aller wacko.gif


--------------------
user posted image
PMEmail PosterUsers Website
Top
Forty-two
Écrit le : Mercredi 08 Juin 2005 à 23h28


Script Master
Group Icon

Groupe : Admin
Messages : 364
Membre n° : 262
Inscrit le : 04/08/2003




QUOTE
il reste des défauts que je pourrai pas corriger (et ça me met en rogne).

C'est très bien d'être perfectionniste !
Heureusement que ce sont des gens comme ça qui font les systèmes de guidage des avions et les lance-missiles...


--------------------
#define QUESTION ((2b) || !(2b))
#define ANSWER 42

mon site perso
PMEmail PosterUsers Website
Top
Krokador
Écrit le : Jeudi 09 Juin 2005 à 03h04


Pantoufle maléfique
Group Icon

Groupe : Citoyennes
Messages : 463
Membre n° : 646
Inscrit le : 12/02/2005




Ben en fait, c'est qu'y a une partie du tp que tu vois pas, qui est la création du fichier .str en question à partir d'un .txt... et vu que dans le .txt il n'y a que 14 champs, je voyais pas du tout l'utilité d'en mettre plus (vu que l'ajout de livre n'était pas demandé...).

Pour ce qui est de ma Validation... c'est le prof qui voulait ça, sinon ça aurait été un cin >> Num; bien moins compliqué... Mais avec le compilateur que j'utilise, on voit tout de même ce qu'on tappe. Il y avait plusieurs problèmes au niveau des variables de positionnement dans le fichier (parce que une s'appelait i, l'autre pos... et finalement je savis plus trop laquelle était laquelle). Tout s'est arrangé quand je l'ai mise en locale à Travail() et l'ai passé en paramètres.

J'ai fini par sortir mon tableau d'accumulation de la structure, mais je l'ai laissé en tableau, parce que pour le travail qu'il y a à faire ça reste aussi pratique qu'une structure, moins la redéclaration. C'est vrai que ça réduit le code et est plus pratique si jamais on avait à ajouter des catégories de plus, mais le professeur avait l'air tellement content quand je lui ai posé la question fatifique de la ligne qui faisait augmenter une partie de mon tableau et qu'il a vu mon tableau que je vais pas l'enlever...

En gros, ça fonctionne bien (J'ai bossé tout l'aprem dessus), il aurait fallu que j'ajoute des limites de livres à retourné/emprumptés pour ne pas dépasser, peut-être un affichage plus "cute", mais en gros je devrais tirer une bonne note avec ça. Et en plus j'ai appris comment tester mes programmes chez nous! (Parce que Borland (ou bord*L, comme l'a dit quelqu'un dans ma classe... lapsus plutôt involontaire, mais tellement bien placé tongue.gif) il se trouve pas n'importe où, et il n'aime PAS DU TOUT WinXP... Doit m'avoir planté au moins 60 fois dans la face en 3h de débuggage par ses exceptions non gérées et ses compilations qui bug... alors que sur win2K c'est beaucoup moins pire...)

Merci beaucoup de ton avis 42 happy.gif


--------------------
user posted image
PMEmail PosterUsers Website
Top
0 utilisateur(s) sur ce sujet (0 invités et 0 utilisateurs anonymes)
0 membres :

Topic Options Closed TopicStart new topicStart Poll

 


Habillé par Shadowillusions

Sites de nos membres :
Le blog de Mortis Ghost Le site de la réécriture Avatar RPG Le site de Fauna Friends