Witam, napisałem program, który działa bez zarzutu, jeżeli dane zostaną wpisane poprawnie. Problem zaczyna się, gdy wpisze się dane, niekoniecznie tak jak było to przewidziane w programie. Naturalnie więc zacząłem to zabezpieczać. Podczas zabezpieczania narodziły się jednak w mojej głowie trzy pytania, ale zanim je przedstawie najpierw wklejam kod:
Wyjaśnienie działania programu dla ułatwienia odczytania kodu:
Po odpaleniu programu, prosi nas on kolejno o podanie nazwy i modelu 3 samochodów. Nazwę i model podajemy wpisując je w jednym ciągu oddzielając spacjami. Po naciśnięciu pierwszej spacji program zapisuje wyraz po lewej stronie od spacji jako nazwę samochodu, a wszystko co znajdzie się po jej prawej stronie jako model, aż do czasu naciśnięcia entera. Potem program prosi o podanie nazwy i modelu kolejnego samochodu, a następnie trzeciego.
Następnie program prosi nas o podanie pojemności silnika każdego z samochodów i ich prędkość maksymalną. Na koniec program wypisuje wszystkie dane.
Jeżeli dane zostaną wprowadzone poprawnie, konsola będzie wyglądała tak:
-----------------------------------------------------------
Podaj nazwe i model samochodu nr 1: Audi Cope
Podaj nazwe i model samochodu nr 2: Fiat Chrome v2
Podaj nazwe i model samochodu nr 3: Soda Octavia
Podaj pojemnosc silnikow dla samochodu - Audi  Cope:
0.64
Podaj predkosc maksymalna dla samochodu: Audi  Cope
140
Podaj pojemnosc silnikow dla samochodu - Fiat  Chrome v2:
1.2
Podaj predkosc maksymalna dla samochodu: Fiat  Chrome v2
220
Podaj pojemnosc silnikow dla samochodu - Soda  Octavia:
3
Podaj predkosc maksymalna dla samochodu: Soda  Octavia
300
Twoje Dane:
Samochod nr 1 : Audi  Cope
Pojemnosc jego silnika: 0.64
Jego Predkosc maksymalna: 140
Samochod nr 2 : Fiat  Chrome v2
Pojemnosc jego silnika: 1.2
Jego Predkosc maksymalna: 220
Samochod nr 3 : Soda  Octavia
Pojemnosc jego silnika: 3
Jego Predkosc maksymalna: 300
------------------------------------------------------------
Kod mojego programu:
#include <iostream>
#include <conio.h>
#include<string>
int main()
{
    using namespace std;
    int rozmiar = 50;
    char nazwa[ 6 ][ rozmiar ];
    double dane[ 3 ][ 2 ];
    
    for( int i = 0; i < 6; i++ )
    {
        if( i % 2 == 0 ) {
            cout << "Podaj nazwe i model samochodu nr " <<( i / 2 + 1 ) << ": ";
            cin >> nazwa[ i ];
        }
        
        else cin.get( nazwa[ i ], rozmiar );
        
    }
    
    
    
    for( int i = 0; i < 3; i++ )
    {
        cout << "Podaj pojemnosc silnikow dla samochodu - " << nazwa[( i * 2 ) ] << " " << nazwa[( i * 2 + 1 ) ] << ": " << endl;
        
        do
        {
            cin.clear();
            cin.sync();
            cin >> dane[ i ][ 0 ];
            if( !cin.good() )
                 cout << endl << "Podaj poprawne dane!" << endl;
            
        } while( !cin.good() );
        
        cout << endl;
        
        cout << "Podaj predkosc maksymalna dla samochodu: " << nazwa[( i * 2 ) ] << " " << nazwa[( i * 2 + 1 ) ] << endl;
        
        do
        {
            cin.clear();
            cin.sync();
            cin >> dane[ i ][ 1 ];
            if( !cin.good() )
                 cout << endl << "Podaj poprawne dane!" << endl;
            
        } while( !cin.good() );
        
        cout << endl;
    }
    
    cout << "Twoje Dane: " << endl;
    
    for( int i = 0; i < 3; i++ ) {
        cout << "Samochod nr " <<( i + 1 ) << " : " << nazwa[( i * 2 ) ] << " " << nazwa[( i * 2 + 1 ) ] << endl;
        cout << "Pojemnosc jego silnika: " << dane[ i ][ 0 ] << endl;
        cout << "Jego Predkosc maksymalna: " << dane[ i ][ 1 ] << endl;
        cout << endl;
    }
    
    
    
    getch();
    return( 0 );
}
Problemy i pytania z kodem związane:
1. Pierwszym pytaniem jest to, dlaczego przy takim zapisie jaki jest w kodzi:
for( int i = 0; i < 6; i++ )
{
    if( i % 2 == 0 ) {
        cout << "Podaj nazwe i model samochodu nr " <<( i / 2 + 1 ) << ": ";
        cin >> nazwa[ i ];
    }
    
    else cin.get( nazwa[ i ], rozmiar );
    
}
po podaniu poprawnie nazwy i modelu samochodu, po naciśnięciu entera, program od razu poprosi nas o podanie kolejnego samochodu (i to bez czyszczenia strumienia);
a przy takim zapisie:
for( int i = 0; i < 6; i++ )
{
    if( i % 2 == 0 )
         cout << "Podaj nazwe i model samochodu nr " <<( i / 2 + 1 ) << ": ";
    
    
    cin.clear();
    cin.sync();
    cin.get( nazwa[ i ], rozmiar );
    
}
muszę nacisnąć dwa razy enter zanim poprosi mnie o podanie kolejnego samochodu, oraz czemu ten zapis:
for( int i = 0; i < 6; i++ )
{
    if( i % 2 == 0 )
         cout << "Podaj nazwe i model samochodu nr " <<( i / 2 + 1 ) << ": ";
    
    cin.get( nazwa[ i ], rozmiar ).get();
    
}
powoduje błąd.
2. Nadal pytanie dotyczy tego samego fragmentu kodu:
for( int i = 0; i < 6; i++ )
{
    if( i % 2 == 0 ) {
        cout << "Podaj nazwe i model samochodu nr " <<( i / 2 + 1 ) << ": ";
        cin >> nazwa[ i ];
    }
    
    else cin.get( nazwa[ i ], rozmiar );
    
}
chciałbym go zabezpieczyć w taki sposób, że jeżeli zostanie podana tylko nazwa samochodu bez modelu, to program zwróci na to uwagę i poprosi o podanie poprawnych danych. Na razie to wygląda tak:
----------------------------------------------------------------------------------------------------------
Podaj nazwe i model samochodu nr 1: Audi
Podaj nazwe i model samochodu nr 2: Podaj nazwe i model samochodu nr 3: Podaj pojemnosc silnikow dla
 samochodu - Audi :
----------------------------------------------------------------------------------------------------------
Najlogiczniejszym rozwiązaniem wydaje mi się dodanie jakiegoś if'a, który będzie sprawdzał czy nie znalazł się w cin'ie za szybko enter, problem w tym, że nie wiem jak to sprawdzić (próbowałem czymś w tym stylu if(cin == '\n'))
Także pytanie dotyczy tego jak sprawdzić co kryje się załadowane w cin'ie. Albo jak lepiej rozwiązać ten problem (Chociaż i tak byłbym wdzięczny jeżeli znalazłaby się odpowiedź na to jak sprawdzić cina).
3.W fragmencie programu
do
{
    cin.clear();
    cin.sync();
    cin >> dane[ i ][ 1 ];
    if( !cin.good() )
         cout << endl << "Podaj poprawne dane!" << endl;
    
} while( !cin.good() );
cout << endl;
}
Wiadomo, że jeżeli podamy 2 liczby to druga zostanie pominięta i program zadziała poprawnie, ale jednak chciałbym tego uniknąć i żeby program powiadomił nas o tym, że potrzebna mu tylko jedna liczba i ponowił prośbę. Pytanie, jak to zrobić?
Z góry dziękuję za pomoc :)
@EDIT jeszcze jedno pytanie na szybko, przy takim zapisie nie udaje mi się przekazać danych z tablicy do stringa, jak więc to zrobić?
string a = dane[ i ][ 0 ];