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

lekcja 17 kalkulator

Ostatnio zmodyfikowano 2013-03-05 15:49
Autor Wiadomość
melon
Temat założony przez niniejszego użytkownika
lekcja 17 kalkulator
» 2013-03-05 11:25:22
Witam
Prosze o pomoc w tym zadaniu:
Po podaniu "a" wyswietla mi sie losowa liczba, tak samo dzieje sie z "b"
Czy jest mozliwosc te dwie funkcje zastąpić jedna ?

C/C++
#include <iostream>
using namespace std;
int wczytaja( int a )
{
    do {
        cin.clear();
        cin.sync();
        cout << "podaj a" << endl;
        cin >> a;
    } while( a == 0 );
   
    return a; }
int wczytajb( int b )
{
   
    do {
        cin.clear();
        cin.sync();
        cout << "podaj b " << endl;
        cin >> b; }
    while( b == 0 );
   
    return b;
}
int main()
{
    int a, b;
    int a1;
    do {
        do {
            cin.clear();
            cin.sync();
            cout << "podaj dzialanie" << endl;
            cout << " [1]dodawanie \n [3]wyjscie" << endl;
            cin >> a1; }
        while( a1 > 3 );
       
        switch( a1 )
    { case 1:
            wczytaja( a );
            cout << a;
            wczytajb( b );
            cout << b;
            cout << "a+b=";
            cout << a + b << endl;
           
           
            break;
           
        case 3:
            cout << "the End" << endl;
            break; }
       
    } while( a1 <= 2 );
   
    return 0;
}
P-77718
Berux
» 2013-03-05 12:57:49
Witam. Twój problem polega na tym, że funkcja pracuje na kopiach zmiennych podanych w argumentach. Czyli gdy wywołujesz funkcję, np. wczytajLiczbe, tak:
wczytajLiczbe( a );
a w deklaracji tej funkcji masz:
wczytajLiczbe( int a );
to funkcja tworzy sobie kopię tego obiektu a. Możesz to rozwiązać na kilka sposobów.

Pierwszy, to użycie referencji, ale o tym jest napisane w dalszej części kursu.

Drugi sposób, to utworzenie zmiennej w funkcji głównej, do której przypiszesz rezultat funkcji (w tym przypadku wczytajLiczbe()), czyli wartość zwracaną przez funkcję. Wyglądałoby to w twoim przypadku tak:

C/C++
int wczytajLiczbe( a )
{
    //...
}

int main()
{
    //...
   
    int a = wczytajLiczbe( a );
    //...
}

Chciałbym tu jeszcze dodać, że nie funkcja ta nie musi przyjmować żadnych argumentów. Wystarczy, że w "ciele" tej funkcji zdefiniujesz sobie zmienną, do której wczytasz liczbę od użytkownika. Na końcu tego podprogramu zwrócisz ("zreturnujesz") ten obiekt.

Istnieje jeszcze trzeci sposób , mianowicie przez użycie wskaźników (jeśli źle mówię, to poprawcie :)) - jednak nie jesteś jeszcze na tym etapie, lekcja o wskaźnikach jest w tutejszym kursie nieco dalej.



I jeszcze jedno. Nie musisz tworzyć dwóch funkcji do wczytywania osobno liczby a, osobno b. Wystarczy Ci jedna funkcja.

Powodzenia.


 
P-77720
melon
Temat założony przez niniejszego użytkownika
» 2013-03-05 13:56:00
Dzięki za odpowiedz!!

Posiadając dwie funkcje i przy Twojej pomocy łatwo jest zreturnować osobno a i b. Jednak gdy stworzę tylko jedną funkcje to potrafie tylko returnować wynik w sposob podany ponizej:
Z chęcią bym w funkcji "wczytajLiczbe" na koncu napisal return a,b a nie a+b. ALe może tak jak mówisz poczekam na te referencje

C/C++
#include <iostream>
using namespace std;
int wczytajLiczbe( int a, int b )
{
    do {
        cin.clear();
        cin.sync();
        cout << "podaj a" << endl;
        cin >> a;
    } while( a == 0 );
   
    do {
        cin.clear();
        cin.sync();
        cout << "podaj b " << endl;
        cin >> b; }
    while( b == 0 );
   
    return a + b;
}
int main()
{
   
    int a1;
    do {
        do {
            cin.clear();
            cin.sync();
            cout << "podaj dzialanie" << endl;
            cout << " [1]dodawanie \n [3]wyjscie" << endl;
            cin >> a1; }
        while( a1 > 3 );
       
        switch( a1 )
    { case 1:
            int a, b;
           
            cout << "a+b=" << wczytajLiczbe( a, b ) << endl;
            break;
           
        case 3:
            cout << "the End" << endl;
            break; }
       
    } while( a1 <= 2 );
   
    return 0;
}
P-77722
Figaro
» 2013-03-05 14:10:18
I jeszcze tutaj taka mała uwaga :)
C/C++
int wczytajb( int b )
{
    do
    {
        cin.clear();
        cin.sync();
        cout << "podaj liczbe: " << endl;
        cin >> b;
    }
    while( b == 0 ); // ten warunek spowoduje ze zabezpieczysz przed wczytaniem literek ale takze przed wczytaniem 0..
    //tu moze nikt 0 nie bedzie dodawal ale jesli np jakas ladna i fajniutka blondyneczka sie uprze to
    //wciskajac 0 nigdy nie  zakonczy wczytywania i powie ze program sie zawiesza :D

A pewnie nieraz jeszcze Ci się przyda funkcja która umożliwi także wczytanie 0.. :)
chyba ze się mylę to mnie poprawcie :D bo tez początkujący jestem..
P-77723
Figaro
» 2013-03-05 14:25:01
Kolego spróbuj tak:
C/C++
int wczytajb( int cos )
{
    do
    {
        cin.clear();
        cin.sync();
        cout << "podaj liczbe: " << endl;
        cin >> cos;
    }
    while( cos == 0 ); // tu nie poprawialem-to twoja działka..
   
    return cos;
}



i w main()
C/C++
int a, b;
a = wczytajb( a );
b = wczytajb( b );

cout << "a: " << a << endl;
cout << "b: " << b << endl;

i zobacz jakie wyniki otrzymasz?

jeśli do funkcji dajesz np int a i wywołujesz
wczytajb( a );
 to nie znaczy ze początek funkcji musi wyglądać tak:
int wczytajb( int a )
 możesz dać dowolna nazwę tylko typ- tu int musi się zgadzać..
przeczytaj jeszcze raz cześć kursu uważnie z funkcjami..
P-77724
Figaro
» 2013-03-05 14:36:19
na maja dzisiejsza wiedzę :) -a jestem parę rozdziałów dalej od Ciebie :)

nie da się returnowac dwóch zmiennych tak jak chcesz to zrobić:
"return a,b a nie a+b"  ta druga opcja daje jedna zmiena :) natomiast pierwsza to dwie :)
z tego co wiem z funkcji za pomocą return da się zwracać tylko jedna zmienną chyba ze w tablicy :)
no i przez referencje możesz od razu pod a i b przypisać ale to sam zobaczysz..

P-77725
melon
Temat założony przez niniejszego użytkownika
» 2013-03-05 14:59:39
Wiem ze zmienne w funkcji moga miec rozne nazwy niz te w main. No być może i prawde mowisz z tym zwracaniem jednej zmiennej maxymalnie poprzez jedną funkcje. Chciałbym tak naprawdę uzyskiwać odpowiedzi, które mozna osiągnąc na tym etapie kursu a nie to co bedzie w przyszlosci, jednak takie jest zadanie w lekcji 17, proszą tam o funkcje wczytajLiczbę a nie odrau wczytanie sumy (z ktorym poradze se).
 Mam nadzieje ze Tomczyk cos jeszcze pomoże, odnosząc się do jego zdania
"I jeszcze jedno. Nie musisz tworzyć dwóch funkcji do wczytywania osobno liczby a, osobno b. Wystarczy Ci jedna funkcja."
P-77727
Figaro
» 2013-03-05 15:20:16
mysle ze tomczyk11255 chodzilo o to ze po prostu miales dwie funkcje wczytujace liczby:
C/C++
int wczytaja( int a ) i
int wczytajb( int b )

C/C++
int wczytaja( int a )
{
    do {
        cin.clear();
        cin.sync();
        cout << "podaj a" << endl;
        cin >> a;
    } while( a == 0 );
   
    return a; }
int wczytajb( int b )
{
   
    do {
        cin.clear();
        cin.sync();
        cout << "podaj b " << endl;
        cin >> b; }
    while( b == 0 );
   
    return b;
}

z ktorych jedna jest zbedna bo wystarczy wywolac jedna z nich x2 i mamy wczytane liczby :) np. tak jak pisalem wyzej..

C/C++
int a, b;
a = wczytajb( a );
b = wczytajb( b );

to funkcje wczytujaca mozna jeszcze troche uproscic i warunek trzeba poprawic bo 0 tez czasem wczytujemy :)
fajnie jak by to tak wygladało:

C/C++
int wczytajLiczbe()
{
    int a;
    //tu kod
   
    return a;
}
//i wywolanie w main()
int a, b;
a = wczytajLiczbe();
b = wczytajLiczbe();

Pozdrawiam.


P-77728
« 1 » 2
  Strona 1 z 2 Następna strona