大神们来帮帮忙

北纬已北有bug 2019-11-21 09:29:48
我做了一个小小的程序,就是让用户在JTextArea里输入一个函数,然后我在JPanel里将函数图像给画出来。画图像的方式就是通过用户输入的函数不断改变x的值得到对应的y的值,然后描点就可以画出函数图像了。
比如说用户输入一个函数为 y=x+1(其实用户只输入x+1就行了,y我在前面写上了),然后我想把用户输入的x+1放到paint里面,让他进行画图,但是用户输入的毕竟是字符串,我应该如何将它放到paint里进行描点呢?
下面第一个图是用GUI写出来的,用户可以在里面输入函数,右边是画图像的。
第二个图是paint里面的部分代码,就是描点画函数图像的,问题我也写在图片上了。我本来打算用Double.parseDouble来将字符转化为double类型,但里面毕竟有x,是无法转换的,会报异常。
大神们我该怎么办?有没有什么方法或建议?我刚开始学java,算是入门,有些东西我实在弄不出来了,只能来求助,如果有哪里弄得不好求大神指点,感谢!!!

...全文
99 点赞 收藏 8
写回复
8 条回复
北纬已北有bug 2019年11月24日
引用 1 楼 qybao 的回复:
这个不是那么简单的,要识别函数
可以试试用正则,判断符合什么类型函数,然后调用相应的函数方法
for exsample
interface Fn { //定义函数接口
int fn(int... args);//函数方法
}
Fn fn; //定义函数接口变量
//String s = jtextarea.getText();
String s = “3x + 2”; //假设画面输入
String reg0 = “\\s*?([+-])\\s*?(\\d*?)\\s*”;
String reg1 = “^(\\d*?)([xX)(” + reg0+ “)$”;
if (s.matches(reg1)) {
int a = Integer.parseInt(s.replacAll(reg1, “$1”)); //正则提取3x + 2中的3
String s2 = s.replaceAll(reg1, “$3”);
String ss = s2.replaceAll(reg0, ”$1”); //正则提取3x + 2中的+
int b = Integer.parseInt(s2.replaceAll(reg0, “$2”)); //提取3x +2中的2
if (“-“.equase(ss)) b = -b; //如果提取的+是-
fn = (a1, x, b1)->{ //函数接口实例化
return a1*x+b1;
};
for (int x=-5; x<=5; x++) { //x循环
int y = fn.fn(a, x, b); //计算y点
...//画线
}
}
已经结贴给分了,感谢!用正则已经做好了一次函数的画法!后面再继续做其他类型的函数,不过难点还是正则表达式的书写,这太烧脑了,要考虑很多种情况。
回复 点赞
北纬已北有bug 2019年11月23日
引用 7 楼 qybao的回复:
什么复制粘贴,这只是告诉你思路,写个sample代码,你还想拿来就用? 手机码这么多字类,要是电脑还真可以给你写段代码例子
不是说你啊,我说5楼直接把你的回答复制粘贴了,和你回答的一模一样
回复 点赞
北纬已北有bug 2019年11月22日
引用 2 楼 qybao的回复:
正则笔误,修改一下 String reg1 = “^(\\d*?)([xX])(” + reg0+ “)$”;
好嘞,这个我还不太懂,回头我查资料然后试一试,感谢!
回复 点赞
qybao 2019年11月22日
什么复制粘贴,这只是告诉你思路,写个sample代码,你还想拿来就用? 手机码这么多字类,要是电脑还真可以给你写段代码例子
回复 点赞
qybao 2019年11月22日
正则笔误,修改一下 String reg1 = “^(\\d*?)([xX])(” + reg0+ “)$”;
回复 点赞
qybao 2019年11月22日
这个不是那么简单的,要识别函数 可以试试用正则,判断符合什么类型函数,然后调用相应的函数方法 for exsample interface Fn { //定义函数接口 int fn(int... args);//函数方法 } Fn fn; //定义函数接口变量 //String s = jtextarea.getText(); String s = “3x + 2”; //假设画面输入 String reg0 = “\\s*?([+-])\\s*?(\\d*?)\\s*”; String reg1 = “^(\\d*?)([xX)(” + reg0+ “)$”; if (s.matches(reg1)) { int a = Integer.parseInt(s.replacAll(reg1, “$1”)); //正则提取3x + 2中的3 String s2 = s.replaceAll(reg1, “$3”); String ss = s2.replaceAll(reg0, ”$1”); //正则提取3x + 2中的+ int b = Integer.parseInt(s2.replaceAll(reg0, “$2”)); //提取3x +2中的2 if (“-“.equase(ss)) b = -b; //如果提取的+是- fn = (a1, x, b1)->{ //函数接口实例化 return a1*x+b1; }; for (int x=-5; x<=5; x++) { //x循环 int y = fn.fn(a, x, b); //计算y点 ...//画线 } }
回复 点赞
北纬已北有bug 2019年11月22日
引用 5 楼 weixin_40599844的回复:
这个不是那么简单的,要识别函数
可以试试用正则,判断符合什么类型函数,然后调用相应的函数方法
for exsample
interface Fn { //定义函数接口
int fn(int... args);//函数方法
}
Fn fn; //定义函数接口变量
//String s = jtextarea.getText();
String s = “3x + 2”; //假设画面输入
String reg0 = “\\s*?([+-])\\s*?(\\d*?)\\s*”;
String reg1 = “^(\\d*?)([xX)(” + reg0+ “)$”;
if (s.matches(reg1)) {
int a = Integer.parseInt(s.replacAll(reg1, “$1”)); //正则提取3x + 2中的3
String s2 = s.replaceAll(reg1, “$3”);
String ss = s2.replaceAll(reg0, ”$1”); //正则提取3x + 2中的+
int b = Integer.parseInt(s2.replaceAll(reg0, “$2”)); //提取3x +2中的2
if (“-“.equase(ss)) b = -b; //如果提取的+是-
fn = (a1, x, b1)->{ //函数接口实例化
return a1*x+b1;
};
for (int x=-5; x<=5; x++) { //x循环
int y = fn.fn(a, x, b); //计算y点
...//画线
}
}
这是复制粘贴吗?我的天
回复 点赞
weixin_40599844 2019年11月22日
这个不是那么简单的,要识别函数
可以试试用正则,判断符合什么类型函数,然后调用相应的函数方法
for exsample
interface Fn { //定义函数接口
int fn(int... args);//函数方法
}
Fn fn; //定义函数接口变量
//String s = jtextarea.getText();
String s = “3x + 2”; //假设画面输入
String reg0 = “\\s*?([+-])\\s*?(\\d*?)\\s*”;
String reg1 = “^(\\d*?)([xX)(” + reg0+ “)$”;
if (s.matches(reg1)) {
int a = Integer.parseInt(s.replacAll(reg1, “$1”)); //正则提取3x + 2中的3
String s2 = s.replaceAll(reg1, “$3”);
String ss = s2.replaceAll(reg0, ”$1”); //正则提取3x + 2中的+
int b = Integer.parseInt(s2.replaceAll(reg0, “$2”)); //提取3x +2中的2
if (“-“.equase(ss)) b = -b; //如果提取的+是-
fn = (a1, x, b1)->{ //函数接口实例化
return a1*x+b1;
};
for (int x=-5; x<=5; x++) { //x循环
int y = fn.fn(a, x, b); //计算y点
...//画线
}
}
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告