Aiuto esercizio in C

di il
24 risposte

Aiuto esercizio in C

Ciao a tutti ragazzi. Devo fare un esercizio assegnato dal professore di informatica. Premetto che siamo a metà corso e quindi parecchi concetti sono stati assimilati da me ma, non so per quale strano motivo, non riesco a scrivere questo programmino, probabilmente molto semplice.

Il testo è questo:
"Scrivere un programma C che legga in input da tastiera un numero reale N e successivamente numeri interi finché entrambe le seguenti condizioni sono rispettate a. La media dei numeri acquisiti è superiore al valore di N b. Sono stati acquisiti meno di 10 numeri."

Questo è il codice che ho scritto. Il problema è il crearsi di un loop infinito.
Potreste aiutarmi a trovare l'errore per favore?
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   float N;
   int a, i, media;

    printf("Scrivi un numero reale: ");
    scanf("%f", &N);

    printf("Inserisci un numero intero: ");
    scanf("%d", &media);
    i = 2;


        while ((i < 10) || (media < N))
    {
        printf("Scrivi un numero intero: ");
        scanf("%d", &a);
        ++i;
        media = (media + a)/i;

    }

    printf("\n\n");
    printf("Ciclo completato");


    return 0;
}

24 Risposte

  • Re: Aiuto esercizio in C

    La media non dovrebbe essere un numero reale?

    Prova a scrivere "printf("\n media : %d", media\n);" alla fine di ogni ciclo, noterai qualcosa che non va
  • Re: Aiuto esercizio in C

    ale99 ha scritto:


    La media non dovrebbe essere un numero reale?

    Prova a scrivere "printf("\n media : %d", media\n);" alla fine di ogni ciclo, noterai qualcosa che non va
    In realtà ho provato ad eseguire "a mano" i conti con numeri prestabiliti.
    Approssimando ad ogni ciclo il valore della media il risultato è errato.

    Come ultima spiaggia ho provato, tramite cast, ad avere la media scritta in virgola mobile. Niente da fare, loop infinito.


    Inviato dal mio iPhone utilizzando Tapatalk
  • Re: Aiuto esercizio in C

    O
    
    ...
    scanf("%d", &a);
    media = media + ( ( a - media ) / i ) ;
    ++i;
    ...
    
    o

    usi una variabile per "ricordare" la somma
  • Re: Aiuto esercizio in C

    ale99 ha scritto:


    o
    
    ...
    scanf("%d", &a);
    media = media + ( ( a - media ) / i ) ;
    ++i;
    ...
    
    o

    usi una variabile per "ricordare" la somma
    Nel primo caso verrebbe un risultato errato dato che il processo di calcolo della media è impostato male.
    Infatti supponendo di avere due numeri, 5 e 7, è diverso dire (5+7)/2 e (5/1)+(7/2). Se era questo che intendevi dire


    Inviato dal mio iPhone utilizzando Tapatalk
  • Re: Aiuto esercizio in C

    Riscrivi il codice.

    Usa un intero solamente per il contatore di numeri.
    Per il numero, la somma e la media utilizza dei double.

    Azzera la somma all'inizio

    somma=0;

    esegui il ciclo inserendo il numero e aggiungilo alla somma

    somma += numero;

    Alla fine del ciclo, fuori dal ciclo, calcola la media

    media = somma/N;

    e visualizza la media.
  • Re: Aiuto esercizio in C

    oregon ha scritto:


    Riscrivi il codice.

    Usa un intero solamente per il contatore di numeri.
    Per il numero, la somma e la media utilizza dei double.

    Azzera la somma all'inizio

    somma=0;

    esegui il ciclo inserendo il numero e aggiungilo alla somma

    somma += numero;

    Alla fine del ciclo, fuori dal ciclo, calcola la media

    media = somma/N;

    e visualizza la media.
    Ok provo a riscrivere il codice e in caso di problemi lo posto qui
  • Re: Aiuto esercizio in C

    No, sarebbe (5/1) + ((7-5)/2)

    Guarda meglio
  • Re: Aiuto esercizio in C

    ale99 ha scritto:


    No, sarebbe (5/1) + ((7-5)/2)

    Guarda meglio
    Hai ragione, l'operazione è giusta.
    Ho provato a fare cosí, a provare il ciclo for, il while e anche l'if. Sbaglio da qualche parte ma non capisco dove.


    Inviato dal mio iPhone utilizzando Tapatalk
  • Re: Aiuto esercizio in C

    Posta il codice che ti sembra più corretto
  • Re: Aiuto esercizio in C

    Posta tutto il nuovo codice
  • Re: Aiuto esercizio in C

    Ho scritto il codice da capo.
    Tramite debugging e watches ho potuto verificare che il problema risiede nell'incremento del contatore. In pratica dopo il primo ciclo il conteggio schizza direttamente a 10, soddisfando la condizione di fine-ciclo del for e restituendomi una media estremamente errata.

    Ecco il codice:
    #include <stdio.h>
    #define N 10
    
    int main (void)
        {
    
        int contatore, somma;
        float reale, media;
    
        printf("Inserisci un numero reale: ");
        scanf("%f", &reale);
    
        
            media = 0;
            printf("Inserisci un numero intero: ");
            scanf("%d", &somma);
            
            contatore=1;
            for(contatore=1; contatore<N; ++contatore);
        {
            media= (media + somma)/contatore;
            if (somma < reale)
                {
                printf("Inserisci un numero intero: ");
                scanf("%d", &somma);
                
                }
            else
                printf("Ciclo terminato\n");
        }
    
            printf("\n");
            printf("Il numero reale era %f, la media vale %f", reale,media);
            printf("\n");
    
    
    
        return 0;
    }
    
    AGGIORNAMENTO: il problema del conteggio che schizza subito 10 era causato dal ";" dopo il for che causava il bug. Svista mia.
    Ora vedo se fila tutto liscio liscio
  • Re: Aiuto esercizio in C

    Non capisco cosa hai scritto ... non hai seguito molto i miei consigli ...
  • Re: Aiuto esercizio in C

    oregon ha scritto:


    Non capisco cosa hai scritto ... non hai seguito molto i miei consigli ...
    Ho provato a seguire il tuo consiglio ma niente, non funziona.
    Anche perchè mi hai consigliato di calcolare la media fuori dal ciclo, quando in realtà l'esercizio mi chiede di uscire dal ciclo una volta che la media ha superato un determinato valore
  • Re: Aiuto esercizio in C

    Scusami, ma anche sistemando il for il programma non può funzionare come vorresti, prima di scrivere il codice dovresti almeno immaginare in pseudocodice ciò che dovresti realizzare.
    La consegna ti dice di leggere un numero reale N e fin qui direi che siamo d'accordo
    Però ciò che sbagli è questo principalmente: il tuo ciclo soddisfa soltanto la condizione b, non c'è nessuna condizione che ti permetta di uscire dal ciclo se la media attuale dei numeri inseriti è minore di N ( quindi penso che il controllo vada fatto ad ogni iterazione del ciclo).
Devi accedere o registrarti per scrivere nel forum
24 risposte