jak odwolac sie do zmiennych w funckji?

jak odwolac sie do zmiennych w funckji?
S0
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:6
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.

Kopiuj
#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;
}


 
KM
A gdzie wypisywanie wyniku?
KM
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:473
1

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

Kopiuj
// ...
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.

edytowany 1x, ostatnio: kmph
D7
jak pierwszy raz taki program pisałem to w każdym case wsadzałem prośbę o podanie liczb. Aż łezka się w oku kręci :P
1
Kopiuj
// 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;
}
Zobacz pozostałe 16 komentarzy
KM
I taka właśnie mentalność powoduje, że potem na forach zamiast merytorycznych dyskusji są przepychanki i/lub monologi, bo każdy powtarza tylko swoje, niekiedy obrażając przy okazji wszystkich, którzy myślą inaczej od niego.
KM
Jeśli już coś piszesz publicznie, to chyba piszesz dla innych, a nie dla siebie. Z perspektywy odbiorcy zatem: gdyby każdy miał badać każde autorytarnie wygłoszone twierdzenie, to by życia na to nie starczyło. Wydajemisię, że autorytarnie wygłoszone twierdzenia mają większą szansę na bycie zignorowanymi, a twierdzenia uzasadnione - na bycie wziętymi pod uwagę.
KM
Na marginesie, jednak w końcu uzasadniłeś swoje twierdzenia, za co uczciwie dziękuję.
fasadin
@kmph @Damis7 Warto inicjalizowac zmienne zawsze. Nawet jezeli "zaraz" zostana przypisane. Dlaczego? Kod ewoluuje i moze sie zdarzyc ze ta "natychmiastowa" inicjalizacja zniknie i bedzie gdzie indziej, ale zmienne beda nadal gdzies uzywane. I przez takie pojawiaja sie bledy bardzo trudne do wypalania... Pracowalem w firmie w ktorej programisci stracili tydzien bo mieli wlasnie niezainicjalizowana zmienna... nie czytali warningow kompilatora (olewali je) i mieli funkcje po 1500 linii kodu.
kq
Inicjalizacja zmiennych to dobry pomysł, ale w tym wypadku faktycznie nie jest niezbędna (chociaż to dobra praktyka do przyjęcia po prostu). Jeśli już jesteśmy przy obrzucaniu się linkami to proszę: http://cichyfragles.pl/2012/03/07/jak-uzywac-apostrof-u/
W5
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Kraków
  • Postów:95
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.

S0
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:6
0

Zmodyfikowałem funkcje w taki sposób:

Kopiuj
#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?

edytowany 3x, ostatnio: santana011
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
1
Kopiuj
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.


edytowany 1x, ostatnio: kq
S0
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:6
0
kq napisał(a):
Kopiuj
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?

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
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:

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

S0
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:6
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:

Kopiuj
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 :)

edytowany 1x, ostatnio: santana011

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.