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

question-closed C++ duże liczby

0 głosów
1,509 wizyt
pytanie zadane 9 maja 2018 w C i C++ przez koniak20 Początkujący (390 p.)
zamknięte 10 maja 2018 przez koniak20

Witam, zrobiłem sobie to o to zadanko:

https://main2.edu.pl/c/konkurs-wstepu-do-programowania/p/duz/

I w testach na ich stronie odrzuca mi 4 z 96 testów w każdym jest TAK a powino być NIE.

Trochę posiedziałem nad kodem i błędu znaleźć nie mogę.

Wiem , że był już post o to samo zadanie( o tu link do posta https://forum.pasja-informatyki.pl/239464/bardzo-duze-liczby-c), ale nie chodzi mi o samo rozwiązanie tylko raczej o pomoc w szukaniu błędu.

Przy okazji byłbym wdzięczny gdyby ktoś powiedział czy kod jest przejrzysty i czy jest to zrobione w miarę optymalnie. (Dopiero zaczynam).

A tu mój kod:

#include <iostream>

using namespace std;
bool rowny=false, awieksze, prawda=true;
int main()
{
    string a,b,znak;
    cin>>a>>znak>>b;
    int da=a.length(), db=b.length();
    if(da==db)
    {
        for(int i=0; i<da && prawda; i++)
        {
            if((int)a[i]%48>(int)b[i]%48)
            {
                awieksze=true;
                prawda=false;
            }
            else if((int)a[i]%48<(int)b[i]%48)
            {
                awieksze=false;
                prawda=false;
            }
        }
        if(prawda)
            rowny=true;
    }
    else if(da>db)
        awieksze=true;
    else
        awieksze=false;
    if(rowny && (znak=="==" || znak==">=" || znak=="<="))
    {
        cout<<"TAK"<<endl;
    }
    else if(awieksze && (znak==">="|| znak=="!="|| znak==">" ))
    {
        cout<<"TAK"<<endl;
    }
    else if(!awieksze && (znak=="<="|| znak=="!="|| znak=="<" ))
    {
        cout<<"TAK"<<endl;
    }
    else
        cout<<"NIE"<<endl;

}

 

komentarz zamknięcia: Problem rozwiązany
komentarz 9 maja 2018 przez Mariusz08 Maniak (62,280 p.)
Zły język bloczka z kodem.
komentarz 9 maja 2018 przez koniak20 Początkujący (390 p.)
Już poprawione, dzięki za uwagę nie zauważyłem tego.

2 odpowiedzi

+1 głos
odpowiedź 9 maja 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
wybrane 10 maja 2018 przez koniak20
 
Najlepsza

Problem będzie w sytuacji, gdy liczby będą równe, a operatorem będzie != lub <. Wtedy pierwszy if nie będzie spełniony i zacznie sprawdzać pozostałe warunki, aż dojdzie do tego warunku:

else if(!awieksze && (znak=="<="|| znak=="!="|| znak=="<" ))

który będzie spełniony.

Co do uwag, to nazywaj bardziej sensownie zmienne, unikaj zmiennych globalnych i using namespace std. Jak używasz std::string to powinieneś mieć w kodzie #include <string>.

komentarz 10 maja 2018 przez koniak20 Początkujący (390 p.)

Zmieniłem na coś takiego:

 else if(!rowny && !awieksze && (znak=="<=" || znak=="!=" || znak=="<" ))

Lecz dalej wyrzuca te same błędy.

I pytanko odnośnie using namespace czemu mam tego unikać?

komentarz 10 maja 2018 przez koniak20 Początkujący (390 p.)

Już działa dodałem tylko !rowny do wczesniejszego else if i jest okej.
Jeśli kogoś interesuje kod to teraz wygląda on tak:
 

#include <iostream>

using namespace std;

int main()
{
    bool rowny=false, awieksze=2, prawda=true;
    string a,b,znak;
    cin>>a>>znak>>b;
    int length_a=a.length(), length_b=b.length();
    if(length_a==length_b)
    {
        for(int i=0; i<length_a && prawda; i++)
        {
            if((int)a[i]%48>(int)b[i]%48)
            {
                awieksze=true;
                prawda=false;
            }
            else if((int)a[i]%48<(int)b[i]%48)
            {
                awieksze=false;
                prawda=false;
            }
        }
        if(prawda)
            rowny=true;
    }
    else if(length_a>length_b)
        awieksze=true;
    else
        awieksze=false;
    if(rowny && (znak=="==" || znak==">=" || znak=="<="))
    {
        cout<<"TAK"<<endl;
    }
    else if(!rowny && awieksze && (znak==">=" || znak=="!=" || znak==">" ))
    {
        cout<<"TAK"<<endl;
    }
    else if(!rowny && !awieksze && (znak=="<=" || znak=="!=" || znak=="<" ))
    {
        cout<<"TAK"<<endl;
    }
    else
        cout<<"NIE"<<endl;

}

 

komentarz 10 maja 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)

I pytanko odnośnie using namespace czemu mam tego unikać?

https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice 

0 głosów
odpowiedź 9 maja 2018 przez piotrku321 Nowicjusz (140 p.)
Jedna rada odnośnie przejrzystości, pisz nazwy zmiennych tak, żeby można było stwierdzić do czego służą (z kontekstem)

bo da i db może być niezrozumiałe
komentarz 9 maja 2018 przez koniak20 Początkujący (390 p.)
Lepiej pisać długie nazwy niż krótkie i nieczytelne tak?
Czyli zamiast da lepiej dlugosc_a?
komentarz 9 maja 2018 przez piotrku321 Nowicjusz (140 p.)
Tak tylko po angielsku się przyzwyczajaj, czyli np. length_a;
komentarz 9 maja 2018 przez Perseusz Bywalec (2,180 p.)

@koniak20 Znacznie, moim zdaniem też tak jak kolega niżej pisze: po angielsku. No i nie ograniczałbym się z notatkami// przy większym projekcie naprawdę ci się przydadzą. Kod łatwiej pisać niż czytać...

komentarz 9 maja 2018 przez piotrku321 Nowicjusz (140 p.)

I jak zaczniesz pisać obiektowo to możesz dawać zmienne o krótkich nazwach tylko komentowane i zamieszczone lokalnie (prywatne).

 

komentarz 9 maja 2018 przez koniak20 Początkujący (390 p.)
Zapamiętam ,a odnośnie błędu ktoś z was go może widzi?
komentarz 9 maja 2018 przez piotrku321 Nowicjusz (140 p.)
A w zadaniu może pojawić się liczba z zerem, zerami na początku?
komentarz 9 maja 2018 przez Arkadiusz Sikorski Pasjonat (20,160 p.)

I jak zaczniesz pisać obiektowo to możesz dawać zmienne o krótkich nazwach tylko komentowane i zamieszczone lokalnie (prywatne).

Generalnie zasada jest taka, że nazwa powinna być tym dłuższa (analogicznie: krótsza) czym bardziej ogólny (odpowiednio: szczegółowy) jest kontekst (dlatego często iteratory wykorzystywane w pętlach nazywa się it, a zmienne w pętlach for i,j - są to względnie małe zakresy ważności, więc nazwy są krótkie) .

Podobne pytania

0 głosów
2 odpowiedzi 7,142 wizyt
pytanie zadane 8 lutego 2017 w C i C++ przez maciek061 Gaduła (4,490 p.)
0 głosów
3 odpowiedzi 2,899 wizyt
pytanie zadane 28 marca 2017 w C i C++ przez Kenzy Obywatel (1,160 p.)
0 głosów
1 odpowiedź 1,862 wizyt
pytanie zadane 9 kwietnia 2017 w C i C++ przez maciek259 Nowicjusz (240 p.)

93,742 zapytań

142,678 odpowiedzi

323,297 komentarzy

63,327 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...