Aide pour trouver une erreur sur un programme
Fermé
viktorfrankestein
Messages postés
12
Date d'inscription
samedi 16 mai 2015
Statut
Membre
Dernière intervention
30 août 2016
-
Modifié par viktorfrankestein le 28/08/2016 à 21:01
viktorfrankestein Messages postés 12 Date d'inscription samedi 16 mai 2015 Statut Membre Dernière intervention 30 août 2016 - 30 août 2016 à 20:36
viktorfrankestein Messages postés 12 Date d'inscription samedi 16 mai 2015 Statut Membre Dernière intervention 30 août 2016 - 30 août 2016 à 20:36
A voir également:
- Aide pour trouver une erreur sur un programme
- Erreur 0x80070643 - Accueil - Windows
- Trouver adresse mac - Guide
- Comment trouver le mot de passe wifi sur son téléphone - Guide
- Programme demarrage windows 10 - Guide
- Trouver une adresse - Guide
3 réponses
viktorfrankestein
Messages postés
12
Date d'inscription
samedi 16 mai 2015
Statut
Membre
Dernière intervention
30 août 2016
Modifié par viktorfrankestein le 28/08/2016 à 20:56
Modifié par viktorfrankestein le 28/08/2016 à 20:56
apres avoir relu les regles du forum voici en fait mon probleme.
fonction pour la demande des coefficients
vector<int> coefficient (int nbreCoef)
{
bool controlleur(false); // variable qui controlle si le user a entre les bons chiffres
int const grandCoef(6); // le coefficient max que peut avoir une matiere
vector<int> coef; // tableau contenant les coefficient
int unCoef(0);
cout << "veuillez entrer vos coefficients dans l ordre des matieres" << endl;
for(int j(0);j<nbreCoef;j++) // demande des coef a le user et verification de la valeur entré
{
cin >> unCoef;
coef.push_back(unCoef);
controlleur=controlle(coef, j, grandCoef); // reception du resultat de la verification de la valeur entree
if(controlleur)
coefficient(nbreCoef);// on recomence au debut au cas ou la valeur est fausse
}
int tailletab(coef.size());
cout << "la taille du tab est " << tailletab << endl;
return coef; // retour du tableauu des coefficient
}
la fonction qui va faire le controlle des valeurs des coefficients et notes entrées
bool controlle(vector<int> coef, int compteur, int const randCoef)
{
if (coef[compteur]<=0 || coef[compteur]>randCoef)
{
for(int t(compteur);t>=0;t--)
coef.pop_back();
cout << "Erreur!!! " << endl << endl;
cout << "vous allez recommencez depuis le debut " << endl << endl;
return true;
}
else
return false;
}
voici par exemple le resultat d'un code qui marche
veuillez entrer le nombre de matiere
3
veuillez entrer vos matiere
maths
physique
chimie
veuillez entrer vos coefficients dans l ordre des matieres
6
4
5
la taille du tab est 3
veuillez entrer vos notes dans l ordre des matieres
12
13
14
Process returned 0 (0x0) execution time : 57.258 s
Press any key to continue.
voici le resultat de quand ça ne marche pas quand le mauvais coefficient est entrée dans coef[j] où j est egale à 0
veuillez entrer le nombre de matiere
3
veuillez entrer vos matiere
maths
physique
chimie
veuillez entrer vos coefficients dans l ordre des matieres
7
Erreur!!!
vous allez recommencez depuis le debut
veuillez entrer vos coefficients dans l ordre des matieres
6
5
4
la taille du tab est 3
5
4
la taille du tab est 3
veuillez entrer vos notes dans l ordre des matieres
12
15
16
Process returned 0 (0x0) execution time : 60.570 s
Press any key to continue.
les trois lignes en gras je ne comprend pas leur apparition.
Après quelques tests j'ai remarqué que
si j'entre une érreur à la position J de mon tableau coef alors le programme execute ma fonction bool controlle(vector<int> coef, int compteur, int const randCoef)
puis le programme recommence à redemander les coefficients et les stocke a partir de coef[J==0]
mais il me demande en plus (nbreCoef -(J + 1)) qu'il va stocker dans le tableau coef à coef[j] puis coef[j++] ainsi de suite jusqu à J=nbreCoef
(mais cette fois j est egale à au numéro où l'erreur a été trouvé et je ne sais pas comment)
voici une illustration quand le mauvais coefficient est entrée dans coef[j] où j est egale à 1
veuillez entrer le nombre de matiere
3
veuillez entrer vos matiere
maths
physique
chimie
veuillez entrer vos coefficients dans l ordre des matieres
6
7
Erreur!!!
vous allez recommencez depuis le debut
veuillez entrer vos coefficients dans l ordre des matieres
6
5
4
la taille du tab est 3
4
la taille du tab est 3
veuillez entrer vos notes dans l ordre des matieres
12
15
14
Process returned 0 (0x0) execution time : 68.628 s
Press any key to continue.
je note dans ce qui précede que on a eu droit que a une seule demande en plus.
c'est à dire nbreCoef(qui est 3 dans notre cas ) - (J+1) j c'est 1 dans ce cas donc on a 3 - (1+1)=1 donc seule a été faite en plus
je vous remercie de bien vouloir m'aider
fonction pour la demande des coefficients
vector<int> coefficient (int nbreCoef)
{
bool controlleur(false); // variable qui controlle si le user a entre les bons chiffres
int const grandCoef(6); // le coefficient max que peut avoir une matiere
vector<int> coef; // tableau contenant les coefficient
int unCoef(0);
cout << "veuillez entrer vos coefficients dans l ordre des matieres" << endl;
for(int j(0);j<nbreCoef;j++) // demande des coef a le user et verification de la valeur entré
{
cin >> unCoef;
coef.push_back(unCoef);
controlleur=controlle(coef, j, grandCoef); // reception du resultat de la verification de la valeur entree
if(controlleur)
coefficient(nbreCoef);// on recomence au debut au cas ou la valeur est fausse
}
int tailletab(coef.size());
cout << "la taille du tab est " << tailletab << endl;
return coef; // retour du tableauu des coefficient
}
la fonction qui va faire le controlle des valeurs des coefficients et notes entrées
bool controlle(vector<int> coef, int compteur, int const randCoef)
{
if (coef[compteur]<=0 || coef[compteur]>randCoef)
{
for(int t(compteur);t>=0;t--)
coef.pop_back();
cout << "Erreur!!! " << endl << endl;
cout << "vous allez recommencez depuis le debut " << endl << endl;
return true;
}
else
return false;
}
voici par exemple le resultat d'un code qui marche
veuillez entrer le nombre de matiere
3
veuillez entrer vos matiere
maths
physique
chimie
veuillez entrer vos coefficients dans l ordre des matieres
6
4
5
la taille du tab est 3
veuillez entrer vos notes dans l ordre des matieres
12
13
14
Process returned 0 (0x0) execution time : 57.258 s
Press any key to continue.
voici le resultat de quand ça ne marche pas quand le mauvais coefficient est entrée dans coef[j] où j est egale à 0
veuillez entrer le nombre de matiere
3
veuillez entrer vos matiere
maths
physique
chimie
veuillez entrer vos coefficients dans l ordre des matieres
7
Erreur!!!
vous allez recommencez depuis le debut
veuillez entrer vos coefficients dans l ordre des matieres
6
5
4
la taille du tab est 3
5
4
la taille du tab est 3
veuillez entrer vos notes dans l ordre des matieres
12
15
16
Process returned 0 (0x0) execution time : 60.570 s
Press any key to continue.
les trois lignes en gras je ne comprend pas leur apparition.
Après quelques tests j'ai remarqué que
si j'entre une érreur à la position J de mon tableau coef alors le programme execute ma fonction bool controlle(vector<int> coef, int compteur, int const randCoef)
puis le programme recommence à redemander les coefficients et les stocke a partir de coef[J==0]
mais il me demande en plus (nbreCoef -(J + 1)) qu'il va stocker dans le tableau coef à coef[j] puis coef[j++] ainsi de suite jusqu à J=nbreCoef
(mais cette fois j est egale à au numéro où l'erreur a été trouvé et je ne sais pas comment)
voici une illustration quand le mauvais coefficient est entrée dans coef[j] où j est egale à 1
veuillez entrer le nombre de matiere
3
veuillez entrer vos matiere
maths
physique
chimie
veuillez entrer vos coefficients dans l ordre des matieres
6
7
Erreur!!!
vous allez recommencez depuis le debut
veuillez entrer vos coefficients dans l ordre des matieres
6
5
4
la taille du tab est 3
4
la taille du tab est 3
veuillez entrer vos notes dans l ordre des matieres
12
15
14
Process returned 0 (0x0) execution time : 68.628 s
Press any key to continue.
je note dans ce qui précede que on a eu droit que a une seule demande en plus.
c'est à dire nbreCoef(qui est 3 dans notre cas ) - (J+1) j c'est 1 dans ce cas donc on a 3 - (1+1)=1 donc seule a été faite en plus
je vous remercie de bien vouloir m'aider
Dalfab
Messages postés
706
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
2 novembre 2023
101
30 août 2016 à 00:19
30 août 2016 à 00:19
Bonjour,
Dans la fonction coefficient(), la séquence
On peut se servir du booléen controlleur pour reprendre la dernière saisie par :
Dans la fonction coefficient(), la séquence
if(controlleur) coefficient(nbreCoef);ne demande pas de recommencer, mais s'auto-appelle en récursivité pour demander les coefficients puis à son retour, la boucle continue et les autres coefficients sont demandés. D'où un double affichage et un retour faux (le 1er coefficient erroné est toujours resté là!).
On peut se servir du booléen controlleur pour reprendre la dernière saisie par :
if ( controlleur ) { --j; // reculer d'un indice pour le refaire coef.pop_back(); // supprimer la dernière entrée //// ou bien //j = 0; // revenir au debut //coef.clear(); // supprimer toutes les entrées }Attention, la fonction controlle() ne supprime rien du vector<> passé en paramètre, elle travaille sur une copie du vector<> qui sera vite oubliée dès la sortie de la fonction.
viktorfrankestein
Messages postés
12
Date d'inscription
samedi 16 mai 2015
Statut
Membre
Dernière intervention
30 août 2016
Modifié par viktorfrankestein le 30/08/2016 à 00:57
Modifié par viktorfrankestein le 30/08/2016 à 00:57
Merci pour la reponse
je pense que les tableaux sont passés par reference en c++ donc quand je travaille sur un tableau dans une fonction ça le modifie partout ailleurs. n'est ce pas le cas?
et aussi il n'ya pas de double affichage mais une double demande. les valeurs 5 et 4 c'est moi qui les ait entré de nouveau
je pense que les tableaux sont passés par reference en c++ donc quand je travaille sur un tableau dans une fonction ça le modifie partout ailleurs. n'est ce pas le cas?
et aussi il n'ya pas de double affichage mais une double demande. les valeurs 5 et 4 c'est moi qui les ait entré de nouveau
Dalfab
Messages postés
706
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
2 novembre 2023
101
30 août 2016 à 08:21
30 août 2016 à 08:21
Non les tableaux ne sont pas passés par référence en C++.
Il y a une ambiguïté de vocabulaire sur ce qu'est un tableau :
- deque<T> est un objet qui gère les tableaux dynamiques gérant la double entrée
- vector<T> est un objet qui gère les tableaux dynamiques
- array<T,N> est un objet qui gère les tableaux statiques
- T [N] est un tableau 'brut'
En C++ (comme en C) tout est toujours passé par copie sauf :
- les tableaux 'bruts' qui sont passés en pointeurs (d'où l'impression d'un passage par référence)
- les fonctions qui sont elles aussi passées en pointeurs.
Il y a une ambiguïté de vocabulaire sur ce qu'est un tableau :
- deque<T> est un objet qui gère les tableaux dynamiques gérant la double entrée
- vector<T> est un objet qui gère les tableaux dynamiques
- array<T,N> est un objet qui gère les tableaux statiques
- T [N] est un tableau 'brut'
En C++ (comme en C) tout est toujours passé par copie sauf :
- les tableaux 'bruts' qui sont passés en pointeurs (d'où l'impression d'un passage par référence)
- les fonctions qui sont elles aussi passées en pointeurs.
viktorfrankestein
Messages postés
12
Date d'inscription
samedi 16 mai 2015
Statut
Membre
Dernière intervention
30 août 2016
30 août 2016 à 11:50
30 août 2016 à 11:50
qu'est ce qui se passe si j'ajoute un & quand je passe un tableau dynamique à une fonction?
Dalfab
Messages postés
706
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
2 novembre 2023
101
>
viktorfrankestein
Messages postés
12
Date d'inscription
samedi 16 mai 2015
Statut
Membre
Dernière intervention
30 août 2016
30 août 2016 à 20:16
30 août 2016 à 20:16
L'esperluette permet d'indiquer un passage par référence, dans ce cas au lieu d'un passage par copie, on a un passage par référence.
void fct( Type t ); // passage par copie (à éviter pour les types non scalaires car souvent non optimal, mais pas toujours) void fct( Type& t ); // passage par référence (lvalue seulement), pour une donnée que l'on veut modifier void fct( Type const& t ); // passage par const référence, pratique pour transmettre en lecture un type complexe (rvalue ou lvalue) void fct( Type&& t ); // passage 'optimal' d'une rvalue qui pourra être amputée si nécessaire
viktorfrankestein
Messages postés
12
Date d'inscription
samedi 16 mai 2015
Statut
Membre
Dernière intervention
30 août 2016
30 août 2016 à 20:36
30 août 2016 à 20:36
okay merci
Modifié par viktorfrankestein le 30/08/2016 à 01:11
voici la modification de la boucle for de la fonction coefficient
for(int j(0);j<nbreCoef;j++)
{
cin >> unCoef;
coef.push_back(unCoef);
cout << "test de j" <<endl;
controlleur=controlle(coef, j, grandCoef);
cout << "la val avant la verification de controlleur j est" << j << endl;
if(controlleur)
{
cout << "la val apres la verifiation de controlleur j est" << j << endl;
coefficient(nbreCoef);
}
else
cout << "test" << endl;
}
int tailletab(coef.size());
cout << "la taille du tab est " << tailletab << endl;
return coef;
}
et voici le resultat de l'execution
veuillez entrer le nombre de matiere
3
veuillez entrer vos matiere
maths
physique
chimie
veuillez entrer vos coefficients dans l ordre des matieres
7
test de j
Erreur!!!
vous allez recommencez depuis le debut
la val avant de la boucle j est0
la val apres de j est0
veuillez entrer vos coefficients dans l ordre des matieres
6
test de j
la val avant de j est0
test
5
test de j
la val avant de j est1
test
4
test de j
la val avant de j est2
test
la taille du tab est 3
5
test de j
la val avant de j est1
test
4
test de j
la val avant de j est2
test
la taille du tab est 3
veuillez entrer vos notes dans l ordre des matieres
12
12
12
Process returned 0 (0x0) execution time : 101.140 s
Press any key to continue.
30 août 2016 à 01:14