Witam, mam taki fajny temat projektu, może komuś przyda się to co już napisałem a może ktoś znajdzie tam jakieś błędy lub zechce dopisać dzielenie.
Założenia są takie:
*liczba jest przechowywana w klasie jako tablica bajtów, po jednym bajcie na pozycję
*klasa zawiera podstawowy interfejs do operacji na liczbie
*działania są realizowane przez zewnętrzne funkcje (nie metody klasy)
*reprezentacja liczb jest stałoprzecinkowa bez znaku
Założenia są takie:
*liczba jest przechowywana w klasie jako tablica bajtów, po jednym bajcie na pozycję
*klasa zawiera podstawowy interfejs do operacji na liczbie
*działania są realizowane przez zewnętrzne funkcje (nie metody klasy)
*reprezentacja liczb jest stałoprzecinkowa bez znaku
//---------------------------------------------------------------------------
#include <stdlib>
#include <string>
#include <stdio>
//---------------------------------------------------------------------------
class liczba
{
private:
char* tbl;
int dl;
public:
liczba(const char*);
liczba(const int=0);
~liczba();
void set(const char*);
void setpos(const char, const int);
char getpos(const int)const;
char* get()const;
int getlen()const;
void print()const;
};
liczba::liczba(const char* _tbl)
{
dl=strlen(_tbl);
int i=0, lz=0;
while(_tbl[i]=='0'&&i<dl) {lz++; i++;};
if((dl-lz)==0) lz--;
tbl=new char[dl-lz];
for(int i=0; i<dl-lz; i++)
tbl[i]=_tbl[i+lz]-'0';
dl-=lz;
}
liczba::liczba(const int _dl): dl(_dl)
{
tbl=new char[dl];
}
liczba::~liczba()
{
delete [] tbl;
}
void liczba::set(const char* _tbl)
{
delete [] tbl;
dl=strlen(_tbl);
int i=0, lz=0;
while(_tbl[i]=='0'&&i<dl) {lz++; i++;};
if((dl-lz)==0) lz--;
tbl=new char[dl-lz];
for(int i=0; i<dl-lz; i++)
tbl[i]=_tbl[i+lz]-'0';
dl-=lz;
}
void liczba::setpos(const char x, const int i)
{
tbl[i]=x;
}
char liczba::getpos(const int i)const
{
if(i<dl&&i>=0) return tbl[i];
return 0;
}
char* liczba::get()const
{
return tbl;
}
int liczba::getlen()const
{
return dl;
}
void liczba::print()const
{
for(int i=0; i<dl; i++)
printf("%d", tbl[i]);
}
//---------------------------------------------------------------------------
char* suma(const liczba& a, const liczba& b)
{
int dlmax;
if(a.getlen()>=b.getlen()) dlmax=a.getlen();
else dlmax=b.getlen(); // ustalenie dlugosci dluzszego czynnika
char* c=new char[dlmax+2]; // rezerwacja pamieci na wynik z uwzgletnieniem znaku terminujacego
//-------------------zerowanie i terminowanie zmiennej, bedzie przekazana jako c-string--
for(int i=0; i<dlmax+1; i++)
c[i]='0';
c[dlmax+1]='\0';
//---------------------------------------------------------------------------------------
char x=0, cr=0;
//-------------------petla sumowania cyfr------------------------------------------------
for(int i=0; i<dlmax; i++){
x=a.getpos(a.getlen()-1-i)+b.getpos(b.getlen()-1-i)+cr;
//--------obsluga przeniesienia--------
if(x>9){
x-=10;
cr=1;}
else cr=0;
//-------------------------------------
c[dlmax-i]=x+'0';}
//--------------------------------------------------------------------------------------
c[0]=cr+'0'; // dopisanie ewentualnego przeniesienia
return c;
}
char* roznica(const liczba& a, const liczba& b)
{
int dlmax;
if(a.getlen()>=b.getlen()) dlmax=a.getlen();
else dlmax=b.getlen(); // ustalenie dlugosci najdluzszego czynnika
char* c=new char[dlmax+1]; // rezerwacja pamieci na wynik
//-------------------zerowanie i terminowanie zmiennej, bedzie przekazana jako c-string--
for(int i=0; i<dlmax; i++)
c[i]='0';
c[dlmax]='\0';
//---------------------------------------------------------------------------------------
signed char x=0, cr=0;
//-------------------petla odejmowania cyfr------------------------------------------------
for(int i=0; i<dlmax; i++){
x=a.getpos(a.getlen()-1-i)-b.getpos(b.getlen()-1-i)-cr;
//-------------------obsluga pozyczki------------------
if(x<0){
x+=10;
cr=1;}
else cr=0;
//-----------------------------------------------------
c[dlmax-1-i]=x+'0';}
return c;
}
//------------------------funkcja treningowa, brak komentarzy-----------------------------
char* ilzcyfr(const liczba& a, const char& b)
{
int dlmax=a.getlen();
char* c=new char[dlmax+2];
for(int i=0; i<dlmax+1; i++)
c[i]='0';
c[dlmax+1]='\0';
char x=0, cr=0;
for(int i=0; i<dlmax; i++){
x=a.getpos(a.getlen()-1-i)*b+cr;
if(x>9){
cr=x/10;
x=x%10;}
else cr=0;
c[dlmax-i]=x+'0';}
c[0]=cr+'0';
return c;
}
//----------------------------------------------------------------------------------------
char* iloczyn(const liczba& a, const liczba& b)
{
int dla=a.getlen();
int dlb=b.getlen();
char* c=new char[dla+dlb+2]; // wynik jest niedluzszy niz suma dlugosci obydwu cyfr
for(int i=0; i<dla+dlb+2; i++)
c[i]=0;
c[dla+dlb+1]='\0';
char* temp=new char[dla+dlb+1]; // zmienna pomocnicz przechowyjaca wynik mnozenia przez pojedyncza cyfre
for(int i=0; i<dla+dlb; i++)
temp[i]=0;
char x=0, cr=0; // zmienne pomocnicze
//--------------------------------petla cyfr drugiego czynnika---------------------------
for(int j=0; j<dlb; j++){
//-----------------------petla cyfr pierwszego czynnika--------------------------
for(int i=0; i<dla; i++){
x=a.getpos(a.getlen()-1-i)*b.getpos(b.getlen()-1-j)+cr;
//-------obsluga przeniesienia-----------------------------------
if(x>9){
cr=x/10;
x=x%10;}
else cr=0;
//---------------------------------------------------------------
temp[dla+dlb-j-i-1]=x;}
temp[dlb-1-j]=cr; // dopisanie ewentualnego przeniesienia
x=0, cr=0; // zerowanie wykorzystanych zmiennych pomocniczych
//-------------------------------petla sumowania wynikow mnozen przez kolejne cyfry------
for(int k=0; k<dla+dlb; k++){
x=temp[dla+dlb-1-k]+c[dla+dlb-k]+cr;
temp[dla+dlb-1-k]=0;
//-------obsluga przeniesienia-----------------------------------
if(x>9){
x-=10;
cr=1;}
else cr=0;
//---------------------------------------------------------------
c[dla+dlb-k]=x;}
c[0]=cr; // dopisanie przeniesienia
x=0, cr=0; // zerowanie wykorzystanych zmiennych pomocniczych
}
//-------------------------------petla konwersji wartosci wyniku na string---------------
for(int i=0; i<dla+dlb+1; i++)
c[i]+='0';
//---------------------------------------------------------------------------------------
delete [] temp; // usuniecie zmiennej pomocniczej
return c;
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
char* wpis=new char[255];
char* wynik;
liczba c;
//string wpis;
printf("a=");
scanf("%s", wpis);
liczba a(wpis);
printf("b=");
scanf("%s", wpis);
liczba b(wpis);
delete [] wpis;
printf("\n");
a.print();
printf(" + ");
b.print();
printf(" = ");
wynik=suma(a, b);
c.set(wynik);
delete [] wynik;
c.print();
printf("\n");
a.print();
printf(" - ");
b.print();
printf(" = ");
wynik=roznica(a, b);
c.set(wynik);
delete [] wynik;
c.print();
printf("\n");
a.print();
printf(" * ");
b.print();
printf(" = ");
wynik=iloczyn(a, b);
c.set(wynik);
delete [] wynik;
c.print();
printf("\n");
system("pause");
return 0;
}
//---------------------------------------------------------------------------