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

Uniwersalny typ, wiele argumentów i wartość zwracana przez find()

Ostatnio zmodyfikowano 2013-02-07 15:28
Autor Wiadomość
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:
C/C++
void silnia() //Blad!!!
{
    system( "cls" ); //czyszczenie ekranu
   
    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; //wczytanie wartośći
    spr[ 0 ] = cin.fail();
   
    liczbaKon << liczba; //konwersja z int do string
    liczbaStr = liczbaKon.str(); //konwersja z int do string
   
    pozycja.push_back( liczbaStr.find( '.' ) ); //utworzenie nowego elementu tablicy
    //i przypisanie do niego pozycji na ktorej znaleziono
   
    int i = 1;
   
    if( spr[ 0 ] || pozycja[ 0 ] != string::npos )
    {
        do
        {
            cin.clear();
            cin.sync();
           
            //system("cls");
            cout << "Nie wprowadziles/wprowadzilas liczby calkowitej." << endl << endl;
           
            cout << "Podaj liczbe calkowita, ktorej silnie chcesz obliczyc: \n>";
           
            cin >> liczba; //wczytanie wartości
            cin.clear();
            cin.sync();
            spr[ 1 ] = cin.fail();
           
            liczbaKon << liczba; //konwersja z int do string
            liczbaStr = liczbaKon.str(); //konwersja z int do string
           
            pozycja.push_back( liczbaStr.find( '.' ) ); //dodanie nowego elementu i przypisanie do niego do niego wartości
            cout << "pozycja" << pozycja[ i ];
            if( spr[ 1 ] == true && pozycja[ i ] == string::npos )
                 break;
           
            i++; //inkrementacja
        } while( spr[ 0 ] || spr[ 1 ] || pozycja[ i ] != string::npos ); //sprawdzenie warunku
       
    }
   
   
    wynik = 1; // przypisanie do zmiennej wynik wartosci 1
   
    for( int i = 2; i <= liczba; i++ )
         wynik *= i; // pomnozenie zmiennej wynik przez wartosc zmiennej 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"):

C/C++
#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:
C/C++
size_type find( const value_type * ptr, size_type off = 0 ) const; //tutaj dwa argumenty
size_type find( const value_type * ptr, size_type off, size_type count ) const; //a tutaj trzy
 
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 :).
P-75809
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:
C/C++
if( liczba ==( int ) liczba )
{
    //tu jest OK
}
else
{
    //tu nie jest calkowita
}

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.
P-75824
krzyk
» 2013-02-06 19:53:45
@2
C/C++
template < typename T >
void wypisz( T val )
{
    std::cout << val << std::endl;
}

P-75826
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:"
C/C++
template < class T >
class Klasa( T costam )
{
   
};
P-75827
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.
P-75830
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.
P-75843
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ę.
P-75887
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.
P-75893
« 1 » 2
  Strona 1 z 2 Następna strona