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(¤tTime);
cout<<asctime(localtime(¤tTime))<<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.