本帖最後由 runeray2000 於 2010-5-14 12:12 PM 編輯
純 C 寫的~
^ 次方的函數的 範圍是抓大概的而已,超出會有錯誤訊息~- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- struct fn_
- {
- long int up,low;
- }result,data;
- void uf(struct fn_ *d) //約分
- {
- long int i,v;
- if(d->up<0)
- v=-1;
- else
- v=1;
- d->up*=v;
- i=(d->up<d->low ? d->up : d->low);
- for(;i>=2;i--)
- if((d->up % i ==0) &&( d->low % i ==0))
- {
- d->up/=i;
- d->low/=i;
- i=(d->up<d->low ? d->up : d->low);
- }
- d->up*=v;
- }
- char *get_value(char *a,long int *val,long *val_div) // 截取數字(含小數)
- {
- *val_div=0;
- *val=0;
- for(; *a!='\n' && *a!=0 && *a!='/';a++)
- {
- if(*a>='0' && *a<='9')
- {
- *val*=10;
- *val+=(long int)(*a-'0');
- }
- *val_div*=10;
- if(*a=='.')
- if(*val_div==0)
- *val_div=1;
- else
- return 0;
- if(!(*a=='/' || *a=='.' || (*a>='0' && *a<='9')))
- return 0;
- }
- if(*val_div==0)
- *val_div=1;
-
- return a;
- }
- int scan_data(char *a,char *op,struct fn_ *data)
- {
- long int up_val=0,up_div=0,low_val=0,low_div=0;
-
- switch(*a)
- {
- case '+':
- case '-':
- case '*':
- case '/':
- case '^':
- case 'q':
- break;
- default:
- return 0;
- }
- *op=*a;
- a++;
-
- if(!(a=get_value(a,&up_val,&up_div)))
- return 0;
- if(*a=='/')
- {
- if(!(a=get_value(++a,&low_val,&low_div)))
- return 0;
- if(*a=='/' || low_val==0)
- return 0;
- data->up=up_val*low_div;
- data->low=low_val*up_div;
- uf(data);
- return -1;
- }
- data->up=up_val;
- data->low=up_div;
- uf(data);
- return -1;
- }
- int do_next_op(struct fn_ *result,char *op,struct fn_ *data)
- {
- double flt_v,flt_p;
- char flt_str[100];
- switch(*op)
- {
- case '+':
- result->up=result->up*data->low+result->low*data->up;
- result->low*=data->low;
- break;
- case '-':
- result->up=result->up*data->low-result->low*data->up;
- result->low*=data->low;
- break;
- case '*':
- result->up*=data->up;
- result->low*=data->low;
- break;
- case '/':
- result->up*=data->low;
- result->low*=data->up;
- return 0;
- break;
- case '^':
- flt_v=(double)result->up/(double)result->low;
- flt_p=(double)data->up/(double)data->low;
- flt_v=pow(flt_v,flt_p);
- sp rintf(flt_str,"%5.4f",flt_v); // 精度是整數五位小數四位
- if(strlen(flt_str)>10) // 範圍(用位數)
- {
- p rintf("out of range\n");
- break;
- }
- get_value(&flt_str[0],&result->up,&result->low);
- break;
- }
- uf(result);
- return -1;
- }
- void show_out(const char* chr,struct fn_ a) //顯示
- {
- p rintf("%s ", chr);
-
- if(a.up%a.low == 0)
- p rintf("%ld\n",a.up/a.low); // 只有 整數時
- else
- if(a.up>a.low)
- p rintf("%ld %ld/%ld\n",a.up/a.low,a.up%a.low,a.low); //含整數 + 分字分母
- else
- p rintf("%ld/%ld\n",a.up,a.low); //分子分母
- }
- int main(int argc, char *argv[])
- {
- char op='m',data_in[200];
- result.up=0;
- result.low=1;
- while(op!='q')
- {
- show_out("result so far is",result);
- scanf("%s",data_in);
- if(scan_data(&data_in[0],&op,&data))
- {
- if(!do_next_op(&result,&op,&data))
- p rintf("wrong data input\n");
- }
- else
- p rintf("wrong data input\n");
- }
- show_out("final ressult is",result);
- system("PAUSE");
- return 0;
- }
複製代碼 ... |