Oppure

Loading
07/09/11 10:27
flavio89
Cari Ragazzi, avrei un problema con un programma assegnatomi per scopo universitario.
In pratica questo programmino somma molti elementi di un array dello stesso ordine di grandezza utilizzando un algoritmo già scritto dalla professoressa. Solo che, copiandolo, il risultato dato in output è inesatto!
Ho fatto, ad esempio, un prova riempendo l' array con 12 elementi, tutti 1.
Il risultato, per qualche motivo, però è pari a 15!
Non so come risolvere, sono giorni che ci sto su.
Vi allego il sorgente .c e la slide dove c'è l' algoritmo della prof. Fatemi sapere almeno dov' è l' errore, vi sarei grato!


slide flatul.altervista.org/…

Sorgente:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

void fill_print (unsigned int,float []); // crea e stampa l' array
float blocks (unsigned int,float []); //double per  precisione
float roundoff ();

main () {
    unsigned int N = 12;
    float A[N];
    srand (time(0));
    puts ("Stampa dei 1000 elementi dell' array");
    fill_print (N,A);

    puts ("\n\nSomma dei 1000 elementi dell' array");
    printf ("%.2f",blocks(N,A));

    printf ("\n\n\t Possibile errore di roundoff %.1f",roundoff());
puts ("");
system ("pause");
} // fine MAIN


void fill_print (unsigned int N,float A[]) {
    short i;

    for (i = 0; i < N; i++) {
        A[i] = 1.f;                                   //rand() % 2;
        if (i % 4 == 0)  printf ("\n");
        printf ("%.2f\t",A[i]);
    } // fine FOR
}

float blocks (unsigned int N,float A[]) {
    unsigned int Nmezz;
    unsigned int i;

    while (N > 1) {
        Nmezz = N/2;
        for (i = 0; i < Nmezz; i++) {
            A[i] = A[i] + A[N-1-i];
            if (N%2 == 0) N = Nmezz;
            else N = Nmezz+1;
        } // fine FOR
    } // fine WHILE

    return A[0];
}

float roundoff () {
    float x = 1.0f,
          t = x+1;  // appoggio

    while (t > 1) {
        x = x/2;
        t = x + 1;  // 1+ 2^-n
    }   // successione

    return 2.0f * x;
}

aaa
07/09/11 10:47
nessuno
Guarda che non è così

        for (i = 0; i < Nmezz; i++) {
            A[i] = A[i] + A[N-1-i];
            if (N%2 == 0) N = Nmezz;
            else N = Nmezz+1;
        } // fine FOR


        for (i = 0; i < Nmezz; i++)
            A[i] = A[i] + A[N-1-i];

        if (N%2 == 0) N = Nmezz;
            else N = Nmezz+1;



... basta solo "copiare" con attenzione ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
07/09/11 11:42
flavio89
Ti ringrazio... non meritavo neanche risposta! ti devo un caffè
aaa
07/09/11 16:46
Nullable
Postato originariamente da flavio89:

ti devo un caffè


youtube.com/… :D
aaa
07/09/11 20:13
flavio89
Gia visto... eheh... ma sempre divertente!
aaa