Wypisywanie wartości tablicy - problem

0

Witam!
Chciałabym prosić o pomoc w wyjaśnieniu problemu z niżej zamieszczonym programem. W woli wprowadzenia program ten liczy średni kwadrat przemieszczenia błądzącej cząsteczki w przestrzeni dwuwymiarowej. Dodatkowo ma za zadanie wypisanie grupy zmiwnnych x i y w postaci tablic, a następnie wydrukowanie ich w pliku o rozszerzeniu .dat. I tu wlaśnie pojawia się problem, ponieważ w stworzonym pliku program wypisuje mi same zera, choć podczas kompilacji wylicza prawidłowo wartości x i wartości y przy zadanej liczbie prób. Przypuszczam,że jest gdzieś błąd przy zapisie tablic(aczkolwiek są to tylko moje przypuszczenia), jednak ze względu na brak doświadczenia w programowaniu nie jestem w stanie go samodzielnie odnaleźć.

# include <stdio.h>
# include <math.h>
# include <stdlib.h>

main()
{
   int ll,i, proba, Np, Nk;
   long int zmiana, k, ile_zmian, SEED, SEED_0, x, y, xt[601], yt[601];
   float MaxInt, RMaxInt,xi;
   float sumar2,r2,A;

   //DANE
   Np=10;        // ile powtórzen/prób błądzenia 
   k=50;        // czas blądzenia = calkowita ilosc kroków
   ile_zmian= (int) k;
   SEED_0=12347; 
   MaxInt=32768.0; // 2^15 
   
   //OBLICZENIA
   RMaxInt=1.0/MaxInt; 
   for (proba=1; proba<=Np; ++proba) {
       x=0;         // początkowe położenie
       y=0;
       SEED=SEED_0+2*proba;
       srand(SEED);  //inicjalizacja generatora z ziarnem SEED
       for (zmiana=0; zmiana<=ile_zmian; ++zmiana) {
           xi=rand()*RMaxInt; // rzeczywista liczba losowa z przedziału (0,1)
           ll=(int)(4*xi+1);  //   naturalna liczba losowa z przedziału <1,5>
           switch (ll){
           case 1: 
                x=x+1;
                break;
           case 2:  
                x=x-1;
                break;          
           case 3:    
                y=y+1;
                break;        
           case 4:  
                y=y-1;
                break;   
            //zapamietaj x i y jako xt[] i  yt[]  
			xt[zmiana]=x;
			yt[zmiana]=y;             
           }
           
       }
      r2=x*x+y*y;
      sumar2=sumar2+r2;
        // oblicz kwadrat odleglości po K krokach
      printf("proba=%4d zmiana= %4d x=%4d y=%4d r2=%8.1f sumar2=%8.1f\n ", proba,zmiana, x, y, r2,sumar2);
   }
   A=sumar2/Np;
   printf("A=%8.1f\n ", A);
      FILE *wyniki = fopen("XYtoru.dat", "a");
   for (i=1; i<=ile_zmian; ++i) {
    fprintf(wyniki,"%4d %8.1f %5.2f\n", i, xt[i], yt[i]);
   fclose(wyniki);
}
   system("Pause");
}
0
           xi=rand()*RMaxInt; // rzeczywista liczba losowa z przedziału conajmniej (0,32767*32768.0) http://www.cplusplus.com/reference/clibrary/cstdlib/rand/
           ll=(int)(4*xi+1);  //   naturalna liczba losowa z przedziału (0,ULONG_MAX) czyli właściwie może być każda.
0

Zamykasz plik w pętli zamiast po wykonaniu wszystkich iteracji.

0

Rozumiem,że chodzi o dokonanie zmiany w nasępujący sposób:

 
   A=sumar2/Np;
   printf("A=%8.1f\n ", A);
   FILE *wyniki = fopen("XYtoru.dat", "a");
   for (i=1; i<=ile_zmian; ++i) {
   fprintf(wyniki,"%4d %8.1f %5.2f\n", i, xt[i], yt[i]);
                                            }
   fclose(wyniki);  
   system("Pause");
}
<n/code>
Wstawienie tej poprawki nic nie zmieniło, w dalszym ciągu w tworzonym przez program pliku wartości x i wartości y są zerami.
0

Tak jak dodał w komentarzu @_13th_Dragon wykonujesz zapis do swojej tablicy po instrukcji break. Kompilator nie wywalił Ci czegoś w stylu "Unreachable code" ?

EDIT: zapewne zapis miał być pod całym switch-em - a nie pod case

0
 RMaxInt=MaxInt+1.0; 
   for (proba=1; proba<=Np; ++proba) {
       x=0;         // początkowe położenie
       y=0;
       SEED=SEED_0+2*proba;
       srand(SEED);  //inicjalizacja generatora z ziarnem SEED
       for (zmiana=0; zmiana<=ile_zmian; ++zmiana) {
              xi=0+(int)((2)*rand()/RMaxInt); // rzeczywista liczba losowa z przedziału (0,1)
              ll=1+(int)((5)*rand()/RMaxInt);  //   naturalna liczba losowa z przedziału <1,5>
           switch (ll){
           case 1: 
                x=x+1;
                break;
           case 2:  
                x=x-1;
                break;          
           case 3:    
                y=y+1;
                break;        
           case 4:  
                y=y-1;
                break;  
			
			          }

czy teraz losowanie jest poprawne?

0

czy przy zapisie liczby xi zamiast int nie powinno być double jako reprezentacja liczb rzeczywistych?

0

Wg mnie próbujesz skombinować coś na kształt tego:

#include <stdio.h>
#include <math.h>
//#include <time.h> // do time()
#include <stdlib.h>

#define ProbeCount 10
#define RunTime 50
 
int main()
  {
   int x,y,p,r,v,seed;
   double r2,suma;
   FILE *wyniki;

   seed=12347; // może lepiej tak jak niżej tak: //seed=time(0);
   wyniki=fopen("XYtoru.dat","a");
   for(p=0;p<ProbeCount;++p)
     {
      suma=x=y=0;
      srand(seed+(p<<1));
      for(r=0;r<RunTime;++r)
        {
         v=rand();
         (v&2?x:y)+=((v&1)<<1)-1;
         //fprintf(wyniki,"%4d %4d %4d\n",r+1,x,y); // każdy krok
        }
      fprintf(wyniki,"%4d %4d %4d\n",p+1,x,y); // po ostatnim
      r2=x*x+y*y; 
      suma+=r2; // r2 potrzebny tylko dla wyświetlenia, można pozbyć się r2: suma+=x*x+y*y;
      printf("proba=%4d; zmiana=%4d; x=%4d; y=%4d; r2=%8.1f; suma=%8.1f;\n",p+1,r+1,x,y,r2,suma);
     }
   printf("A=%8.1f\n",suma/RunTime);
   fclose(wyniki);
   fflush(stdin);
   getchar();
   return 0;
  }
0

Pozbyłam się xi, naniosłam poprawki o których pisałeś. Program wyglada teraz tak:

# include <stdio.h>
# include <math.h>
# include <stdlib.h>
 
main()
{
   int ll,i, proba, Np, Nk;
   long int zmiana, k, ile_zmian, SEED, SEED_0, x, y, xt[601], yt[601];
   float MaxInt, RMaxInt,xi;
   float sumar2,r2,A;
 
   //DANE
   Np=10;        // ile powtórzen/prób błądzenia 
   k=50;        // czas blądzenia = calkowita ilosc kroków
   ile_zmian= (int) k;
   SEED_0=12347; 
   MaxInt=32768.0; // 2^15 
 
   //OBLICZENIA
    RMaxInt=RAND_MAX+1; 
   for (proba=1; proba<=Np; ++proba) {
       x=0;         // początkowe położenie
       y=0;
       SEED=SEED_0+2*proba;
       srand(SEED);  //inicjalizacja generatora z ziarnem SEED
       for (zmiana=0; zmiana<=ile_zmian; ++zmiana) {
             //xi=0+(double)((2)*rand()/RMaxInt); // rzeczywista liczba losowa z przedziału (0,1)
              ll=(int)((5)*rand()/RMaxInt);  //   naturalna liczba losowa z przedziału <1,5>
           switch (ll){
           case 1: 
                x=x+1;
                break;
           case 2:  
                x=x-1;
                break;          
           case 3:    
                y=y+1;
                break;        
           case 4:  
                y=y-1;
                break;   
                 
           }
  //zapamietaj x i y jako xt[] i  yt[]  
                        xt[zmiana]=x;
                        yt[zmiana]=y;       
       }
      r2=x*x+y*y;
      sumar2=sumar2+r2;
        // oblicz kwadrat odleglości po K krokach
      printf("proba=%4d zmiana= %4d x=%4d y=%4d r2=%8.1f sumar2=%8.1f\n ", proba,zmiana, x, y, r2,sumar2);
   }
   A=sumar2/Np;
   printf("A=%8.1f\n ", A);
      FILE *wyniki = fopen("XYtoru.dat", "a");
   for (i=1; i<=ile_zmian; ++i) {
    fprintf(wyniki,"%4d %8.1f %5.2f\n", i, xt[i], yt[i]);
 
}
  fclose(wyniki);
   system("Pause");
}
0

Przyznam szczerze,że zaczynam się gubić... program który zamieściłam w pierwszym poście zostal naisany przez dr z którym mam zajęcia(jestem studentka matematyki na Politechnice Lubelskiej), a częściowo zmodyfikowany przeze mnie. W początkowym zalożeniu miał on zapisac w pliku wartości x i y dla Np=50 a potem dla Np=100.

0

Napisany przez dr fizyki, ktory ma z nami programowanie z zastosowaniem metody Monte Carlo. A akurat ta część programu w której znalazłeś błdy została napisana właśnie przez niego.

0

Tak czy inaczej dziękuje za pomoc:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1