Witam.

Jakiś czas i tutaj prosiłem o pomoc.

Od tego czasu programy się rozwinęły i już jako tako działają.

Zamieszczam je do przetestowania i wypisania wszystkich znalezionych błędów oraz zaleceń.

Proponował bym nie skupianie się na strukturze programu a na wyłapaniu jego błędów.

Zostanie on opublikowany dla innych potrzebujących.

Jedyna opcja jakiej brakuje to konwersja do i z ujemnych liczb typu hex etc.

Pozdrawiam i liczę na odezw.

Prośba do moderatora o zamiane kodów na załączniki jeśli się da.

Wersja dla c++:

Kod
//#include<stdafx.h>
#include <cmath>
#include <iostream>
#include <string>
#include <cctype>      // for toupper, isdigit

using namespace std;


// zamienia napis na liczbŕ
bool NaLiczbe(const char *n, long int &ul)
{
    long int i;
    for(i=0; isdigit(*n); n++)
  i = i *10 +(*n - '0');
    if(*n)
  return false;
    ul = i;  
    
    return true;
}

// pyta siŕczy zako˝czyŠ  dzia-anie programu
bool Koniec()
{
    string s;

    cout << "Skonczyc przeliczena ? (T = TAK)";
    cin >> s;

    return ((s != "") && (toupper(s[0]) == 'T'));
}


// sprawdza czy sÜ dobre dane
bool DaneOK(string s, long p1, long p2)
{
    bool przecinek = false;
    long i,c;

    if((p1 < 2) || (p1 > 36) || (p2 < 2) || (p2 > 36))
  return false;

    for(i = 0; i < long(s.length()); i++)
    {
  s[i] = toupper(s[i]);
  if(s[i] == ',')
  {
      if(przecinek)
    return false;

      przecinek = true;
      continue;
  }

  if(    ((s[i] > ('0' - 1)) && (s[i] < ('9' + 1)))
      || ((s[i] > ('A' - 1)) && (s[i] < ('Z' + 1))) )
  ;
  else
      return false;

  c = s[i] - 48;
  if(c > 9)
      c -= 7;
     if(c >= p1)
      return false;
    }
    return true;
}
void convert_to_tc(int val, int* tc)
{
    for (int i = 0; i < 8; ++i)    /* eight bits only */
    {
        tc[i] = val&1;    /* test lowest bit of val */
        val >>= 1;        /* shift val down a bit */
    }

}
string Konwertuj(string s1,long p1, long p2)
{
    long  c,i,Lc,Lu,w;
    double      rLu;
    bool        u;
    string  s2;

    Lc = Lu = 0;
    w = 1;
    u = false;


    for(i = 0; i < long(s1.length()); i++)
    {
  s1[i]    = toupper(s1[i]);
  if(s1[i] == ',')
      u = true;
  else
  {
      // sprawdzanie czy jest jaka? litera i je?li tak to zamie˝
      // na jej odpowiednik w systemie dziesiŕtnym
      if( (s1[i] > ('A'-1)) && (s1[i] < ('Z' +1)))
    c    = s1[i] - 'A' + 10;
      else
    c = s1[i] - '0';
      if(u)
      {
    Lu = p1 * Lu + c;
    w  *= p1;
      }
      else
    Lc = p1 * Lc + c;
  }
    }

    rLu = (double)(Lu) / w;
    s2 = "";
    do
    {
  c  = Lc % p2;
  if(c < 10)
      s2 = (char)(c + 48) + s2;
  else
      s2 = (char)(c + 55) + s2;    
  Lc /= p2;
    } while(Lc);

    if(Lu)
    {
  s2 += ',';
  while(s2.length() < 32)
  {
      rLu *= p2;
      c    = (unsigned long)floor(rLu);
      if(c < 10)
    s2 += (char)(c + 48);
      else
    s2 += (char)(c + 55);
      rLu = rLu - c;
  }
  while(s2[s2.length()-1] == '0')
      s2.erase(s2.length()-1);
    }
    return s2;
}
string KonwertujBCD(string s, long p1, long p2, bool z)
{
    string s2 = "";
    char*    ss;
    char*    t;

    char * p = new char[ s.length() + 1 ];
    strcpy( p, s.c_str() );

    long hex  = strtol(p, &ss, 2);
  
    if(z)
    {
  // konwersja z kodu BCD
    }
    else
    {
  char* c1 = new char[4];
  string s1 =  Konwertuj(s,2,10);
  int i = 0;
  while(s1.length() > i)
  {
      sprintf(c1, "%04d", atoi(Konwertuj(s1.substr(i,i+1),10,2).c_str()));
      s2 += c1;
      i++;
  }
    }
    return s2;
}

string KonwertujU1(string s, long p1, long p2, bool z)
{
    string s2 = "";
    char    buffer[33];
    char*    ss;

    long hex  = strtol(s.c_str(), &ss, 2);
  
    if(z)
    {
  hex = ~hex;
  itoa(hex,buffer,2);
  string l = buffer;
  l = l.substr(l.length()-s.length(),s.length());
  s2 = Konwertuj(l,2,p2);
    }
    else
    {
  hex = ~hex;
  itoa(hex,buffer,2);
  s2 = buffer;
  s2 = s2.substr(s2.length()-s.length()-1,s.length()+1);
    }
    
    return s2;
}
string KonwertujU2(string s, long p1, long p2, bool z)
{
    string s2 = "";
    char    buffer[33];
    char*    ss;

    long hex  = strtol(s.c_str(), &ss, 2);
  
    if(z)
    {
  hex = ~hex + 1;
  itoa(hex,buffer,2);
  string l = buffer;
  l = l.substr(l.length()-s.length(),s.length());
  s2 = Konwertuj(l,2,p2);
    }
    else
    {
  hex = ~hex + 1;
  itoa(hex,buffer,2);
  s2 = buffer;
  s2 = s2.substr(s2.length()-s.length()-1,s.length()+1);
    }
    
    return s2;
}
// g-owa funckja
int main(void)
{
    char  buf[256] = {0};    // bufor do pobrania podstaw, a potem zamiany na liczby
    long  p1,p2;
    string      s1,s2;
    bool  isMinus    = false;      // zmienna do sprawdzania czy jest znak minus
    bool  isp2Minus=false;      

    cout <<
  "\n==========================================================================
===="
  "          Przelicznanie liczb zapisanych w roznych systemach pozycyjnych"
  "\n==========================================================================
=====\n"
  "(C)2005 Siemiatkowska Dorota, Slomiany Jaroslaw, Szczuplinski Tomasz SWPW Plock"
  "\n==========================================================================
=====\n";
          
    do{
  isMinus = false;
  // manipulacja na liczbie wej?ciowej
  cout << "\nPodaj liczbe wejsciowa   = "; cin >> s1;
  if(s1[0] == '-')
  {
      // obcinamy znak minus (-), i zaznaczamy isMinus na prawde
      s1 = s1.substr(1);
      isMinus    = true;
  }
  
  // manipulacja na podstawie jakÜ jest liczba wej?Šiowa
  cout << "\nPodaj podstawe wejsciowa = "; cin >> buf; cin.ignore(1024, '\n');
  if(!NaLiczbe(buf, p1))
  {
      cout <<
    "\nZle dane. Obliczenia przerwane. Jako podstawe wejsciowa wpisano znak.\n"
    "Wprowadz liczbe!!\nWybierz N i ponownie wprowadz dane!.\n" << endl;
      continue;
  }
  else if( p1 < 2 || p1 > 36)
  {
      cout <<
    "\nZle dane. Obliczenia przerwane.\nMusisz podac liczbe z zakresu 2-36!.\n"
    "Wybierz N i ponownie wprowadz dane!.\n" << endl;
      continue;
  }
  
  // manipulacja na podstawie jakÜ bŕdzie liczba wyj?Šiowa
  cout << "\nPodaj podstawe docelowa  = "; cin >> buf; cin.ignore(1024, '\n');
  if(!NaLiczbe(buf, p2))
  {
      cout <<
    "\nZle dane. Obliczenia przerwane. Jako podstawe docelowa wpisano znak.\n"
    "Wprowadz liczbe!!\nWybierz N i ponownie wprowadz dane!.\n" << endl;
      continue;
  }
  else if( p2 < 2 || p2 > 36)
  {
      cout <<
    "\nZle dane. Obliczenia przerwane.\nMusisz podac liczbez zakrsu 2-36!.\n"
    "Wybierz N i ponownie wprowadz dane!.\n" << endl;
      continue;
  }

  cout << endl;
  
  if(p2 == 2)
      isp2Minus    = true;
    
  // tutaj sÜ ca-e przekszta-cenia, doda-em bym wiŕcej komentzarzy
  // ale ten kawa-ek to nie do mnie nale¬y
  if(DaneOK(s1,p1,p2))
  {

      s2 = Konwertuj(s1,p1,p2);

      cout << (isMinus?"-":"") << s1 << "(" << p1 << ") = " << ((isMinus&& !isp2Minus) ? "-":"") <<  s2 << "(" << p2 << ")";
      if(p2 == 2)
      {
    cout << " " <<  KonwertujBCD(s2,p1,p2,false) << "(BCD) ";
    if(isMinus)
    {
        cout << KonwertujU1(s2,p1,p2,false) << "(U1) ";
        cout << KonwertujU2(s2,p1,p2,false) << "(U2)";
    }
      }
      else if(p1 == 2)
      {
    cout << "z U1 = "<< KonwertujU1(s1,p1,p2,true) << " z U2 = " << KonwertujU2(s1,p1,p2,true);
      }
      cout << "\n";
  }    
  else
  {
      cout <<
    "Zle dane. Obliczenia przerwane.\nJako liczbe do zamiany podano znak z poza zakresu 0-9 lub a-z.\n"
    "Uruchom program ponownie lub\nwybierz N i ponownie wprowadz dane.\n";
  }

     cout << endl;
  
    } while(!Koniec());
  
    return 0;
}


Wersja js:

Kod
<html>
<head>
<title>Konwersje (Java)</title>
<meta content="text/html; charset=Windows-1250" http-equiv="content-type">

    <script language="javascript" type="text/javascript">
    function Konwertuj(s1, p1, p2)
    {
  var    c, i, Lc, Lu, w;
  var    rLu;
  var    u;
  var    s2;
  
  Lc    = Lu    = 0;
  w    = 1;
  u    = false;
  
    
  s1    = s1.toUpperCase();
  for(i=0; i < s1.length; i++)
  {
      if(s1.charAt(i)    == ',')
      {
    u    = true;
      }
      else
      {
    if( (s1.charCodeAt(i) > 64) && (s1.charCodeAt(i) < 91))
        c    = s1.charCodeAt(i) - 55;
    else
        c    = s1.charCodeAt(i) - 48;
    if(u)
    {
        Lu    = p1 * Lu + c;
        w    *= p1;
    }
    else
        Lc    = p1 * Lc + c;
      }
  }

  rLu    = Lu / w;
  s2    = "";
  
  do
  {
      c    = Lc % p2;
      if(c < 10)
    s2    = String.fromCharCode(c + 48) + s2;
      else
    s2    = String.fromCharCode(c + 55) + s2;
      Lc    = Math.floor(Lc / p2);
  }while(Lc);
  
  if(Lu)
  {
      s2    += ",";
      while(s2.length < 32)
      {
    rLu    *= p2;
    c    = Math.floor(rLu);
    if(c  < 10)
        s2    += String.fromCharCode(c + 48);
    else
        s2    += String.fromCharCode(c + 55);
    rLu    = rLu - c;
      }
      
      while(s2.charAt(s2.length - 1) == '0')
    s2    = s2.substring(0, s2.length - 1);
  }
  
  return s2;
    }
    
    function itoa(value, radix)
    {
  return value.toString(radix);
    }
    
    function KonwertujBCD(s, p1, p2, z)
    {
  var s2    = "";
  
  var hex    = parseInt(s, 2);
  
  if(z)
  {
      // konwersja z kodu BCD
  }
  else
  {
      var p    = "";
      var    i = 0;
      while(s.length > i)
      {
    p    = Konwertuj(s.substr(i, i+1), 10, 2);
    var ile    = p.length;
    if(ile == 1)
        p    = "000" + p;
    else if(ile == 2)
        p    = "00" + p;
    else if(ile == 3)
        p  = "0" + p;
    s2    += p;
    i++;
      }
  }
  
  return s2;    
    }
    
    function KonwertujU1(s, p1, p2, z)
    {
  var    s2    = "";
  
  var    hex    = parseInt(s, 2);
  
  if(z)
  {
      hex    = ~hex;
      s2    = itoa(hex, 2);
      s2    = s2.substr(s2.length - s.length, s.length);
      s2    = Konwertuj(s2, 2, p2);
  }
  else
  {
      hex    = ~hex;
      s2    = itoa(hex, 2);
      s2    = s2.substr(s2.length - s.length - 1, s.length + 1);
  }
  if(s2.charAt(0) == '-')
      s2    = s2.substr(1, s2.length);  
  return s2;
    }
    
    function KonwertujU2(s, p1, p2, z)
    {
  var s2    = "";
  var    buffer    = "";
  
  var    hex  = parseInt(s, 2);

  
  if(z)
  {
      hex    = ~hex + 1;
      s2    = itoa(hex, 2);
      s2    = s2.substr(s2.length - s.length, s.length);
      s2    = Konwertuj(s2, 2, p2);
  }
  else
  {
      hex    = ~hex + 1;
      s2    = itoa(hex, 2);
      s2    = s2.substr(s2.length - s.length - 1, s.length + 1);
  }
  if(s2.charAt(0) == '-')
      s2    = s2.substr(1, s2.length);
  return s2;
    }
    
    
    function main()
    {
    
  var s1,c,i,p1,p2,Lc,Lu,w,u,rLu,t;
  var isMinus    = false;
  var    isp2Binary = false;

  s1 = document.frmprzelicz.inp_s1.value;
  p1 = parseInt(document.frmprzelicz.inp_p1.value);
  p2 = parseInt(document.frmprzelicz.inp_p2.value);
  if(s1.charAt(0) == "-")
  {
      s1    = s1.substring(1, s1.length);
      isMinus    = true;
  }
  if(p2 == 2)
      isp2Binary = true;
  if(isNaN(p1) || isNaN(p2) || !DaneOK(s1,p1,p2))
      t = "<font color=Red><b>Złe dane!</b></font>";
  else
  {    
      t = Konwertuj(s1, p1, p2);
      t = ((isMinus)?"-":"") + s1 + "<sub>(" + p1 + ")</sub> = " + ((isMinus && !isp2Binary)?"-":"") +t + "<sub>(" + p2 + ")</sub>";
      if(p2 == 2)
      {
    t    += " "  + KonwertujBCD(s1, p1, p2, false) + "(BCD) ";
    if(isMinus)
    {
        t    += KonwertujU1(s1, p1, p2, false) + "(U1) ";
        t    += KonwertujU2(s1, p1, p2, false) + "(U2)";
    }    
      }
      else if(p1 == 2)
      {
    t    += " z U1 = " + KonwertujU1(s1, p1, p2, true) + " z U2 = " + KonwertujU2(s1, p1, p2, true);
      }
  }
  document.getElementById("out_t").innerHTML = t;
    }

    
    function DaneOK(s,p1,p2)
    {
  var przecinek,i,c;

  if((p1 < 2) || (p1 > 36) || (p2 < 2) || (p2 > 36))
      return false;
  przecinek = false;
  s = s.toUpperCase();
  
  for(i = 0; i < s.length; i++)
  {
      if(s.charAt(i) == ',')
      {
    if(przecinek)
        return false;
    else
    {
        przecinek = true;
        continue;
    }
      }
      
      if(  ((s.charCodeAt(i) > 47) && (s.charCodeAt(i) < 58))
    ||  ((s.charCodeAt(i) > 64) && (s.charCodeAt(i) < 91)) )
      ;
      else
    return false;
      
      c = s.charCodeAt(i) - 48;
      if(c > 9)
    c -= 7;
      if(c >= p1)
    return false;
  };
  return true;
    }    
    
    function clearall()
    {
  document.frmprzelicz.inp_s1.value    = "";
  document.frmprzelicz.inp_p1.value    = "";
  document.frmprzelicz.inp_p2.value    = "";
  var t    = "...";
  document.getElementById("out_t").innerHTML    = t;
    }
    
    </script>
</head>



<body>
    <div align="center">
  <form style="BORDER-RIGHT: #ff9933 1px outset;
      PADDING-RIGHT: 4px;
      BORDER-TOP: #ff9933 1px outset;
      PADDING-LEFT: 4px;
      PADDING-BOTTOM: 1px;
      BORDER-LEFT: #ff9933 1px outset;
      PADDING-TOP: 1px;
      BORDER-BOTTOM: #ff9933 1px outset;
      BACKGROUND-COLOR: #ffCC66"
      name="frmprzelicz"
  >
  <h3 id="data_out" style="text_align: center">Przeliczenia liczb zapisanych<br>w różnych systemach pozycyjnych</h3>
  <p style="TEXT_ALIGN: center">(C)2005 Siemiątkowska Dorota, Słomiany Jarosław, Szczupliński Tomasz&nbsp;&nbsp; SWPW Płock</p>
  <hr>
  <div align="center">
      <table border="0" cellpadding="4" style="border-collapse: collapse">
    <tr>
        <td align="right">Liczba wejściowa =</td>
        <td><input value="" name="inp_s1" id="s1" size="20" style="text-align: right"></td>
        
        <td align="right">Podstawa wejściowa =&nbsp;</td>
        <td><input value="" name="inp_p1" id="p1" size=20 style="text-align: right"></td>
        
        <td align="right">Podstawa wyjściowa =&nbsp;</td>
        <td><input value="" name="inp_p2" id="p2" size=20 style="text-align: right"></td>
    </tr>
    <tr></tr>
      </table>
  </div>
  <br>
  <div style="width:20%;">
      <input type="button" value="Wyznacz liczbę wyjściową" name="B1" onclick="main()">
  </div>
  <div style="width:20%;">
      <input type="button" value="Wyczyść pola" name="B2" onclick="clearall()">
  </div>
  <p style="TEXT-ALIGN: center" id="out_t">...</p>
  
  </form>
    </div>
</body>

</html>