J'ai vraiment besoin de votre aide !!!

Signaler
Messages postés
102
Date d'inscription
dimanche 27 juillet 2003
Statut
Membre
Dernière intervention
13 août 2005
-
Messages postés
102
Date d'inscription
dimanche 27 juillet 2003
Statut
Membre
Dernière intervention
13 août 2005
-
Alors voilà j'ai réalisé un programme (en MS-DOS) qui pose des questions sur toutes les capitales du monde et pays du monde mais ça ne marche pas !
Je vous serez grandement reconnaissant si vous m'aidez.
J'ai mis plein de commentaires (vraiment plein !) afin de vous aidez et de vous expliquez ce que je voulais faire alors s'il vous plait faites que je n'ai pas ecris en vain. Merci.

Le fichier source est disponible à cette adresse :

Le code source(dézippez tout)

Merci encore de m'aider !

19 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Quand tu fopen un fichier, met tout le path ("c:\\mondossier\\pays.txt" plutot que "pays.txt").
Rien que ca, ca enleve les assertion errors.
Ensuite quand tu fscanf une file, je pense que tu veux une chaine de caractere (pays ou ville) et pas un caractere, donc il faut passer %s en argument.
Et pareil quand tu affiches une question, il faut afficher toute la chaine de caractere, pas seulement le 1er caractere.
Messages postés
102
Date d'inscription
dimanche 27 juillet 2003
Statut
Membre
Dernière intervention
13 août 2005
1
Merci je vais essayer ça, si jamais tu arrives a compiler quelque chose qui marche fait moi signe !
sinon pour %s, ça transformera en pointeur sur des donnees, qu'est ce que ça implique dans le programme apres ?
Merci de ton aide !
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
J'ai jamais utilisé fscanf, mais je pense que ca remplira une ligne de ton tableau avec une ligne du fichier. Tu peux aussi utiliser fgets().
Sinon chez moi ca compile tres bien, et j'ai plus d'erreurs lors de l'execution, seulement les questions sont du type: "quelle est la capitale du p ?"
car ta fonction selectionaleatoire() retourne un simple caractere au lieu d'un pointeur vers une chaine de caractere.
Il faudrait verifier qu'un caractere NULL est bien placé a la fin de ce que tu veux afficher et faire retourner un char *.
Messages postés
102
Date d'inscription
dimanche 27 juillet 2003
Statut
Membre
Dernière intervention
13 août 2005
1
Tu pourrais reussir a me faire marcher le programme stp parce que j'en ai marre j'arrive pas ça plante ça plante !
(tu peux mettre le code source quand tu reussiras a le faire marcher avec les pointeur qui pointent sur les tableaux et que ça affichera vraiment quelle est la capitale de la france ?)
Merci bcp !!!!

P.S : je sais que je te demande bcp mais la j'en ai plus que marre ça fait trop longtemps que je suis dessus et ça marche pas... :((((
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Désolé mais les classes j'y comprend rien donc si une erreur vient de la j'aurai du mal a la resoudre. Pour les fonctions en elles memes je vais regarder ce que je peux faire.
Messages postés
102
Date d'inscription
dimanche 27 juillet 2003
Statut
Membre
Dernière intervention
13 août 2005
1
a priori au niveau des classes y a aucun probleme donc si tu modifies rien au classes tu peux m'envoyer les fonctions ?
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Je suis sur le coup:
Je viens de voir des choses HORRIBLES :) :
quand tu fais:
if (reponse[255] == capitales[pays_actuel][255])
tu ne fait que comparer 1 caracteres ! pas toute la chaine!
Une chaine de caractere c'est une suite de caractere terminée par un caractere NULL '\0'.
Pour copier, concatener et comparer 2 chaines tu ne peut pas utiler '=' ou '==', il faut faire appel aux fonctions strcpy, strcat, et strcmp, respectivement.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Ok donc:
- J'ai supprimé la partie qui empechait de reposer la question précédente.
- Lors de la lecture dans fichier dans les tableau, j'ai mis des caracteres NULL a la fin des nom des pays/villes
- Vu qu'on dispose de tableaux contenant des chaines de caracteres terminées par NULL, on peut les comparer avec la reponse de l'utilisateur grace a strcmp(), et ca affiche si c'est bon ou pas.

Il me faut ton mail pour t'envoyer le tout.
Messages postés
258
Date d'inscription
jeudi 20 mars 2003
Statut
Membre
Dernière intervention
16 août 2004

Bon, voila j'ai midife les trucs avec les tableaux a double dim et 2 ou 3 trucs
et ca a l'air de marcher chez moi.
Si ca marche pas chez toi dis-le moi.
Voici le code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include 
#include <string.h>

using namespace std;

class interface 
{
public :
interface();
~interface();
int compteurlignes();  // sert a calculer le nombre de ligne
void lecturefichier(); // sert a lire le fichier "pays.txt" afin de recuperer les capitales et pays
char *selectionaleatoire(); // choisit un pays au hasard
void question(); // je pense que ça se passe de commentaire :)
    int nb_pays;   // le nombre de pays RESTANT avant la fin du programme
private :
    int lignes;  // le nombre de lignes
    int nb_lignes; // nombre de lignes bis, j'en ai mis deux afin de controler les etapes du programmes pour voir ou ça bugge mais bon ça bug tjrs mais on peut mettre une seule variable ça marchera aussi
    char pays[255][255];   // les pays, tableau a deux dimensions : le premier [255] correspond au numero du pays et le deuxieme correspond au nom du pays
char capitales[255][255]; // la meme chose que pays
    int pays_actuel;   // le pays aleatoire genere par selectionaleatoire()
FILE* file;

 	char reponse[255];
};

interface::interface()  //  S affiche quand on cree l'objet
{   // Blabla habituel !
    cout << "Bienvenue dans ce merveilleux programme !\n Grace a lui,\n vous allez connaitre toutes les capitales et pays en moins de deux !";
cout << "\nMagnifique n'est-il pas ?";
cout << "\nEntrons vite dans le vif du sujet allez hop première question !";

}
interface::~interface()
{   // sert juste pour que je me rappelle qu'il y a tjrs un destructeur quand on cree un objet :)
cout << "Fin du programme bzzzzz.....TUTUTU !";
}

int interface::compteurlignes() // calcule le nb de lignes
{   // j'avoue cette partie-là je l'ai pompé sans trop la comprendre (g l'impression que ça merde ici parce que quand j'affiche le nb_lignes a la fin du prog ça me met 0 :()
   nb_lignes=1;
   char c;

   file=fopen("c:\\pays.txt", "r"); // on ouvre en lecture
   
do 
{
 c=fgetc(file); // g pompe je sais pas a quoi ça correspond !
 if (c=='\n') 
 {nb_lignes++;}

}while (c!=EOF); // tant qu'on est pas a la fin du fichier

fclose (file);
return nb_lignes;
}

void interface::lecturefichier() // ça aussi g pompe donc je sais pas comment ça marche
{
lignes = compteurlignes();
nb_pays=lignes/2;
if (lignes % 2 != 0) // on vérifie qu'il y autant de pays que de capitales !
 cerr <<"Erreur dans le fichier pays.txt !";
file = fopen ("c:\\pays.txt", "r");     // j'ai l'impression que ça marche pas non plus a cet endroit donc les commentaires après c ce que je voulais faire en théorie
{
for (int i = 0 ; i < nb_pays ; i++)       // Pour autant qu'il y a de pays
{
fscanf (file, "%s", pays[i]);	// on stocke dans le tableau pays

    fscanf (file, "%s", capitales[i]); // puis dans le tableau capitales
}
}

fclose (file);
}
char *interface::selectionaleatoire()
{   
pays_actuel = rand()%nb_pays;    // sort un numero de pays aleatoirement

return pays[pays_actuel];

}
void interface::question()
{

cout << "\nQuelle est la capitale du "<< selectionaleatoire() << " ? ";
cin.getline(reponse,255);
//if (reponse[255] == capitales[pays_actuel][255])
if (strcmp(reponse,capitales[pays_actuel])==0)
{ 
cout << "\nBonne réponse ! Allez on continue :"; 
int i=pays_actuel;
  for (int x=nb_pays-pays_actuel;x!=nb_pays;i++)   // alors là c le foutoire, en gros g voulu que si la reponse etait bonne le pays ne soit pas retire
  {
   strcpy(pays[i],pays[i+1]);
   strcpy(capitales[i],capitales[i+1]);
   ++x;
  }
  --nb_pays;  // afin d'arreter le programme quand y aura plus de pays !
}
    else     //sinon....
{ cout << "\nMauvaise réponse ! Question suivante : "; }
}

int main()
{
interface paysInterface;   // on cree un objet
paysInterface.compteurlignes(); // on cherche le nombre de lignes dans "pays.txt"
paysInterface.lecturefichier();  // on lit le fichier afin de stocker tous les noms de pays et de capitales dans le programme
do
{ paysInterface.question(); }
while(paysInterface.nb_pays!=0); // tant qu'on a pas trouve toutes les reponses le programme continue de poser des questions !
return 0;
}

Bye,Xentor609
Messages postés
258
Date d'inscription
jeudi 20 mars 2003
Statut
Membre
Dernière intervention
16 août 2004

Par contre j'ai mis comme chemin d'acces c:\\pays.txt chez moi, donc t'as qu'a modifie et eventuellement faire des controles sur l'existance du fichier (genre il te dis que le fichier n'existe pas et il te demande d'entrer un autre chemin d'acces par exemple).
Bye,Xentor609
Messages postés
102
Date d'inscription
dimanche 27 juillet 2003
Statut
Membre
Dernière intervention
13 août 2005
1
Merci bcp les gars, vous m'avez beaucoup aider !
Désolé pour le temps de réponse mais j'avais deux trois trucs à faire.
Xentor609 ton code marche impeccable, je vais regarder ça et si je comprends pas je te dirai.
Merci aardman pour ton aide, si jamais tu veux me contacter mon e-mail est PiX3L@voila.fr
Mais xentor609 a été plus rapide et à fournit le code source donc je n'ai pas besoin de ton code.
Par contre si tu as procédé différemment je suis intérressé par ton code !

Merci encore une fois, je suis nouveau dans le monde de la programmation et seulement fais seulement 1 mois que je programme. Ca fait vraiment plaisir d'avoir une aide ! :)
Certain concepts sont vraiments ardus en C++, j'espère que j'arriverai à les surmonter.
J'aimerai avoir une estimation : combien il faut de temps en moyenne pour devenir un programmeur opérationnel (enfin qui s'y connait pas mal, je parle juste pour le MS-DOS).
Autre question : Est-ce que c'est dur d'apprendre MFC après avoir appris le langage C++ pour MS-DOS ? MFC est seulement possible avec Visual C++ ?

Amicalement PiX3L :)
Messages postés
102
Date d'inscription
dimanche 27 juillet 2003
Statut
Membre
Dernière intervention
13 août 2005
1
Juste un truc :
La fonction rand() donne toujours la meme chose ou presque, g essaye avec srand() mais ça fait plante le prog, qqun a une solution ?
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Avant d'utiliser rand(), il faut l'initialiser avec srand().
Pour l'argument de srand tu met GetTickCount() ou time(), enfin un truc qui donne nombre qui change tout le temp.
Messages postés
258
Date d'inscription
jeudi 20 mars 2003
Statut
Membre
Dernière intervention
16 août 2004

Salut,
Pour ce qui s'agit du temps pour devenir "operationnel", je ne pourrais pas te repondre, car cela depends un peu de chacun(certains assimilent tres vite, d'autres beaucoup moins), le tout c'est de vraiment le vouloir, et s'y interesser serieusement.
Sinon, pour ce qui est du MFC, moi je ne l'utilise pas, je n'aime po ca du tout. Je trouve ca completement inutile (utilise les API c bien mieux).
Bye,Xentor609
Messages postés
102
Date d'inscription
dimanche 27 juillet 2003
Statut
Membre
Dernière intervention
13 août 2005
1
Merci pour la fonction srand(time(NULL)) qui marche !
J'ai un autre petit probleme,
fscanf stocke dans le tableau a chaque fois qu'il trouve un espace, mais pour les pays(ou capitales) à noms composés ça ne marche pas.
Or je ne sais pas comment faire stocker dans le tableau tous les caracteres situés sur une ligne a la place de tous les caracteres sans espace.
Merci de m'aider :)
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
fgets()
Messages postés
102
Date d'inscription
dimanche 27 juillet 2003
Statut
Membre
Dernière intervention
13 août 2005
1
Ok mais comment tu disposes les arguments ?
C'est quoi la structure parce que la moi ça marche pas il me mets :74 c:\pays\pays.cpp
passing `FILE *' as argument 1 of `fgets(char *, int, FILE *)'
76 c:\pays\pays.cpp
passing `FILE *' as argument 1 of `fgets(char *, int, FILE *)'

et le code c :

fgets(file, "%s", pays[i]); //on stocke dans le tableau pays

fgets(file, "%s", capitales[i]); //puis dans le tableau capitales
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Et bien ton code est faux.
fgets et fscanf sont pas les meme fonctions, c'est evident qu'elle n'ont surement pas les meme parametres.
Regarde ton message d'erreur te dis quels arguments il faut passer a la fonction fgets().
Messages postés
102
Date d'inscription
dimanche 27 juillet 2003
Statut
Membre
Dernière intervention
13 août 2005
1
Merci de ton aide, j'ai enfin trouvé la structure (et ça marche ^^):

fgets(pays[i],sizeof(pays[i]) , file);
fgets (capitales[i],sizeof(capitales[i]), file);

Ah vive le C++ on peut tout faire avec, le problème c'est qu'il faut savoir chercher tant il y a de fonctions différentes :)