DragonFly Opublikowano 23 Czerwca 2005 Zgłoś Opublikowano 23 Czerwca 2005 (edytowane) Witam Robie sobie kalkulator ktory wykonuje dzialania na bardzo duzych liczbach w roznych kodach. Wpisujac podstawe 2, 10 lub 16 wybieramy system liczb. Udalo mi sie zrobic dodawanie i odejmowanie z tym ze w kodzie dziesietnym wywala mi sie jesli liczby roznia sie iloscia cyfr gdzie jest blad?? A tak bym zapomnial prosilbym o pomoc przy wstawieniu tu sprawnego mnozenia i dzielenia duzych liczb bo ja jak narazie nei mam zielonego pojecia jak to zrobic... oto kod: http://c03b.info/m/calc.cpp #include <stdio.h>#include <iostream> //Przy wprowadzaniu z klawiatury dlugosc bufora musi byc znana i stalausing namespace std;typedef struct cyfra //Jeden element listy przechowuje jedna cyfre { int wartosc; //Wartosc cyfr cyfra *next; //Wskaznik na nastepny element listy (starsza cyfre) cyfra *prev; //Wskaznik na poprzedni element listy (mlodsza cyfre) };void dopisz(cyfra **root, cyfra **tail, int wartosc) //Dodaje element (cyfre) do listy - na poczatek, czyli obecnie najmlodsza { if ((*root)==NULL) { (*root)=new cyfra; (*root)->wartosc=wartosc; (*root)->next=NULL; (*root)->prev=NULL; (*tail)=(*root);// cout << "pierwsza dodana\n"; } else { (*root)->prev=new cyfra; (*root)->prev->next=(*root); (*root)=(*root)->prev; (*root)->wartosc=wartosc; (*root)->prev=NULL; } }void wprowadz(cyfra **root, cyfra **tail, int podstawa) { char l; l=cin.get(); while (l!=10) { dopisz (root, tail, strtol((const char *)&l, (char **)NULL, podstawa)); l=cin.get(); } //l=(char *)malloc(10000); //Staly bufor wprowadzania //char p[2];// cout << "Wpisz liczbe: "; //cin >> l;// while (*l!=0) // { // strncpy(p,l,1); // dopisz(root, tail, strtol((const char *)p, (char **)NULL, podstawa)); // l++; // } }cyfra *dodaj(cyfra *skl1, cyfra *skl2, int podstawa) //skladnik, skladnik, wynik, zwraca wsk na ostatni element wyniku { cyfra *wynik=NULL; int przeniesienie=0; int suma=0; do { if (wynik==NULL) { wynik=new cyfra; wynik->next=NULL; } else { wynik->next=new cyfra; wynik->next->prev=wynik; wynik=wynik->next; wynik->next=NULL; } suma=przeniesienie; przeniesienie=0; if (skl1!=NULL) {// cout << "a1:" << skl1->wartosc; suma+=skl1->wartosc; skl1=skl1->next; } if (skl2!=NULL) { suma+=skl2->wartosc; skl2=skl2->next; } if (suma>=podstawa) { przeniesienie=1; suma-=podstawa; } wynik->wartosc=suma;// cout <<"s:"<<suma<<"p:"<<przeniesienie<<"\n"; } while ( (skl1!=NULL || skl2!=NULL) || przeniesienie !=0 ); return wynik; }cyfra *pomnoz(cyfra *cz1, cyfra *cz2, int podstawa) { int przeniesienie=0; int suma=0; cyfra *p1, *p2; }int porownaj (cyfra *arg1, cyfra *arg2) //porownuje dwie liczby { int wynik=0; //porownuje od tylu (od najmlodszej) while (arg1!=NULL && arg2!=NULL) //Poki jedna z liczb sie nie skonczy { if (arg1->wartosc==arg2->wartosc) //Jesli sa rowne to nastepna cyfra { arg1=arg1->next; arg2=arg2->next; } else //jesli nie { if (arg1->wartosc > arg2->wartosc) { wynik=-1; //to na razie 1 jest wieksza } else { wynik=1; // 2 } } arg1=arg1->next; //i dalej arg2=arg2->next; } if (arg1==NULL && arg2==NULL) //a jesli jedna sie skonczyla { return wynik; } if (arg1==NULL) { return -1; //to zalezy ktora } else { return 1; //i ta ktora pierwsza sie skonczyla to jest mniejsza } return wynik; }cyfra *odejmij(cyfra *arg1, cyfra *arg1t, cyfra *arg2, cyfra *arg2t, int podstawa) //Odejmuje tylko mniejsza od wiekszej... {// cout << porownaj(arg1, arg2) << "\n"; // pause(); int znak=0; if (porownaj(arg1, arg2)==-1) //... wiec najpierw porownuje { cyfra *tmp; // I w razie potrzeby zamienia miejscami argumenty tmp=arg1; arg1=arg2; arg2=tmp; znak=1; } cyfra *wynik=NULL; int przeniesienie=0; int suma=0; do { if (wynik==NULL) //Pierwszy element listy { wynik=new cyfra; wynik->next=NULL; } else //kolejne elementy (trzeba dowiazac do poprzedniego) { wynik->next=new cyfra; wynik->next->prev=wynik; wynik=wynik->next; wynik->next=NULL; } suma=przeniesienie; przeniesienie=0; if (arg1!=NULL) {// cout << "a1:" << skl1->wartosc; suma+=arg1->wartosc; arg1=arg1->next; } if (arg2!=NULL) { suma-=arg2->wartosc; arg2=arg2->next; } if (suma<0) { przeniesienie=-1; suma+=podstawa; } wynik->wartosc=suma;// cout <<"s:"<<suma<<"p:"<<przeniesienie<<"\n"; } while ( (arg1!=NULL || arg2!=NULL) || przeniesienie !=0 ); if (znak==1) { wynik->wartosc=-wynik->wartosc; } return wynik; }void wyswietl(cyfra *liczba) //Pobiera wsk na ostatni element { while (liczba!=NULL) //Wyswietla liczbe od 'konca' czyli od najstarszej cyfry { switch (liczba->wartosc) //Jesli wartosc jest > 9 to wypisuje odpowiednie litery { case 10: cout << "a"; break; case 11: cout << "b"; break; case 12: cout << "c"; break; case 13: cout << "d"; break; case 14: cout << "e"; break; case 15: cout << "f"; break; default: //jesli < 10 to po prostu liczbe (cyfre) cout << liczba->wartosc; break; } liczba=liczba->prev; } cout << "\n"; }int main(int argc, char *argv[]){//Wskazniki na odpowiedniocyfra *arg1=NULL, *arg2=NULL, *arg1t=NULL, *arg2t=NULL;//poczatek listy 1 liczby, poczatek listy 2 liczby//koniec listy 1 liczby, koniec listy 2 liczbycyfra *wynik=NULL, *wynikt=NULL;//poczatek listy wyniku, koniec listy wynikuint podstawa;char dzialanie;cout << "Podstawa: ";cin >> podstawa;cin.get(); //wylapuje <LF> z wprowadzania podstawycout << "Pierwszy argument: ";wprowadz(&arg1, &arg1t, podstawa);cout << "Drugi argument : ";wprowadz(&arg2, &arg2t, podstawa);cout << "Dzialanie (+/-/*):";cin >> dzialanie;if (dzialanie=='-') { wynik=odejmij(arg1, arg1t, arg2, arg2t, podstawa); }if (dzialanie=='+') { wynik=dodaj(arg1, arg2, podstawa); } cout << "Wynik : "; wyswietl(wynik);cin.get();cin.get();return 0;} Edytowane 23 Czerwca 2005 przez DragonFly Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...