黑马程序员技术交流社区

标题: 来基础班三天了,现在遇到了一个问题,(计算器) [打印本页]

作者: nine789    时间: 2015-4-28 23:33
标题: 来基础班三天了,现在遇到了一个问题,(计算器)
本帖最后由 nine789 于 2015-4-29 22:09 编辑

来基础班三天了,现在遇到了一个问题,以前绝对想不到,打死我我也做不出来一个计算器

遇到一个问题,求大神帮忙解答。
我想要做的是一个计算器
但是运行后结果是错误的。
后来改了改,还是不行。。。。下面的代码是我修改后的,修改了一半。。。。求解答
  1. import java.util.Scanner;
  2. class CounterDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Scanner a1=new Scanner(System.in);
  7.                 System.out.print("输入两个数值,进行计算(只可以计算:+、-、*、/、%、^、&等\n只可计算两个数字,请输入计算公式)");
  8.                 int x=a1.nextInt();



  9.                 Scanner a3=new Scanner(System.in);
  10.                 int y=a3.nextInt();

  11.                 Scanner a2=new Scanner(System.in);
  12.                 String z=a2.nextLine();


  13.                 getCounter(x,y,z);
  14.                 //getCounter(z);
  15.                 //getCounter(y);
  16.         }

  17.         public static void getCounter(int x,int y,String z)
  18.         {
  19.                 //String z ="null";
  20.                 switch(z)
  21.                 {
  22.                         case "+":
  23.                                 System.out.println("x"+"z"+"y="+(x+y));
  24.                                 break;
  25.                         case "-":
  26.                                 System.out.println("x"+"z"+"y="+(x-y));
  27.                                 break;
  28.                         case "*":
  29.                                 System.out.println("x"+"z"+"y="+(x*y));
  30.                                 break;
  31.                         case "/":
  32.                                 System.out.println("x"+"z"+"y="+(x/y));
  33.                                 break;
  34.                         case "%":
  35.                                 System.out.println("x"+"z"+"y="+(x%y));
  36.                                 break;
  37.                         case "^":
  38.                                 System.out.println("x"+"z"+"y="+(x^y));
  39.                                 break;
  40.                         case "&":
  41.                                 System.out.println("x"+"z"+"y="+(x&y));
  42.                                 break;
  43.                         default:
  44.                                 System.out.println("输入的为非法数值,回火星上去吧");
  45.                 }
  46.         }
  47. }
复制代码

没有写注释,应该都能看懂吧?   要是看不懂的话,,,,,,那我随后补上
如果不用方法封装的话,或许可以实现这个计算器,不用方法封装,就不存在 数据类型不匹配的结果了


***************************************************************************************
下面是 正确的代码,可以运行的。(没有用方法封装)不用方法封装的话,是可以运行的。
  1. import java.util.Scanner;
  2. class CounterDemo12
  3. {
  4.         public static void main(String [] args)
  5.                 {
  6.                                 Scanner h = new Scanner (System.in);
  7.                                 System.out.println("请输入一个数字:");
  8.                                 int x = h.nextInt();

  9.                                 Scanner h2 = new Scanner (System.in);
  10.                                 System.out.println("请输入+、-、*、/、%、^、&进行运算:");
  11.                                 String y = h2.nextLine();

  12.                                 Scanner h3 = new Scanner (System.in);
  13.                                 System.out.println("请输入另一个数字:");
  14.                                 int z = h3.nextInt();
  15.                                 System.out.println("*************下面显示运算结果*************");
  16.                                 switch (y)
  17.                                 {
  18.                                 case "+":
  19.                                         System.out.println(x+"+"+z+"="+(x+z));
  20.                                         break;
  21.                                 case "-":
  22.                                         System.out.println(x+"-"+z+"="+(x-z));
  23.                                         break;
  24.                                 case "*":
  25.                                         System.out.println(x+"*"+z+"="+(x*z));
  26.                                         break;
  27.                                 case "/":
  28.                                         System.out.println(x+"/"+z+"="+(x/z));
  29.                                         break;
  30.                                 case "%":
  31.                                         System.out.println(x+"%"+z+"="+(x%z));
  32.                                         break;
  33.                                 case "^":
  34.                                         System.out.println(x+"^"+z+"="+(x^z));
  35.                                         break;
  36.                         
  37.                                 case "&":
  38.                                         System.out.println(x+"&"+z+"="+(x&z));
  39.                                         break;
  40.                                 default:
  41.                                         System.out.println("输入错误,回你的火星上去吧!");
  42.                                         break;
  43.                 }
  44.         }
  45. }
复制代码







其实 Scanner h  和Scanner   h3     是可以使用一个对象的,因为他们都是int  类型!

作者: nine789    时间: 2015-4-28 23:43
有没有人帮忙解答啊,大神赶快出来了

版主要给你们加技术分了   技术分了
作者: czhmike    时间: 2015-4-28 23:55
加油加油
作者: 鸡脑壳    时间: 2015-4-28 23:57
你把switch语句中的 输出语句搞成这个格式。。。         
System.out.println(x+z+y+"="+(x-y));
你加双引号,系统直接输出了。。。
作者: nine789    时间: 2015-4-29 00:06
鸡脑壳 发表于 2015-4-28 23:57
你把switch语句中的 输出语句搞成这个格式。。。         
System.out.println(x+z+y+"="+(x-y));
你加双 ...

不是 输出的问题,是输入时的问题,如果不封装方法的话,或许可是实现。
但是现在用了方法封装重新调用,因为String 类型里面包含空格,和回车   所以在键盘输入的时候,会遇到问题,这不是输出的问题,是输入数据时的问题
作者: nine789    时间: 2015-4-29 00:08
本帖最后由 nine789 于 2015-4-29 00:09 编辑

下面是可以编译,可以运行的代码

就是在输入数据的时候 因为String 包含的有 空格 和回车
所以再输入的时候,会出现问题
求大神解决
  1. import java.util.Scanner;
  2. class CounterDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Scanner a1=new Scanner(System.in);
  7.                 System.out.print("输入两个数值,进行计算(只可以计算:+、-、*、/、%、^、&等\n只可计算两个数字,请输入计算公式)");
  8.                 int x=a1.nextInt();
  9.                 String z=a1.nextLine();
  10.                 int y=a1.nextInt();



  11.                 /*Scanner a3=new Scanner(System.in);
  12.                 int y=a3.nextInt();

  13.                 Scanner a2=new Scanner(System.in);
  14.                 String z=a2.nextLine();
  15. */

  16.                 getCounter(x,z,y);//  不用
  17.                 //getCounter(z);
  18.                 //getCounter(y);
  19.         }

  20.         public static void getCounter(int x,String z,int y)
  21.         {
  22.                 //String z ="null";
  23.                 switch(z)
  24.                 {
  25.                         case "+":
  26.                                 System.out.println("x"+"z"+"y="+(x+y));
  27.                                 break;
  28.                         case "-":
  29.                                 System.out.println("x"+"z"+"y="+(x-y));
  30.                                 break;
  31.                         case "*":
  32.                                 System.out.println("x"+"z"+"y="+(x*y));
  33.                                 break;
  34.                         case "/":
  35.                                 System.out.println("x"+"z"+"y="+(x/y));
  36.                                 break;
  37.                         case "%":
  38.                                 System.out.println("x"+"z"+"y="+(x%y));
  39.                                 break;
  40.                         case "^":
  41.                                 System.out.println("x"+"z"+"y="+(x^y));
  42.                                 break;
  43.                         case "&":
  44.                                 System.out.println("x"+"z"+"y="+(x&y));
  45.                                 break;
  46.                         default:
  47.                                 System.out.println("输入的为非法数值,回火星上去吧");
  48.                 }
  49.         }
  50. }
复制代码




作者: 日出pk朝阳    时间: 2015-4-29 00:24
不会。。。
作者: qian0217wei    时间: 2015-4-29 00:25
switch 不支持字符串作为条件,你可尝试用枚举类型写
作者: winelx    时间: 2015-4-29 00:28
也就是路过看看
作者: 鸡脑壳    时间: 2015-4-29 00:40
nine789 发表于 2015-4-29 00:08
下面是可以编译,可以运行的代码

就是在输入数据的时候 因为String 包含的有 空格 和回车

这是你代码是这样写的
你这几条语句意思表示

(省略一段话)x(回车)
y(回车)
z(回车)
这是你代码表示的


而你的思路似乎是:
想用String类型一次性输入
这样的话就只需要留下
然后把这个String类分解成字符数组:char[] chs = z.toCharArray();
然后在对字符数组里的值或者符号进行判断运算就可以了










作者: One_M    时间: 2015-4-29 01:26
public static void getCounter(int x,int y,String z)   正常输入不是 符号在中间么...这个是不是顺序不对啊 具体没去编译...
作者: wnk77521    时间: 2015-4-29 02:22
  1. package com.itheima;

  2. import java.util.Scanner;

  3. class Test21 {
  4.         public static void main(String[] args) {
  5.                 Scanner sc = new Scanner(System.in);
  6.                 System.out.print("输入两个数值,进行计算(只可以计算:+、-、*、等\n只可计算两个数字,请输入计算公式)");
  7.                 int x = sc.nextInt();
  8.                 Scanner sc1 = new Scanner(System.in);
  9.                 String y = sc1.nextLine();
  10.                 Scanner sc2 = new Scanner(System.in);
  11.                 int z = sc2.nextInt();
  12.                 getCounter(x, y, z);

  13.         }

  14.         private static void getCounter(int x, String y, int z) {
  15.                 switch (y) {
  16.                 case "+":
  17.                         System.out.println(x + "+" + z + "=" + (x + z));
  18.                         break;
  19.                 case "-":
  20.                         System.out.println(x + "-" + z + "=" + (x - z));
  21.                         break;
  22.                 case "*":
  23.                         System.out.println(x + "*" + z + "=" + (x * z));
  24.                         break;
  25.                 case "/":
  26.                         System.out.println(x + "/" + z + "=" + (x / z));
  27.                         break;
  28.                 case "%":
  29.                         System.out.println(x + "%" + z + "=" + (x % z));
  30.                         break;
  31.                 case "^":
  32.                         System.out.println(x + "^" + z + "=" + (x ^ z));
  33.                         break;
  34.                 case "&":
  35.                         System.out.println(x + "&" + z + "=" + (x & z));
  36.                         break;
  37.                 default:
  38.                         System.out.println("输入的为非法数值,回火星上去吧");
  39.                 }
  40.         }

  41. }
复制代码

球给点分吧 谢谢
作者: fc389119336    时间: 2015-4-29 08:12
第三天就能做计算器啦。。。腻害啊。
作者: maryuet    时间: 2015-4-29 08:38
就是啊,三天就能做计算器啦,是不是基础班潜藏了很多牛人。。。
作者: yearn    时间: 2015-4-29 09:18
菜鸟围观!
作者: 13699266500    时间: 2015-4-29 09:49
看看!!!!
作者: 大兵在海边    时间: 2015-4-29 11:44
switch不能判断字符串吧?我觉得你用if(str.equals())试试
作者: 1017161726    时间: 2015-4-29 12:36
哥,你基础班三天就学了Scanner???  是不是真的啊?
作者: ShadowDancer    时间: 2015-4-29 14:01
switch不可以接收String

作者: 大西洋    时间: 2015-4-29 16:18
本帖最后由 大西洋 于 2015-4-29 16:33 编辑

直接输入公式计算结果的话,用 Python 可以做到~
Java写的话,需要配合GUI和键盘事件~  键盘点击后再把完整的公式显示出来;我写了一下基础代码(无GUI),如下:其实和你写的差不多,呵呵,只是没有给方法传参数,接收动态输入;
  1. import java.util.Scanner;

  2. class CalcTest {
  3.         
  4.         public void calc(){
  5.                 try {
  6.                         Scanner scan = new Scanner(System.in);
  7.                         System.out.print("请输入第一个数:      ");
  8.                         float num1 = scan.nextFloat();
  9.                         System.out.print("运算符 +、-、*、/:");
  10.                         String ca = scan.next();
  11.                         System.out.print("请输入第二个数:        ");
  12.                         float num2 = scan.nextFloat();
  13.                         //判断运算符
  14.                         switch (ca) {
  15.                         case "+":
  16.                                 System.out.println(num1+" + "+num2+" = "+(num1 + num2));
  17.                                 break;
  18.                         case "-":
  19.                                 System.out.println(num1+" - "+num2+" = "+(num1 - num2));
  20.                                 break;
  21.                         case "*":
  22.                                 System.out.println(num1+" * "+num2+" = "+(num1 * num2));
  23.                                 break;
  24.                         case "/":
  25.                                 System.out.println(num1+" / "+num2+" = "+(num1 / num2));
  26.                                 break;
  27.                         default:
  28.                                 System.out.println("运算符输入错误~!");
  29.                                 break;
  30.                         }
  31.                 } catch (Exception e) {
  32.                         System.out.println("输入错误,请您输入正确的数字");
  33.                 }
  34.         }
  35.         
  36.         public static void main(String[] args) {
  37.                 new CalcTest().calc();
  38.         }
  39. }
复制代码

分别输入123 /
2
输出结果:
  1. 请输入第一个数:     123
  2. 运算符 +、-、*、/:   /
  3. 请输入第二个数:      2
  4. 123.0 / 2.0 = 61.5
复制代码












作者: nine789    时间: 2015-4-29 21:47
大西洋 发表于 2015-4-29 16:18
直接输入公式计算结果的话,用 Python 可以做到~
Java写的话,需要配合GUI和键盘事件~  键盘点击后再把完整 ...

你这个代码,有一部分 还没学到,所以暂时写不了。我也有点看不懂
作者: nine789    时间: 2015-4-29 21:49
ShadowDancer 发表于 2015-4-29 14:01
switch不可以接收String

switch  可以接受char  。
应该可以接受String的   ,我试过,可以编译通过,也可以输入数值,就是在输入数值的时候,会出现错误
也就是说 ,开始输入的int  整型数字是可以的,但是  不能连续,

所以  如果不用方法封装的话,是可以写出来的
作者: nine789    时间: 2015-4-29 21:51
1017161726 发表于 2015-4-29 12:36
哥,你基础班三天就学了Scanner???  是不是真的啊?

只是会用而已,浩哥(我们的导师)就给我们举了几个例子,多练练  就会了
而且  要结合 API 开发文档看的话,效果更好。
而且后期出师的话,也都要用到开发文档自己学的
作者: nine789    时间: 2015-4-29 21:52
ShadowDancer 发表于 2015-4-29 14:01
switch不可以接收String

只是会用而已,浩哥(我们的导师)就给我们举了几个例子,多练练  就会了
而且  要结合 API 开发文档看的话,效果更好。
而且后期出师的话,也都要用到开发文档自己学的
作者: nine789    时间: 2015-4-29 21:54
鸡脑壳 发表于 2015-4-28 23:57
你把switch语句中的 输出语句搞成这个格式。。。         
System.out.println(x+z+y+"="+(x-y));
你加双 ...

加双引号是 String  字符串的连接符
输出格式是: 例如    5+5=10
作者: nine789    时间: 2015-4-29 21:57
qian0217wei 发表于 2015-4-29 00:25
switch 不支持字符串作为条件,你可尝试用枚举类型写

switch  我试过  能接受String   枚举还没学过  ,你好像是大神啊   枚举都知道
作者: nine789    时间: 2015-4-29 21:58
One_M 发表于 2015-4-29 01:26
public static void getCounter(int x,int y,String z)   正常输入不是 符号在中间么...这个是不是顺序不 ...

这个 只要是前面的 顺序 后面的顺序一样就行
作者: nine789    时间: 2015-4-29 22:00
wnk77521 发表于 2015-4-29 02:22
球给点分吧 谢谢

虽然能编译通过,也能运行,但是再输入数字 和字符的时候  出错,不信的话  你可以试一下。
如果 不用方法封装的话  ,是可以的
作者: nine789    时间: 2015-4-29 22:01
鸡脑壳 发表于 2015-4-29 00:40
这是你代码是这样写的
  • Scanner a1=new Scanner(System.in);

  • 数组还没学到,不会
    作者: wnk77521    时间: 2015-4-29 22:12
    nine789 发表于 2015-4-29 22:00
    虽然能编译通过,也能运行,但是再输入数字 和字符的时候  出错,不信的话  你可以试一下。
    如果 不用方 ...

    这个肯定有弊端 我只是在你的代码上稍微改进了一下 你得一个一个输入 先输入一个数字 回车然后一个符号回车然后一个数字
    作者: 南方小道士    时间: 2015-4-29 22:16
    好强,第三天就这样
    作者: nine789    时间: 2015-4-29 22:21
    南方小道士 发表于 2015-4-29 22:16
    好强,第三天就这样

    你也可以的哦:lol
    作者: xfliyy    时间: 2015-4-29 22:36
    第3天:funk:
    作者: nine789    时间: 2015-4-29 22:49
    xfliyy 发表于 2015-4-29 22:36
    第3天

    是啊 是啊   
    你也可以的:lol




    欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2