C Prime Plus 第6章习题
你该逆袭了
红色标注的是:错误的答案
蓝色标注的是:正确的答案
绿色标注的是:做题时有疑问的地方
橙色标注的是:答案中需要着重注意的地方
练习题
- 一、复习题
- 1、
- 2、
- 3、
- 4、
- 5、
- 我的答案:错误
- 正确答案:
- 6、
- 7、
- 8、
- 我的答案:错误
- 正确答案:
- 9、
- 10、
- 11、
- 12、
- 13、
- 我的答案:考虑非常不到位
- 正确答案:有我想不到的注意点
- 14、
- 二、编程练习
- 1、
- 我的答案:
- 标准答案:
- 2、
- 我的答案:
- 标准答案:
- 3、
- 我的答案:
- 补充知识点:
- 标准答案:
- 4、
- 我的答案:
- 标准答案:
- 5、这道题对于我,还是挺有挑战的!
- 我的答案:
- 编程分析:
- 标准答案:
- 6、
- 7、
- 我的答案:
- 标准答案:
- 8、
- 我的答案:
- 注意点:
- 9、
- 10、
- 我的答案:
- 标准答案:
- 11、
- 我的答案:
- 标准答案:
- 12、
- 我的答案:非常的乱!!!
- 正确答案:
- 13、
- 我的答案:
- 正确答案:
- 14、想不出来题目的方法二!!!
- 我的答案:
- 方法一:
- 方法二:我绞尽脑汁,想不出来!!!
- 编程分析:
- 正确答案:
- 15、实在是想不出来怎么做
- 我的答案:错误,实在不会做
- 标准答案:
- 重点:
- 16、
- 关键点
- 17、从16题到18题,都没有做,全部结合16题的正确答案的思路解答的。
- 编程分析:
- 正确答案:
- 关键点:
- 18、
- 我的答案:
- 正确答案:
一、复习题
1、
我的答案:
2
2、
我的答案:
int 类型:36 18 9 4 2 1
double 类型:会一直执行 value /= 2命令,程序无法结束。
3、
我的答案:
x > 5;
(scanf("%lf", &x) == 0);
5 == x;
4、
我的答案:
(scanf("%d", &x) == 1);
x != 5;
x >= 20;
5、
我的答案:错误
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
int list[10] = { 0 }; //中括号
for (i = 1; i <= 10; i++) //分号
{
list[i] = 2 * i + 3;
for (j = 1; j >= i; j++)
{
printf(" %d", list[j]);
}
printf("\n");
}
return 0;
}
正确答案:
当 i 值为 1 时,嵌套循环的内层循环将会是无限循环,且该 for 循环使用 >= 在逻辑上错误。
for (j = 1; j >= i; j++) //错误
//应该改成
for (j = 1; j <= i; j++)
6、
我的答案:
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
char output = 0;
for (i = 0; i < 8; i++)
{
j = 0;
for (j = 0; j < 8; j++)
{
printf("%c ", '$');
}
putchar('\n');
}
return 0;
}
标准答案:
行数使用外层循环控制,行内数据通过内层循环控制打印。
7、
我的答案:
Hi! Hi! Hi! Bye! Bye! Bye! Bye! Bye!
ACGM
8、
我的答案:错误
Go west,young man!
Hp xftu-zpvoh!nbo"
Go west, young man!
$o west, young man!
正确答案:
错误原因:没有仔细审题,while(ch != ‘g’)
Go west,youn!
Hp!xftu-!zpvo
Go west, young
$o west, youn
9、
我的答案:
31|32|33|30|31|32|33|
***
1
5
9
13
***
2 6
4 8
8 10
***
======
=====
====
===
==
10、
我的答案:
mint
10
double
ii
11、
我的答案:
#include <stdio.h>
#define SIZE 8
int main()
{
int by_twos[SIZE] = { 0 };
int index = 0;
for (index = 0; index < SIZE; index++)
{
by_twos[index] = 2 * index;
}
for (index = 0; index < SIZE; index++)
{
printf("%d ", by_twos[index]);
}
printf("\n");
return 0;
}
12、
我的答案:
long name(int x) //返回类型一定要是 long
{
*****;
return long类型的值;
}
13、
我的答案:考虑非常不到位
long mit(int x)
{
long y = 0;
y = x * x;
return y;
}
正确答案:有我想不到的注意点
函数的参数为 int 类型,为了确保返回值为 long 类型,必须使用类型转换,且数值等于该参数的平方。处理方法有很多,其中更加安全的方式如下。
long square(int num)
{
return ((long)num) * num;
}
这样能够保证在计算平方之前就已经将类型转换为 long 类型,返回值为 long 类型。
下面的代码(也就是我的答案)则不够安全,主要原因在于计算平方时使用 int 类型,对于较大的数值,会产生 int 类型的越界,截断结果。转换为 long 类型后,结果依然是截断后的错误数据。
long square(int num)
{
return (long)(num * num); //不安全!
}
14、
我的答案:
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 int the loop
Now k is 7
k = 7
二、编程练习
1、
我的答案:
#include <stdio.h>
#define COUNT 26
int main()
{
char c = 'a';
int n = 0;
char shuzu[26] = { 0 };
for (c = 'a', n = 0; c < 'a' + COUNT; c++, n++)
{
shuzu[n] = c;
}
for (n = 0; n < COUNT; n++)
{
printf("%c ", shuzu[n]);
}
printf("\n");
return 0;
}
标准答案:
程序需要两个循环,第一个循环初始化并存储小写字母,第二个循环用来打印数组的元素。
#include <stdio.h>
int main()
{
char alphabet[26] = { 0 };
int i = 0;
char c = 'a';
for (i = 0; i < 26; i++,c++)
{
alphabet[i] = c;
}
for (i = 0; i < 26; i++)
{
printf("%c ", alphabet[i]);
}
return 0;
}
2、
我的答案:
#include <stdio.h>
#define COUNT 5
int main()
{
int n = 0;
int m = 0;
for (n = 0; n < COUNT; n++)
{
for (m = 0; m < n + 1; m++)
{
printf("$");
}
printf("\n");
}
return 0;
}
标准答案:
外层循环控制打印的行数,内层循环控制打印的行内内容。
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 1; i <= 5; i++) //外层循环 控制 行数
{
for (j = 0; j < i; j++) //内层循环 使用 j < i 表示第 N 行打印 N 个字符
{
printf("$");
}
printf("\n");
}
}
3、
我的答案:
#include <stdio.h>
#define COUNT 6
int main()
{
int n = 0;
int m = 0;
char c = 0;
for (n = 0; n < COUNT; n++)
{
for (m = 0, c = 'F'; m < n + 1; m++, c--)
{
printf("%c", c);
}
printf("\n");
}
return 0;
}
补充知识点:
注意:如果你的系统不使用 ASCII码 或其他以数字顺序编码的代码,可以把字符数组初始化为 字母表 中字母。
char lets[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//数组的最后一个存放字符串的结束标志 '\0'
然后,使用数组下标选择单独的字母,例如,lets[0] 是 ‘A’,等等。
标准答案:
程序最终打印 6 行字符,字符数量逐行递增,且行内字符从 ‘F’ 递减。
所以,嵌套循环中外层循环执行 6 次,内层循环表示第 N 行 打印 N 个字符,且字符从 ‘F’ 递减。
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
char c = 0;
for (i = 1; i <= 6; i++) //外层循环 控制行数
{
for (j = 0, c = 'F'; j < i; j++, c--) //内层循环 控制每行的输入内容
{
printf("%c", c);
}
printf("\n");
}
return 0;
}
4、
我的答案:
#include <stdio.h>
#define COUNT 6
int main()
{
int n = 0;
int m = 0;
char c = 0;
char d = 'A';
for (n = 0; n < COUNT; n++) //外循环:6次循环
{
for (m = 0, c = d; m < n + 1; m++) //内循环
{
printf("%c", c);
c++;
d = c;
}
printf("\n");
}
return 0;
}
标准答案:
不初始化待打印的字符,
for (j = 0, c = 'F'; j < i; j++, c++)
即删除 c = ‘F’ 的赋值,使其持续递增。
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
char c = 'A';
for (i = 1; i <= 6; i++) //外层循环 控制行数
{
for (j = 0; j < i; j++,c++) //内层循环 不初始化待打印数据,且使用 c++ 进行递增
{
printf("%c", c);
}
printf("\n");
}
}
5、这道题对于我,还是挺有挑战的!
我的答案:
#include <stdio.h>
int main()
{
int x = 0;
int y = 0;
int z = 0;
int zz = 0;
char c = 0;
char zimu = 0;
char zimuzimu = 0;
printf("请输入一个大写字母:");
scanf("%c", &c);
for (x = 0; x < c-'A'+1; x++) //5
{
for (y = 0; y < c - 'A' - x; y++) //4-x
{
putchar(' ');
}
for (z = 0, zimu = 'A'; z < x+1; z++, zimu++)
{
printf("%c", zimu);
}
if (0 == x) //黔驴技穷了,只想到这个方法了,汗颜汗颜
{
printf("\n");
continue;
}
for (zz = 0,zimuzimu=zimu-2; zz < x; zz++, zimuzimu--)
{
printf("%c", zimuzimu);
}
printf("\n");
}
return 0;
}
编程分析:
程序首先读取用户输入的大写字母,并通过嵌套循环打印金字塔类型的字母表。
其中每行的字母都需要正序和逆序显示,每行的最大字符(中间字符)与行数有关,第1行的最大字符为’A’,第2行的最大字符为’B’,第2行的最大字符为’C’,…
为了保证每行字符居中,若字符数量不足,需要通过空格填充,使其成为正三角形结构。
为了保证行内的打印效果,在内层循环中应当判断每行打印的空格数。
程序的算法有很多,其中最简单的算法是,空格数、正序字符数、逆序字符数分开打印。
例如,若用户输入 E ,则需要打印 5 行,每行中间字符为 A~E,第 1 行需要补 4 个空格,最后一行不需要补空格。先打印从 A 到中间字符(中间字符 = ‘A’ + ‘行号’ - 1),打印逆序字母后不需要打印空格。
标准答案:
#include <stdio.h>
int main()
{
char c = 0;
printf("请输入一个你想要的大写字母:");
scanf("%c", &c);
int num = c - 'A' + 1; //既是需要打印的从 A 开始的字符数,也是打印的 总行数
int n = 0;
int m = 0;
char ch = 0;
for (n = 1; n <= num; n++) //外层循环 控制行数
{
for (m = 0; m < num - n; m++) //打印 空格
{ //空格数为:总字符数减去当前行应打印的字符数
printf(" "); //本行应打印空格数 + 应打印字符数 + 总字符数(总行数)
}
for (ch = 'A'; m < num; m++, ch++) //打印 正序字母
{ //在打印正序字符数时,需要通过 ch 做递增操作
printf("%c", ch); //起始值 m 在空格处 已经通过循环
}
for (m = 1, ch -= 2; m < n; m++, ch--) //打印 剩余字符
{ //ch -= 2 ,
printf("%c", ch); //在正序字符处,当 n=1 时,ch++ 已经变成了 B,
} //然而,第一行 在剩余字符处,没有要打印的字符
printf("\n");
}
return 0;
}
6、
我的答案:
#include <stdio.h>
int main()
{
int shangxian = 0;
int xiaxian = 0;
int n = 0;
printf("请输入表格的上下限。\n");
printf("上限:");
scanf("%d", &shangxian);
printf("下限:");
scanf("%d", &xiaxian);
for (n = xiaxian; n <= shangxian; n++)
{
printf("%10d%10d%10d", n, n * n, n * n * n);
printf("\n");
}
return 0;
}
7、
我的答案:
#include <stdio.h>
#include <string.h>
int main()
{
char word[21] = { 0 };
int size = 0;
int n = 0;
int m = 0;
printf("请输入一个单词(小于20个字母):");
scanf("%s", word);
size = strlen(word);
printf("size=%d\n", size);
for (n = 0,m=size-1; n < size; n++)
{
printf("%c", word[m]);
m--;
}
return 0;
}
标准答案:
#include <stdio.h>
#include <string.h>
int main()
{
char ch[20] = { 0 };
int length = 0;
int i = 0;
printf("请输入一个单词:");
scanf("%s", ch);
length = strlen(ch);
printf("%d 是单词的长度。\n", length);
for (i = length - 1; i >= 0; i--)
{
printf("%c", ch[i]);
}
printf("\n");
return 0;
}
8、
我的答案:
#include <stdio.h>
int main()
{
double a = 0;
double b = 0;
printf("请输入两个浮点数:");
while (scanf("%lf%lf", &a, &b) == 2)
{
putchar('\n');
printf("%lf\n", (a - b) / (a * b));
printf("请输入两个浮点数:");
}
if (scanf("%lf%lf", &a, &b) != 2)
{
printf("你输入的数据不对,程序结束!\n");
}
return 0;
}
注意点:
scanf 是忽略 空格 的。
//以下两种形式是一样的
while (scanf("%lf%lf", &a, &b) == 2)
while (scanf("%lf %lf", &a, &b) == 2) //scanf 是 忽略空格 的
9、
我的答案:
#include <stdio.h>
double result(double, double); //函数声明
int main()
{
double a = 0;
double b = 0;
printf("请输入两个浮点数:");
while (scanf("%lf%lf", &a, &b) == 2)
{
putchar('\n');
printf("%lf\n", result(a,b));
printf("请输入两个浮点数:");
}
if (scanf("%lf%lf", &a, &b) != 2)
{
printf("你输入的数据不对,程序结束!\n");
}
return 0;
}
double result(double c, double d)
{
double r = (c - d) / (c * d);
return r;
}
10、
我的答案:
#include <stdio.h>
int main()
{
int max = 0;
int min = 0;
int flag = 0;
int count = 0;
int sum = 0;
printf("enter lower and upper integer limits:");
while ((flag=(scanf("%d%d", &min, &max))) == 2)
{
if (min != max)
{
sum = 0;
for (count = min; count <= max; count++)
{
sum += count * count;
}
printf("the sums of the squares from %d to %d is %d\n",
min * min, max * max, sum);
printf("enter next set of limits:");
}
else
{
printf("Done");
break;
}
}
return 0;
}
标准答案:
#include <stdio.h>
int main()
{
int lower = 0;
int upper = 0;
int n = 0;
int sum = 0;
printf("请依次输入 最小值 最大值:");
scanf("%d %d", &lower, &upper);
while (lower < upper)
{
sum = 0;
for (n = lower; n <= upper; n++)
{
sum += n * n;
}
printf("the sums of the squares from %d and %d is %d\n", lower, upper, sum);
printf("请再次输入 最小值 最大值:");
scanf("%d %d", &lower, &upper);
}
printf("Done.\n");
return 0;
}
11、
我的答案:
#include <stdio.h>
int main()
{
int shuzu[10] = { 0 };
int n = 0;
printf("请输入 8 个整数:");
for (n = 0; n < 8; n++)
{
scanf("%d", &shuzu[n]);
}
printf("\n");
printf("倒序输出 8 个整数:");
for (n = 0; n < 8; n++)
{
printf("%5d", shuzu[7 - n]);
}
return 0;
}
标准答案:
#include <stdio.h>
int main()
{
int n = 0;
int shuzu[8] = { 0 };
printf("请依次输入 8 个整数:");
for (n = 0; n < 8; n++)
{
scanf("%d", &shuzu[n]);
}
for (n = 7; n >= 0; n--) //倒序输出
{
printf("%d ", shuzu[n]);
}
return 0;
}
12、
我的答案:非常的乱!!!
#include <stdio.h>
int main()
{
double count = 0;
double input = 0;
double sum1 = 0;
double sum2 = 0;
double sum = 0;
double n = 0;
double fuhao = 0;
while (scanf("%lf", &input) == 1 && (input>0))
{
sum1 = 0;
sum2 = 0;
sum = 0;
for (count = 1; count <= input; count++) //全部都是正值
{
sum1 += 1.0 / count;
}
for (count = 1; count <= input; count++)
{
fuhao = 1;
for (n = 0; n <= count; n++) //控制 正负号的交替
{
fuhao *= (-1);
}
sum2 += fuhao / count;
}
sum = sum1 + sum2;
printf("%lf\n", sum1);
printf("%lf\n", sum2);
printf("总和 = %lf\n", sum);
printf("请继续输入:");
}
if (input <= 0)
{
printf("Done\n");
}
return 0;
}
正确答案:
第 1 个序列可以直接求和。
第 2 个序列需要通过判断奇偶项来获取该项的正负号。
#include <stdio.h>
int main()
{
int length = 0;
int n = 0;
double sum = 0;
printf("请输入 长度:");
scanf("%d", &length);
while (length > 0)
{
sum = 0;
for (n = 1; n <= length; n++) //计算 1 + 1/2 + 1/3 + ... + 1/length =
{
sum += 1.0 / n;
}
printf("1 + 1/2 + 1/3 + ... + 1/length = %lf\n", sum);
sum = 0;
for (n = 1; n <= length; n++) //计算 1 - 1/2 + 1/3 - 1/4 + ... + 1/length =
{
if (n % 2 == 1)
{
sum += 1.0 / n;
}
else
{
sum -= 1.0 / n;
}
}
printf("1 - 1/2 + 1/3 - 1/4 + ... + 1/length = %lf\n", sum);
sum = 0; //计算上面两个式子的总和。
for (n = 1; n <= length; n++) //计算 2 + 2/3 + 2/5 + ... =
{ //只计算 奇数项,偶数项被消除了。
if (n % 2 != 0)
{
sum += 2.0 / n;
}
}
printf("2 + 2/3 + 2/5 + ... = %lf\n", sum);
printf("请再次输入 长度:");
scanf("%d", &length);
}
return 0;
}
13、
我的答案:
#include <stdio.h>
int main()
{
int count = 0;
int n = 0;
int shuzu[8] = { 0 };
int multiply = 0;
for (count = 0; count < 8; count++)
{
multiply = 1;
for (n = 0; n <= count; n++)
{
multiply *= 2;
}
shuzu[count] = multiply;
printf("%5d", shuzu[count]);
}
return 0;
}
正确答案:
#include <stdio.h>
int main()
{
int shuzu[8] = { 0 };
int n = 0;
shuzu[0] = 2;
for (n = 1; n < 8; n++)
{
shuzu[n] = shuzu[n - 1] * 2;
}
int i = 0;
do
{
printf("%d ", shuzu[i]);
i++;
} while (i < 8);
return 0;
}
14、想不出来题目的方法二!!!
我的答案:
方法一:
#include <stdio.h>
int main()
{
double sz1[8] = { 0 };
double sz2[8] = { 0 };
int n1 = 0;
int n2 = 0;
int n3 = 0;
printf("请输入 8 个数:");
for (n1 = 0; n1 < 8; n1++)
{
scanf("%lf", &sz1[n1]);
}
for (n2 = 0; n2 < 8; n2++) //外循环:存储数组的值
{
sz2[n2] = 1;
for (n3 = 0; n3 <= n2; n3++) //内循环:
{
sz2[n2] *= sz1[n3];
}
}
for (n1 = 0; n1 < 8; n1++)
{
printf("%lf ", sz2[n1]);
}
return 0;
}
方法二:我绞尽脑汁,想不出来!!!
//想使用题目提示的方法二:
//利用第二个数组的第 5 个元素是第二个数组的第 4 个元素与第一个数组的第 5 个元素之和,
//只用一个循环就能完成任务,不需要使用嵌套循环
//这个方法,没有想出来!!!
//以下是我的错误的想法:
sz2[0] = 1;
for (n2 = 0, n1 = 0; n2 < 8; n2++, n1++)
{
sz2[n2] *= sz1[n1];
printf("%lf ", sz2[n2]);
}
编程分析:
第 2 个数组计算第一个数组的前 N 项和。
正确答案:
second[0] = first[0]; //单循环,这就是我不会的方法
for (n = 1; n <= 7; n++)
{
second[n] = second[n - 1] + first[n];
}
以上代码:是这道题的精华。
#include <stdio.h>
int main()
{
int first[8] = { 0 };
int second[8] = { 0 };
int n = 0;
int m = 0;
int sum = 0;
printf("请输入 8 个整数:");
for (n = 0; n < 8; n++)
{
scanf("%d", &first[n]);
}
for (n = 0; n < 8; n++) //嵌套循环
{
sum = 0;
for (m = 0; m <= n; m++)
{
sum += first[m];
}
second[n] = sum;
}
for (n = 0; n < 8; n++)
{
printf("%d ", second[n]);
}
printf("\n");
second[0] = first[0]; //单循环,这就是我不会的方法
for (n = 1; n <= 7; n++)
{
second[n] = second[n - 1] + first[n];
}
for (n = 0; n < 8; n++)
{
printf("%d ", second[n]);
}
printf("\n");
return 0;
}
15、实在是想不出来怎么做
我的答案:错误,实在不会做
#include <stdio.h>
int main()
{
int input[255] = { 0 };
int count = 0;
int jishu = 0;
int ch = 0;
int n = 0;
printf("请输入一行:");
//while ((ch = getchar()) != '\n') //第一次尝试
//{
// jishu++;
// for (count = 0; count < jishu; count++)
// {
// input[count] = ch;
// }
//}
for (count = 0, ch = getchar(); (ch = getchar()) != '\n'; count++) //第二次尝试
{
input[count] = ch;
}
for (n = 0; n < count-1; n++)
{
printf("%c", input[n]);
}
return 0;
}
标准答案:
#include <stdio.h>
int main()
{
char data[256];
printf("enter the char in a line:");
int i = 0;
do
{
scanf("%c", &data[i]);
} while (data[i] != '\n' && ++i); //i++ 是不正确的,因为若为 i++,此时,i 为 0,条件判断结果为 0 ,程序就结束了。
printf("the reverse char of the data:");
for (i--; i >= 0; i--)
{
printf("%c", data[i]);
}
return 0;
}
重点:
i++ 是不正确的,因为若为 i++,此时,i 为 0,条件判断结果为 0 ,程序就结束了。
while (data[i] != '\n' && ++i); //i++ 是不正确的,因为若为 i++,此时,i 为 0,条件判断结果为 0 ,程序就结束了。
16、
计算方法想复杂了
正确答案:
#include <stdio.h>
int main()
{
double a = 0;
double b = 0;
int year = 0;
a = 100;
b = 100;
year = 0;
do
{
a = a + 100 * 0.1; //这种计算方法我不会!!!
b = b + b * 0.05; //
year++;
} while ((b - a) < 0); //输出判断!!!
printf("需要多少年:%d", year);
return 0;
}
关键点
a = a + 100 * 0.1; //这种计算方法我不会!!!
b = b + b * 0.05;
判断是否满足 输出 的条件判断。
while ((b - a) < 0); //输出判断!!!
17、从16题到18题,都没有做,全部结合16题的正确答案的思路解答的。
编程分析:
通过 不定次数循环计数 进行计算更合理,当取出 10 万美元之后,若余额低于 9 万美元,则不够下一年支取。
正确答案:
根据16题的解答思路编写的
#include <stdio.h>
int main()
{
double a = 0;
int year = 0;
a = 100;
year = 0;
do
{
a = a + 0.08 * a;
a -= 10;
year++; //判断条件是 a > 9 ,而不是 a > 10
} while (a > 9); //从下一年开始,就不满足 10 万了
//就全部取出来了。
printf("%d 年\n", year+1); //把下一年的也要全部取出来才行
printf("%d 年\n", ++year);
return 0;
}
关键点:
//判断条件是 a > 9 ,而不是 a > 10
} while (a > 9); //从下一年开始,就不满足 10 万了
//就全部取出来了。
printf("%d 年\n", year+1); //把下一年的也要全部取出来才行
18、
我的答案:
这段代码有问题!!!
#include <stdio.h>
int main()
{
int weeks = 0;
int count = 0;
count = 5;
weeks = 1;
while (count < 150)
{
count = count - weeks;
count = count * 2;
printf("%d ", count); //这段话不应该放在这个位置
weeks++;
}
return 0;
}
正确答案:
#include <stdio.h>
int main()
{
int weeks = 0;
int count = 0;
count = 5;
weeks = 1;
while (count < 150)
{
printf("%d ", count); //应该放在这个地方!!!
count = count - weeks;
count = count * 2;
weeks++;
}
return 0;
}