Součet dvou 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 dvou binárních čísel – C / C++ – Fórum – Programujte.comSoučet dvou binárních čísel – C / C++ – Fórum – Programujte.com

 

Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #1
-
0
-

Prosím, potřeboval bych program, nebo aspoň část programu, který sečte mnou zadané binární čísla. Výsledek opět bude v binární podobě. Díky za pomoc

Nahlásit jako SPAM
IP: 2001:718:1001:700:200:5ef...–
Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #2
-
0
-

Potřeboval bych hlavně tu část kódu, kde probíhá součet zadaných binárních čísel. Děkuji

Nahlásit jako SPAM
IP: 2001:718:1001:700:200:5ef...–
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 11. 2012   #3
-
0
-

#1 Dalibor
A na co to prosímtě potřebuješ? Lidi přece počítají v desítkové soustavě. Dvojková (binární) soustava - ta je pro počítače (ty zase neumí desítkovou) a proto si to počítačové programy samy převádí a uživatele tím neobtěžují.

Prostě to zadej v desítkové, program si to sám převede do dvojkové, výsledek bude samozřejmě ve dvojkové (jak jinak) a pro tebe ho zase automaticky převede zpět do desítkové.

Nahlásit jako SPAM
IP: 88.103.236.–
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 11. 2012   #4
-
0
-

#2 Dalibor
Součet binárních čísel je přece "zadrátován" neboli provádí se hardwarově, to se neprogramuje...

Nahlásit jako SPAM
IP: 88.103.236.–
Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #5
-
0
-

#3 JoDiK
Potřebuju to do školy :)... a potřebuju to tak, abych zadal

Zadejte dve binarni cisla:

1111100 100

Soucet: 10000000

Nahlásit jako SPAM
IP: 2001:718:1001:700:200:5ef...–
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 11. 2012   #6
-
0
-

#5 Dalibor
Aha... no tak to jsi měl říct rovnou...

Na to ti můžu říct jen - tím, že ti to někdo napíše se to moc nenaučíš. Mnohem efektivnější je přijít na to sám.

A když něco nevíš, zeptej se strýčka...

Mimochodem, ten součet je úplně stejný - ba i jednodušší, jako ses učil na základní škole, vždyť máš jen dvě čisla...
 

Nahlásit jako SPAM
IP: 88.103.236.–
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 11. 2012   #7
-
0
-

#6 JoDiK
oprava - jen dvě číslice...

Nahlásit jako SPAM
IP: 88.103.236.–
Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #8
-
0
-

#6 JoDiK
Já si nechám klidně poradit... a neboj :) strýčka jsem zkoušel... jenže to že vím jak se to dělá na papíře neznamená, že to umím napsat v C... 

Nahlásit jako SPAM
IP: 2001:718:1001:700:200:5ef...–
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 11. 2012   #9
-
0
-

#8 Dalibor
Aha, no ale o tom to přece je... Děláš školní úlohu - vlastně něco zbytečného - ale naučíš se u toho jak naprogramovat ten postup. Takže až budeš programovat něco užitečného, budeš vědět jak.

Nevím co vše umíš a jak, takže rada - posloupnost čísel si ulož do nějaké struktury se kterou umíš pracovat po jednotlivých položkách a cyklem projdi ty jednotlivé položky zprava doleva a hlídej si přenos - no jako na tom papíře...

Nahlásit jako SPAM
IP: 88.103.236.–
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 11. 2012   #10
-
0
-

#9 JoDiK
Oprava, se mi to dnes nějak furt plete - posloupnost číslic (1 a 0) si ulož do struktury...

Nahlásit jako SPAM
IP: 88.103.236.–
Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #11
-
0
-

Ze struktorou neumim dělat... spise jsem uvažoval nad možnosti převedeni binarniho cisla do desitkovehom provest součet a zase prevest zpet. ale nevim, jak převedu binarni na desitkove ( v C++ ... )

Nahlásit jako SPAM
IP: 158.196.116.–
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 11. 2012   #12
-
0
-

#11 Dalibor
Vzhledem k tomu, že ten součet máš provádět v binární soustavě, tak to bez struktury (třeba pole znaků) nepůjde.

Nahlásit jako SPAM
IP: 88.103.236.–
oplis10
Newbie
12. 11. 2012   #13
-
0
-

Ale struktury přece nepotřebuje. Stačí mu pole :-)

Nahlásit jako SPAM
IP: 195.212.199.–
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 11. 2012   #14
-
0
-

#13 oplis1
A pole snad není struktura??? Pokud se bavíme zatím v obecných pojmech?

Nahlásit jako SPAM
IP: 88.103.236.–
oplis10
Newbie
12. 11. 2012   #15
-
0
-

No pole určitě není struktura

Nahlásit jako SPAM
IP: 195.212.199.–
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 11. 2012   #16
-
0
-

#15 oplis1
Asi jsem už moc starý.

Proměnné se za mých dob dělily na jednoduché, strukturované a dynamické. jestli se v nějakém jazyce (třeba c)  "strukturou" nazývá nějaká vnitřní konstrukce, to už neřeším...

Nahlásit jako SPAM
IP: 88.103.233.–
jurin
~ Anonymní uživatel
16 příspěvků
12. 11. 2012   #17
-
0
-

#1 Dalibor
Pokud to může být C++ tak zkus tohle.

#include <bitset>

#include <string>

typedef std::string   T_String;


template<size_t N> bool binarysum(const char* inNum1,const char* inNum2,T_String &outNum)
{
    typedef std::bitset<N>  T_BitSet;

    T_String s1(inNum1);
    T_String s2(inNum2);
    T_BitSet n1(s1);
    T_BitSet n2(s2);
    T_BitSet n = (n1.to_ulong() + n2.to_ulong());
    outNum = n.to_string();

    return true;
}

int main()

{
    T_String s;
    binarysum<32>("1100100","11001000",s);

    return 0;

}

Nahlásit jako SPAM
IP: 80.188.228.–
Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #18
-
0
-

Jej.... tak v tom kodu teda nerozumim ani carce. Nejaka slozita verze :X

Nahlásit jako SPAM
IP: 89.103.37.–
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 11. 2012   #19
-
0
-

#17 jurin
Tipuji, že vzhledem k tomu, že tazatel tvrdí, že právě to sčítání dvou binárních čísel má naprogramovat, tak postup : převést zadané binární čísla z řetězců na celé číslo, sečíst a pak převést zpět asi neprojde...

Nahlásit jako SPAM
IP: 88.103.236.–
Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #20
-
0
-

#19 JoDiK
Ale přesne toto chci. Chci převést zadané binární číslo na desítkové, poté provést součet a pak zase převést zpět.

Nahlásit jako SPAM
IP: 89.103.37.–
jurin
~ Anonymní uživatel
16 příspěvků
12. 11. 2012   #21
-
0
-

Já převádím řetězec na šablonu bitset, která je k tomu přesně určená a je už hotová ve standartu C++.

Nahlásit jako SPAM
IP: 80.188.228.–
Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #22
-
0
-

Poradil by nekdo prosím jak převést to binární číslo na dekadické? Umím to pomocí tohoto vzorce

 vysledek1 = vysledek1 * 2 + (binar1 - '0');

Jestli ale existuje ještě jinačí verze... Byl bych za ní  vděčný. díky

Nahlásit jako SPAM
IP: 89.103.37.–
Hacker
~ Anonymní uživatel
1 příspěvek
12. 11. 2012   #23
-
0
-

Takovym zpusebem to ani nepujde pretece ti promenna. tam muze byt cislo dlouhe az 253 znaku, coz je 2^253 to do promene nedas, radsi pracuj s retezci. a pak je secti a dej do vysledneho retezce. Scitani je lehke, napr 1+1 =0 (pak jde jednicka pro prenos] atd.. 

Nahlásit jako SPAM
IP: 2001:718:1001:6a0:72cd:60...–
Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #24
-
0
-

nebo uplně jinak... uz jsem na to prisel... akorad to nefunguje... po vlozeni hodne velkeho retezce, to napise chybu... takze se to musi udelal jinak... a ne tim mezi prevodem... kdyby tady nekdo podrobneji popsal jak, byl bych rad. Děkuji

Nahlásit jako SPAM
IP: 89.103.37.–
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 11. 2012   #25
-
0
-

#24 Dalibor
A zadavatel ti neřekl jak velká čísla to má umět převádět?

Nahlásit jako SPAM
IP: 88.103.233.–
Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #26
-
0
-

Program bude v povinných testech testován binárními čísly s nejvýše 253 ciframi. 

Nahlásit jako SPAM
IP: 89.103.37.–
marpit
~ Anonymní uživatel
200 příspěvků
12. 11. 2012   #27
-
0
-

#24 Dalibor
dadanku, z meziprevodem na DEC to nejde, jsi limitován velikostí celočíselné proměnné, taky jsem to zkoušel a cesta tudma nevede. Správným řešením je práce s řetězcem, kde přistupuješ znak po znaku a podle hodnoty v jednotlivých prvcích a dle jednotky v řetězci součtu doplnujes hodnotu do souctu.

PS: Progtest v meznich hodnotach dosazuje opravdu dlouhe vstupni retezce, napriklad  

0010010000100010010110101011000001000101000010100110001011111001001010000011111000111111011101110110000011000001001000101

co by jsi z meziprevodem na DEC nikdy nemohl zrealizovat. 

Nahlásit jako SPAM
IP: 78.102.61.–
Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #28
-
0
-

jo, uz jsem to prave zjistil. Jenze nevim, jak napsat to, co si mi popsal... :X

Nahlásit jako SPAM
IP: 89.103.37.–
marpit0
Stálý člen
12. 11. 2012   #29
-
0
-

#28 Dalibor
binarni scitani: 1 + 1 = 0 C = 1

1 + 0 = 1 C = 0 

0 + 1 = 1 C = 0

0 + 0 = 0 C = 0

tot vse

Nahlásit jako SPAM
IP: 78.102.61.–
MarPit
Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #30
-
0
-

co to je to C =0?

Nahlásit jako SPAM
IP: 89.103.37.–
Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #31
-
0
-

Mimochodem.... vim jak se scita dekadicky :) jenom nevim, jak to nacpat do C++

spise potrebuju nejak podrobneji popsat, jak to mam napsat v jazyce

Nahlásit jako SPAM
IP: 89.103.37.–
marpit0
Stálý člen
12. 11. 2012   #32
-
0
-

#30 Dalibor
Flag pro přetečení, ja si ho definoval jako bool proměnnou. 

Nahlásit jako SPAM
IP: 78.102.61.–
MarPit
marpit0
Stálý člen
12. 11. 2012   #33
-
0
-

#31 Dalibor
1, pokud ti zde dám zdroják, tak budem mít oba dva problém s progtestem

2, pokud to za tebe někdo vyřeší, nic se nenaučíš

3, máš na to skoro týden, tak přemýšlej, není to zase až tak složité  

Nahlásit jako SPAM
IP: 78.102.61.–
MarPit
Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #34
-
0
-

1) zdrojak nechci

2) mam na to dva dny kvuli praci :)

3) nechci to vyresit, ale poradit... a tim ze mi reknes ze mam premyslet mi neradis ;)

Nahlásit jako SPAM
IP: 89.103.37.–
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 11. 2012   #35
-
0
-

#26 Dalibor
Já si to myslel. Takže můj předpoklad byl správný, asi jde o zadání z mých dob, kdy řetězec měl max 255 znaků tak to máš ještě s jednou rezervou...

Nahlásit jako SPAM
IP: 88.103.233.–
marpit0
Stálý člen
12. 11. 2012   #36
-
0
-

#34 Dalibor
Víš, jak se sčítají dvě binární čísla? Víš, na papíru to umíš a v C++ je to úplně stejný postup, sčítám členy stejného řádu a vypisuju výsledek sčítání do patřičného řádu výsledku, jediné co si musím ohlídat je přetečení.

Nahlásit jako SPAM
IP: 78.102.61.–
MarPit
marpit0
Stálý člen
12. 11. 2012   #37
-
0
-

#35 JoDiK
Řešil jsi jako soutěžní úlohu křížovku? To už je zajímavější masakr  

Nahlásit jako SPAM
IP: 78.102.61.–
MarPit
Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #38
-
0
-

Programuju par od vysoke skoly... pokud v tom mas praxi, chapu, ze ti to prijde jednoduche...

Nahlásit jako SPAM
IP: 89.103.37.–
Dalibor
~ Anonymní uživatel
30 příspěvků
12. 11. 2012   #39
-
0
-

Ted potrebuju nejak vyresit ten ukol... a potrebuju to napsat jako laikovi... ten text co si mi napsal, muzes napsat salounovi nebo nekomu jinemu kdo tomu rozumi... ale laikovi nebo zacatecnikovi bys to mohl prosim vysvetlit trosku polopate...

Nahlásit jako SPAM
IP: 89.103.37.–
marpit0
Stálý člen
12. 11. 2012   #40
-
0
-

#38 Dalibor
Přiznávám, string je teď nový, v C na střední jsi měl pole charu, ale pořád je to to stejné a úloha na binární čísla se dělala jak v PRV, tak v EPU.

Nahlásit jako SPAM
IP: 78.102.61.–
MarPit
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 11. 2012   #41
-
0
-

#34 Dalibor
Rada:

Načti obě vstupní čísla jako řetězce. Nachystej si výstup také jako řetězec.

Projdi cyklem postupně čísla zprava (nebo-li od poslední číslice) a zjišťuj výsledek součtu + přenos z předchozí pozice a přidávej do cílového řetězce. V případě, že dojde k přenosu i u poslední číslice delšího čísla, přidej ještě jedničku zleva.

Předpokládám, že umíš pracovat s jedotlivými znaky řetězce...

Nahlásit jako SPAM
IP: 88.103.233.–
marpit0
Stálý člen
12. 11. 2012   #42
-
0
-

#39 Dalibor
Víš jak se přistupuje k jednotlivým prvkům stringu? Musíš počítat s tím, že každý string může být jinak dlouhý, to si musíš ohlídat, já to zpracovával od konce a zbytek delšího řetězce jsem pak jednoduše připsal k výsledku.

Nahlásit jako SPAM
IP: 78.102.61.–
MarPit
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 11. 2012   #43
-
0
-

#42 marpit
Drobná výtka, zbytek delšího můžeš připsat k výsledku jenom když u poslední číslice kratšího nenastal přenos. V opačném případě se může i celý zbytek většího čísla úplně změnit...

Nahlásit jako SPAM
IP: 88.103.233.–
marpit0
Stálý člen
12. 11. 2012   #44
-
0
-

#43 JoDiK
jasně, to hlídám  

Nahlásit jako SPAM
IP: 78.102.61.–
MarPit
Nnonnamme
~ Anonymní uživatel
3 příspěvky
14. 11. 2012   #45
-
0
-

Zdravim vsechny :) Vidim ze Dalibor bude stejna fakulta co ja :D no to je fuk ja uz mam vicemene navrh scitaciho algoritmu hotovej, nicmene ... potrebuju ten retezec, kam nacitam, pred tim nez do nej zacnu nacitat, naplnit nulama ... ( jako pojistka ze jedno cislo bude kratsi nez druhy) staci to udelat 
char retezec[256] = {0};
? nebo je to potreba pres treba FOR naplnit?

Nahlásit jako SPAM
IP: 91.106.250.–
vitamin+8
Grafoman
14. 11. 2012   #46
-
0
-

#45 Nnonnamme
treba cez for

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Nnonnamme
~ Anonymní uživatel
3 příspěvky
14. 11. 2012   #47
-
0
-

#46 vitamin
diky :)

Nahlásit jako SPAM
IP: 91.106.250.–
M1chy
~ Anonymní uživatel
1 příspěvek
14. 11. 2012   #48
-
0
-

Ze ty ses z VSB :D :D .. zrovna na tom makám

Nahlásit jako SPAM
IP: 79.127.200.–
Nnonnamme
~ Anonymní uživatel
3 příspěvky
15. 11. 2012   #49
-
0
-

#48 M1chy
jo jsem, uz mam hotovy vicemene vse, jenom vystup mi pise nejaky ascii hovna, tak budu muset jeste zapracovat na uprave :)

Nahlásit jako SPAM
IP: 91.106.250.–
RePRO0
Super člen
15. 11. 2012   #50
-
0
-

Zdravím, na pár řádků (a to čisté C nemám moc rád):   

    #include <stdio.h>
    #include <stdlib.h>

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

        printf("Zadejte prvni binarni cislo: ");
        scanf("%ld", &bin1);
        printf("Zadejte druhe binarni cislo: ");
        scanf("%ld", &bin2);

        while ((bin1 != 0) || (bin2 != 0)) 
        {
              sum[i++] = ((bin1 % 10) + (bin2 % 10) + zbytek) % 2;
              zbytek = ((bin1 % 10) + (bin2 % 10) + zbytek) / 2;
              bin1 = bin1/10;
              bin2 = bin2/10;
        }

        if (zbytek != 0) sum[i++] = zbytek;
        --i;
    
        printf("Soucet dvou binarnich cisel je: ");
        while (i >= 0) printf("%d", sum[i--]);
    
        system("PAUSE");
        return 0;
    }

Proč nad tím tak bádáte? Stačí se trochu zamyslet... To zbytečné uzávorkování tam být nemusí, pro přehlednost jsem raději doplnil. V C++ to jde napsat i do pěti řádků. :-)

Nahlásit jako SPAM
IP: 95.82.185.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
JoDiK
~ Anonymní uživatel
987 příspěvků
15. 11. 2012   #51
-
0
-

#50 RePRO
Co kdyby sis zajíci přečetl i upřesňující dodatky v celé diskuzi?

Opravdu do proměnných long int bin1, bin2 uložíš 254 bitové číslo???

A ten tvůj uzávorkovaný výpočet jsem nepobral, tak ho ani nebudu komentovat...

Nahlásit jako SPAM
IP: 88.103.236.–
vitamin+8
Grafoman
15. 11. 2012   #52
-
0
-

#51 JoDiK
On si do long intu ulozil cislo a predpokladal ze uzivatel zadal binarne cislo. Takze nie len ze ten program nezvladne viac bitove cisla ktore su vecsie ako long int, ale ten program nezvladne ani cisla ktore sa zmestia do longu :)

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
JoDiK
~ Anonymní uživatel
987 příspěvků
15. 11. 2012   #53
-
0
-

#52 vitamin
Aha... teď už trochu rozumím i těm harakiri v závorkách...

Díky.

Nahlásit jako SPAM
IP: 88.103.236.–
Matsn0
Duch
24. 11. 2012   #54
-
0
-

Jak byste vyjádřili podmínku pro nesprávný vstup u tohoto kódu, co napsal RePRO? Mám totiž podobný, ale vzhledem k DU ho tady nebudu psát. Myslím podmínku pro to, aby při napsání jiného vstupu než jedniček a nul zahlásil program chybu... Zkoušel jsem kombinovat if závorky, ale bohužel mi to nešlo... Děkuji

#include <stdio.h>
    #include <stdlib.h>

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

        printf("Zadejte prvni binarni cislo: ");
        scanf("%ld", &bin1);
        printf("Zadejte druhe binarni cislo: ");
        scanf("%ld", &bin2);

        while ((bin1 != 0) || (bin2 != 0))
        {
              sum[i++] = ((bin1 % 10) + (bin2 % 10) + zbytek) % 2;
              zbytek = ((bin1 % 10) + (bin2 % 10) + zbytek) / 2;
              bin1 = bin1/10;
              bin2 = bin2/10;
        }

        if (zbytek != 0) sum[i++] = zbytek;
        --i;
   
        printf("Soucet dvou binarnich cisel je: ");
        while (i >= 0) printf("%d", sum[i--]);
   
        system("PAUSE");
        return 0;
    }

Nahlásit jako SPAM
IP: 188.175.160.–
vitamin+8
Grafoman
24. 11. 2012   #55
-
0
-

#54 Matsn
Nacitas vstup ako text a potom v cykle skontrolujes ci sa tam nenachadzju ine znaky ako '0' a '1'. Potom mozes pouzit napr.  sscanf() na nacitanie znaku z retazca (toho skontrolovaneho).

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Matsn0
Duch
24. 11. 2012   #56
-
0
-

#55 vitamin
Napiš prosím příklad :-) Mě ty podmínky se nechytají

Nahlásit jako SPAM
IP: 188.175.160.–
vitamin+8
Grafoman
24. 11. 2012   #57
-
0
-

   


char retazec[50];

scanf("%49s", retazec);

for(char* str = retazec; *str != '\0'; ++str)
	if(*str != '0' && *str != '1')exit(EXIT_FAILURE);

int i;
sscanf(retazec, "%d", &i);

(nekompiloval som to, mozu tam byt dake chyby, ale princip snad pochopis)

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Matsn0
Duch
24. 11. 2012   #58
-
0
-

#57 vitamin
Počkej, já si vložil long int cislo1 a pak cislo2, abych oddělil dvě čísla mezerou, které pak sečte v binárních hodnotách, mám to přeměnit na char cislo1 a char cislo2 a vypsat ify, které si napsal pro ně?

Máš mail, prosím tě? Ukázal bych ti, co jsem vybástlil...Protože mi to nefunguje :(

Nahlásit jako SPAM
IP: 188.175.160.–
vitamin+8
Grafoman
24. 11. 2012   #59
-
0
-

Nauc sa pouzivat stavove automaty a ziaden sialeny format nebude pre teba problem   :

Tu mas kod ktory otestuje format vstupu ( dekadicke_cislo , dekadicke_cislo ). Tebe staci upravyt program tak aby fungoval len pre znaky '0' a '1'

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>

typedef enum {true=1, false=0} bool;

bool osetri(const char* retazec){
	typedef enum {Begin, Cislo1, Medzera, Ciarka, Cislo2, End}state_t;
	
	state_t stav = Begin;	//pociatocny stav
	
	const char* cislo1 = NULL;	//zaciatok cisla1 (toto mozes na konci funkcie nacitat ako cislo pomocou sscanf())
	const char* cislo2 = NULL;	//zaciatok cisla2 ( - || - )
	
	//prejde postupne vsetky znaky retazca
	for(const char* str = retazec; *str != '\0'; ++str)
		switch(stav){
			case Begin:		//pri cisle sa prepne do stavu Cislo1, pri prazdnom znaku ostane v stave Begin, pri ostatnych znakoch vrati false
				if(isdigit(*str)){
					stav = Cislo1;
					cislo1 = str;
				}
				else if(!isspace(*str))return false;
				break;
			case Cislo1:	//pri prazdnom znaku sa prepne do stavu Medzera, pri ciarke sa prepne do stavu Ciarka, pri Cisle ostane v stave Cislo1, pri inom znaku vrati chybu
				if(isspace(*str))stav = Medzera;
				else if(*str == ',')stav = Ciarka;
				else if(!isdigit(*str))return false;
				break;
			case Medzera:	//pri ciarke sa prepne do stavu Ciarka, pri prazdnom znaku ostane v stave Medzera, inak vrati chybu
				if(*str == ',')stav = Ciarka;
				else if(!isspace(*str))return false;
				break;
			case Ciarka:	//prazdne znaky ignoruje (ostane v stave Ciarka), pri prichode cisla prejde do stavu Cislo2, inak vrati chybu
				if(isdigit(*str)){
					stav = Cislo2;
					cislo2 = str;
				}
				else if(!isspace(*str))return false;
				break;
			case Cislo2:	//po prazdnom znaku prejde do stavu End, pri cisle ostane v stave Cislo2, inak vrati chybu
				if(isspace(*str))stav = End;
				else if(!isdigit(*str))return false;
				break;
			case End:	//ignoruje prazdne znaky, inak vrati chybu
				if(!isspace(*str))return false;
				break;	
			}
		
	if(stav == Cislo2 || stav == End)return true;	//ak sa po prejdeni celeho retazca rovna stav Cislo2 alebo End, tak vstupny retazec vyhovuje ziadanemu formatu
	return false;	//vstup nevyhovuje ziadanemu formatu
}

int main(){
	char retazec[200] = "";
	
	while(true){
		if(!fgets(retazec, 200, stdin))return EXIT_FAILURE;
	
		
		if(osetri(retazec) == true)puts("vstup je v spravnom formate\n");
		else puts("vstup je chybny");
	}
	
	return EXIT_SUCCESS;
}
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Matsn0
Duch
24. 11. 2012   #60
-
0
-

#59 vitamin
Ach bože, tak jsem se teď do toho úplně zamotal :-D Jsem začátečník

Nahlásit jako SPAM
IP: 188.175.160.–
Aliande
~ Anonymní uživatel
18 příspěvků
25. 11. 2012   #61
-
0
-

Co tento kód?

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main()
    {
        long int bin1, bin2;
        int i = 0, zbytek = 0, sum[20];

  cout << "Zadejte dve binarni cisla:\n";
        cin >> bin1 >> bin2;

        while ((bin1 != 0) || (bin2 != 0))
        {
              sum[i++] = ((bin1 % 10) + (bin2 % 10) + zbytek) % 2;
              zbytek = ((bin1 % 10) + (bin2 % 10) + zbytek) / 2;
              bin1 = bin1/10;
              bin2 = bin2/10;
        }

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

  cout << "Soucet: ";
        while (i >= 0) printf("%d", sum[i--]);
   
        char reakce;
  cin >> reakce;
        return 0;
    }

Nahlásit jako SPAM
IP: 188.175.160.–
Aliande
~ Anonymní uživatel
18 příspěvků
25. 11. 2012   #62
-
0
-

Ošetření nesprávného výstupu se mi stále nedaří :(

Nahlásit jako SPAM
IP: 188.175.160.–
Aliande
~ Anonymní uživatel
18 příspěvků
25. 11. 2012   #63
-
0
-

Další možné řešení, které ne a ne splňovat kritéria

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main()
{
long int bin1, bin2;
int i = 0, zbytek = 0, sum[20], number = 0;

cout << "Zadejte dve binarni cisla:\n";
cin >> bin1 >> bin2;


int dv;
number = bin1;
while(number!=0)
{
dv=number%10;
if(dv>1)
cout << "Neni binarni";
number=number/10;
}
number = bin2;

while(number!=0)
{
dv=number%10;
if(dv>1)
cout << "Neni binarni";
number=number/10;
}

while ((bin1 != 0) || (bin2 != 0))
{
sum[i++] = ((bin1 % 10) + (bin2 % 10) + zbytek) % 2;
zbytek = ((bin1 % 10) + (bin2 % 10) + zbytek) / 2;
bin1 = bin1/10;
bin2 = bin2/10;
}

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

cout << "Soucet: ";
while (i >= 0) printf("%d", sum[i--]);

char reakce;
cin >> reakce;
return 0;
}

Nahlásit jako SPAM
IP: 188.175.160.–
vitamin+8
Grafoman
25. 11. 2012   #64
-
+1
-
Zajímavé

#63 Aliand

Staci ti testovat (bin1 % 10) a (bin2 % 10). Ak sa nerovnaju 0,1 tak je vstup v zlom formate.

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Aliande
~ Anonymní uživatel
18 příspěvků
25. 11. 2012   #65
-
0
-

Ukázal bys mi to prosím na kódu? Já už jsem z toho dneska zmatený, sedím u třech úkolů celý den, tohle je poslední a musím ho do půlnoci odevzdat :( Děkuji ti, dobrá Vílo :)

Nahlásit jako SPAM
IP: 188.175.160.–
vitamin+8
Grafoman
25. 11. 2012   #66
-
0
-

   

if( (bin1 % 10 != 0) && (bin1 % 10) != 1){
	cout << "cislo 1 nie je binarne" << endl;
	exit(EXIT_FAILURE);
}
if( (bin2 % 10 != 0) && (bin2 % 10) != 1){
	cout << "cislo 2 nie je binarne" << endl;
	exit(EXIT_FAILURE);
}
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
RePRO0
Super člen
25. 11. 2012   #67
-
0
-

Nechci se nějak dotknout vitamina, to co napsal pomocí stavového automatu je východisko a možné řešení, ale pro takto jednoduchý příklad stačí něco takového (zatím jenom hodně pseudo a z hlavy):

bool check(long int number, int search_1, int search_2)
{
    while (number > 0)
    {
        int digit = number % 10;
        number    = number / 10;
        if (digit != search_1 && digit != search_2) return false;
    }
    return true;
}

Poté tu funkci zavoláme:

std::cout << check(10101010, 1, 0) << " \n";

Takže teď to udělá to, že 10101010 to vezme, ale 10101012 to nevezme. Problém nastane, pokud zkusíme otestovat 00101010 (na začátku je nula, to pak reprezentuje oktanové číslo). To budu muset ještě promyslet. Je to vlastně to, co napsal vitamin výše... Zkoušel jsi to vitamine pro vstup 01010101?

Tak funguje, takže chválím nakonec vitamina za pěkné řešení!

Takže jenom zkrátím pro úplnost:

bool check(int long number)
{
     return ((number % 10 != 0) && (number % 10) != 1);
}
Nahlásit jako SPAM
IP: 95.82.185.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
Aliande
~ Anonymní uživatel
18 příspěvků
25. 11. 2012   #68
-
0
-

Ach bože, nejede to. Když tam zadám například písmena, objeví se nějaký nedobrý ascii součet. Napište mi prosím celý kód, chci se toho jen rychle zbavit už, je to poslední úloha a nad moje síly :( DĚKUJI :(

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main()
    {
        long int bin1, bin2;
        int i = 0, zbytek = 0, sum[20];

  cout << "Zadejte dve binarni cisla:\n";
        cin >> bin1 >> bin2;

        while ((bin1 != 0) || (bin2 != 0))
        {
              sum[i++] = ((bin1 % 10) + (bin2 % 10) + zbytek) % 2;
              zbytek = ((bin1 % 10) + (bin2 % 10) + zbytek) / 2;
              bin1 = bin1/10;
              bin2 = bin2/10;
        }

        if (zbytek != 0) sum[i++] = zbytek;
        --i;
  if( (bin1 % 10 != 0) && (bin1 % 10) != 1){
cout << "cislo 1 nie je binarne" << endl;
}
if( (bin2 % 10 != 0) && (bin2 % 10) != 1){
cout << "cislo 2 nie je binarne" << endl;
}
  cout << "Soucet: ";
        while (i >= 0) printf("%d", sum[i--]);
   
        char reakce;
  cin >> reakce;
        return 0;
    }

Nahlásit jako SPAM
IP: 188.175.160.–
vitamin+8
Grafoman
25. 11. 2012   #69
-
0
-

#68 Aliande
cin >> bin1 >> bin2;

tento kod ocakava ze zadas len cisla, ak zadas nieco ine, tak sa nastavy v streame cin failbit ktory mozes zistit pomocou funkcie cin.fail(). Ak je nastaveny failbit (alebo badbit) tak sa neda stream pouzit a musis ho "resetnut" pomocou cin.clear().

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Aliande
~ Anonymní uživatel
18 příspěvků
25. 11. 2012   #70
-
0
-

Napiš to prosím. Já už rezignoval na přemýšlení :(

Nahlásit jako SPAM
IP: 188.175.160.–
RePRO0
Super člen
25. 11. 2012   #71
-
0
-

Takhle je to i s tím ošetřením, jde to?

#include <cstdlib>
#include <iostream>

using namespace std;

bool check(int long number)
{
     return ((number % 10 != 0) && (number % 10) != 1);
}

int main()
{
     long int bin1, bin2;
     int i = 0, zbytek = 0, sum[20];
        
     cout << "Zadejte prvni bin. cislo: ";
     cin >> bin1;
     while( check(bin1) )
     {
          cout << "Spatny vstup - zadejte znovu: ";
          cin >> bin1;
     }
        
     cout << "Zadejte druhe bin. cislo: ";
     cin >> bin2;
     while( check(bin2) )
     {
           cout << "Spatny vstup - zadejte znovu: ";
           cin >> bin2;
     }
        
     while ((bin1 != 0) || (bin2 != 0)) 
     {
           sum[i++] = ((bin1 % 10) + (bin2 % 10) + zbytek) % 2;
           zbytek = ((bin1 % 10) + (bin2 % 10) + zbytek) / 2;
           bin1 = bin1/10;
           bin2 = bin2/10;
     }

     if (zbytek != 0) sum[i++] = zbytek;
     --i;
    
     printf("Soucet dvou binarnich cisel je: ");
     while (i >= 0) printf("%d", sum[i--]);
    
     system("PAUSE");
     return 0;
}

Takhle je to neprofesionálně, v C++ by se to mělo dělat pomocí cin.fail a cin.clear (jak píše vitamin). Ale každopádně toto můžeš taky poslat.

Nahlásit jako SPAM
IP: 95.82.185.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
Aliande
~ Anonymní uživatel
18 příspěvků
25. 11. 2012   #72
-
0
-

Upravil jsem to na tohle. Bohužel pořád ty chyby... Když zadám písmena, vyhodí to nesmyslnou hodnotu. Když zadám nějaká čísla 565545 apod nepíše to nic... Ale sčítání funguje...Bihužel pořád se bavíme o těch chybách

#include <cstdlib>
#include <iostream>

using namespace std;

bool check(int long number)
{
     return ((number % 10 != 0) && (number % 10) != 1);
}

int main()
{
     long int bin1, bin2;
     int i = 0, zbytek = 0, sum[20];
       
     cout << "Zadejte prvni bin. cislo: ";
     cin >> bin1 >> bin2;
     while( check(bin1) )
     {
          cout << "Nespravny vstup.";
     }

     while( check(bin2) )
     {
           cout << "Nespravny vstup.";
     }
       
     while ((bin1 != 0) || (bin2 != 0))
     {
           sum[i++] = ((bin1 % 10) + (bin2 % 10) + zbytek) % 2;
           zbytek = ((bin1 % 10) + (bin2 % 10) + zbytek) / 2;
           bin1 = bin1/10;
           bin2 = bin2/10;
     }

     if (zbytek != 0) sum[i++] = zbytek;
     --i;
   
     printf("Soucet dvou binarnich cisel je: ");
     while (i >= 0) printf("%d", sum[i--]);
   
     char reakce;
  cin >> reakce;
     return 0;
}

Nahlásit jako SPAM
IP: 188.175.160.–
Aliande
~ Anonymní uživatel
18 příspěvků
25. 11. 2012   #73
-
0
-

Výstup má totiž vypadat takto - což bohužel opravdu nevím jak udělat :(

Zadejte dve binarni cisla:
10101 101001
Soucet: 111110

Zadejte dve binarni cisla:
1111100 100
Soucet: 10000000

Zadejte dve binarni cisla:
101 101
Soucet: 1010

Zadejte dve binarni cisla:
11111 111
Soucet: 100110

Zadejte dve binarni cisla:
001 000001
Soucet: 10

Zadejte dve binarni cisla:
10020 1001a0
Nespravny vstup.

Zadejte dve binarni cisla:
abraka1dabra0 1fuj0tajksl1
Nespravny vstup.

Nahlásit jako SPAM
IP: 188.175.160.–
Aliande
~ Anonymní uživatel
18 příspěvků
25. 11. 2012   #74
-
0
-

Kde je problém :(

Nahlásit jako SPAM
IP: 188.175.160.–
vitamin+8
Grafoman
25. 11. 2012   #75
-
0
-

Tu mas kod, pouzil som funkciu na prevod stringu obsahujuceho cislo na uint64_t (to je vlastne unsigned long, premenuj si to ak chces), funkcia pracuje s bazami 1-10 a testuje pretecenie (ak nepotrebujes testovat pretecenie tak si odtial odstran polku kodu   a ak potrebujes len binarne cisla tak zmaz aj template cast a 'base' nahrad  2) .

Program nacita dva stringy, skonvertuje ich na cislo a potom zrata cisla a naspet ich skonvertuje na string.

#include <iostream>
#include <string>
#include <limits>
#include <cstdint>
using namespace std;

template <unsigned short base>
bool str2uint(uint64_t &num, const string& str){
	static_assert( 0 < base && base <= 10, "zla baza" );
	num = 0;						
	uint64_t 	vaha = 1;				//vaha ktorou sa nasobi nacitany znak(cislo)
	bool 		overflow = false;		//pretecenie (pouziva sa ked pretecie vaha, ak su 0-ly pred cislom tak pretecena vaha nevadi)

	//reverzne spracovanie vstupneho stringu
	for(auto i = str.rbegin(); i != str.rend(); ++i){
		uint8_t c = (*i - '0');
		if(c >= base){		//chybny znak v retazci
			num = 0;
			return false;
		}
		uint64_t tmp_num;

		if(c && overflow){
			num = std::numeric_limits<uint64_t>::max();
			return false;		//pretecenie
		}
		tmp_num = num;
		tmp_num += c * vaha;
		if(tmp_num < num){
			num = std::numeric_limits<uint64_t>::max();
			return false;		//pretecenie
		}
		else num = tmp_num;

		if(vaha > vaha * base)overflow = true;	//pretecenie vahy
		vaha *= base;
	}
	return true;
}
string uint2bin_str(uint64_t num){
	string str;
	uint64_t x = 0;
	uint64_t y = 1;
	for(; (x < y) && (y <= num); (x = y), (y *= 2))
		str +=  (num & y)?'1':'0'; 
	
	return string(str.rbegin(), str.rend());
}
		
int main(){
	uint64_t bin1, bin2;
	string str_bin1, str_bin2;
	
	while(true){
		cout << "Zadejte dve binarni cisla:" << endl;
		cin >> str_bin1 >> str_bin2;
		
		if(!str2uint<2>(bin1, str_bin1) || !str2uint<2>(bin2, str_bin2)){
			cerr << "Nespravny vstup." << endl << endl;
			continue;
		}

		cout << "Soucet: " << uint2bin_str(bin1 + bin2) << endl << endl;	//pri scitani moze nastat pretecenie
	}
	
	return EXIT_SUCCESS;
}

edit: velku cast programu som pisal uz davno,preto tam je zopar zbitocnosti (pre teba).

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Aliande
~ Anonymní uživatel
18 příspěvků
25. 11. 2012   #76
-
0
-

#75 vitamin
Nepotřebuju testovat přetečení. Smazat template nahoře... nevím hlásí to pořád nějaké chyby :( jde mi jen o ten úkol a jsem bezradný

Nahlásit jako SPAM
IP: 188.175.160.–
vitamin+8
Grafoman
25. 11. 2012   #77
-
0
-

skrat tu vrchnu funkciu na:

bool str2uint(uint64_t &num, const string& str){
	num = 0;						
	uint64_t 	vaha = 1;

	for(auto i = str.rbegin(); i != str.rend(); ++i){
		uint8_t c = (*i - '0');
		if(c >= 2)return false;
		num += c * vaha;
		vaha *= 2;
	}
	return true;
}

a zmaz    <2>    v maine

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
RePRO0
Super člen
26. 11. 2012   #78
-
0
-

Vitamine, tohle nemůže zaslat jako domácí úkol. ;-)

Nahlásit jako SPAM
IP: 95.82.185.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
vitamin+8
Grafoman
26. 11. 2012   #79
-
0
-

#78 RePRO
Ak by pouzil tu zjednodusenu funkciu a premenoval by si uint64_t napr na unsigned tak by tam snad neostalo nic "zlozite", nie? 

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
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, 18 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ý