[C++] Pierwszy program - kalkulator.
Ostatnio zmodyfikowano 2016-06-15 23:31
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: #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; }
|
|
carlosmay |
» 2016-06-06 01:36:06 jednak podczas wpisywania litery zamiast liczby wariuje kompletnie |
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. |
|
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 :)
|
|
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. |
|
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. #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; }
|
|
carlosmay |
» 2016-06-15 23:31:40 http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Petla-do-while/18http://cpp0x.pl/kursy/Kurs-C++/Poziom-3/Petla-while/354dla przykładu: 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ć: 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: 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. bez klamer wygląda dość dziwnie (zwiększa szansę na pogubienie klamer). std::cout << "[6] Wyjscie " << std::endl << std::endl << std::endl; |
... do { } while( wybor != 6 );
|
|
« 1 » |