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

zakończenie wczytywania napisów następuje po wprowadzeniu łańcucha "pustego".

Ostatnio zmodyfikowano 2015-12-20 21:21
Autor Wiadomość
bojo240
Temat założony przez niniejszego użytkownika
zakończenie wczytywania napisów następuje po wprowadzeniu łańcucha "pustego".
» 2015-12-13 23:15:42
Witam.
Jak wyżej, w jaki sposób to wymóc? Teoretycznie cin.get by pasowało, ale jako że pracuje na zmiennych typu int, a nie char, jest z tym trochę problem...
P-141929
carlosmay
» 2015-12-13 23:27:46
Do zmiennej liczbowej ( nie łańcuchowej ) musisz wprowadzić wartość.
W takiej zmiennej zawsze jest jakaś wartość (nawet śmieciowa, ale wartość).

Wyjściem jest wczytywanie liczb do 'stringa' i konwersja na 'int'.
Wczytanie pustego = koniec działań.
P-141932
bojo240
Temat założony przez niniejszego użytkownika
» 2015-12-13 23:54:19
hmm. może przytoczę dokładnie kod:
C/C++
int n = 0, a = 2, b, i = 40, dzien[ i ], miesiac[ i ], rok[ i ], czas[ i ];
string strdzien[ i ], strmiesiac[ i ], strrok[ i ];
for( n = 0, i = 0; i < 40; i++, n++ )
{
    cout << "[" << i << "]" << "Wprowadz nr dnia miesiaca:";
    cin >> dzien[ i ];
    b = cin.fail();
    if( b != 0 || dzien[ i ] < 1 || dzien[ i ] > 31 )
    do
    {
        cin.clear();
        cin.sync();
        cout << "Wprowadzono zle dane! Wprowadz poprawnie dzien miesiaca:";
        cin >> dzien[ i ];
        b = cin.fail();
    } while( b != 0 || dzien[ i ] < 1 || dzien[ i ] > 31 );
   
jak mam nadzieję widać, chciałbym również zabezpieczyć przed możliwością wprowadzania czegokolwiek co nie jest int oraz w tym wypadku z przedzialu 0-31, a jak wiadomo znaki puste integerami nie sa i tu mam troche problem; wczytujac stringa nie zadziała mi cin.fail, a wymaga się, aby daty zaprzestały być wczytywane przy wprowadzeniu znaku pustego...
P-141935
carlosmay
» 2015-12-14 00:00:55
  chciałbym również zabezpieczyć przed możliwością wprowadzania czegokolwiek co nie jest int
 Napisz funkcję, która będzie zwracać tylko prawidłowe dane (jakie oczekujesz).

C/C++
dzien[ i ] = funkcja();
P-141936
bojo240
Temat założony przez niniejszego użytkownika
» 2015-12-14 00:08:46
Mógłbyś doprecyzować? W sensie upchnąć sprawdzanie cin.fail z całą otoczką w funkcję?  Co miałoby mi to dać? Tzn, nie widze w tym rozwiązania dla tego całego znaku pustego, czyli spacji, ew entera.
P-141937
bojo240
Temat założony przez niniejszego użytkownika
» 2015-12-14 00:20:02
hmm. Najwyraźniej nie znalem poprawnego użycia cin.fail, jak widać działa to nawet po konwersji.
Jednakże, teraz naszedł mnie nowy problem;
C/C++
for( n = 0, i = 0; i < 40; i++, n++ )
{
    cout << "[" << i << "]" << "Wprowadz nr dnia miesiaca:";
    cin >> sdzien[ i ];
    if( sdzien[ i ] == "" )
         break;
   
    ...
Jak string czyta spacje lub enter? :D
P-141938
carlosmay
» 2015-12-14 00:27:27
Jak sdzien to zmienna 'string' to
""
 string pusty po użyciu entera, a
" "
 spacja.
Zawsze możesz porównać 'sdzien' z kodem ASCII danego znaku.
P-141939
bojo240
Temat założony przez niniejszego użytkownika
» 2015-12-14 00:55:22
W tym problem, że przynajmniej w moim kompilatorze nie za bardzo, jeżeli chcesz to prosze cały kod:
C/C++
#include <iostream>
#include <sstream>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
    int n = 0, a = 2, b, i = 40, dzien[ i ], miesiac[ i ], rok[ i ], czas[ i ];
    string sdzien[ i ];
    for( n = 0, i = 0; i < 40; i++, n++ )
    {
        cout << "[" << i << "]" << "Wprowadz nr dnia miesiaca:";
        cin >> sdzien[ i ];
        if( sdzien[ 0 ] == "" )
             break;
       
        istringstream iss( sdzien[ i ] );
        iss >> dzien[ i ];
        b = cin.fail();
        if( b != 0 || dzien[ i ] < 1 || dzien[ i ] > 31 )
        do
        {
            cin.clear();
            cin.sync();
            cout << "Wprowadzono zle dane! Wprowadz poprawnie dzien miesiaca:";
            cin >> dzien[ i ];
            b = cin.fail();
        } while( b != 0 || dzien[ i ] < 1 || dzien[ i ] > 31 );
       
        cout << "[" << i << "]" << "Wprowadz nr miesiaca:";
        cin >> miesiac[ i ];
        b = cin.fail();
        if( b != 0 || miesiac[ i ] < 1 || miesiac[ i ] > 13 )
        do
        {
            cin.clear();
            cin.sync();
            cout << "Wprowadzono zle dane! Wprowadz poprawnie miesiac:";
            cin >> miesiac[ i ];
            b = cin.fail();
        } while( b != 0 || miesiac[ i ] < 1 || miesiac[ i ] > 13 );
       
        cout << "[" << i << "]" << "Wprowadz nr roku:";
        cin >> rok[ i ];
        b = cin.fail();
        if( b != 0 || rok[ i ] < 1 )
        do
        {
            cin.clear();
            cin.sync();
            cout << "Wprowadzono zle dane! Wprowadz poprawnie rok:";
            cin >> rok[ i ];
            b = cin.fail();
        } while( b != 0 || rok[ i ] < 1 );
       
        czas[ i ] =( dzien[ i ] ) +( 30 * miesiac[ i ] ) +( 365 * rok[ i ] );
    }
    stop:
    for( i = 0; i < n; i++ )
    for( int j = 0; j < n - 1 - i; j++ )
    if( czas[ j ] > czas[ j + 1 ] )
    {
        swap( czas[ j ], czas[ j + 1 ] );
        swap( dzien[ j ], dzien[ j + 1 ] );
        swap( miesiac[ j ], miesiac[ j + 1 ] );
        swap( rok[ j ], rok[ j + 1 ] );
    };
    for( i = 0; i < n; i++ )
         cout << dzien[ i ] << "-" << miesiac[ i ] << "-" << rok[ i ] << endl;
   
    return 0;
   
}
Przynajmniej u mnie przy użyciu "" lub " " break nie działa, a przy użyciu '13' lub '32' wywala pierdylion błędów w build logu.. :C
P-141940
« 1 » 2 3
  Strona 1 z 3 Następna strona