CPP tableaux d'entiers
ousmane
-
pouet -
pouet -
Bonjour
je fais un programme en CPP qui doit entre autres permettre de saisir un tableaux d'entiers et l'afficher.
j'ai fait deux fonctions de saisies et d'affichage.
La saisie se fait bien apparemment mais c'est l'affichage qui pose probléme.
voici le code !!!
include <conio.h>
#include <string.h>
#include <stdio.h>
class EnormeEntier
{
private :
int *_nbre;
int _taille;
public :
EnormeEntier(int _n);
void saisieEnormeEntier();
void afficherEnormeEntier();
~EnormeEntier();
};
EnormeEntier ::EnormeEntier(int _n)
{
delete [] _nbre;
_nbre=new int[_taille=_n];
}
void EnormeEntier :: saisieEnormeEntier()
{
char _cc;
int code,_i;
_i=_taille;
_i--;
cout <<"Saisir l'Enorme Entier : ";
_signe='+';
while (_i>=0) //<_taille)
{
cin>> _nbre[_i]
_i--;}
}
}
void EnormeEntier :: afficherEnormeEntier()
{
cout<<"Voici l'enorme Entier : ";
cout <<_signe<<" ";
for (int _i=_taille-1;_i>=0;_i--);
cout <<_nbre[_i];
cout<<endl;
}
void main()
{
int tailleA;
cout<<"Donner la taille de l'Enorme Entier A : ";
cin >>tailleA;
EnormeEntier A(tailleA);
A.saisieEnormeEntier();
A.afficherEnormeEntier();
}
A l'affichage il m'affiche des valeurs differentes de celles que j'ai saisies par exemple si je saisie 0123456789 il m'affiche 4652.
veuillez me dire svp pourquoi cela ne marche pas
merci d'avance!!!
je fais un programme en CPP qui doit entre autres permettre de saisir un tableaux d'entiers et l'afficher.
j'ai fait deux fonctions de saisies et d'affichage.
La saisie se fait bien apparemment mais c'est l'affichage qui pose probléme.
voici le code !!!
include <conio.h>
#include <string.h>
#include <stdio.h>
class EnormeEntier
{
private :
int *_nbre;
int _taille;
public :
EnormeEntier(int _n);
void saisieEnormeEntier();
void afficherEnormeEntier();
~EnormeEntier();
};
EnormeEntier ::EnormeEntier(int _n)
{
delete [] _nbre;
_nbre=new int[_taille=_n];
}
void EnormeEntier :: saisieEnormeEntier()
{
char _cc;
int code,_i;
_i=_taille;
_i--;
cout <<"Saisir l'Enorme Entier : ";
_signe='+';
while (_i>=0) //<_taille)
{
cin>> _nbre[_i]
_i--;}
}
}
void EnormeEntier :: afficherEnormeEntier()
{
cout<<"Voici l'enorme Entier : ";
cout <<_signe<<" ";
for (int _i=_taille-1;_i>=0;_i--);
cout <<_nbre[_i];
cout<<endl;
}
void main()
{
int tailleA;
cout<<"Donner la taille de l'Enorme Entier A : ";
cin >>tailleA;
EnormeEntier A(tailleA);
A.saisieEnormeEntier();
A.afficherEnormeEntier();
}
A l'affichage il m'affiche des valeurs differentes de celles que j'ai saisies par exemple si je saisie 0123456789 il m'affiche 4652.
veuillez me dire svp pourquoi cela ne marche pas
merci d'avance!!!
A voir également:
- CPP tableaux d'entiers
- Tableaux croisés dynamiques - Guide
- Fusionner deux tableaux excel - Guide
- Les tableaux word - Guide
- Dev-cpp - Télécharger - Langages
- Citez un des logiciels lui permettant de faire des calculs sur des tableaux de nombres (tableur). ✓ - Forum Logiciels
8 réponses
bonsoir,
ton code ne compile pas:
guillaume@fallen:~$ g++-3.2 -Wall -ansi test4.cc
test4.cc: In member function `void EnormeEntier::saisieEnormeEntier()':
test4.cc:36: `cout' undeclared (first use this function)
test4.cc:36: (Each undeclared identifier is reported only once for each
function it appears in.)
test4.cc:38: `_signe' undeclared (first use this function)
test4.cc:42: `cin' undeclared (first use this function)
test4.cc:43: syntax error before `--' token
test4.cc:29: warning: unused variable `char _cc'
test4.cc:30: warning: unused variable `int code'
test4.cc: At global scope:
test4.cc:46: syntax error before `}' token
test4.cc: In member function `void EnormeEntier::afficherEnormeEntier()':
test4.cc:53: name lookup of `_i' changed for new ISO `for' scoping
test4.cc:52: using obsolete binding at `_i'
test4.cc:54: `endl' undeclared (first use this function)
test4.cc: At global scope:
test4.cc:57: `main' must return `int'
test4.cc:57: return type for `main' changed to `int'
include <conio.h>
// ce n est pas du C++
#include <string.h>
#include <stdio.h>
// c est du C
// il manque #include <iostream> pour utiliser std::cout etc
class EnormeEntier
{
private :
int *_nbre;
int _taille;
// tres bien
public :
EnormeEntier(int _n);
void saisieEnormeEntier();
void afficherEnormeEntier();
~EnormeEntier();
// ok, mais on a tendance a mettre les attributs avec _ devant
// donc EnormeEntier(int n), mais ce n est qu un detail
};
EnormeEntier ::EnormeEntier(int _n)
{
delete [] _nbre;
// segfault immediat!!!
// tu n as pas encore alloue la memoire et tu veux la liberer?
_nbre=new int[_taille=_n];
}
void EnormeEntier :: saisieEnormeEntier()
{
char _cc;
int code,_i;
// _cc et code pas utilises
_i=_taille;
_i--;
// oui, mais laid
cout <<"Saisir l'Enorme Entier : ";
_signe='+';
// signe pas declare
while (_i>=0) //<_taille)
{
cin>> _nbre[_i]
_i--;}
}
// preferer:
// for (int i = taille - 1; i >= 0; i--)
// comme tu l as fait ailleurs
// histoire de lisibilite et de memoire et de securite
}
void EnormeEntier :: afficherEnormeEntier()
{
cout<<"Voici l'enorme Entier : ";
// c est std::cout
cout <<_signe<<" ";
for (int _i=_taille-1;_i>=0;_i--);
// oui
cout <<_nbre[_i];
cout<<endl;
}
void main()
// ca n existe pas, tu as soit:
// int main(void)
// soit
// int main(int argc, char *argv[])
{
int tailleA;
cout<<"Donner la taille de l'Enorme Entier A : ";
cin >>tailleA;
EnormeEntier A(tailleA);
A.saisieEnormeEntier();
A.afficherEnormeEntier();
}
une fois toutes les fautes corrigees ca donne ca:
guillaume@fallen:~$ ./a.out
Donner la taille de l'Enorme Entier A : 9
Saisir l'Enorme Entier : 1
2
3
4
5
6
7
8
9
Voici l'enorme Entier : + 123456789
voila, il y a d autres fautes, mais tu peux deja avancer avec ca.
au passage, ton compilateur aurait du te signaler ces erreurs.
--
pouet
ton code ne compile pas:
guillaume@fallen:~$ g++-3.2 -Wall -ansi test4.cc
test4.cc: In member function `void EnormeEntier::saisieEnormeEntier()':
test4.cc:36: `cout' undeclared (first use this function)
test4.cc:36: (Each undeclared identifier is reported only once for each
function it appears in.)
test4.cc:38: `_signe' undeclared (first use this function)
test4.cc:42: `cin' undeclared (first use this function)
test4.cc:43: syntax error before `--' token
test4.cc:29: warning: unused variable `char _cc'
test4.cc:30: warning: unused variable `int code'
test4.cc: At global scope:
test4.cc:46: syntax error before `}' token
test4.cc: In member function `void EnormeEntier::afficherEnormeEntier()':
test4.cc:53: name lookup of `_i' changed for new ISO `for' scoping
test4.cc:52: using obsolete binding at `_i'
test4.cc:54: `endl' undeclared (first use this function)
test4.cc: At global scope:
test4.cc:57: `main' must return `int'
test4.cc:57: return type for `main' changed to `int'
include <conio.h>
// ce n est pas du C++
#include <string.h>
#include <stdio.h>
// c est du C
// il manque #include <iostream> pour utiliser std::cout etc
class EnormeEntier
{
private :
int *_nbre;
int _taille;
// tres bien
public :
EnormeEntier(int _n);
void saisieEnormeEntier();
void afficherEnormeEntier();
~EnormeEntier();
// ok, mais on a tendance a mettre les attributs avec _ devant
// donc EnormeEntier(int n), mais ce n est qu un detail
};
EnormeEntier ::EnormeEntier(int _n)
{
delete [] _nbre;
// segfault immediat!!!
// tu n as pas encore alloue la memoire et tu veux la liberer?
_nbre=new int[_taille=_n];
}
void EnormeEntier :: saisieEnormeEntier()
{
char _cc;
int code,_i;
// _cc et code pas utilises
_i=_taille;
_i--;
// oui, mais laid
cout <<"Saisir l'Enorme Entier : ";
_signe='+';
// signe pas declare
while (_i>=0) //<_taille)
{
cin>> _nbre[_i]
_i--;}
}
// preferer:
// for (int i = taille - 1; i >= 0; i--)
// comme tu l as fait ailleurs
// histoire de lisibilite et de memoire et de securite
}
void EnormeEntier :: afficherEnormeEntier()
{
cout<<"Voici l'enorme Entier : ";
// c est std::cout
cout <<_signe<<" ";
for (int _i=_taille-1;_i>=0;_i--);
// oui
cout <<_nbre[_i];
cout<<endl;
}
void main()
// ca n existe pas, tu as soit:
// int main(void)
// soit
// int main(int argc, char *argv[])
{
int tailleA;
cout<<"Donner la taille de l'Enorme Entier A : ";
cin >>tailleA;
EnormeEntier A(tailleA);
A.saisieEnormeEntier();
A.afficherEnormeEntier();
}
une fois toutes les fautes corrigees ca donne ca:
guillaume@fallen:~$ ./a.out
Donner la taille de l'Enorme Entier A : 9
Saisir l'Enorme Entier : 1
2
3
4
5
6
7
8
9
Voici l'enorme Entier : + 123456789
voila, il y a d autres fautes, mais tu peux deja avancer avec ca.
au passage, ton compilateur aurait du te signaler ces erreurs.
--
pouet
merci à toi Pouet
Apparemment y'a que toi qui reponds aux questions en CPP.
Les autres ont ils peur ou alors...
je vais essayer d'amener les corrections que tu as faites à mon programmes mais ca m'interresse de savoir le compilateur que tu utilises car le mien ne me signale pas les mêmes erreurs que le tien.
sinon peut m'expliquer le main tel
int main(int argc, char *argv[])
merci d'avance
Apparemment y'a que toi qui reponds aux questions en CPP.
Les autres ont ils peur ou alors...
je vais essayer d'amener les corrections que tu as faites à mon programmes mais ca m'interresse de savoir le compilateur que tu utilises car le mien ne me signale pas les mêmes erreurs que le tien.
sinon peut m'expliquer le main tel
int main(int argc, char *argv[])
merci d'avance
int main(int argc, char *argv[])
ce prototype est utilise pour passer des arguments a ton programme.
argc contient le nombre d arguments, et argv[] les arguments, avec argv[0] = nom du programme.
ex: ls -l -a
argc = 3
argv[0] = ls
argv[1] = -l
argv[2] = -a
le compilateur que j utilise est gcc. si tu veux l essayer tu as:
http://www.bloodshed.net/dev/devcpp.html
ou alors tu peux installer cygwin:
http://gnuwin.epfl.ch/apps/cygwin/fr/index.html
ou encore djgpp
http://delorie.com/
la premiere solution doit etre la plus simple.
ce prototype est utilise pour passer des arguments a ton programme.
argc contient le nombre d arguments, et argv[] les arguments, avec argv[0] = nom du programme.
ex: ls -l -a
argc = 3
argv[0] = ls
argv[1] = -l
argv[2] = -a
le compilateur que j utilise est gcc. si tu veux l essayer tu as:
http://www.bloodshed.net/dev/devcpp.html
ou alors tu peux installer cygwin:
http://gnuwin.epfl.ch/apps/cygwin/fr/index.html
ou encore djgpp
http://delorie.com/
la premiere solution doit etre la plus simple.
merci à toi
mais dans mon cas je dois utiliser int main(void) car je n'ai pas d'argument à passer.
sinon gcc fonctionne-t-il sous windows ?
mais dans mon cas je dois utiliser int main(void) car je n'ai pas d'argument à passer.
sinon gcc fonctionne-t-il sous windows ?
salut Pouet
j'ai fait les modifications dans un petit fichier et ça marche
mais le probléme est ce que j'ai fourni n'est une petite partie de mon code.
lorsque j'améne les mêmes corrections dans le grand fichier de code.
cela ne marche toujours pas.
si vraiment tu peux me donner ton email pour que je donne l'intégralité du code pour que tu me verifies( si tu veux l'affichage seulement).
je pense que c'est un probléme d'allocation d'espace mémoire.
c'est trés urgent svp!!!
j'ai fait les modifications dans un petit fichier et ça marche
mais le probléme est ce que j'ai fourni n'est une petite partie de mon code.
lorsque j'améne les mêmes corrections dans le grand fichier de code.
cela ne marche toujours pas.
si vraiment tu peux me donner ton email pour que je donne l'intégralité du code pour que tu me verifies( si tu veux l'affichage seulement).
je pense que c'est un probléme d'allocation d'espace mémoire.
c'est trés urgent svp!!!
je ne souhaite pas donner mon adresse.
si tu mets une archive en telechargement sur un site web, j y jetterai un coup d oeil.
quand a ta question d au dessus,
il existe au mois deux portages de gcc:
tu as djgpp (cf lien ci dessus)
et mingw:
http://gnuwin.epfl.ch/apps/mingw/fr/index.html
sinon tu peux utiliser gcc directement en installant cygwin.
--
pouet
si tu mets une archive en telechargement sur un site web, j y jetterai un coup d oeil.
quand a ta question d au dessus,
il existe au mois deux portages de gcc:
tu as djgpp (cf lien ci dessus)
et mingw:
http://gnuwin.epfl.ch/apps/mingw/fr/index.html
sinon tu peux utiliser gcc directement en installant cygwin.
--
pouet
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
pour savoir y'a t-il un danger à donner son email sur un forum surtout qd il y'a moins de chances que les gens lisent ce forum?
j ai jete un rapide coup d oeil.
ca ne compile toujours pas, essentiellement a cause de deux trucs:
1.conio.h ce n est pas du C++, ce n est pas du C, c est une bibliotheque non standard propre a windows, bref, c est a bannir, d autant plus que tu n n as pas besoin.
2.#include <pouet.h> est deprecie dans les versions recentes de la norme du C++, comme je te l ai deja dit, c est #include <pouet>
a part ca:
EnormeEntier :: EnormeEntier(EnormeEntier &v)
{
delete [] _nbre;
....
je ne sais pas pourquoi tu tiens absoluement a faire un delete dans ton constructeur, alors je reexplique:
quand tu definis une variable, tu reserves de la memoire pour la stocker.
c est new.
quand tu as finis de jouer avec elle, tu liberes la memoire avec delete.
comment veux tu liberer de la meemoire que tu n as pas reserver?
ensuite:
getche, getch, etc... ce n est pas standard, utiliser getchar.
ensuite:
fflush(stdin);
fflush n est defini que pour les flux en lecture comme stdout. (cf mes autres posts).
bref, ne pas faire ca.
ensuite
cout << ....
cout appartient au namespace std.
donc sois tu te decides a ecrire
std::cout
soit tu ecris en haut de ton fichier:
using namespace std;
(pareil pour cin, endl, etc...).
ensuite:
int *_nbr.
ton nbr n est constitue que de chiffre. donc toujours positif, donc a priori tu veux utiliser:
unsigned int *_nbr; (il y a peut etre mieux)
ensuite:
#include <stdio.h>
tu ne l utilises pas, ne l inclue pas.
une fois tout ca corrige, ca tourne, mais tu as une erreur dans ton algo d addition.
if (_taille<B._taille)
{
_taille_C = B._taille;
donc disons que A = 1 et B = 99, donc C (= 100) a une taille de 2 int?
ensuite ama tu t embrouilles et tu te compliques trop la vie, au point que ce n est plus lisible. je te propose un truc du genre:
unsigned int *nbr1, *nbr2, *res;
unsigned int tmp;
for (unsigned int i = 0; i < min_len; i++)
{
tmp = nbr1[i] + nbr2[i] + res[i];
res[i] = tmp % 10;
if ((i+ 1) < res.len)
res[i + 1] = tmp / 10;
}
enfin un petit conseil d ecriture:
rajoute des espaces a gauche et a droite de =, <, !=, <<, etc...
un espace a droite des , et ;
et, seuls les attributs doivent etre prwefixes de _, sinon ca devient incomprehensible.
sinon je viens de m apercevoir d une erreur mystique.
tu as :
class EnormeEntier
{
private:
int _taille;
...
};
et
EnormeEntier::addition(EnormeEntier B)
{
if (_taille < B._taille)
...
}
alors la faudrait qu on m explique pourquoi g++ pete pas d erreur.
tu ne PEUX pas faire ca.
ca devrait donner un truc du genre:
B._taille is private
il faut que tu ajoutes:
int EnormeEntier::get_taille() const
{
return _taille;
}
je comprends meme pas que ca compile??
quelqu un a une idee?
--
pouet
ca ne compile toujours pas, essentiellement a cause de deux trucs:
1.conio.h ce n est pas du C++, ce n est pas du C, c est une bibliotheque non standard propre a windows, bref, c est a bannir, d autant plus que tu n n as pas besoin.
2.#include <pouet.h> est deprecie dans les versions recentes de la norme du C++, comme je te l ai deja dit, c est #include <pouet>
a part ca:
EnormeEntier :: EnormeEntier(EnormeEntier &v)
{
delete [] _nbre;
....
je ne sais pas pourquoi tu tiens absoluement a faire un delete dans ton constructeur, alors je reexplique:
quand tu definis une variable, tu reserves de la memoire pour la stocker.
c est new.
quand tu as finis de jouer avec elle, tu liberes la memoire avec delete.
comment veux tu liberer de la meemoire que tu n as pas reserver?
ensuite:
getche, getch, etc... ce n est pas standard, utiliser getchar.
ensuite:
fflush(stdin);
fflush n est defini que pour les flux en lecture comme stdout. (cf mes autres posts).
bref, ne pas faire ca.
ensuite
cout << ....
cout appartient au namespace std.
donc sois tu te decides a ecrire
std::cout
soit tu ecris en haut de ton fichier:
using namespace std;
(pareil pour cin, endl, etc...).
ensuite:
int *_nbr.
ton nbr n est constitue que de chiffre. donc toujours positif, donc a priori tu veux utiliser:
unsigned int *_nbr; (il y a peut etre mieux)
ensuite:
#include <stdio.h>
tu ne l utilises pas, ne l inclue pas.
une fois tout ca corrige, ca tourne, mais tu as une erreur dans ton algo d addition.
if (_taille<B._taille)
{
_taille_C = B._taille;
donc disons que A = 1 et B = 99, donc C (= 100) a une taille de 2 int?
ensuite ama tu t embrouilles et tu te compliques trop la vie, au point que ce n est plus lisible. je te propose un truc du genre:
unsigned int *nbr1, *nbr2, *res;
unsigned int tmp;
for (unsigned int i = 0; i < min_len; i++)
{
tmp = nbr1[i] + nbr2[i] + res[i];
res[i] = tmp % 10;
if ((i+ 1) < res.len)
res[i + 1] = tmp / 10;
}
enfin un petit conseil d ecriture:
rajoute des espaces a gauche et a droite de =, <, !=, <<, etc...
un espace a droite des , et ;
et, seuls les attributs doivent etre prwefixes de _, sinon ca devient incomprehensible.
sinon je viens de m apercevoir d une erreur mystique.
tu as :
class EnormeEntier
{
private:
int _taille;
...
};
et
EnormeEntier::addition(EnormeEntier B)
{
if (_taille < B._taille)
...
}
alors la faudrait qu on m explique pourquoi g++ pete pas d erreur.
tu ne PEUX pas faire ca.
ca devrait donner un truc du genre:
B._taille is private
il faut que tu ajoutes:
int EnormeEntier::get_taille() const
{
return _taille;
}
je comprends meme pas que ca compile??
quelqu un a une idee?
--
pouet