Součet binárních čísel – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Součet binárních čísel – C / C++ – Fórum – Programujte.comSoučet binárních čísel – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Divisor0
Duch
7. 11. 2013   #1
-
0
-

Zdravím, potřeboval bych poradit jak mám opatřit, aby u vstupu nebylo jiné číslo kromě jedničky a nuly. 

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
    long long int a, b;
     int i = 0, zbytek = 0, sum[20];

     cout <<"Zadejte dve binarni cisla: "<<endl;
        cin >> a;
     if ( !cin.good()  )
     {
        cout<<"Nespravny vstup."<<endl;
        return 0;
     }

     cin >> b;
     if ( !cin.good()  )
     {
        cout<<"Nespravny vstup."<<endl;
        return 0;
     }



     while ((a != 0) || (b != 0))
        {
           if((a%10!=0 && a%10!=1) || (b%10!=0 && b%10!=1))
            {
                cout<<"Nespravny vstup."<<endl;
                return 0;
            }

           sum[i++] = ((a % 10) + (b % 10) + zbytek) % 2;
           zbytek = ((a % 10) + (b % 10) + zbytek) / 2;
           a = a/10;
           b = b/10;
        }

     if (zbytek != 0)
        sum[i++] = zbytek;
--i;

 cout<<"Soucet: ";
    while (i >= 0)
     {
         cout<<sum[i--];
     }


     return 0;
}
Nahlásit jako SPAM
IP: 2001:718:1001:6a4:a1a6:bc...–
7. 11. 2013   #2
-
0
-

se to tu někde řešilo....

to načítáš jako "dekadické" číslo, takže dělit 10 a zbytek dělení je cifra - ta musí být buď 0 nebo 1. Druhá možnost je to načíst jako řetězec a testovat znak po znaku. Vše jde udělat v jednom cyklu - jak test cifry, tak převod na dekadické číslo.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
pazdy0
Návštěvník
7. 11. 2013   #3
-
0
-

Myslíš takhle zapsat? 

  if ( a%10 != 0 || a%10 != 1 || b%10 != 0 || b%10 != 1)
    {
        cout<<"Nespravny vstup."<<endl;
        return 0;
    }
Nahlásit jako SPAM
IP: 2001:718:1001:6a4:ed05:a9...–
7. 11. 2013   #4
-
0
-

musíš v cyklu projet všechny cifry, takže dělit číslo modulo 10 dokud číslo není 0. A v podmínce musí být log. součin. Asi je to dobré udělat jako funkci

int test(int cislo)  //vrati 0 pri chybe, vrati 1 pri spravnem tvaru cisla
{
  int pom = cislo;
  while(pom)
  {
    if( (pom%10 != 0) && (pom%10 != 1) )  //neni cifra 1 nebo 0
      return 0;
    pom = pom/10;  //odstranim otestovanou cifru a budu testovat dalsi
  }
  return 1;
}
  

a použití funkce

cin>>a;  //nactu cislo
if(test(a))
  //cislo je z jednicek a nul
else
  //cislo obsahuje i jine cifry

hu

Nahlásit jako SPAM
IP: 195.178.67.–
7. 11. 2013   #5
-
0
-

s řetězcem by to asi vypadalo takto:

string a;

cin>>a;
for(int i = 0; i < a.lenght(); i++)
{
  if( (string[i] != '0') && (string[i] != '1') )  //neni cifra 1 nebo 0
  {
    //chybny vstup
    break;
  }
}

hu

Nahlásit jako SPAM
IP: 195.178.67.–
7. 11. 2013   #6
-
0
-

Teď jsem si všiml, že v původním programu to je udělaný, podmínka hned na začátku cyklu while a rovnou to v tom samém cyklu sčítá

hu

Nahlásit jako SPAM
IP: 195.178.67.–
7. 11. 2013   #7
-
0
-

Ještě pro zajímavost: Pokud by tě zajímalo, jak to ten procesor dělá, stačí si odvodit kombinační logickou funkci pro jednobitovou sčítačku. Pro součet dvou jednobitových operandů bez přenosu z nižšího řádu se dá napsat

vysl = a XOR b

a pro generování přenosu do vyššího řádu

pren = a AND b

Pokud chceš úplnou jednobitovou sčítačku, zařadíš výše uvedené do kaskády - nejdříve sečteš operandy a pak sečteš mezivýsledek s přenosem.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Petr
~ Anonymní uživatel
746 příspěvků
8. 11. 2013   #8
-
0
-
Nahlásit jako SPAM
IP: 8.20.181.–
Timecheater
~ Anonymní uživatel
1 příspěvek
8. 11. 2013   #9
-
0
-

                                                                             DU2 

                                                              VSB-PROGTEST = 10B

´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´

#include <iostream>
#include <stdio.h>
#include <string.h>


using namespace std;

int main()
{
    char b1[253];
    char b2[253];
    int v1,v2,pz1,pz2,delsi,m1,m2,k,pr1=0,p=0,pos1,pos2;
    char s[255];
    double pos;

    for(int i=0;i<255;i++)
    {
        s[i]=32;
    }

    cout << "Zadejte dve binarni cisla:" << endl;
    cin >> b1 >> b2;

    v1=strlen(b1);
    v2=strlen(b2);

    pz1=v1-1;
    pz2=v2-1;

    for(int i=0;i<v1;i++)
    {
        if(b1[i]==48 || b1[i]==49)
        {
        }
        else
        {
            cout << "Nespravny vstup." << endl;
            return 0;
        }
    }

    for(int i=0;i<v2;i++)
    {
        if(b2[i]==48 || b2[i]==49)
        {
        }
        else
        {
            cout << "Nespravny vstup." << endl;
            return 0;
        }
    }

    for(int i=0;i<255;i++)
    {
        if(b1[i]==48||s[i]==49)
        {
            pos1=1;
        }
    }
    for(int i=0;i<255;i++)
    {
        if(b2[i]==48||s[i]==49)
        {
            pos2=1;
        }
    }


    if(pos1==1 && pos2==1)
        {
        }
        else
        {
            cout << "Nespravny vstup." << endl;
            return 0;
        }

    if(v1>=v2)
    {
        delsi=v1;
    }
    else
    {
        delsi=v2;
    }


    p=0;
    k=254;

     while(delsi>=0 || p==1)
     {
         if(pz1<0)
         {
             m1=0;
         }
         else
         {
             m1=b1[pz1]-48;
         }

         if(pz2<0)
         {
             m2=0;
         }
         else
         {
             m2=b2[pz2]-48;
         }


         if(m1+m2+p==0)
         {
            s[k]=0;
            p=0;
         }
         else if(m1+m2+p==1)
         {
            s[k]=1;
            p=0;
         }
         else if(m1+m2+p==2)
         {
            s[k]=0;
            p=1;
         }
         else if(m1+m2+p==3)
         {
            s[k]=1;
            p=1;
         }


         k--;
         delsi--;
         pz1--;
         pz2--;

     }
    pos=0;
    for(int i=0;i<255;i++)
    {
       if(s[i]==1) pos=1;
    }

    cout << "Soucet: ";
    for(int i=0;i<255;i++)

     {
         if(s[i]==32)
         {
         }
         else if(s[i]==1)
         {
                pr1=1;
                cout << "1";
         }
         else if(s[i]==0&&pr1==1)
         {
             cout << "0";}
         else if(pos==0)
         {
             cout << "0" << endl;
             return 0;
         }
     }
     cout << endl;

    return 0;
}

´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´


Nahlásit jako SPAM
IP: 109.231.128.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 110 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý