搜索
查看: 2889|回复: 17
打印 上一主题 下一主题

有些有意思的代码求解释

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-20 14:49:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
本帖最后由 嗨,强哥! 于 2013-7-20 14:53 编辑

这是《C Primer Plus》第五版  中文版  第九章 >>> 关于递归函数的例题的完整代码。
其中else if书写格式我略作了修改,其他照抄。

--------------------------------------------------------
//factor.c--使用循环和递归计算阶乘
#include <stdio.h>
#include <stdlib.h>

long fact (int n);
long rfact (int n);

int main(void)
{
    int num;
   
    printf ("This program calculates factorials.\n");
    printf ("Enter value in the range 0-12(q to quit):\n");  //蓝色代码什么意思?求详解。
    while (scanf ("%d",&num) == 1) //蓝色代码什么意思?求详解。
    {
        if (num < 0)
            printf ("No negative numbers,please.\n");
        else
        {
            if (num>12)
                printf ("Keep input under 13.\n");
            else
            {
                printf ("Loop: %d factorial = %ld\n",num,fact (num));
                printf ("Recursion: %d factorial = %ld\n",num,rfact (num));
            }   
        }
        printf ("Enter value in the range 0-12(q to quit):\n");  
    }
    printf ("Bye.\n");
    system("pause");
    return 0;
}

long fact (int n)  //使用循环计算阶乘
{
    long ans;
   
    for (ans = 1; n > 1; n--)
        ans *= n;
    return ans;
}

long rfact (int n)  //使用递归计算阶乘
{
    long ans;
   
    if (n > 0)
        ans = n * rfact (n-1);
    else
        ans = 1;
    return ans;
}

最佳答案

查看完整内容

(q to quit)估计是按q退出的一个提示 下面那句scanf是每次循环开始的时候读取一个整数,如果成功读取到了一个整数,就进入那个循环 不过按照这种实现,所有十进制整数和空白以外的数据都会引起程序退出,因为没法有效读取到一个整数
沙发
发表于 2013-7-20 14:49:46 | 只看该作者
(q to quit)估计是按q退出的一个提示
下面那句scanf是每次循环开始的时候读取一个整数,如果成功读取到了一个整数,就进入那个循环

不过按照这种实现,所有十进制整数和空白以外的数据都会引起程序退出,因为没法有效读取到一个整数

点评

这我都理解; 关键是这些代码是如何引起这些动作的。  发表于 2013-7-20 15:09
这我都理解; 关键是这些代码时如何引起这些动作的。  发表于 2013-7-20 15:07
板凳
发表于 2013-7-20 15:27:34 | 只看该作者
因为scanf的返回值表示正确读取的数值的个数
如果正确读取了一个整数,那么返回值就是1,于是就能进入while的代码块中
如果没有正确读取到,返回值是0,不能进入到while代码块中。

点评

这一句和我预想的一样。 那上一句呢?  发表于 2013-7-21 08:42
地板
发表于 2013-7-20 17:13:29 | 只看该作者
本帖最后由 才鱼010 于 2013-7-20 17:16 编辑

{:soso_e113:}
5#
发表于 2013-7-20 17:20:30 | 只看该作者
{:soso_e104:}我也下载了
6#
发表于 2013-7-21 12:49:35 | 只看该作者
rosynirvana 发表于 2013-7-20 14:49
(q to quit)估计是按q退出的一个提示
下面那句scanf是每次循环开始的时候读取一个整数,如果成功读取到了一 ...

假如《C Primer Plus》第五版  中文版全部学习完毕。可以想你一样精通C语言吗
7#
发表于 2013-7-21 13:53:07 | 只看该作者
上面一句?那就是个字符串,计算机只是原样输出而已
PS尽量还是用回复别用点评吧,不然我没法引用的
8#
发表于 2013-7-21 13:56:02 | 只看该作者
超神级 发表于 2013-7-21 12:49
假如《C Primer Plus》第五版  中文版全部学习完毕。可以想你一样精通C语言吗

C Primer Plus我没有看过,只看过同一个作者的另一本C++ Primer Plus,里面提到C的很多内容都有错,所以我对C Primer Plus的质量一直是有疑问的

想要精通C最终必然要看语言标准的
9#
 楼主| 发表于 2013-7-21 14:38:37 | 只看该作者
rosynirvana 发表于 2013-7-21 13:53
上面一句?那就是个字符串,计算机只是原样输出而已
PS尽量还是用回复别用点评吧,不然我没法引用的

(q to quit)估计是按q退出的一个提示----》我想知道这一句是怎么引起程序退出的动作。
10#
 楼主| 发表于 2013-7-21 14:41:05 | 只看该作者
rosynirvana 发表于 2013-7-21 13:56
C Primer Plus我没有看过,只看过同一个作者的另一本C++ Primer Plus,里面提到C的很多内容都有错,所以我 ...

那么C标准的书是哪些呢?
《C Primer Plus》对于我们这些菜鸟来说非常实用,相对于国内的教材,我想是更好的了。
11#
 楼主| 发表于 2013-7-21 14:44:14 | 只看该作者
rosynirvana 发表于 2013-7-21 13:56
C Primer Plus我没有看过,只看过同一个作者的另一本C++ Primer Plus,里面提到C的很多内容都有错,所以我 ...

我想书中存在错误是难免的,一个人要精通C所有方面是很难的事吧。
12#
发表于 2013-7-21 15:33:09 | 只看该作者
rosynirvana 发表于 2013-7-21 13:56
C Primer Plus我没有看过,只看过同一个作者的另一本C++ Primer Plus,里面提到C的很多内容都有错,所以我 ...

网上的C语言标准大多数都是改编要么就是草稿。原版的C语言标准那里有下啊/
13#
发表于 2013-7-21 16:46:49 | 只看该作者
超神级 发表于 2013-7-21 15:33
网上的C语言标准大多数都是改编要么就是草稿。原版的C语言标准那里有下啊/

下载一份草稿就行
14#
发表于 2013-7-21 16:49:14 | 只看该作者
嗨,强哥! 发表于 2013-7-21 14:38
(q to quit)估计是按q退出的一个提示----》我想知道这一句是怎么引起程序退出的动作。

就是我在一楼说的
如果输入一个q,那么scanf读不到十进制整数,跳过了整个循环
15#
发表于 2013-7-21 16:57:54 | 只看该作者
嗨,强哥! 发表于 2013-7-21 14:41
那么C标准的书是哪些呢?
《C Primer Plus》对于我们这些菜鸟来说非常实用,相对于国内的教材,我想是更 ...

C标准说的是C90,C99这些东西
C最权威的书是The C Programming Language,也就是K&R

C Primer Plus我没有读过,不是在评价那一本书,只是对那个作者印象不大好,因为他的另一本书技术性错误多而且明显的不会选择材料
不犯错很难,但是在一本给初学者看的书中不犯明显的技术性错误是不太难的。C++ Primer Plus里面一些技术性错误很有信口胡说的感觉,例如C中identifier的长度是多少多少字符

总而言之或许C Primer Plus很好,但是我个人对作者写作水平和严谨程度是有疑虑的,疑惑来自于作者的另一本书,我曾经在豆瓣上写过前四章的笔记
http://book.douban.com/annotation/26732391/
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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