Jimmy Chen

A Programmer

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

编程环境Visual Studio 2017

#include <stdio.h>
#include <math.h>

// practice 1
void p6_1(void)
{
    char ch[26];
    ch[0] = 'a';
    for (int i = 1; i < 26; i++)
    {
        ch[i] = 'a' + i;
    }

    for (int i = 0; i < 26; i++)
    {
        printf("%c ", ch[i]);
    }

    printf("\n");

    return;
}


// practice 2
void p6_2(void)
{
    char ch = '$';

    for (int i = 0; i < 5; i++)
    {
        for (size_t j = 0; j <= i; j++)
        {
            printf("%c", ch);
        }
        printf("\n");
    }
    return;
}


// practice 3
void p6_3(void)
{
    char ch = 'F';

    for (size_t i = 0; i < 6; i++)
    {
        for (size_t j = 0; j <= i; j++)
        {
            printf("%c", (ch - j));
        }
        printf("\n");
    }

    return;
}


// practice 4
void p6_4(void)
{
    char ch = 'A';

    for (size_t i = 0; i < 6; i++)
    {
        for (size_t j = 0; j <= i; j++)
        {
            printf("%c", (ch++));
        }
        printf("\n");
    }

    return;
}


// practice 5
void p6_5(void)
{
    char ch = 0;
    printf("Please input an uppercase letter:");
    scanf_s("%c", &ch);
    getchar();

    int length = ch - 'A' + 1;
    for (size_t i = 0; i < length; i++)
    {
        char temp = 'A' - 1;
        for (size_t j = 0; j < (length - i - 1); j++)
        {
            printf(" ");
        }
        for (size_t j = 0; j <= i; j++)
        {
            printf("%c", ++temp);
        }
        for (size_t j = 0; j < i; j++)
        {
            printf("%c", --temp);
        }

        printf("\n");
    }
    return;
}


// practice 6
#define SQUARE(X) ((X) * (X))
#define CUBE(X) ((X) * (X) * (X))
void p6_6(void)
{
    int upper = 0;
    int lower = 0;

    printf("Please input the upper:");
    scanf_s("%d", &upper);
    getchar();

    printf("Please input the lower:");
    scanf_s("%d", &lower);
    getchar();

    printf("%10s%10s%10s\n", "number", "square", "cube");

    for (size_t i = 0; i < (upper-lower+1); i++)
    {
        int number = lower + i;
        int square = SQUARE(number);
        int cube = CUBE(number);

        printf("%10d%10d%10d\n", number, square, cube );
    }
    return;
}


// practice 7
void p6_7(void)
{
    char string[20] = { 0 };
    char rev_string[20] = { 0 };
    memset(string, 0, 20);
    memset(rev_string, 0, 20);
    int length = 0;
    printf("Please enter the word:");
    scanf_s("%s", string, 19);
    getchar();

    printf("The word you inputed was:");
    printf("%s\n", string);

    length = strlen(string);
    string[length] = '\0';
    for (size_t i = 0; i < length; i++)
    {
        rev_string[i] = string[length - i - 1];
    }
    rev_string[length] = '\0';
    printf("The revert string was:%s\n", rev_string);
    return;
}


// practice 8
void p6_8(void)
{
    double divsor1 = 0;
    double divsor2 = 0;
    printf("Please input two float number:");
    while (scanf_s("%lf %lf", &divsor1, &divsor2) == 2)
    {
        getchar();
        double sub = divsor1 - divsor2;
        double pro = divsor1 * divsor2;
        double result = sub / pro;
        printf("two number input were: %lf %lf; result = %lf\n", divsor1, divsor2, result);
        printf("Please input two float number:");
    }

    return;
}


// practice 9
double cla(double div1, double div2)
{
    double sub = div1 - div2;
    double pro = div1 * div2;
    double result = sub / pro;

    return result;
}

void p6_9(void)
{
    double divsor1 = 0;
    double divsor2 = 0;
    printf("Please input two float number:");
    while (scanf_s("%lf %lf", &divsor1, &divsor2) == 2)
    {
        getchar();
        double result = cla(divsor1, divsor2);
        printf("two number input were: %lf %lf; result = %lf\n", divsor1, divsor2, result);
        printf("Please input two float number:");
    }

    return;
}


// practice 10
void p6_10(void)
{
    int lower = 0;
    int upper = 0;
    int sum = 0;

    printf("Enter lower and upper integer limits:");
    scanf_s("%d %d", &lower, &upper);
    while (upper > lower)
    {
        getchar();
        sum = 0;
        for (size_t i = lower; i <= upper; i++)
        {
            sum += SQUARE(i);
        }
        printf("The sums of the squares from %d to %d is %d\n", SQUARE(lower), SQUARE(upper), sum);
        printf("Enter next set of limits:");
        scanf_s("%d %d", &lower, &upper);
    }
    printf("Done\n");
    return;
}


// practice 11
void p6_11(void)
{
    int iarray[9];
    printf("please input 8 integer to array:");
    for (size_t i = 0; i < 8; i++)
    {
        scanf_s("%d", &iarray[i]);
    }
    getchar();
    printf("The array you inputed was:");
    for (size_t i = 0; i < 8; i++)
    {
        printf("%d ", iarray[i]);
    }
    printf("\n");
    return;
}


// practice 12
void p6_12(void)
{
    signed long long item = 0;
    double result1 = 0.0;
    double result2 = 0.0;

    printf("Please input the item you want to check:");
    scanf_s("%lld", &item);
    getchar();

    while (item > 0)
    {
        result1 = 0.0; 
        result2 = 0.0;
        for (size_t i = 1; i <= item; i++)
        {
            result1 += 1.0 / i;
            if (i % 2 == 1)
            {
                result2 += 1.0 / i;
            }
            else
            {
                result2 -= 1.0 / i;
            }
        }
        printf("the %d item result of the first sequence was %lf\n", item, result1);
        printf("the %d item result of the second sequence was %lf\n", item, result2);

        printf("Please anthor input the item you want to check:");
        scanf_s("%d", &item);
        getchar();
    }

    printf("Done\n");

}


// practice 13
void p6_13(void)
{
    int iarray[8];
    for (size_t i = 0; i < 8; i++)
    {
        iarray[i] = pow(2, (i + 1));
    }

    int i = 0;
    do
    {
        printf("array[%d] = %d\n", i, iarray[i]);
        i++;
    } while (i < 8);

    return;
}


// practice 14
void p6_14(void)
{
    double darray1[8];
    double darray2[8];

    printf("Please enter 8 double into darray1:");
    for (size_t i = 0; i < 8; i++)
    {
        scanf_s("%lf", &darray1[i]);
    }
    getchar();

    darray2[0] = darray1[0];
    for (size_t i = 1; i < 8; i++)
    {
        darray2[i] = darray1[i] + darray2[i - 1];
    }

    for (size_t i = 0; i < 8; i++)
    {
        printf("darray1[%d] = %lf ", i, darray1[i]);
    }
    printf("\n");

    for (size_t i = 0; i < 8; i++)
    {
        printf("darray2[%d] = %lf ", i, darray2[i]);
    }
    printf("\n");

    return;
}


// practice 15
void p6_15(void)
{
    int i = -1;
    char input[256];

    printf("Please input the string:");

    do
    {
        i++;
        scanf_s("%c", &input[i]);
    } while (input[i] != '\n');

    for (size_t j = i; j > 0; j--)
    {
        printf("%c", input[j - 1]);
    }
    printf("\n");

    return;
}


// practice 16
void p6_16(void)
{
    double Dap = 100.0;
    double Dei = 100.0;
    int i = 0;

    do
    {
        i++;
        Dap = Dap + 10;
        Dei = Dei * 1.05;
    } while (Dei < Dap);

    printf("After %d year, Deirdre's account:%lf, Daphne's account:%lf\n", i, Dei, Dap);

    return;
}


// practice 17
void p6_17(void)
{
    double Chuckie = 100.0;
    int i = 0;
    do
    {
        i++;
        Chuckie = Chuckie * 1.08;
        Chuckie -= 10;
    } while (Chuckie > 0);

    printf("After %d year, Chuckie has taken all of the money!\n", i);

    return;
}


// parctice 18
void p6_18(void)
{
    int Rab = 5;
    int i = 0;
    do
    {
        i++;
        Rab -= i;
        Rab *= 2;
        printf("%d week, Rabnud has %d friends.\n", i, Rab);
    } while (Rab < 150);

    return;
}


int main(int argc, char **argv)
{
    p6_18();

    getchar();

    return 0;
}

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

  1. m4sk说道:

    :cry: 初学者表示,前几章就像小学一样,到了循环一章,课后习题好像直接上了大学,做的是一脸蒙蔽……我是不是该跳过去先过一边书再回来做题。 :confused:

    1. jimmychen说道:

      :idea: 可能会用到后面章节的一些特性吧,要是第一次学的话,可以等看完一遍后再统一做一遍习题。博主是强烈推荐课后的编程题是一定要做一遍的,不然看完书只是知道有这个语法,等到以后要用到真正开始写程序的时候也还是会一脸懵逼的。主要还是坚持啊

  2. 乃么好说道:

    太棒了,原书上练习题答案总是跳过一些题,居然在这找到了,果断关注!!其实也学了一些了,可是真的看到一道题目的时候脑子里学的东西一股脑全部涌上来,烂七八糟毫无头绪,到头来脑子一片空白,不知道你有没有经历这个过程,正如你说的,主要是坚持,向你学习!爱您! :arrow:

    1. jimmychen说道:

      我以前也经历过这样的过程,看着书和代码感觉是基本都理解了,但是做起习题来就连基本的语法都会弄错。坚持多练习多写写代码,这种不适感慢慢会消失的。另外刚刚开始的时候,进度是会有点慢的,不要急躁就好

  3. Ninw说道:

    自从开始学C,觉得自己真TM笨1

    1. jimmychen说道:

      :lol: :lol: 哈哈,没事没事。其实刚刚开始都这样,坚持一段时间就会有感觉了

  4. sunrise说道:

    18题 后面为啥要加这个 我感觉前面程序已经满足条件了。刚学习写程序 啥也不懂哈 所以瞎问 博主别介意哈
    int main(int argc, char **argv)
    {
    p6_18();

    getchar();

    return 0;
    }

    1. jimmychen说道:

      兄弟,这是main函数啊,拿来测试上面的习题用的

  5. 橙了个棒棒糖说道:

    老哥 12题真的没问题吗 还是我理解问题1+1/2+1/3+1/4.。。。不应该是一直小于2吗 还有底下那行 我RUN 你的程序 好像我也不太懂他的结果.....

    1. jimmychen说道:

      :redface: 兄弟,1+1/2+1/3+1/4就已经大于2了啊;这个主要是按照练习算法来写的,具体的求和公式名就不太记得了

      1. 橙了个棒棒糖说道:

        我偷偷我说 你这个貌似有问题欸,我手算好像不太对 而且你的数值好大啊,em 1+1/2+1/3+1/4+1/5 = 11E了都 打印的结果 和最后的你的计算结果也不一样 不然老哥 你留个邮箱? 我题目 运行结果结果什么 的都发给你?(或许我眼拙 没注意什么地方?)

        1. jimmychen说道:

          xiaojimmychen@gmail.com,欢迎给我发邮件!

          1. 橙了个棒棒糖说道:

            之前没注意 现在已发 注意查收 3Q博主了

          2. 橙了个棒棒糖说道:

            之前没注意 现在已发 注意查收

  6. 发大水r说道:

    float money=100.0;
    float left=100.0;
    int i=0;
    do
    {
    i++;
    money=money*1.08;
    left=money-10.0;

    }while(left>0);
    printf("after %d years money will be zreo",i);

    return 0;

    }
    第十七题我是这样写的,但不知道哪里出错了

    1. jimmychen说道:

      这个,你其实可以自己带入数字算两三个循环就能看出问题了。按照你这个写,money和left只会越来越大,是不可能会退出do while循环的

  7. XueZhe说道:

    第五道练习题 内层循环条件应该是length-i-1

    1. jimmychen说道:

      谢谢,改回来了!

  8. my说道:

    13题应该是pow(2,i)吧

  9. Mr_cola说道:

    大大,我很想了解一下第七题的memset这个函数的作用是什么。我在运行后,把这俩行删除了,运行结果也是一样的。能不能告诉一下这个作用是啥。

    1. jimmychen说道:

      memset作用是对一块内存地址填充为对应值,相当于初始化,具体作用你可以百度一下这个函数就好

  10. arcu说道:

    楼主,第5题char ch = 0和scanf_s("%c", &ch);那里,为什么ch定义为int结果就是空白呢?int获取的不是也是ascii码吗

    1. jimmychen说道:

      你用的是什么编译器?用visual studio是可以的

  11. sh说道:

    14题 double darray1[8]和for (size_t i = 0; i < 8; i++)这儿。数组不是从[0]开始的吗.
    我是darray1[7],for (size_t i = 0; i <=7; i++)这样。但是最后第8个就不会显示或者0,[7]改成[8]就正常了,楼主求解

    1. jimmychen说道:

      数组是从[0]开始的,你定义darray1[7],代表数组有7个成员,从[0]开始计算的话,那最大到[6],这就有7个成员了,而for(size_t i = 0; i <=7; i++),是从[0]到[7],这里有8个成员,当赋值darray1[7]的时候就会导致数组越界了

      1. ch说道:

        谢谢楼主回复了,意思是数组[x]里的数字实际上是代表有x个成员而不是有0~x这么个位置?也就是数组从0开始只能容纳[X-1]个?

        1. jimmychen说道:

          是的,就是这个意思

  12. 光辉岁月说道:

    楼主好!我是C初学者。然后刚进这个论坛,不太清楚评论规则。刚才发表了两次评论,我发现找不到。我又申请了个账号再来评论。希望你能看到。如有打扰之处,请谅解。感谢。
    你看我把第一题这样写行不行,如果有不对的地方请一定不吝赐教。再次感谢!
    #include
    int main()
    {
    char x[26];
    x[0] = 'a';
    int y;
    for (y = 0;y < 26;y++)
    {
    x[y] = 'a' + y;
    printf("%c ", x[y]);
    }
    printf("\n");
    return 0;

    1. jimmychen说道:

      看起来没什么问题啊,你编译运行后得不到想要的答案吗?

  13. 染指让你萌萌哒说道:

    请问你写程序之前有没有什么先前步骤呀,特别是第五题开始,没有思路。不知道怎么开始。还有循环的出入条件。。。我都不能完全确定诶。。。

    1. jimmychen说道:

      感觉也是看功能需求是什么,然后就会想用什么算法实现比较简单,怎么组织代码,之类的。

  14. 加币娘说道:

    忘记勾选电子邮件通知了。博主你的主题太好看了,有配置文件方便发下吗谢谢 :mrgreen:

    1. jimmychen说道:

      博客的主题在最底部有原作者的链接,你可以去看看

  15. jimmychen说道:

    博客的主题在最底部有原作者的链接,你可以去看看

  16. Allen说道:

    分享一个第三题有意思的写法哈哈
    int i=0;
    char c = 'F';
    for(;i<6;c='F',printf("\n"),i++)
    for(int l = 0;printf("%c",c),l<i;c--,l++);

    1. jimmychen说道:

      :mrgreen: :mrgreen: 哈哈,这个写法也可以。方法多样,能实现就行

  17. ALLEN说道:

    第五题也可以这么写
    #include
    #include
    int main(void)
    {
    int i;
    for(i=1; i<6;i++)
    {
    for(int l=0;l<5-i;l++,printf(" "));
    for(int p = -i+1;p<i;printf("%c",'A'+i-1-abs(p)),p++);
    printf("\n");
    }
    }

  18. 闵波路三舅说道:

    第5题的主函数去哪了?? :lol:

    1. jimmychen说道:

      主函数放在源码最后

  19. 友人A说道:

    第11题要求倒序打印这8个数,这样的话是要把第二个for循环改成这样吗?
    for(size_t i = 0;i < 8;i++)
    {
    printf("%d",ch[7-i]);
    }

    1. jimmychen说道:

      如果是要求倒序的话,那就按你上面写的做。当时我可能看错了

发表评论

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d 博主赞过: