c primer plus--C控制语句:循环(第6章)--习题
Posted ultra-zhukai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c primer plus--C控制语句:循环(第6章)--习题相关的知识,希望对你有一定的参考价值。
本章习题有点难,还有几题没做,等有空的时候再补上吧。
(对于题的想法会放在题后面或代码注释里)
1.编写一个程序,创建一个具有 26 个元素的数组,并在其中存储 26 个小写字母。并让该程序显示该数组的内容。
1 #include <stdio.h> 2 #define SIZE 26 3 int main(void) 4 { 5 int arry[SIZE]; 6 int i; 7 char c=‘a‘; 8 for(i=0; i<SIZE; i++, c++) 9 { 10 printf("%d‘s letter is %c. ", i+1, c); 11 } 12 return 0; 13 }
2.使用嵌套循环产生下列图案:
$
$$
$$$
$$$$
$$$$$
1 #include <stdio.h> 2 int main(void) 3 { 4 int i, n; 5 for(i=1; i<=5; i++) 6 { 7 for(n=0; n<i; n++) 8 { 9 printf("$"); 10 } 11 printf(" "); 12 } 13 return 0; 14 }
3.使用嵌套循环产生下列图案:
F
FE
FED
FEDC
FEDCB
FEDCBA
请注意:如果您的系统不使用 ASCII 或其他以数字顺序编码的码,您可以把一个字符数组初始化为字母表中的字母:
char lets[26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
然后就可以使用数组索引来选用单个的字母,例如 lets[0] 是 ‘A‘,等等。
4.让程序要求用户输入一个大写字母,使用嵌套循环产生像下面这样的金字塔图案:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
这种图案要扩展到用户输入的字符。例如,前面的图案是在输入 E 时需要产生的。提示:使用一个外部循环来处理行,在每一行中使用三个内部循环,一个处理空格,一个以升序打印字母,一个以降序打印字母。如果您的系统不使用 ASCII 或类似的以严格数字顺序表示字母的编码,请参见在编程练习 3 中给出的建议。
5.编写一个程序打印一个表,表的每一行都给出一个整数、它的平方以及它的立方。要求用户输入表的上限与下限。使用一个 for 循环。
(此题的输入顺序无碍,不同顺序只需修改 for里的条件,故只给出其中一种)
1 #include <stdio.h> 2 int main(void) 3 { 4 int num_up, num_down; 5 int i, square, cube; 6 printf("Input your number (first down and then up): "); 7 scanf("%d %d", &num_down, &num_up); 8 // 先输入下限,再输入上限 9 printf("1_number 2_number 3_number "); 10 // 分别为用户输入的数,数的平方,数的立方 11 for(i=num_down; i<=num_up; i++) 12 { 13 square=i*i; 14 cube=i*i*i; 15 printf("%7d %7d %7d ", i, square, cube); 16 } 17 return 0; 18 }
6.编写一个程序把一个单词读入一个字符数组,然后反向打印出这个词。提示:使用 strlen() (第 4 章)计算数组中最后一个字符的索引。
1 #include <stdio.h> 2 #include <string.h> 3 #define SIZE 100 4 int main(void) 5 { 6 char CHAR[SIZE]; 7 int i; 8 printf("please intput your strings: "); 9 scanf("%s", CHAR); 10 printf("strlen(CHAR) = %d. And it‘s %s ", strlen(CHAR), CHAR); 11 // 此句用于检测读入的字符串是否准确 12 for(i=strlen(CHAR)-1; i>=0; i--) 13 // strlen(CHAR)-1 跳过字符串最后面的空格 14 { 15 printf("%c", CHAR[i]); 16 } 17 printf(" "); 18 return 0; 19 }
7.编写一个程序,要求输入两个浮点数,然后打印出用二者的差值除以二者的乘积所得的结果。在用户键入非数字的输入之前程序循环处理每对输入值。
1 #include <stdio.h> 2 #include <math.h> // 需要用到绝对值函数 3 int main(void) 4 { 5 float num_1, num_2; 6 float diff, prod, fin; 7 // diff 差值,prod 乘积,fin 结果 8 printf("Please input two numbers (enter q to quit): "); 9 while(scanf("%f%f", &num_1, &num_2) == 2) 10 { 11 diff=fabs(num_1-num_2); 12 prod=num_1*num_2; 13 fin=diff/prod; 14 printf("The final result is %f. ", fin); 15 printf("Write two numbers again (enter q to quit): "); 16 } 17 return 0; 18 }
8.对练习 7 进行修改,让它使用一个函数来返回计算值。
1 #include <stdio.h> 2 #include <math.h> 3 4 float final_result(float a, float b); 5 6 int main(void) 7 { 8 float num_1, num_2; 9 printf("Please input two numbers (enter q to quit): "); 10 while(scanf("%f%f", &num_1, &num_2) == 2) 11 { 12 printf("The final result is %f. ", final_result(num_1, num_2)); 13 // 直接将函数返回值打印 14 printf("Write two numbers again (enter q to quit): "); 15 } 16 return 0; 17 } 18 19 float final_result(float a, float b) 20 { 21 float fin; 22 fin=fabs(a-b)/(a*b); 23 return fin; 24 }
9.编写一个程序,要求用户输入下限整数和一个上限整数,然后,依次计算从下限到上限的每一个整数的平方的加和,最后显示结果。程序将不断提示用户输入下限整数和上限整数并显示出答案,直到用户输入的上限整数等于或小于下限整数为止。程序运行的结果示例应该如下所示:
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
1 #include <stdio.h> 2 int main(void) 3 { 4 int num_low, num_up, i, sum; 5 printf("Enter lower and upper integer limits : "); 6 scanf("%d%d", &num_low, &num_up); 7 while(num_low<num_up) 8 { 9 for(i=num_low, sum=0; i<=num_up; i++) 10 // 每次重新输入需将 sum初始化 11 { 12 sum+=(i*i); 13 } 14 printf("The sums of the squares from %d to %d is %d ", 15 num_low*num_low, num_up*num_up, sum); 16 printf("Enter next set of limits : "); 17 scanf("%d%d", &num_low, &num_up); 18 } 19 printf("Done "); 20 return 0; 21 }
10.编写一个程序把 8 个整数读入一个数组中,然后以相反的顺序打印它们。
1 #include <stdio.h> 2 #define SIZE 8 3 int main(void) 4 { 5 int number[SIZE]; 6 int i; 7 for(i=0; i<SIZE; i++) 8 scanf("%d", &number[i]); 9 for(i=SIZE-1; i>=0; i--) 10 printf("%d ", number[i]); 11 return 0; 12 }
11.考虑这两个无限序列:
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 + ......
编写一个程序来计算这两个序列不断变化的总和,直到达到某个次数。让用户交互地输入这个次数。看看在 20 次、100 次和 500 次之后的总和。是否每个序列都看上去要收敛于某个值 ?提示:奇数个 -1 相乘的值为 -1,而偶数个 -1 相乘的值为 1 。
12.编写一个程序,创建一个 8 个元素的 int 数组,并且把元素分别设置为 2 的前 8 次幂,然后打印出它们的值。使用 for 循环来设置值;为了变化,使用 do while 循环来显示这些值。
(程序在 for 循环内外各把 i 初始化了,看着有点重复,感觉有优化的余地)
1 #include <stdio.h> 2 #define SIZE 8 3 int main(void) 4 { 5 int arry[SIZE]; 6 int i, n; 7 for(i=0, n=2; i<SIZE; i++, n*=2) 8 arry[i]=n; 9 i=0; 10 do 11 { 12 printf("%d ", arry[i]); 13 i++; 14 } while(i<SIZE); 15 return 0; 16 }
13.编写一个程序,创建两个 8 元素的 double 数组,使用一个循环来让用户键入第一个数组的 8 个元素的值。程序把第二个数组的元素设置为第一个数组元素的累积和。例如,第二个数组的第 4 个元素应该等于第一个数组的前 4 个元素的和,第二个数组的第 5 个元素应该等于第一个数组的前 5 个元素的和(使用嵌套循环可以做到这一点。不过利用第二个数组的第 5 个元素等于第二个数组的第 4 个元素加上第一个数组的第 5 个元素这一事实,可以避免嵌套而只使用单个循环来完成这个任务)。最后,使用一个循环来显示两个数组中的内容,第一个数组在一行中显示,而第二个数组中的每个元素在第一个数组的对应元素之下进行显示。
(这题困扰我近乎一个下午,问题在于要求的 “使用一个循环” ,试了各种办法,都无法达到题目要求;直到我找出原版,发现是 “use loops to display the contents of the two arrys , ...” 才明白翻译有误,于是再次深感学好英文的重要,如果我的英文好一些,说不定能直接阅读原版书,也不会在题目上纠结了)
1 #include <stdio.h> 2 #define SIZE 8 3 int main(void) 4 { 5 double arr_1[SIZE]; 6 double arr_2[SIZE]; 7 int i; 8 for(i=0; i<SIZE; i++) 9 scanf("%lf", &arr_1[i]); 10 // 读入第一个数组 11 arr_2[0]=arr_1[0]; 12 // 初始化第二个数组 13 for(i=1; i<SIZE; i++) 14 arr_2[i]=arr_2[i-1]+arr_1[i]; 15 // 计算第二个数组各元素 16 for(i=0; i<SIZE; i++) 17 printf("%8.2lf", arr_1[i]); 18 // 打印第一行 19 printf(" "); 20 for(i=0; i<SIZE; i++) 21 printf("%8.2lf", arr_2[i]); 22 // 打印第二行 23 return 0; 24 }
14.编写一个程序读入一行输入,然后反向打印改行。您可以把输入存储在一个 char 数组中;假定该行不超过 255 个字符。回忆一下,您可以使用具有 %c 说明符的 scanf() 从输入中一次读入一个字符,而且当您按下回车键时会产生换行字符( )。
1 #include <stdio.h> 2 #define SIZE 255 3 int main(void) 4 { 5 char arr[SIZE]; 6 int i=-1; 7 do 8 { 9 i++; // 从 arr[0] 开始循环读入 10 scanf("%c", &arr[i]); 11 } while(arr[i] != ‘ ‘); // 判断读入元素是否为换行符 12 for( ; i>=0; i--) 13 printf("%c", arr[i]); // 反向打印数组 14 return 0; 15 }
15. Daphne 以 10% 的单利息投资了 100 美元(也就是说,每年投资赢得的利息等于原始投资的 10% )。Deirdre 则以每年 5% 的复合利息投资了 100 美元(也就是说,利息是当前结余的 5% ,其中包括以前的利息)。编写一个程序,计算需要多少年 Deirdre 的投资额才会超过 Daphne ,并且显示出到那时两个人的投资额。
1 #include <stdio.h> 2 #define interest 100 // 原始投资 3 int main(void) 4 { 5 double simple=100; // 单利--Daphne 6 double compound=100; // 复利--Deirdre 7 int year=0; // 年限 8 do 9 { 10 year++; 11 simple+=(interest*0.1); 12 compound+=(compound*0.05); 13 } while(simple>=compound); 14 // 只要 Daphne 投资额不低于 Deirdre,循环就继续 15 printf("Daphne‘s invest is $%lf, Deirdre‘s invest is $%lf. ", 16 simple, compound); 17 printf("It‘s over %d years. ", year); 18 return 0; 19 }
16. Chuckie Lucky 赢得了 100 万美元,他把它存入一个每年赢得 8% 的账户。在每年的最后一天,Chuckie 取出 10 万美元。编写一个程序,计算需要多少年 Chuckie 就会清空他的账户。
1 #include <stdio.h> 2 #define rate 0.08 // 年固定利率 3 int main(void) 4 { 5 double account=100; // 账户额 6 int year=0; 7 while(account>0) 8 { 9 year++; 10 account+=(account*rate); 11 account-=10; 12 } 13 printf("Chuckie will clear his account in %d years. ", year); 14 return 0; 15 }
以上是关于c primer plus--C控制语句:循环(第6章)--习题的主要内容,如果未能解决你的问题,请参考以下文章