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

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;

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;

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?

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.

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ć?

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.

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ć?