Funzione multipli

di il
8 risposte

Funzione multipli

Salve a tutti, non riesco a completare il seguente esercizio, potreste darmi una mano?

"Si realizzi un programma nel linguaggio C che, dati due interi N e M da standard input, facendo uso di una funzione di nome multipli, calcoli l’insieme degli interi appartenenti all’intervallo [1, N] che sono multipli di M. La chiamata a funzione dovrà stampare tutti gli elementi dell’insieme ordinati in ordine crescente."

La mia idea è questa ma, oltre a non sapere se c'è un modo più furbo per scriverlo, alla fine il programma mi stampa anche l'indice (che io non voglio) come mai?
#include <stdio.h>
int multipli(int N, int M)
{	
	int y=0, i=0, x=M;
	
	while(N>=M)
		{
			N=N-M;
			y++;
		}
		for(i=0; i<y; i++)
		{
			printf("%d\n", x);
			x=x+M;
		}
}

int main()
{
	int a, b;
	int mult;
	
	scanf("%d%d", &a, &b);
	mult=multipli(a,b);
	printf("%d", mult);
	
	return 0;
}

8 Risposte

  • Re: Funzione multipli

    Prova a riscriverlo in maniera più semplice. Fai un ciclo solo per i che va da M a N e controlla quanto vale (i % M), che se i è multiplo di M deve valere...
  • Re: Funzione multipli

    Weierstrass ha scritto:


    Prova a riscriverlo in maniera più semplice. Fai un ciclo solo per i che va da M a N e controlla quanto vale (i % M), che se i è multiplo di M deve valere...
    grazie mille! così ho risolto, ma continuo a non capire perché alla fine mi stampasse anche il valore del ciclo.. se per esempio mettevo 3, 10 lui stampava
    3
    6
    9
    3 (valore di i)
  • Re: Funzione multipli

    Weierstrass ha scritto:


    Prova a riscriverlo in maniera più semplice. Fai un ciclo solo per i che va da M a N e controlla quanto vale (i % M), che se i è multiplo di M deve valere...
    no, comunque continua a non andare.. mi stampa sempre quel N alla fine della serie anche se non è multiplo di M.. l'ho riscritto così il codice, dove ho sbagliato?
    #include <stdio.h>
    int multipli(int N, int M)
    {	
    	int i;
    	
    		for(i=M; i<N; i++)
    		{
    			if(i%M==0)
    			{
    				printf("%d\n", i);
    			}
    		}
    }
    
    
    int main()
    {
    	int a, b, mult;
    	
    	scanf("%d%d", &a, &b);
    	mult=(multipli(a,b));
    	printf("%d", mult);
    	
    	return 0;
    }
  • Re: Funzione multipli

    
    int multipli(int N, int M)
    
    Così la funzione ha un return value int. Però non hai nessun return value nel codice
    
    	mult=(multipli(a,b));
    	printf("%d", mult);
    
    Cosa stampa questo pezzo di codice?
  • Re: Funzione multipli

    Weierstrass ha scritto:


    
    int multipli(int N, int M)
    
    Così la funzione ha un return value int. Però non hai nessun return value nel codice
    mi sa che non ho capito bene l'utilizzo di return, cioè in che modo lo devo usare..

    Weierstrass ha scritto:


    
    	mult=(multipli(a,b));
    	printf("%d", mult);
    
    Cosa stampa questo pezzo di codice?
    non è il richiamo alla funzione? scusami ma le abbiamo fatte solo stamattina le funzioni e non ho capito bene in che modo integrarle nel codice
  • Re: Funzione multipli

    
    void multipli(int N, int M)
    
    
    multipli(a,b);
    // no printf finale
    
    Senza il return value hai un comportamento indefinito. Il tuo compilatore ti stampa i che è la prima variabile che hai dichiarato nella funzione (quindi la prima allocata nello stack). Su altri PC potresti avere zero o altro
  • Re: Funzione multipli

    Weierstrass ha scritto:


    
    void multipli(int N, int M)
    
    
    multipli(a,b);
    // no printf finale
    
    Senza il return value hai un comportamento indefinito. Il tuo compilatore ti stampa i che è la prima variabile che hai dichiarato nella funzione (quindi la prima allocata nello stack). Su altri PC potresti avere zero o altro
    ok credo di aver capito.. il printf alla fine non serve perché è già presente nella funzione ed era proprio quello che mi stampava i (ovvero la prima variabile int che trovava). E la funzione andava void e non int perché non ho messo il return? ma se avessi voluto mantenere int?
  • Re: Funzione multipli

    Il return si può mettere anche nella funzione void, serve per uscire dalla funzione. Se non lo metti, esce dopo l'ultima istruzione.
    nel caso non sia void, deve restituire qualcosa, quindi se per esempio la funzione è int, scrivi:
    return qualcosa;
    Dove quel qualcosa è una variabile o un numero intero. Se non metti return in questo caso o ti da errore di compilazione, oppure, se compila, il valore ritornato risulterà indefinito.
Devi accedere o registrarti per scrivere nel forum
8 risposte