作者scws (小涼)
看板C_and_CPP
標題[問題]c語言 compile過了但執行一半時出現error
時間Sun Sep 27 09:52:24 2009
我的 一個作業 要找出eq的根
固定一個x 將根(y)帶入 判斷y是否為解
compile 時沒問題
但在run 時 跑到一半時(還不到設到的x) 它在出現"error 請按任意鍵"
我有對過 前面跑出來的答案是對的 但它無法跑到我要的X
但直接算那個最後停住的X 可以出現解(y)且是正確的
我想不知道是不是跟電腦有關西嗎? 我的筆電有五年的歷史了><
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double test(void);
double fun(double,float);
void loop(float,double,double,double,double);
double max(double,double);
double dee(double,float);
double dii(double,float);
int main()
{ int i;
float x;
double y[100000],eq2,eq1;
//------------------
FILE *fptr; //開啟檔案
if((fptr=fopen("root.txt","w"))==NULL)
{
printf("error");
system("pause");
}
//-----------------------
// y的初始直 並設定要帶入的y值 範圍0.001~100 固定一個x 將y值帶入 判斷y是否為
eq=0的解
y[0]=0.001;
for(i=0;i<100000;i++)
{y[i+1]=y[i]+0.001;}
x=0.01; //x的初始值
while(x<10.0)//x的終點
{ printf("x=%f\t",x);
fprintf(fptr,"%f\t",x);
for(i=0;i<100000;i++)//一一將y值帶入
{
eq1=fun(y[i],x);
eq2=fun(y[i+1],x);
if((eq1*eq2)<=0.0)//兩相鄰的y值 使eq位在一正一負 則可找出解
{
if(fabs(eq1)<=pow(10.0,-10))
{ fprintf(fptr,"a=%e\t",y[i]);}
else
{loop(x,y[i],y[i+1],eq1,eq2);}//找出較精準的y值
}
}
printf("\n");
fprintf(fptr,"\n");
x=x+0.01;
}
system("pause");
return 0;
}
double fun(double y,float x)
{
float pi,angle,a,b,wpi,wpe,we,wi,ck,ik,ek;
double de,di,d1,d2,d3,d4,d5,d6,eq;
pi=4*atan(1);
angle=pi/4;
a=cos(angle);
b=sin(angle);
wpi=1000.0;
wpe=42850;
we=1836;
wi=1.0;
ck=10000.0*x;
ik=0.2*x;
ek=42.0*x;
de=y*y*(y*y-we*we)-ek*ek*(y*y-we*we*a*a);
di=y*y*(y*y-wi*wi)-ik*ik*(y*y-wi*wi*a*a);
d1=1.0-wpe*wpe*(y*y-we*we*a*a)/de-wpi*wpi*(y*y-wi*wi*a*a)/di;
d2=1.0-(ck*ck)/(y*y)-wpe*wpe*(y*y-ek*ek-we*we*b*b)/de-wpi*wpi*(y*y-ik*ik-wi*wi*b*b)/di;
d3=1.0-(ck*ck)/(y*y)-wpe*wpe*(y*y-ek*ek)/de-wpi*wpi*(y*y-ik*ik)/di;
d4=wpe*wpe*we*we*a*b/de+wpi*wpi*wi*wi*a*b/di;
d5=wpe*wpe*y*we*b/de-wpi*wpi*y*wi*b/di;
d6=wpe*wpe*we*a*(y*y-ek*ek)/(y*de)-wpi*wpi*wi*a*(y*y-ik*ik)/(di*y);
eq=d1*d2*d3-2.0*d4*d5*d6-d3*d4*d4-d2*d5*d5-d1*d6*d6;
return eq;
}
void loop(float x,double y1,double y2,double eq1,double eq2)
{ int i;
double y3,eq3,c,di,cc,de;
//------------------
FILE *fptr; //開啟檔案
if((fptr=fopen("root.txt","w"))==NULL)
{
printf("error");
system("pause");
}
//-----------------------
// 因為分母也有y值 找出y使分母=0 (他會使eq趨向無限大)這是不要解 所以y1右邊的點
涮出的eq的絕對值會大於y1
c=fabs(fun(y1+0.000001,x));
cc=fabs(fun(y1,x));
de=(dee(y1,x));/
di=(dii(y1,x));
if(di>=0.00001 && de>=0.00001 && c-cc<0.0) /
{
y3=y1+0.01*fabs(eq1)/(fabs(eq1)+fabs(eq2));
fprintf(fptr,"b=%f\t",y3);
printf("b=%f\t",y3);
}
}
double dee(double y,float x)
{
float we,ek,a;
double de;
we=1836.0;
ek=42.0*x;
a=cos(atan(1)); //pi/4
de=y*y*(y*y-we*we)-ek*ek*(y*y-we*we*a*a);
return fabs(de);
}
double dii(double y,float x)
{
float wi,ik,a;
double di;
wi=1.0;
ik=0.2*x;
a=cos(atan(1)); //pi/4
di=y*y*(y*y-wi*wi)-ik*ik*(y*y-wi*wi*a*a);
return fabs(di);
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.138.128.123
1F:→ dendrobium:這不看code有人猜得出來問題嗎@@? 09/27 10:15
2F:推 joefaq:我猜是違規存取記憶體 09/27 10:31
3F:→ joefaq:看看是不是十誡第二條 09/27 10:32
※ 編輯: scws 來自: 140.114.229.88 (09/27 15:18)
※ 編輯: scws 來自: 140.114.229.88 (09/27 15:48)
4F:推 VictorTom:"error"明明就是程式裡自己印的, "請按任意鍵...."明明 09/27 18:06
5F:→ VictorTom:就是system("pause")產生的; 這個程式明明就照著程式的 09/27 18:07
6F:→ VictorTom:邏輯走, step by step跟一下就知道是開檔開失敗了, 怎麼 09/27 18:08
7F:→ VictorTom:會猜跟電腦舊不舊有關....Orz 09/27 18:08
8F:推 VictorTom:至於為什麼會開檔失敗??八成跟程式習慣不好有關; 寫程式 09/27 18:12
9F:→ VictorTom:請養成成對coding的好習慣, 你的程式裡有N個地方在開檔 09/27 18:12
10F:→ VictorTom:(fopen)可是卻沒有一個關檔(fclose)存在....Orz 09/27 18:13
11F:→ scws:謝謝V大 但我可以再請問你 我的flose要放那里? 它在跑迴圈時 09/27 19:28
12F:→ scws:不是還要再開檔案 還是把fclosez放在最後就行了 謝謝 09/27 19:31
13F:推 VictorTom:老實說我覺得你應該自己去研究開關檔的時機, 因為程式是 09/27 19:40
14F:→ VictorTom:你寫的, 由你來決定何時需要開關檔才對. 理論上, 當我需 09/27 19:41
15F:→ VictorTom:要存取檔案時我需要開檔, 當存取檔案結束時就應該關檔; 09/27 19:41
16F:→ VictorTom:另外, 我還沒存取完, 但我知道會有其他程序要存取同樣的 09/27 19:42
17F:→ VictorTom:檔案時我也應該先關檔, 等我下次要用的時候再重新開檔. 09/27 19:42
18F:→ VictorTom:有多個程式同時存取一個檔案時這是另外一個課題, 估計你 09/27 19:43
19F:→ VictorTom:的case不用考慮; 輪流存取時考慮好上面推的應該就夠了. 09/27 19:44