PDA

Visualizza la versione completa : [C++] Evitare loop infinito di esecuzione del programma in ciclo while()


Heisenberg
01-10-2012, 10:31
Salve a tutti, sempre io a rompere, ma sarà l'ultima volta, promesso.
Mi serviva una minuscola mano che mi spiegasse "in modo informatico" (ossia perchè accade quel che accade, od ancora in parole povere: perchè è stato scritto così), questa parte di codice:


{
res = primo();
if (res) return res;
cout << "\nPremi c per continuare o qualunque altro tasto per terminare. ";
cin >> again;
}

facente parte dell'intero codice qui riportato:



#include <iostream>
#include <stdlib.h>
using namespace std;

int primo()
{
long long p;
int divisori = 0;
cout << "Digita un numero intero positivo: \n\n", cin >> p;
if (p < 0)
cout << "\nNon fare il furbetto, voglio un numero positivo!\n\n";
else if (p < 2)
cout << "\nQuesto non e' un numero primo.\n\n";
else if (p==2 || p==3)
cout<<"\nQuesto è uno dei più piccoli numeri primi!\n\n";
else {
for (int q = 2; q <= p/2; q++)
if (p%q == 0) {
cout <<'\n' << p << " = " << q << " * " << p / q << endl;
divisori++;
}
if (divisori > 0)
cout <<"\nQuesto dimostra che "<< p <<" non e un numero primo.\n\n";
else
cout <<"\n"<< p <<" e' un numero primo!\n\n";
}
return 0;
}

int main()
{
int res;
char again;
do
{
res = primo();
if (res) return res;
cout << "\nPremi c per continuare o qualunque altro tasto per terminare. ";
cin >> again;
}
while (again == 'c');
return 0;
}



Volevo inoltre sapere se a livello di scrittura va bene o fa schifio :) Grazie a tutti quanti per l'immensa disponibilità!!

c0der
01-10-2012, 11:14
Non hai specificato cosa intendi per << perchè è stato scritto così >> cosa?

Intendi questo?
if (res) return res;

Non ha senso infatti, lo avrebbe se la funzione primo() ritornasse vari valori, 0 o un valore
diverso da 0, che abitualmente identifica errore (0=ok, 1 o >0 = errore o i codici di errrore)

In qual caso la main uscirebbe con lo stesso codice di errore della funzione primo().
Ma visto che ritorna sempre 0.... puoi togliere e trasformare la funzione in "void".

Oppure aggiungi casi in cui primo() ritorna in caso di errore "1", allora la cosa ritorna ad avere
senso, ma mi sembra che ti stai imbarcando in problematiche di secondo piano per te al momento.

CyberCrasher
01-10-2012, 11:22
Quoto c0der e aggiungo che se la funzione int primo() venisse modificata, si otterrebbe il risultato corretto:



if (divisori > 0){
cout <<"\nQuesto dimostra che "<< p <<" non e un numero primo.\n\n";
return 0;
}else{
cout <<"\n"<< p <<" e' un numero primo!\n\n";
return 1;
}
}

Heisenberg
01-10-2012, 12:04
In realtà volevo sapere perché le righe che ho scritto all'inizio (ossia quelle che dichiaro "facenti parti del codice" inserito dopo) fossero state scritte in quel modo.

il punto è che in tal modo il programma non va in loop infinito, e posso premere un tasto per uscire o qualunque altro per continuare, e non mi dà alcun tipo di errore.

La parte a cui mi riferivo è comunque



int main()
{
int res;
char again;
do
{
res = primo();
if (res) return res;
cout << "\nPremi c per continuare o qualunque altro tasto per terminare. ";
cin >> again;
}
while (again == 'c');
return 0;
}

così la metto completa!
Il programma in questo modo fa quello che ho detto prima..

da notare che senza questa parte, il programma fa il suo lavoro e poi esce sempre. Era solo per capire perchè e come funzionasse..

oregon
01-10-2012, 12:06
Che vuol dire "non va in loop infinito" ... c'è un while controllato dall'input di tastiera ...

Heisenberg
01-10-2012, 12:08
Si appunto! Con tale while fa quello che deve fare ossia alla fine mi chiede se voglio continuare o meno. Mi cheidevo solo se così andasse bene o ci fossero errori di qualche genere!

Più che altro mi serviva l'analisi (= commento) di quella parte scritta separata.. per capire meglio

c0der
01-10-2012, 12:10
Continuo a non capire scusami.
Ma chi l'ha scritto questo do/while? non l'hai scritto tu?
Dai tuoi precedenti post avevo capito che lo scrivessi tu il codice che postavi.

P.S. Visto dopo che ho risposto altro tuo messaggio:
il concetto è semplice, devi fare un chiamata a funzione ripetitiva e ti metti quindi in un while
o do/while con dentro una richiesta di input per eventuale uscita dal loop.
Uscita che puoi fare come hai fatto benissimo oppure con un break.

Heisenberg
01-10-2012, 12:16
Io ho scritto il codice principale, poi siccome non riuscivo a capire come implementare la domanda "vuoi continuare" mi hanno aiutato, ma buttandomi li la parte secondaria.. senza dirmi spiegazioni di alcun genere! Per questo volevo un qualche tipo di descrizione od aiuto..

Il mio codice era buono, solo che usciva ogni volta che aveva finito di fare il lavoro dichiarato.. e non mi piaceva così..

oregon
01-10-2012, 12:57
Ovviamente non devi scrivere

if (res) return res;

ma semplicemente

printf("Risultato %d\n", res);

CyberCrasher
01-10-2012, 13:16
La parte a cui mi riferivo è comunque
...


Generalmente le situazioni sono 2: qualcuno non sa come scrivere un codice e chiede aiuto o qualcuno deve capire un codice corretto.
Nel tuo caso, hai postato un codice pieno di errori che non hai nemmeno scritto tu quindi bisognerebbe prima correggerlo e poi spiegarti cosa fa. Ma la correzione dipende dalla semantica che ti interessa.

Per evitare di prolungare questo post all'infinito, ti suggerisco di spiegarci cosa vuoi fare così possiamo aiutarti a formulare un codice adeguato.

Loading