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章)--习题的主要内容,如果未能解决你的问题,请参考以下文章

读书共享 Primer Plus C-part 7

C Primer Plus学习笔记- C 控制语句:分支和跳转

读书共享 Primer Plus C-part11

读书共享 Primer Plus C-part 9

读书共享 Primer Plus C-part 12

读书共享 Primer Plus C-part 8