Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

zadanie 4 lekcji 7 - pomocy

Ostatnio zmodyfikowano 2010-11-24 12:53
Autor Wiadomość
ison
» 2010-11-22 16:09:19
no i prosz... pałkerskie rozwiązanie:
C/C++
#include <iostream>
#include <string>

template < class f_T > void FloatRead( f_T & f1 ) {
    f1 = 0.0;
    std::string temp;
    std::cin >> temp;
   
    f_T multiplier = 1;
    int ix = temp.find( "," );
    if( ix ==- 1 ) ix = temp.find( "." );
   
    if( ix ==- 1 ) ix = temp.size();
   
    while(( ix-- ) - 1 ) multiplier *= 10.0;
   
    if( temp[ 0 ] == '-' ) multiplier /= 10;
   
    for( unsigned int i = 0; i < temp.size(); ++i ) {
        if( temp[ i ] == ',' || temp[ i ] == '.' || temp[ i ] == '-' ) continue;
       
        f1 +=( f_T )( temp[ i ] - 48 ) * multiplier;
        multiplier /= 10.0;
    }
   
    if( temp[ 0 ] == '-' ) f1 *=- 1;
   
}


int main()
{
    double MyDouble;
    FloatRead( MyDouble );
    std::cout << "MyDouble: " << MyDouble << std::endl;
}
tym sposobem możesz wczytywać double (lub floaty, long double) z przecinkiem lub z kropką (działają nawet liczby ujemne :))
miłego wczytywania doubli z przecinkiem zamiast kropki :-)
P-24312
DejaVu
» 2010-11-22 18:41:54
To nie jest poprawny sposób na obsługę liczb rzeczywistych. Działać być może działa, ale nie tędy droga, bowiem nie masz wsparcia dla precyzji.
P-24333
ison
» 2010-11-22 18:43:40
mógłby pan rozwinąć ten temat? jak nie ma wsparcia dla precyzji?
P-24334
DejaVu
» 2010-11-22 18:48:13
wprowadź z 15 zer po przecinku, a następnie 9.
P-24336
ison
» 2010-11-22 19:12:02
15 miejsc:
dla
0,000000000000001
output
MyDouble: 1e-015
9 miejsc:
dla
0,000000001
output
MyDouble: 1e-009

jak na moje oko to jest dobrze...
można zawsze zmienić cout'a na printf'a
C/C++
printf( "MyDouble: %.15lf\n", MyDouble );

15 miejsc:
dla
0,000000000000001
output
MyDouble: 0.000000000000001
P-24341
Elaine
» 2010-11-22 19:15:32
No ładnie, takiego kodu to tu dawno nie było...

Po pierwsze: jaką masz pewność, że std::string::size_type to właśnie int? Odpowiedź: dokładnie żadną. std::string::size_type to std::allocator<char>::size_type, czyli std::size_t. Ten typ jest typem bez znaku, zazwyczaj szerokości wskaźnika. Na maszynach, gdzie wskaźnik (więc zwykle i size_t) jest szerszy of inta (choćby na AMD64, gdzie najczęściej int to 32 bity, a wskaźnik - i size_t - 64 bity) przy odpowiednio długim stringu może to doprowadzić do nieciekawych wyników (a są tacy, którzy specjalnie stringi dłuższe, niż standardowo wrzucają - choćby po to, by wykorzystać jakieś luki... ;>).

Dalej zresztą masz to podobnie, tylko teraz przynajmniej znakowość (ale szerokość niekoniecznie) się zgadza, bo tym razem masz unsigned int.

Po drugie: jasne, std::string::npos to faktycznie -1 (z tym, że odpowiedniego typu - czyli std::string::size_type, patrz punkt pierwszy). Tylko to pierwsze lepiej oddaje intencje programisty.

Po trzecie: Co oznacza 48? Chodziło ci o '0'? Literały znakowe nie gryzą, naprawdę.

Po czwarte: Ten kod nie daje dokładnych wyników w niektórych sytuacjach (podaj mu np. 10.0000000000000009).

Po piąte: Co z notacją wykładniczą?

Po szóste: byłoby fajnie, gdyby ten kod można było wykorzystać także dla innych strumieni niż std::cin.

Po siódme: jakaś obsługa błędów? Jakakolwiek?
P-24342
ison
» 2010-11-22 19:22:29
No ładnie, takiego kodu to tu dawno nie było...
bo nikt nie wrzuca tu swoich kodów :D
co do size_t to przecież zachodzi konwersja więc to nie ma zbyt dużego znaczenia, jakby miało to kompilator by sypał warningami
przy odpowiednio długim stringu
...double, float... że jakbyś niby chciał podpisać pod double'a stringa o dużej długości

Po piąte: Co z notacją wykładniczą?
tzn? gdzie byś chciał tę notację? mam podawać wynik w notacji? double przyjmie taką wartość jaką mu podam, a czy potem będzie wyświetlany w notacji wykładniczej czy zwyczajnie to już nie ode mnie zależy, czyż nie?

Po szóste: byłoby fajnie, gdyby ten kod można było wykorzystać także dla innych strumieni niż std::cin.
bez przesady, jak ktoś chce to sobie zmieni :p

Po siódme: jakaś obsługa błędów? Jakakolwiek?
nie :)
zakładam że użytkownik nie jest pacanem :p

Po trzecie: Co oznacza 48? Chodziło ci o '0'? Literały znakowe nie gryzą, naprawdę.
czyżby kwestia gustu? nie ma raczej tablic ascii w których '0' ma inne pole niż 48
P-24345
DejaVu
» 2010-11-22 19:39:19
Widzisz... użyłeś słowa 'raczej' ;p Co oznacza, że sam nie jesteś pewnien czy istnieje jakiś crapowy system (a zarazem kompilator), który inaczej zinterpretuje literał '0' :)
P-24347
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona