Program Budzik - gdzie umieścić "cin>>", żeby pętla się nie zatrzymała?

0

Witam! Jestem początkujący i uczę się programować w C++. Ostatnio, w ramach ćwiczenia, postanowiłem napisać program "Budzik". Dźwięk budzika ma się w nim wyłączać w momencie, gdy użytkownik wpisze poprawny wynik wylosowanego działania matematycznego. Zegar w moim programie działa jak należy, można (a właściwie trzeba) go nawet nastawić. Budzik włącza się we właściwym czasie i jeśli instrukcja odtworzenia się pliku "Budzik.wav" znajduje się w nieskończonej pętli "for(;;)", budzik dzwoni tak długo, jak długo użytkownik nie wyłączy programu, poprzez zamknięcie okna konsoli. W poniższej wersji mojego programu losuje się też zadanie matematyczne. Niestety, jeśli w nieskończonej pętli "for(;;)" wpiszę instrukcję "cin>>odp" zaraz po instrukcji "PlaySound(TEXT("Budzik.wav"),NULL,SND_SYNC);", nagranie "budzik" odtworzy się tylko raz, ponieważ pętla przed kolejnym powtórzeniem się zaczeka na wpisanie przez użytkownika odpowiedzi "odp". Jeśli odpowiedź "odp" będzie błędna (inna niż wynik, zapisany w zmiennej "wynik"), pętla się oczywiście powtórzy i budzik zadzwoni znów tylko raz, a jeśli odpowiedź będzie poprawna, program się zakończy. Gdzieś muszę to "cin>>odp" wkleić, a nie mogę tego zrobić poza pętlą: ani nad, ani pod. Jeśli wkleje nad pętlą, użytkownik będzie musiał wpisać odpowiedź na działanie jeszcze zanim budzik zadzwoni, co z oczywistych przyczyn mija się z celem. Jeśli wkleję pod pętlą, pętla się nigdy nie przerwie i użytkownik będzie sobie mógł jak długo zechce wpisywać odpowiedź, której program nie odczyta. Wiem (albo wydaje mi się, że słyszałem, bądź czytałem), że pętla zamyka się też, gdy z klawiatury wpisany zostanie jakiś skrót i pewną nadzieję pokłądam właśnie w tym fakcie. Choć z mojej strony to jedynie taki mglisty pomysł, że jak dołączę jakiegoś if-a w stylu "jeżeli odp==liczba, kodująca skrót klawiszowy, przecinający pętlę" to się coś niby rozjaśni. Kompilator czyta wszystko po kolei i tu jest pies pogrzebany... Rozumiem, że dla doświadczonych programistów tego rodzaju problem to nie jakiś tam twardy orzech do zgryzienia, ale chleb powszedni, dlatego zwracam się do takich właśnie użytkowników tego forum z prośbą o pomoc. Może nie koniecznie o pomoc w postaci gotowca, ponieważ, jak już wspomniałem, pisanie programu "Budzik" to dla mnie takie ćwiczenie i właściwie ciekawa zagwozdka, ale o jakąś wskazówkę, za którą z góry dziękuję. Oto obecna wersja mojego programu:

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <time.h> //pobieranie czasu
#include <cstdlib> //funkcja rand();

using namespace std;

int main()
{
    int g_zeg,m_zeg,s_zeg;
    int g_budz,m_budz,s_budz;
    int godzina,minuta,sekunda;

    int liczba_pierwsza,liczba_druga;
    int zabieg;
    int wynik,odp;

    //...................................................
    //NASTAWIANIE ZEGARA:

    cout<<"Ustaw zegar na godzine: ";
    cin>>g_zeg;
    if(g_zeg<0||g_zeg>24)g_zeg=0;

    cout<<"Ustaw zegar na minute: ";
    cin>>m_zeg;
    if(m_zeg<0||m_zeg>60)m_zeg=0;

    cout<<"Ustaw zegar na sekunde: ";
    cin>>s_zeg;
    if(s_zeg<0||s_zeg>60)s_zeg=0;
    //..................................................
    //NASTAWIANIE BUDZIKA:

    cout<<endl<<"Ustaw budzik na godzine: ";
    cin>>g_budz;
    if(g_budz<0||g_budz>24)g_budz=12;

    cout<<"Ustaw budzik na minute: ";
    cin>>m_budz;
    if(m_budz<0||m_budz>60)m_budz=30;

    cout<<"Ustaw budzik na sekunde: ";
    cin>>s_budz;
    if(m_budz<0||m_budz>60)m_budz=30;


//.........................................................................

    while(s_zeg>-1)   
    {

        Sleep(1000);
        system("cls");

        s_zeg=(s_zeg+1)%60;

        if(s_zeg==(s_zeg*60))m_zeg++;
        if((m_zeg%60)==(s_zeg*60))g_zeg++;

        godzina=g_zeg%25;
        minuta=m_zeg%60;
        sekunda=s_zeg;

        cout<<godzina<<" : "<<minuta<<" : "<<sekunda<<endl;

        if((godzina==g_budz)&&(minuta==m_budz)&&(sekunda==s_budz)) break;
    }

       cout<<"Nastala godzina wstawania"<<endl;

//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

        srand(time(NULL));
        liczba_pierwsza=rand()%10;

        liczba_druga=rand()%10;

        zabieg=rand()%2;

        if(zabieg==0)
        {wynik=liczba_pierwsza+liczba_druga;
            cout<<liczba_pierwsza<<"+"<<liczba_druga<<"=";
           }

        else if(zabieg==1)
        {wynik=liczba_pierwsza*liczba_druga;
            cout<<liczba_pierwsza<<"*"<<liczba_druga<<"=";
           }

//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
for(;;)
  
    {
        PlaySound(TEXT("Budzik.wav"),NULL,SND_SYNC);

            cin>>odp;
            if(odp==wynik)break;
    }
    
    getch();
}

0

Nie znam windows, ale na szybko zerknąłem do dokumentacji PlaySound - czy sprawy nie załatwi użycie opcji SND_ASYNC i SND_LOOP ?

0

Dziękuję! Poczytam i zobaczę co da się zrobić

0

Jeszcze raz dziękuję! Program działa jak należy.

Choć i tak musiałem tę pętlę muzyczną wrzucić jeszcze w klasyczną "while", bo nie bardzo wiedziałem, jak inaczej sprawić, by pętla się jednak NIE przerwała, gdyby użytkownik wpisał niepoprawny wynik działania matematycznego...

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <time.h> //pobieranie czasu
#include <cstdlib> //funkcja rand();

using namespace std;

int main()
{
    int g_zeg,m_zeg,s_zeg;      //ZMIENNE ZEGARA
    int g_budz,m_budz,s_budz;   //ZMIENNE BUDZIKA
    int godzina,minuta,sekunda; //ZMIENNE WYSWIETLANEGO CZASU

    int liczba_pierwsza,liczba_druga;   //WYLOSOWANE LICZBY DZIALANIA
    int dzialanie;                      //MNOZENIE LUB DODAWANIE
    int wynik,odp;                      //POPRAWNY WYNIK I WPISANA ODPOWIEDZ

//.................................................................................................................................................................................................................................................................
//NASTAWIANIE ZEGARA:

    cout<<"Ustaw zegar na godzine: ";
    cin>>g_zeg;
    if(g_zeg<0||g_zeg>24)g_zeg=0;

    cout<<"Ustaw zegar na minute: ";
    cin>>m_zeg;
    if(m_zeg<0||m_zeg>60)m_zeg=0;

    cout<<"Ustaw zegar na sekunde: ";
    cin>>s_zeg;
    if(s_zeg<0||s_zeg>60)s_zeg=0;
//.................................................................................................................................................................................................................................................................
//NASTAWIANIE BUDZIKA:

    cout<<endl<<"Ustaw budzik na godzine: ";
    cin>>g_budz;
    if(g_budz<0||g_budz>24)g_budz=12;

    cout<<"Ustaw budzik na minute: ";
    cin>>m_budz;
    if(m_budz<0||m_budz>60)m_budz=30;

    cout<<"Ustaw budzik na sekunde: ";
    cin>>s_budz;
    if(m_budz<0||m_budz>60)m_budz=30;


//.................................................................................................................................................................................................................................................................
//PROGRAM "ZEGAR":
    while(s_zeg>-1)
    {

        Sleep(1000);
        system("cls");

        s_zeg=(s_zeg+1)%60;

        if(s_zeg==(s_zeg*60))m_zeg++;
        if((m_zeg%60)==(s_zeg*60))g_zeg++;

        godzina=g_zeg%25;
        minuta=m_zeg%60;
        sekunda=s_zeg;

        cout<<godzina<<" : "<<minuta<<" : "<<sekunda<<endl;  // WYSWIETLANY CZAS
//.................................................................................................................................................................................................................................................................
//INSTRUKCJA URUCHOMIENIA BUDZIKA POPRZEZ PRZERWANIE PETLI "WHILE":

        if((godzina==g_budz)&&(minuta==m_budz)&&(sekunda==s_budz)) break;
    }
//.................................................................................................................................................................................................................................................................
       cout<<endl<<"Nastala godzina wstawania!"<<endl;
       cout<<"Zeby wylaczyc budzik, wpisz poprawny wynik dzialania:"<<endl;
       cout<<endl;

//'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
//LOSOWANIE ZADANIA MATEMATYCZNEGO:
        srand(time(NULL));
        liczba_pierwsza=rand()%10;

        liczba_druga=rand()%10;

        dzialanie=rand()%2;

        if(dzialanie==0)
        {wynik=liczba_pierwsza+liczba_druga;
            cout<<liczba_pierwsza<<"+"<<liczba_druga<<"=";
           }

        else if(dzialanie==1)
        {wynik=liczba_pierwsza*liczba_druga;
            cout<<liczba_pierwsza<<"x"<<liczba_druga<<"=";
           }

//'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
//DZWONEK BUDZIKA:

  while(odp!=wynik)
  {

        PlaySound(TEXT("Budzik.wav"), NULL, SND_LOOP | SND_ASYNC);

            cin>>odp;
            if(odp==wynik) PlaySound(NULL, NULL, 0); // GDY WYNIK DZIALANIA POPRAWNY
            else odp!=wynik;                         // GDY WYNIK DZIALANIA NIEPOPRAWNY

  }


    getch();
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1