c primer plus第六章习题答案

第六章习题

/*第六章 练习题1
题目:1.编写一个程序,创建一个包含26个元素的数组,并在其中储存
      26个小写字母。然后打印数组的所有内容。
分析:定义一个26元素的字符型数组,所以占用26个字节,然后还有把
      他们全部打印出来,所以循环的次数要与元素的长度相等。

*/

#include <stdio.h>

#define length 26//声明循环长度。

unsigned char letter = 'A';//letter字母 声明起始字母‘A’。
char ch[26] ;//创建26个元素数组
unsigned char i;  //声明循环变量‘i’。

int main ()
{
    /*初始化数组元素*/
    for(i = 0;i < length;i++)
        ch[i] = i + 'a';
    /*打印数组元素*/
    for(i = 0;i < length;i++)//循环26次
      //  printf("%c ",letter++);//每次输出完毕之后letter加1。
        printf("%c ", ch[i]);


    return 0;
}

/*第六章 练习题2
题目:2.使用嵌套循环,按下面的格式打印字符:
                                            $
                                            $$
                                            $$$
                                            $$$$
                                            $$$$$
分析:关键要点是嵌套循环,然后这个规律是五行,每行递增一个。

*/

#include <stdio.h>

#define line 5//声明行数。
unsigned char i,j;  //声明循环变量‘i’'j'。

int main ()
{
    /*设定循环次数即行数*/
    for(i = 0;i < line;i++)
    {
        /*设定每行循环几次即每行的个数*/
        for(j = 0;j <= i;j++)//j <= i是重点
        {
            printf("$");

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

/*第六章 练习题3
题目:3.使用嵌套循环,按下面的格式打印字母:
                                            F
                                            FE
                                            FED
                                            FEDC
                                            FEDCB
                                            FEDCBA
分析:关键要点是嵌套循环,然后这个规律是六行,起始字母是'F'每行倒序递增一个。

*/

#include <stdio.h>

#define line 6//声明行数。
unsigned char i,j,ch = 'A';  //声明循环变量‘i’'j'。


int main ()
{
    /*设定循环次数即行数*/
    for(i = 0;i < line;i++)
    {
        /*设定没行输出几个字符*/
        for(j = 0;j <= i;j++)
        {
            printf("%C",ch--);//倒序递增
        }
        printf("\n");
        ch = 'F';//重置ch初值
    }
    return 0;
}

/*第六章 练习题4
题目:4.使用嵌套循环,按下面的格式打印字母:
                                            A
                                            BC
                                            DEF
                                            GHIJ
                                            KLMNO
                                            PQRSTU
分析:关键要点是嵌套循环,然后这个规律起始A到U截止是六行,每行字符正序递增数量=行数

*/

#include <stdio.h>

#define line 6//声明行数。
unsigned char i,j,ch = 'A';  //声明循环变量‘i’'j'和字符变量'A'。


int main ()
{
    /*设定循环次数即行数*/
    for(i = 0;i < line;i++)
    {
        /*设定每行循环的次数*/
       for(j = 0;j <= i;j++)

       {
            printf("%c",ch++);//打印ch后且加1.
       }
       printf("\n");
    }
    return 0;
}

/*第六章 练习题5
题目:5.编写一个程序,提示用户输入大写字母。使用嵌套循环以下面
金字塔型的格式打印字母:
                               A
                              ABA
                             ABCBA
                            ABCDCBA
                           ABCDEDCBA
分析:关键要点是嵌套循环,然后这个规律起始字符A截止字符=行数,
      每一行打印的字符数量是相同的,只是字符类型数量不同,
      其规律是空格递减字符由正序和倒序递增

*/
#include <stdio.h>

int main()
{
    int i, j;
    char ch;

    printf("Please enter a upper letter: ");
    scanf("%c", &ch);
    printf("The pyramid of %c is:\n", ch);
    char length = ch - 'A';//计算字母长度。
    /*循环行数*/
    for (i = 0; i <= length; i++)
    {
        char letter = 'A' - 1;//计算起始字母。
        /*空格递减*/
        for (j = 0; j < length - i; j++)
            printf(" ");//打印递减空格;
        /*递增字母*/
        for (j = 0; j <= i; j++)
            printf("%c", ++letter);//打印递增字母;
        /*递减字母*/
        for (j = 0; j < i; j++)
            printf("%c", --letter);//打印递减字母
        printf("\n");
    }

    return 0;
}


/*第六章 练习题6
题目:6.编写一个程序打印一个表格,每一行打印一个整数、该数的平
        方、该数的立方。要求用户输入表格的上下限。使用一个for循环。

分析:  

*/

#include <stdio.h>

int main(void)
{
    /*声明上下限*/
    int i, upper, lower;
/*输入上限*/
    printf("Please input the upper limits: ");
    scanf("%d", &upper);
    /*输入下限*/
    printf("Please input the lower limits: ");
    scanf("%d", &lower);
/*输出格式*/
    printf("%-10s%-10s%-10s\n", "number", "square", "cube");
    for (i = lower; i <= upper; i++)
    {
        /*输出结果*/
        printf("%-10d%-10d%-10d\n", i, i * i, i * i * i);
    }
    /*完成*/
    printf("Done.\n");

    return 0;
}

/*第六章 练习题7
题目:7.编写一个程序把一个单词读入一个字符数组中,然后倒序打印
        这个单词。提示:strlen()函数(第4章介绍过)可用于计算数组最后
        一个字符的下标。

分析:

*/
#include <stdio.h>
#include <string.h>
#define LEN 20//声明数组长度

int main()
{
    int i;
    char str[LEN];//字符串数组.

    printf("Please enter a word: ");//请输入一个单词
    scanf("%19s", str);//输入最大19个字节,字符串不用加&,逐个需要
    printf("The word is:\n");
    printf("%s\n", str);//打印出来刚才输入的单词

    printf("Reversing the word is:\n");
   // printf("%d",strlen(str));
   // printf("\0\n");
   // printf("\0\n");
    for (i = strlen(str) - 1; i >= 0; i--)//-1是因为单词属于字符串,字符串储存在数值中的最后一位是\0
    {
        printf("%c", str[i]);
    }
    return 0;
}

/*第六章 练习题8
题目:8.编写一个程序,要求用户输入两个浮点数,并打印两数之差
        除以两数乘积的结果。在用户输入非数字之前,程序应循环
        处理用户输入的每对值。
分析:浮点数用 flaot,double

*/
#include <stdio.h>

int main()
{
    double i, j;

    printf("Please enter two numbers (q to quit): ");//请输入两个数字q退出
    while (scanf("%lf %lf", &i, &j) == 2) //成功输入两个变量scanf返回2
    {
        printf("(%g - %g) / (%g * %g)", i, j, i, j);
        printf(" = %g\n", (i - j) / (i * j));
        printf("You can enter again (q to quit): ");
    }
    printf("Done.\n");

    return 0;
}

/*第六章 练习题9
题目:9.修改练习8,使用一个函数返回计算的结果。

分析:

*/
#include <stdio.h>

double ret (double a,double b)
{
    return (a-b) / (a*b);
}
int main()
{
    double i, j;

    printf("Please enter two numbers (q to quit): ");//请输入两个数字q退出
    while (scanf("%lf %lf", &i, &j) == 2) //成功输入两个变量scanf返回2
    {
        printf("(%g - %g) / (%g * %g)", i, j, i, j);
        printf(" = %g\n",ret(i,j));//调用ret函数将ij的值发送到ab中经过(a-b) / (a*b)后返回double类型的数
        printf("You can enter again (q to quit): ");
    }

    printf("Done.\n");

    return 0;
}

/*第六章 练习题10
题目:10.编写一个程序,要求用户输入一个上限整数和一个下限整数, 计算从上限到下限范围内所有整数的平方和,并显示计算结果。然后 程序继续提示用户输入上限和下限整数,并显示结果,直到用户输入
的上限整数小于下限整数为止。

分析:

*/
#include <stdio.h>

int main()
{
    /*声明上限和下限*/
    int upp, low, i;

    printf("Enter lower and upper integer limits: ");
    while ((scanf("%d %d", &upp, &low) == 2) && (upp > low))//如果上限 > 下限而且scanf返回2,条件成立进入循环,否则跳过,
    {
            /*声明一个变量保存平方和*/
        int sum = 0;
    /*范围*/
        for (i = low; i <= upp; i++)
        {
            sum += i * i;//等价于sun = sun + i * i
        }
        /*打印*/
        printf("The sums of the squares ");
        printf("from %d to %d is %d\n", low * low, upp * upp, sum);
        /*继续输入*/
        printf("Enter next set of limits: ");
    }
    printf("Done\n");//完成

    return 0;
}

/*第六章 练习题11
题目:11.编写一个程序,在数组中读入8个整数,然后按倒序打印这8个
整数。

分析:

*/
#include <stdio.h>
#define length 8

int numer[length];
int main()
{
    int i;
    printf("Please enter 8 numbers:\n", length);
    for (i = 0; i < length; i++)
    {
        scanf("%8d", &numer[i]);//因为是八个独立的整数所以要加&取地址
    }

    for(i = length - 1; i >= 0;i--)
        printf("%-2d",numer[i]);//左对齐整数占两位
    return 0;
}

/*第六章 练习题12
题目:12.考虑下面两个无限序列:
        1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + ...
        1.0 - 1.0/2.0 + 1.0/3.0 - 1.0/4.0 + ...
        编写一个程序计算这两个无限序列的总和,
        直到到达某次数。提 示:奇数个-1 相乘得-1,
        偶数个-1相乘得1。让用户交互地输入指定的
        次数,当用户输入0或负值时结束输入。查看
        运行100项、1000项、10000项后的总和,
        是否发现每个序列都收敛于某值?

分析:  简单点说就是输入一个循环次数 ,这个次数要大于零才行
        然后导入这两个公式,这第一个公式的规律杯除数随循环的次数变化而变化
        第二个公式同样也是,但是奇数相减,偶数相加。

*/

#include <stdio.h>

int main ()
{
    double num ,i;//声明输入次数和循环次数
    printf("Please enter a number greater than zero (less than zero exit)");//请输入一个大于零的次数(小于零退出)

    /*判断用户输入是否满足*/
    while((scanf("%lf",&num) == 1) && (num > 0))
    {
        double sum1 = 0,sum2 = 0;//结果保存在这里
        int sign = 1;//用于更改符号

        /*循环累加*/
        for(i = 1.0;i <= num;i++,sign = 0 - sign)//sign随i++变化
        {
            sum1 += 1.0/i;
            sum2 += sign*1.0/i;

        }
        /*打印*/
        printf("%.lf The sum of subformula 1 is %g\n",num,sum1);//公式一的和为
        printf("%.lf The sum of subformula 2 is %g\n",num,sum2);//公式二的和为
        /*继续输入*/
        printf("Please continue tying");//请继续输入

    }
    printf("Done");
    return 0;
}

/*第六章 练习题13
题目:13.编写一个程序,创建一个包含8个元素的int类型数组,
        分别把数组元素设置为2的前8次幂。使用for循环设置
        数组元素的值,使用do while循环显示数组元素的值。

分析: 就是创建一个8个int类型元素的数组,先计算2的当前次幂在保存到第7次结束(前8次)
       然后用do while 打印

*/

#include <stdio.h>
#define NUM 8

int main(void)
{
    
    int array[NUM];
    int i;
    int value = 2;
    for(i = 0;i < NUM;i++)
    {
        array[i] = value;
        value *= 2;//*2为下一次保存做铺垫.
    }
    i = 0;
    do
    {
        printf("%d\t", array[i++]);
    } while (i < NUM);
    printf("\nDone.\n");
    return 0;
}

/*第六章 练习题14
题目:14.编写一个程序,创建两个包含8个元素的double类型数组,
        使用循环提示用户为第一个数组输入8个值。
        第二个数组元素的值设置为第一个数组对应元素的累积之和。

分析:

*/

#include <stdio.h>
#define NUM 8

int main(void)
{
    int i;
    double value1[NUM], value2[NUM];

    printf("Please enter %d numbers:\n", NUM);
    for (i = 0; i < NUM; i++)
    {
        scanf("%lf", &value1[i]);
        /* 第二个数组元素的值设置为第一个数组对应元素的累积之和。*/
        value2[i] = value1[i] + value2[i-1];
    }

    printf("Here are the results for array 1:\n");
    for (i = 0; i < NUM; i++)
    {
        printf("%-g\t", value1[i]);
    }
    printf("\nHere are the results for array 2:\n");
    for (i = 0; i < NUM; i++)
    {
        printf("%-g\t", value2[i]);
    }
    printf("\nDone.\n");

    return 0;
}


/*第六章 练习题15
题目:15.编写一个程序,读取一行输入,然后把输入的内容倒序打印出来。
        可以把输入储存在char类型的数组中,假设每行字符不超过255。
        回忆一下,根据%c转换说明,scanf()函数一次只能从输入中读
        取一个字符,而且在用户按下Enter键时scanf()函数会生成一个换行
        字符(\n)。
        */
#include <stdio.h>
#define LEN 255

int main(void)
{
    /*声明输出以及循环变量*/
    int i = 0;
    char str[LEN];

    printf("Please enter a string:\n");//请输入一个字符串
    /*do while先执行在判断*/
    do
    {
        scanf("%c", &str[i]);//i = 0所以指向第0个元素
    } /*因为是\n结束 所以先++i载判断,时候收到\n,小于数组*/
    while (str[i] != '\n' && i < LEN && ++i);


    printf("Reversing print the string is:\n");//反转输入的字符串
    for (i-1; i >= 0; i--)//i-1避免打印换行符;
    {
        printf("%c", str[i]);
    }
    printf("\nDone.\n");

    return 0;
}

/*第六章 练习题16
题目:16.Daphne以10%的单利息投资了100美元(也就是说,每年投资获利相当于原始投资的10%)。
        Deirdre以 5%的复合利息投资了100 美元(也就是说,利息是当前余额的 5%,包含之前的利息)。
        编写一个程序,计算需要多少年Deirdre的投资额才会超过Daphne,
        并显示那时两人的投资额。
        */
#include<stdio.h>

double Daphne = 100,Deirdre = 100;
int i;
int main(void)
{
    while(Daphne >= Deirdre)
    {
        Daphne += 100 * 0.1;
        Deirdre += Deirdre * 0.05;
        i++;
    }
    printf("%d 年后Deirdre的钱会超过Daphne\n",i);
    printf("DaphneMoney: %.lf\n",Daphne);
    printf("DeirdreMoney: %.lf\n",Deirdre);
    return 0;
}


/*第六章 练习题17
题目:17.Chuckie Lucky赢得了100万美元(税后),他把奖金存入年利率8%的账户。
        在每年的最后一天, Chuckie取出10万美元。编写
        一个程序,计算多少年后Chuckie会取完账户的钱?
        */
#include <stdio.h>

int main(void)
{
    int i = 0;
    double Chuckie = 100.0;

    do
    {

        Chuckie += Chuckie * 0.08;
        Chuckie -= 10;
        i++;
        printf("第(%d)年余额:%g万美元\n", i, Chuckie);
    } while (Chuckie >= 10);//每年取出来10万

    printf(" %d 年后:\n", ++i);
    printf("Chuckie 的钱就取完了\n");

    return 0;
}

/*第六章 练习题18
题目:18.Rabnud博士加入了一个社交圈。起初他有5个朋友。他注意 到他的朋友数量以下面的方式增长。
        第1周少了1个朋友,剩下的朋友 数量翻倍;第2周少了2个朋友,剩下的朋友数量翻倍。一般而言,
        第 N周少了N个朋友,剩下的朋友数量翻倍。编写一个程序,计算并显示 Rabnud博士每周的朋友数量。
        该程序一直运行,直到超过邓巴数 (Dunbar’s number)。邓巴数是粗略估算一个人在社交圈中有稳定
        关系的成员的最大值,该值大约是150。
        */
#include <stdio.h>

int main(void)
{
    int i = 1;
    int friends = 5;

    while (friends < 150)
    {
        printf("At %d weeks, Rabnud has", i);
        printf("%4d friends.\n", friends);
        /*计算下一周*/
        friends = 2 * (friends - i++);
    }
    printf("At %d weeks, over Dunbar's number(150).\n", i);

    return 0;
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值