Problem z Konwersją liczb dziesiętnych na system U2.

0

Witam Mam Problem z zadaniem :

Napisać program, który:

a). Tworzy plik danych "dane.txt" zawierający liczby całkowite (dodatnie i ujemne) w wielu wierszach.
b). Odczytuje dane z pliku "dane.txt" i zapisuje w pliku wyniki.txt reprezentację U2 liczb z pliku dane.txt, które są liczbami z założenia n-bitowymi i kodowanymi w systemie U2. Liczba n powinna być zadawana i w konsekwencji plik wyniki.txt powinien zawierać tylko liczby spełniające kryterium możliwości kodowania na n-bitach w systemie U2.

UWAGA !
Plik wyniki.txt powinien zawierać 2 kolumny separowane spację. W pierwszej kolumnie reprezentacja U2 w drugiej liczba w postaci odczytywanej z pliku dane.txt.
Tutaj wszystko co napisalem :

#include <iostream>
#include <sstream>
#include <stack>
#include <cmath>
#include <fstream>
#include <ctime>
#include <cstdlib>
#define N 100
using namespace std;

string dec2bin(int liczba)
{ string w,cyfra;
    if(liczba==0) return w; else
          {stringstream s;
            s<<liczba%2;
            s>>cyfra;
            return dec2bin(liczba/2)+cyfra;
          }
}

 stack <char> cyfry;
 string d2b(int liczba, int n)
 {
     char cyfra; string w="";
      while(liczba!=0)
     {   stringstream s;
         s<<liczba%2;
         s>>cyfra;
         cyfry.push(cyfra);
         liczba/=2;
    }
   while(!cyfry.empty())
   {
       w=w+cyfry.top();
       cyfry.pop();
   }
    while(w.length()<n) w="0"+w;
  return w;
 }

bool czyU2(int liczba, int n)
{
     if(liczba >= -pow(2,n-1) && liczba <=pow(2,n-1)-1) return true; return false;
}

string toU2(int liczba, int n)
{
    if(czyU2(liczba,n))
        if(liczba<0) return dec2bin(pow(2,n)+liczba); else return d2b(liczba,n);
}

void dane()
{
    srand(time(NULL));
    ofstream dane; dane.open("dane.txt",ios::out);
    for(int i=0;i<N;i++) dane<< 500-rand()%1000 <<endl;

}

void konwersjaU2(int n)
{
    int tablica[100]={0};
    int temp=0;
    ifstream liczby("dane.txt");

    while(!liczby.eof())
        liczby>>tablica[temp++];
        liczby.close();

ofstream zapis("wyniki.txt");
for(int i=0;i<temp;i++)
{
    zapis<<toU2(tablica[i],n)<<" "<<tablica[i]<<endl;
}
zapis.close();
}




int main()
{
dane();
konwersjaU2(16);

}

Problem polega na tym że czasami pierwszym liczbom zapisanym w pliku wyniki, nie wyświetlają się ich odpowiedniki w systemie U2, czasami tych liczb jest kilka, czasem jedna, albo w ogóle tego problemu nie ma , natomiast zawsze w ostatnim lub przedostatnim wierszu pojawia się takie coś: jakaś liczba binarna i liczba 7274168 pierwsza liczba powinna być reprezentacja w U2 druga liczba to liczba losowa z zakresu od -500 do 500. ktoś pomoże mi to wyjaśnić dlaczego się tak dzieje, i czy można ten kod jeszcze jakoś usprawnić.
EDIT: z pierwszym problemem już się uporałem zmieniłem argument n w funkcji konwersja z 8 na 16, wcześniej tylko liczby z zakresu -256,256 byly poprwanie konwertowane został drugi problem, mianowicie jakaś kosmiczna liczba w ostatnim wierszu.

4

https://godbolt.org/z/7EGPvY

#include <iostream>
#include <bitset>

int main()
{
    int x;
    while (std::cin >> x) {
        using Type = std::bitset<8 * sizeof(x)>;
        Type y = static_cast<unsigned>(x);
        std::cout << y << ' ' << x << '\n';
    }

    return 0;
}

Wyjaśnienia:

  1. Jesteś w pułapce umysłowej, że obliczania muszą być wykonywane w systemu dziesiętnym. Tak się uczy liczyć ludzi. Obecnie każdy CPU wykonuje oblicznia w U2. Ergo nazwa funkcji string dec2bin(int liczba) jest bezsensu. Zresztą najlepiej jakbyś traktował int jako liczbę bez określonego systemu zapisu. Ta funkcja ma skonwertować liczbę do napisu w reprezentacji binarnej, czyli lepsza nazwa to np string toStringBinary(int liczba)
  2. Funkcja pow przeznaczona jest tylko i wyłącznie do obliczeń na liczbach zmiennoprzecinkowych. Używanie jej z liczbami całkowitymi, często prowadzi do dziwnych rezultatów (temat wałkowany wielokrotnie i na razie nie musisz znać szcgółów)
  3. Co za masakrę robisz z std::stringstream w d2b?

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