这章习题多得离谱,我一个小白写了7个小时。
目录
1.写出执行完下列各行后quack的值是多少。后5行中使用的是第1行
for ( value = 36; value > 0; value /= 2)
b. scanf()读取一个名为x的double的类型值且失败
for (i = 1, i <= 10, i++) /* 第6行 */
for (j = 1, j > = i, j++) /* 第9行 */
printf(" %d", list[j]); /* 第10行 */
for (i = 0, ch = 'A'; i < 4; i++, ch += 2 * i)
8.假设用户输入的是 Go west , young man! ,下面各程序的输出是什
for (ch = '$'; ch != 'g'; scanf("%c", &ch))
for (n = 1; n*n < 200; n += 4)
for (n = 2, m = 6; n < m; n *= 2, m += 2)
11.Noah先生喜欢以2计数,所以编写了下面的程序,创建了一个储存
for (index = 1; index <= SIZE; index++)
for (index = 1; index <= SIZE; index++)
12.假设要编写一个返回long类型值的函数,函数定义中应包含什么?
13.定义一个函数,接受一个int类型的参数,并以long类型返回参数的平
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);
1.编写一个程序,创建一个包含26个元素的数组,并在其中储存26个小
注意:如果你的系统不使用ASCII或其他以数字顺序编码的代码,可以把字符数组初始化为字母表中的字母:
char lets[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
然后用数组下标选择单独的字母,例如lets[0]是‘A’,等等。
如果你的系统不使用以数字顺序编码的代码,请参照练习3的方案解决。
5.编写一个程序,提示用户输入大写字母。使用嵌套循环以下面金字塔型的格式打印字母:
打印这样的图形,要根据用户输入的字母来决定。例如,上面的图形是在用户输入E后的打印结果。
提示:用外层循环处理行,每行使用3个内层循环,分别处理空格、以升序打印字母、以降序打印字母。如果系统不使用ASCII或其他以数字顺序编码的代码,请参照练习3的解决方案。
6.编写一个程序打印一个表格,每一行打印一个整数、该数的平方、该数的立方。要求用户输入表格的上下限。使用一个for循环。
7.编写一个程序把一个单词读入一个字符数组中,然后倒序打印这个单词。提示:strlen()函数(第4章介绍过)可用于计算数组最后一个字符的下标。
8.编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。在用户输入非数字之前,程序应循环处理用户输入的每对值。
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
11.编写一个程序,在数组中读入8个整数,然后按倒序打印这8个整数。
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 + ...
调和级数(第一个序列)是发散的,即它的和会随着项数的增加而无限增大。而交错调和级数(第二个序列)是收敛的,它的和会趋向于一个特定的有限值(大约是0.688172159)。
13.编写一个程序,创建一个包含8个元素的int类型数组,分别把数组元素设置为2的前8次幂。使用for循环设置数组元素的值,使用do while循环显示数组元素的值。
17.Chuckie Lucky赢得了100万美元(税后),他把奖金存入年利率8%的账户。在每年的最后一天, Chuckie取出10万美元。编写一个程序,计算多少年后Chuckie会取完账户的钱?
复习题
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.假设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
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
11.Noah先生喜欢以2计数,所以编写了下面的程序,创建了一个储存
2、4、6、8等数字的数组。
这个程序是否有错误之处?如果有,请指出。
#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;
}
for (index = 0; index < SIZE; index++)
by_twos[index] = 2 * (index + 1);
for( index = 0; index < SIZE; index++)
printf("%d ", by_twos[index]);
12.假设要编写一个返回long类型值的函数,函数定义中应包含什么?
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
编程题
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.Daphne以10%的单利息投资了100美元(也就是说,每年投资获利相当于原始投资的10%)。Deirdre以 5%的复合利息投资了 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;
}