A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. //用do while循环 和 switch语句写一个选课程序,输入1-5显示不同的课程
  2. import java.io.*;
  3. class XuanKe
  4. {
  5. public static void main(String[] args)throws IOException
  6. {
  7. int i;
  8. System.out.println("1:数学");
  9. System.out.println("2:语文");
  10. System.out.println("3:英语");
  11. System.out.println("4:物理");
  12. System.out.println("5:化学");
  13. do
  14. {
  15. System.out.println("请输入选择的课程号:");
  16. i = System.in.read();
  17. i=i-48;
  18. switch (i)
  19. {
  20. case 1:
  21. System.out.println("您选择的是数学课程");
  22. break;
  23. case 2:
  24. System.out.println("您选择的是语文课程");
  25. break;
  26. case 3:
  27. System.out.println("您选择的是英语课程");
  28. break;
  29. case 4:
  30. System.out.println("您选择的是物理课程");
  31. break;
  32. case 5:
  33. System.out.println("您选择的是化学课程");
  34. break;
  35. default:
  36. System.out.println("输入的数字i:"+i+",请输入1-5的数字");
  37. break;
  38. }
  39. }
  40. while (i>0 && i<6);
  41. }
  42. }
复制代码
运行结果:
1:数学
2:语文
3:英语
4:物理
5:化学
请输入选择的课程号:
2
您选择的是语文课程
请输入选择的课程号:
输入的数字i:-35,请输入1-5的数字

为什么输入1到5的数字的时候,最后的 i 值都是-35;为啥第二次循环没有让输入?

9 个回复

倒序浏览
  1. //用do while循环 和 switch语句写一个选课程序,输入1-5显示不同的课程
  2. import java.io.*;
  3. class XuanKe
  4. {
  5. public static void main(String[] args)throws IOException
  6. {
  7. int i;
  8. System.out.println("1:数学");
  9. System.out.println("2:语文");
  10. System.out.println("3:英语");
  11. System.out.println("4:物理");
  12. System.out.println("5:化学");
  13. do
  14. {
  15. System.out.println("请输入选择的课程号:");
  16. i = System.in.read();
  17. i=i-48;
  18. switch (i)
  19. {
  20. case 1:
  21. System.out.println("您选择的是数学课程");
  22. break;
  23. case 2:
  24. System.out.println("您选择的是语文课程");
  25. break;
  26. case 3:
  27. System.out.println("您选择的是英语课程");
  28. break;
  29. case 4:
  30. System.out.println("您选择的是物理课程");
  31. break;
  32. case 5:
  33. System.out.println("您选择的是化学课程");
  34. break;
  35. default:
  36. System.out.println("输入的数字i:"+i+",请输入1-5的数字");
  37. break;
  38. }
  39. }
  40. while (i>0 && i<6);//<FONT color=red>当你输入-35时,根据你写的重新复制i=i-48;,i就变成了13,只满足你switch结构的defalt语句,打印出来以后并不满足while里的条件,自然就跳出了循环
  41. </FONT>}
  42. }
复制代码
如果你希望可以反复输入可以这样写
  1. do
  2. {
  3. ........//你的代码
  4. if(i==0)//这条语句要放在switch外面,让你
  5. //输入-48的时候就结束循环.跳出.如果不
  6. //是,就继续输入.
  7. break;
  8. }while(true)
复制代码
回复 使用道具 举报
你键盘输入后,又把i-48,所以不管你输入1—5任何数字i-48的结果都是负数,不符合最后while循环的条件i>0 && i<6,所以第二次循环没有执行
回复 使用道具 举报

1、第一次你输入一个数字后,按了回车符对不对?
  ①第一次循环:假设你输入的是: 1 和回车  对应的是两个字符  ,他们的ascii分别是 49 和13
而i = System.in.read(); 只读取了一个字符'1'将它的ascii值49赋给了i,

  ②当第二次循环来了,还没有等你输入,System.in.read就将回车符值13读到i中,i=13-49=-35,自然
跳到 System.out.println("输入的数字i:" + i + ",请输入1-5的数字");  输出了
输入的数字i:-35,请输入1-5的数字

2、我的思路:
我用断点调试一步步的走,第二次走到i这里,还没有输入任何数据,i就等于13了,坑爹了,这个13哪里蹦出来的,
只能是我输入的啊?在想一想我输入了什么 i 和回车,我就明白了,一想13不是回车的Ascii码字吗,顿悟了,
再看你的System.in.read() ,你一次只读一个字符啊,无语了。。

3、你可以第一次什么值都不输入,只按个回车,看结果如何???是不是直接输出-35?(13-48)

4、改进方式很简单: 你只需要取每一行的第一个字符就就可以了(不读换行)。如果想更方便,可以使用Scanner读取文本
  import java.io.*;class XuanKe {
        public static void main(String[] args) throws IOException {
                int i;
                System.out.println("1:数学");
                System.out.println("2:语文");
                System.out.println("3:英语");
                System.out.println("4:物理");
                System.out.println("5:化学");
                do {
                        System.out.println("请输入选择的课程号:");
                        byte[] b=new byte[1024];
                    System.in.read(b);          //丢弃换行符
                    i=b[0];
                        i = i - 48;
                       
                        switch (i) {
                        case 1:
                                System.out.println("您选择的是数学课程");
                                break;
                        case 2:
                                System.out.println("您选择的是语文课程");
                                break;
                        case 3:
                                System.out.println("您选择的是英语课程");
                                break;
                        case 4:
                                System.out.println("您选择的是物理课程");
                                break;
                        case 5:
                                System.out.println("您选择的是化学课程");
                                break;
                        default:
                                System.out.println("输入的数字i:" + i + ",请输入1-5的数字");
                                break;
                        }
                       
                } while (i > 0 && i < 6);
        }
}






评分

参与人数 2技术分 +1 黑马币 +6 收起 理由
韦念欣 + 1 赞一个!
王红潮 + 6 很给力!

查看全部评分

回复 使用道具 举报
张世威 发表于 2012-7-20 23:29
1、第一次你输入一个数字后,按了回车符对不对?
  ①第一次循环:假设你输入的是: 1 和回车  对应的是两 ...

呵呵,俺明白了,谢谢啊!
回复 使用道具 举报
王红潮 发表于 2012-7-20 23:46
呵呵,俺明白了,谢谢啊!

我是来挣分的,:D,楼主,给点分吧。。
回复 使用道具 举报
应文 中级黑马 2012-7-21 03:41:00
7#
本帖最后由 应文 于 2012-7-21 10:11 编辑

import java.io.*;
class XuanKe
{
public static void main(String[] args)throws IOException
{
int i;
System.out.println("1:数学");
System.out.println("2:语文");
System.out.println("3:英语");
System.out.println("4:物理");
System.out.println("5:化学");
System.out.println("6:退出");  //添加6:退出循环
do
{
  System.out.println("请输入选择的课程号:");
  i = System.in.read();  //这里其实接受了三个字符,你输入的数字和\r,\n
  System.in.skip(2);       //所以这里需要过滤后两个字符,只接收你输入的选项字符,如果不使用System.in.skip()过滤后两个字符,那么,第二次循环的结果:就是回车键的值13-48=-35,然后-35符合default,所以直接停止循环

  i=i-48;
  switch (i)
  {
  case 1:
  System.out.println("您选择的是数学课程");
  break;
  case 2:
  System.out.println("您选择的是语文课程");
  break;
  case 3:
  System.out.println("您选择的是英语课程");
  break;
  case 4:
  System.out.println("您选择的是物理课程");
  break;
  case 5:
  System.out.println("您选择的是化学课程");
  break;
  
  case 6:
  System.out.println("已退出");
  System.exit(0);   //exit(0)方法退出程序
  default:
  System.out.println("输入的数字i:"+i+",请输入1-6的数字");
  break;
  }
}
while (i>0 && i<6);
}
}



你要实现的应该是这个结果吧

1.jpg (23.77 KB, 下载次数: 37)

正确结果

正确结果
回复 使用道具 举报
陶锋 发表于 2012-7-20 23:27
问题的关键在上面这段代码的输入课程号这里:
当你第一次输入一个数,比如1,然后紧跟着有一个回车吧,事实 ...

学习了....
回复 使用道具 举报
如果将do while改成for循环怎么做,请指教
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马