![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 53 Pomógł: 0 Dołączył: 3.01.2004 Skąd: Iława Ostrzeżenie: (0%) ![]() ![]() |
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 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 = </td> <td><input value="" name="inp_p1" id="p1" size=20 style="text-align: right"></td> <td align="right">Podstawa wyjściowa = </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> |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 14:48 |