EOJ-2891 多次函数

http://acm.cs.ecnu.edu.cn/problem.php?problemid=2891

题意:给出一个函数解析式,画出其在定义域及值域为[-20,20]内的函数图像

用一个数组记录每个次数前对应的系数。需要注意的是算出的函数值对数组下标的转换

 1 #include<map>
 2 #include<set>
 3 #include<list>
 4 #include<cmath>
 5 #include<ctime>
 6 #include<queue>
 7 #include<stack>
 8 #include<cctype>
 9 #include<cstdio>
10 #include<string>
11 #include<cstdlib>
12 #include<cstring>
13 #include<iostream>
14 #include<algorithm>
15 using namespace std;
16 char mat[41][41];
17 int ans[4];
18 void init(){
19     for(int i=0;i<=40;i++)
20         for(int j=0;j<=40;j++){
21             if(i==20){                            //初始化特别考虑第20列以及20行即可,注意原点为'+'
22                 if(j==20)mat[i][j]='+';
23                 else if(j==40) mat[i][j]='>';
24                 else mat[i][j]='-';
25                 continue;
26             }
27             if(j==20){
28                 if(i==0)mat[i][j]='^';
29                 else mat[i][j]='|';
30                 continue;
31             }
32             mat[i][j]='.';
33         }
34 }
35 void draw(){
36     for(int i=0;i<=40;i++){
37         for(int j=0;j<=40;j++)
38             putchar(mat[i][j]);
39         printf("\n");
40     }
41 }
42 void read(char *fx){
43     int len=strlen(fx);
44     int sym=1,temp=0;                        //sym表示符号,temp存放系数
45     memset(ans,0,sizeof(ans));                //初始化为0
46     for(int i=5;i<len;i++){
47         if(isdigit(fx[i])){
48             temp=temp*10+(fx[i]-'0')*sym;    //数字可能有多位
49             if(i==len-1)                    //对常数项的特殊处理,将0次幂对应的系数存入
50                 ans[0]=temp;
51         }
52         if(fx[i]=='+')
53             sym=1;
54         if(fx[i]=='-')
55             sym=-1;
56         if(fx[i]=='x'){                        //读到x时进行系数的处理
57             if(temp==0)                        //对省略系数1的特殊处理
58                 temp=sym;
59             if(fx[i+1]=='^'){
60                 ans[fx[i+2]-'0']=temp;        //将次幂数组存入对应系数
61                 i+=2;                        //记住要向后移位,跳过次幂的读入
62             }
63             else
64                 ans[1]=temp;                //对一次幂的特殊处理
65             temp=0;                            //清空系数
66         }
67     }
68 }
69 int F(int x){
70     int ret=0;
71     for(int i=0;i<4;i++)
72         ret+=ans[i]*pow(1.0*x,i);        //计算对应y值,ans下标表示次幂
73     return ret;
74 }
75 int main(){
76     char fx[30];
77     while(cin>>fx){
78         init();                            //初始化
79         read(fx);                        //读入数据,存入数组
80         for(int i=-20;i<=20;i++){
81             int pt=F(i);                //计算对应的y
82             if(pt>=-20 && pt<=20)
83                 mat[20-pt][i+20]='*';    //在图内则描点,注意y值是行,且向下会越来越小
84         }
85         draw();                            //画图
86     }
87     return 0;
88 }
View Code

 

 

posted on 2013-06-24 20:42  KimKyeYu  阅读(322)  评论(0编辑  收藏  举报

导航