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

Kalkulator C++

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
+3 głosów
31,928 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,040 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ź 507 wizyt
0 głosów
1 odpowiedź 297 wizyt
pytanie zadane 7 sierpnia 2022 w C i C++ przez KrzysiekM996 Nowicjusz (170 p.)

93,157 zapytań

142,170 odpowiedzi

321,878 komentarzy

62,486 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 224p. - Marcin Putra
  2. 224p. - nidomika
  3. 223p. - dia-Chann
  4. 221p. - ssynowiec
  5. 217p. - Mikbac
  6. 216p. - CC PL
  7. 215p. - Łukasz Piwowar
  8. 212p. - zmmz89
  9. 210p. - Adrian Wieprzkowicz
  10. 208p. - rafalszastok
  11. 206p. - Michal Drewniak
  12. 204p. - Łukasz Eckert
  13. 202p. - rucin93
  14. 200p. - robwarsz
  15. 198p. - TheLukaszNs
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...