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

Funkcje - pierwsze starcie - zadanie 1

Ostatnio zmodyfikowano 2016-04-03 21:58
Autor Wiadomość
johnywoo
Temat założony przez niniejszego użytkownika
Funkcje - pierwsze starcie - zadanie 1
» 2016-04-03 20:03:26
Witajcie,

program ma zrobić dokładnie to co jest w opisie

Napisz funkcję, która będzie wczytywała liczby ze standardowego wejścia i zwracała wczytaną wartość. Funkcja ma zagwarantować, że zwracana liczba zawsze jest poprawna. Oznacza to, że funkcja będzie musiała pytać użytkownika o wprowadzenie liczby dopóki nie poda poprawnej.

Więc udało mi się ograniczyć działanie do liczb całkowitych (bez liter jak i zmiennoprzecinkowych), niestety nie do końca program działa jak chcę, prawodopodobnie pętle są źle napisane. Proszę o pomoc, niedawno zacząłem ten kurs.
Dziękuje.




C/C++
#include <iostream>
using namespace std;



//rozpoczecie definiowania funkcji wczytajLiczbe
int wczytajLiczbe()
{
    float sprawdzenie; // zmienna sprawdzajaca - zmiennoprzecinkowa
    int calkowita; // zmienna calkowita
   
   
    do
    {
        cin >> sprawdzenie;
        calkowita = int( sprawdzenie ); // przerzucenie wartosci do zmiennie int - powoduje to obciecie wartosci po przecinku
       
        do
        {
           
            cin.clear();
            cin.sync();
            cout << "to nie liczba! : ";
           
           
        } while( !( cin >> sprawdzenie ) );
       
    } while( sprawdzenie - calkowita != 0 );
   
    return sprawdzenie;
   
   
}

//KONIEC DEFINICJI FUNKCJI
//TUTAJ JEST JUZ NORMALNY PROGRAM
int main()
{
   
    cout << "Podaj liczbe: ";
    int liczba = wczytajLiczbe();
    cout << "Podales liczbe: " << liczba << endl;
    return 0;
}
P-146946
carlosmay
» 2016-04-03 20:18:35
Do tego zadania wystarczy skorzystać ze stanu strumienia po pobraniu wartości od użytkownika (bez rzutowania na całkowity).

C/C++
int zmienna;
while( !( std::cin >> zmienna ) ) { // jeśli nie udało się wczytać, wyczyść i wczytaj ponownie
    std::cin.clear();
    std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
}
std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); // oczyść strumień z tego co zostało po poprawnym wczytaniu int'a

std::cout << zmienna << std::endl;
P-146947
johnywoo
Temat założony przez niniejszego użytkownika
» 2016-04-03 20:42:34
pierwszy raz się spotykam z
numeric_limits i streamsize.
czyli po kolei:
1.deklaruje zmienna int
2. sprawdzamy w petli while czy strumien jest wiekszy od zmiennej juz wczytanej.
3. oczyszczamy go
4. ignorujemy wszystkie kody ascii


pytanie teraz jakiej biblioteki mam użyć ?
#include <limits> ??

PS. po wprowadzeniu liczby rzeczywistej wyskakuje mi wartosc 4757824 (wartosc maksymalna dla int ?).
Ps.2 trzeba dodać return zmienna przed końcem programu by wartość została zczytana, jednak nadal jest zaokrąglana do całkowitych ze zmiennoprzecinkowych - czy takie było założenie tego zadania?

P-146950
carlosmay
» 2016-04-03 21:43:46
PS. po wprowadzeniu liczby rzeczywistej wyskakuje mi wartosc 4757824
Jaką liczbę wprowadzasz? (jeśli używasz zmiennej całkowitej to taką przechowuje).

trzeba dodać return zmienna przed końcem programu by wartość została zczytana,
return na końcu programu to info dla systemu o stanie zakończonego programu.

jednak nadal jest zaokrąglana do całkowitych ze zmiennoprzecinkowych
Wczytując liczbę rzeczywistą, do zmiennej całkowitoliczbowej, wczytuje się część całkowita. Część ułamkowa już nie (tego się pozbywamy).

- czy takie było założenie tego zadania?
Taka jest treść. Funkcja zwraca
int


sprawdzamy w petli while czy strumien jest wiekszy od zmiennej juz wczytanej.
Nie rozumiem pytania. W komentarzu jest opis działania.

pierwszy raz się spotykam z
numeric_limits i streamsize.
Jest w tym temacie.
Obsługa strumienia wejściowego



P-146955
johnywoo
Temat założony przez niniejszego użytkownika
» 2016-04-03 21:58:09
Po restarcie code::blocks program skompilowal sie prawidlowo. Dziekuje za pomoc.
P-146956
« 1 »
  Strona 1 z 1