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

Lekcja 3.26

Ostatnio zmodyfikowano 2016-08-14 14:41
Autor Wiadomość
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:
C/C++
#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.
P-150783
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
C/C++
#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";
}
P-150787
Gibas11
» 2016-08-13 10:59:11
@up

Kamil
lipa:
jeszcze raz
Ups? :P

C/C++
string exemplar;
for( char c = 'a'; c <= 'z'; c++ )
     exemplar += c;

for( char c = 'A'; c <= 'Z'; c++ )
     exemplar += c;

P-150791
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.
P-150792
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.
P-150793
jundymek
Temat założony przez niniejszego użytkownika
» 2016-08-13 19:14:21
Takie coś działa tak jak chciałem:
C/C++
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ęść?
P-150807
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ń.
P-150808
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
C/C++
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:
C/C++
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?
P-150830
« 1 » 2
  Strona 1 z 2 Następna strona