• 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

VPS Starter Arubacloud
0 głosów
859 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,300 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,190 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 5,839 wizyt
pytanie zadane 8 lutego 2017 w C i C++ przez maciek061 Gaduła (4,490 p.)
0 głosów
3 odpowiedzi 1,894 wizyt
pytanie zadane 28 marca 2017 w C i C++ przez Kenzy Obywatel (1,160 p.)
0 głosów
1 odpowiedź 1,213 wizyt
pytanie zadane 9 kwietnia 2017 w C i C++ przez maciek259 Nowicjusz (240 p.)

92,454 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...