[C++] Dlaczego program wykonuje else, pomimo wykonania if?


(pawelek5) #1

Witam,

Dlaczego w tym fragmencie kodu jeżeli wpiszę wartość np. 200, program wyświetla iż ta wartość jest za niska, jednak mimo to wykonuje instrukcje else?

case 1:

		std::cout << "Wprowadz czestotliwosc dzwieku w granicach 300 - 10 000";

		std::cout << "Dźwięki poniżej lub powyżej granicy częstotliwości są trudne do usłyszenia.";

		while(true)

			{

			int Czestotliwosc;

			std::cin >> Czestotliwosc;

			if (Czestotliwosc < 300)

				{

				std::cout << "Za mala czestotliwosc!" << Czestotliwosc << "< 300" << std::endl;

				}

			if (Czestotliwosc > 10000)

				{

				std::cout << "Za duza czestotliwosc!" << Czestotliwosc << "> 10 000" << std::endl;

				}

			else

				{

				Beep(Czestotliwosc,1000);

				}

			}

		break;

(ryba1986) #2

Prześledź działanie algorytmu. Dla wartości 200 warunek w pierwszym If jest spełniony. Nastepnie sprawdzany jest warunek drugiego IF. 200 < 10000 dlatego wykonuje sie ELSE drugiego IF. Jeżeli nie chcesz aby drugi IF się wykonał, gdy pierwszy warunek jest spełniony przed drugim IF dodaj słowo ELSE czyli ELSE IF.

case 1:

      std::cout << "Wprowadz czestotliwosc dzwieku w granicach 300 - 10 000";

      std::cout << "Dźwięki poniżej lub powyżej granicy częstotliwości są trudne do usłyszenia.";

      while(true)

         {

         int Czestotliwosc;

         std::cin >> Czestotliwosc;

         if (Czestotliwosc < 300)

            {

            std::cout << "Za mala czestotliwosc!" << Czestotliwosc << "< 300" << std::endl;

            }

         else if (Czestotliwosc > 10000)

            {

            std::cout << "Za duza czestotliwosc!" << Czestotliwosc << "> 10 000" << std::endl;

            }

         else

            {

            Beep(Czestotliwosc,1000);

            }

         }

      break;

(pawelek5) #3

Teraz działa tak jak chciałem :slight_smile: Dzięki :slight_smile:

Jeszcze jedno pytanie: czy za niska lub za wysoka częstotliwość beep-a może doprowadzić do uszkodzenia głośnika?

Dodane 24.08.2013 (So) 17:39

… i drugie pytanie…

Wpisałem teraz wartość 10000000000000 i program oszalał… W kółko piszczy i ograniczenie się nie włączyło. Dlaczego?


(GL1zdA) #4

Przekręciłeś licznik. int w większości implementacji mieści liczby od −2,147,483,648 to 2,147,483,647, większe będą obcięte (sobie po pobraniu częstotliwości std::cout << Czestotliwosc << std::endl;) to zobaczysz, jak on zinterpretował to, co mu podałeś. Głośniczka raczej nie uszkodzisz, chyba że ze wściekłości go wyrwiesz.


(pawelek5) #5

OK. Na razie ukończyłem 1 opcję programu i mnie przystopowało przy robieniu drugiej… Coś te losowanie nie jest za ciekawe… Mała jest różnica pomiędzy kolejnymi losowaniami…

case 2: //losowe dźwięki

		{

		while(true) //nieskonczone powtarzanie

			{

			srand ((int) time(NULL));

			int nWylosowana = 300+rand()%1000; //przedział 300 - 1300

			std::cout << nWylosowana << std::endl; //sprawdzanie jaka liczba została wylosowana

			Beep(nWylosowana,1000); //dźwięk

			}

		}

		break;

Co zrobić, by jakieś “ciekawsze” wartości losowało? Co zmienić?


(kostek135) #6

Dzieje się tak, bo za często podajesz to samo ziarno. Albo wykonuj pętle rzadziej niż raz na sekundę, albo srand() wyciągnij przed pętle.


(pawelek5) #7

No to dalej 8)

case 3:

		{

		Beep(300,100);

		Beep(350,100);

		Beep(400,100);

		Beep(450,100);

		Beep(500,100);

		Beep(550,100);

		Beep(600,100);

		Beep(650,100);

		Beep(700,100);

		Beep(750,100);

		Beep(800,100);

		Beep(850,100);

		Beep(900,100);

		Beep(950,100);

		Beep(1000,100);

		Beep(950,100);

		Beep(900,100);

		Beep(850,100);

		Beep(800,100);

		Beep(750,100);

		Beep(700,100);

		Beep(650,100);

		Beep(600,100);

		Beep(550,100);

		Beep(500,100);

		Beep(450,100);

		Beep(400,100);

		Beep(350,100);

		Beep(300,100);

		}

		break;

Przy takiej szybkości beep-u przy końcu głośnik mi nie nadąża… Czy to ja mam jakiś gorszy czy to tak powinno być?

A jak powinno to czy można jakoś to naprawić czy muszę w wolniejszym tempie beep zrobić?