Który kod optymalniejszy?

Odpowiedz Nowy wątek
2011-08-20 16:13
gubbi
0

Który waszym zdaniem kod jest bardzie optymalny? i dlaczego tak uważacie?
KOD1:

#include<cstdio>
 
int main()
{
    double a, b, c;
    while(scanf("%le%le%le", &a, &b, &c)){
    if(a+b>c && a+c>b && c+b>a) printf("%hd\n", 1);
    else printf("%hd\n", 0);
    }
    return 0;
}

KOD2:

#include<iostream>
using namespace std;
int main()
{
    double a, b, c;
    while(cin>>a>>b>>c){
    if(a+b>c && a+c>b && c+b>a) cout<<1<<endl;
    else cout<<0<<endl;
    }
    return 0;
}
Nie ma czegoś takiego jak "bardziej optymalny". Albo jest optymalny albo nie. - somekind 2011-08-20 17:21

Pozostało 580 znaków

2011-08-20 16:25
1

Czyli chodzi co o zwrot "stdio vs iostream performance" do wpisania w Google? Tutaj masz wynik z pierwszej strony: http://stackoverflow.com/ques[...]iostreams-or-am-i-just-dealin poczytaj sobie.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2011-08-20 18:47
Zjarek
0

Jeśli chodzi Ci o konkursy, używaj scanfa. Jeżeli nie, używaj iostream. Główną zaletą iostream jest to, że składnia nie zależy od typu danych. Jeżeli odpowiednio używasz typedefów, to bez kłopotu możesz przerobić program z powiedzmy double na float (program zbyt wolno liczy/zajmuje za dużo pamięci), long double (potrzebna większa precyzja), czy w ogóle jakiś typ ułamkowy o nieskończonej precyzji. Nadal wtedy twoje funkcje wypisujące działają. Dodatkowo możesz przeciążać operator<< dla obiektów, co także poprawia czytelność kodu. Najszybsze i tak jest samodzielne wczytywanie danych do dość sporego buforu i ich parsowanie.

Pozostało 580 znaków

2011-08-20 20:30
2

W książce "Algorytmika praktyczna - nie tylko dla mistrzów" wykute było, że stosowanie cout/cin jest około pięć razy wolniejsze od printf/scanf. Mimo to nie skacz z balkonu i nie zmieniaj tak nagle życia swego, bo to bez sensu. Tego typu instrukcje akurat nie sprawią, że twój program zazna chwały i glorii. Wręcz przeciwnie stosując archaiczne konstrukcie wrócisz do problemów z którymi już dawno sobie poradzono. Nie wierzysz? To poczekaj, aż postrzelisz się z winny błędnie określonego specyfikatora typu.

edytowany 1x, ostatnio: absent, 2011-08-20 20:30

Pozostało 580 znaków

2011-08-20 21:07
1
Zjarek napisał(a)

Dodatkowo możesz przeciążać operator<< dla obiektów, co także poprawia czytelność kodu..

Tak, na pewno przeciążanie operatora przesunięcia bitowego poprawia czytelność. Dobrze też jest przeciążać dla stringa np. '++' jako uppercase i '/' jako split. Niech żyje spaghetti!

Pozostało 580 znaków

2011-08-21 16:00
gubbi
0

Thx za odp.
Jednak wciąż nie rozumiem dlaczego KOD1 ma lepszy czas wykonania od KOD2? skoro cin i cout są 5 razy wolniejsze od printf i scanf() ktoś już wcześniej napisał.

Pozostało 580 znaków

2011-08-21 16:08
gubbi
0

sorry chodzi mi odwrotnie dlaczego KOD2 ma lepszy czas wykonania od KOD1

Pozostało 580 znaków

2011-08-21 16:27
0

dlaczego KOD2 ma lepszy czas wykonania od KOD1?

Dlatego, bo odpada przetwarzanie format stringów dla funkcji scanf i printf. W przypadku iostream rozpoznanie typu, a co za tym idzie dobranie odpowiedniej konwersji, następuje podczas kompilacji.

(...) skoro cin i cout są 5 razy wolniejsze od printf i scanf() ktoś już wcześniej napisał.

Bzdury!

edytowany 2x, ostatnio: _0x666_, 2011-08-21 16:33

Pozostało 580 znaków

2011-08-21 16:45
0
Zjarek napisał(a)

Jeśli chodzi Ci o konkursy, używaj scanfa.

E tam. Wyłączenie synchronizacji strumienii ze standardowym wejściem / wyjściem (ios_base::sync_with_stdio(0)) i ciny/couty potrafią osiągnąć prędkość porównywalną ze scanfami/printfami, szczególnie gdy w zadaniu nie ma zbyt wielu danych na wejściu / wyjściu.

Pozostało 580 znaków

2011-08-21 17:28
gubbi
0
0x666 napisał(a)

dlaczego KOD2 ma lepszy czas wykonania od KOD1?

Dlatego, bo odpada przetwarzanie format stringów dla funkcji scanf i printf. W przypadku iostream rozpoznanie typu, a co za tym idzie dobranie odpowiedniej konwersji, następuje podczas kompilacji.

Dalej nic z tego nie rozumiem... może jest ktoś kto potrafi to wytłumaczyć w bardziej przystępny sposób?

edytowany 1x, ostatnio: madmike, 2016-12-13 18:26

Pozostało 580 znaków

2011-08-21 18:27
0

Bo gdy masz printf("%d",zmienna), to w trakcie uruchomienia program parsuje stringa "%d" żeby wiedzieć, jak ma potraktować zmienną. A jeżeli masz cout<<zmienna, to w trakcie kompilacji następuje wiązanie i program wie, że ma wywołać wypisanie zmiennej typu int.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0