jak odwolac sie do zmiennych w funckji?

0

Jak w temacie, mam taki o to program ale w instrukcji switch musiałem dać stałe aby program "działał". Jak to zrobić, żeby użytkownik mógł sam sobie wybierać jakie chce liczby? Próbowałem zadeklarować dodatkowe zmienne a,b i tam dać ale kompilator pokazywał błąd.

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


using namespace std;

int dodaj(int x, int y);
int odejmij(int x, int y);
int pomnoz(int x, int y);
int podziel(int x, int y);

int main()
{
	int wybor;
	int p;

	cout << "program imitujacy kalkulator, wybierz dzialanie:\n1.dodawanie: \n2.odejmowanie: \n3.mnozenie: \n4.dzielenie: ";
	cout << endl;
	cin >> wybor;
		
		switch (wybor)
		{
		case 1: {dodaj(3, 1); break; }
		case 2: {odejmij(11, 7); break; }
		case 3: {pomnoz(1, 3); break; }
		case 4: {podziel(22, 6); break; }
		}

	
		
	return 0;
}

int dodaj(int x, int y)
{
	cout << "podaj pierwsza liczbe:";
	cin >> x;
	cout << "podaj druga liczbe";
	cin >> y;
	int p = x + y;
	return p;
}

int odejmij(int x, int y)
{
	int p;
	cout << "podaj pierwsza liczbe:";
	cin >> x;
	cout << "podaj druga liczbe";
	cin >> y;
	p = x - y;
	return p;
}

int pomnoz(int x, int y)
{
	cout << "podaj pierwsza liczbe:";
	cin >> x;
	cout << "podaj druga liczbe";
	cin >> y;
	return x * y;
}

int podziel(int x, int y)
{
	cout << "podaj pierwsza liczbe:";
	cin >> x;
	cout << "podaj druga liczbe";
	cin >> y;
	if (y != 0)
	{

		return x / y;
	}
	else
	{
		cout << "nie dziel przez 0!\n";
	}
	return 0;
}


 
1

Jeśli dobrze zrozumiałem, o co Ci chodzi:

// ...
cin >> wybor;
int x, y;
cout << "podaj pierwszą liczbę" << endl;
cin >> x;
cout << "podaj drugą liczbę" << endl;
cin >> y;
switch(wybor)
{
  case 1: {cout << "wynik: " << dodaj(x, y) << endl; break;}
//...

Jeśli kompilator Ci czegos nie przyjmuje, to wklej kod, którego nie chce przyjąć, wraz z błędem, będzie prościej.

1
// w switch'u pod odpowiednim case przykładowo.
std::cout << "wynik dodawania to: " << dodaj() << std::endl;

// a funkcja dodaj.
int dodaj()
{
    int x = 0;
    int y = 0;
    cout << "podaj pierwsza liczbe:";
    cin >> x;
    cout << "podaj druga liczbe";
    cin >> y;

    return x + y;
}
2

Pomijając wszystko inne to chodzi o to że tworzysz funkcje z dwoma argumentami a te argumenty wczytujesz dopiero gdy funkcja juz działa.

Najpierw wczytaj liczby (przy okazji uprościsz kod) a potem wstawiaj je jako argumenty do dowolnych funkcji.

0

Zmodyfikowałem funkcje w taki sposób:

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


using namespace std;

int dodaj(int x, int y);
int odejmij(int x, int y);
int pomnoz(int x, int y);
int podziel(int x, int y);

int main()
{
	int wybor;
		

	cout << "program imitujacy kalkulator, wybierz dzialanie:\n1.dodawanie: \n2.odejmowanie: \n3.mnozenie: \n4.dzielenie: ";
	cout << endl;
	cin >> wybor;
	

		switch (wybor)
		{
		case 1: {cout << "wynik dodawania to: " << dodaj() << endl; break; }
		case 2: {cout << "wynik odejmowania to: " << odejmij() << endl; break; }
		case 3: {cout << "wynik mnozenia to: " << pomnoz() << endl; break; }
		case 4: {cout << "wynik dzielenia to: " << podziel() << endl; break; }
		}

	
		
	return 0;
}

int dodaj()
{
	int x = 0;
	int y = 0;
	cout << "podaj pierwsza liczbe:";
	cin >> x;
	cout << "podaj druga liczbe";
	cin >> y;		
	return x + y;
}

int odejmij()
{
	int x = 0;
	int y = 0;
	cout << "podaj pierwsza liczbe:";
	cin >> x;
	cout << "podaj druga liczbe";
	cin >> y;
	return x - y;
}

int pomnoz()
{
	int x = 0;
	int y = 0;
	cout << "podaj pierwsza liczbe:";
	cin >> x;
	cout << "podaj druga liczbe";
	cin >> y;
	return x * y;
}

int podziel()
{
	int x = 0;
	int y = 0;
	cout << "podaj pierwsza liczbe:";
	cin >> x;
	cout << "podaj druga liczbe";
	cin >> y;
	if (y != 0)
	{

		return x / y;
	}
	else
	{
		cout << "nie dziel przez 0!\n";
	}
	return 0;
}


 

I kompilator w instrukcji switch widzi taki o to problem error C2660: 'dodaj' : function does not take 0 arguments To co z tymi in x =0 i int y = 0, on tego nie widzi?

1
int dodaj(int x, int y);
int odejmij(int x, int y);
int pomnoz(int x, int y);
int podziel(int x, int y);

Deklaracje wciąż masz dla funkcji dwuargumentowych. Swoją drogą tak powinno być. Np. nazwa dodaj w żaden sposób nie sugeruje, że pobierze ona dane od użytkownika z wejścia standardowego, jednocześnie coś na nie wypisując.

0
kq napisał(a):
int dodaj(int x, int y);
int odejmij(int x, int y);
int pomnoz(int x, int y);
int podziel(int x, int y);

Deklaracje wciąż masz dla funkcji dwuargumentowych. Swoją drogą tak powinno być. Np. nazwa dodaj w żaden sposób nie sugeruje, że pobierze ona dane od użytkownika z wejścia standardowego, jednocześnie coś na nie wypisując.

Pousuwałem argumenty tej deklaracji i program działa. z tego co rozumiem to napisałeś, że deklaracja powinna być dla funkcji dwuargumentowych. Dlaczego?

1

Bo takie funkcje są znacznie bardziej elastyczne. Każda funkcja powinna robić jedną rzecz, ale robić ją dobrze. Pobierająca dane - pobierać, licząca - liczyć. Załóżmy na przykład, że chcesz wykonać Bardzo Trudne Obliczenia™ oraz Szalenie Istotne Komputacje© a potem obliczyć ich iloczyn. Jak to zrobisz za pomocą Twoich funkcji? Wypiszesz je użytkownikowi, żeby przepisał? Ja np. bym wolał wykonać coś takiego:

int bto = bardzoTrudneObliczenia();
int sik = szalenieIstotneKomputacje();
cout << "Poszukiwany iloczyn: " << pomnoz(bto, sik) << endl;
0
kq napisał(a):

Bo takie funkcje są znacznie bardziej elastyczne. Każda funkcja powinna robić jedną rzecz, ale robić ją dobrze. Pobierająca dane - pobierać, licząca - liczyć. Załóżmy na przykład, że chcesz wykonać Bardzo Trudne Obliczenia™ oraz Szalenie Istotne Komputacje© a potem obliczyć ich iloczyn. Jak to zrobisz za pomocą Twoich funkcji? Wypiszesz je użytkownikowi, żeby przepisał? Ja np. bym wolał wykonać coś takiego:

int bto = bardzoTrudneObliczenia();
int sik = szalenieIstotneKomputacje();
cout << "Poszukiwany iloczyn: " << pomnoz(bto, sik) << endl;

Dziękuję. Tego właśnie w funkcjach nie rozumiem, a chciałbym to opanować. Słowem kluczowym jest tutaj funkcja dwuargumentowa? Bo nawet nie wiem co mam sobie wygooglować żeby znaleźć jakieś materiały co do tego zagadnienia :)

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