[c++]Sumator binarny

0

Witam. Mam napisać program - sumator binarny 5 bitowy- zczytujący z pliku wartości liczb. Staram się przerobić program, tak aby w przypadku, gdy wartość sumy cyfr przekracza 9, układ korekcyjny powinien wygenerować przeniesienie oraz skorygować wynik tak, aby suma przeniesienia i wyniku skorygowanego była równa sumie dodawanych cyfr. Nie mam pojęcia jak to zrobić. Dziękuje za pomoc.

#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>

using namespace std;

class Liczba
{
      private:
              string liczba;
              int *tablica;
              int rozmiar;
      public:
              friend class Baza;
              void wczytaj(istream &i){string tmp ; getline(i , liczba);}
              void wypisz(ostream &o){o << liczba;}
              void zamiana();
              int* zwr_tab() {return tablica;}
              string zwr_lic() {return liczba;}
};

void Liczba::zamiana()
{
     rozmiar = liczba.length();
     tablica = new int [rozmiar];
     for(int i=0;i<liczba.length();++i)
     {
             tablica[i] = liczba[i] - 48;
     }
}

class Baza 
{
      private:
              Liczba *t;
              int ile, wynik[100];
      public:
             void oblicz_rozmiar(const string &str);
             void wpisz(const string &str);
             void wypisz();
             void dodaj();
             void ww(){for(int i=0;i<100;++i){wynik[i]=0;}}
             void wynikk();    
             void ostatni();
};

void Baza::oblicz_rozmiar(const string & str)
{
     string tmp;
     int licznik = 0;
     ifstream plik(str.c_str());
     while(!plik.eof())
     {
            getline(plik,tmp);
            ++licznik;
     }
     plik.close();
     ile = licznik;
     
}

void Baza::wpisz(const string &str)
{
     string strr;
     ifstream plik(str.c_str());
     t = new Liczba [ile];
     for(int i=0;i<ile;++i)
     {
             t[i].wczytaj(plik);     
             t[i].zamiana();
     }
}     

void Baza::wypisz()
{
     for(int i=0;i<ile;++i)
     {
             for(int j=0;j<t[i].rozmiar;++j)
             {
                  cout<<t[i].tablica[j];
             }
             cout<<' '<< endl;
     }
}

void Baza::dodaj()
{
     for(int i=0;i<ile;++i)
     {
             for(int g=0 , j=t[i].rozmiar-1  ;  j>-1  ;  --j , ++g)
             {
                wynik[g] += t[i].tablica[j];
             }
     }
}

void Baza::wynikk()
{
     for(int i=0;i<100;++i)
     {
             if(wynik[i]%2==0 && wynik[i] != 0 && wynik[i] != 1)
             {
                   wynik[i+1] += (wynik[i]/2);
                   wynik[i] = 0;
             }
             if(wynik[i]%2!=0)
             {
                   wynik[i+1] += (wynik[i]/2);
                   wynik[i] = 1;
             }
             if(wynik[i]==0)
             {
                   wynik[i] = 0;
             }
             if(wynik[i]==1)
             {
                    wynik[i] =1;
             }
     }
}

void Baza::ostatni()
{
     for(int i=100;i>-1;--i)
     {
             if(wynik[i] == 1)
             {
                         for(int j=i;j>-1;--j)
                         {
                                 cout<<' '<<wynik[j];
                         }
                         break;
             }
     }
}

int main()
{
          Baza b;
          b.ww();
          b.oblicz_rozmiar("zsumuj.txt");
          b.wpisz("zsumuj.txt");
          b.wypisz();
          b.dodaj();
          b.wynikk();
          cout<<"\n\nWynik podanych liczb binarnych to: " << endl;
          b.ostatni();
          getch();
          return 0;
}

Plik zsumuj.txt zawiera

0

Całego kodu nie chce mi sie przeglądać jak widze takie rzeczy:

    if(wynik[i]==0)
             {
                   wynik[i] = 0;
             }
             if(wynik[i]==1)
             {
                    wynik[i] =1;
             }

Genialne obliczenia. Jeśli wynik wynosi 0 to wpisz do niego 0, a jak wynosi 1 to wpisz 1...

Poza tym nie bardzo wiem po co ci tyle kodu tutaj, jakieś tablice i w ogóle.
O ile pamiętam z techniki cyfrowej to najprostszy dwubitowy półsumator robiło się z jednego XORa i jednego ANDa. Dla większej ilości bitów trzeba bylo po prostu połączyć kilka takich półsumatorów.

0

... troszke sie chłopak rozpędził - każdemu sie zdaża....

znalazłem coś takiego...ale nie chde mi sie tego przerabiać :-)

 { 
 	int pom[32], 
 		przenies = 0, 
 		i, j; 
  
 	for(i = 0; i < 32; i++) 
 		pom[i] = -1; 
 	for(i = 0; i < 32 && tab[i] != -1; i++) 
 		; 
 	for(j = 0; j < 32 && a[j] != -1; j++) 
 		; 
 	i--; j--; 
 	//cout << "i: " << i << " j: " << j << endl; 
 	int indeks = i >= j ? i : j; 
 	int ostoja = indeks; 
 	//cout << endl << "index " << indeks << endl; 
 	while(indeks >= 0) 
 	{	 
 		if(i >= 0 && j >= 0) 
 		{	 
 			if(tab[i] && a[j])									//sytuacja 1 + 1 z uwzglednieniem przeniesienia 
 			{	 
 				pom[indeks] = przenies ? 1 : 0; 
 				przenies = 1; 
 			} 
 			else if((tab[i] && !a[j]) || (!tab[i] && a[j]))		//sytuacja 1 + 0 lub 0 + 1 z uwzglednieniem  przeniesienia 
 			{
 				pom[indeks] = przenies ? 0 : 1; 
 				przenies = pom[indeks] ? 0 : 1; 
 			} 
 			else if(!tab[i] && !a[j])							//0 + 0 z przeniesieniem 
 			{	 
 				pom[indeks] = przenies ? 1 : 0;					 
 				przenies = 0; 
 			} 
 			i--; 
 			j--; 
 		} 
 		else if(i >= 0)	  //druga tablica jest już pusta przepisuje pierwsza z uwzglednieniem przeniesienia
 		{
 			pom[indeks] = tab[i]; 
 			if(pom[indeks] && przenies) 
 			{	 
 				pom[indeks] = 0; 
 				przenies = 1; 
 			} 
 			else if(!pom[indeks] && przenies) 
 			{ 
 				pom[indeks] = 1; 
 				przenies = 0; 
 			} 
 			i--; 
 		} 
 		else if(j >= 0)	//pierwsza tablica jest już pusta przepisuje druga z uwzglednieniem przeniesienia 
 		{
 			pom[indeks] = a[j]; 
 			if(pom[indeks] && przenies) 
 			{	 
 				pom[indeks] = 0; 
 				przenies = 1; 
 			} 
 			else if(!pom[indeks] && przenies) 
 			{ 
 				pom[indeks] = 1; 
 				przenies = 0; 
 			} 
 			j--; 
 		} 
 		indeks--; 
 	} 
 	if(przenies)							//jesli obie liczby zostały dodane  
 	{										//sprawdzam czy istnieje przeniesienie	 
 		ostoja++;							//jesli tak przesuwam cala tablice w prawo 
 		while(ostoja--) 
 			pom[ostoja+1] = pom[ostoja]; 
 		pom[0] = 1; 
 	} 
 	cout << "Wynik = ";						//wyświetlenie wyniku 
 	for(i = 0; i < 32 && pom[i] != -1; i++)	 
 		cout << pom[i]; 
 	cout << '\t' << '(' << dzies + dzies2 << ')' << endl; 
 }
0

mnie denerwuje straszna niekonsekwencja w nazywaniu metod np to wpisz, które tak naprawdę oznacza wczytaj.
Czyta się to strasznie, a jak na forum jest tego dużo.

Swoją drogą jeśli dobrze zrozumiałem (dodawanie liczb zapisanych binarne w pięciu bitach) to ten program to prawdziwe misterium skomplikowania. Coś mam wrażenie, że można to porządnie napisać mieszcząc się 1/3 ilości linijek.

Napisz co to właściwie ma robić, będzie łatwiej rozszyfrować co jest źle.
Widzę "sumator 5 bitowy", a potem "wartość sumy cyfr przekracza 9, układ korekcyjny powinien wygenerować przeniesienie" i już nie wiem o co właściwie ci chodzi.

0

program ma realizować dodawanie liczb zapisanych binarne w pięciu bitach, z uwzględnieniem przeniesienia

0

no to jednak dobrze zrozumiałem i przekombinowałeś na całego.

int toIntFromStringBin(const string& txt)
{
     int result = 0;
     int n = txt.size;
     // tu możesz zrobić limit do 5 bitów

     for(int i=0; i<n; ++i ) {
           result <<=1;
           if(txt[i]=='1') {
                result++;
           } else if(txt[i]!='0') {
                break;
           }
     }

     return result;
}

string toStringBin(int value, int nrOfBits)
{
     string result(nrOfBits, '0');

     for(int i=0; i<nrOfBits; ++i) {
          if((value & (1<<i)) != 0) { 
              result[i]='0';
          }
     }

     return result;
}



int main()
{
     ifsream f("zsumuj.txt");
     string line;
     int number;
     int sum = 0;

     while(getline(f, line)) {
         number = toIntFromBinString(line);
         sum += number;
     }

     sum & = 0x1f;
     cout << "suma = " << toStringBin(sum, 5) << endl;
     
     return 0;
}

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