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

Lekcja 9

Ostatnio zmodyfikowano 2016-11-13 20:40
Autor Wiadomość
CCbolt
Temat założony przez niniejszego użytkownika
Lekcja 9
» 2016-07-06 17:14:50
Trochę zgłupiałem w środkowej części

Strumień jest pusty, więc nie można z niego pobrać danych, a więc użytkownik musi wprowadzić nowe dane do strumienia. Wprowadźmy teraz do strumienia następujące dane:
12345, 321. Po wciśnięciu klawisza ENTER dane te trafiają do bufora strumienia wejściowego, z którego następnie odczytywane są dane. Po wczytaniu liczby w buforze strumienia wejściowego zostaną następujące dane:
, 321. Czy 2+2 wynosi 4?
Co się teraz stanie, gdy zechcemy wczytać kolejną liczbę? Strumień stwierdzi, że pierwszym znakiem w strumieniu jest znak ,, który nie jest liczbą, a więc nie zostanie wczytana liczba. Operacja wczytywania się nie powiedzie, a flaga błędu zostanie ustawiona.

Przeleciałem tematy na forum ale nigdzie nie widzę jak to zrobić, w jednym z tematów administrator zaś twierdził że dane " , 321. Czy 2+2 wynosi 4? " mają się nie wyświetlać.
P-149736
biznet40
» 2016-07-06 19:28:11
Masz tu programik skompiluj go sobie wlacz wpisz to co masz wpisac czyli "12345, 321. Czy 2+2 wynosi 4?" i zobacz co sie stanie. a jesli wczytasz ", 321. Czy 2+2 wynosi 4?" czyli resztę to strumien wejscia nie odczyta przecinka jako cyfre (bo to nie jest cyfra) i zamieni to w 0 nie wczyta liczb nawet po przecinku. A dzieje sie tak poniewaz zmienna "int" wczytuje tylko liczby całkowite czyli ->1,2,3,0,128 itp.

Łatwiej sie nie da.

Programik:

---------------------------------------
#include <iostream>

using namespace std;

int main()
{
    int a;
    cout<<">> ";cin>>a;
    cout<<"Tylko to sie wczyta: "<<a;
    return 0;
}

---------------------------------------
P-149738
CCbolt
Temat założony przez niniejszego użytkownika
» 2016-07-06 22:23:43
Dzięki coś załapałem ale programik był zawiły dla mnie.
W zadaniu domowym  kod pisałem na kilka sposobów później zainteresowałem się jednym tematem i uprościłem kod na ile mogłem
 Teraz takie pytanie czy powinienem usunąć jedną z linii czy autor najzwyczajniej w świecie nie potrzebnie ją wstawił, chodzi o 6 linię od końca "cout << endl << endl;". Jak można jeszcze bardziej uprościć kod tak aby był zrozumiały?


Moj
C/C++
#include <iostream>


using namespace std;
float a, b, c;
bool d, e, f;


int main()

{
    cout << "Podaj pierwsza liczbe:";
    cin >> a; d = cin.good(); cin.clear(); cin.sync();
   
    cout << "Podaj druga liczbe:";
    cin >> b; e = cin.good(); cin.clear(); cin.sync();
   
    cout << "Podaj trzecia liczbe:";
    cin >> c; f = cin.good(); cin.clear(); cin.sync();
   
    cout << endl << endl;
   
    cout << "I " << a << " Wczytano? " << d << endl;
    cout << "II " << b << " Wczytano? " << e << endl;
    cout << "III " << c << " Wczytano? " << f << endl;
   
    return 0;
}

Autora z innego tematu
C/C++
#include<iostream>
using namespace std;
float a, b, c;
bool i, j, k;

int main()
{
    cout << "Wprowadz liczbe I: ";
    cin >> a; i = cin.good(); cin.clear(); cin.sync();;
   
    cout << "Wprowadz liczbe II: ";
    cin >> b; j = cin.good(); cin.clear(); cin.sync();
   
    cout << "Wprowadz liczbe III: ";
    cin >> c; k = cin.good(); cin.clear(); cin.sync();
    cout << endl << endl;
    cout << "Liczba I: " << a << " Czy udalo sie wczytac: " << i << endl;
    cout << "Liczba II: " << b << " Czy udalo sie wczytac: " << j << endl;
    cout << "Liczba III: " << c << " Czy udalo sie wczytac: " << k << endl;
    return 0;
}
P-149740
carlosmay
» 2016-07-06 23:43:19
cin >> a; d = cin.good(); cin.clear(); cin.sync();
Przez takie jednolinijkowce kod traci na czytelności.
Nie chodzi o to żeby kod był maksymalnie krótki, tylko czytelny i zrozumiały.

cout << endl << endl;
Dwa razy przejście do nowej linii. Czy potrzebne? Nie wiem.
P-149741
uruken
» 2016-07-09 17:42:16
Mój kod do tego zadania wygląda nieco inaczej:
C/C++
#include <iostream>
#include <limits>
int main()
{
    float a;
    float b;
    float c;
    bool atak = std::cin.good();
    bool btak = std::cin.good();
    bool ctak = std::cin.good();
    std::cin.clear();
    std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
    std::cout << "Podaj liczbe rzeczywista (a): ";
    std::cin >> a;
    std::cout << "Podaj liczbe rzeczywista (b): ";
    std::cin >> b;
    std::cout << "Podaj liczbe rzeczywista (c): ";
    std::cin >> c;
    std::cout << "Liczba a =" << a << "Wczytano ? " << std::cin.good() << std::endl;
    std::cout << "Liczba b =" << b << "Wczytano ? " << std::cin.good() << std::endl;
    std::cout << "Liczba c =" << c << "Wczytano ? " << std::cin.good() << std::endl;
}

Ale borykam się z tym że jeśli podam do wczytania literę lub połączenie liter i cyfr to program nie czeka na kolejne odpowiedzi (drugą i trzecią) i kończy działanie.
Nie potrafie dojść co powoduje takie zachowanie.
P-149794
neferx
» 2016-07-09 18:13:13
Przypisałeś sobie:
C/C++
bool atak = std::cin.good();
bool btak = std::cin.good();
bool ctak = std::cin.good();

1. Każdy
bool
 musi występować bezpośrednio po wprowadzeniu danych przez użytkownika, czyli
cin >>

2. Mimo, że zadeklarowałeś sobie 'wartości'
bool
, to przy wyprowadzeniu danych ponownie deklarujesz całe
std::cin.good()
 i zadeklarowanych booli nie używasz.
C/C++
std::cout << "Liczba a =" << a << "Wczytano ? " << std::cin.good() << std::endl;
std::cout << "Liczba b =" << b << "Wczytano ? " << std::cin.good() << std::endl;
std::cout << "Liczba c =" << c << "Wczytano ? " << std::cin.good() << std::endl;
3.
C/C++
std::cin.clear();
std::cin.sync();
Przed każdym wprowadzeniem danych
C/C++
cin >> a;
cin >> b;
cin >> c;

P-149796
carlosmay
» 2016-07-09 20:01:31
Ale borykam się z tym że jeśli podam do wczytania literę lub połączenie liter i cyfr to program nie czeka na kolejne odpowiedzi
Ponieważ strumień po niepowodzeniu wczytywania ustawia flagę błędu i pomija wszystkie operacje wejścia, do momentu wyzerowania flag.
Oczywiście trzeba pamiętać też o zadbaniu, aby kolejne wczytywanie było poprawne.
P-149798
Orenz12
» 2016-07-11 15:10:35
Natomiast mój kod wygląda następująco:
C/C++
#include <iostream>
using namespace std;
int main()
{
    float zmiennajeden;
    float zmiennadwa;
    float zmiennatrzy; // mogłem dać a, b, c, ale tak dla mnie jest bardziej zrozumiale
   
    cout << "Podaj liczbe pierwsza:" << endl;
    cin >> zmiennajeden;
    cout << "Podaj liczbe druga:" << endl;
    cin.clear();
    cin.sync();
    cin >> zmiennadwa;
    cout << "Podaj liczbe trzecia:" << endl;
    cin.clear();
    cin.sync();
    cin >> zmiennatrzy;
   
    cout << "\nLiczba pierwsza to: " << zmiennajeden << "\nCzy udalo sie wczytac? " << cin.good() << "\nCzy cos nawalilo? " << cin.fail() << endl;
    cout << "\nLiczba druga to: " << zmiennadwa << "\nCzy udalo sie wczytac? " << cin.good() << "\nCzy cos nawalilo? " << cin.fail() << endl;
    cout << "\nLiczba trzecia to: " << zmiennatrzy << "\nCzy udalo sie wczytac? " << cin.good() << "\nCzy cos nawalilo? " << cin.fail() << endl;
}
Mam jednak problem z definiowaniem bool, nie wiem jak to zrobić. Doczytałem, że powinien być po każdym wprowadzeniu danych, ale sposobu zapisu nie znam. Napisze ktoś?
P-149839
« 1 » 2 3
  Strona 1 z 3 Następna strona