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

Wczytywanie zmiennych z funkcji.

Ostatnio zmodyfikowano 2016-07-01 15:51
Autor Wiadomość
Isharoth
Temat założony przez niniejszego użytkownika
Wczytywanie zmiennych z funkcji.
» 2016-07-01 11:04:24
Witam.

Uczę się programowania w C++ dzięki kursowi na tej stronie. Do tej pory szło mi dobrze, jednak natrafiłem na pewną przeszkodę w funkcjach, której dokładnie nie rozumiem.

Mam do przepisania kalkulator, tak aby korzystać z funkcji wczytywania liczby. (zadanie: "Zmodyfikuj kalkulator, który pisałeś w jednym ze wcześniejszych rozdziałów tak, aby korzystał on ze wcześniej napisanej funkcji wczytajLiczbe.")

Moja funkcja wygląda tak:
C/C++
float wLiczbe( float aLiczba, float bLiczba )
{
   
    do {
        cin.clear();
        cin.sync();
        cout << "Wprowadz pierwsza liczbe: ";
        cin >> aLiczba;
    }
    while( aLiczba = cin.fail() );
   
    do
    {
        cin.clear();
        cin.sync();
        cout << "Wprowadz druga liczbe: ";
        cin >> bLiczba;
    }
    while( bLiczba = cin.fail() );
   
    return aLiczba, bLiczba;
   
}
W późniejszej części kodu w int main() używam switcha, na którym użytkownik kalkulatora określa jakiego typu działanie chce zrobić (dodawanie, odejmowanie, dzielenie, mnożenie).
Załóżmy, że chcę zrobić dodawanie. I tu pojawia się problem, gdyż w int main() nie mogę przywołać zmiennych z mojej wcześniejszej funkcji tak, aby je dodać, odjąć, pomnożyć czy podzielić.

Taki kod w switchu:
C/C++
case 1:
wLiczbe();
wynik = aLiczba + bLiczba;
break;
skutkuje błędem kompilatora: 'aLiczba' was not declared in this scope 'bLiczba' was not declared in this scope

Proszę o pomoc i w miarę możliwości wytłumaczenie jak to dokładnie działa, o ile da się w ten sposób operować na moich zmiennych z funkcji. Z góry dziękuję.
P-149565
carlosmay
» 2016-07-01 12:34:21
Jeśli funkcja pobiera wartość od użytkownika, niech ją pobierze i zwróci.
Tak jest bardziej intuicyjnie:
C/C++
int getNumber()
{
    int number;
    while( !( std::cin >> number ) ) {
        std::cin.clear();
        std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
    }
    return number;
}

int main()
{
    int num1 = getNumber();
    int num2 = getNumber();
   
    std::cout <<( num1 + num2 ) << std::endl;
}
P-149571
Isharoth
Temat założony przez niniejszego użytkownika
» 2016-07-01 13:14:43
Dziękuję za pomoc. Niestety pojawił się nowy problem. Teraz po wyborze liczby pierwszej i drugiej program zapętla mi się 3 razy (tj. 3 razy muszę podać pierwszą i drugą liczbę zanim wyrzuci wynik).
Gdzie może tkwić problem?

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

void tytul()
{
   
    cout << "==============================================================================" << endl; //////////////////////////////////////////////////////////////////////
    cout << "\n" << "================================= KALKULATOR =================================" << endl; ////////////////////////// Tytuł /////////////////////////////////////
    cout << "\n" << "==============================================================================" << endl; //////////////////////////////////////////////////////////////////////
   
}

void funkcje() ////////////////////Wypisz główne funkcje kalkulatora
{
    cout << "Program ma nastepujace funkcje:" << endl;
    cout << "[1] Dodawanie " << endl;
    cout << "[2] Odejmowanie " << endl;
    cout << "[3] Mnozenie " << endl;
    cout << "[4] Dzielenie " << endl;
    cout << "[5] Rezygnuj " << endl;
}

float wLiczbe() //////Wczytywanie liczby
{
    float aLiczba;
    float bLiczba;
    do {
        cin.clear();
        cin.sync();
        cout << "Wprowadz pierwsza liczbe: ";
        cin >> aLiczba;
    }
    while( cin.fail() );
   
    do
    {
        cin.clear();
        cin.sync();
        cout << "Wprowadz druga liczbe: ";
        cin >> bLiczba;
    }
    while( cin.fail() );
   
    return aLiczba, bLiczba;
   
}

int main()
{
   
    int operacja;
   
    tytul();
    funkcje();
   
    cout << "Wybierz funkcje: ";
    cin >> operacja;
   
   
    float a = wLiczbe();
    float b = wLiczbe();
   
    switch( operacja )
    {
       
    case 1:
        cout << "\n" << a + b << endl;
        break;
       
    case 2:
        cout << "\n" << a - b << endl;
        break;
       
    case 3:
        cout << "\n" << a * b << endl;
        break;
       
    case 4:
        cout << "\n" << a / b << endl;
        break;
       
    default:
        cout << "\n" << "Podano nieprawidlowa wartosc!" << endl;
        break;
    }
    return 0;
}
P-149573
carlosmay
» 2016-07-01 13:42:19
return aLiczba, bLiczba;
To jest źle. Nie można zwrócić dwóch wartości, tylko jedną.
Podałem gotowy przykład. Wystarczy go zaadaptować do kodu.
P-149575
Isharoth
Temat założony przez niniejszego użytkownika
» 2016-07-01 13:56:17
Teraz to już kompletnie zgłupiałem. W kursie jeszcze nie miałem takich rzeczy. Miałem operować na kalkulatorze, który zrobiłem do poprzedniego zadania. Czyli nie ma żadnego podstawowego sposobu, żeby z jednej funkcji wyciągnąć 2 wartości, 2 różnych zmiennych wpisywanych przez użytkownika?

EDIT: Chyba wiem już jak to zrobić. Po prostu wywołam funkcję 2 razy, aby pobrać 2 liczby do działania. Dam znać czy mi wyszło.

EDIT2: Program działa teraz prawie tak jak chciałem. Prawie, bo nadal przydatne byłoby dla mnie zwracanie dwóch wartości przez funkcję. Poza tym nadal irytujący jest dla mnie fakt, gdy program automatycznie uruchamia funkcję, gdy przypisuję do jej wartości, wartość mojej zmiennej globalnej. Da się jakoś temu zaradzić? Zgaduję, że będzie to w dalszej części kursu.

Tak zmienił się kod:

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

void tytul()
{
   
    cout << "==============================================================================" << endl; //////////////////////////////////////////////////////////////////////
    cout << "\n" << "================================ KALKULATOR v 0.5 ============================" << endl; ////////////////////////// Tytuł /////////////////////////////////////
    cout << "\n" << "==============================================================================" << endl; //////////////////////////////////////////////////////////////////////
   
}

void funkcje() ////////////////////Wypisz główne funkcje kalkulatora
{
    cout << "Wybierz funkcje z menu:" << endl << endl;
    cout << "[1] Dodawanie " << endl;
    cout << "[2] Odejmowanie " << endl;
    cout << "[3] Mnozenie " << endl;
    cout << "[4] Dzielenie " << endl;
    cout << "[5] Rezygnuj " << endl;
}

float getNumber() //////Wczytywanie liczby
{
    float Number;
    do
    {
        cin.clear();
        cin.sync();
        cout << "\n" << "Wprowadz liczbe: ";
        cin >> Number;
    }
    while( cin.fail() );
   
    return Number;
   
}

int main()
{
   
    int operacja;
    float a;
    float b;
   
    tytul();
    while( operacja != 5 )
    {
        funkcje();
       
        do
        {
            cin.clear();
            cin.sync();
            cout << "\n" << "Wybierz funkcje: ";
            cin >> operacja;
        }
        while( operacja < 1 || operacja > 5 || cin.fail() );
       
        switch( operacja )
        {
           
        case 1:
            a = getNumber();
            b = getNumber();
           
            cout << "\n" << "WYNIK: " << a + b << endl << endl;
            break;
           
        case 2:
            a = getNumber();
            b = getNumber();
           
            cout << "\n" << "WYNIK: " << a - b << endl << endl;
            break;
           
        case 3:
            a = getNumber();
            b = getNumber();
           
            cout << "\n" << "WYNIK: " << a * b << endl << endl;
            break;
           
        case 4:
            a = getNumber();
            b = getNumber();
           
            cout << "\n" << "WYNIK: " << a / b << endl << endl;
            break;
           
            default:
            cout << "\n" << "Zamykanie kalkulatora" << endl << endl;
            break;
        }
       
    }
    return 0;
}
P-149576
carlosmay
» 2016-07-01 15:32:49
Prawie, bo nadal przydatne byłoby dla mnie zwracanie dwóch wartości przez funkcję.
W tej sytuacji zostaje wypełnić liczby przekazane przez referencje lub wskaźnik.
Drugim sposobem jest powiązanie zmiennych w strukturę i ją zwrócić.
Kolejnym, zwrócenie dwuelementowej tablicy (choć nie ma to większego sensu).
Kolejnym zwrócenie pary liczb, np: std::pair<>(mocno naciągane).

Najłatwiej jest tak jak masz teraz, czyli jedna zmienna - jedno pobranie.
P-149581
Isharoth
Temat założony przez niniejszego użytkownika
» 2016-07-01 15:51:01
Dziękuję. Wykorzystam te porady w przyszłości.
P-149582
« 1 »
  Strona 1 z 1