[C](risolto)Ciclo while ripete una volta di troppo

di Anonimizzato11447 il
5 risposte
Ciao a tutti so ovviamente un novello della programmazione. Ho cominciato a studiare il mio primo linguaggio (C) l'altro ieri e oggi sto cercando di fare un po di pratica. Non riesco a capacitarmi di questo fatto: il ciclo while ripete una volta di troppo, insomma si comporta come il do while (sostituendo un con l'altro infatti non fa differenza).
L'algoritmo calcola una lista dei quadrati perfetti fino ad un valore limite immesso da tastiera. Per complicarmi la vita ho usato una funzione, giusto per fare pratica, per calcolare i quadrati perfetti. Immagino sia stato abbastanza inutile ma era tanto per fare pratica.

Visto che è breve vi poso tutto il codice così è più chiaro
#include <stdio.h>

// Prototipo
int square(int i);

int main (int argc, const char * argv[]) {
	
	int x = 1, i = 1, n;
	
	
	printf("Questo algoritmo stilerà una lista dei quadrati perfetti.\nImmetti un valore limite ");
	scanf("%d", &n);
	if (n<0)
		printf("Inserisci un numero intero POSITIVO!");
	else {
		while (x<=n) {
			x = square(i);

			printf("%3d = %3d  * %3d\n", x, i, i);
			i++;
		} 
			}
return 0;

  
}

// Implemento
int square(int i) {
	return i*i;
}
Se ad esempio imposto come valore limite il 10 lui mi da:
1 = 1 * 1
4 = 2 * 2
9 = 3 * 3
16 = 4 * 4

5 Risposte

  • Controllare il valore di x con un if prima di eseguire il printf.
  • Ho capito del perchè ciò accadeva. Essendo che "x" veniva determinato sulla base di "i" ALL'INTERNO del corpo while, ora che veniva aggiornata ormai il ciclo era partito per un ultima volta, una volta di troppo.
    Grazie mille, con un semplice if ho risolto, ma possibile che non ci sia un modo più diretto per controllare il ciclo, insomma per ottimizzare meglio il codice?
  • ma possibile che non ci sia un modo più diretto per controllare il ciclo, insomma per ottimizzare meglio il codice?
    Certo che si
    
              
              while ((x = square(i))<=n) {
                 printf("%3d = %3d  * %3d\n", x, i, i);
                 i++;
              }  
    
    
  • Grazie non so perchè non ci avevo pensato.
  • Ma di niente, figurati!
Devi accedere o registrarti per scrivere nel forum
5 risposte