C// Argumenty funkcji main- błąd w programie


(Magda Foks) #1

Witam,

oto polecenie:

Wykorzystując parametry wywołania programu napisać prosty kalkulator

dwuargumentowy. Program powinien przyjmować 3 parametry: liczbę, liczbę i operację,

która ma między nimi być wykonana, np.:

calc 2 4 +

gdzie calc jest nazwa programu a 2 4 + są argumentami jego wywołania

Mój program :

# include 

# include 

int dodaj (int a, int b);

int odejmij (int a, int b);

int mnoz (int a, int b);

int dziel (int a, int b);


int main (int argc, char ** argv)

{

	int a, b;


	a = atoi (argv [1]);

	b = atoi (argv [2]);


	if (argv[3] == '+') printf("%d", dodaj(a,b)); // tu zaczynają się błędy--> comparison between pointer and integer (enabled by default)

	else if (argv [3] == '-') printf("%d", odejmij(a,b));

	else if (argv [3] == '*') printf("%d", mnoz(a,b));

	else if (argv [3] == '/') printf("%f", dziel(a,b));

	else printf("Bledny znak");


	return 0;


}

Nie wiem co mam zmienić, by program zadziałał.

Z góry dziękuje za pomoc.


(Wojtekbogocki) #2

Te if/else łatwiej zrobić switchem - to raz. Spróbuj tak:

*argv[3] == '+'

(P) #3

No i jak chcesz drukować float jako wynik dzielenia to lepiej zwracać w dziel float.


(Magda Foks) #4

// tu zaczynają się błędy--> comparison between pointer and integer (enabled by default)

Dziękuje za podpowiedzi, ale bardziej chodzi mi o ten błąd. Tzn. kompilator ma problem ze np. '+' to nie int. Nie wiem jak powinno być poprawnie, narazie chciałabym rozwikłać ten problem. Switchem też nie wychodzi.

Wtedy ten problem musiałby wyglądać jakoś tak

switch (argv[3])

{

      case '+':

             printf("...",..))... itd.

}

(P) #5

Kolega odpowiedział na ten problem w pierwszym poście:


(Rolek0) #6

Tyle, że ‘+’ to właśnie int o wartości 43 (kod znaku + w tablicy ASCII, dopiero w C++ literały pojedynczych znaków są typu char, który od inta różni się tylko rozmiarem, numery znaków te same).

Natomiast elementy tablicy argv są typu char*, czyli wskaźnik na znak, który de facto jest liczbą określającą numer komórki pamięci, w której zaczyna się napis.

Porównanie tych dwóch liczb nie da jednak żadnego sensownego rezultatu. Bardziej sensowne będzie porównanie ‘+’ z pierwszym znakiem tego napisu, czyli argv[3][0] lub - jak podawali powyżej - *argv[3] co wychodzi na to samo.

Jeśli chcesz to możesz też sprawdzić czy argv[3][1] == 0 aby mieć pewność, że napis ma tylko 1 znak długości (0 to terminator), ale tylko wtedy, gdy pierwszy znak jest różny od 0 (gdy jest równy to napis ma 0 znaków).


([alex]) #7

switch (argv[3][0]) ...


(Magda Foks) #8

Dalej coś jest nie tak. Tzn. program poprawnie odczytuje wartości a i b, ale chyba nie odczytuje znaków '+' '-' itd.

# include 

# include 

int dodaj (int a, int b);

int odejmij (int a, int b);

int mnoz (int a, int b);

float dziel (int a, int b);


int main (int argc, char * argv[])

{

	int a, b;


	a = atoi (argv [1]);

	b = atoi (argv [2]);

	printf("a = %d, b = %d\n", a, b);


	switch (argv[3][0])

	{

		case '+':

			printf ("%d", dodaj(a,b));

		case '-':

			printf("%d", odejmij(a,b));

		case '*':

			printf("%d", mnoz(a,b));

		case '/':

			printf("%f", dziel (a,b));

		default:

			printf("Bledny znak");

	}


	return 0;	

}


/ ********************************************************************************************************** /

int dodaj (int a, int b)

{

	return (a + b) ;

}


int odejmij (int a, int b)

{

	return (a - b);

}


int mnoz (int a, int b)

{

	return (a * b);

}


float dziel (int a, int b)

{

	return (a / b);

}

(P) #9

Zapomniałaś o break w switch, więc wykonywane są wszystkie działania po kolei. Zobacz: http://4programmers.net/C/Switch