[C++] Błąd przy zwracaniu wartości


(niesuszek) #1

Witam. Mam do napisania funkcję która zwraca true albo false. Wszystko ładnie, pięknie działa dopóki użytkownik nie zrobi błędu i program nie poprosi o ponowne podanie wartości np.

TAK2

TAK

po tym program wypisuje poprawnie wynik, ale wyrzuca zaraz błąd. W czym jest problem?

#include 


bool decyzja(char *tab){

	printf("Podejmij decyzje: TAK/NIE\n"); 


	scanf("%s", tab);


	if(tab[0]=='T' && tab[1]=='A' && tab[2]=='K'){

		if(tab[3]=='\0')

			return true;			

		else

			decyzja(tab);

	}

	else if(tab[0]=='N' && tab[1]=='I' && tab[2]=='E'){

		if(tab[3]=='\0')

			return false;

		else 

			decyzja(tab);		

	}

	else {

		printf("Bledne dane. Sprobuj jeszcze raz.");

		decyzja(tab);

	}

}


int main(){

	char tab[4];


	bool wartosc_zwracana = decyzja(tab);


	if(wartosc_zwracana==true)

		printf("Wybrales TAK\n\n");

	else if(wartosc_zwracana==false)

		printf("Wybrales NIE\n\n");


	printf("\nKoniec programu\n\n");

	return 0;

}

(Pablo_Wawa) #2

A nie prościej przy porównywaniu używać funkcji strcmp? http://pl.wikibooks.org/wiki/C/strcmp

Po drugie sugeruję całość sprawdzania (wraz z wczytywaniem odpowiedzi) zawrzeć w pętli while z warunkiem true (wyjście i tak wcześniej przez return ) a nie robić to rekurencyjnie.

Dodatkowo zmienną tab umieścił bym lokalnie (a nie w parametrze wywołania - po co tu?), a warunek if (wynik == true) można uprościć do if (wynik), czyli zamiast

if(wartosc_zwracana==true)

      printf("Wybrales TAK\n\n");

   else if(wartosc_zwracana==false)

      printf("Wybrales NIE\n\n");

wystarczy po prostu

if(wartosc_zwracana)

      printf("Wybrales TAK\n\n");

   else

      printf("Wybrales NIE\n\n");

([alex]) #3

Poco tak sobie komplikujesz? tak a propos bool w C jeszcze nie istnieje

#include 

#include 

#include 


char *DECYZJA[]={"NIE","TAK"};


int decyzja()

  {

   for(;;)

     {

      char tab[5];

      printf("Podejmij decyzje: TAK/NIE: ");

      scanf("%4s",tab);

      strupr(tab);

      if(!strcmp(tab,DECYZJA[0])) return 0;

      if(!strcmp(tab,DECYZJA[1])) return 1;

      printf("Bledne dane. Sprobuj jeszcze raz.\n");

     }

  }


int main()

  {

   int wartosc_zwracana=decyzja();

   printf("Wybrales %s\n\n",DECYZJA[wartosc_zwracana]);

   printf("Koniec programu");

   return 0;

  }

(tomms) #4

W C99 jest nowe słowo kluczowe _Bool. A po zainkludowaniu stdbool.h możemy używać makra bool które rozwija się do _Bool.

Dodatkowo otrzymujemy makra true i false (rozwijające się odpowiednio do 1 i 0).

Przykład:

#include

bool swinka = true;

(Pablo_Wawa) #5

A czy Wy widzicie temat wątku? Co tam jest napisane? C++ Panowie (i Panie, ewentualnie)!


([alex]) #6

To co w tytule nie ma znaczenia, początkujący często mylą pojęcia: kompilator z IDE, C z C++, cyfra z liczba. Ja tu widzę printf i scanf - co wg mnie sugeruje C.