Soucet cisel v binarni soustave - podminky – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Soucet cisel v binarni soustave - podminky – C / C++ – Fórum – Programujte.comSoucet cisel v binarni soustave - podminky – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
pazdy0
Návštěvník
4. 11. 2013   #1
-
0
-

Zdravím zkouším si naprogramovat program na sčítání čísel v binární soustavě. Jenže nevím jak ošetřit podmínku, aby když uživatel zadá číslo, kde se budou obsahovat jiná čísla než 0 nebo 1... Například, aby když uživatel zadá číslo 00120.. Mu to napsalo Chyba, nebo tak něco.. Díky za radu.

Nahlásit jako SPAM
IP: 2001:718:1001:6a4:dc01:4d...–
JoDiK
~ Anonymní uživatel
987 příspěvků
4. 11. 2013   #2
-
+1
-
Zajímavé

#1 pazdy
To snad nebude takový problém, projdi si to co uživatel zadal znak po znaku a kontroluj, jestli tam má jen povolené znaky "0" a "1".  Takže tu "podmínku" "ošetři" cyklem, který může skončit i dřív, když narazíš na nepovolený znak...

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

Ještě bych měl dotaz.. Potřeboval bych, aby to ten cout napsalo na jeden řádek a ne pod sebe.. Nemůžu tu chybu najít.. Poradíte prosím vás?

#include <iostream>

using namespace std;

int main()
{
   long int a;
    long int b;
    int i = 0, zbytek = 0, sum[20];
    cout<<"Zadejte dve binarni cisla: "<< endl;
    cin>>a;
    cin>>b;
    if ( !cin.good() )
    {
    cout<<"Nespravny vstup."<<endl;
    return 0;
    }

 while ((a != 0) || (b != 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;


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

return 0;
}
Nahlásit jako SPAM
IP: 2001:718:1001:6a4:dc01:4d...–
JoDiK
~ Anonymní uživatel
987 příspěvků
4. 11. 2013   #4
-
0
-

#3 pazdy
A co takhle nepsat tam to  <<endl???

BTW: ten program asi nedělá to co by měl podle zadání...
 

Nahlásit jako SPAM
IP: 88.103.233.–
pazdy0
Návštěvník
4. 11. 2013   #5
-
0
-

#4 JoDiK
endl nepomůže, dává to za sebe a pořád to píše ten součet.. No má sčítat dvě binární čísla, což dělá, jen mi to špatně vypisuje...

Nahlásit jako SPAM
IP: 2001:718:1001:6a4:dc01:4d...–
JoDiK
~ Anonymní uživatel
987 příspěvků
4. 11. 2013   #6
-
0
-

#5 pazdy
A co teda vypisovat jen

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


Jo, cosi ti to sčítá, jen to nějak nekontroluje ten vstup jak ses na to ptal...

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

#6 JoDiK
No vstup mi to ještě nekontroluje... to doladím později.. Teď chci hlavně, ať mi to v pořádku vypíše..

Nahlásit jako SPAM
IP: 2001:718:1001:6a4:dc01:4d...–
pazdy0
Návštěvník
4. 11. 2013   #8
-
0
-

Jinak díky za ten cout...Funguje ;-)

Nahlásit jako SPAM
IP: 2001:718:1001:6a4:dc01:4d...–
pazdy0
Návštěvník
4. 11. 2013   #9
-
0
-

Ještě k těm podmínkám.. Nějak mi nejdou.. chci je napsat ve smyslu...

if (cislo[pozice] != '0' && cislo[pozice] != '1') { /* chyba */ }

Jde to takhle nějak? 

Nahlásit jako SPAM
IP: 2001:718:1001:6a4:dc01:4d...–
lukas.balaz0
Super člen
4. 11. 2013   #10
-
0
-

Tak neviem či mám pravdu, ale mne sa zdá, že by bolo oveľa ľahšie (a neviem nakoľko lepšie) čítať čísla ako string nie int

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

#10 lukas.balaz
No já to zkoušel napsat i pomocí stringu, ale ty podmínky mi zase nešly..

     if (a.length()!='0'  && b.length()!= '1')
    { cout<<"Nespravny vstup."<<endl;
            return 0;
     }
   
Nahlásit jako SPAM
IP: 2001:718:1001:6a4:dc01:4d...–
z
~ Anonymní uživatel
268 příspěvků
5. 11. 2013   #12
-
0
-

Metoda length() vrací délku. Tu asi nemá smysl porovnávat s '0' a '1'. U řetězce můžeš použít ten operátor [].

Nahlásit jako SPAM
IP: 88.101.8.–
Petr
~ Anonymní uživatel
746 příspěvků
5. 11. 2013   #13
-
0
-

#11 pazdy
Pokud načítáš číslo jako int, tak nejlepší na ověření vstupu je rozklad na jednotlivé číslice a ty ověřovat...tj. kombinace dělení 10 a zbytek po dělení 10, něco jako

#include <iostream>

using namespace std;

int main()
{
    int a;
    cin>>a;
    while(a)
    {
        if(a%10!=0 && a%10!=1)
        {
            cout<<"Spatny vstup";
            exit(1);
        }
        a/=10;
    }
    cout<<"OK";
    return 0;
}

Nahlásit jako SPAM
IP: 8.20.181.–
Martin Kozibrátka
~ Anonymní uživatel
138 příspěvků
5. 11. 2013   #14
-
0
-

Přesně!!!! :)#13 Petr

Nahlásit jako SPAM
IP: 212.24.138.–
pazdy0
Návštěvník
5. 11. 2013   #15
-
0
-

Stejně mi to nefunguje :(.. Když tam dám někde třeba 2.. tak mi to klidně vezme...

Nahlásit jako SPAM
IP: 2001:718:1001:6a4:10c1:45...–
Petr
~ Anonymní uživatel
746 příspěvků
5. 11. 2013   #16
-
0
-

#15 pazdy
Dej sem celý kód

Nahlásit jako SPAM
IP: 8.20.181.–
pazdy0
Návštěvník
5. 11. 2013   #17
-
0
-

Zde je ten kod

#include <cstdlib>
#include <iostream>

using namespace std;

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

     cout <<"Zadejte dve binarni cisla: "<<endl;
     cin >> a;
     cin >> b;

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


     while ((a != 0) || (b != 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:10c1:45...–
Petr
~ Anonymní uživatel
746 příspěvků
5. 11. 2013   #18
-
0
-

#13 Petr
Jsi tam tu kontrolu neměl, zkus to tak jak jsem doplnil, mělo by to fungovat

#include <cstdlib>
#include <iostream>

using namespace std;

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

     cout <<"Zadejte dve binarni cisla: "<<endl;
     cin >> a;
     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)) //kontrola
            {
                cout<<"Spatny vstup";
                exit(1);
            }

           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: 8.20.181.–
DB
~ Anonymní uživatel
12 příspěvků
5. 11. 2013   #19
-
0
-

#18 Petr

No ale jak se dívám, pokud zadáš:

111 111a

soucet: 1110

tak dostaneš součet, ale mně se zdá, že dotyčný chtěl na výstupu dostat:

111 111a

Nespravny vstup.

Nahlásit jako SPAM
IP: 78.102.189.–
Petr
~ Anonymní uživatel
746 příspěvků
5. 11. 2013   #20
-
0
-

#19 DB

I to se dá vyřešit, např. takto

#include <cstdlib>
#include <iostream>

using namespace std;

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

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

     cin>>b;
     if ( !cin.good() ||cin.get()!='\n' )
     {
        cout<<"Nespravny vstup."<<endl;
        return 0;
     }



     while ((a != 0) || (b != 0))
     {
           if((a%10!=0 && a%10!=1) || (b%10!=0 && b%10!=1)) //kontrola
            {
                cout<<"Spatny vstup";
                exit(1);
            }

           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: 8.20.181.–
pazdy0
Návštěvník
5. 11. 2013   #21
-
0
-

Díky za pomoc, už to jde ;-)

Nahlásit jako SPAM
IP: 2001:718:1001:6a4:10c1:45...–
Petr
~ Anonymní uživatel
746 příspěvků
5. 11. 2013   #22
-
0
-

#21 pazdy
Toto

#include <iostream>

using namespace std;

void kontrola(int a)
{
    if ( !cin.good() ||cin.get()!='\n' )
     {
        cout<<"Nespravny vstup."<<endl;
        exit(1);
     }
     while(a)
     {
        if(a%10!=0 && a%10!=1)
        {
            cout<<"Nespravny vstup";
            exit(1);
        }
        a/=10;
      }

}

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

     cout <<"Zadejte dve binarni cisla: "<<endl;
     cin>>a;
     kontrola(a);
     cin>>b;
     kontrola(b);

     while ((a != 0) || (b != 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;
}


funguje

Nahlásit jako SPAM
IP: 8.20.181.–
pazdy0
Návštěvník
5. 11. 2013   #23
-
0
-

Jojo už to jde díky moc ;-)

Nahlásit jako SPAM
IP: 2001:718:1001:6a4:10c1:45...–
Petr
~ Anonymní uživatel
746 příspěvků
5. 11. 2013   #24
-
0
-

#23 pazdy
Ve funkci kontrola můžeš vynechat test cin.good....jednoduše, pokud je v bufferu znak nového řádku, načetlo se všechno OK, pokud je tam jiný znak, tak se vstup nenačetl správně.....bylo zadáno např. 111b1....tzn. v bufferu zůstane b1

Nahlásit jako SPAM
IP: 8.20.181.–
DB
~ Anonymní uživatel
12 příspěvků
5. 11. 2013   #25
-
0
-

A jenom jsem se chtěl zeptat, nešlo by to celý udělat přes string? protože velká čísla to nevezme. Popřípadě jak :) díky.

Nahlásit jako SPAM
IP: 78.102.189.–
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, 32 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ý