Problema nella stampa degli output

di il
9 risposte

Problema nella stampa degli output

Buonasera, ho scritto un programma in C per calcolare quali sono i divisori di un numero intero inserito in input da tastiera.
#include<stdio.h>

int main()
{
	int n, div, cont, resto;

	printf("Inserire il valore:\t");
	scanf("%d",&n);
	
	cont=1;
	resto=n%cont;
	
	if(n<=0)
			printf("Errore: il numero deve essere positivo.\n");
	else
			if(n==1)
				printf("Il divisore di 1 è se stesso.");
	
	for(cont=1; cont<=n; cont++)
	{
		resto=n%cont;
		
		if(n>1)
			{
				if(resto==0)
					div = cont;
			}
		printf("%d\t", div);
	}
}
Il programma funziona nel senso che dà in output dei risultati corretti, ma con due problemi. Il primo avviene quando viene digitato il numero 1: il messaggio che viene stampato è "Il divisore di 1 è se stesso." con l'aggiunta di una linea di numeri che suppongo sia un indirizzo di memoria, e non capisco come fare per fare in modo che i numeri aggiuntivi non compaiano.
Il secondo problema invece si ha quando viene digitato un numero qualsiasi: i risultati di output sono corretti ma alcuni vengono ripetuti in modo da avere in totale tanti input quanto è il valore del numero che è stato digitato. Esempio:



Mi rendo conto che il problema sta nel fatto che il comando printf si trova all'interno del ciclo e quindi il contatore ripete i risultati fino ad n volte, ma non riesco a capire come modificare il programma senza che smetta di funzionare correttamente.

9 Risposte

  • Re: Problema nella stampa degli output

    Primo problema: se =1 non termini il programma, o "skippi" la seconda parte
  • Re: Problema nella stampa degli output

    
    int main(void)
    {
          unsigned int n;
          printf("Input a number: ");
          scanf(" %u",&n);
          size_t i;
          for(i =1; i <= sqrt(n);++i)
          {
              if(n % i == 0)
              {
                  printf("%zu\n",i);
               }
          }
          printf("%zu\n",n);
          return EXIT_SUCCESS;
    }
    
  • Re: Problema nella stampa degli output

    +m+ ha scritto:


    primo problema: se =1 non termini il programma, o "skippi" la seconda parte
    Non credo di aver capito quello che intendi dire

    loopunrolling ha scritto:


    
    int main(void)
    {
          unsigned int n;
          printf("Input a number: ");
          scanf(" %u",&n);
          size_t i;
          for(i =1; i <= sqrt(n);++i)
          {
              if(n % i == 0)
              {
                  printf("%zu\n",i);
               }
          }
          printf("%zu\n",n);
          return EXIT_SUCCESS;
    }
    
    cosa sarebbe %zu? inoltre questo codice mi dà un sacco di errori


    non c'è un modo per modificare il mio codice invece di usarne un altro? ><
  • Re: Problema nella stampa degli output

    La risposta al primo problema è semplice, tu non impedisci in alcun modo di andare avanti al tuo programma una volta che ti mostra il messaggio quindi parte comunque il ciclo for con numeri sballati sicuramente.
    La risposta al secondo problema invece è che il tuo ciclo for arriva sino ad N quindi fino al numero che tu hai digitato, che è sbagliato quando dovresti portare un contatore che ti dica quanti divisori sono stati trovati e poi far arrivare fino a questo numero il ciclo for.

    Hai ragione, quando si chiede aiuto bisogna essere aiutati sempre sul proprio codice
  • Re: Problema nella stampa degli output

    Il fatto che ottieni errori è dovuto al fatto che non hai incluso gli header necessari, pensavo che avresti sistemato tu. %zu è il parametro di formato per stampare il risultato di funzioni come sizeof e strlen le quali ritornano size_t. Se hai un compilatore che supporta lo standard C99 non dovresti aver problemi. In ogni caso puoi usare %lu (unsigned long)
  • Re: Problema nella stampa degli output

    Ok, ho risolto il primo problema ma non riesco ancora a capire come creare e integrare il contatore nel codice per contare quanti divisori ha un numero
  • Re: Problema nella stampa degli output

    Aggiungo dei commenti nelle righe che non servono o sono sbagliate e aggiungo una else ... vedi come diventa il tuo codice
    
       printf("Inserire il valore:\t");
       scanf("%d",&n);
       
       /*cont=1;
       resto=n%cont;*/
       
       if(n<=0)
             printf("Errore: il numero deve essere positivo.\n");
       else
             if(n==1)
                printf("Il divisore di 1 è se stesso.");
       		 else
    		   for(cont=1; cont<=n; cont++)
    		   {
    		      resto=n%cont;
    		      
    		      /*if(n>1)
    		         {*/
    		            if(resto==0)
    		               /*div = cont;
    		         }
    			  printf("%d\t", div);*/
    		      printf("%d\t", cont);
    		   }
    		   
  • Re: Problema nella stampa degli output

    Ok, ora funziona... in effetti mi stavo complicando la vita per nulla >< grazie mille per l'aiuto
  • Re: Problema nella stampa degli output

    C'è troppo codice superfluo. Se ho capito bene devi contare e stampare i divisori di un numero n. Se è così aggiungi un contatore a quel che ho scritto e hai fatto.
Devi accedere o registrarti per scrivere nel forum
9 risposte