搜索
查看: 5739|回复: 22
打印 上一主题 下一主题

【第四章第5节】动手试一试 题解

[复制链接]
跳转到指定楼层
楼主
发表于 2014-3-29 23:06:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
首先是最直接的方法:
  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秒 - 清屏 - 打印下一个时间
推荐
发表于 2015-9-18 13:45:51 | 只看该作者
我的思路;
#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;
}
板凳
 楼主| 发表于 2014-3-29 23:20:00 | 只看该作者
这样做肯定不好,代码基本上是重复的两部分,编程不是打字练习,重复的代码越少越好
这里当然可以用一个两层嵌套的循环来合并代码,一个变量记录分钟,另一个变量记录秒
但是嵌套循环是下一节的内容,所以这里换一种方法:

用一个变量记录还剩下多少秒,然后求出当前的分和秒
例如剩余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. }
复制代码
地板
 楼主| 发表于 2014-3-29 23:28:30 | 只看该作者
熟练、地道的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补足
5#
发表于 2014-4-1 09:26:37 | 只看该作者
楼主好棒
6#
发表于 2014-4-1 18:09:34 | 只看该作者
不错,很好,鼓掌!
7#
发表于 2014-4-20 22:48:11 | 只看该作者
本帖最后由 愛情風華 于 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
8#
 楼主| 发表于 2014-4-20 23:04:35 | 只看该作者
愛情風華 发表于 2014-4-20 22:48
不好意思,請問一下,我用第2種解法,卻印出的倒數是這樣??無法跟第1種方法一樣

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

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

贴你写的完整代码吧
10#
发表于 2014-4-20 23:37:09 | 只看该作者
本帖最后由 愛情風華 于 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;  
}

11#
 楼主| 发表于 2014-4-20 23:58:52 | 只看该作者
愛情風華 发表于 2014-4-20 23:37
#include
#include
//#include  windows作業系統才有效

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

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

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

我用mac  的Xcode  run{:soso_e100:}這段代碼是後來加上去才有運行正常,未加上去之前就如同圖片一樣 ,秒數>10的會無法顯示秒數-->
else  {
            printf("%d\n",b);
        }
13#
 楼主| 发表于 2014-4-21 00:16:47 | 只看该作者
本帖最后由 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. }
复制代码
14#
发表于 2014-4-21 00:27:24 | 只看该作者
TERM environment variable not set.   出現這行
15#
 楼主| 发表于 2014-4-21 00:30:16 | 只看该作者
愛情風華 发表于 2014-4-21 00:27
TERM environment variable not set.   出現這行

好吧,Xcode的终端模拟器不能clear
你把system("clear")去掉吧
或者直接用命令行
16#
发表于 2014-4-27 20:44:10 | 只看该作者
楼主太棒了!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表