Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema
Forum - C/C++ - Problema "somma di molti addendi"

Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 12:27
Mercoledì, 07/09/2011
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 http://flatul.altervista.org/P2_03_04_AT.pdf

Sorgente:
Codice sorgente - presumibilmente C++

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4.  
  5. void fill_print (unsigned int,float []); // crea e stampa l' array
  6. float blocks (unsigned int,float []); //double per  precisione
  7. float roundoff ();
  8.  
  9. main () {
  10.     unsigned int N = 12;
  11.     float A[N];
  12.     srand (time(0));
  13.     puts ("Stampa dei 1000 elementi dell' array");
  14.     fill_print (N,A);
  15.  
  16.     puts ("\n\nSomma dei 1000 elementi dell' array");
  17.     printf ("%.2f",blocks(N,A));
  18.  
  19.     printf ("\n\n\t Possibile errore di roundoff %.1f",roundoff());
  20. puts ("");
  21. system ("pause");
  22. } // fine MAIN
  23.  
  24.  
  25. void fill_print (unsigned int N,float A[]) {
  26.     short i;
  27.  
  28.     for (i = 0; i < N; i++) {
  29.         A[i] = 1.f;                                   //rand() % 2;
  30.         if (i % 4 == 0)  printf ("\n");
  31.         printf ("%.2f\t",A[i]);
  32.     } // fine FOR
  33. }
  34.  
  35. float blocks (unsigned int N,float A[]) {
  36.     unsigned int Nmezz;
  37.     unsigned int i;
  38.  
  39.     while (N > 1) {
  40.         Nmezz = N/2;
  41.         for (i = 0; i < Nmezz; i++) {
  42.             A[i] = A[i] + A[N-1-i];
  43.             if (N%2 == 0) N = Nmezz;
  44.             else N = Nmezz+1;
  45.         } // fine FOR
  46.     } // fine WHILE
  47.  
  48.     return A[0];
  49. }
  50.  
  51. float roundoff () {
  52.     float x = 1.0f,
  53.           t = x+1;  // appoggio
  54.  
  55.     while (t > 1) {
  56.         x = x/2;
  57.         t = x + 1;  // 1+ 2^-n
  58.     }   // successione
  59.  
  60.     return 2.0f * x;
  61. }




C, con te litigo spesso, ma alla fin fine ti voglio bene
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:47
Mercoledì, 07/09/2011
Guarda che non è così

Codice sorgente - presumibilmente Delphi

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



Codice sorgente - presumibilmente C/C++

  1. for (i = 0; i < Nmezz; i++)
  2.             A[i] = A[i] + A[N-1-i];
  3.  
  4.         if (N%2 == 0) N = Nmezz;
  5.             else N = Nmezz+1;




... basta solo "copiare" con attenzione ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 13:42
Mercoledì, 07/09/2011
Ti ringrazio... non meritavo neanche risposta! ti devo un caffè


C, con te litigo spesso, ma alla fin fine ti voglio bene
PM Quote
Avatar
Nullable (Normal User)
Expert


Messaggi: 217
Iscritto: 12/07/2011

Segnala al moderatore
Postato alle 18:46
Mercoledì, 07/09/2011
Testo quotato

Postato originariamente da flavio89:

ti devo un caffè



Hai perso.
PM Quote
Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 22:13
Mercoledì, 07/09/2011
Gia visto... eheh... ma sempre divertente!


C, con te litigo spesso, ma alla fin fine ti voglio bene
PM Quote