Avatar billede thomas_nj Nybegynder
18. december 2003 - 17:46 Der er 7 kommentarer og
1 løsning

Kritik af kode

Hej eksperter

  Som en lille opgave til mig selv har jeg lavet et program der kan oversætte fra vores titalsystem til et hvilket som helst andet.
  Koden virker som den skal men da jeg er nybegynder vil jeg blive meget glad hvis en mere erfaren gider kigge lidt på den og give kritik.



#include <iostream>
#include <cstdlib>
#include <string>
#include <inttypes.h>

using namespace std;

class radix
{
public:

  radix(string);
  ~radix(void);
  string convert(int64_t);
 
private:

  int64_t pow_re(int, int);            // power recon
  int num_mul(int64_t, int64_t);      // number of multiplications
  string signs;                        // The signs to be used
  int base_number;         
}; 



int main()
{
    radix hex("0123456789abcdef");
    hex.convert(14);
    hex.convert(22);
    //etc.
    system("pause");
    return 0;
}





radix::radix(string signs)
{
    this->signs=signs;
    base_number=signs.size();
}



radix::~radix(void)
{

}



int64_t radix::pow_re(int number, int exponent)
{
    int64_t answer=1;
   
    if(exponent<0)
    {
        return 0;
    }
   
    if(exponent ==0)
    {
        return 1;
    }
   
    else
    {
        for( int counter=1; counter<=exponent; counter++)
        {
                    answer=answer*number;
        }
    return answer;
    }
}



int radix::num_mul(int64_t number, int64_t mul_fi )
{
    int nu_ti; // Number of times
    number=number-(number%mul_fi);
    nu_ti = number / mul_fi;
    return nu_ti;
   
   
}



string radix::convert(int64_t number)
{
    string con_num; // Converted number
    int max_exponent;
    int64_t rest = number;
    int64_t temp;
   
   
    if( number<0)
    {
        number = number*-1;
    }
   
    for(max_exponent=0; pow_re(base_number, max_exponent)<=number; max_exponent++)
    {
   
    }
    max_exponent--;
   
    for(max_exponent; max_exponent>=0; max_exponent--)
    {
        temp = pow_re(base_number, max_exponent);
        con_num.push_back(signs[num_mul(rest, temp)]);
        rest = rest-temp*num_mul(rest, temp);
     
    }
   
    return con_num; 
}
Avatar billede arne_v Ekspert
18. december 2003 - 18:18 #1
1)

Din navne konvention er meget C'sk.

Det er ikke nødvendigvis skidt - det er er et valg.

Man kan vælge at kapitalisere (MaxExponent i.s.f. max_exponent),
hvilket nok er lidt mere C++'sk.

Man kan også vælge den afskyelige ungarske navngivning.
Avatar billede arne_v Ekspert
18. december 2003 - 18:20 #2
2)

Lidt flere kommentarer ville ikke skade

3)

signs giver associationer til fortegn - jeg ville nok have valgt digits
Avatar billede arne_v Ekspert
18. december 2003 - 18:21 #3
4)

Jeg tror at algoritmen kan optimeres meget.
Avatar billede arne_v Ekspert
18. december 2003 - 18:27 #4
re 4)

Til inspiration:

#include <iostream>
#include <string>
#include <cstring>

using namespace std;

string xitoa(int v, char *digits)
{
  int radix = strlen(digits);
  string res = "";
  int tmp = v;
  while(tmp>0)
  {
      res = digits[tmp%radix] + res;
      tmp = tmp / radix;
  }
  return res;
}

int main()
{
  cout << xitoa(14,"0123456789ABCDEF") << endl;
  cout << xitoa(22,"0123456789ABCDEF") << endl;
  return 0;
}
Avatar billede thomas_nj Nybegynder
18. december 2003 - 19:59 #5
arne_v -> Det virker fint men kan ikke helt gennemskue denneher. Ved godt hvad det hele betyder, men det er en lidt underlig måde i forhold til hvordan jeg plejer at regne om i andre talsystemer. Har du en lille kort forklaring?

  while(tmp>0)
  {
      res = digits[tmp%radix] + res;
      tmp = tmp / radix;
  }
Avatar billede arne_v Ekspert
18. december 2003 - 20:13 #6
Tricket er at tage cifrene bagfra !

  while(tmp>0)  // sålænge der er noget tilbage
  {
      res = digits[tmp%radix] + res; // res = sidste ciffer af tmp + res
      tmp = tmp / radix; // tmp = alle cifre undtagen det sidste af tmp
  }
Avatar billede segmose Nybegynder
19. december 2003 - 10:25 #7
Når jeg ser sådan en klasse får jeg straks lyst til at gemme ting i den, og regne med den.

fx.
string operator() { /* som convert */ } // class as function.

så man kan lave:

cout << hex(17) << endl;
Avatar billede thomas_nj Nybegynder
21. juni 2004 - 22:47 #8
Laver et nyt spørgsmål med point
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis