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

Przecinek zamiast kropki w zmiennej double

Ostatnio zmodyfikowano 2011-04-17 19:25
Autor Wiadomość
neverneve
Temat założony przez niniejszego użytkownika
Przecinek zamiast kropki w zmiennej double
» 2011-04-17 14:51:48
Robię sobie dla treningu zadanka z Drużynowej Olimpiady Informatycznej Gimnazjalistów i napotkałem problem:

Chodzi o to zadanie: http://zadania.oig.edu.pl/aski/index.php/file/get/115/399/pisemneRachunki.pdf

Jak widać w przykładach wpisywane są liczby z przecinkiem (kiedy normalnie do zmiennej typu double wpisujemy z kropką), i najwyraźniej takie są też oczekiwane.
Samo zrobienie programu gdzie wpisuję liczby z kropka nie jest trudne - funkcja atof załatwia wszystko (wczytuję liczby jako C-string i konwertuję na double).
Dodałem też funkcję "xToY", która zamienia w C-stringu jeden znak na inny (moze juz taka istnieje, ja napisalem własną) - teraz obojętnie czy wpisuuję liczby z przecinkiem czy z kropką program je odczytuje dobrze. Probem stanowi za to wypisanie wyniku z przecnikiem zamiast kropki, kombinowałem już na wiele sposobów, ale żaden nie jest niezawodny.

Program:

C/C++
#include <iostream>
#include <cstdlib>

using namespace std;

double suma = 0;

void xToY( char * tab, int x, int y )
{
    for( int i = 0; tab[ i ] != 0; i++ )
    {
        if( tab[ i ] == x ) tab[ i ] = y;
       
    }
}

int main()
{
    char tab[ 201 ];
   
    int x;
    cin >> x;
   
    for( int i = 1; i <= x; i++ )
    {
        cin >> tab;
        xToY( tab, 44, 46 );
       
        suma += atof( tab );
    }
   
    cout << suma;
   
    system( "pause" );
    return 0;
}

Proszę o odpowiedź czy jest jakiś w miarę prosty, szybki i dobry sposób aby w wyniku zamiast kropki wyświetlany był przecinek.
P-30936
ison
» 2011-04-17 14:55:35
też robię OIGa, a właściwie robiłem :)
nie zauważyłeś 1 ważnej rzeczy w zadaniu
Liczba moze byc poprzedzona znakiem + albo - oraz posiadac maksymalnie po 100 cyfr
przed i po przecinku.
double nie pomieści liczby składającej się ze 100 cyfr ;)
całe zadanie polega na zakodzeniu dodawania/odejmowania bignumów zmiennoprzecinkowych
to czy będzie użyta kropka czy przecinek to akurat najmniejszy problem
strasznie dużo kodzenia jest w tym zadaniu, lepiej zabierz się za inne
P-30938
neverneve
Temat założony przez niniejszego użytkownika
» 2011-04-17 15:10:46
Inne już zrobiłem, oprócz liczby uczestników klubu Talent, do tego mi sie po prostu nie chce zabierać ;) Zajme się więc etapem szkolnym.

Swoją drogą, mógłbyś pokazać jak to rozwiązałeś?
P-30940
ison
» 2011-04-17 15:54:46
jeśli nie miałeś jeszcze styczności z bignumami to odłóż sobie to na kiedy indziej. Zacznij od zwykłego dodawania dużych liczb. Operujesz na ciągu znaków i dodajesz tak jakbyś dodawał na kartce pisemnie

co do klubu Talent to rozwiązanie jest prostsze niż Ci się wydaje ;)
narysuj sobie te 'zbiory' na kartce jak na siebie nachodzą i szybko wpadniesz na rozwiązanie
P-30946
szyx_yankez
» 2011-04-17 16:29:22
Skoro nie umiesz operować na bignumach to zadania 3.Kafelki też nie zrobiłeś poprawnie.
P-30959
neverneve
Temat założony przez niniejszego użytkownika
» 2011-04-17 19:04:31
OK, o bignumach poczytam - teraz zająłem się Liczbą Uczestników i już wiem jak rozwiązać - tylko nie k umam jak mam to wszystko wczytać, a to wszystko przez te gówniane (IMO) opisy zadań z OIGa. Czy ktoś może mi wytłumaczyć o co chodzi z tym wczytywaniem? "Opisy sekcji wczytujemy, az do napotkania konca zbioru." <- kiedy mam wiedzieć że ten zbiór się kończy? W przykładzie pierwszywm podane są sekcje A, B i AB - a potem wyskakuje wyjście. Dlaczego więc w przykładzie 3 są podane sekcje A, B i AB, ale nie wyskakuje wyjście tylko podawane jest dalej sekcja C itd. Skąd mam w momencie wpisania czegoś przez usera wiedzieć czy wypisać wyjście czy nie?
P-31002
ison
» 2011-04-17 19:25:48
to wszystko przez te gówniane (IMO) opisy zadań z OIGa
haha, co racja to racja :D

Czy ktoś może mi wytłumaczyć o co chodzi z tym wczytywaniem? "Opisy sekcji wczytujemy, az do napotkania konca zbioru." <- kiedy mam wiedzieć że ten zbiór się kończy?
tego akurat lepiej się nie da wytłumaczyć, masz wczytywać aż do napotkania końca zbioru :p
dla cstdio:
C/C++
while( scanf( costam ) != EOF ) {
    ...
}
dla iostream:
C/C++
while( cin >> costam ) {
    ...
}
EOF czyli end of file, znak końca zbioru -> czyli znak końca pliku wejściowego -> czyli koniec wejścia, z klawiatury ten znak da się chyba wprowadzić przez CTRL+Z czy coś takiego

wczytywanie do eofa jest często spotykane w zadaniach

to tak samo jak wczytujesz zwyczajnie z pliku
C/C++
std::ifstream in( "plik.txt" );
std::string str;
while( in >> str ) { //wczytujesz aż do napotkania końca zbioru
    std::cout << std << std::endl;
}
program wypisze wszystkie słowa z pliku w oddzielnych liniach
P-31005
« 1 »
  Strona 1 z 1