wytłumaczenie kodu

0

czy ktoś był by mi wstanie wytłumaczyć każdą linijkę kodu tak dokładnie co ona robi ?
ma to przeliczać dowolny kod na taki jaki chcemy

#include<iostream>
#include<string>

using namespace std;

long pot(int p, int w)
{
long wynik=1;
for(int i=0; i<w; i++)
    wynik=wynik*p;

    return wynik;

}

int z2na10(string L)
{
    int suma=0;
    for(int i=0;i<L.size();i++)
    suma=suma+(L[L.size()-1-i]-48)*pot(2, i);

    return suma;


}

int zDOWna10(string L,int p)
{
    int suma=0;
    for(int i=0;i<L.size();i++)
    if((L[L.size()-1-i]-55)>9)
    suma=suma+(L[L.size()-1-i]-55)*pot(p, i);
    else
    suma=suma+(L[L.size()-1-i]-48)*pot(p, i);

    return suma;


}

string z10na2(int L)
{
    int R;
    string wynik="";
    while(L!=0)
    {
    R=L%2;
    L=L/2;
    wynik=char(R+48)+wynik;
    }
    return wynik;
}

string z10naDOW(int L, int p)
{
    int R;
    string wynik="";
    while(L!=0)
    {
    R=L%p;
    L=L/p;
    wynik=char(R+48)+wynik;
    }
    return wynik;
}

string zDOWnaDOW(int p_1, string licz,int p_2)
{
 return z10naDOW(zDOWna10(licz,p_1),p_2);
}

string z2na4(string L)
{
   string pom, pom5;
   int pom3, pom4;
   while(L.size()%2!=0)
    L='0'+L;
   for(int i=1; i<L.size();i=i+2)
   {
       pom3=L[L.size()-i]*1;
       pom4=L[L.size()-1-i]*2;
       pom=pom4+pom3-(48*2);
       pom5=pom+pom5;
    }
    return pom5;
}

string z2na8(string L)
{
   string pom, pom5;
   int pom3, pom4, pom6;
   while(L.size()%3!=0)
    L='0'+L;
   for(int i=1; i<L.size();i=i+3)
   {
       pom3=L[L.size()-i]*1;
       pom4=L[L.size()-1-i]*2;
       pom6=L[L.size()-2-i]*4;
       pom=pom4+pom3+pom6-(48*6);
       pom5=pom+pom5;
    }
    return pom5;
}

string z2na16(string L)
{
   string pom, pom5;
   int pom3, pom4, pom6, pom7;
   while(L.size()%4!=0)
    L='0'+L;
   for(int i=1; i<L.size();i=i+4)
   {
       pom3=L[L.size()-i]*1;
       pom4=L[L.size()-1-i]*2;
       pom6=L[L.size()-2-i]*4;
       pom7=L[L.size()-3-i]*8;
       if(pom4+pom3+pom6+pom7-(48*14)<58)
       pom=pom4+pom3+pom6+pom7-(48*14);
       else
        pom=pom4+pom3+pom6+pom7-(48*14-7);

       pom5=pom+pom5;
    }
    return pom5;
}


//---------------------------------------------------------------------------------------
int main ()
{
    string y;
    //int x, z;
    cin >>  y;
    //cin >> n;
    cout << z2na16(y) << endl;
}
4

Nie no, jak Chcesz pomocy za darmo, to Włóż trochę pracy w temat. Rozumiesz z tego cokolwiek? Opisz te funkcje, co one mają robić? Tak się nie da, pytanie o wytłumaczenie i kilka ekranów kodu.

Na początek, zanim to, ewentualnie, wyląduje w koszu:), wytłumaczę Ci pierwszą, na bazie tego Powinnaś być w stanie przeanalizować resztę.
pot zwraca p do potęgi w, bardzo nieefektywnie, w czasie liniowym zamiast logarytmicznego, ale jak tak może być, to spoko.
z2na10 konwertuje liczbę w systemie dwójkowym (jako string) na dziesiętną, iterując i od zera do długości wejścia minus 1, w środku akumulując zmienną suma (która będzie zwróconym integerem w systemie dziesiętnym), w następujący sposób:
L[L.size()-1-i]-48 - tu dzieje się kilka rzeczy: L[L.size()-1-i] to znak, odejmujemy 48 (integera), więc kompilator castuje wynik na int, a ten będzie, zgodnie z ASCII jeden lub zero(1 dla '1' i 0 dla '0'), po czym mnożymy przez odpowiednią potęge dwójki (L.size() - 1 odwraca pętlę, więc zaczynamy od dwa do zerowej), w efekcie, dostajemy właściwy wynik:
11 - > 1 * 2^0 + 1 * 2^1 = 3.

1

I kto to pisał? Zwyczajnie ręce poobcinać z dożywotnim zakazem wykonywaniem zawodu! Z dowolnego 2..36 na dowolny 2..36 dla liczb nawet 1000000 cyfrowych tylko tyle:

http://forum.4programmers.net/1005274
#include <string.h>

char *sysconv(unsigned sysin,unsigned sysout,const char *in,char *out)
  {
   static char digits[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   unsigned p,m;
   char *end,*pos,tmp;
   for(*out='0',end=out+1;*in;++in)
     {
      p=strchr(digits,toupper(*in))-digits;
      for(pos=out;pos<end;*(pos++)=digits[m-(p=m/sysout)*sysout]) m=(strchr(digits,*pos)-digits)*sysin+p;
      while(p) *(end++)=digits[m-(p=(m=p)/sysout)*sysout];
     }
   for(*end=0,pos=out;pos<end;tmp=*(--end),*end=*pos,*(pos++)=tmp) {}
   return out;
  }

int main()
  {
   unsigned sysin,sysout;
   static char in[1024],out[36*1024];
   for(;;)
     {
      printf("\rsystem wejsciowy: ");
      scanf("%u",&sysin);
      printf("\rsystem wyjsciowy: ");
      scanf("%u",&sysout);
      printf("\rliczba wejsciowa: ");
      scanf(" %1023s",in); // wypada jeszcze sprawdzić czy to poprawna liczba w systemie sysin ale to banał
      if(2>sysin||sysin>36||2>sysout||sysout>36) return 0;
      printf("\rliczba wyjsciowa: %s\n\n",sysconv(sysin,sysout,in,out));
     }
  }

7 razy więcej kodu z systemu 2..10 na system 2..10 dla liczb mieszczących się w int - to jakiś żart?

1 użytkowników online, w tym zalogowanych: 0, gości: 1