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

Rozdział 26 zadanie domowe. Prosze o pomoc utknalem.

Ostatnio zmodyfikowano 2018-04-06 18:53
Autor Wiadomość
Robinsoncruzoe
Temat założony przez niniejszego użytkownika
» 2018-04-06 12:43:26
Siedziałem nad tym już szmat czasu i pomimo różnych ustawień nadal nie wylapuje bledu przy wpisywaniu liczb do tablicy typu string ani przy funkcji cin.fail() ani dla cin.good(). Przy wpisywaniu znakow do zmiennej integer "wiek" wylapuje blad za pomoca funkcji cin.fail() jednak tylko jezeli pierwszy wpisany znak to litera dla 2df przyjmie tylko 2. Chyba nie do konca rozumiem dzialanie fail i good. Tak to teraz wyglada:

C/C++
#include <iostream>
#include <string>
#include <cstdlib>
#include <limits>
using namespace std;



void wczytajOsobe( string & tabimie, string & tabnazwisko, int & tabwiek )
{
    bool zmienna;
    do
    {
        cin.clear();
        cin.ignore( numeric_limits < streamsize >::max(), '\n' );
        cout << "Podaj swoj wiek: ";
        cin >> tabwiek;
        cin.fail();
    } while( cin.fail() == true );
   
    do
    {
        cin.clear();
        cin.ignore( numeric_limits < streamsize >::max(), '\n' );
        cout << "Podaj swoje nazwisko: ";
        cin >> tabnazwisko;
        cin.good();
    } while( cin.good() == false );
   
    do
    {
        cin.clear();
        cin.ignore( numeric_limits < streamsize >::max(), '\n' );
        cout << "Podaj swoje imie: ";
        cin >> tabimie;
        cin.fail();
    } while( cin.fail() == true );
   
}

void wypiszOsobe( const string & imie, const string & nazwisko, int wiek )
{
    cout << "Imie: " << imie << endl;
    cout << "Nazwisko: " << nazwisko << endl;
    cout << "Wiek: " << wiek << endl;
}

int main()
{
    string imie[ 2 ];
    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 ] );
   
    return 0;
}
P-170484
YooSy
» 2018-04-06 13:11:33
nadal nie wylapuje bledu przy wpisywaniu liczb do tablicy typu string
Bo cyfra to też znak jaki może przechowywać łańcuch znaków, więc nie zrobisz tego tak prosto.
Musiałbyś wprowadzić dane i później przejrzeć czy są tak jakiś znaki, które traktujesz jako błąd.

edit:
C/C++
#include <iostream>
#include <string>
#include <limits>
using namespace std;

bool czyPoprawnyTekst( const string & tekst, const string & niedozowloneZnaki ) {
    // tutaj sprawdzenie, czy w ciągu znaków jest niedozwolony znak
    return bool { };
}

void wczytajOsobe( string & tabimie, string & tabnazwisko, int & tabwiek ) {
    bool zmienna;
    do {
        if( cin.fail() ) {
            cin.clear();
            cin.ignore( numeric_limits < streamsize >::max(), '\n' );
        }
        cin >> tabwiek;
    } while( cin.fail() );
   
    do {
        cin >> tabnazwisko;
    } while( !czyPoprawnyTekst( tabnazwisko, "0123456789" ) );
   
    do {
        cin >> tabimie;
    } while( !czyPoprawnyTekst( tabimie, "0123456789" ) );
   
}

void wypiszOsobe( const string & imie, const string & nazwisko, int wiek ) {
    cout << "Imie: " << imie << endl;
    cout << "Nazwisko: " << nazwisko << endl;
    cout << "Wiek: " << wiek << endl;
}

int main() {
    string imie[ 2 ];
    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 ] );
   
    return 0;
}
P-170485
Robinsoncruzoe
Temat założony przez niniejszego użytkownika
Ok jasne
» 2018-04-06 13:25:54
Tak rozumiem, że liczba zapisuje sie do string nie o to mi chodzi bo nie wiem jak mialbym podejsc do tego problemu wyszukiwania znakow uwazanych przeze mnie za blad czyli wszystkich poza literami alfabetu no bo widze ze w nastepnym rozdziale jest omawiane find i tak na pierwszy rzut oka to za pomoca tego moglbym to zrobic pewnie ale jak to zrobic z dotychczasowa wiedza z samego kursu? Nie chce gotowca ale chociaz jakas podpowiedz bo na prawde nie wiem.
P-170486
YooSy
» 2018-04-06 13:33:51
Można użyć gotowej metody zawartej w klasie std::string jak w przykładzie w std::string::find_first_of
lub przejrzeć łańcuch znaków w poszukiwaniu cyfr funkcją z pliku nagłówkowego <cctype> » standard Cisdigit\
Funkcja czy czyPoprawnyTekst jest przygotowana do pierwszego wariantu.
Do drugiego wystarczy przekazać sam sprawdzany łańcuch.
P-170487
Robinsoncruzoe
Temat założony przez niniejszego użytkownika
» 2018-04-06 14:21:13
Tak tylko ani funkcji find ani isdigit jeszcze nie było a do tej pory wszystko bylo trzeba robic wykorzystujac dotychczasowa wiedze z kursu. Chyba ze mnie cos ominelo :) Dziekuje za odpowiedzi bede walczyl dalej moze najpierw zrobie rozdzial 27
P-170488
YooSy
» 2018-04-06 14:28:42
Z tego co pamiętam, kurs nie wymaga sprawdzania stringów pod względem poprawności wprowadzanych danych,
tylko poprawność wczytywania liczb. Spokojnie możesz iść dalej z kursem i wrócić do rozwiązania za jakiś czas.
P-170489
jankowalski25
» 2018-04-06 15:21:32
Większy nacisk na sprawdzanie poprawności danych jest dopiero w lekcji » Kurs C++ » Poziom 4Wczytywanie zawartości pliku, a kontrola błędów lekcja. Jeśli chodzi o wykorzystanie aktualnej wiedzy, to możesz na przykład wczytywać znak po znaku aż do trafienia na pierwszy znak niebędący cyfrą (isdigit() ułatwia nieco sprawę, ale można użyć zwykłego porównania, jeśli chcesz koniecznie ograniczać się do wiedzy z kursu).
P-170490
Robinsoncruzoe
Temat założony przez niniejszego użytkownika
isdigit
» 2018-04-06 18:25:26
no normalnie to uzyl bym wlasnie isdigit o ktorym czytalem i nawet juz o tym myslalem ale nie chcialem wychodzic poza ramy kursu, ale czemu nie :) Dzieki za odp pozdrawiam
P-170492
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona