Program do obliczania objętosci met Monte Carlo

Odpowiedz Nowy wątek
2012-11-17 12:20
0

Cześć,
Musze napisać na projekt program który liczy objętość dwóch wybranych brył metodą Monte Carlo, udało mi się samemu stworzyć taki kod.

 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
 
int sprawdzenie1 (int liczba);
int sprawdzenie2 (double liczba);
 
int main()
{
    FILE *zapisdanych;
    FILE *zapiskomendy;
    char znak=0;
    double ilosc_pow, prom,wysok,pkt_wykres;
    int k,i, rownanie,rownanie2,x=0,y=0,z=0,wybor;
    double v1, v2, pi=3.141592;
 
do {
printf("Wybierz bryle dla ktorej chcesz liczyc objetosc. 1- kula lub 2-walec\n");
printf ("Wybor =");
scanf("%d", &wybor);
sprawdzenie1 (wybor);
 
switch (wybor){
case 1:{ // Program liczy objetosc kuli
    printf ("Zakladamy ze srodek kuli znajduje sie w srodku ukladu wspolrzednych\n");
    printf ("Podaj liczbe losowanych punktow  n=");
    scanf ("%lf", &ilosc_pow);
    sprawdzenie2(ilosc_pow);
    printf("Podaj co ile powtorzen program ma nanosic punkt na wykres ");
    scanf("%lf", &pkt_wykres);
    sprawdzenie2(pkt_wykres);
    printf("\nPodaj promien kuli r=");
    scanf ("%lf", &prom);
    sprawdzenie2(prom);
    printf("\n");
    getchar();
 
    k=0;
 
    zapisdanych = fopen("dane.txt", "w");
 
    srand (time(NULL));
    for (i=1; i<ilosc_pow+1; i++)
    {
 
    x=(rand()%(int)prom) + (rand())/(double)RAND_MAX; //losowanie wspó³rzêdnych punktu z zakresu [0,prom]
    y=(rand()%(int)prom) + (rand())/(double)RAND_MAX;
    z=(rand()%(int)prom) + (rand())/(double)RAND_MAX;
 
    rownanie = x*x + y*y + z*z;
    if (rownanie <=prom*prom) k++; //sprawdz czy punkt nale¿y do kuli
 
    if (i%(int)pkt_wykres==0) //zapis do pliku numeru losowania i wartosci objetosci obliczonej metoda Monte Carlo
    {
        v1= (8*prom*prom*prom *k)/i;
        fprintf(zapisdanych, "%d %.2lf\n", i, v1);
    }
 
    }
    fclose (zapisdanych);
    printf ("\nIlosc wszystkich punktow n=%.0f\n", ilosc_pow);
    printf ("\nIlosc prawidlowo wylosowanych punktow k=%d\n", k);
 
    v1= (8*prom*prom*prom*k)/ilosc_pow;
    v2 = ((4.000)/(3.000) * pi * prom*prom*prom);
 
    zapiskomendy=fopen("komendy.txt", "w");
    fprintf(zapiskomendy, "set terminal png\nset output 'wykres.png'\nplot 'dane.txt' \nset output \n ");
    fclose (zapiskomendy);
 
    system ("gnuplot komendy.txt");
 
    printf ("\nObjetosc obliczona metoda Monte Carlo V=%.3lf\n", v1);
    printf ("\nObjetosc obliczona ze wzoru na objetosc kuli wynosi V=%.3lf\n", v2);
    printf("\nAby zakonczyc wcisnij ESC. Jezeli chcesz dokonac wyboru funkcji wcisnij ENTER\n");
        do {znak = getchar();}
        while (znak !=27 && znak !=10);
}
 
case 2: {// Program liczy objetosc walca
    printf ("Podaj liczbe losowanych punktow n=");
    scanf ("%lf", &ilosc_pow);
    sprawdzenie2 (ilosc_pow);
    printf("Podaj co ile powtorzen program ma nanosic punkt na wykres ");
    scanf("%lf", &pkt_wykres);
    sprawdzenie2(pkt_wykres);
    printf("\nPodaj promien podstawy walca r=");
    scanf ("%lf", &prom);
    sprawdzenie2(prom);
    printf("\nPodaj wysokosc h=");
    scanf ("%lf", &wysok);
    sprawdzenie2(wysok);
    printf("\n");
    getchar();
 
    k=0;
 
    zapisdanych = fopen("dane.txt", "w");
    srand (time(NULL));
    for (i=1; i<ilosc_pow+1; i++)
    {
    x=(rand()%(int)prom) + (rand())/(double)RAND_MAX;
    y=(rand()%(int)prom) + (rand())/(double)RAND_MAX;
    z=(rand()%(int)wysok) + (rand())/(double)RAND_MAX;
 
    rownanie2=x*x + y*y;
    if (rownanie2 <=prom*prom && z<=wysok) k++;
    if (i%(int)pkt_wykres==0)
    {
        v1= (4*prom*prom *wysok *k)/i;
        fprintf(zapisdanych, "%d %.2lf\n", i, v1);
    }
    }
 
    fclose (zapisdanych);
    printf ("\nIlosc wszystkich punktow n=%.0f\n", ilosc_pow);
    printf ("\nIlosc prawidlowo wylosowanych punktow k=%d\n", k);
 
    v1= (4*prom*prom *wysok *k)/ilosc_pow;
    v2 = ( pi *prom*prom*wysok);
 
    zapiskomendy=fopen("komendy.txt", "w");
    fprintf(zapiskomendy, "set terminal png\nset output 'wykres.png'\nplot 'dane.txt' \nset output \n ");
    fclose (zapiskomendy);
 
     system ("gnuplot komendy.txt");
 
    printf ("\nObjetosc obliczona metoda Monte Carlo V=%.3f\n", v1);
    printf ("\nObjetosc obliczona ze wzoru na objetosc walca wynosi V=%.3f\n", v2);
    printf("\nAby zakonczyc wcisnij ESC. Jezeli chcesz dokonac wyboru funkcji wcisnij ENTER\n");
        do {znak = getchar();}
        while (znak !=27 && znak !=10);
 
    }
 
default:{                                //Inny wybor
printf ("Zly wybor.");
printf("\nAby zakonczyc wcisnij ESC. Jezeli chcesz dokonac wyboru funkcji wcisnij ENTER\n");
        do {znak = getchar();}
        while (znak!=27 && znak!=10);
        }
}
}
while (znak!=27);
 
return 0;
 
}
 
int sprawdzenie1 (int wybor)
{
    int c,war;
 
    do
    {
war = 0;
 
while((c=getchar()) != '\n' && c!=EOF)
{
if(isdigit(c) != 1) war = 1;
}
if (war==1)
{
printf("\nBledne dane!!!\n\nPodaj ponownie wartosc jeszcze raz: ");
}
}
while (war==1);
 
    return wybor;
}
 
int sprawdzenie2 (double liczba)
{
    int c,war;
 
    do
    {
war = 0;
 
while((c=getchar()) != '\n' && c!=EOF && c!='.' && c!='e')
{
if((isdigit(c)) != 1) war = 1;
}
if (war==1)
{
printf("\nBledne dane!!!\n\nPodaj ponownie wartosc jeszcze raz: ");
}
}
while (war==1);
 
    return liczba;
}

Problem jest taki, że jeżeli za wybor wpisze jakiś wyraz, tutaj program poinformuje ze błędna dana, potem wpisze 2 co odpowiada objętości walca, to program zamiast niej liczyć objętość kuli. Dlaczego tak się dzieje.

Pozostało 580 znaków

2012-11-17 13:37
0
  1. Naucz się formatować kod jak czlowiek albo używaj IDE które zrobi to za ciebie
  2. Naucz się dzielić program na małe sensowne funkcje po max 20 linijek
  3. Użyj debuggera

Pozostało 580 znaków

2012-11-17 13:55
0

A może mi to powiedzieć w normalnych słowach. Dopiero zaczynam i nie wiem jak to powinno wyglądać.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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