Berux Temat założony przez niniejszego użytkownika |
Uniwersalny typ, wiele argumentów i wartość zwracana przez find() » 2013-02-06 18:10:01 Witam.Rozumiem, że mogłem źle wytłumaczyć problem, ale postaram się to wyjaśnić. 1)Jakiś czas temu postanowiłem ulepszyć mój kalkulator: Console Calculator i zabezpieczyć go przed wprowadzeniem liczby zmiennoprzecinkowej jako liczbę, której silnia ma być obliczona. Postanowiłem to zrobić za pomocą konwersji wprowadzonej liczby na typ string i sprawdzenie czy w tym ciągu znaków jest znak '.'. Problem tkwi w tym, że pozycja na której miałaby się znaleźć owa kropka zawsze jest taka sama lub ma jakąś wartość różną od "string::npos" , nawet jeśli wpiszę liczbę bez kropki (np. 2). Gdy zaś wpiszę najpierw liczbę "1.1", a potem "11.1" pozycje na której znalezione zostały kropki są takie same. Proszę o pomoc. Oto kod: void silnia() { system( "cls" ); double liczba; bool spr[ 2 ]; ostringstream liczbaKon; string liczbaStr; int wynik; vector < size_t > pozycja; cout << "Podaj liczbe calkowita, ktorej silnie chcesz obliczyc: \n>"; cin >> liczba; spr[ 0 ] = cin.fail(); liczbaKon << liczba; liczbaStr = liczbaKon.str(); pozycja.push_back( liczbaStr.find( '.' ) ); int i = 1; if( spr[ 0 ] || pozycja[ 0 ] != string::npos ) { do { cin.clear(); cin.sync(); cout << "Nie wprowadziles/wprowadzilas liczby calkowitej." << endl << endl; cout << "Podaj liczbe calkowita, ktorej silnie chcesz obliczyc: \n>"; cin >> liczba; cin.clear(); cin.sync(); spr[ 1 ] = cin.fail(); liczbaKon << liczba; liczbaStr = liczbaKon.str(); pozycja.push_back( liczbaStr.find( '.' ) ); cout << "pozycja" << pozycja[ i ]; if( spr[ 1 ] == true && pozycja[ i ] == string::npos ) break; i++; } while( spr[ 0 ] || spr[ 1 ] || pozycja[ i ] != string::npos ); } wynik = 1; for( int i = 2; i <= liczba; i++ ) wynik *= i; cout << liczba << "! = " << wynik << endl; } 2)Wczoraj testowałem sobie "przestrzeń nazw" i chciałem pobrać jako argument funkcji zmienną o dowolnym typie ( int , czy też string). Funkcja miała wypisywać na ekranie to co zostało wprowadzone w argumencie. Wyglądało to mniej więcej tak (nie zapisałem tego więc napiszę to teraz "z pamięci"): #include <iostream>
using namespace std;
namespace pl { void wypisz( typ_dowolny nazwa ) cout << nazwa; }
int main() { int cosTam = 1; string napis = "dwadzieścia dwa"; wypisz( cosTam ); wypisz( napis ); wypisz( "ha,ha!" ); return 0; } 3)Tak się teraz zastanawiam jak napisać funkcję, której (przy wywoływaniu) można użyć jednego, dwóch lub trzech argumentów. Np. jak w funkcji find: size_type find( const value_type * ptr, size_type off = 0 ) const; size_type find( const value_type * ptr, size_type off, size_type count ) const;
Jak to zrobić? Z góry dziękuję i sorry, że tak dużo pytań w jednym temacie, ale nie chciałem tworzyć kilku tematów. Po co zaśmiecać forum :). |
|
RazzorFlame |
» 2013-02-06 19:35:27 @1 LoL? Nie starczy ci to że zmienisz typ liczby na int? Jeśli nie to rzutuj ją. Rzutowanie z zmiennoprzecinkowej na int jakby obcina liczby po przecinku. Jednak jeśli chcesz ją zaokrąglić to użyj funkcji round(). Na pewno jest ona w dokumentacji. @2 Przeczytaj kurs i dopiero zadawaj pytania. Z twojego posta wynika że nie jesteś na etapie szablonów. Czytaj kurs dalej a sie dowiesz, nie ma sensu tłumaczyć czegoś na przód. Widocznie autor kursu uznał że taka kolejność jest prawidłowa. @3 Jak wyżej. Czytaj kurs a sie dowiesz. Poczytaj o przeładowywaniu funkcji. EDIT: Co do @1 to samo sprawdzanie czy liczba jest całkowita wystarczy wpisać tak: if( liczba ==( int ) liczba ) { } else { }
A z wyjaśnieniem dodam że ten if sprawdza czy wczytana liczba po "obcięciu" końcówki jest taka sama. Czyli jeśli wprowadzisz liczbe 123 to po "obcięciu" też będzie 123 wtedy jest OK, ale jeśli wprowadzisz liczbe 1.23 to po obcięciu będzie ona wynosić równe 1. Wtedy warunek nie będzie spełniony. |
|
krzyk |
» 2013-02-06 19:53:45 @2
template < typename T > void wypisz( T val ) { std::cout << val << std::endl; }
|
|
RazzorFlame |
» 2013-02-06 20:00:52 Krzyk, gotowiec jest bez sensu bo on i tak zapewne nic z tego nie zrozumie a potem będzie chciał użyć tego do innej funkcji czy też do klasy, i potworzy bezsensowne tematy na forum w stylu: "Bo mi to nie działa:" template < class T > class Klasa( T costam ) { };
|
|
Berux Temat założony przez niniejszego użytkownika |
» 2013-02-06 20:08:34 Ok.Dzięki. Poczytam o tym. A tak z ciekawości, to co w moim kodzie nr 1 jest źle? Rozumiem, że może wam się wydawać dziwne dlaczego o to pytam, skoro problem został już rozwiązany, jednakże wolałbym wiedzieć co źle zrobiłem, abym na przyszłość uniknął tego typu błędu. Jeszcze raz dzięki. /edit: Co do mojego drugiego pytania - to też można uzyskać przez przeładowanie funkcji? Jeśli tak to po prostu tworzę kilka takich samych funkcji o innych typach w argumentach? Jeśli źle myślę, to proszę wyprowadzenie mnie z błędu.
@DejaVu
Krócej nie dałem rady: "Uniwersalny typ, wiele argumentów i wartość zwracana przez find()" - jak się policzy "i", to jest 9 wyrazów :) No chyba, że : "3 pytania", ale to trochę słabo przedstawia problem. |
|
DejaVu |
» 2013-02-06 20:53:25 Wymyśl tytuł, który będzie zawierał nie więcej jak 7 wyrazów.... ta litania jest całkowicie bezsensowna. |
|
RazzorFlame |
» 2013-02-07 07:15:57 Tomczyk (BTW. Mój kolega miał na nazwisko Tomczyk :D) odnośnie 1 to bez sensu próbowałeś wydziwiać rzeczy które po 1 zajmują więcej czasu, po 2 więcej kodu. OFC. dałoby się to pewnie podobnie do tego co ty robisz zrobic, ale po co jeśli jeden if wystarcza? Nasze życie polega na tym żeby je optymalizować, i szukać lepszych rozwiązań :) Odnośnie 2 to przeładowywanie funkcji polega na tym że robisz kilka funkcji o tej samej nazwie ale innych argumentach, czasem różniące się typem, a czasem ilością. Kompilator wtedy sam dobiera najbardziej odpowiednią funkcję. |
|
krzyk |
» 2013-02-07 09:34:59 @RazzorFlame
gotowiec jest bez sensu bo on i tak zapewne nic z tego nie zrozumie |
Pewnie niezrozumie ale używać może,zresztą idąc tym tokiem myślenia niemółgłby używać stl lub jakakolwiek innej biblioteki bo to przecież gotowiec. |
|
« 1 » 2 |