begin process at 2012 05 27 14:32:22
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > LA CLASSE MINT EST UN ENTIER N'AYANT PAS DE MAXIMUM

LA CLASSE MINT EST UN ENTIER N'AYANT PAS DE MAXIMUM


 Information sur la source

 Description

La Classe MINT est un entier n'ayant pas de maximum
Avec tous les opérateurs du type Int
Ou du moin les plus importants

Source

  • #include<conio.h>
  • #include<iostream.h>
  • #include<string.h>
  • class liste_entier
  • {
  • protected:
  • struct listes
  • {
  • int valeur;
  • listes *precedent;
  • }*liste,*nb,*current;
  • public:
  • liste_entier()
  • {
  • nb=NULL;
  • current=NULL;
  • }
  • liste_entier(liste_entier &);
  • void addtofront(int);
  • void addtoend(int);
  • void movefirst();
  • void movelast();
  • void movepreview();
  • void movenext();
  • int getcurrent();
  • int size();
  • void clear();
  • ~liste_entier(){clear();};
  • };
  • ////////////////////////////////////////////////////////////////
  • liste_entier::liste_entier(liste_entier &x)
  • {
  • listes *origine,*copie,**precedent;
  • origine=x.nb;
  • precedent=&nb;
  • current=NULL;
  • while (origine)
  • {
  • copie=new listes;
  • copie->valeur=origine->valeur;
  • *precedent=copie;
  • if (x.current==origine)
  • current=copie;
  • origine=origine->precedent;
  • precedent=&(copie->precedent);
  • }
  • *precedent=NULL;
  • }
  • ////////////////////////////////////////////////////////////////
  • void liste_entier::addtofront(int valeur)
  • {
  • liste=new listes;
  • current=nb;
  • if(nb==NULL) addtoend(valeur);
  • else
  • {
  • while(current->precedent!=NULL) current=current->precedent;
  • liste->valeur=valeur;
  • liste->precedent=NULL;
  • current->precedent=liste;
  • }
  • }
  • ////////////////////////////////////////////////////////////////
  • void liste_entier::addtoend(int valeur)
  • {
  • liste=new listes;
  • if(nb==NULL) {
  • liste->precedent=NULL;
  • liste->valeur=valeur;
  • nb=liste;
  • }
  • else {
  • liste->precedent=nb;
  • liste->valeur=valeur;
  • nb=liste;
  • }
  • current=nb;
  • }
  • ////////////////////////////////////////////////////////////////
  • void liste_entier::movefirst()
  • {
  • while(current->precedent!=NULL) current=current->precedent;
  • }
  • ////////////////////////////////////////////////////////////////
  • void liste_entier::movelast()
  • {
  • current=nb;
  • }
  • ////////////////////////////////////////////////////////////////
  • void liste_entier::movepreview()
  • {
  • if(current->precedent!=NULL)
  • current=current->precedent;
  • }
  • ////////////////////////////////////////////////////////////////
  • void liste_entier::movenext()
  • {
  • if(current!=nb)
  • {
  • listes *tmp;
  • tmp=nb;
  • while(tmp->precedent!=current) {tmp=tmp->precedent;}
  • current=tmp;
  • }
  • }
  • ////////////////////////////////////////////////////////////////
  • int liste_entier::getcurrent()
  • {
  • return current->valeur;
  • }
  • ////////////////////////////////////////////////////////////////
  • int liste_entier::size()
  • {
  • int compt=0;
  • listes *tmp;
  • tmp=nb;
  • while(tmp!=NULL) {
  • compt++;
  • tmp=tmp->precedent;
  • }
  • return compt;
  • }
  • ////////////////////////////////////////////////////////////////
  • void liste_entier::clear()
  • {
  • current=nb;
  • while(current!=NULL)
  • {
  • current=current->precedent;
  • delete nb;
  • nb=current;
  • }
  • }
  • ////////////////////////////////////////////////////////////////
  • ////////////////////////////////////////////////////////////////
  • ////////////////////////////////////////////////////////////////
  • ////////////////////////////////////////////////////////////////
  • ////////////////////////////////////////////////////////////////
  • class mint :public liste_entier
  • {
  • public:
  • //mint(){};
  • mint(char * = 0);
  • void saisie(char *);
  • void affichage();
  • void operator=(mint);
  • void operator=(int);
  • void operator+=(mint);
  • void operator+=(int);
  • void operator++();
  • friend mint operator+(mint,mint);
  • friend mint operator+(mint,int);
  • friend mint operator+(int,mint);
  • int mintcomp(mint,mint);
  • float convertfloat();
  • };
  • ////////////////////////////////////////////////////////////////
  • mint::mint(char *x)
  • {
  • int i=0,c=0;
  • clear();
  • for(i=0;i<strlen(x);i++)
  • if(x[i]-'0'!=0) break;
  • else c++;
  • for(i=c;i<strlen(x);i++)
  • {
  • addtoend(x[i]-'0');
  • }
  • }
  • ////////////////////////////////////////////////////////////////
  • void mint::saisie(char *x)
  • {
  • *this=x;
  • }
  • ////////////////////////////////////////////////////////////////
  • void mint::affichage()
  • {
  • if(nb!=NULL)
  • {
  • int i;
  • listes *tmp;
  • tmp=current;
  • movefirst();
  • for(i=0;i<size();i++)
  • {
  • cout<<getcurrent();
  • movenext();
  • }
  • current=tmp;
  • }
  • }
  • ////////////////////////////////////////////////////////////////
  • void mint::operator=(mint x)
  • {
  • int i;
  • clear();
  • x.movefirst();
  • for(i=0;i<x.size();i++)
  • {
  • addtoend(x.getcurrent());
  • x.movenext();
  • }
  • }
  • ////////////////////////////////////////////////////////////////
  • void mint::operator=(int x)
  • {
  • clear();
  • while(x/10!=0)
  • {
  • addtofront(x%10);
  • x=x/10;
  • }
  • addtofront(x%10);
  • }
  • ////////////////////////////////////////////////////////////////
  • mint operator+(mint x,mint y)
  • {
  • int max=0,min=0,i,a,reste=0,comp=0;
  • mint z;
  • if(x.size()==y.size())
  • {
  • min=x.size();
  • max=y.size();
  • }
  • else
  • if(x.size()>y.size())
  • {
  • max=x.size();
  • min=y.size();
  • comp=1;
  • }
  • else
  • if(x.size()<y.size())
  • {
  • max=y.size();
  • min=x.size();
  • comp=2;
  • }
  • x.movelast();
  • y.movelast();
  • for(i=0;i<min;i++)
  • {
  • a=x.getcurrent()+y.getcurrent()+reste;
  • reste=a/10;
  • z.addtofront(a%10);
  • x.movepreview();
  • y.movepreview();
  • }
  • if(comp==1)
  • for(i=min;i<max;i++)
  • {
  • a=x.getcurrent()+reste;
  • reste=a/10;
  • z.addtofront(a%10);
  • x.movepreview();
  • y.movepreview();
  • }
  • else
  • if(comp==2)
  • for(i=min;i<max;i++)
  • {
  • a=y.getcurrent()+reste;
  • reste=a/10;
  • z.addtofront(a%10);
  • x.movepreview();
  • y.movepreview();
  • }
  • if(reste==1) z.addtofront(1);
  • return z;
  • }
  • ////////////////////////////////////////////////////////////////
  • void mint::operator+=(mint x)
  • {
  • *this=*this+x;
  • }
  • ////////////////////////////////////////////////////////////////
  • void mint::operator+=(int x)
  • {
  • *this=*this+x;
  • }
  • ////////////////////////////////////////////////////////////////
  • void mint::operator++()
  • {
  • *this=*this+1;
  • }
  • ////////////////////////////////////////////////////////////////
  • mint operator+(mint x,int y)
  • {
  • mint z;
  • z=y;
  • return (z+x);
  • }
  • ////////////////////////////////////////////////////////////////
  • mint operator+(int x,mint y)
  • {
  • mint z;
  • z=x;
  • return (z+y);
  • }
  • ////////////////////////////////////////////////////////////////
  • int mintcomp(mint x,mint y)
  • {
  • int i;
  • if(x.size()>y.size()) return 1;
  • else
  • if(x.size()<y.size()) return -1;
  • else
  • {
  • x.movefirst();
  • y.movefirst();
  • for(i=0;i<x.size();i++)
  • {
  • if(x.getcurrent()>y.getcurrent()) return 1;
  • else
  • if(x.getcurrent()<y.getcurrent()) return -1;
  • else {
  • x.movenext();
  • y.movenext();
  • }
  • }
  • return 0;
  • }
  • }
  • ////////////////////////////////////////////////////////////////
  • float mint::convertfloat()
  • {
  • float new_val=0,i;
  • movefirst();
  • for(i=0;i<size();i++)
  • {
  • new_val=(new_val*10)+getcurrent();
  • movenext();
  • }
  • return new_val;
  • }
  • ////////////////////////////////////////////////////////////////
  • ////////////////////////////////////////////////////////////////
  • ////////////////////////////////////////////////////////////////
  • ////////////////////////////////////////////////////////////////
  • void main()
  • {
  • clrscr();
  • mint x("123"),y;
  • y=x+15;
  • y.affichage();
  • getch();
  • }
#include<conio.h>
#include<iostream.h>
#include<string.h>
class liste_entier
{
protected:
struct listes
	    {
	    int valeur;
	    listes *precedent;
	    }*liste,*nb,*current;
public:
liste_entier()
{
nb=NULL;
current=NULL;
}
liste_entier(liste_entier &);
void addtofront(int);
void addtoend(int);
void movefirst();
void movelast();
void movepreview();
void movenext();
int getcurrent();
int size();
void clear();
~liste_entier(){clear();};
};
////////////////////////////////////////////////////////////////
liste_entier::liste_entier(liste_entier &x)
{
	listes *origine,*copie,**precedent;
	origine=x.nb;
	precedent=&nb;
	current=NULL;
	while (origine)
	{
		copie=new listes;
		copie->valeur=origine->valeur;
		*precedent=copie;
		if (x.current==origine)
		current=copie;
		origine=origine->precedent;
		precedent=&(copie->precedent);
	}
	*precedent=NULL;
}
////////////////////////////////////////////////////////////////
void liste_entier::addtofront(int valeur)
{
liste=new listes;
current=nb;
if(nb==NULL) addtoend(valeur);
else
{
while(current->precedent!=NULL) current=current->precedent;
liste->valeur=valeur;
liste->precedent=NULL;
current->precedent=liste;
}
}
////////////////////////////////////////////////////////////////
void liste_entier::addtoend(int valeur)
{
liste=new listes;
if(nb==NULL) {
	     liste->precedent=NULL;
	     liste->valeur=valeur;
	     nb=liste;
	     }
else {
     liste->precedent=nb;
     liste->valeur=valeur;
     nb=liste;
     }
current=nb;
}
////////////////////////////////////////////////////////////////
void liste_entier::movefirst()
{
while(current->precedent!=NULL) current=current->precedent;
}
////////////////////////////////////////////////////////////////
void liste_entier::movelast()
{
current=nb;
}
////////////////////////////////////////////////////////////////
void liste_entier::movepreview()
{
if(current->precedent!=NULL)
current=current->precedent;
}
////////////////////////////////////////////////////////////////
void liste_entier::movenext()
{
if(current!=nb)
{
listes *tmp;
tmp=nb;
while(tmp->precedent!=current) {tmp=tmp->precedent;}
current=tmp;
}
}
////////////////////////////////////////////////////////////////
int liste_entier::getcurrent()
{
return current->valeur;
}
////////////////////////////////////////////////////////////////
int liste_entier::size()
{
int compt=0;
listes *tmp;
tmp=nb;
while(tmp!=NULL) {
		  compt++;
		  tmp=tmp->precedent;
		 }

return compt;
}
////////////////////////////////////////////////////////////////
void liste_entier::clear()
{
current=nb;
while(current!=NULL)
{
current=current->precedent;
delete nb;
nb=current;
}
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
class mint :public liste_entier
{
public:
//mint(){};
mint(char * = 0);
void saisie(char *);
void affichage();
void operator=(mint);
void operator=(int);
void operator+=(mint);
void operator+=(int);
void operator++();
friend mint operator+(mint,mint);
friend mint operator+(mint,int);
friend mint operator+(int,mint);
int mintcomp(mint,mint);
float convertfloat();
};
////////////////////////////////////////////////////////////////
mint::mint(char *x)
{
int i=0,c=0;
clear();
for(i=0;i<strlen(x);i++)
if(x[i]-'0'!=0) break;
else c++;
for(i=c;i<strlen(x);i++)
{
addtoend(x[i]-'0');
}
}
////////////////////////////////////////////////////////////////
void mint::saisie(char *x)
{
*this=x;
}
////////////////////////////////////////////////////////////////
void mint::affichage()
{
if(nb!=NULL)
{
int i;
listes *tmp;
tmp=current;
movefirst();
for(i=0;i<size();i++)
{
cout<<getcurrent();
movenext();
}
current=tmp;
}
}
////////////////////////////////////////////////////////////////
void mint::operator=(mint x)
{
int i;
clear();
x.movefirst();
for(i=0;i<x.size();i++)
{
addtoend(x.getcurrent());
x.movenext();
}
}
////////////////////////////////////////////////////////////////
void mint::operator=(int x)
{
clear();
while(x/10!=0)
{
addtofront(x%10);
x=x/10;
}
addtofront(x%10);
}
////////////////////////////////////////////////////////////////
mint operator+(mint x,mint y)
{
int max=0,min=0,i,a,reste=0,comp=0;
mint z;
if(x.size()==y.size())
		{
		min=x.size();
		max=y.size();
		}
else
if(x.size()>y.size())
	{
	max=x.size();
	min=y.size();
	comp=1;
	}
else
	if(x.size()<y.size())
		{
		max=y.size();
		min=x.size();
		comp=2;
		}
x.movelast();
y.movelast();
for(i=0;i<min;i++)
{
a=x.getcurrent()+y.getcurrent()+reste;
reste=a/10;
z.addtofront(a%10);
x.movepreview();
y.movepreview();
}
if(comp==1)
for(i=min;i<max;i++)
{
a=x.getcurrent()+reste;
reste=a/10;
z.addtofront(a%10);
x.movepreview();
y.movepreview();
}
else
if(comp==2)
for(i=min;i<max;i++)
{
a=y.getcurrent()+reste;
reste=a/10;
z.addtofront(a%10);
x.movepreview();
y.movepreview();
}
if(reste==1) z.addtofront(1);
return z;
}
////////////////////////////////////////////////////////////////
void mint::operator+=(mint x)
{
*this=*this+x;
}
////////////////////////////////////////////////////////////////
void mint::operator+=(int x)
{
*this=*this+x;
}
////////////////////////////////////////////////////////////////
void mint::operator++()
{
*this=*this+1;
}
////////////////////////////////////////////////////////////////
mint operator+(mint x,int y)
{
mint z;
z=y;
return (z+x);
}
////////////////////////////////////////////////////////////////
mint operator+(int x,mint y)
{
mint z;
z=x;
return (z+y);
}
////////////////////////////////////////////////////////////////
int mintcomp(mint x,mint y)
{
int i;
if(x.size()>y.size()) return 1;
else
if(x.size()<y.size()) return -1;
else
{
x.movefirst();
y.movefirst();
for(i=0;i<x.size();i++)
{
if(x.getcurrent()>y.getcurrent()) return 1;
else
if(x.getcurrent()<y.getcurrent()) return -1;
else {
     x.movenext();
     y.movenext();
     }
}
return 0;
}
}
////////////////////////////////////////////////////////////////
float mint::convertfloat()
{
float new_val=0,i;
movefirst();
for(i=0;i<size();i++)
{
new_val=(new_val*10)+getcurrent();
movenext();
}
return new_val;
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
void main()
{
clrscr();
mint x("123"),y;
y=x+15;
y.affichage();
getch();
}

 Conclusion

C'est magnifique !!!!
N'est ce pas ?


 Sources du même auteur

LIBELLER UN NOMBRE ENTIER EN CHAINE DE CARACTÈRE
MASTERMIND
Source avec Zip BISSECTION,SECANTE,NEWTON
L'ALGORITHME DES 8 REINES

 Sources de la même categorie

Source avec Zip KISIEL CD INFO DRIVE par kisiel0147852
Source avec une capture SUPPRESSION DES REDONDANCES DE FICHIERS par cyberntique
Source avec Zip ÉDITEUR DE RECTANGLES EN CONSOLE par seoseo
CONVERSION DE FICHIER EN FICHIER BMP par seoseo
Source avec Zip DETECTEUR EJP par idpro

Commentaires et avis

Commentaire de sibi12 le 10/12/2003 10:59:19

Salut,

bonne idée !!

j'ai voulu faire y a un petit temps la même chose en assembleur mais avec une autre structure. je voulais mettre 2 ou 4 octets avec le nombre d'octet du nombre codé et puis les octet codant ce nombre
enfin soit

J'ai lu en vitesse la source et j'ai juste une question.
si j'ai bien compris tu utilise une liste chainée d'entier représentant un nombre de 0 à 9 pour représenter un nombre entier. mais t'as une grosse perte de mémoire à cause de ça. tu utilise 32bit pour coder un nombre codable sur 4 donc ta classe est très facilement améliorable. donc pourquoi pas travailler sur des char en avec des nombres de 0 à 0xff. ça demande un peu plus de travial mais ton code serai mieu "standardiser" même si on est loin très loin du compte

Tu pouvais aussi utiliser la STL pour alléger ton code
je crois aussi que quelque ligne d'assembleur pourrait fare des merveille ici

donc beaucoup de chose à améliorer sinon bonne idée

allez salut

Commentaire de Kirua le 10/12/2003 12:57:18

operator= doit retourner une référence sur l'objet:

&MINT operator= { ... return *this; }

il y a trop de pertes si j'en crois le message de sibi, tu pourrais stocker le nombre sur un nombre variable de bits grâce aux bools dans une liste chaînée (enfin, plus simplement avec list, ou vector de la STL)

Commentaire de monssif007 le 13/03/2009 20:34:11

bonne idée ,mais bon ta pas fait le constructeur de copie pour la la classe fille MINT aussi que  le destructeur^^

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,139 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales