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: #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. |
|
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 |
|
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ś? |
|
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 |
|
szyx_yankez |
» 2011-04-17 16:29:22 Skoro nie umiesz operować na bignumach to zadania 3.Kafelki też nie zrobiłeś poprawnie. |
|
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? |
|
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: while( scanf( costam ) != EOF ) { ... }
dla iostream: 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 std::ifstream in( "plik.txt" ); std::string str; while( in >> str ) { std::cout << std << std::endl; }
program wypisze wszystkie słowa z pliku w oddzielnych liniach |
|
« 1 » |