啊哈磊_编程从这里起步

标题: 一份个人制作的习题解答 [打印本页]

作者: rosynirvana    时间: 2013-2-28 15:13
标题: 一份个人制作的习题解答
本帖最后由 rosynirvana 于 2013-2-28 15:15 编辑

若有错误请指出
任何人都可以随意使用这份解答

代码风格上尽量向ahaC教程靠拢
解法尽力做到容易理解
在以后的版本中可能会添加“更好的解法”

ahaC.zip

7.82 KB, 下载次数: 849


作者: sycamore1990    时间: 2013-2-28 15:38
谢谢分享!辛苦了!
作者: AQSQ    时间: 2013-2-28 23:25
求解,从键盘输入两个正整数,让计算机判断第2个数是不是第1个数的约数。如果是则输出YES,不是输出NO。

楼主的答案是
int a,b;
        scanf("%d %d",&a,&b);
        if(a%b==0)
                printf("yes");
        else
                printf("no");

如果输入15和5,为什么a%b==0,也可以显示YES呢?
作者: rosynirvana    时间: 2013-2-28 23:57
AQSQ 发表于 2013-2-28 23:25
求解,从键盘输入两个正整数,让计算机判断第2个数是不是第1个数的约数。如果是则输出YES,不是输出NO。

...

输入15和5
a%b = 15 % 5 = 0
0 == 0
这个式子是真的
所以显示 yes
作者: AQSQ    时间: 2013-3-4 23:55
rosynirvana 发表于 2013-2-28 23:57
输入15和5
a%b = 15 % 5 = 0
0 == 0

还是有点不大明白,呵呵。

这个0可以怎么理解呢?0代表着什么呢?谢谢了!
作者: rosynirvana    时间: 2013-3-5 01:29
AQSQ 发表于 2013-3-4 23:55
还是有点不大明白,呵呵。

这个0可以怎么理解呢?0代表着什么呢?谢谢了!

您是说哪一个0呢?

第一个0表示15除以5的余数(%符号表示计算余数)
第二个0就是上面那个0
第三个0是表达式里原本的0

用自然语言叙述一遍,就是计算15除以5的余数,然后将这个余数和0相比较,看看余数和0是否相等
如果是,那么输入yes;不然就输出no
作者: 4k-Rn    时间: 2013-3-21 18:45
eeeeeeeeeeeeeeeeeeeeeee
作者: gnow    时间: 2013-3-26 13:01
收藏了。。谢谢楼主啦
作者: 小清新    时间: 2013-3-27 19:33
正需要,感谢楼主啊
作者: julius    时间: 2013-4-2 10:38
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
     int a;
         printf("请输入一个正整数\n");
     scanf("%d",&a);
     if(a<9&a>1)
         printf("yes");
     else
         printf("no");
         Sleep(5000);
    return 0;
}
96页答案
作者: rosynirvana    时间: 2013-4-2 12:15
julius 发表于 2013-4-2 10:38
#include
#include
#include

检查你的第九行
作者: jaytop    时间: 2013-4-5 19:42
本帖最后由 jaytop 于 2013-4-5 19:53 编辑

#include <stdio.h>
#include <windows.h>

int main()
{
        int sec;
        sec = 120;
        while(sec >= 0)
        {
                system("cls");
                printf("%d:%02d",sec/60,sec%60);
                sec = sec - 1;
                Sleep(1000);
        }

        Sleep(5000);
        return 0;
}


你这个倒计时2分钟,sec教程上没有,sec应该是秒吧,怎么用?  貌似sec用a代替也可以的 这太坑爹了这教程  sec都没学

作者: rosynirvana    时间: 2013-4-5 21:42
jaytop 发表于 2013-4-5 19:42
#include
#include

sec只是一个普通的变量名啊,叫什么都可以……
思路是把2分钟转化成秒,每秒减少1,然后再计算剩余多少分多少秒
作者: julius    时间: 2013-4-10 09:43
rosynirvana 发表于 2013-4-2 12:15
检查你的第九行

= = 我表示我运行的很正常
作者: rosynirvana    时间: 2013-4-10 10:55
julius 发表于 2013-4-10 09:43
= = 我表示我运行的很正常

if(a<9&a>1)

&是位与,这里应该用的是逻辑与&&
编译器是发现不了这种错误的
作者: 好多个的好感度    时间: 2013-6-26 20:31
rosynirvana 发表于 2013-4-2 12:15
检查你的第九行

是   &&        
作者: qaz670756    时间: 2013-7-2 18:53
楼主大爱,辛苦了,习题没解答太不像话
作者: Dsp    时间: 2013-7-5 19:40
{:soso_e100:}谢谢楼主分享!{:soso_e100:}
作者: lion730    时间: 2013-7-7 23:17
辛苦了  回帖下
作者: gretchency    时间: 2013-7-19 11:40
楼主你194页的习题貌似不对哦。题目要求是小人从右往左跑,你的还是从左往右跑啊?
作者: rosynirvana    时间: 2013-7-19 11:56
gretchency 发表于 2013-7-19 11:40
楼主你194页的习题貌似不对哦。题目要求是小人从右往左跑,你的还是从左往右跑啊?

没错,从控制台50跑到20,你确定编译的是我写的那段?
作者: gretchency    时间: 2013-7-19 12:01
rosynirvana 发表于 2013-7-19 11:56
没错,从控制台50跑到20,你确定编译的是我写的那段?

我又用了你的单独的第四场第9节习题帖子 就好了~是从70往回跑的
作者: fulcrum    时间: 2013-9-30 14:00
谢谢分享!辛苦了!
作者: wangzhify    时间: 2013-10-31 22:18
还没做先把答案下好了。。。。感觉不对劲啊
作者: whwlove    时间: 2013-11-2 00:31
楼主,能出后面几章的答案吗,我用的不是电子书。

作者: rosynirvana    时间: 2013-11-4 02:34
whwlove 发表于 2013-11-2 00:31
楼主,能出后面几章的答案吗,我用的不是电子书。

都写出来了,去题解区翻吧
如果没看错后四章只有这么多习题
http://bbs.ahalei.com/forum-60-1.html
作者: wuertu    时间: 2013-11-5 17:18
还是自己思考一遍再来看解答吧。不过自己想的话真的很头疼。。。。。
作者: C语言菜鸟    时间: 2013-11-24 19:24
楼主基础不错的
作者: r1813214    时间: 2013-11-28 12:10
我来看看!谢谢
作者: 4399APPLE    时间: 2013-11-29 19:40
rosynirvana 发表于 2013-4-10 10:55
if(a1)

&是位与,这里应该用的是逻辑与&&

没错,就像
  1. scanf("%d",a);
复制代码
一样
作者: rosynirvana    时间: 2013-11-29 21:24
4399APPLE 发表于 2013-11-29 19:40
没错,就像一样

那要看你如何定义“错误”了

用位与代替逻辑与是个典型的语意错误,在条件判断的情况下,要做的事情是判断两端的表达式是否同时为真,而非按位求与
或许你觉得求得的值是一样的,但那是比较简单的表达式,如果两端的表达式有副作用,& 和 &&求得的值就未必一样了,因为&&强制求值顺序,而&没有这个效力
举例来说
i = -1; (i++) & i的值是未定义的;而i = -1;  (i++) && i是有明确定义的

至于scanf("%d", a); 当然可以迫使它有正确的语意, 但是这样写所有人第一眼看上去都会怀疑是不是写错了,如果不是私人项目里的代码,一般是要加注释说明的

当然,如果你所谓“没错”指的只是“能通过编译”,那只要改改编译条件就能让编译器报错了
作者: 4399APPLE    时间: 2013-11-30 08:56
rosynirvana 发表于 2013-11-29 21:24
那要看你如何定义“错误”了

用位与代替逻辑与是个典型的语意错误,在条件判断的情况下,要做的事情是 ...

好吧,我知道&和&&的含义不一样,如果是&,那编译器就会先按位“与”运算,再求值是不是0,但如果是&&,编译器就知道这两个条件是连在一起的,是不是?
对于
  1. scanf("%d",a);
复制代码
编译器根本不会报编译错误,但运行之后就是
XXX.exe已停止工作
Windows可以联机解决方案


作者: 4399APPLE    时间: 2013-11-30 08:57
rosynirvana 发表于 2013-11-29 21:24
那要看你如何定义“错误”了

用位与代替逻辑与是个典型的语意错误,在条件判断的情况下,要做的事情是 ...

嗯,好吧,我知道了
作者: stu    时间: 2013-12-9 11:24
本帖最后由 stu 于 2013-12-9 12:35 编辑

发问



如何用FOR语句循环实现  http://bbs.ahalei.com/thread-3875-1-1.html
作者: LazyGuy    时间: 2013-12-13 16:18
answer.txt 中P63
你的答案是(2) printf("%d",c); -> printf("%d",a);
应该是 printf("%c",a); 吧
作者: rosynirvana    时间: 2013-12-13 16:41
LazyGuy 发表于 2013-12-13 16:18
answer.txt 中P63
你的答案是(2) printf("%d",c); -> printf("%d",a);
应该是 printf("%c",a); 吧

yep,你说的对
但是电子版的书已经重新排版过了,我就不更新这个文档了~
作者: 嗨,强哥!    时间: 2014-8-20 07:57
rosynirvana 发表于 2013-4-5 21:42
sec只是一个普通的变量名啊,叫什么都可以……
思路是把2分钟转化成秒,每秒减少1,然后再计算剩余多少 ...

你这个解题思路比我那个强多了,代码简洁明了。
分钟用除,秒数用模(另外%02d占位符宽度不足补0,看来我用if来判断是多余的了。)
作者: oyr520    时间: 2014-9-23 16:29
学习了.....
作者: mayue123    时间: 2015-2-3 04:55
AQSQ 发表于 2013-3-4 23:55
还是有点不大明白,呵呵。

这个0可以怎么理解呢?0代表着什么呢?谢谢了!

这玩意,你要刻苦的动脑子哦,不难
作者: 378748382    时间: 2015-7-15 15:32
感谢楼主无私奉献,正好卡在while嵌套循环这一节
作者: vertigo    时间: 2016-12-10 22:35
楼主好厉害
PS:我也喜欢Nirvana




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