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

Lekcja 2.17

Ostatnio zmodyfikowano 2016-07-21 19:03
Autor Wiadomość
Luq
» 2016-07-19 20:26:15
Po co Ci dwie funkcje (liczba1 i liczba2), które robią dokładnie to samo?
P-150134
CCbolt
Temat założony przez niniejszego użytkownika
» 2016-07-19 20:55:26
Pewnie po nic, na razie z niewiedzy wstawiłem, błąd w logice poprawię jak tylko program zadziała. Na dziś nic nie wymyślę, gdzieś robię podstawowy błąd ale tego nie widzę, coś źle jest przypisane.


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

int moje_menu()
{
    int wybor_opcji;
    bool sprawdzenie_poprawnosci;
    cout << "================================Kalkulator=================================" << endl;
    cout << "[1] Dodawanie \n[2] Odejmowanie \n[3] Mnozenie \n[4] Dzielenie\n[5] Koniec \n";
    cin >> wybor_opcji;
    if( sprawdzenie_poprawnosci == false || wybor_opcji < 1 || wybor_opcji > 5 )
    do
    { cin.clear();
        if( isalpha( cin.get() ) )
        {
            cout << " Bledny znak! " << endl;
        }
        else
        {
            cout << "Inny niedozwolony znak! " << endl;
        }
        cout << "Wybierz poprawna opcje" << endl;
        cin >> wybor_opcji;
    } while( sprawdzenie_poprawnosci == false || wybor_opcji < 1 || wybor_opcji > 5 );
   
   
   
    return wybor_opcji;
}



float liczba_1()
{
    float liczba_1;
    bool sprawdzenieLiczby;
    cin >> liczba_1;
    sprawdzenieLiczby = cin.good();
    if( sprawdzenieLiczby == false )
    do
    { cin.clear();
        if( isalpha( cin.get() ) )
        {
            cout << "Litery to nie liczby" << endl;
        }
        else
        {
            cout << "Podales cos jeszcze innego niz litery" << endl;
        }
       
        cout << "Podaj ponownie liczbe : ";
        cin >> liczba_1;
        sprawdzenieLiczby = cin.good();
    } while( sprawdzenieLiczby == false );
   
    return liczba_1;
}


float liczba_2()
{
    float liczba_2;
    bool sprawdzenieLiczby;
    cin >> liczba_2;
    sprawdzenieLiczby = cin.good();
    if( sprawdzenieLiczby == false )
    do
    { cin.clear();
        if( isalpha( cin.get() ) )
        {
            cout << "Litery to nie liczby" << endl;
        }
        else
        {
            cout << "Podales cos jeszcze innego niz litery" << endl;
        }
       
        cout << "Podaj ponownie liczbe : ";
        cin >> liczba_2;
        sprawdzenieLiczby = cin.good();
    } while( sprawdzenieLiczby == false );
   
    return liczba_2;
}



int dodawanie()
{
    cout << "Wynik: " << liczba_1() + liczba_2() << endl;
}
int odejmowanie()
{
    cout << "Wynik: " << liczba_1() + liczba_2() << endl;
}
int mnozenie()
{
    cout << "Wynik: " << liczba_1() * liczba_2() << endl;
}
int dzielenie()
{
    cout << "Wynik: " << liczba_1() / liczba_2() << endl;
}

int main()
{
    cout << "Podaj pierwsza liczbe: ";
    cin >> liczba_1();
    count << "Podaj druga liczbe: ";
    cin >> liczba_2();
   
   
    switch( moje_menu )
    {
    case 1:
        dodawanie();
        break;
    case 2:
        odejmowanie();
        break;
    case 3:
        mnozenie();
        break;
    case 4:
        dzielenie();
        break;
    case 5:
        cout << "Wyjscie z programu" << endl;
        break;
       
    }
   
   
    return 0;
   
}
[ cpp ]
P-150135
pekfos
» 2016-07-20 10:08:38
C/C++
cout << "Podaj pierwsza liczbe: ";
cin >> liczba_1();
count << "Podaj druga liczbe: ";
cin >> liczba_2();
Co to ma być?

C/C++
int odejmowanie()
{
    cout << "Wynik: " << liczba_1() + liczba_2() << endl;
}
Ładne odejmowanie. Po co w ogóle robisz funkcję, gdy opakowuje jedną linię kodu, a używasz jej w jednym miejscu programu..? Niczego nie zyskujesz, jeśli nie liczyć wydłużenia i pogmatwania kodu jako zysku.

C/C++
liczba_1() / liczba_2()
Kolejność obliczania operandów jest nieokreślona, więc nie pisz tak, chyba że a/b i b/a to dla ciebie jedno.
P-150139
CCbolt
Temat założony przez niniejszego użytkownika
» 2016-07-20 17:33:16
Doświadczenia nie mam i się bawię, w założeniu chciałem aby wczytało funkcję liczba_1 która była by sprawdzona pod względem poprawności to samo z funkcją liczba_2, dlatego są tu dwie funkcje.
C/C++
cout << "Podaj pierwsza liczbe: ";
cin >> liczba_1();
count << "Podaj druga liczbe: ";
cin >> liczba_2();

Z tym odejmowaniem... czeski błąd wyszedłby przy wprowadzaniu liczb.

"Kolejność obliczania operandów jest nieokreślona". Przecież jest pokazane funkcja_1 dzielona przez funkcja_2 w kalkulatorze też mam a/b i działa, nie wiem czy z wynikiem funkcjami można tak robić, return powinien zwrócić poprawną liczbę.


Zobaczyłem kilka tematów jak ludzie to rozwiązują, rozrysowałem na kartce i staram się to przełożyć na kod ale nie idzie.
P-150143
carlosmay
» 2016-07-20 17:42:48
C/C++
cin >> liczba_1(); // to jest źle
Funkcja zwraca wartość, z którą możemy coś zrobić.
np.
float liczba = liczba_1();
P-150144
CCbolt
Temat założony przez niniejszego użytkownika
» 2016-07-20 19:23:20
Jeden błąd znalazłem, najgłupszy z możliwych czyli brak odpowiedniej biblioteki teraz jednak utknąłem i nie wiem jak rozwiązać problem.
Najsensowniej chyba będzie  jak funkcje moje_menu podzielę na dwie. Program nie wczytuje komunikatów proszących o podanie liczb i ogulni nie zachowuje się tak jak chcę. Jakaś podpowiedź co jeszcze powinienem zrobić na co zwrócić uwagę? Próbowałem zwroty upchnąć w argumentach ale coś nie poszło tak jak powinno.


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

int moje_menu()
{
    int wybor_opcji;
    bool sprawdzenie_poprawnosci;
    cout << "================================Kalkulator=================================" << endl;
    cout << "[1] Dodawanie \n[2] Odejmowanie \n[3] Mnozenie \n[4] Dzielenie\n[5] Koniec \n";
    cin >> wybor_opcji;
    if( sprawdzenie_poprawnosci == false || wybor_opcji < 1 || wybor_opcji > 5 )
    do
    { cin.clear();
        if( isalpha( cin.get() ) )
        {
            cout << " Bledny znak! " << endl;
        }
        else
        {
            cout << "Inny niedozwolony znak! " << endl;
        }
        cout << "Wybierz poprawna opcje" << endl;
        cin >> wybor_opcji;
    } while( sprawdzenie_poprawnosci == false || wybor_opcji < 1 || wybor_opcji > 5 );
   
   
   
    return wybor_opcji;
}



float liczba_1()
{
    float liczba_1;
    bool sprawdzenieLiczby;
    cin >> liczba_1;
    sprawdzenieLiczby = cin.good();
    if( sprawdzenieLiczby == false )
    do
    { cin.clear();
        if( isalpha( cin.get() ) )
        {
            cout << "Litery to nie liczby" << endl;
        }
        else
        {
            cout << "Podales cos jeszcze innego niz litery" << endl;
        }
       
        cout << "Podaj ponownie liczbe : ";
        cin >> liczba_1;
        sprawdzenieLiczby = cin.good();
    } while( sprawdzenieLiczby == false );
   
    return liczba_1;
}


float liczba_2()
{
    float liczba_2;
    bool sprawdzenieLiczby;
    cin >> liczba_2;
    sprawdzenieLiczby = cin.good();
    if( sprawdzenieLiczby == false )
    do
    { cin.clear();
        if( isalpha( cin.get() ) )
        {
            cout << "Litery to nie liczby" << endl;
        }
        else
        {
            cout << "Podales cos jeszcze innego niz litery" << endl;
        }
       
        cout << "Podaj ponownie liczbe : ";
        cin >> liczba_2;
        sprawdzenieLiczby = cin.good();
    } while( sprawdzenieLiczby == false );
   
    return liczba_2;
}



int dodawanie()
{
    cout << "Wynik: " << liczba_1() + liczba_2() << endl;
}
int odejmowanie()
{
    cout << "Wynik: " << liczba_1() - liczba_2() << endl;
}
int mnozenie()
{
    cout << "Wynik: " << liczba_1() * liczba_2() << endl;
}
int dzielenie()
{
    cout << "Wynik: " << liczba_1() / liczba_2() << endl;
}

int main()
{
    float liczba1 = liczba_1();
    float liczba2 = liczba_2();
    int zaczynam = moje_menu();
   
   
   
    cout << "Podaj pierwsza liczbe: ";
    cin >> liczba1;
    cout << "Podaj druga liczbe: ";
    cin >> liczba2;
   
    moje_menu();
    switch( zaczynam )
    {
    case 1:
        dodawanie();
        break;
    case 2:
        odejmowanie();
        break;
    case 3:
        mnozenie();
        break;
    case 4:
        dzielenie();
        break;
    case 5:
        cout << "Wyjscie z programu" << endl;
        break;
    }
   
   
    return 0;
   
}
[ cpp ]
P-150149
carlosmay
» 2016-07-20 19:54:36
Im dalej tym gorzej. Kodu jest dwa razy za dużo.

Dzielenie kodu na funkcje ma sens jeśli każda ma jedno zadanie.
Funkcja wyświetlającą menu powinna wyświetlać.
Funkcja pobierająca liczbę powinna być jedna (wybór działania też można nią wykonać).
Sprawdzanie poprawności w osobnej funkcji (lub w tej samej).

Kilkakrotnie powtarzasz operacje. Niepotrzebnie.

Schemat:
1. Wypisz menu.
2. Zadeklaruj dwie zmienne (operandy).
3. Zadeklaruj zmienną działania.
4. Pobierz liczbę używają funkcji i zapisz zwróconą wartość do zmiennej (użyj tej samej funkcji dla obu operandów i działania).
5. W switchu wywołać funkcje odpowiadające działaniu (argumentami powinny być operandy).
6. Funkcje powinny przyjmować argumenty (dwie liczby i na nich wykonać) działanie i zwrócić wynik.

Można to jeszcze uprości , ale na razie wystarczy.
P-150150
CCbolt
Temat założony przez niniejszego użytkownika
» 2016-07-20 23:18:20
@carlosmay czy w dobrą stronę idę? Ładnie to rozpisałeś te zagadnienie jest dla mnie cieżkie.
Drugi kod nie działa ale zastanawiam się czy tok myślenia jest dobry.

C/C++
#include <iostream>
#include <locale>

using namespace std;

int moje_menu()

{
    cout << "================================Kalkulator=================================" << endl;
    cout << "[1] Dodawanie \n[2] Odejmowanie \n[3] Mnozenie \n[4] Dzielenie\n[5] Koniec \n";
}

int opcja_switch()

{
    int liczba;
    bool sprawdzam;
    cout << "Wybierz dzialanie: ";
    cin >> liczba;
    sprawdzam = cin.good();
   
    if( sprawdzam == false || liczba < 1 || liczba > 5 )
    do
    {
        cin.clear();
        if( isalpha( cin.get() ) )
             cout << "Litery sa niedozwolone!" << endl;
        else
             cout << "Bledny znak!" << endl;
       
        cout << "Podaj ponownie liczbe: ";
        cin >> liczba;
        sprawdzam = cin.good();
    } while( sprawdzam == false || liczba < 1 || liczba > 5 );
   
   
    return liczba;
}

float zmienne()
{
    float liczba_1, liczba_2;
    cout << "Podaj pierwsza liczbe: ";
    cin >> liczba_1;
    cout << "Podaj druga liczbe: ";
    cin >> liczba_2;
    return 0;
}


float dodawanie( float A, float B ) // A liczba nr1, B liczba nr 2.
{
    return A + B;
}
float odejmowanie( float A, float B )
{
    return A - B;
}

float mnozenie( float A, float B )
{
    return A * B;
}
float dzielenie( float A, float B )
{
    return A / B;
}

int main()
{
    moje_menu();
    zmienne();
    int zmiana = opcja_switch();
    switch( zmiana )
    case 1
: dodawanie();
    break;
case 2:
    odejmowanie();
    break;
case 3:
    mnozenie();
    break;
case 4:
    dzielenie;
    break;
case 5:
    cout << "Zakoncz" << endl;
    break;
   
   
   
   
    return 0;
}



C/C++
#include <iostream>
#include <locale>

using namespace std;

int moje_menu()

{
    cout << "================================Kalkulator=================================" << endl;
    cout << "[1] Dodawanie \n[2] Odejmowanie \n[3] Mnozenie \n[4] Dzielenie\n[5] Koniec \n";
}

int opcja_switch()

{
    int liczba;
    bool sprawdzam;
    cout << "Wybierz dzialanie: ";
    cin >> liczba;
    sprawdzam = cin.good();
   
    if( sprawdzam == false || liczba < 1 || liczba > 5 )
    do
    {
        cin.clear();
        if( isalpha( cin.get() ) )
             cout << "Litery sa niedozwolone!" << endl;
        else
             cout << "Bledny znak!" << endl;
       
        cout << "Podaj ponownie liczbe: ";
        cin >> liczba;
        sprawdzam = cin.good();
    } while( sprawdzam == false || liczba < 1 || liczba > 5 );
   
   
    return liczba;
}

float liczba_1()
{
    float liczba_1;
    cout << "Podaj pierwsza liczbe: ";
    cin >> liczba_1;
    return liczba_1();
}
float liczba_2()
{
    float liczba_2;
    cout << "Podaj druga liczbe: ";
    cin >> liczba_2;
    return liczba_2;
}


float dodawanie( float A, float B ) // Funkcje zwracająca wynik, przyjmująca parametry bez wartości domyślnych
{ int A = liczba_1(); // Parametry przyjmują wartosci z innych funkcji
    int B = liczba_2();
    return A + B;
}
float odejmowanie( float A, float B )
{ int A = liczba_1();
    int B = liczba_2();
    return A - B;
}

float mnozenie( float A, float B )
{ int A = liczba_1();
    int B = liczba_2();
    return A * B;
}
float dzielenie( float A, float B )
{ int A = liczba_1();
    int B = liczba_2();
    return A / B;
}

int main()
{
    moje_menu();
    zmienne();
    int zmiana = opcja_switch();
    switch( zmiana )
    case 1
: dodawanie();
    break;
case 2:
    odejmowanie();
    break;
case 3:
    mnozenie();
    break;
case 4:
    dzielenie;
    break;
case 5:
    cout << "Zakoncz" << endl;
    break;
   
   
   
   
    return 0;
}
P-150154
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona