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 ];