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 8int 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 26int 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 5int 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 6int 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 6int 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;
}