Problemino.

di il
3 risposte

Problemino.

Ho iniziato da poco a usare Matlab, e in parte anche a programmare un po' "seriamente", inteso che smanetto di più.
Il punto è che ho provato a fare una funzione per calcolare la somma dei numeri pari da 0 a n, fino a quando la somma non è minore di 99.
Il codice è questo:
function n = Somma_pari99(n)
count = 0;
for i= 1:n
    while count <=99
        if mod(i,2)==0
            count = count + i;
        end
    end
end
Il programma non restituisce nessun valore. Cosa sbaglio?

3 Risposte

  • Re: Problemino.

    Quel while non è giusto, deve essere un if altrimenti non ti aumenterà mai il valore dell'i poichè rimarrà sempre in quel ciclo.
  • Re: Problemino.

    Eduadie ha scritto:


    Quel while non è giusto, deve essere un if altrimenti non ti aumenterà mai il valore dell'i poichè rimarrà sempre in quel ciclo.
    Grazie per la risposta. Quindi in sostanza lui si accorge che la somma è minore di 99, esegue l'if, la somma è ancora minore e riesegue l'if, e così via in loop, perché non passa dal for.
  • Re: Problemino.

    A parte l'errore individuato da Eduadie con la sua risposta, ci sono un paio di ulteriori errori nel tuo codice:

    [1] la funzione che hai dichiarato ritorna i valore "n"
    function n = Somma_pari99(n)
    il valore "n" corrisponde al valore di input, mentre mi sembra di capire che tu voglia o il valore della somma più vicino a 99 oppure il massimo numero pari dino al quale estendere la somma prima di superare la soglia "99"

    Dovresti quindi modificare la dichiarazione della funzione come segue:
    function [count, val] = Somma_pari99(n)
    così definita, la funzione ritorna due valori in output:

    - "count" la somma che già calcoli nel loop
    - "val" il massimo numero pari considerato (per settare questo devi modificare il codice, memorizzando l'ultimo valore di "i"

    [2] Per come hai definito la verifica di superamento della soglia (l'"if" con il quale devi sostituire il "while") in realtà "count" assumerà il valore "successivo" alla soglia.
    Per ovviare a questo errore, una volta superata la soglia, devi sottrarre l'ultimo valore aggiunto

    Un potenziale ulteriore errore consiste nel fatto che il tuo codice non effettua nessun controllo per verificare se la soglia viene raggiunta: se inserisci in input un valore di "n" troppo basso, la somma dei numeri pari tra "2" e "n" potrebbe non arrivare a 90 (l'ultimo valore prima che superata la soglia di 99).
    In questo caso il tuo codice dovrebbe segnalare un warning.

    Per quanto riguarda l'individuazione dei numeri pari tra "2" e "n", non hai bisogno di usare la funzione "mod": puoi definire il ciclo for come:
    for i= 2:2:n
    Di seguito, il codice della funzione aggiornato in base ai suggerimenti sopra riportati.
    % Definizione parametri di output
    function [count,val] = Somma_pari99(n)
    count = 0;
    % Loop sui numeri pari da 2 a n
    for i= 2:2:n
       count = count + i;
       % Controllo della condizione di terminazione del loop
       if count >99
          % Se la somma ha superato la soglia (99) occorre sottrarre l'ultimo
          % addendo
          count=count-i;
          disp('Range numeri in input eccessivo')
          % Quindi si forza l'usscita dal loop
          break
       end
       % Asegnazione del valore del numero pari corrente alla varaibile di
       % output
       val=i;
    end
    % Se il valore "n" in input è troppo piccolo, la sommatoria potrebbe non
    % raggiungere la soglia
    if((count + i + 2) < 99)
       disp('WARNING: Range numeri in input non sufficiente')
    end
    
    Il problema può anche essere risolto utilizzando la funzione "cumsum", ma, in questo caso, dal momento che dovresti comunque fare un controllo sul superamento della soglia, non sarebbe molto più utile del ciclo for.

    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
3 risposte