jundymek Temat założony przez niniejszego użytkownika |
Lekcja 3.26 » 2016-08-13 01:28:24 Hej W treści zadania domowego jest takie polecenie: "Zadbaj o bezpieczeństwo wprowadzonych danych, tj. w przypadku błędnego wieku (np. wprowadzonego tekstu) program ma ponawiać żądanie aż do skutku. " Napisałem to tak: #include <iostream> #include <string>
using namespace std;
void wczytajOsobe( string & imie, string & nazwisko, int & wiek ) { cout << "Podaj imie: " << endl; cin >> imie; cout << "Podaj nazwisko: " << endl; cin >> nazwisko; cout << "Podaj wiek: "; cin >> wiek; while( cin.get() != '\n' ) { cin.clear(); cin.ignore( 1000, '\n' ); cout << "Podaj poprawny wiek: " << endl; cin >> wiek; } }
void wypiszOsobe( string imie, string nazwisko, int wiek, int i ) { cout << "Imie " << i << " osoby to: " << imie << endl; cout << "Nazwisko " << i << " osoby to: " << nazwisko << endl; cout << "Wiek " << i << " osoby to: " << wiek << endl; }
int main() { std::string imie[ 2 ]; std::string nazwisko[ 2 ]; int wiek[ 2 ]; for( int i = 0; i < 2; i++ ) wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] ); for( int i = 0; i < 2; i++ ) wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ], i + 1 ); return 0; }
Moje pytanie dotyczy sprawdzenia poprawności wpisanego imienia i nazwiska. W jaki sposób sprawdzić czy zmienna string zawiera wyłącznie litery? Aktualnie program przyjmuje imiona typu "123", co raczej nie powinno mieć miejsca. |
|
carlosmay |
» 2016-08-13 07:49:13 funkcja isalpha() sprawdza czy dany znak to litera. Użyj jej do sprawdzenia imion. edit: lub czegoś ze <string>a - np: std::find_first_not_of#include <iostream> #include <string> using namespace std;
int main() { string name; string exemplar { "abcdefghijklmnoprstouvwxyz" }; while( cin >> name && name.find_first_not_of( exemplar ) != string::npos ) { cout << "lipa: \njeszcze raz\n"; } cout << name << ": imie wprowadzono poprawnie\n"; } |
|
Gibas11 |
» 2016-08-13 10:59:11 @up Kamil lipa: jeszcze raz
Ups? :P string exemplar; for( char c = 'a'; c <= 'z'; c++ ) exemplar += c;
for( char c = 'A'; c <= 'Z'; c++ ) exemplar += c;
|
|
carlosmay |
» 2016-08-13 11:12:20 kamil kamil: imie wprowadzono poprawnie Nie rozumiem? ;) Zjadłem tam literkę 'q', można ją dopisać. Nie pisałem kompletnego łańcuch (wystarczy go wzbogacić o pozostałe literki), bo mi się nie chciało, ale to chyba nie problem, jeśli autor zdecyduje się na użycie tej metody. Po zerknięciu w materiały będzie wiedział jak to działa. string exemplar { "abcdefghijklmnopqrstouvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" }; Metoda find_first_nor_fo jest napisana dla łańcucha string, więc pewnie jest zoptymalizowana pod kątem szybkości działania. Tak przynajmniej zalecają jej używać. Może nie być szybsza od szukania w pętli, ale nie wolniejsza. |
|
Gibas11 |
» 2016-08-13 11:27:52 No nie wiem, ja tam nie lubię jak coś czepia się poprawności mojego imienia gdy zaczynam je wielką literką. :P Wg mnie lepiej napisać 2 pętle niż grzebać się w długim łańcuchu gdzie można coś łatwo pomylić i potem szukać błędu 2h. |
|
jundymek Temat założony przez niniejszego użytkownika |
» 2016-08-13 19:14:21 Takie coś działa tak jak chciałem: cout << "Podaj imie: " << endl; cin >> imie; string exemplar = "abcdefghijklmnoprstouvwxyz";
while( imie.find_first_not_of( exemplar ) != string::npos ) { cout << "Wprowadz poprawne imie: "; cin >> imie; }
Może mi tylko ktos wyjasnic krok po kroku imie.find_first_not_of( exemplar ) != string::npos ? Pierwsza część to jak się domyślam "jeśli w "imie" znajdują się znaki nie wymienione w exemplar. Co oznacza dalsza część? |
|
Gibas11 |
» 2016-08-13 19:49:28 Rozumiem niedosłowne tłumaczenie, ale zrobienie „jeśli” z „find” to lekka przesada. ;) Funkcje szukające czegoś w stringu zwracają std::string::npos jeśli nie ma żadnych wystąpień. |
|
jundymek Temat założony przez niniejszego użytkownika |
» 2016-08-14 11:22:55 Funkcje szukające czegoś w stringu zwracają std::string::npos jeśli nie ma żadnych wystąpień. |
Czyli w zasadzie "jeśli" to poprawne słowo;) Całość się zgadza. Jeśli znajdą znak inny niż exemplar to std::string::npos czyli fałsz. My zaznaczyliśmy != czyli pętla przerwie się w momencie kiedy wszystkie litery w stringu zwrócą std:string:npos. Dobrze rozumuję? Mam kolejne pytanie cout << "Podaj imie: " << endl; cin >> imie; string exemplar = "abcdefghijklmnoprstouvwxyz";
while( imie.find_first_not_of( exemplar ) != string::npos ) { cout << "Wprowadz poprawne imie: "; cin >> imie; }
jakbym chciał zrobić to samo dla nazwiska to muszę całość kodu umieścić za cout << "Podaj nazwisko: " < endl; Czy jest możliwość utworzenia funkcji, która będzie sprawdzała: string exemplar = "abcdefghijklmnoprstouvwxyz";
while( PARAMETR.find_first_not_of( exemplar ) != string::npos ) { cout << "Wprowadz poprawne PARAMETR: "; cin >> PARAMETR;
Chodzi mi o to, żeby w obrębie funkcji wywołać kolejną funkcję typu bool. Da się tak? |
|
« 1 » 2 |