Czy moja funkcja jest poprawnie napisana?

0

Hej. Poniżej wklejam kod, który napisałem. Mam właściwie kilka pytań jeszcze.

  1. Czy może być tak dużo argumentów w jednej funkcji?
  2. Załóżmy, że mam zrobić 2 funkcje. W każdej są inne obliczenia, ale do funkcji drugiej muszę wykorzystać obliczenia z funkcji pierwszej. Jak w takim razie to zrobić, żeby w tej drugiej funkcji nie dawać argumentów z pierwszej i na nowo tego nie liczyć?
  3. Czy mój kod można zapisać jakoś jeszcze lepiej? Oczywiście pod względem takim wizualnym.
#include <iostream>
// suskpr - suma skladek pracownika
void kalkulator_zatrudnienia(unsigned short brutto, double dane1, double suma1, double dane2, double dane3, double suma2, double suma3, double suma4, double dane4, double dane5, double netto)
{
	dane1 = brutto * 13.71 / 100;
	std::cout << "Suma skladek na ubezpieczenia spoleczne: " << dane1 << " z\210." << std::endl;
	suma1 = brutto - dane1;
	dane2 = suma1 * 9 / 100; // skladka zdrowotna w calosci
	dane3 = suma1 * 7.75 / 100; // skladka zdrowotna podlegajaca odliczeniu
	suma2 = brutto - dane1 - 111.25; // zaliczka na podatek dochodowy, podstawa opowdatkowania
	//std::cout << "X" << suma2 << std::endl;
	suma3 = suma2 * 18 / 100; //  podatek nalezny
	suma4 = suma3 - 46.33; // podatek nalezny - kwota wolna od podatku
	dane4 = suma1 * 7.75 / 100; // skladka na ubezpieczenie zdrowotne podlegajca odliczeniu
	dane5 = suma4 - dane4; // zaliczka na podatek dochodowy
	netto = brutto - dane1 - dane2 - dane5;
	std::cout << "netto: " << netto << " z\210." << std::endl;
	
}

int main()
{
	unsigned short brutto = 0;
	double dane1 = 0;
	double suma1 = 0;
	double dane2 = 0;
	double dane3 = 0;
	double suma2 = 0;
	double suma3 = 0;
	double suma4 = 0;
	double dane4 = 0;
	double dane5 = 0;
	double netto = 0;
	std::cout << "Brutto: ";
	std::cin >> brutto;
	std::cin.get();

	kalkulator_zatrudnienia(brutto, dane1, suma1, dane2, dane3, suma2, suma3, suma4, dane4, dane5, netto);

	std::cin.get();
	return 0;
}

Nie zwracajcie na nazwy argumentów, i inne moje komentarze. Dopiero wchodzę w obiektowość i poznałem klasy, więc jak coś to proszę tak pisać, żebym mógł coś zrozumieć. Dziękuję i miłego dnia życzę.

4
  1. Technicznie może, ale jak sam zauważyłeś to bardzo nieczytelne i łatwo popełnić błąd np. podając argumenty w niewłaściwej kolejności.
  2. Możesz wyniki obliczeń zwrócić.
  3. Zdecydowanie:
  • możesz przekazać tablicę lub strukturę trzymającą dane zamiast miliarda argumentów,
  • możesz parametry funkcji ponazywać jakoś po ludzku, zamiast zaciemniająco dana1, dana2 itd...
  • możesz zainicjalizować zmienne (albo jeszcze lepiej jedną zmienną - strukturę z danymi) nie poświęcając na to kilkunastu linii,
  • patrząc na ten kod możesz przekazać tylko argument, który faktycznie potrzeba przekazać do funkcji, a pozostałe zmienne uczynić w tej funkcji lokalnymi.
0
#include <iostream>
#include <string>

struct Kalkulator_zatrudnienia
{
	unsigned short brutto; 
	double składka_emerytalna;
	double składka_rentowa;
	double składka_chorobowa;
	double składka_zdrowotna_w_całości;
	double składka_zdrowotna_podlegająca_odliczeniu;
	unsigned int podstawa_opodatkowania; // użyłem unsigned int, ponieważ liczba musi być zaokrąglona do pełnych złotych dlatego nie wiem czy jest sens używać double.
	double podatek_należy; // podstawa_opodatkowania * 18% / 100
	double podatek_należny_minus_kwota_wolna_od_podatku; // podatek należny - 46.33 zł
	double zaliczka_na_podatek_dochodowy; // podatek_należny - składka_zdrowotna_podlegająca_odliczeniu
};
void pokaż_kalkulator_zatrudnienia(Kalkulator_zatrudnienia kz)
{
	std::cout << kz.brutto << " " << kz.składka_emerytalna << std::endl;
}
void wypełnij_kalkulator_zatrudnienia(Kalkulator_zatrudnienia* kz)
{
	std::cout << "Brutto: ";
	std::cin >> kz->brutto;
	std::cout << "składka emerytalna:";
	std::cin >> kz->składka_emerytalna;
}
int main()
{
	std::cin.get();
	return 0;
}

Skorzystałem z porad i na razie stworzyłem coś takiego. Pytanie czy idę w dobrą stronę? Jak na końcu mam teraz wyświetlić wszystko, tam w int main()? Bo gdzieś będę musiał sam wprowadzić to brutto.

0

Polskie znaki w nazwach zmiennych, funkcji i nazwach w ogóle to średnio trafny pomysł. Ogólnie nieangielskie nazwy zmiennych to nie jest zbyt dobry pomysł, ale na razie to pomińmy.

Ogólnie idziesz w dobrym kierunku, chociaż zamiast wskaźników mógłbyś przekazywać referencje (ale to nie ma wielkiego wpływu na Twój kod na tym poziomie). W tym momencie powinieneś w main utworzyć obiekt typu Kalkulator_zatrudnienia, przekazać go do wypełnij_kalkulator_zatrudnienia, a następnie do pokaż_kalkulator_zatrudnienia.

0

Bardzo dobrze mi idzie. Teraz jak wykorzystałem funkcje i struktury to nareszcie to jakoś dobrze wygląda. Już wiem, że będę miał problem z zaokrągleniem liczb - trzeba to zrobić a nie potrafię jeszcze. Sprawdzałem jak to robić, ale trochę nie ogarniam dlatego wstrzymam się do wtorku. Wtedy mam zajęcia z korepetytorem więc rozwiąże swój problem. Ale na teraz mam jeszcze jedno pytanie.


unsigned short brutto;
std::cout << "Brutto: ";
	std::cin >> brutto; 
	std::cin.get();

Chciałbym dodać skrót "zł" po tym, jak wpiszę kwotę brutto. Jak należy to robić? Jeżeli po std::cin w nowej linijce robię std::cout << "z\210."; to niestety ale pojawia mi się to w następnej linijce przy włączaniu i wpisywaniu rzeczy do programu. A wiadomo, chciałbym, żeby po wpisaniu kwoty brutto "zł" pojawiły się obok a nie w następnej linijce.

1 użytkowników online, w tym zalogowanych: 0, gości: 1