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
Rozdział 26 zadanie domowe. Prosze o pomoc utknalem.
» 2018-04-04 21:46:16
Utknalem w miejscu opisanym komentarzem w kodzie i tak jak juz tam napisalem czuje ze przekabinowalem ale nic nie pomaga.
C/C++
#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;


bool sprawdzanie( bool sprawdzana )
{
    if( sprawdzana = false )
         return false;
    else
         return true;
   
}

void wczytajOsobe( string & tabimie, string & tabnazwisko, int & tabwiek )
{
    bool pint, pi;
    do {
        cin.clear(); // Tutaj nie dziala mi moj mechanizm sprawdzania poprawnosci wpisywania danych i nie wiem dlaczego
        cin.sync(); // Na ten moment widze ze przekabinowalem wiec prosze o pomoc bardziej doswiadczonych.
        cout << "Imie: " << endl; // Pozdrawiam ;)
        cin >> tabimie;
        cin.good();
        pint = cin.good();
        pi = sprawdzanie( pint );
    } while( pi == false );
   
    cout << "Nazwisko: " << endl;
    cin >> tabnazwisko;
    cout << "Wiek: " << endl;
    cin >> tabwiek;
   
}

void wypiszOsobe( string & imie, 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-170458
YooSy
» 2018-04-04 22:19:24
if( sprawdzana = false )
» Kurs C++ / FAQNajczęściej spotykane bugi pytanie/odpowiedź - Zły operator.

cin.sync();
Korzystaj z
std::cin.ignore()
. Opis w » Kurs C++ » Poziom 1Obsługa strumienia wejściowego lekcja.

void wypiszOsobe( string & imie, string & nazwisko, int & wiek )
Tutaj nagłówek funkcji powinien wyglądać tak:
void wypiszOsobe( const string & imie, const string & nazwisko, int wiek )
bo ta funkcja ma tylko odczytać dane, więc należy je zabezpieczyć przed nikczemnymi planami użyszkodników.

Dodam jeszcze, że powiązane ze sobą dane warto trzymać w jednej spójnej strukturze, np.
C/C++
struct Person {
    std::string name;
    std::string surname;
    int age;
}
P-170460
Robinsoncruzoe
Temat założony przez niniejszego użytkownika
» 2018-04-05 13:55:42
Pozmienialem wskazane uwagi i troche przerobilem to jeszcze teraz działa dla wieku bo tam jest integer i cin.fail mi wylapuje blad jak wpisze litere ale to też tylko pod warunkiem że nie poprzedza jej cyfra np jezeli zamiast wieku wpisze 12de to zapisze mi ta 12 do wieku dla imienia i nazwiska nie dziala w ogole. Czemu tak sie dzieje? Jak to ugryzc? czy wpisanie liczb do zmiennej string powoduje że pojawia sie tam blad? Jezeli nie to jak zapobiec wpisywaniu liczb do zmiennej string? help
C/C++
#include <iostream>
#include <string>
#include <cstdlib>
#include <limits>
using namespace std;



void wczytajOsobe( string & tabimie, string & tabnazwisko, int & tabwiek )
{
    bool zmienna, zmien;
    char tekstowa;
    do
    {
        cin.clear();
        cin.ignore( numeric_limits < streamsize >::max(), '\n' );
        cout << "Podaj swoj wiek: ";
        cin >> tabwiek;
        zmienna = cin.fail();
    } while( zmienna == true );
   
    do
    {
        cin.clear();
        cin.ignore( numeric_limits < streamsize >::max(), '\n' );
        cout << "Podaj swoje nazwisko: ";
        cin >> tabnazwisko;
        zmienna = cin.fail();
    } while( zmienna == 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-170466
YooSy
» 2018-04-05 15:22:36
C/C++
while( !( cin >> tabweik ) ) {
    cin.clear();
    cin.ignore( numeric_limits < streamsize >::max(), '\n' );
}
P-170468
Robinsoncruzoe
Temat założony przez niniejszego użytkownika
» 2018-04-05 16:35:10
Nie rozumiem przykro mi Yosy.
P-170470
jankowalski25
» 2018-04-05 17:20:48
Wyrażenie
cin >> cokolwiek
 zwraca wartość taką samą, jak wywołanie
cin.fail()
, którą można niejawnie potraktować jako
bool
. Tamta pętla po prostu próbuje do skutku wczytywać liczbę pomijając niepoprawne dane. Oczywiście zamiast tabweik powinno być tabwiek.
P-170472
Robinsoncruzoe
Temat założony przez niniejszego użytkownika
nadal nic
» 2018-04-05 18:02:49
Nic to nie zmienia nie wiem czemu. Od poczatku najwiekszy problem mam z tym wylapywaniem bledow. Moze mi ktos wyjasnic czemu to nie dziala i co zrobic zeby dzialalo? :)
P-170473
jankowalski25
» 2018-04-05 18:26:27
Zadbaj o właściwą kolejność wykonywanych działań. Najpierw wczytuj dane, później sprawdzaj, czy się udało, a na końcu czyść stan strumienia i pomijaj błędne dane. A jeśli nadal masz z tym problemy, to spróbuj napisać bez pętli wczytywanie danych tak ze dwa, trzy, cztery razy. A jak to będzie działać, to zobacz, co się powtarza i zrób z tego odpowiednią pętlę.
P-170474
« 1 » 2 3
  Strona 1 z 3 Następna strona