|
Informatyka UJ forum Rocznik 2005 - czyli najlepsze forum w sieci
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Kwiatek
pijak
Dołączył: 08 Gru 2005
Posty: 215
Przeczytał: 0 tematów
Skąd: Podkarpacie
|
Wysłany: Pon 13:24, 26 Cze 2006 Temat postu: Kolejne pytanie. |
|
|
Czy jest jakaś funkcja w C++ pozwalająca zaokrąglić float do dwóch miejsc po przecinku? Albo jakiś sprytny sposób, aby to zrobić?
|
|
Powrót do góry |
|
|
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Stasiu
zielony żul
Dołączył: 16 Lis 2005
Posty: 920
Przeczytał: 0 tematów
Skąd: krk
|
Wysłany: Pon 13:30, 26 Cze 2006 Temat postu: |
|
|
jeśli c++ i wypisanie na standardowe wyjście to są znaczniki:
Kod: | std::cout << std::fixed << std::setprecision(2) << zmienna_zmiennoprzecinkowa; |
powinno wyświetlić w syst. dziesiętnym z dokładnością do 2 cyfr.
EDIT: ale właśnie sprawdziłem u siebie i nie bardzo działa, więc niech mnie ktoś poprawi ;)
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Kwiatek
pijak
Dołączył: 08 Gru 2005
Posty: 215
Przeczytał: 0 tematów
Skąd: Podkarpacie
|
Wysłany: Pon 13:37, 26 Cze 2006 Temat postu: |
|
|
Nie chodzi mi o standardowe wyjście, tylko o ogólny przypadek.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Stasiu
zielony żul
Dołączył: 16 Lis 2005
Posty: 920
Przeczytał: 0 tematów
Skąd: krk
|
Wysłany: Pon 13:47, 26 Cze 2006 Temat postu: |
|
|
no to nie wiem czy jest jakaś funkcja do tego. ale zawsze możesz pomnozyć przez 100, zaokraglić i podzielić przez 100 ;)
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Kwiatek
pijak
Dołączył: 08 Gru 2005
Posty: 215
Przeczytał: 0 tematów
Skąd: Podkarpacie
|
Wysłany: Pon 14:04, 26 Cze 2006 Temat postu: |
|
|
A jak zaokraglić po pomnożeniu przez 100? nie chce mi się szukac :P
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
dzendras
Germański oprawca
Dołączył: 07 Mar 2006
Posty: 1326
Przeczytał: 0 tematów
Skąd: Chorzów
|
Wysłany: Pon 14:13, 26 Cze 2006 Temat postu: |
|
|
double zmienna;
printf("Liczba %4.2f", zmienna);
Tylko nie wiem czy to Cię satysfakcjonuje...
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Spectro
Mistrz grilla
Dołączył: 09 Mar 2006
Posty: 2306
Przeczytał: 0 tematów
Skąd: Kurdwanów
|
Wysłany: Pon 14:13, 26 Cze 2006 Temat postu: |
|
|
@Kwiatek:
Zrzutowanie na inta powinno wystarczyć.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
exeman
Mistrz grilla
Dołączył: 03 Lut 2006
Posty: 1603
Przeczytał: 0 tematów
Skąd: znienacka
|
Wysłany: Pon 14:27, 26 Cze 2006 Temat postu: |
|
|
Jesli wystarcyz przechowac ja w stringu, to (inspiracja metoda dzendrasa)
char buf[100];
snprintf(buf, 100, "%4.2f", zmienna);
Ja snprintfa uzywam jak nalogowiec.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Pawel Str.
pijak
Dołączył: 06 Lut 2006
Posty: 429
Przeczytał: 0 tematów
Skąd: Ze starszego roku / Z Gorlic
|
Wysłany: Pon 14:39, 26 Cze 2006 Temat postu: |
|
|
Rzutowanie na inta może nie zadziałać dla liczb tak dużych, że nie mieszczą się w incie.
Mój typ:
double x;//liczba do zaokrąglenia
double ulamek,cz_calk;
ulamek=modf(x,&cz_calk);
ulamek*=100;
ulamek=round(ulamek);
ulamek/=100;
x=cz_calk+ulamek;
Edit:
Słówko objaśnienia:
round zaokrągla double do liczby całkowitej, ale dalej zapisuje to jako double.
double modf (double VALUE, double *INTEGER-PART)
dzieli liczbę na dwie części- ułamkową (-1,1) i całkowitą, przy czym ułamkowa i całkowita są tego samego znaku co wejściowa VALUE.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
SZCZUR
żul
Dołączył: 09 Lis 2005
Posty: 603
Przeczytał: 0 tematów
|
Wysłany: Pon 17:10, 26 Cze 2006 Temat postu: |
|
|
chyba mozna prosciej:
wejscie x
wyjscie y
y = floor( x*100.0f )/100.0f;
floor() zwraca częsc czlkowita.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Pawel Str.
pijak
Dołączył: 06 Lut 2006
Posty: 429
Przeczytał: 0 tematów
Skąd: Ze starszego roku / Z Gorlic
|
Wysłany: Pon 19:54, 26 Cze 2006 Temat postu: |
|
|
@Szczur. Zazwyczaj tak robię. Ale jest problem przepełnienia - jeżeli ten double jest za duży.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
SZCZUR
żul
Dołączył: 09 Lis 2005
Posty: 603
Przeczytał: 0 tematów
|
Wysłany: Pon 23:09, 26 Cze 2006 Temat postu: |
|
|
nie rozumiem co tu sie moze przepelnic?
double moze przechowywac liczby majace ok 1000 zer
więc marna szansa rzeby dodanie 2 zer go przepelnilo.
chyba ze floor() nie dziala dla dórzych liczb.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Robson
zielony żul
Dołączył: 21 Paź 2005
Posty: 1274
Przeczytał: 0 tematów
Skąd: Z Lasu :]
|
Wysłany: Pon 23:27, 26 Cze 2006 Temat postu: |
|
|
Raczej chodzi o błedy zaokraglenia... im wieksze liczby tym mniejsza precyzja... ale chyba w projektach z P1 precyzja nie jest az tak ważna ;) w koncu to nie reaktor atomowy :P
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
SZCZUR
żul
Dołączył: 09 Lis 2005
Posty: 603
Przeczytał: 0 tematów
|
Wysłany: Wto 0:21, 27 Cze 2006 Temat postu: |
|
|
raczej nie o chodzilo o precyzje. ja nie zmieniam wartosci tylko wykladnik.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Pawel Str.
pijak
Dołączył: 06 Lut 2006
Posty: 429
Przeczytał: 0 tematów
Skąd: Ze starszego roku / Z Gorlic
|
Wysłany: Wto 0:24, 27 Cze 2006 Temat postu: |
|
|
Jakbyś mnożył przez 1024, tobyś zmieniał wykładnik. Jak mnożysz przez 100, to zmieniasz też wartość. Chociaż racja, to co podał SZCZUR jest niezłe. Być może trochę przekombinowałem. Na pewno nie należy robić konwersji na int po drodze, ale floor powinien w normalnych zastosowaniach wystarczyć.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
liffe
pijak
Dołączył: 16 Paź 2006
Posty: 78
Przeczytał: 0 tematów
Skąd: z daleka
|
Wysłany: Wto 17:47, 14 Lis 2006 Temat postu: |
|
|
next pytanie:
mam w zależności od warunku stworzyć objekt klasy A albo klasy B. Lecz jeśli użyję fora, to ta zmienna nie będzie istniała poza nim. Kto może powiedzieć jak to zrobić (o ile da się), by można było tej zmiennej używać dalej w programie?
Cytat: | if (warunek)
A obiekt;
else
B obiekt; |
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
hansu
Nieomylny Admin
Dołączył: 17 Lis 2005
Posty: 1990
Przeczytał: 0 tematów
Skąd: przychodzimy? Czym jestesmy? Dokad zmierzamy?
|
Wysłany: Wto 18:11, 14 Lis 2006 Temat postu: |
|
|
Przyadlby sie jakis szerszy kontekst do tego, ale proponuje na przyklad przez wskaznik:
Kod: |
A* aptr=NULL;
B* bptr=NULL;
for (...)
{
if (warunek)
aptr = new A();
else
bptr = new B();
}
|
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Stefan
pijak
Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów
|
Wysłany: Wto 19:54, 14 Lis 2006 Temat postu: |
|
|
liffe napisał: | next pytanie:
mam w zależności od warunku stworzyć objekt klasy A albo klasy B. Lecz jeśli użyję fora, to ta zmienna nie będzie istniała poza nim. Kto może powiedzieć jak to zrobić (o ile da się), by można było tej zmiennej używać dalej w programie?
Cytat: | if (warunek)
A obiekt;
else
B obiekt; |
|
Wygląda jak sytuacja, gdzie naturalnym byłoby zastosowanie polimorfizmu. Nie napisałeś, czy klasy A i B są w jakiś sposób semantycznie powiązane i jak będziesz ich używał, ale proponuję stworzyć klasę bazową i skorzystać z mechanizmu funkcji wirtualnych.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
liffe
pijak
Dołączył: 16 Paź 2006
Posty: 78
Przeczytał: 0 tematów
Skąd: z daleka
|
Wysłany: Wto 23:46, 14 Lis 2006 Temat postu: |
|
|
*pierwsze - przepraszam, bo pomyliłem się pisząc fora - miałem na myśli ifa
klasa A i klasa B są pochodnymi od jednej klasy C, różniącymi się tylko konstruktorem. Po stworzeniu obiektu jednej z tych klas chcę używaż ich wspólnych funkcji, metod i zmiennych, które dziedziczą po klasie C. Więc na to, co napisał hansu, to i tak musiałbym później używać jednego z tych wskaźników, czyli ten sam komplet funkcji dla jednego, a potem dla drugiego.
Cytat: | A* aptr=NULL;
B* bptr=NULL;
if (warunek){
aptr = new A();
aptr->wypisz();//przykladowo
aptr->wczytaj();//przykladowo
}else{
bptr = new B();
bptr->wypisz();//przykladowo
bptr->wczytaj();//przykladowo
}
|
A chciałbym tylko jeden raz to pisać. ... w teraźniejszym programie, z którego się ten problem urodził i tak to wsystko napisałem dwa razy, ale na przyszłość chciałbym umieć zrobić to krócej
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
hansu
Nieomylny Admin
Dołączył: 17 Lis 2005
Posty: 1990
Przeczytał: 0 tematów
Skąd: przychodzimy? Czym jestesmy? Dokad zmierzamy?
|
Wysłany: Śro 0:19, 15 Lis 2006 Temat postu: |
|
|
Nic prostszego. Z tego co zrozumialem wyglada to tak:
Kod: |
class C // klasa-matka ;)
{
wypisz();
wczytaj();
}
class A : public C
{}
class B : public C
{}
|
No i teraz robisz tak:
Kod: |
C* ptr;
if(warunek)
ptr = new A();
else
ptr = new B();
// i teraz mozesz spokojnie:
ptr.wypisz();
ptr.wczytaj();
|
Sytuacja troche sie komplikuje kiedy metody wczytaj i wypisz inaczej wygladaja w A i w B. Ale to tez sie jednym slowkiem kluczowym zalatwia ;)
P.S. hansu piszemy z malej literki :P
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Skrobocik
[SKROBORANGA]
Dołączył: 29 Lis 2005
Posty: 2958
Przeczytał: 0 tematów
Skąd: Skarżysko , Kraków
|
Wysłany: Śro 0:50, 15 Lis 2006 Temat postu: |
|
|
hansu napisał: | (...) P.S. hansu piszemy z malej literki :P |
Skromniś... ;)
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
liffe
pijak
Dołączył: 16 Paź 2006
Posty: 78
Przeczytał: 0 tematów
Skąd: z daleka
|
Wysłany: Śro 10:15, 15 Lis 2006 Temat postu: |
|
|
dzięki, hansu - działa )) btw, co Twój nik oznacza?
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Stefan
pijak
Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów
|
Wysłany: Śro 10:27, 15 Lis 2006 Temat postu: |
|
|
hansu napisał: |
Kod: |
C* ptr;
if(warunek)
ptr = new A();
else
ptr = new B();
// i teraz mozesz spokojnie:
ptr.wypisz();
ptr.wczytaj();
|
|
Raczej: ptr->wypisz(). I nie zapomnij o wirtualnym destruktorze w klasie C.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
liffe
pijak
Dołączył: 16 Paź 2006
Posty: 78
Przeczytał: 0 tematów
Skąd: z daleka
|
Wysłany: Pon 12:40, 20 Lis 2006 Temat postu: |
|
|
next simple pytanko:
jak sprawdzić czy plik, który przykładowo użytkownik podaje na wejściu programu, istnieje?
Spróbować go otworzyć i jeśli zwróci nam błąd, to wtedy będziemy wiedzieli, że nic z tego czy istnieje inny sposób, szybszy, bez otwierania pliku?
Kod: | ifstream plik;
plik.open("tekst.txt");
if (plik==NULL)
//zwracamy błąd |
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Stefan
pijak
Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów
|
Wysłany: Pon 17:00, 20 Lis 2006 Temat postu: |
|
|
Nie ma przenośnego sposobu. I odradzam stosowanie NULL w C++. Pusty wskaźnik oznacza stała 0. Konwersja ifstream do void* (zamiast bool) istnieje tylko po to, by zmniejszyć prawdopodobieństwo złego użycia takiego obiektu. Dlatego IMO czytelniej jest if(plik) lub if(plik.good()).
|
|
Powrót do góry |
|
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach
|
fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
|