Jimmy Chen

A Programmer

C Primer Plus 第六版 第七章课后编程练习答案

编程环境Visual Studio 2017

此文为博主原创文章,转载请注明出处

  1. Ninw说道:

    第七章
    第七题
    else if (300 < total_income <= 450) // 可以这样写吗?
    {
    tax = 300 * RATE1 + (total_income - 300) * RATE2;
    net_income = total_income - tax;
    }

    1. jimmychen说道:

      0.0 谢谢告知,居然写出一个bug了。这样写是不行的,刚刚改回来了

  2. Ninw说道:

    第七章第八题
    continue 好像不能使用在 switch 下。
    default:
    printf("Please enter the choice between 1 to 5\n");
    continue;// 这里?

    1. jimmychen说道:

      第八题的程序上面有while(1)循环,所以在这个switch case里面可以用continue来跳过while剩余的代码,如果上面没有while循环,switch里面就不能用continue

      1. Ninw说道:

        哦,明白了。

  3. Ninw说道:

    第七章第八题
    while(1)
    {
    }
    选择正确的输入1到4,一直让循环选择。

  4. Ninw说道:

    你好,能不能推荐一下学C语言的书籍或资料之类的? (网上的说什么的都有,不知道听谁的。)

    1. jimmychen说道:

      我以前也做过网上收集的一些练习题,然后就是自己编写代码实现Linux的命令行程序,例如ls、cp之类的程序

  5. Ninw说道:

    第七章
    最后一题
    如果直接选择退出。
    结果freight 会显示结果6.5,不应该都是 0 吗?

    total_weight = n_artichoke + n_beet + n_carrot;
    if (total_weight <= 5.0)
    {
    freight = 6.5;
    }
    else if (5.0 < total_weight <= 20) //这里为什么这样写,编译器可以通过啊?
    {
    freight = 14.0;
    }
    else
    {
    freight = 14 + (total_weight - 20) * 0.5;
    }
    printf(" Total_freight:%.2lf", freight); //这里。

    printf(" Final cost:%.2lf", (total_cost - discount + freight));

    return;

    1. jimmychen说道:

      0.0 确实,这道题写出了好多bug
      1. total_weight需要添加大于0的条件判断,否则直接退出的话,判断total_weight <= 5.0 为true了 2. else if (5.0 < total_weight <= 20) //这里为什么这样写,编译器可以通过啊? 这样是可以编译通过的,只是失去了原来的想表达的意思了, 3. 添加了大于零的判断,最后一个就不能直接用else了,否则total_weight会走最后一个else

      1. 柴犬说道:

        不好意思,我是初学者
        请问为什么要加一个 while((getchar()) != '\n') ;
        加了有什么作用呢?

      2. 友人A说道:

        我在第一个if(weight <= 5)里面嵌套一个if else, 判断重量<=0的时候,运费是0 ;else,运费是6.5。这样改可以不?运行了一下的确是输出运费是0。

  6. Ninw说道:

    total_weight = n_artichoke + n_beet + n_carrot;
    if (total_weight <= 5.0) // 这里应该在添加一个大于零的条件。
    {
    freight = 6.5;
    }
    else if (5.0 < total_weight <= 20)
    {
    freight = 14.0;
    }
    else /*上面如果添加大于零的条件,freight会变成14,这里后面再加个大于20的条件
    我的提示出错*/
    {
    freight = 14 + (total_weight - 20) * 0.5;
    }
    else
    {
    //上面的改成else if。 我在这里有加了一个else 才行,允许这样写吗?
    }
    printf(" Total_freight:%.2lf", freight);

    printf(" Final cost:%.2lf", (total_cost - discount + freight));

    return;

  7. sunrise说道:

    第七章 第二题,我想要这样输入行不行:(abc和abc之间输入了一个回车键,用户输入了7个字符[2组abc加一个回车键,共7个])。然后一次性在一行打印7对 字符和ASCII码
    abc
    abc

    1. sunrise说道:

      第三题,平均数用printf(“%f”)是不是好些,假如输入的是3、7、1,11/3这不就是浮点数了么(
      不知道理解的对不,我刚学习程序)

      1. jimmychen说道:

        是的,改成浮点数会好一些

    2. jimmychen说道:

      这个回车键用printf来打印都会换行的,除非用转义表示换行符;如果想等到全部输入完成后再一次性打印字符和ascii码的话可以使用数组来保存输入的字符,等输入了#号后再输出数组的内容

  8. sunrise说道:

    第八题:整个程序都在while(1)
    {
    }
    这个循环中;while中含有switch break,假如当我选中1的时候,按照书本上讲的,应该就跳出while循环了,程序就应该结束了,但是我运行版主的程序,事实上并非如此,还可以一直运行下去。难道
    switch (choice)
    {
    }这个也能算一个循环,break跳出了这个switch循环,还在while循环里面,但是我看书上的例子都是直接跳出while的,劳烦吧主解答下

    1. jimmychen说道:

      switch不是循环,第八题,按照打印的提示,选5才是退出while循环的

  9. ch说道:

    楼主,第8题如果输入不是数字的话就会一直循环显示界面,只有1~5以外的数字才能重新显示界面提示输入。我用你的代码测试也是,是我编译器的问题吗?

    1. jimmychen说道:

      写的程序都只是做简单的功能实现,类似输入错误判断之类的都没有做

  10. zch666666说道:

    第三题求平均数时,直接用%f显示(odd_sum/n_odd)结果我的编译结果显示为0.00000,我在表达式前面加了强制类型转换为float结果就正确了
    printf(“奇数有%d个,奇数的平均值为%5.2f\n”,n_odd,(float)(odd_sum/n_odd));
    我是初学者,不知道这样做好不好

    1. jimmychen说道:

      你这个很好啊,不加float强制转换的话整除会被截断成整型输出的

  11. Helloworld!说道:

    不好意思请教一下 实在没看懂
    第七章第六题
    if ('i' == ch)
    {
    if ('e' == ch_pre)
    {
    n_appear++;
    }
    }
    这个地方是先检查‘i’然后再检查前一个字符‘e’ 如果为真n_appear++;对吧
    我看了很久 实在不知道怎么做到检查前一个字符的 是_pre有什么特别作用么?
    如果_pre的作用是检查前一个字符 那么如何检查后一个字符呢?
    感谢楼主回答!

    1. jimmychen说道:

      这里只需要记录前一个字符就好了吧,你截取的代码下面有一行'ch_pre = ch;',就是用来记录前一个字符的

  12. 柴犬说道:

    求问第七章第六题为什么
    if( c =='i')
    {if(prev =='e')
    n++;}

    if(prev == 'e' && c =='i')
    n++;
    所得的结果不一样

    1. jimmychen说道:

      额,应该是一样的吧

  13. 清111说道:

    楼主打扰啦,第六题这样做好像也行,不知道有没有什么问题,(初学者) :mrgreen:
    #include
    int main(void)
    {
    char ch;
    int n=0;
    printf("Please enter text to be analyzed (# to terminate):");
    while((ch=getchar())!='#')
    {
    if(ch=='e')
    continue;
    else if(ch=='i')
    n++;
    else
    continue;
    }

    printf("\n");
    printf("there are %d 'ei'\n",n);
    return 0;
    }

    1. jimmychen说道:

      这样做有问题吧,要是我输入10个i,你这最后不就打印有10个ei了么?

  14. 张小亮说道:

    第七题 scanf_s("%lf", &work_hours);
    if (work_hours > 40)
    {
    work_hours = (work_hours - 40) * 1.5 + 40;
    }

    total_income = work_hours * 1000;
    if (total_income <= 300)
    {
    tax = total_income * RATE1;
    net_income = total_income - tax;
    }
    total_income ×1000是总工资 不成立 怎么理解这个

    1. jimmychen说道:

      抱歉,不是特别理解你想表达的意思呢?

  15. aiguo说道:

    我看到第八章的习题七的时候,重新看了下第七章的第八题(这两题有联系),因为第八章主要讲了很多处理换行符的问题,现在看第七题的时候发现,scanf_s("%d", &chooice)输入产生的换行符为什么不影响scanf_s("%lf", &work_hours)这个读取,按照我现在的理解,第一个scanf 产生的换行符,会留在队列里面,被这个scanf_s("%lf", &work_hours)读取到,但是work_hours是double类型,所以一直没法读取,程序就会一直卡主。但是事实上 这个程序可以正常运行。这是什么原因?

    1. aiguo说道:

      这个问题是针对第八题的

  16. 热心网友说道:

    第十题如果输入了字母的话就会导致无限循环,下一章其实讲了解决方法,用scanf("%*s);跳过非数字字符。

  17. snail说道:

    第2题是不是并没有对一行打印8个字符这一要求进行处理,只是实现了字符转ASCII码这一要

    1. jimmychen说道:

      i % 8这一行就是处理这种情况的

  18. 不吃鱼的汤姆猫说道:

    程序11的修正(仅参考)
    https://blog.csdn.net/qq_40425918/article/details/84994190

  19. 我把名字吃了说道:

    博主,我有个第十一题的疑问:
    while ('q' != choice)
    {......}里面的 while (getchar() != '\n');具有什么作用?

    1. jimmychen说道:

      清除多余的回车键用的

  20. 嘻嘻说道:

    谢谢大佬的答案分享。其中2第二题有一个小bug,那就是只要一输入字符,打印出来,最终行都会打印出
    10: ,而且一按回车就打印10:不美观。如果在i++的下一行加上if (ch!='\n')进行判断就不会出现这个问题。 :biggrin:

回复 sunrise 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注