黑马程序员技术交流社区

标题: 入门的一道题,觉得自己写的有点蠢。求指教 [打印本页]

作者: w13832027    时间: 2015-1-21 12:41
标题: 入门的一道题,觉得自己写的有点蠢。求指教
  1. package com.itheima;
  2. /*
  3. *  从键盘接受一个数字,打印该数字表示的时间,最大单位到天,例如:

  4.         键盘输入6,打印6秒;       
  5.         键盘输入60,打印1分;
  6.         键盘输入66,打印1分6秒;
  7.         键盘输入666,打印11分6秒;
  8.         键盘输入3601,打印1小时1秒
  9. */
  10. /*
  11. * 思路:1.声明扫描仪用于接收用户输入的数字,2.利用if语句来判断用户输入的数据,根据公式运算后打印结果并满足需求。
  12. *                 3.使用"取余%"和"除/"来计算,并且程序中仅以秒为单位。4.使用for循环实现让用户自由选择是否继续运行程序,使程序更加人性化。
  13.         需要用到的数据;60秒为1分,3600秒为1小时,86400秒为1天。
  14. */

  15. import java.util.Scanner;        //导入一个扫描仪,用于实现程序与用户的互动。
  16. public class Test4 {
  17.         public static void main(String[] args){       
  18.                 Scanner in=new Scanner(System.in);         //声明一个扫描仪,创建对象in。
  19.                 for(int a=1;;a++){                //为避免测试时不断的运行,所以采用了for循环来实现自由退出和继续。
  20.                         System.out.println("请输入需要转换的秒数");        //与用户互动,提示输入。
  21.                         int num=in.nextInt();                //接受用户所输入的数据。
  22.                         if(num<60){                                        //判断用户输入的数据,此程序中只以秒为单位。
  23.                                 System.out.println(num+"秒");
  24.                         }
  25.                         else if(num>=60&&num<3600){               
  26.                                 System.out.println(num/60+"分"+num%60+"秒");       
  27.                                 //根据公式计算,60秒为1分,3600秒为1小时,86400秒为1天
  28.                         }
  29.                         else if(num>=3600&&num<86400){               
  30.                                         if(num%3600/60==0){                //此语句用于实现需求,只打印不为0的数据。
  31.                                                 System.out.println(num/3600+"小时"+num%3600%60+"秒");
  32.                                 }
  33.                                 else if(num%3600%60==0){        //此语句用于实现需求,只打印不为0的数据。
  34.                                                 System.out.println(num/3600+"小时"+num%3600/60+"分");
  35.                                 }
  36.                                 else{
  37.                                                 System.out.println(num/3600+"小时"+num%3600/60+"分"+num%3600%60+"秒");
  38.                                 }
  39.                         }
  40.                         else if(num>=86400){
  41.                                 if(num%86400/3600==0){                //此语句用于实现需求,只打印不为0的数据。
  42.                                                 System.out.println(num/86400+"天"+num%86400%3600/60+"分"+num%86400%60+"秒");
  43.                                 }
  44.                                 else if(num%86400%3600/60==0){        //此语句用于实现需求,只打印不为0的数据。
  45.                                                 System.out.println(num/86400+"天"+num%86400/3600+"小时"+num%86400%60+"秒");
  46.                                 }
  47.                                 else if(num%86400%60==0){                //此语句用于实现需求,只打印不为0的数据。
  48.                                                 System.out.println(num/86400+"天"+num%86400/3600+"小时"+num%86400%3600/60+"分");
  49.                                 }
  50.                                 else{
  51.                                                 System.out.println(num/86400+"天"+num%86400/3600+"小时"+
  52.                                                         num%86400%3600/60+"分"+num%86400%60+"秒");
  53.                                 }
  54.                         }
  55.                                 System.out.println("想退出请输入1或者点右上角的叉,想继续请随便输入个数字");
  56.                                 int tuichu=in.nextInt();
  57.                                 if(tuichu==1){                        //此语句用于实现用户自由选择是否继续,避免反复运行的麻烦。
  58.                                         break;
  59.                                 }
  60.                 }
  61.         }
  62. <p style="line-height: 30px; text-indent: 2em;"></p><p style="line-height: 30px; text-indent: 2em;"></p><p style="line-height: 30px; text-indent: 2em;"></p><p style="line-height: 30px; text-indent: 2em;"></p><p style="line-height: 30px; text-indent: 2em;"></p><p style="line-height: 30px; text-indent: 2em;"></p><p style="line-height: 30px; text-indent: 2em;"></p><p style="line-height: 30px; text-indent: 2em;"></p>}
复制代码
觉得好繁琐。是不是有更简单的方式来实现需求呢?


作者: w13832027    时间: 2015-1-21 12:42
囧。没注意排版的问题。好乱。。
作者: 汝建国    时间: 2015-1-21 13:25
这时那个10道题把,你写这老些,也难为你了
作者: fluency    时间: 2015-1-21 13:33
本帖最后由 fluency 于 2015-1-21 13:34 编辑

分享个我的吧,其实这个就当是60进制24进制
  1. package com.itheima;

  2. import java.util.Scanner;

  3. /**
  4. * @author Mr
  5. * 从键盘接受一个数字,打印该数字表示的时间,最大单位到天
  6. */
  7. public class Test3 {
  8.         public static void main(String[] args) {
  9.                 System.out.println("请输入一个整数(1-" + Integer.MAX_VALUE + ")");
  10.                 Scanner scanner = new Scanner(System.in);
  11.                 int num;
  12.                 try {
  13.                         num = scanner.nextInt();
  14.                 } catch (Exception e) {
  15.                         // TODO: handle exception
  16.                         throw new RuntimeException("输入非法!");
  17.                 } finally {
  18.                         scanner.close();
  19.                 }
  20.                 if (num <= 0)
  21.                         throw new RuntimeException("输入非法!");
  22.                 System.out.println(getDate(num));

  23.         }

  24.         /**
  25.          * @param num
  26.          * 传入共计多少秒
  27.          * @return
  28.          * 根据秒数返回对应X天X小时X秒的字符串
  29.          */
  30.         public static String getDate(int num) {
  31.                
  32.                 int second = num % 60;
  33.                 num = num / 60;
  34.                 int min = num % 60;
  35.                 num = num / 60;
  36.                 int hour = num % 12;
  37.                 num = num / 12;
  38.                 int day = num;

  39.                 StringBuffer strbuf = new StringBuffer();
  40.                 if (day != 0) {
  41.                         strbuf.append(day + "天");
  42.                 }
  43.                 if (hour != 0) {
  44.                         strbuf.append(hour + "小时");
  45.                 }
  46.                 if (min != 0) {
  47.                         strbuf.append(min + "分");
  48.                 }
  49.                 if (second != 0) {
  50.                         strbuf.append(second + "秒");
  51.                 }
  52.                 return strbuf.toString();

  53.         }
  54. }
复制代码

作者: xiaoyi    时间: 2015-1-21 13:37
学习一下
作者: w13832027    时间: 2015-1-21 13:38
汝建国 发表于 2015-1-21 13:25
这时那个10道题把,你写这老些,也难为你了

:'(。还是太年轻了
作者: w13832027    时间: 2015-1-21 13:41
fluency 发表于 2015-1-21 13:33
分享个我的吧,其实这个就当是60进制24进制

谢了。我刚学完面向对象,后面很多还没涉及。只能用if语句慢慢推算。你这代码我就当研究材料了。。。。:victory:
作者: w13832027    时间: 2015-1-21 13:42
汝建国 发表于 2015-1-21 13:25
这时那个10道题把,你写这老些,也难为你了

学的少,就那三板斧轮着使。。
作者: 梦开始的地方    时间: 2015-1-21 16:13
那就继续学,学得多了,就不会有这么多行
作者: 邓士林    时间: 2015-1-21 16:47
也是时间之间的一个转换关系,楼主的直接用if判断,确实太繁琐,这个好点,但是num = num / 12;貌似不对吧!一天是24小时,不是12小时吧!


作者: w13832027    时间: 2015-1-21 16:58
邓士林 发表于 2015-1-21 16:47
  •      int second = num % 60;
  •                 num = num / 60;
  •                 int min = num  ...

  • 额。。我写的代码中只以秒为单位,怕混淆了。一天就是86400秒。。。
    作者: xiao飞    时间: 2015-1-21 18:19
    大牛啊,你能写成这样,真不知道你当时思维能力有多强
    作者: w13832027    时间: 2015-1-21 19:02
    我纠结的是这种测试题的完成要求是什么?
    我用最基础的if结构可以实现,虽然有很多缺点比如维护啊易读啊之类的。。那这到底算不算合格呢?
    还是说必须要像楼上那位大神的方式才行呢?
    作者: w13832027    时间: 2015-1-21 19:05
    xiao飞 发表于 2015-1-21 18:19
    大牛啊,你能写成这样,真不知道你当时思维能力有多强

    我更关心你的技术分怎么这么多,而等级却不高。。。
    作者: w13832027    时间: 2015-1-21 19:07
    xiao飞 发表于 2015-1-21 18:19
    大牛啊,你能写成这样,真不知道你当时思维能力有多强

    我更关心你的技术分怎么这么多,而等级却不高。。。
    作者: kakasa    时间: 2015-1-21 19:55
    1. public static void main(String[] args) throws Exception
    2.         {
    3.                 int num=new Scanner(System.in).nextInt();
    4.                 int s=0,m=0,h=0,d=0;//个代表秒,分,时,天。
    5.                
    6.                 if(num<60)
    7.                 {
    8.                         s=num;
    9.                         num=0;
    10.                 }
    11.                 else
    12.                 {
    13.                         s=num%60;
    14.                         num=(num-s)/60;
    15.                 }
    16.                
    17.                 if(num<60)
    18.                 {
    19.                         m=num;
    20.                         num=0;
    21.                 }
    22.                 else
    23.                 {
    24.                         m=num%60;
    25.                         num=(num-m)/60;
    26.                 }
    27.                
    28.                 if(num<24)
    29.                 {
    30.                         h=num;
    31.                         num=0;
    32.                 }
    33.                 else
    34.                 {
    35.                         h=num%24;
    36.                         d=(num-h)/24;
    37.                 }
    38.                
    39.                 System.out.println(d+"天"+h+"小时"+m+"分"+s+"秒");
    40.                
    41.         }
    复制代码

    作者: xiao飞    时间: 2015-1-21 21:24
    w13832027 发表于 2015-1-21 19:05
    我更关心你的技术分怎么这么多,而等级却不高。。。

    回了快两个月论坛,而且好多活动都参加了的 ,能不多嘛,而且每天必逛论坛
    作者: w13832027    时间: 2015-1-21 21:28
    xiao飞 发表于 2015-1-21 21:24
    回了快两个月论坛,而且好多活动都参加了的 ,能不多嘛,而且每天必逛论坛 ...

    你的经验已被我吸收!。
    作者: w13832027    时间: 2015-1-21 21:38
    kakasa 发表于 2015-1-21 19:55

    谢谢。代码的意思我明白了,比我那个简洁的多更易读。要满足需求还得加判断只输出不为0的结果。赞
    作者: yueye13    时间: 2015-1-21 21:46
    多回问题多发帖子:handshake:handshake:handshake
    作者: BEIKOU    时间: 2015-2-28 07:49
    学习一下

    作者: huanxiang0220    时间: 2015-2-28 08:07
    这是最简单的,但代码太多了,
    作者: huanxiang0220    时间: 2015-2-28 08:09
    听说利用字符串表示要简单点,你可以试一下
    作者: shuren2015    时间: 2015-2-28 19:49
    1. public class Test2 {

    2.         /**
    3.          * @param args
    4.          */
    5.         public static void main(String[] args) {
    6.                 // TODO Auto-generated method stub
    7.                 //提示用户输入
    8.         System.out.println("请输入你想要转换的秒数(必须为大于0的整数)");
    9.         //定义一个字符读取缓冲流
    10.                 BufferedReader bufr=null;
    11.                         try{
    12.                                 //读取键盘输入
    13.                                 bufr=new BufferedReader(new InputStreamReader(System.in));
    14.                                 String line=null;
    15.                                 //定义要转换的秒数的变量
    16.                                 int seconds=0;
    17.                                 //如果用户输入的值不符合int整数,则循环读取直到符合规则
    18.                                 while((line=bufr.readLine())!=null){
    19.                                         try{
    20.                                                 //如果不能转为int,则抛出NumberFormatException异常
    21.                                                 seconds=Integer.parseInt(line);
    22.                                                 //catch异常
    23.                                         }catch(Exception e){
    24.                                                 System.out.println("请按要求输入");
    25.                                                 //回到循环开始,重新等待用户输入
    26.                                                 continue;
    27.                                         }break;
    28.                                         //调用toDays方法获取要打印的字符串
    29.                                 }System.out.println(toDays(seconds));
    30.                         }catch(IOException e){
    31.                                 System.out.println(e.toString());
    32.                                 //关闭流
    33.                         }finally{
    34.                                 if(bufr!=null)
    35.                                         try{
    36.                                                 bufr.close();
    37.                                         }catch(IOException e){
    38.                                                 System.out.println(e.toString());
    39.                                         }
    40.                         }
    41.                         //实现将秒数转换为×天×时×分×秒格式
    42.         }public static String toDays(int seconds){
    43.                 //定义存储天,时,分,秒的int变量
    44.                 int day;
    45.                 int hour;
    46.                 int min;
    47.                 int second;
    48.                 //定义显示天,时,分,秒的字符串变量
    49.                 String daystr="";
    50.                 String hourstr="";
    51.                 String minstr="";
    52.                 String secondstr="";
    53.                 min=seconds/60;
    54.                 if(min>0){
    55.                         second=seconds%60;
    56.                         secondstr=second+"秒";
    57.                         hour=min/60;
    58.                         min=min%60;
    59.                         minstr=min+"分";
    60.                         if(hour>0){
    61.                                 day=hour/24;
    62.                                 hour=hour%24;
    63.                                 hourstr=hour+"时";
    64.                                 if(day>0){
    65.                                         daystr=day+"天";
    66.                                 }
    67.                         }
    68.                 }return daystr+hourstr+minstr+secondstr;
    69.         }
    70. }
    复制代码

    我也想了蛮久的
    作者: w239983684    时间: 2015-2-28 21:10
    支持楼主的学习态度。
    作者: 小泽    时间: 2015-3-1 10:05
    学习了              
    作者: 十万一千    时间: 2015-3-1 18:30
    自己也学着写了几句代码
    1. public static void main(String[] args) {
    2.                 while (true) {
    3.                         try {
    4.                                 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    5.                                 System.out.print(">>");
    6.                                 int var = new Integer(bufferedReader.readLine());
    7.                                 int t1 = var / 60;
    8.                                 int t2 = var % 60;
    9.                                 if (t1 < 60 && t1 > 0) {
    10.                                         System.out.print(t1 + "分");
    11.                                 } else if (t1 >= 60) {
    12.                                         System.out.print(t1 / 60 + "小时");
    13.                                 }
    14.                                 if (t2 != 0) {
    15.                                         System.out.print(t2 + "秒");
    16.                                 }
    17.                                 System.out.println();
    18.                         } catch (Exception e) {
    19.                                 e.printStackTrace();
    20.                         }
    21.                 }
    22.         }
    复制代码





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