啊哈磊_编程从这里起步

标题: 【第四章第5节】动手试一试 题解 [打印本页]

作者: rosynirvana    时间: 2014-3-29 23:06
标题: 【第四章第5节】动手试一试 题解
首先是最直接的方法:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. int main()
  5. {
  6.   int i;
  7.   printf("2:00\n");
  8.   Sleep(1000);
  9.   system("cls");
  10.   i = 59;
  11.   while(i >= 10){
  12.     printf("1:%d", i);
  13.     Sleep(1000);
  14.     system("cls");
  15.     i = i - 1;
  16.   }
  17.   while(i >= 0){
  18.     printf("1:0%d", i);
  19.     Sleep(1000);
  20.     system("cls");
  21.     i = i - 1;
  22.   }
  23.   i = 59;
  24.   while(i >= 10){
  25.     printf("0:%d", i);
  26.     Sleep(1000);
  27.     system("cls");
  28.     i = i - 1;
  29.   }
  30.   while(i >= 0){
  31.     printf("0:0%d", i);
  32.     Sleep(1000);
  33.     system("cls");
  34.     i = i - 1;
  35.   }
  36.   
  37.   system("pause");
  38.   return 0;
  39. }
复制代码


先打印2:00,然后分成4段处理,1:59 - 1:10, 1:09 - 1:00, 0:59 - 0:10, 0:09 - 0:00
打印时间 - 暂停1秒 - 清屏 - 打印下一个时间
作者: rosynirvana    时间: 2014-3-29 23:20
这样做肯定不好,代码基本上是重复的两部分,编程不是打字练习,重复的代码越少越好
这里当然可以用一个两层嵌套的循环来合并代码,一个变量记录分钟,另一个变量记录秒
但是嵌套循环是下一节的内容,所以这里换一种方法:

用一个变量记录还剩下多少秒,然后求出当前的分和秒
例如剩余96秒
96 / 60 = 1, 用96秒能凑出一个1分钟,所以当前的分就是1
96%60 = 36,余数就是当前的秒

然后就是当秒小于10的时候,前面需要补一个0,这时候加一个if判断就行了
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. int main()
  5. {
  6.   int sec;
  7.   int a, b;
  8.   sec = 120;
  9.   
  10.   while(sec >= 0){
  11.     a = sec / 60;
  12.     b = sec % 60;
  13.     printf("%d:", a);
  14.     if(b < 10)
  15.       printf("0");
  16.     printf("%d", b);
  17.     Sleep(1000);
  18.     system("cls");
  19.     sec = sec - 1;
  20.   }
  21.   system("pause");
  22.   return 0;
  23. }
复制代码

作者: rosynirvana    时间: 2014-3-29 23:28
熟练、地道的C写法

可以利用printf的功能自动补一个0:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. int main()
  5. {
  6.   int sec;
  7.   for(sec = 120; sec >= 0; --sec){
  8.     printf("%d:%02d", sec / 60, sec % 60);
  9.     Sleep(1000);
  10.     system("cls");
  11.   }
  12.   system("pause");
  13.   return 0;
  14. }
复制代码

"%d:%02d"的含义:
%d就是熟悉的数字替代符, :就是打印出来的:, %02d是%d的一种变化,2表示宽度为2,0表示如果不到2个数字,就在前面用0补足

作者: 调试ing    时间: 2014-4-1 09:26
楼主好棒
作者: cad20020601    时间: 2014-4-1 18:09
不错,很好,鼓掌!
作者: 愛情風華    时间: 2014-4-20 22:48
本帖最后由 愛情風華 于 2014-4-20 23:08 编辑

[img]http://bbs.ahalei.com/data/attachment/album/201404/20/225157c3rqfww43w7fg6gy.png[/im
不好意思,請問一下,我用第2種解法,卻印出的倒數是這樣??無法跟第1種方法一樣似乎要再加一句才可以,
if (b<10) {
            printf("0%d\n",b);
        }  
-->
else  {
            printf("%d\n",b);
        }

這樣才可以


螢幕快照 2014-04-20 下午10.45.19.png (15.95 KB, 下载次数: 18)

螢幕快照 2014-04-20 下午10.45.19.png

作者: rosynirvana    时间: 2014-4-20 23:04
愛情風華 发表于 2014-4-20 22:48
不好意思,請問一下,我用第2種解法,卻印出的倒數是這樣??無法跟第1種方法一樣

不好意思,我看不懂您的截图,不明白这是为了说明什么

您的第二种解法是怎么写的?
我认真看了下上面我写的第二段的运行结果,没有问题的
作者: rosynirvana    时间: 2014-4-20 23:25
愛情風華 发表于 2014-4-20 22:48
http://bbs.ahalei.com/data/attachment/album/201404/20/225157c3rqfww43w7fg6gy.png[/im
不好意思,請問 ...

贴你写的完整代码吧
作者: 愛情風華    时间: 2014-4-20 23:37
本帖最后由 愛情風華 于 2014-4-21 00:02 编辑

#include <stdio.h>
#include <stdlib.h>
//#include<windows.h>  windows作業系統才有效

int main
{
    //用秒數計算
    int a,b,sec;
    sec=120;
    while (sec>=0) {
        a=sec/60;
        b=sec%60;
        printf("%d:",a);
        if (b<10) {
            printf("0%d\n",b);
        }   else  {
            printf("%d\n",b);
        }
        //Sleep(1000);
        //system("cls");
        sec=sec-1;
    }
        return 0;  
}


作者: rosynirvana    时间: 2014-4-20 23:58
愛情風華 发表于 2014-4-20 23:37
#include
#include
//#include  windows作業系統才有效

这段代码我把注释去掉,然后有两个错
一个是main后面缺括号,另一个是a没有声明,改了就好了,运行结果是正常的

所以这应该不是你遇到问题的代码?

另外你是不是在unix上面试验的?unix可以用
#include <unistd.h>
sleep(1);
system("clear");
代替你注释掉的那三句
作者: 愛情風華    时间: 2014-4-21 00:02
本帖最后由 愛情風華 于 2014-4-21 00:04 编辑

我用mac  的Xcode  run{:soso_e100:}這段代碼是後來加上去才有運行正常,未加上去之前就如同圖片一樣 ,秒數>10的會無法顯示秒數-->
else  {
            printf("%d\n",b);
        }

作者: rosynirvana    时间: 2014-4-21 00:16
本帖最后由 rosynirvana 于 2014-4-21 00:31 编辑
愛情風華 发表于 2014-4-21 00:02
我用mac  的Xcode  run這段代碼是後來加上去才有運行正常,未加上去之前就如同圖片一樣 ,秒數> ...

噢……我明白了,因为xcode下面那个控制台缓存刷新比较慢的缘故
手动打个换行或者刷新stdout就行了
你试试这一段
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. int main()
  5. {
  6.   int sec;
  7.   int a, b;
  8.   sec = 120;
  9.   
  10.   while(sec >= 0){
  11.     a = sec / 60;
  12.     b = sec % 60;
  13.     printf("%d:", a);
  14.     if(b < 10)
  15.       printf("0");
  16.     printf("%d\n", b);
  17.     sleep(1);
  18.     //system("clear");
  19.     //This won't work for Xcode terminal
  20.     sec = sec - 1;
  21.   }
  22.   sleep(5);
  23.   return 0;
  24. }
复制代码

作者: 愛情風華    时间: 2014-4-21 00:27
TERM environment variable not set.   出現這行
作者: rosynirvana    时间: 2014-4-21 00:30
愛情風華 发表于 2014-4-21 00:27
TERM environment variable not set.   出現這行

好吧,Xcode的终端模拟器不能clear
你把system("clear")去掉吧
或者直接用命令行
作者: kuaile1210    时间: 2014-4-27 20:44
楼主太棒了!!
作者: suiyueran_1920    时间: 2014-6-18 12:08
为什么要分四段呢?
作者: jinba225    时间: 2014-7-3 15:40
支持楼主!!
作者: kakuwzk    时间: 2014-7-26 22:21
Good!这是最简单的:01.#include <stdio.h>

02.#include <stdlib.h>

03.#include <windows.h>

04.int main()

05.{

06.  int sec;

07.  for(sec = 120; sec >= 0; --sec){

08.    printf("%d:%02d", sec / 60, sec % 60);

09.    Sleep(1000);

10.    system("cls");

11.  }

12.  system("pause");

13.  return 0;

14.}
(运用楼主的)
作者: 小辉~    时间: 2014-8-6 11:10
楼主好牛啊!!!
作者: 逆风    时间: 2015-7-31 11:02
好厉害,膜拜大神{:soso_e179:}
作者: sujx    时间: 2015-8-31 02:03
本帖最后由 sujx 于 2015-8-31 02:07 编辑

[mw_shl_code=c,true]
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{        
        int t,m,s;
    t=120;            
    while(t>=0)
    {
                m=t/60;
                s=t%60;
                printf("%d:%02d",m,s);
        t--;
        Sleep(1000);
        system("cls");        
    }
    printf("Time is over!\n");
    system("pause");
    return 0;
}[/mw_shl_code]


作者: wx_Zzo51zOB    时间: 2015-9-18 13:45
我的思路;
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
        int a=2,b=0;
    while (b>=0)
    {       
        if (10>b)
                printf("%d:0%d",a,b);
        else
        printf("%d:%d",a,b);
        b--;
        if (b<0)
                        {
                                if(a!=0)
                                a--;
                                b=59;
            }
        Sleep(1000);
        system("cls");
    }
        system("pause");
        return 0;
}
作者: 土口一口鸟    时间: 2018-10-24 16:51
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
       
    int a;       
    printf("2:00");
    Sleep(1000);
   
     
     a=59;
     while (a>=10)
     {system("cls");
     printf("1:%d",a);
     Sleep(1000);
     a=a-1;}
     
     a=9;     
     while(a>=0)
     {system("cls");
     printf("1:0%d",a);
     Sleep(1000);
     a=a-1;}
      
      a=59;
      while (a>=10)
     {system("cls");
     printf("0:%d",a);
     Sleep(1000);
     a=a-1;}
     
      a=9;     
     while(a>=0)
     {system("cls");
     printf("0:0%d",a);
     Sleep(1000);
     a=a-1;}
   
   
   
   
        system("pause");
        return 0;
}




欢迎光临 啊哈磊_编程从这里起步 (https://bbs.codeaha.com/) Powered by Discuz! X3.2