Předvánoční slevová akce Java týden
Využij předvánočních slev a získej od nás 20 % bodů zdarma! Více zde
Pouze tento týden sleva až 80 % na Java e-learning!
Avatar
Wolf
Člen
Avatar
Wolf:21. března 22:39
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int m;
double d[10001][4];
double dieryPlatkuSyra(double Zod, double Zdo);
int main() {
int s,i,j;
scanf("%d %d",&m,&s);
double Vkocky=100.0*100.0*100.0;
double Vdier=0, Vsyra, Vdielu, Hdielu;
int a[4];
for(i=0; i<m; i++) {
scanf("%d %d %d %d",&a[0],&a[1],&a[2],&a[3]);
for(j=0; j<4; j++)
d[i][j] = a[j]/1000.0;
Vdier += 4.0/3.0*M_PI*d[i][0]*d[i][0]*d[i][0];
}
Vsyra = Vkocky - Vdier;
Vdielu = Vsyra / s;
Hdielu = 100.0/s;
double h, Zod=0.0, Zdo=Hdielu, VsyraOzaj, rozdiel;
for(i=0; i<s-1; i++) {
if(i>0 && i<s-1) {
Zod=Zdo;
Zdo+=Hdielu;
}
do {
Zdo += (Vdielu-VsyraOzaj)/(100.0*100.0);
h = Zdo-Zod;
VsyraOzaj = 100.0*100.0*h - dieryPlatkuSyra(Zod,Zdo);
rozdiel=Vdielu-VsyraOzaj;
if(rozdiel<0) rozdiel*=(-1);
} while (rozdiel>0.0000001);
printf("Hrubka %d. platku syra: %.9f\n",i+1,h);
}
printf("Hrubka %d. platku syra: %.9f\n",i+1,100-Zdo);
system("PAUSE");
return 0;
}
double dieryPlatkuSyra(double Zod, double Zdo) {
double V=0.0, Vdl, Vdp, v;
int i;
for(i=0; i<m; i++) {
if(((d[i][3]+d[i][0])<Zod)||((d[i][3]-d[i][0])>Zdo))
// diera mimo platku
continue;
if(((d[i][3]-d[i][0])>Zod)&&((d[i][3]+d[i][0])<Zdo)) {
// cela diera v platku
V += 4.0/3.0*M_PI*d[i][0]*d[i][0]*d[i][0];
continue;
}
if((d[i][3]>=Zod)&&(d[i][3]<=Zdo)) {
//stred diery v platku
if((d[i][3]-d[i][0])<Zod) { //presah zlava
v=Zod-(d[i][3]-d[i][0]);
Vdl=M_PI*v*v*(d[i][0]-v/3.0);
}
else Vdl=0.0;
if((d[i][3]+d[i][0])>Zdo) { //presah sprava
v=(d[i][3]+d[i][0])-Zdo;
Vdp=M_PI*v*v*(d[i][0]-v/3.0);
}
else Vdp=0.0;
V += (4.0/3.0*M_PI*d[i][0]*d[i][0]*d[i][0]-Vdl-Vdp);
continue;
}
//stred diery mimo platku
if(d[i][3]<Zod) { //zlava
v=(d[i][3]+d[i][0])-Zod;
Vdl=M_PI*v*v*(d[i][0]-v/3.0);
}
else Vdl=0.0;
if(d[i][3]>Zdo) { //sprava
v=Zdo-(d[i][3]-d[i][0]);
Vdp=M_PI*v*v*(d[i][0]-v/3.0);
}
else Vdp=0.0;
V += (Vdl+Vdp);
}
return V;
}

Zkusil jsem: Snažil som zadefinovať premenné int m a double d[1001][4] do main programu ale zároveň do funckie ako vstupne parametre ale fungovať to asi nebude kedže mám tam výpočty v ktorej sa odvolam na funkciu.

Chci docílit: Potrebujem v tomto kóde dosiahnuť aby tie dve globalne premenné tam neboli len aby celý program bežal na lokalných premennách.

Odpovědět
21. března 22:39
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Wolf
DarkCoder:22. března 0:07

Pravidlo: Sdílí-li globální a lokální proměnná stejné jméno, použije překladač vždy lokální proměnnou.

Pokud funkce pracuje s proměnnou definovanou mimo funkci, je dobré ji předávat přes parametr funkce. Je třeba dělat funkce obecné a nevytvářet něco, co se má spoléhat na něco zvenčí.

PS: Zapracuj na vizuální podobě programu (odsazuj, používej mezery). Jak chceš pak spravovat kód, který bude mít podstatně větší počet řádků? Nevyznáš se v tom. Dále v C se deklarace provádí buď vně všech funkcí nebo na začátku funkce či bloku. Nemůžeš deklarovat proměnné po provedení příkazu.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět
22. března 0:07
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Wolf
Člen
Avatar
Odpovídá na DarkCoder
Wolf:22. března 6:51

Odsadzujem kod len ako som to tu nahraval tak sa mi to tak vsetko dalo spolu.

Nahoru Odpovědět
22. března 6:51
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.