《C Primer Plus》第六章 编程习题

发布于:2023-01-13 ⋅ 阅读:(432) ⋅ 点赞:(0)

目录

6.16.1

6.16.2

6.16.3

6.16.4

6.16.5

6.16.6

6.16.7

6.16.8

6.18.9

6.16.10

6.16.11

6.16.12

6.16.13

6.16.14

6.16.15

6.16.16

6.16.17

6.16.18


6.16.1

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

/*6.16.1. 编写一个程序,创建一个包含26个元素的数组,并在其中储存26个小写字母。
然后打印数组的所有内容。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	char ch[26];
	int n = 0;

	for (n = 0; n < 26; n++)
	{
		ch[n] = 'a' + n;
		printf("%c ", ch[n]);
	}
	return 0;
}

运行结果:

6.16.2

使用嵌套格式,按下面的格式打印字符:
$
$$
$$$
$$$$
$$$$$

/*6.16.2. 使用嵌套格式,按下面的格式打印字符:
$
$$
$$$
$$$$
$$$$$
*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int x, y;
	for (x = 1; x <= 5; x++)
	{
		for (y = 0; y < x; y++)
		{
			printf("$");
		}
		printf("\n");
	}
	return 0;
}

运行结果:

6.16.3

使用嵌套循环,按下面的格式打印字母:
F
FE
FED
FEDC
FEDCB
FEDCBA
注意:如果你的系统不使用ASCII或其他以数字顺序编码的代码,可以把字符数组初始化为字母表中的字母:
char lets[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

/*6.16.3. 使用嵌套循环,按下面的格式打印字母:
F
FE
FED
FEDC
FEDCB
FEDCBA
注意:如果你的系统不使用ASCII或其他以数字顺序编码的代码,可以把字符数组初始化为字母表中的字母:
char lets[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; */

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	char ch[6];
	int n = 0;
	int m = 0;

	for (n = 0; n < 6; n++)
	{
		for (m = 0; m <= n; m++)
		{
			ch[n] = 'F' - m;
			printf("%c", ch[n]);
		}
		printf("\n");
	}	
	return 0;
}

运行结果:

6.16.4

使用嵌套循环,按下面的格式打印字母:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
如果你的系统不适用以数字顺序编码的代码,请参照练习3的方案解决。

/*6.16.4. 使用嵌套循环,按下面的格式打印字母:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
如果你的系统不适用以数字顺序编码的代码,请参照练习3的方案解决。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int x;   //行
	int y;   //下标
	int k;   
	int sum = 0;  //打印次数
	
	for (x = 0; x < 6; x++)
	{
		k = sum;
		for (y = k; y <= k + x; y++)
		{
			printf("%c", 'A' + y);
			sum++;
		}
		printf("\n");
	}
	return 0;
}

运行结果:

6.16.5

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

/*6.16.5. 编写一个程序,提示用户输入信息。使用嵌套循环以下面金字塔型的格式打印字母:
     A
	ABA
   ABCBA
  ABCDCBA
 ABCDEDCBA
打印这样的图形,要根据用户输入的字母来决定。例如,上面的图形是在用户输入E后的打印结果。
提示:用外层循环处理行,每行使用3个内层循环,分别处理空格、以升序打印字母、以降序打印字母。
如果系统不使用ASCII或其他以数字顺序编码的代码,请参照练习3的解决方案。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	char ch;
	int x, y, z, w, length;
	printf("输入一个字母:");
	scanf("%c", &ch);

	length = ch - 'A';              
	//以'A'为基点,假设A对应1,则B对应2,C对应3,D对应4,E对应5,length = 5-1 =4
	//实际电脑里字母都有对应的ASKII码值,但是个人觉得没必要特意去背,所以这里假设从1开始了

	for (x = 0; x <= length; x++)     //限定行数
	{   
		//length是输入字符的长度
	    //根据输入的字母来限定打印多少行
	    //比如输入'A',打印1行;输入'B',打印2行;输入'E',打印5行

		for (y = 0; y <= length - x; y++)     //限定空格数
		{ 
			//限定每一行的空格数
			//如果输入的是'E':
			//length = 4,根据上个循环可以知道要打印5行
			//根据本循环知道:第1行打印4个空格,第2行打印3个空格,第3行打印2个空格
			//第4行打印1个空格,第5行打印0个空格

			printf(" ");
		}
		for (z = 0; z <= x; z++)     //升序
		{
			//第1行打印1个字符,第2行打印2个字符,以此类推

			printf("%c", 'A' + z);
		}
		for (w = x - 1; w >= 0; w--)   //降序
		{
			//第1行不打印,第2行打印1个字符,第3行打印2个字符,以此类推
			//第1行,x = 0, w = -1, 条件不成立,所以跳过
			//第2行,x = 1, w = 1, 所以打印1个
			
			printf("%c", 'A' + w);
		}
		printf("\n");
	}
	return 0;
}

运行结果:

输入大写Z得到:

输入小写字母z得到:

6.16.6

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

/*6.16.6. 编写一个程序打印一个表格,每一行打印一个整数、该数的平方、该数的立方。
要求用户输入表格的上下限。使用一个for循环。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int n = 0;
	int x = 0;
	int y = 0;  
	int temp = 0;
	printf("请输入表格的下限和上限:\n");
	scanf("%d %d", &x, &y);
	if (x > y)     //此条件语句是为了确保x是下限,y是上限
	{
		temp = x;
		x = y;
		y = temp;
	}
	printf("       整数      平方      立方\n");
	for (n = x; ((n >= x) && (n <= y)); n++)
		printf("%10d %10d %10d\n", n, n * n, n * n * n);
	return 0;
}

 运行结果:

6.16.7

/*6.16.7. 编写一个程序把一个单词读入一个字符数组中,然后倒序打印这个单词。
提示:strlen()函数(第4章介绍过)可用于计算数组最后一个字符的下标。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main(void)
{
	char ch[50];
	int x = 0;
	int y = 0;
	printf("请输入一个单词:");
	scanf("%s", ch);
	y = strlen(ch);  //strlen(ch) 是读取的字符串的长度
	
	printf("倒序是:");
	for (x = y - 1; x >= 0; x--)  //字符串长度-1,结束字符串最后一个字母的下标
	{
		printf("%c", ch[x]);
	}
	printf("\n");
	return 0;
}

运行结果:

6.16.8

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

/*6.16.8. 编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。
在用户输入非数字之前,程序应循环处理用户输入的每对值。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	float x, y;
	printf("请输入两个浮点数:\n");
	while (scanf("%f %f", &x, &y) == 2)
	{
		printf("%f\n", (x - y) / (x * y));
	}
	printf("输入非数字,结束循环\n");
	return 0;
}

运行结果:

6.18.9

修改练习8,使用一个函数返回计算的结果。
练习8题目:编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。
在用户输入非数字之前,程序应循环处理用户输入的每对值。

/*6.16.9. 修改练习8,使用一个函数返回计算的结果。
练习8题目:编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。
在用户输入非数字之前,程序应循环处理用户输入的每对值。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
float temp(float x, float y);
int main(void)
{
	float a, b, c;
	printf("请输入两个浮点数:\n");
	while (scanf("%f %f", &a, &b) == 2)  //scanf返回的是读取成功的个数
	{
		c = temp(a, b);
		printf("%f\n", c);
	}
	printf("输入非数字,结束循环\n");
	return 0;
}
float temp(float x, float y)
{
	float z;
	z = (x - y) / (x * y);
	return z;
}

运行结果:

6.16.10

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

/*6.16.10. 编写一个程序,要求用户输入一个上限整数和一个下限整数,计算从上限到下限范围内所有整数的平方和,并显示计算结果。然后程序继续提示用户输入上限和下限整数,并显示结果,直到用户输入的上限整数等于或小于下限整数为止。程序的运行示例如下:
Enter lower and upper integer limits: 5 9
The sums of the squares from 25 to 81 is 255
The next set of limits: 3 25
The sums of the squares from 9 to 625 is 5520
The next set of limits: 5 5
Done
*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int x = 0;   //下限
	int y = 0;   //上线
	int n = 0;
	int sum = 0;
	printf("Enter lower and upper integer limits: ");
	scanf("%d %d", &x, &y);
	while (x < y)
	{
		for (n = x; ((n >= x) && (n <= y)); n++)
			sum += (n * n);
		printf("The sums of the squares from %d to %d is %d\n", x * x, y * y, sum);
		sum = 0;
		printf("The next set of limits: ");
		scanf("%d %d", &x, &y);
	}
	printf("Done\n");
	return 0;
}

运行结果:

6.16.11

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

/*6.16.11. 编写一个程序,在数组中读入8个整数,然后按倒序打印这8个整数。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int ch[8];
	int n;
	int x;
	printf("请输入8个整数:\n");
	for (n = 0; n < 8; n++)
	{
		scanf("%d", &ch[n]);   //可以输入8个以上,但是最后只读取8个
	}
	
	printf("确认读取8个整数:\n");
	for (n = 0; n < 8; n++)
	{
		printf("%d ", ch[n]);
	}
	printf("\n");
	
	printf("倒序为:\n");
	for (x = 7; x >= 0; x--)
	{
		printf("%d ", ch[x]);
	}
	printf("\n");
	return 0;
}

运行程序:

6.16.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项后的总和,是否发现每个序列都收敛于某值?

解析:由观察发现,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 + …序列不收敛。

/*6.16.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项后的总和,是否发现每个序列都收敛于某值?*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int num = 0;
	int k = 0;
	double m = 0;
	double n = 0;
	double sum_m = 0;
	double sum_n = 0;
	
    printf("请输入次数:\n");
	scanf("%d", &k);
	while (k > 0)
	{
		for (num = 0, m = 1.0, n = 1; num < k; num++, m++, n *= -1)
		{
			sum_m += 1.0 / m;
			sum_n += n / m;
		}
		printf("sum_m = %lf\n", sum_m);
		printf("sum_n = %lf\n", sum_n);
		
		printf("请输入次数:\n");
		scanf("%d", &k);
		sum_m = 0;     // 重新初始化
		sum_n = 0;     // 重新初始化
	}
	printf("结束\n");
	return 0;
}

 运行结果:

6.16.13

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

/*6.16.13. 编写一个程序,创建一个包含8个元素的int类型数组,分别把数组元素设置为2的前8次幂。
使用for循环设置数组元素的值,使用do while循环显示数组元素的值。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define SIZE 8    //把8设置为常量,这样以后可以调整元素个数很方便
int main(void)
{
	int i = 0;
	int digit[SIZE];
	int sum = 1;
	for (i = 0; i < SIZE; i++)
	{
		digit[i] = sum;
		sum *= 2;    //2的n次方,就是n个2相乘
	}
	i = 0;
	do
	{
		printf("第 %d 个元素的值是:%d\n", i, digit[i]);
		i++;
	} while (i < 8);
	return 0;
}

运行结果:

6.16.14

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

/*6.16.14. 编写一个程序,创建两个包含8个元素的double类型数组,使用循环提示用户为
第一个数组输入8个值。第二个数组元素的值设置为第一个数组对应的元素的累计之和。
例如,第二个数组的第4个元素的值是第一个数组前4个元素之和,第二个数组的第5个元素的值
是第一个数组前5个元素之和(用嵌套循环可以完成,但是利用第二个数组的第5个元素是第二个
数组的第4个元素与第一个数组的第5个元素之和,只用一个循环就能完成任务,不需要使用嵌套
循环)。最后,使用循环显示两个数组的内容,第一个数组显示成一行,第二个数组显示在第一
个数组的下一行,而且每个元素都与第一个数组各元素相对应。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define SIZE 8    //把8设置为常量,这样以后可以调整元素个数很方便
int main(void)
{
	int i = 0;
	int k = 0;
	double d1[SIZE];
	double d2[SIZE];
	
    printf("输入8个浮点数:\n");   
	for (i = 0; i < SIZE; i++) 
	{
		scanf("%lf", &d1[i]);   //这里输入用户输入大于8个数也没关系,只会读取8个
	}
	d2[0] = d1[0];
	for (i = 1; i < SIZE; i++)
	{
		d2[i] = d1[i] + d2[i - 1];
		//printf("%lf ", d2[i]);
	}
	
    printf("数组d1:\n");
	for (i = 0; i < SIZE; i++)
	{
		printf("%10g", d1[i]);
	}
	printf("\n");
	
	printf("数组d2:\n");
	for (i = 0; i < SIZE; i++)
	{
		printf("%10g", d2[i]);
	}
	printf("\n");

	return 0;
}

运行结果:

6.16.15

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

/*6.16.15. 编写一个程序,读取一行输入,然后把输入的内容倒序打印出来。可以把输入储存
在char类型的数组中,假设每行字符不超过255。回忆一下,根据%c转换说明,scanf()函数一次
只能从输入中读取一个字符,而且在用户按下Enter键时scanf()函数会生成一个换行符(\n)。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#define SIZE 255
int main(void)
{
	char ch[SIZE];
	int t, x;
	gets(ch);        //读取一整行
	t = strlen(ch);  //获取一整行的字符数
	for (x = t -1; x >= 0; x--)   //最右字符的下标是 字符数-1
	{
		//printf("%d %c\n", x, ch[x]);   //可以测试下标对应的字符
		printf("%c", ch[x]);
	}	
	printf("\n");
	return 0;
}

运行结果:

6.16.16

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

/*6.16.16. Daphne以10%的单利息投资了100美元(也就是说,每年投资获利相当于原始投
资的10%)。Deirdre 以5%的复合利息投资了100美元(也就是说,利息是当前余额的5%,包
含之前的利息)。编写一个程序,计算需要多少年Deirdre的投资额才会超过Daphne,并显示
那时两人的投资额。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	float x, z;
	int y = 0;
	float sum_da = 100;    //Daphne
	float sum_de = 100;    //Deirdre
	x = 100 * 0.1;
	z = 1 + 0.05;  //先把下面sum_de表达式规律找出来,再来赋值
	for (y = 1; sum_de <= sum_da; y++)
	{
		sum_da = 100 + (x * y);	
		sum_de *= z;	
	}
	printf("经过 %d 年Deirdre的投资额才会超过Daphnen\n", y - 1);
	printf("%.2f\n", sum_da);
	printf("%.2f\n", sum_de);
	return 0;
}

运行结果:

6.16.17

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

/*6.16.17. Chuckie Luchy 赢得了100万美元(税后),他把奖金存入年利率8%的账户。
在每年的最后一天,Chuckie 取出10万美元。编写一个程序,计算多少年后Chuckie会取完账户的钱?*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int y;
	float x;
	float sum = 100;
	x = 1 + 0.08;    //先把sum表达式规律找出来,再来赋值
	for (y = 1; sum > 0; y++)
	{
		sum = sum * x - 10; 
	}
	printf("%d\n", y - 1);
	return 0;
}

运行结果:

6.16.18

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

/*6.16.18. Rabnud博士加入了一个社交圈。起初他有5个朋友。他注意到他的朋友数量以下面
的方式增长,第1周少了1个朋友,剩下的朋友数量翻倍;第2周少了2个朋友,剩下的朋友数量翻倍。
一般而言,第N周少了N个朋友,剩下的朋友数量翻倍。编写一个程序,计算并显示Rabnud博士每周
的朋友数量。该程序一直运行,直到超过邓巴数(Dunbar's number)。邓巴数是粗略估算一个人
在社交圈中有稳定关系的成员的最大值,该值大约是150。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int y = 0;
	int sum = 5;
	for (y = 1; sum <= 150; y++)
	{
		sum = (sum - y) * 2;
		printf("第 %d 周的朋友数量是:%d\n", y, sum);
	}
	return 0;
}

运行结果: