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

[C++] Pierwszy program - kalkulator.

Ostatnio zmodyfikowano 2016-06-15 23:31
Autor Wiadomość
korek94
Temat założony przez niniejszego użytkownika
[C++] Pierwszy program - kalkulator.
» 2016-06-05 22:17:47
Hej. Mój program opiera się na pierwszych kilkunastu lekcjach kursu C++. Chcę zobaczyć, czy poprawnie korzystam ze składni i zapisu. Kalkulator wydaje ]się, że działa poprawnie, jednak podczas wpisywania litery zamiast liczby wariuje kompletnie, tak samo mam problem z powrotem do pierwszej komendy po wykonanym jednym obliczeniu, zastosowałem return main()

oto kod:

C/C++
#include <iostream>

int main()

{
   
    std::cout << "\t Witaj w prostym kalkulatorze  v 0.99 ! " << std::endl << std::endl << std::endl << std::endl;
   
   
   
    {
       
        std::cout << " \t wybierz opcje: " << std::endl << std::endl << std::endl;
       
        std::cout << "[1] dodawanie  " << std::endl;
        std::cout << "[2] kwadrat liczby " << std::endl;
        std::cout << "[3] szescian liczby " << std::endl;
        std::cout << "[4] dzielenie  " << std::endl;
        std::cout << "[5] mnozenie  " << std::endl;
        std::cout << "[6] Wyjscie " << std::endl;
        std::cout << "wybierz opcje:  " << std::endl << std::endl << std::endl; }
   
    int wybor;
    std::cin >> wybor;
   
   
    switch( wybor )
   
   
    case 1
:
    {
       
       
        std::cout << "wybrales dodawanie. podaj pierwsza liczbe" << std::endl << std::endl;
        int b;
        int c;
        std::cin >> b;
        std::cout << "Podaj druga liczbe, zatwierdz ENTER " << std::endl << std::endl;
        std::cin >> c;
        std::cout << "twoj wynik to:   " << b + c << std::endl << std::endl << std::endl;
        return main();
       
        break;
       
    case 2:
       
        { std::cout << "wybrales potgowanie. Podaj  liczbe" << std::endl;
            int d;
            std::cin >> d;
            std::cout << "twoj wynik to:   " << d * d << std::endl << std::endl << std::endl;
            return main();
            break; }
       
    case 3:
       
        { std::cout << "Jaka liczbe podniesc do szescianu? Podaj  liczbe" << std::endl;
            double d;
            std::cin >> d;
            std::cout << "twoj wynik to:   " << d * d * d << std::endl << std::endl << std::endl;
            return main();
            break; }
       
       
    case 4:
       
        { std::cout << "wybrales dzielenie. Podaj dwie liczby" << std::endl;
            float pierwsza;
            float druga;
            std::cin >> pierwsza;
            std::cin >> druga;
            std::cout << "twoj wynik to:   " << pierwsza / druga << std::endl << std::endl << std::endl;
            return main();
            break; }
       
    case 5:
       
        { std::cout << "wybrales mnozenie. Podaj dwie liczby" << std::endl;
            float pierwsza;
            float druga;
            std::cin >> pierwsza;
            std::cin >> druga;
            std::cout << "twoj wynik to:   " << pierwsza * druga << std::endl << std::endl << std::endl;
            return main();
            break; }
       
    case 6:
        std::cout << "KONIEC" << std::endl;
        break;
       
    default:
        { std::cout << "nie ma takiej opcji" << std::endl;
            std::cout << "sprobuj ponownie" << std::endl;
            std::cin >> wybor;
            return main();
        }
    }
   
   
   
   
    return 0;
}
P-148896
carlosmay
» 2016-06-06 01:36:06
jednak podczas wpisywania litery zamiast liczby wariuje kompletnie
C/C++
std::cin.clear();
std::cin.ignore();

tak samo mam problem z powrotem do pierwszej komendy po wykonanym jednym obliczeniu
Jeśli coś ma być cykliczne stosujemy pętlę.

return main();
? - w żadnej książce i kursie nie spotkałem takiej instrukcji.
P-148900
maniekch1995
korek94
» 2016-06-12 04:48:37
kilka podpowiedzi :)
1) użyj (pod deklaracjami bibliotek) przestrzeni nazw - using namespace std- pozwoli Ci to na pominięcie std przed każdą linijką.
2) jak masz case-y to return ( jest to informacja zwracana "poza" switcha do programu (do funkcji itp), to znaczy że jak chcesz zwrócić do programu wartość np w case 1: dodawanie a i b to możesz to zrobić np tak - return a+b; (zwróci wynik dodawania). W Twoim programie jest to nawet zbędne gdyż w każdym case-ie wypisujesz wynik działania.
3) jak trochę ogarniesz to proponuję zaprzyjaźnić się z funkcjami - ułatwiają pisanie i pomagają rozbić "problem" który chcemy rozwiązać w programie na mniejsze pod problemy :)
P-149043
carlosmay
» 2016-06-12 12:27:20
1) użyj (pod deklaracjami bibliotek) przestrzeni nazw - using namespace std- pozwoli Ci to na pominięcie std przed każdą linijką.
Globalne używanie przestrzeni może być proszeniem się o kłopoty. (konflikt identyfikatorów z różnych bibliotek).

2) jak masz case-y to return ( jest to informacja zwracana "poza" switcha do programu (do funkcji itp), to znaczy że jak chcesz zwrócić do programu wartość np w case 1: dodawanie a i b to możesz to zrobić np tak - return a+b; (zwróci wynik dodawania). W Twoim programie jest to nawet zbędne gdyż w każdym case-ie wypisujesz wynik działania.
Dokładniej opisz ten pokrętny opis, bo wydaje mi się, że też nie rozumiesz jaki ma zadanie ten
return
. Zastępuje on pętlę w tym konkretnym przykładzie.

P-149049
korek94
Temat założony przez niniejszego użytkownika
» 2016-06-15 20:08:43
Celowo nie używam using namespace std, żeby nie mylić ze sobą różnych komend. Ostatnio poprawiłem kalkulator, przerobiłem temat z funkcjami nie zwracającymi wartości void. Ciągle jednak ten problem z powrotem do menu po wykonaniu jednego działania. Pewnie mam problem z zastosowaniem pętli, ale w tej chwili jest tyle kodu, że już się trochę pogubiłem.




C/C++
#include <iostream>
#include <string>
#include <stdlib.h>



void kwadrat()


{
    std::cout << "Podaj liczbe    " << std::endl;
   
   
    int d;
    std::cin >> d;
    std::cout << "twoj wynik to:   " << d * d << std::endl << std::endl << std::endl; }


void szescian()

{
    std::cout << "Podaj liczbe    " << std::endl;
    double d;
    std::cin >> d;
    std::cout << "twoj wynik to:   " << d * d * d << std::endl << std::endl << std::endl; }


void dzielenie()

{
    float pierwsza;
    float druga;
    std::cout << "pierwsza liczba:  ";
   
    std::cin >> pierwsza;
    std::cout << "druga liczba:     ";
    std::cin >> druga;
   
    std::cout << "twoj wynik to:    " << pierwsza / druga << std::endl << std::endl << std::endl;
}

void dodawanie()

{
   
   
    std::cout << "pierwsza liczba:    ";
    int b;
    int c;
    std::cin >> b;
    std::cout << "druga liczba:       ";
    std::cin >> c;
    std::cout << "twoj wynik to:      " << b + c << std::endl << std::endl << std::endl; }
void mnozenie()

{
    float pierwsza;
    float druga;
    std::cout << "pierwsza liczba:  ";
   
    std::cin >> pierwsza;
    std::cout << "druga liczba:     ";
    std::cin >> druga;
   
    std::cout << "twoj wynik to:    " << pierwsza * druga << std::endl << std::endl << std::endl;
}
void koniec()
{
   
   
    std::cout << "Koniec" << std::endl;
    exit( 0 );
   
}

void menu()

{ std::cout << "[1] dodawanie  " << std::endl;
    std::cout << "[2] kwadrat liczby " << std::endl;
    std::cout << "[3] szescian liczby " << std::endl;
    std::cout << "[4] dzielenie  " << std::endl;
    std::cout << "[5] mnozenie  " << std::endl;
    std::cout << "[6] Wyjscie " << std::endl << std::endl << std::endl;
    std::cout << "wybierz opcje:  " << std::endl << std::endl << std::endl; }
void brak()
{
    std::cout << "nie ma takiej opcji" << std::endl;
   
   
}


int main()

{
   
    std::cout << "********** Witaj w prostym kalkulatorze  v 0.99 ! ********** " << std::endl << std::endl << std::endl << std::endl;
   
    std::cout << "wpisz  \"start\", aby przejsc do menu" << std::endl;
    std::string start;
    std::cin >> start;
    if( start != "start" )
   
    do
   
    {
        std::cout << "niepoprawne haslo. Sprobuj jeszcze raz" << std::endl << std::endl;
        main();
       
    }
    while( start == "start" );
   
    system( "COLOR 0A" );
   
    menu();
   
   
    int wybor;
    std::cin >> wybor;
   
    std::cin.clear();
    std::cin.ignore();
   
    do
    switch( wybor )
   
    {
       
        std::cin.clear();
        std::cin.ignore();
    case 1:
        { dodawanie();
           
            return main();
           
            break; }
       
    case 2:
       
        {
           
            kwadrat();
            return main(); }
        break;
       
    case 3:
       
        {
            szescian();
            return main();
            break; }
       
       
    case 4:
       
        {
            dzielenie();
           
            return main();
            break; }
       
    case 5:
        {
            mnozenie();
           
           
           
           
            return main(); }
        break;
       
    case 6:
        { koniec();
            break; }
       
        default:
        { brak();
            return main();
            break; }
    }
    while(
    wybor > 0 || wybor >= 6 );
   
   
    return 0;
   
}
P-149152
carlosmay
» 2016-06-15 23:31:40
http://cpp0x.pl/kursy/Kurs-C++​/Poziom-2/Petla-do-while/18
http://cpp0x.pl/kursy/Kurs-C++​/Poziom-3/Petla-while/354

dla przykładu:
C/C++
std::cout << "********** Witaj w prostym kalkulatorze  v 0.99 ! ********** " << std::endl << std::endl << std::endl << std::endl;

std::cout << "wpisz  \"start\", aby przejsc do menu" << std::endl;
std::string start;
std::cin >> start;
if( start != "start" )

do

{
    std::cout << "niepoprawne haslo. Sprobuj jeszcze raz" << std::endl << std::endl;
    main();
   
} while( start == "start" );

ten fragment można tak zapętlić:
C/C++
std::string start;
do {
    std::cout << "********** Witaj w prostym kalkulatorze  v 0.99 ! ********** " << std::endl << std::endl << std::endl << std::endl;
    std::cout << "wpisz  \"start\", aby przejsc do menu" << std::endl;
   
    std::cin >> start;
    std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
   
    if( start != "start" )
         std::cout << "niepoprawne haslo. Sprobuj jeszcze raz" << std::endl << std::endl;
   
} while( start != "start" );

lub tak:
C/C++
std::cout << "********** Witaj w prostym kalkulatorze  v 0.99 ! ********** " << std::endl << std::endl << std::endl << std::endl;
std::cout << "wpisz  \"start\", aby przejsc do menu" << std::endl;

std::string start;
while( !( std::cin >> start ) ||( start != "start" ) ) {
    std::cout << "niepoprawne haslo. Sprobuj jeszcze raz" << std::endl << std::endl;
}
std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );


Program nie ma zabezpieczenia przed dzieleniem przez zero, oraz przed wpisaniem nieprawidłowych danych.


C/C++
do...while
 bez klamer wygląda dość dziwnie (zwiększa szansę na pogubienie klamer).


std::cout << "[6] Wyjscie " << std::endl << std::endl << std::endl;
...
C/C++
do {
    // switch(wybor)
} while( wybor != 6 ); // pa pa gdy wybor == 6

 
P-149161
« 1 »
  Strona 1 z 1