搜索
查看: 5756|回复: 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秒 - 清屏 - 打印下一个时间
沙发
 楼主| 发表于 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补足
地板
 楼主| 发表于 2014-4-20 23:04:35 | 显示全部楼层
愛情風華 发表于 2014-4-20 22:48
不好意思,請問一下,我用第2種解法,卻印出的倒數是這樣??無法跟第1種方法一樣

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

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

贴你写的完整代码吧
6#
 楼主| 发表于 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");
代替你注释掉的那三句
7#
 楼主| 发表于 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. }
复制代码
8#
 楼主| 发表于 2014-4-21 00:30:16 | 显示全部楼层
愛情風華 发表于 2014-4-21 00:27
TERM environment variable not set.   出現這行

好吧,Xcode的终端模拟器不能clear
你把system("clear")去掉吧
或者直接用命令行
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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