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();
}