• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kalkulator C++

VPS Starter Arubacloud
+3 głosów
31,354 wizyt
pytanie zadane 4 kwietnia 2015 w C i C++ przez #LongLiveYoungdzy Nowicjusz (180 p.)
Cześć, napisałem prosty kalulator. Jak oceniacie ten kod, jakie błędy popełniłem, co mógłbym zmienić? Pozdrawiam :)




// kalkulator.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <math.h>

using namespace std;

void dodaj(int a, int b)
{
	int suma;
	suma = a + b;
	cout << "Suma wynosi: " << suma << endl;
}
void odejm(int a, int b)
{
	int roznica;
	roznica = a - b;
	cout << "Roznica wynosi: " << roznica << endl;
}
void iloczyn(int a, int b)
{
	int iloczyn;
	iloczyn = a * b;
	cout << "Iloczyn wynosi: " << iloczyn << endl;
}
void iloraz(int a, int b)
{
	int iloraz;
	if (a == 0 || b == 0)
	{
		cout << "Rozwiazanie nie istnieje!\n";
	}
	else
	{
		iloraz = a / b;
		cout << "Roznica wynosi: " << iloraz << endl;
	}
}
void potega(int a, int b)
{
	cout << "Potega A wynosi: " << a*a << ", natomiast potega B wynosi: " << b*b << endl;
}
void pierwiastek(int a, int b)
{

	cout << "Pierwiastek a: " << sqrt(a) << ", pierwiastek b: " << sqrt(b) << endl;
}
void pitergoras(int a, int b)
{
	double c;
	int a1;
	int b1;
	int c1;

	a1 = a*a;
	b1 = b*b;
	c1 = a1 + b1;
	c = sqrt(c1);

	cout << "Liczba c wynosi: " << c << endl;
}

void get()
{
	system("pause");
}


int main()
{
	int a;
	int b;
	int wybor;

	printf("Witaj w calkulatorze!\n");
	get();
	for (;;)
	{
	system("cls");
	cout << "Podaj pierwsza liczbe: ";
	cin >> a;
	cout << "Podaj druga liczbe: ";
	cin >> b;
	cout << "MENU\n";
	cout << "1.Dodawanie\n2.Odejmowanie\n3.Mnozenie\n4.Dzielenie\n5.Potega\n6.Pierwiaste\n7.Pitegoras\n8.Wyjscie\n";
	cout << "Wybieram: ";
	cin >> wybor;

		switch (wybor)
		{
		case 1: {
			dodaj(a, b);
			get();
			break;
		} case 2: {
			odejm(a, b);
			get();
			break;
		} case 3: {
			iloczyn(a, b);
			get();
			break;
		} case 4: {
			iloraz(a, b);
			get();
			break;
		} case 5: {
			potega(a, b);
			get();
			break;
		} case 6: {
			pierwiastek(a, b);
			get();
			break;
		}case 7: {
			pitergoras(a,b);
			get();
			break;
		}
		
		case 8: {
			exit(1);
		}
		default: {
			cout << "Brak opcji!\n";
			get();
			break;
		}
		}
	}

	return 0;

8 odpowiedzi

0 głosów
odpowiedź 4 kwietnia 2015 przez kovi29 Obywatel (1,200 p.)
wybrane 4 kwietnia 2015 przez #LongLiveYoungdzy
 
Najlepsza
W funkcji obliczającej długość przeciwprostokątnej możesz skorzystać z funkcji bibliotecznej <cmath>

double pow( double podstawa, double potega );  ... zwracającej wartość potęgi...
+3 głosów
odpowiedź 4 kwietnia 2015 przez Valery Użytkownik (510 p.)
Ten printf w mainie mi sie nie podoba jak używasz cout to przy tym pozostań
komentarz 4 kwietnia 2015 przez Kuba Stary wyjadacz (12,460 p.)
Od kiedy to robi jakąkolwiek różnicę? Jeśli już to na korzyść printf'a.
komentarz 4 kwietnia 2015 przez Valery Użytkownik (510 p.)
Chodzi mi tylko o zachowanie dobrej praktyki czystego kodu
+2 głosów
odpowiedź 4 kwietnia 2015 przez szmq Pasjonat (22,770 p.)

1. Funkcja get() po switchu.

2. cout zamiast printf. Printf to przestarzała funkcja z C. Głównym powodem jest brak %d i %s. Fakt ten powinine miec istotne znaczenie poniewaz mozesz mniej pamietac aby uzyskac ten sam efekt. Mysle ze to sa glowne powody aby korzystac z cout. Zanim zaczniesz narzekać na to, że zapis jest dużo dłuższy - miej świadomość tego, że język C++ oferuje kilkanaście typów podstawowych, np. liczba całkowita krótka 16-bitowa, zwykła 32-bitowa i długa 64-bitowa. Każda z wcześniej wymienionych liczb może być ze znakiem lub bez. Do tego dochodzą znaki, liczby zmiennoprzecinkowe, wartości logiczne, wskaźniki i być może jeszcze inne podstawowe typy, które w chwili obecnej pominąłem. Dla każdego wyżej wymienionego typu zapis w funkcji printf występujący po % będzie wyglądał inaczej, natomiast w przypadku użycia mechanizmu C++ kompilator 'wie' co z danym typem zrobić. Pozwoliłem sobie na przekopiowanie kwałek tekstu z Cpp0x.pl a dokładnie: http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Obsluga-strumienia-wyjsciowego/9

3. Nazwy zmiennych, funkcji etc. pisałbym jednak po angielsku.

4. Zmienna statyczna - w programowaniu jest to zmienna, która w danym bloku programu posiada dokładnie jedną instancję i istnieje przez cały czas działania programu. W języku C++ każda zmienna globalna jest jednocześnie zmienną statyczną. Za każdym razem przy wykonywaniu pętli zmienne w Twoich funkcjach tworzą się na nowo. użyj zmiennych statycznych.  W przeciwieństwie do zwykłej zmiennej, zmienna statyczna nie jest niszczona po wyjściu programu z bloku gdzie została zadeklarowana, dzięki temu pamięta swoją wartość pomiędzy wywołaniami funkcji. Zyskamy na tym troche szybkości.

komentarz 5 kwietnia 2015 przez Mateusz Z. Nowicjusz (100 p.)
Zgadzam sie z przedmowca.
Sam natomiast zminil bym ten kalkulator na wersje objektowa.Gdzie liczba jest objektem i ma te wszystkie funkcje w sobie. Nastepnie wysylac do tego objektu nastepna liczbe jako parametr. I w ten sposob zrobic bardziej realistyczny kalkulator.

Zawsze to jakies wyzwanie i duzo zabawy, polecam ;)
0 głosów
odpowiedź 4 kwietnia 2015 przez Dawid Sobieszczuk Mądrala (6,240 p.)

Funkcja get() jak dla mnie jest niepotrzebna. I zamiast używać jej w każdym case, możesz użyć jej po swichu.

No i jeszcze zamiast pisać:

case 1: {
            dodaj(a, b);
            get();
            break;
        }

napisz:

case 1:
            dodaj(a, b);
            get();
            break;
0 głosów
odpowiedź 4 kwietnia 2015 przez Wally Bywalec (2,840 p.)
Nie bardzo jest co oceniać. Jest to prosty program który realizuje podstawowe działania, które można zrobić prościej. Można od razu dostać wynik dodawania stosując operator dwuargumentowy +, zamiast pisać funkcję, ale rozumiem że się uczysz. Jak już się czepiać, to jedna klamra na tym samym poziomie, jeden enter w switchu co brzydko wygląda. Na przyszłość warto by było nazywać argumenty funkcji żeby coś mówiły, a nie "a", "b", chociaż tutaj jest to tak proste, że to "a" i "b" jest dobre.
0 głosów
odpowiedź 4 kwietnia 2015 przez hit02 Nałogowiec (33,970 p.)

Jest kilka błędów.

Po pierwsze, co mi się rzuciło w oczy, to urzywasz na przemian cout i printf(). W dodatku nie masz #include <stdio.h>. W kompilatorze MS, może to działa, ale w g++ już nie.

Po drugie nie sprawdzasz poprawności wprowadzonych danych - są takie fajne metody, jak cin.good(), cin.fail(), cin.flush(), cin.clear().

Nie pozwalasz na dzielenie zera przez nie zero.

Nie sprawdzasz przy dzieleniu, czy nie dzielisz -2147483648 przez -1. Wiem, że dla początkujących jest to mało intuicyjne, ale musisz to sprawdzać, bo wynikiem powinno być 2147483648, które nie zmieści się w int, więc poleci exception i system zabije twój proces.smiley

0 głosów
odpowiedź 5 kwietnia 2015 przez maciek26800 Nowicjusz (140 p.)
Myślę, że wszystko istotne zostało już napisane, jednak ja pozwolę dodać coś od siebie, uważam, że zastasowanie funkcji get() nie jest najlepszym rozwiązaniem, ponieważ komenda system("pause") nie jest najkorzystniejsza w kodowaniu.
0 głosów
odpowiedź 5 kwietnia 2015 przez Sebastian Fojcik Nałogowiec (43,020 p.)
Ja jako potencjalny użykownik tego programu zwracam uwagę na dwa problemy. 1. Co to takiego znaczy "potęga"? Jak już potęga, to jakiegoś stopnia albo kwadrat, albo sześcian. 2. Co to takiego "pierwiastek"? Jak już, to pierwiastek jakiegoś stopnia albo pierwiastek kwadratowy To drobne mankamenty, ale znaczące z punku widzenia odbiorcy programu.

Podobne pytania

0 głosów
1 odpowiedź 267 wizyt
0 głosów
1 odpowiedź 262 wizyt
pytanie zadane 7 sierpnia 2022 w C i C++ przez KrzysiekM996 Nowicjusz (170 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...