PROBLEMA Timer 108 minuti C++

loreT13

Nuovo Utente
3
0
Salve a tutti sono nuovo qui sul forum :) . Vi spiego che cosa deve fare il mio algoritmo su C++. Praticamente ogni 108 minuti io devo digitare un codice (4,8,15,16,23,42) che se è corretto riporta il timer a 108 altrimenti fa crashare il sistema (dividendo per zero). Il timer deve iniziare a suonare 4 minuti prima della scadenza dei 108 minuti. Io posso inserire il codice solo negli ultimi 4 minuti, nn prima. Se faccio scadere i 108 minuti senza digitare nulla il sistema deve crashare. questo è quello che ho scritto per ora (sono veramente alle prima armi con l'informatica quindi perdonate le mie incompetenze)

#include <iostream>
#include <ctime>
using namespace std;
int main() {
while (1==1) {
int numbers[6];
cout<<">:";
for(int i=0;i<6;i++){
cin>>numbers;

}
if(numbers[0]!=4||numbers[1]!=8||numbers[2]!=15||numbers[3]!=16||numbers[4]!=23||numbers[5]!=42){cout<<"System failure!";
cout<<13/0;
}
else{cout<<"Accepted"<<endl;
time_t currentTime;
time(&currentTime);
cout<<asctime(localtime(&currentTime))<<endl;
}}

return 0;
}

Questo sistema però non ha il timer dei 108 minuti, ne tantomeno il suono agli ultimi 4 minuti. Non so veramente come inserirlo. Avete qualche consiglio? (considerate che nn so usare c++ quasi per nulla). Grazie
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
Salve a tutti sono nuovo qui sul forum :) . Vi spiego che cosa deve fare il mio algoritmo su C++. Praticamente ogni 108 minuti io devo digitare un codice (4,8,15,16,23,42) che se è corretto riporta il timer a 108 altrimenti fa crashare il sistema (dividendo per zero). Il timer deve iniziare a suonare 4 minuti prima della scadenza dei 108 minuti. Io posso inserire il codice solo negli ultimi 4 minuti, nn prima. Se faccio scadere i 108 minuti senza digitare nulla il sistema deve crashare. questo è quello che ho scritto per ora (sono veramente alle prima armi con l'informatica quindi perdonate le mie incompetenze)

#include <iostream>
#include <ctime>
using namespace std;
int main() {
while (1==1) {
int numbers[6];
cout<<">:";
for(int i=0;i<6;i++){
cin>>numbers;

}
if(numbers[0]!=4||numbers[1]!=8||numbers[2]!=15||numbers[3]!=16||numbers[4]!=23||numbers[5]!=42){cout<<"System failure!";
cout<<13/0;
}
else{cout<<"Accepted"<<endl;
time_t currentTime;
time(&currentTime);
cout<<asctime(localtime(&currentTime))<<endl;
}}

return 0;
}

Questo sistema però non ha il timer dei 108 minuti, ne tantomeno il suono agli ultimi 4 minuti. Non so veramente come inserirlo. Avete qualche consiglio? (considerate che nn so usare c++ quasi per nulla). Grazie

Su che Sistema operativo programmi?.

Comunque passando al codice, ci sono dei piccoli accorgimenti da fare, tralasciamo l'esercizio e focalizziamoci sulla sintassi:

1) Alla riga 9: "cin << numbers" cerchi di assegnargli il valore come se fosse una variabile mentre alla riga 6: "int numbers[6]" Hai dichiarato numbers come un vettore di 6 elementi dunque il passaggio dei valori tramite input andrebbe fatto tramite un for in questa maniera.

Codice:
int numbers[6] = {4,8,15,16,23,42}; // Dichiaro array di 6 elementi e gli assegno i valori rispettivi

/**
Creo un for che scorre tutto l'array e mi trovo la grandezza tramite un sizeof
e divido il numero totale dei byte dell'array cioè 24, diviso il valore numbers[0]
 dell'array tramite *numbers, puntatore che punta sempre ad numbers[0], cioè
 il primo elemento. Il tutto si riassume in 24 / 4 = 6, lunghezza dell'array.
Essendo che parte da 0 la conta dell'array lascio < 6 invece di <= 6.
 E visto che sei novizio mi impunto anche nel dirti che i 4byte sono la
 grandezza di un intero, cioè 32bit visto che un 1byte vale 8 bit: 8 x 4 = 32;
**/

for(int i = 0, i < sizeof(numbers) / sizeof(*numbers); i++){
cin >> numbers[i];
}

2: Un altro errore, non di sintassi ma di logica è il while(1 == 1) abbreviato in while(true) visto che una volta che il programma viene compilato non vi è nessuna differenza (tipo tab e space), usa il true invece di "1 == 1". Ritornando al nostro while che per comodità chiamerò true, l'errore logico è che il while sarà infinito e non raggiungerà mai il return 0; in poche parole il programma non finirà mail il suo ciclo, oltre a ciò usare un while(true) è una pratica assolutamente da evitare, dunque va cancellato a prescindere.

3: Tutto quell'ambaradam di if non ha senso visto che quando effettuerai il controllo ormai i dati saranno stati già assegnati all'array e tu hai scritto di voler far crashare il programma (edit: crashare andrebbe trasformato in terminare, non vedo il motivo logico per cui farlo crashare), dunque se l'operazione di controllo va fatta ogni 108min non capisco il perchè eseguire il controllo alla fine invece che sul momento. Per altro non capisco il perchè riassegnare i dati all'array numbers, se li riassegni poi con cosa farai il paragone?

4: La funzione localtime e current time servirà ben poco visto che il tempo andrà calcolato sulla cpu e non fuori dalla cpu. Il tempo continuerà a scorrere lo stesso anche se la futura funzione di check ancora non è iniziata, va usato un tempo relativo alla cpu e non a quello umano. Un esempio può essere questa semplice funzione che fa attendere l'utente il tot di numero di secondi che noi scegliamo, il tempo inizierà a passare solo dopo che la funzione verrà avviata, cioè potrebbe essere utile per far avviare il timer dei 104min ed una volta che sarà finito saranno avviati i 4 minuti di tempo per l'input tramite un'altra procedura.

Codice:
void dormiPer(const int  & numeroSecondi){
    timespec delay = {numeroSecondi, 0};
    timespec delayrem;

    nanosleep(&delay, &delayrem);
}

Infine ti consiglio di scrivere dello pseudocodice e non direttamente del codice, fatto ciò il topic potrà continuare da parte mia.
 
Ultima modifica:

stenf28

Utente Attivo
208
28
#include <iostream>

#include <windows.h>//nel caso in cui stai usando Windows

/*Non ho utilizzato using namespace std perchè è sconsigliato usarlo globalmente, soprattuto se c'è windows.h*/

int main()
{
int numbers[6];
while(true)
{
Sleep(6240000); //Il tuo programma "dorme" per 104 minuti, 6240000 sono 104 minuti in microsecondi
//Scaduti questi 104 minuti emette un Beep
Beep(x,y); // X è la frequenza, Y è la durata del beep(Evita di esagerare)

//Ora inserisci i numeri
std::cout<<"Inserisci i 6 numeri"<<std::endl;
for(int i=0;i<6;i++)
{
std::cin>>numbers; //Devi mettere numbers [], con la i in mezzo alle parentesi quadre
}

//Controlli se non sono giusti
if(numbers[0]!=4||numbers[1]!=8||numbers[2]!=15||numbers[3]!=16||numbers[4]!=23||numbers[5]!=42)
{
std::cout<<"System failure!";
exit(0);/*in questo modo chiude il programma, ma non lo fa crashare, se vuoi puoi comunque farlo crashare fai come hai fatto te dividendo per 0*/
}
else
{
continue; //Se i numeri sono tutti uguali allora continua con il while, e il programma ritorna all'inizio del ciclo while ripetendo tutto il ciclo while.
}


}
return 0;
}

Fammi sapere se hai dei problemi.
 
Ultima modifica:

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
#include <iostream>

#include <windows.h>//nel caso in cui stai usando Windows

/*Non ho utilizzato using namespace std perchè è sconsigliato usarlo globalmente, soprattuto se c'è windows.h*/

int main()
{
int numbers[6];
while(true)
{
Sleep(6240000); //Il tuo programma "dorme" per 104 minuti, 6240000 sono 104 minuti in microsecondi
//Scaduti questi 104 minuti emette un Beep
Beep(x,y); // X è la frequenza, Y è la durata del beep(Evita di esagerare)

//Ora inserisci i numeri
std::cout<<"Inserisci i 6 numeri"<<std::endl;
for(int i=0;i<6;i++)
{
std::cin>>numbers; //Devi mettere numbers [], con la i in mezzo alle parentesi quadre
}

//Controlli se non sono giusti
if(numbers[0]!=4||numbers[1]!=8||numbers[2]!=15||numbers[3]!=16||numbers[4]!=23||numbers[5]!=42)
{
std::cout<<"System failure!";
exit(0);/*in questo modo chiude il programma, ma non lo fa crashare, se vuoi puoi comunque farlo crashare fai come hai fatto te dividendo per 0*/
}
else
{
continue; //Se i numeri sono tutti uguali allora continua con il while, e il programma ritorna all'inizio del ciclo while ripetendo tutto il ciclo while.
}


}
return 0;
}

Fammi sapere se hai dei problemi.

Il programma oltre ad essere errato logicamente è errato sintatticamente in varie zone. Il problema è che non rispetta l'algoritmo da lui imposto, cioè di inserire ogni cifra ogni 108 min e non tutte le cifre dopo i 108 minuti. Non vorrei arrivare a fare l'esercizio direttamente per lui, ma un consiglio per una spinta futura a chi legge va dato.

Il programma dovrebbe funzionare in questa maniera, passati i 104 minuti inizia un timer di 4 minuti sull'input. La domanda da porsi è come faccio a far scattar un timer se "CIN" aspetta l'input? La maniera più semplice per farlo è creare un thread apposito, un piccolo esempio di come potrebbe essere fatto è:

Codice:
#include <iostream>
#include <pthread.h>



void * Give_me_input(void * arg){

    int codice;

    std::cout << "Dammi codice !" << std::endl;
    std::cin >> codice;

}

int main(){

    pthread_t pid;
    pthread_create(&pid, NULL, &Give_me_input, NULL);

    Sleep(4000);

    std::cout << "Programma terminato." << std::endl;

    return 0;
}

Il programma in se non è complesso, vengono creati 2 thread:
-Il main, thread madre ed Give_me_input il thread figlio per modo di dire, nel main avvio il thread figlio e metto il thread madre in attesa tramite il comando Sleep, il thread semplicemente aspetta 4 secondi prima di eseguire la prossima istruzione, ma nel mentre il thread figlio sta eseguende le sue istruzioni cioè la richiesta di input a prescindere dall'input o meno il thread madre chiuderà il tutto con il return 0, dunque va fatto una condizione di paragone per verificare se l'input è stato immesso ed è corretto, ho preferito fare una cosa piccola per evitare di svolgere il programma direttamente per lui e dargli un consiglio su come potrebbe essere affrontata la question del timer ed input.

P.s.: Tutto ciò potrebbe essere fatto anche tramite un interrupt ma ho preferito questa maniera visto che non so su quale sistema operativo programma.
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
Ciao, innanzitutto grazie mille a tutti per le risposte. Credo di aver capito cosa devo fare. Un'ultima cosa: il beep dovrebbe continuare a suonare finche nn inserisco il codice o finché il timer nn arriva a zero. Ma nn ho idea di come fare.

Inviato da Redmi 4 tramite App ufficiale di Tom\\\'s Hardware Italia Forum


Puoi usare la funzione

Codice:
BOOL WINAPI Beep(
  _In_ DWORD dwFreq,
  _In_ DWORD dwDuration
); 

// Esempio:

Beep( 750, 300 );

Dove 750 rappresenta la frequenza e 300 la durata.
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
Si ma nn so farla iterare finché nn inserisco il codice.

Inviato da Redmi 4 tramite App ufficiale di Tom\\\'s Hardware Italia Forum

Non devi iterarlo, semplicemente come ti ho detto prima crei un thread che si occupa dell'audio. Un possibile esempio, scritto cosi su 2 piedi è:

Codice:
#include <iostream>
#include <pthread.h>



void * Give_me_input(void * arg){

    int codice;

    std::cout << "Dammi codice !" << std::endl;
    std::cin >> codice;

}

void * Give_me_audio(void * arg){
    Beep(350,4000);
}

int main(){
    pthread_t input, audio;

    pthread_create(&input, NULL, &Give_me_input, NULL);
    pthread_create(&audio, NULL, &Give_me_audio, NULL);
  
    Sleep(4000);

    std::cout << "Programma terminato." << std::endl;

    return 0;
}


Devono essere aggiunte le verifiche all'input.
 
Ultima modifica:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili