Python týden Geek tričko zdarma
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde
Pouze tento sleva až 80% na kurzy Python

Diskuze: Globalna premenna na Lokalnu

Aktivity (2)
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."
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.