Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
 Polski Portal COLOBOTa - COLOBOT Polish Portal
Forum - Polski Portal COLOBOTa
Strona głównaStrona główna UżytkownicyUżytkownicy GrupyGrupy StatystykiStatystyki


Poprzedni temat «» Następny temat
Jak sprawdzić czy użytkownik wpisał liczbę
Autor Wiadomość
Simbax 
Mod


Twoja ulubiona misja: Wszystkie na Krystalii
Pomógł: 6 razy
Wiek: 22
Dołączył: 07 Sie 2009
Posty: 473
Skąd: z Leszna
Wysłany: 13-12-2010, 21:09   Jak sprawdzić czy użytkownik wpisał liczbę

Równie dobrze mógłbym zapytać o to google, ale pytam się Was, żeby zwiększyć aktywność na forum.
Powiedzmy, że mamy prosty kalkulator i prosimy użytkownika o wprowadzenie liczby. Np.
Kod:
Witaj w prostym kalkulatorze!
Podaj pierwszą liczbę: _

Przypuśćmy, że użytkownik wpisze, choćby przez przypadek, literkę, tekst i ogólnie wszystko co nie jest liczbą. Na początku nie widać błędu, ale przy próbie odczytania tej zmiennej np. o typie int do której wprowadzono tekst program zaczyna się sypać...
I tu moje pytanie: w jaki sposób sprawdzić czy wprowadzona wartość jest zgodna z typem zmiennej? Myślałem, żeby pobawić się trochę string-ami i konwertowaniem na int-y, ale byłoby to trochę przekombinowane, przynajmniej tak mi się wydaje (w tym programie do pokazywania liczby w różnych systemach liczbowych właśnie takie coś zastosowałem i teraz trudno mi się w tym połapać... przy okazji, dodałem źródło :lol: ). Może istnieje jakaś specjalnie do tego celu stworzona funkcja?
_________________
http://projektsimbax.blogspot.com/ <- Taki sobie blog
 
     
Berserker 
Dark Ness


Twoja ulubiona misja: Ofrenia
Pomógł: 16 razy
Wiek: 24
Dołączył: 24 Mar 2009
Posty: 496
Skąd: Bigos
Wysłany: 13-12-2010, 21:24   

Jesli lubisz kombinowac:
Wczytujesz po kolei kazda cyfre liczby za pomoca cin.get().
Sprawdzasz czy nalezy do przedzialu 0-9
Jesli tak to wykonujesz magiczne operacje arytmetyczne w celu zapisania jej jako kolejnej cyfry wczytywanej liczby
Jesli nie, to sprawdzasz czy to nie jest znak nowej linii
Jesli nie, to kazesz uzytkownikowi spie... kupic se spadochron.
Jesli tak to konczysz wczytywanie liczby

Mozesz rozszerzyc o wczytywanie ujemnych liczb lub zmiennoprzecinkowych

Oczywiscie zaraz adiblol skrytykuje moj pomysl bedacy efektem rocznej nauki C++, ale on wie lepiej :)
Mozesz tez sie ludzic, ze jesli wystapi niezgodnosc typow w strumieniu to cin rzuca wyjatek i go poszukac, w takim razie zycze powodzenia.
_________________
 
 
     
adiblol 
Administrator forum
FLOSS FTW!


Twoja ulubiona misja: porównywanie formatów audio
Pomógł: 18 razy
Dołączył: 21 Kwi 2008
Posty: 1313
Skąd: pokój odsłuchowy
Wysłany: 14-12-2010, 15:45   

Tak to koncepcyjnie wygląda. ILEŚTAM to oczywiście stała lub makro :)
Kod:
char s[ILEŚTAM];
cin >> s;
bool isnum=true;
for (int sn=0;sn<ILEŚTAM;sn++) {
 char &cn = s[sn];
 if (cn==0) { podziekuj_uzytkownikowi(W_NAGRODE_ZA_WPROWADZENIE_LICZBY); oblicz_co_tam_chcesz(); break; }
 if (!isdigit(cn)) { poraz_uzytkownika_pradem(ZA_KARE_ZE_NIE_WPROWADZIL_LICZBY); break; }
}

Po objaśnienia odsyłam na Wikibooks.
_________________
1Tbps Project && Telecomix Network

 
 
     
Simbax 
Mod


Twoja ulubiona misja: Wszystkie na Krystalii
Pomógł: 6 razy
Wiek: 22
Dołączył: 07 Sie 2009
Posty: 473
Skąd: z Leszna
Wysłany: 14-12-2010, 17:12   

O, dzięki :-D Tylko takie małe pytanko, co robi znak &: "char &cn = s[sn]; " ?
_________________
http://projektsimbax.blogspot.com/ <- Taki sobie blog
 
     
adiblol 
Administrator forum
FLOSS FTW!


Twoja ulubiona misja: porównywanie formatów audio
Pomógł: 18 razy
Dołączył: 21 Kwi 2008
Posty: 1313
Skąd: pokój odsłuchowy
Wysłany: 14-12-2010, 19:14   

W tym przypadku nie jest konieczny i tylko poprawia wydajność.
Oznacza on referencję, tzn. zamiast tworzyć nową zmienną jest odwołaniem do istniejącej.
Ma to znaczenie przy zapisie:
Kod:

int x = 666;
int y = x;
y = 1337;
cout << x << endl << y << endl;

wypisze:
Kod:
666
1337



Kod:

int x = 666;
int &y = x;
y = 1337;
cout << x << endl << y << endl;

wypisze:
Kod:
1337
1337
_________________
1Tbps Project && Telecomix Network

 
 
     
Simbax 
Mod


Twoja ulubiona misja: Wszystkie na Krystalii
Pomógł: 6 razy
Wiek: 22
Dołączył: 07 Sie 2009
Posty: 473
Skąd: z Leszna
Wysłany: 29-05-2011, 13:48   

Znalazłem fajny sposób na to na pewnym forum, lekko przerobione pod funkcję:

http://wklej.org/id/537138/

Myślę, że to najprostsze i najlepsze rozwiązanie :) Co prawda może być problem z uzyskaniem wartości jaką wpisał użytkownik, ale cóż... ]:>
_________________
http://projektsimbax.blogspot.com/ <- Taki sobie blog
 
     
adiblol 
Administrator forum
FLOSS FTW!


Twoja ulubiona misja: porównywanie formatów audio
Pomógł: 18 razy
Dołączył: 21 Kwi 2008
Posty: 1313
Skąd: pokój odsłuchowy
Wysłany: 30-05-2011, 16:27   

Przypomniało mi się o funkcji scanf:
Kod:

int liczba;
puts("Podaj pierwsza liczbe: ");
if (scanf("%i", &liczba)==1) dobrze_i_masz_liczbe_w_zmiennej; else źle;
_________________
1Tbps Project && Telecomix Network

 
 
     
Wyświetl posty z ostatnich:   

Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Polski Portal COLOBOTa © 2008 - 2012