《C Primer Plus》(第六版)第六章:C控制语句:循环|复习题与编程练习答案参考

这章习题多得离谱,我一个小白写了7个小时。
目录

复习题

1.写出执行完下列各行后quack的值是多少。后5行中使用的是第1行

quack的值。

int quack = 2;

quack += 5;

quack *= 10;

quack -= 6;

quack /= 8;

quack %= 3;

2.假设value是int类型,下面循环的输出是什么?

for ( value = 36; value > 0; value /= 2)

printf("%3d", value);

如果value是double类型,会出现什么问题?

 36 18  9  4  2  1

3.用代码表示以下测试条件:

a.大于5

b. scanf()读取一个名为x的double的类型值且失败

c.X的值等于5

4.用代码表示以下测试条件:

a. scanf()成功读入一个整数

b.x不等于5

c. x大于或等于20

5.下面的程序有点问题,请找出问题所在。

#include

int main(void)

{ /* 第3行 */

int i, j, list(10); /* 第4行 */

for (i = 1, i <= 10, i++) /* 第6行 */

{ /* 第7行 */

list[i] = 2*i + 3; /* 第8行 */

for (j = 1, j > = i, j++) /* 第9行 */

printf(" %d", list[j]); /* 第10行 */

printf("\n"); /* 第11行 */

} /* 第12行 */

6.编写一个程序打印下面的图案,要求使用嵌套循环:

$$$$$$$$

$$$$$$$$

$$$$$$$$

$$$$$$$$

外层循环控制行数,内层循环控制列数。

7.下面的程序各打印什么内容?

a.

#include

int main(void)

{

int i = 0;

while (++i < 4)

printf("Hi! ");

do

printf("Bye! ");

while (i++ < 8);

return 0;

}

b.

#include

int main(void)

{

int i;

char ch;

for (i = 0, ch = 'A'; i < 4; i++, ch += 2 * i)

printf("%c", ch);

return 0;

}

8.假设用户输入的是 Go west , young man! ,下面各程序的输出是什

么?(在ASCII码中,!紧跟在空格字符后面)

a.

#include

int main(void)

{

char ch;

scanf("%c", &ch);

while (ch != 'g')

{

printf("%c", ch);

scanf("%c", &ch);

}

return 0;

}

b.

#include

int main(void)

{

char ch;

scanf("%c", &ch);

while (ch != 'g')

{

printf("%c", ++ch);

scanf("%c", &ch);

}

return 0;

}

c.

#include

int main(void)

{

char ch;

do {

scanf("%c", &ch);

printf("%c", ch);

} while (ch != 'g');

return 0;

}

d.

#include

int main(void)

{

char ch;

scanf("%c", &ch);

for (ch = '$'; ch != 'g'; scanf("%c", &ch))

printf("%c", ch);

return 0;

}

9.下面的程序打印什么内容?

#include

int main(void)

{

int n, m;

n = 30;

while (++n <= 33)

printf("%d|", n);

n = 30;

do

printf("%d|", n);

while (++n <= 33);

printf("\n***\n");

for (n = 1; n*n < 200; n += 4)

printf("%d\n", n);

printf("\n***\n");

for (n = 2, m = 6; n < m; n *= 2, m += 2)

printf("%d %d\n", n, m);

printf("\n***\n");

for (n = 5; n > 0; n--)

{

for (m = 0; m <= n; m++)

printf("=");

printf("\n");

}

return 0;

}

10.考虑下面的声明:

double mint[10];

a.数组名是什么?

b.该数组有多少个元素?

c.每个元素可以储存什么类型的值?

d.下面的哪一个scanf()的用法正确?

i.scanf("%lf", mint[2])

ii.scanf("%lf", &mint[2])

iii.scanf("%lf", &mint)

11.Noah先生喜欢以2计数,所以编写了下面的程序,创建了一个储存

2、4、6、8等数字的数组。

这个程序是否有错误之处?如果有,请指出。

#include

#define SIZE 8

int main(void)

{

int by_twos[SIZE];

int index;

for (index = 1; index <= SIZE; index++)

by_twos[index] = 2 * index;

for (index = 1; index <= SIZE; index++)

printf("%d ", by_twos);

printf("\n");

return 0;

}

12.假设要编写一个返回long类型值的函数,函数定义中应包含什么?

13.定义一个函数,接受一个int类型的参数,并以long类型返回参数的平

方值。

14.下面的程序打印什么内容?

#include

int main(void)

{

int k;

for (k = 1, printf("%d: Hi!\n", k); printf("k = %d\n", k),

k*k < 26; k += 2, printf("Now k is %d\n", k))

printf("k is %d in the loop\n", k);

return 0;

}

编程题

1.编写一个程序,创建一个包含26个元素的数组,并在其中储存26个小

写字母。然后打印数组的所有内容。

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

$

$$

$$$

$$$$

$$$$$

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

F

FE

FED

FEDC

FEDCB

FEDCBA

注意:如果你的系统不使用ASCII或其他以数字顺序编码的代码,可以把字符数组初始化为字母表中的字母:

char lets[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

然后用数组下标选择单独的字母,例如lets[0]是‘A’,等等。

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

A

BC

DEF

GHIJ

KLMNO

PQRSTU

如果你的系统不使用以数字顺序编码的代码,请参照练习3的方案解决。

5.编写一个程序,提示用户输入大写字母。使用嵌套循环以下面金字塔型的格式打印字母:

    A   ABA  ABCBA ABCDCBAABCDEDCBA

打印这样的图形,要根据用户输入的字母来决定。例如,上面的图形是在用户输入E后的打印结果。

提示:用外层循环处理行,每行使用3个内层循环,分别处理空格、以升序打印字母、以降序打印字母。如果系统不使用ASCII或其他以数字顺序编码的代码,请参照练习3的解决方案。

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

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

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

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

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

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

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

调和级数(第一个序列)是发散的,即它的和会随着项数的增加而无限增大。而交错调和级数(第二个序列)是收敛的,它的和会趋向于一个特定的有限值(大约是0.688172159)。

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

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

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

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

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

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


复习题

1.写出执行完下列各行后quack的值是多少。后5行中使用的是第1

quack的值。

int quack = 2;

quack += 5;

quack *= 10;

quack -= 6;

quack /= 8;

quack %= 3;

第一行:quack=2;

第二行:quack=7;

第三行:quack=70;

第四行:quack=64;

第五行:quack=8;

第六行:quack=2.

2.假设valueint类型,下面循环的输出是什么?

for ( value = 36; value > 0; value /= 2)

printf("%3d", value);

如果valuedouble类型,会出现什么问题?

 36 18  9  4  2  1

如果 value double 类型,即使 value 小于 1 ,循环的测试条件仍然为真。 循环将一直执行,直到浮点数下溢生成0 为止。另外, value double 类型时,%3d 转换说明也不正确。

3.用代码表示以下测试条件:

a.大于5

b. scanf()读取一个名为x的double的类型值且失败

c.X的值等于5

x>5;
scanf("%lf",&x)!=1;
X==5.

4.用代码表示以下测试条件:

a. scanf()成功读入一个整数

b.x不等于5

c. x大于或等于20

scanf("%d",&x)==1;
x!=5;
x>=20.

5.下面的程序有点问题,请找出问题所在。

#include <stdio.h>

int main(void)

{ /* 3*/

int i, j, list(10); /* 4*/

for (i = 1, i <= 10, i++) /* 6*/

{ /* 7*/

list[i] = 2*i + 3; /* 8*/

for (j = 1, j > = i, j++) /* 9*/

printf(" %d", list[j]); /* 10*/

printf("\n"); /* 11*/

} /* 12*/

#include <stdio.h>
int main(void)
{ /* 第3行 */
	int i, j, list[10]; /* 第4行 */
	for (i = 0; i < 10; i++) /* 第6行 */
	{ /* 第7行 */
		list[i] = 2 * i + 3; /* 第8行 */
		for (j = 0; j <= i;j++)/* 第9行 */
			printf(" %d", list[j]); /* 第10行 */
		printf("\n");/* 第11行 */
	}
	return 0;
	} /* 第12行 */

6.编写一个程序打印下面的图案,要求使用嵌套循环:

$$$$$$$$

$$$$$$$$

$$$$$$$$

$$$$$$$$

#include<stdio.h>
int main()
{
	for (int i = 1; i <= 4; i++)
	{
		for (int j = 1; j <= 8; j++)
		{
			printf("$");
		}
		printf("\n");
	}
	return 0;
}

外层循环控制行数,内层循环控制列数。

7.下面的程序各打印什么内容?

a.

#include <stdio.h>

int main(void)

{

int i = 0;

while (++i < 4)

printf("Hi! ");

do

printf("Bye! ");

while (i++ < 8);

return 0;

}

b.

#include <stdio.h>

int main(void)

{

int i;

char ch;

for (i = 0, ch = 'A'; i < 4; i++, ch += 2 * i)

printf("%c", ch);

return 0;

}

a.
Hi! Hi! Hi! Bye! Bye! Bye! Bye! Bye! Bye! Bye! Bye!

b.
ACGM

8.假设用户输入的是 Go west , young man! ,下面各程序的输出是什

么?(在ASCII码中,!紧跟在空格字符后面)

a.

#include <stdio.h>

int main(void)

{

char ch;

scanf("%c", &ch);

while (ch != 'g')

{

printf("%c", ch);

scanf("%c", &ch);

}

return 0;

}

b.

#include <stdio.h>

int main(void)

{

char ch;

scanf("%c", &ch);

while (ch != 'g')

{

printf("%c", ++ch);

scanf("%c", &ch);

}

return 0;

}

c.

#include <stdio.h>

int main(void)

{

char ch;

do {

scanf("%c", &ch);

printf("%c", ch);

} while (ch != 'g');

return 0;

}

d.

#include <stdio.h>

int main(void)

{

char ch;

scanf("%c", &ch);

for (ch = '$'; ch != 'g'; scanf("%c", &ch))

printf("%c", ch);

return 0;

}

a.
Go west, youn
b.
Hp!xftu-!zpvo(ASCII码全加1)
c.
Go west, young
d.
$o west, youn

9.下面的程序打印什么内容?

#include <stdio.h>

int main(void)

{

int n, m;

n = 30;

while (++n <= 33)

printf("%d|", n);

n = 30;

do

printf("%d|", n);

while (++n <= 33);

printf("\n***\n");

for (n = 1; n*n < 200; n += 4)

printf("%d\n", n);

printf("\n***\n");

for (n = 2, m = 6; n < m; n *= 2, m += 2)

printf("%d %d\n", n, m);

printf("\n***\n");

for (n = 5; n > 0; n--)

{

for (m = 0; m <= n; m++)

printf("=");

printf("\n");

}

return 0;

}

#include <stdio.h>
int main(void)
{
	int n, m;
	n = 30;
	while (++n <= 33)  //执行3次
		printf("%d|", n);//31|32|33|
	n = 30;
	do
		printf("%d|", n);//|30|31|32|33
	while (++n <= 33);
	printf("\n***\n");//打印***一行
	for (n = 1; n * n < 200; n += 4)
		printf("%d\n", n);//1 5 9 13 
	printf("\n***\n");//打印***一行
	for (n = 2, m = 6; n < m; n *= 2, m += 2)
		printf("%d %d\n", n, m);//(a_n=2^n,a_m=2n+4) 当a_n>2n+4时停止循环 循环3次
	printf("\n***\n");//打印***一行
	for (n = 5; n > 0; n--)//5行
	{
		for (m = 0; m <= n; m++)//第1行6列,第2行5列,依次递减
			printf("=");
		printf("\n");
	}
	return 0;
}
31|32|33|30|31|32|33|
***
1
5
9
13

***
2 6
4 8
8 10

***
======
=====
====
===
==

10.考虑下面的声明:

double mint[10];

a.数组名是什么?

b.该数组有多少个元素?

c.每个元素可以储存什么类型的值?

d.下面的哪一个scanf()的用法正确?

i.scanf("%lf", mint[2])

ii.scanf("%lf", &mint[2])

iii.scanf("%lf", &mint)

a.
mint
b.
10
c.double
d.
ii
ii 行正确, mint[2] double 类型的值, &mingt[2] 是它在内存中的位
置。

11.Noah先生喜欢以2计数,所以编写了下面的程序,创建了一个储存

2468等数字的数组。

这个程序是否有错误之处?如果有,请指出。

#include <stdio.h>

#define SIZE 8

int main(void)

{

int by_twos[SIZE];

int index;

for (index = 1; index <= SIZE; index++)

by_twos[index] = 2 * index;

for (index = 1; index <= SIZE; index++)

printf("%d ", by_twos);

printf("\n");

return 0;

}

因为第 1 个元素的索引是 0 ,所以循环的范围应该是 0 SIZE - 1 ,而 不是1 SIZE 。但是,如果只是这样更改会导致赋给第 1 个元素的值是 0 ,不 是2 。所以,应重写这个循环:
for (index = 0; index < SIZE; index++)
by_twos[index] = 2 * (index + 1);
与此类似,第 2 个循环的范围也要更改。另外,应该在数组名后面使用 数组索引:
for( index = 0; index < SIZE; index++)
printf("%d ", by_twos[index]);
错误的循环条件会成为程序的定时炸弹。程序可能开始运行良好,但是 由于数据被放在错误的位置,可能在某一时刻导致程序不能正常工作。

12.假设要编写一个返回long类型值的函数,函数定义中应包含什么?

该函数应声明为返回类型为 long ,并包含一个返回 long 类型值的 return语句。

13.定义一个函数,接受一个int类型的参数,并以long类型返回参数的平

方值。

long square(int a)
{
	long b = a * a;

	return b;
}

14.下面的程序打印什么内容?

#include <stdio.h>

int main(void)

{

int k;

for (k = 1, printf("%d: Hi!\n", k); printf("k = %d\n", k),

k*k < 26; k += 2, printf("Now k is %d\n", k))

printf("k is %d in the loop\n", k);

return 0;

}

1: Hi!
k = 1
k is 1 in the loop
Now k is 3
k = 3
k is 3 in the loop
Now k is 5
k = 5
k is 5 in the loop
Now k is 7
k = 7
初始化只在for循环中执行一次。

编程题

1.编写一个程序,创建一个包含26个元素的数组,并在其中储存26个小

写字母。然后打印数组的所有内容。

#include<stdio.h>
int main()
{
	char arr[26];
	
	for (int i=0; i < 26; i++)
	{
		arr[i] = 'a' + i;
	}
	for (int j = 0; j < 26; j++)
	{
		printf("%c ", arr[j]);
	}

}

更新在执行完循环体语句后进行。

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

$

$$

$$$

$$$$

$$$$$

#include<stdio.h>
int main()
{
	for (int i = 1; i <= 5; i++)
	{
		for (int j = 1; j <= i; j++)
		{
			printf("$");
		}
		printf("\n");
	}
	return 0;
}

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

F

FE

FED

FEDC

FEDCB

FEDCBA

注意:如果你的系统不使用ASCII或其他以数字顺序编码的代码,可以把字符数组初始化为字母表中的字母:

char lets[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

然后用数组下标选择单独的字母,例如lets[0]‘A’,等等。

#include<stdio.h>
int main()
{
	for (int i = 1; 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

如果你的系统不使用以数字顺序编码的代码,请参照练习3的方案解决。

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

5.编写一个程序,提示用户输入大写字母。使用嵌套循环以下面金字塔型的格式打印字母:

    A
   ABA
  ABCBA
 ABCDCBA
ABCDEDCBA

打印这样的图形,要根据用户输入的字母来决定。例如,上面的图形是在用户输入E后的打印结果。

提示:用外层循环处理行,每行使用3个内层循环,分别处理空格、以升序打印字母、以降序打印字母。如果系统不使用ASCII或其他以数字顺序编码的代码,请参照练习3的解决方案。

#include<stdio.h>
int main()
{
	char input;
	int  rows;
	printf("请输入大写字母(如:E):\n");
	scanf_s("%c", &input);
	rows = input - 'A' + 1;

	for (int i = 1; i <= rows; i++)
	{
		for (int j = i; j < rows; j++)
		{
			printf(" ");
		}


		for (int m = 0; m < i; m++)
		{
			printf("%c", 'A' + m);
		}
		

		for (int n = i-2; n >= 0 ; n--)
		{
			printf("%c", 'A' + n + i);
		}
		printf("\n");
	}
	
	return 0;
}

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

#include<stdio.h>
int main()
{
	int upper_limits, lower_limits;
	printf("请输入表格的上限:");
	scanf_s("%d", &upper_limits);
	printf("请输入表格的下限:");
	scanf_s("%d",&lower_limits);
	for (int i = lower_limits; i <= upper_limits; i++)
	{
		int square = i * i;
		int cube = i * i * i;
		printf("%d\t%d\t%d\n", i,square , cube);
	}
	
	return 0;
}

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

#include <stdio.h>
#include <string.h>

#define MAX 100

int main() {
    char word[MAX];
    char ch;
    int n = 0;

    printf("请输入单词:");
    while (n < MAX - 1 && (ch = getchar()) != ' ' && ch != '\n' && ch != EOF) {
        word[n++] = ch;
    }
  
    word[n] = '\0';

    printf("\n你输入的单词是: %s\n", word);

    printf("\n该单词的倒序是:");
    for (int i = strlen(word) - 1; i >= 0; i--) {
        printf("%c", word[i]);
    }
    printf("\n");

    return 0;
}

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

#include<stdio.h>
int main()
{
	float n, m;
	printf("输入两个浮点数(以空格为间隔):");
	while (scanf_s("%f %f", &n , &m) == 2)
	{
		printf("两数之差除以两数乘积值为:%f\n", (n - m) / (n * m));
		printf("继续输入或输入q结束:");
	}
	printf("\n结束\n");
	return 0;
}

scanf_s在读取字符数组时才提供缓冲区

scanf_s在成功读取指定数量的项时,返回该数量,而不是0或1

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

#include<stdio.h>
void result(float a, float b);

int main()
{
	float n, m;
	printf("输入两个浮点数(以空格为间隔):");
	while (scanf_s("%f %f", &n , &m) == 2)
	{
		result(n, m);
		printf("继续输入或输入q结束:");
	}
	printf("\n结束\n");
	return 0;
}

void result(float a, float b)
{
	printf("两数之差除以两数乘积值为:%f\n", (a - b) / (a * b));
}

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()
{
	int upper_limits, lower_limits;
	printf("请输入上限:");
	scanf_s("%d", &upper_limits);
	printf("请输入下限:");
	scanf_s("%d", &lower_limits);

	while (upper_limits > lower_limits)
	{
		for (int i = lower_limits; i <= upper_limits; i++)
		{
			int square = i * i;
			printf("%d\t%d\n", i, square);
		}
		printf("\n注意:上限小于下限时退出\n");

		printf("\n请输入上限:");
		scanf_s("%d", &upper_limits);
		printf("请输入下限:");
		scanf_s("%d", &lower_limits);

	}
	printf("\n");
	printf("上限小于下限,退出。\n");

	return 0;
}

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

#include<stdio.h>
int main()
{
	int arr[8];
	printf("请输入8个整数(回车键读取):\n");
	for (int i = 0; i < 8; i++)
	{
		scanf_s("%d", &arr[i]);
	}
	printf("\n倒序为:\n");
	for (int j = 7; j >= 0; j--)
	{
		printf("%d ", arr[j]);
	}

	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()
{
	int num;
	float sum_1 = 0;
	float sum_2 = 0;

	printf("输入次数:");
	scanf_s("%d", &num);

	while (num>0)
	{
		 sum_1 = 0;
		 sum_2 = 0;

		for (int i = 1; i <= num; i++)

		{
			sum_1 += 1.0 / (float)i;
		}

		for (int i = 1; i <= num; i++)
		{
			if (i % 2 == 0)
			{
				sum_2 -= 1.0 / (float)i;
			}
			else
			{
				sum_2 += 1.0 / (float)i;
			}
		}

		printf("\n第一个序列前%d等于:%f\n",num, sum_1);
		printf("第二个序列前%d等于:%f\n", num,sum_2);

		printf("\n输入次数(输入0或负数退出):\n");
		scanf_s("%d", &num);

	}
	printf("\n退出\n");

	return 0;
}
输入次数:2

第一个序列前2等于:1.500000
第二个序列前2等于:0.500000

输入次数(输入0或负数退出):
100

第一个序列前100等于:5.187378
第二个序列前100等于:0.688172

输入次数(输入0或负数退出):
1000

第一个序列前1000等于:7.485478
第二个序列前1000等于:0.692646

输入次数(输入0或负数退出):
10000

第一个序列前10000等于:9.787613
第二个序列前10000等于:0.693091

输入次数(输入0或负数退出):
0

退出

调和级数(第一个序列)是发散的,即它的和会随着项数的增加而无限增大。而交错调和级数(第二个序列)是收敛的,它的和会趋向于一个特定的有限值(大约是0.688172159)。

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

#include<stdio.h>

int main() {
    int arr[8];
    int num = 1;
    for (int i = 0; i < 8; i++)
    {
        num *= 2;
        arr[i] = num;
    }

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


    return 0;
}

注意打印的时候,arr[i]表示值,&arr[i]表示地址。

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


#include<stdio.h>

int main() {
    double arr[8];
    double sum[8];
    double add = 0;

    printf("输入8个double类型的值(Enter键读入):\n");
    for (int i = 0; i < 8; i++)
    {
        scanf_s("%lf", &arr[i]);
    }
    for (int i = 0; i < 8; i++)
    {
        add += arr[i];
        sum[i] = add;
    }
    
    for (int i = 0; i < 8; i++)
    {
        printf("%lf\t", arr[i]);
    }
    printf("\n");
    for (int i = 0; i < 8; i++)
    {
        printf("%lf\t", sum[i]);
    }
    return 0;
}

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

#include <stdio.h>
#include <string.h>

#define MAX 255

int main() {
    char content[MAX];
    char ch;
    int n = 0;

    printf("请输入内容:");
    while (n < MAX - 1 && (ch = getchar()) != ' ' && ch != '\n' && ch != EOF) {
        content[n++] = ch;
    }

    content[n] = '\0';

    printf("\n你输入的内容是: %s\n", content);

    printf("\n倒序是:");
    for (int i = strlen(content) - 1; i >= 0; i--) {
        printf("%c", content[i]);
    }
    printf("\n");

    return 0;
}

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


#include <stdio.h>

int main()
{    
    float Daphne = 100;
    float Deirdre = 100;
    int n = 1;

    while (Daphne >= Deirdre)
    {
        Daphne += 10;
        Deirdre *= 1.05;
        n++;
    }
    printf("\n%d年后,Deirdre的投资额为%.2f,超过了Daphne的%.2f\n",n,Deirdre,Daphne);

    return 0;
}

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

#include <stdio.h>

int main()
{    
    int n = 1;
    float money = 100;

    while(money > 0)
    {
        money = money * 1.08 - 10;
        n++;
    }
    printf("他在第%d年会取完账户的钱\n",n);

    return 0;
}

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

#include <stdio.h>
#define Dunbar_num 150
int main()
{    
    int friends = 5;
    int i = 0;
    for (; friends < Dunbar_num; i++)
    {
        friends = (friends - 1) * 2;
    }
    printf("第%d周为%d,超过邓巴数", i,friends);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值