c primer plus(第六版) 第六章答案(vscode编译运行通过)

1. 编写一个程序, 创建一个包含26个元素的数组, 并在其中储存26个小写字母。 然
后打印数组的所有内容。

#include <stdio.h>
#define SIZE 26

int main(void)
{
    char a[SIZE];

    for(int i = 0; i < SIZE; i++)
    {
        a[i] = 'a' + i;
    }
    for(int i = 0; i < SIZE; i++)
    {
        printf("%c ",a[i]);
    }
    return 0;
}

2. 使用嵌套循环, 按下面的格式打印字符:

$
$$
$$$
$$$$
$$$$$
#include <stdio.h>

int main(void)
{
    for(int i = 0; i < 5; i++)
    {
        for(int j = 0; j <= i; j++)
        {
            printf("%c",'$');
        }
        printf("\n");
    }
    return 0;
}

3. 使用嵌套循环, 按下面的格式打印字母:

F
FE
FED
FEDC
FEDCB
FEDCBA
#include <stdio.h>

int main(void)
{
    for(int i = 0; i < 6; i++)
    {
        for(int j = 0; j <= i; j++)
        {
            printf("%c",'F'-j);
        }
        printf("\n");
    }
    return 0;
}

4. 使用嵌套循环, 按下面的格式打印字母:
A
BC
DEF
GHIJ
KLMNO
PQRSTU

#include <stdio.h>

int main(void)
{
    char ch = 'A';
    int i,j;
    for(i = 1; i <= 6; i++)
    {
        for(j = 1; j <= i; j++)
        {
            printf("%c",ch++);
        }
        printf("\n");
    }
    return 0;
}

5. 编写一个程序, 提示用户输入大写字母。 使用嵌套循环以下面金字塔型的格式打
印字母:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
打印这样的图形, 要根据用户输入的字母来决定。 例如, 上面的图形是在用户输入E
后的打印结果。 提示: 用外层循环处理行, 每行使用3个内层循环, 分别处理空格、 以升
序打印字母、 以降序打印字母。 如果系统不使用ASCII或其他以数字顺序编码的代码, 请
参照练习3的解决方案。

#include <stdio.h>

int main(void)
{
    char ch;

    scanf("%c",&ch);
    for(int i = 0; i <= ch - 'A'; i++)
    {
        for(int j = i; j < ch - 'A'; j++)
            printf(" ");
        for(int k = 0; k <= i; k++)
            printf("%c",'A' + k);
        for(int t = i; t >0; t--)
            printf("%c",'A'+i-t);
        printf("\n");
    }
    return 0;
}

6. 编写一个程序打印一个表格, 每一行打印一个整数、 该数的平方、 该数的立方。
要求用户输入表格的上下限。 使用一个for 循环。

#include <stdio.h>

int main(void)
{
    int upper,lower;

    printf("Please input number's upper: ");
    scanf("%d",&upper);
    printf("Please input number's lower: ");
    scanf("%d",&lower);
    printf("%-10s%-10s%-10s\n","number","square","cube");
    for(int i = upper; i <= lower; i++)
    {
        printf("%-10d%-10d%-10d\n",i,i*i,i*i*i);
    } 
    return 0;
}

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

#include <stdio.h>
#include <string.h>
#define SIZE 10
int main(void)
{
    char word[SIZE];

    scanf("%10s", word);
    for(int i = strlen(word) - 1; i >= 0; i--)
    {
        putchar(word[i]);
    }
    return 0;
}

8. 编写一个程序, 要求用户输入两个浮点数, 并打印两数之差除以两数乘积的结
果。 在用户输入非数字之前, 程序应循环处理用户输入的每对值。

#include <stdio.h>

int main(void)
{
    double num1,num2;

    printf("Please input two double numbers:(and q to quit)");
    while(scanf("%lf%lf",&num1,&num2) == 2)
    {
        printf("%5.3f\n",(num1-num2)/(num1*num2));
        printf("Please input two double numbers:(and q to quit)");
    }
    return 0;
}

9. 修改练习8, 使用一个函数返回计算的结果。

#include <stdio.h>
double function(double x,double y);
int main(void)
{
    double num1,num2;

    printf("Please input two double numbers:(and q to quit)");
    while(scanf("%lf%lf",&num1,&num2) == 2)
    {
        printf("%5.3f\n",function(num1,num2));
        printf("Please input two double numbers:(and q to quit)");
    }
    return 0;
}

double function(double x,double y)
{
    return (x-y)/(x*y);
}

10. 编写一个程序, 要求用户输入一个上限整数和一个下限整数, 计算从上限到下限
范围内所有整数的平方和, 并显示计算结果。 然后程序继续提示用户输入上限和下限整
数, 并显示结果, 直到用户输入的上限整数等于或小于下限整数为止。 程序的运行示例如
下:
Enter lower and upper integer limits: 5 9
The sums of the squares from 25 to 81 is 255
Enter next set of limits: 3 25
The sums of the squares from 9 to 625 is 5520
Enter next set of limits: 5 5
Done

#include <stdio.h>
int main(void)
{
    int num1,num2;
    int sum=0;

    printf("Enter lower and upper integer limits:");
    while(scanf("%d%d",&num1,&num2) == 2 && (num1 != num2))
    {
        for(int i = num1; i <= num2; i++)
        {
            sum += i*i;
        }
        printf("The sums of the squares fom %d to %d is %d\n",
                num1*num1,num2*num2,sum);
        sum = 0;
        printf("Enter next set of limits:");
    }
    printf("Done");

    return 0;
}

11. 编写一个程序, 在数组中读入8个整数, 然后按倒序打印这8个整数。

#include <stdio.h>
#define SIZE 8
int main(void)
{
    int a[SIZE];

    for(int i = 0; i < SIZE; i++)
        scanf("%d",&a[i]);
    printf("The array is:\n");
    for(int i = 0; i < SIZE; i++)
        printf("%-3d ",a[i]);
    printf("\n");
    for(int i = SIZE - 1; i >= 0; i--)
        printf("%-3d ",a[i]);    
    return 0;
}

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(void)
{
    int count;
    double sum1 = 0,sum2 = 0;

    printf("Please input the number total:(and input <= 0 "
            "to quit)");
    while(scanf("%d",&count) == 1 && count > 0)
    {
        for(int i = 1; i <= count; i++)
        {
            sum1 += (double)1/i;
            if(i % 2 == 1)
            {
                sum2 += (double)1/i;
            }
            else
            {
                sum2 -= (double)1/i;
            }
        }
        printf("The 1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + ..."
              "= %.3f\n",sum1);
        printf("The 1.0 - 1.0/2.0 + 1.0/3.0 - 1.0/4.0 + ..."
              "= %.3f\n",sum2);
        sum1 = 0;
        sum2 = 0;
        printf("Please input the number total:(and input <= 0 "
            "to quit)");
    }
    return 0;
}

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

#include <stdio.h>
#include <math.h>
#define SIZE 8
int main(void)
{
    int a[SIZE];
    int value = 1;

    for(int i = 0; i < 8; i++)
    {
        a[i] = value;
        value *= 2;
    }
    int k = 0;
    do
    {
        printf("%-5d",a[k++]);
       
    } while (k < SIZE);
    
    return 0;
}

14. 编写一个程序, 创建两个包含8个元素的double类型数组, 使用循环提示用户为
第一个数组输入8个值。 第二个数组元素的值设置为第一个数组对应元素的累积之和。 例如, 第二个数组的第4个元素的值是第一个数组前4个元素之和, 第二个数组的第5个元素
的值是第一个数组前5个元素之和(用嵌套循环可以完成, 但是利用第二个数组的第5个元
素是第二个数组的第4个元素与第一个数组的第5个元素之和, 只用一个循环就能完成任
务, 不需要使用嵌套循环) 。 最后, 使用循环显示两个数组的内容, 第一个数组显示成一行, 第二个数组显示在第一个数组的下一行, 而且每个元素都与第一个数组各元素相对
应。

#include <stdio.h>
#include <math.h>
#define SIZE 8
int main(void)
{
    double array1[SIZE],array2[SIZE];
    double value = 0;

    printf("Please input eight double numbers: ");
    for(int i = 0; i < SIZE; i++)
    {
        scanf("%lf",&array1[i]);
    }
    for(int j = 0; j < SIZE; j++)
    {
        value += array1[j];
        array2[j] = value;
    }
    for(int i = 0; i < SIZE; i++)
    {
        printf("%-8.3f",array1[i]);
    }
    printf("\n");
     for(int i = 0; i < SIZE; i++)
    {
        printf("%-8.3f",array2[i]);
    }
    printf("\n");
    
    return 0;
}

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

#include <stdio.h>
#include <math.h>
#define SIZE 255
int main(void)
{
    char array[SIZE];
    int i = 0;
    do
    {
        scanf("%c",&array[i]);
    } while (array[i] != '\n' && ++i && i < SIZE);
    for(i--; i >= 0; i--)
    {
        printf("%c",array[i]);
    }
    
    
    return 0;
}

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

#include <stdio.h>
#include <math.h>
#define RATE1 0.1
#define RATE2 0.05
int main(void)
{
    double daphne_count = 100,derirdre_count = 100;
    int year = 0;

    while(daphne_count >= derirdre_count)
    {
        daphne_count += 100 * RATE1;
        derirdre_count += derirdre_count * RATE2;
        year++;
    }
    printf("After %d years,Deirdre's count is lager than Daphne's"
            "count\n",year);
    printf("The Daphne's count is $%.2f\n",daphne_count);
    printf("The Derirdre's count is $%.2f\n",derirdre_count);

    return 0;
}

17. Chuckie Lucky赢得了100万美元(税后) , 他把奖金存入年利率8%的账户。 在每
年的最后一天, Chuckie取出10万美元。 编写一个程序, 计算多少年后Chuckie会取完账户的钱?

#include <stdio.h>
#include <math.h>
#define RATE 0.08
#define INIT_MONEY 100
#define TAKE_OUT_MONEY 10

int main(void)
{
    int year = 0;
    double balance = INIT_MONEY;
    do
    {
        balance += balance * RATE;
        balance -= 10;
        year++;
    } while (balance > 0);
    printf("After %d years,The balance is 0\n",year);

    return 0;
}

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

#include <stdio.h>
#include <math.h>
#define DUNBAR_NUMBER 150

int main(void)
{
    int week = 0;
    int friends_number = 5;

    while (friends_number <= DUNBAR_NUMBER)
    {
      week++;
      friends_number -= week;
      friends_number *= 2;
      if(friends_number <= DUNBAR_NUMBER)
      printf("After %d week,the friend's number is %d\n", 
                week, friends_number);
    }  
     printf("After %d week,the friend's number is over Dunbar's number\n", 
                week, friends_number);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值