• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Porównywanie dużych liczb C++ [Pomocy]

Object Storage Arubacloud
0 głosów
1,127 wizyt
pytanie zadane 15 lipca 2018 w C i C++ przez Krrer Nowicjusz (120 p.)
otagowane ponownie 15 lipca 2018 przez Krrer
#include <iostream>
#include <string>



using namespace std;
int main(){
    string a, b, znak;
    bool odp;
    cin >> a >> znak >>  b;
    if (znak == ">") odp = ((a > b)&& (a.size() >= b.size()));
    else if (znak == ">=") odp = ((a >= b)&& (a.size() >= b.size()));
    else if (znak == "<") odp = ((a < b)&&(a.size() <= b.size()));
    else if (znak == "<=") odp = ((a <= b)&&(a.size() <= b.size()));
    else if (znak == "==") odp = (a == b);
    else if (znak == "!=") odp = (a != b);

    if (odp)
        cout << "TAK";
    else
        cout << "NIE";
}

Robię zadanie: https://main2.edu.pl/c/konkurs-wstepu-do-programowania/p/duz/ Program podczas sprawdzania 6 razy zwraca NIE zamiast TAK. Szukając pomocy na forach nie widziałem tego sposobu i nie wiem czy zły jest sposób czy jego wykonanie.

komentarz 15 lipca 2018 przez Hiskiel Pasjonat (22,830 p.)
If(!odp) cout<<"TAK" else cout<<"NIE"

;))

 

//To nie jest odpowiedź
komentarz 15 lipca 2018 przez Krrer Nowicjusz (120 p.)
na 96 testów tylko 6 mam źle więc raczej nie o to chodzi
komentarz 15 lipca 2018 przez Krrer Nowicjusz (120 p.)
poza tym to trochę nielogiczne
komentarz 15 lipca 2018 przez Hiskiel Pasjonat (22,830 p.)
Wręcz przeciwnie. Jest to dosłownie logiczne ;).
komentarz 15 lipca 2018 przez Krrer Nowicjusz (120 p.)
Nie wiem czy to jakaś enigmatyczna podpowiedź, czy robisz sobie ze mnie żarty, ale jakbyś był w stanie mi jakoś pomóc to byłbym bardzo wdzięczny, siedzę nad tym zadaniem już 4 godzinę...
komentarz 15 lipca 2018 przez DragonCoder Nałogowiec (36,500 p.)
Skoro na 96 testow zwraca tylko przy 6 zla odp, to pomyslalbym, jakie byly poprzednie testy, czym sie roznily i w jakim wypadku zawiodl program, wtedy wiedzac, gdzie jest roznica, moze znajdziesz blad
komentarz 15 lipca 2018 przez Krrer Nowicjusz (120 p.)
Problem jest taki, że sprawdzanie odbywa się bez mojego wglądu, na stronie. Potem widzę tylko ilość wykonanych testów i błędy, niestety bez danych wejściowych.
komentarz 16 lipca 2018 przez sp00ky Obywatel (1,760 p.)

@Krrer,

Użyj funkcji compare()

http://www.cplusplus.com/reference/string/string/compare/

Tak na szybko, na pewno da się zapisać bardziej optymalnie

#include <iostream>
#include <string>

int main()
{
    std::string a, b, c;
    std::cin >> a >> c >> b;

    if(c == "==") {
        if(a != b) {
            std::cout << a << " " << c << " " << b << "\n";
            std::cout << "NIE\n";
        } else {
            std::cout << a << " " << c << " " << b << "\n";
            std::cout << "TAK\n";
        }
    }

    if(c == "!=") {
        if(a == b) {
            std::cout << a << " " << c << " " << b << "\n";
            std::cout << "NIE\n";
        } else {
            std::cout << a << " " << c << " " << b << "\n";
            std::cout << "TAK\n";
        }
    }

    if(c == "<=") {
        if(a.compare(b) < 0 || a == b) {
            std::cout << a << " " << c << " " << b << "\n";
            std::cout << "TAK\n";
        } else {
            std::cout << a << " " << c << " " << b << "\n";
            std::cout << "NIE\n";
        }
    }

    if(c == ">=") {
        if(a.compare(b) > 0 || a == b) {
            std::cout << a << " " << c << " " << b << "\n";
            std::cout << "TAK\n";
        } else {
            std::cout << a << " " << c << " " << b << "\n";
            std::cout << "NIE\n";
        }
    }

    if(c == "<") {
        if(a.compare(b) < 0) {
            std::cout << a << " " << c << " " << b << "\n";
            std::cout << "TAK\n";
        } else {
            std::cout << a << " " << c << " " << b << "\n";
            std::cout << "NIE\n";
        }
    }

    if(c == ">") {
        if(a.compare(b) > 0) {
            std::cout << a << " " << c << " " << b << "\n";
            std::cout << "TAK\n";
        } else {
            std::cout << a << " " << c << " " << b << "\n";
            std::cout << "NIE\n";
        }
    }

    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 15 lipca 2018 przez adrian17 Ekspert (344,860 p.)

Bo porównujesz tekst, nie liczby.

Na przykład:

if (znak == ">") odp = ((a > b)&& (a.size() >= b.size()));

`a > b` nie jest poprawne, bo "11" > "100", ale 11 < 100.

komentarz 15 lipca 2018 przez Krrer Nowicjusz (120 p.)
Więc cały program do wymiany? Wydawało mi się że idę w dobrą stronę skoro większość wyników była dobra.
komentarz 15 lipca 2018 przez adrian17 Ekspert (344,860 p.)

Więc cały program do wymiany?

Może inaczej: to nie jest aż tak proste, jak planowałeś ;)

Wydawało mi się że idę w dobrą stronę skoro większość wyników była dobra.

Bo tak się składało, że porównanie stringów często pokrywa się z numerycznym. "2" > "1", "26" > "1" etc... ale już "27" > "10004".

komentarz 15 lipca 2018 przez Krrer Nowicjusz (120 p.)
No dlatego mam w if a.size() >= b.size() i dla przykładu który podałeś program podaje odpowiedź "NIE".
komentarz 15 lipca 2018 przez adrian17 Ekspert (344,860 p.)

Fakt, to konkretny przykład gdzie masz NIE zamiast TAK:

if (znak == ">") odp = ((a > b)&& (a.size() >= b.size()));

porównujesz "100" i "11":

a > b -> "100" > "11" -> false
a.size() >= b.size() -> true
true && false -> false -> NIE.

komentarz 15 lipca 2018 przez Krrer Nowicjusz (120 p.)
Zauważyłem wcześniej że a > b -> "100" > "11" -> false  dlatego chcąc się chronić przed tym błędem dodałem a.size() >= b.size()  jak widać zawiodło w większej skali, mimo że sam nie jestem w stanie znaleźć danych wejścia dla których wynik byłby nieprawidłowy.
0 głosów
odpowiedź 15 lipca 2018 przez Ukasz Użytkownik (960 p.)

Napisałem coś takiego. Wydaje się być dobre, ale możliwe że coś przeoczyłem

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
 string s_a, s_b,  s_literaA, s_literaB, s_odp, s_znak; int i, i_cyfraA, i_cyfraB; bool b_odp;
 cout<<"Podaj nierownosc: \n";
 cin>>s_a>>s_znak>>s_b;

 //USTALAM JAKI POWINIEN BYC ZNAK NIEROWNOSCI
    //dla liczb tej samej dlugosci
 if(s_a.size()==s_b.size())
 { i=0;
    while(s_a.length()!=i)
    {
      s_literaA=s_a[i]; s_literaB=s_b[i];
      i_cyfraA=atoi(s_literaA.c_str());
      i_cyfraB=atoi(s_literaB.c_str());
        if(i_cyfraA>i_cyfraB){s_odp=">"; break;}
        if(i_cyfraA<i_cyfraB){s_odp="<"; break;}
      i++;
    }
    if(s_a.length()==i){s_odp="=";}
 }
    //dla liczb innej dlugosci
 if(s_a.size()>s_b.size()){s_odp=">";}
 if(s_a.size()<s_b.size()){s_odp="<";}

  //SPRAWDZAM CZY WPISANY ZNAK ZGADZA SIE Z PRAWIDLOWYM
  if(s_znak=="="){if(s_odp=="="){b_odp=true;} else {b_odp=false;}}
  if(s_znak==">"){if(s_odp==">"){b_odp=true;} else {b_odp=false;}}
  if(s_znak=="<"){if(s_odp=="<"){b_odp=true;} else {b_odp=false;}}
  if(s_znak==">="){if((s_odp==">")||(s_odp=="=")){b_odp=true;} else {b_odp=false;}}
  if(s_znak=="<="){if((s_odp=="<")||(s_odp=="=")){b_odp=true;} else {b_odp=false;}}

 //ODPOWIEDZ
 if(b_odp){cout<<"TAK \n \n";} else {cout<<"NIE \n \n";}
 system("pause");

 return 0;
}

Co myślicie?

komentarz 15 lipca 2018 przez Krrer Nowicjusz (120 p.)
Mi wydaję się dobry, ale na stronie 2 odpowiedzi były błędne. Inne niż w moim programie.

Podobne pytania

0 głosów
1 odpowiedź 940 wizyt
0 głosów
1 odpowiedź 759 wizyt
0 głosów
0 odpowiedzi 328 wizyt
pytanie zadane 25 września 2021 w C i C++ przez Exequilas Nowicjusz (210 p.)

92,537 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...