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.