Program do obliczania objętosci met Monte Carlo

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.

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
0

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

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