第六章 编程练习
6.1
/**************************************************************************/ /***题 目:编写一个程序,创建一个包含26个元素的数组,并在其中储存26个***/ /*** 小写字母。然后打印数组的所有内容。 ***/ /***完成时间:2020.2.3 ***/ /***作 者:林夕 ***/ /**************************************************************************/ #include<stdio.h> int main(void) { char num[26] = {'a','b','c','d','e','f','g','h','i','g','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; int i = 0; for (i; i < 26; i++) { printf(" %c ", num[i]); if (i%8==0)//一行输出26个字母太长不美观,所以采用一行八个 { printf("\n"); } } printf("\n输出完毕!"); return 0; }
运行结果
6.2
/**************************************************************************/ /***题目:使用嵌套循环,按下面的格式打印字符: ***/ /*** $ ***/ /*** $$ ***/ /*** $$$ ***/ /*** $$$$ ***/ /*** $$$$$ ***/ /***完成时间:2020.2.3 ***/ /***作 者:林夕 ***/ /**************************************************************************/ #include<stdio.h> #define SIZE 5 int main(void) { int i = 0,j=0; for (i; i < SIZE; i++) { for (j=0; j <= i; j++) { printf("$"); } printf("\n"); } return 0; }
运行结果
6.3
/*****************************************************************************/ /***题 目:使用嵌套循环,按下面的格式打印字母; ***/ /*** F ***/ /*** FE ***/ /*** FED ***/ /*** FEDC ***/ /*** FEDCB ***/ /*** FEDCBA ***/ /*** 注意:如果你的系统不使用ASCII或其他以数字顺序编码,可以把字符***/ /*** 数组初始化为字母表中的字母; ***/ /*** char lets[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; ***/ /*** 然后用数组下标选择单独的字母,例如lets[0]是'a',等等 ***/ /***完成时间:2020.2.3 ***/ /***作 者:林夕 ***/ /*****************************************************************************/ #include<stdio.h> int main(void) { int ch, i, j; for (i = 0; i < 6; i++) { for (j = 0,ch=70; j <= i; j++)//70是F的ASCII码值 { printf("%c", ch--); } printf("\n"); } return 0; }
运行结果
6.4
/****************************************************************************/ /***题 目:使用嵌套循环,按下面的格式打印字母: ***/ /*** A ***/ /*** BC ***/ /*** DEF ***/ /*** GHIJ ***/ /*** KLMNO ***/ /*** PQRSTU ***/ /*** 如果你的系统不使用以数字顺序编码的代码,请参考练习三的方案。***/ /***完成时间:2020.2.3 ***/ /***作 者:林夕 ***/ /****************************************************************************/ #include<stdio.h> int main(void) { int ch = 65, i, j; for (i = 0; i < 6; i++) { for (j = 0; j <= i; j++) { printf("%c", ch++); } printf("\n"); } return 0; }
运行结果
6.5
/****************************************************************************/ /***题 目:编写一个程序,提示用户输入大写字母。使用嵌套循环以下面金字塔***/ /*** 的格式打印字母: ***/ /*** A ***/ /*** ABA ***/ /*** ABCBA ***/ /*** ABCDCBA ***/ /*** ABCDEDCBA ***/ /*** 打印这样的图形,要根据用户输入的字母来决定。例如,上面的图形***/ /*** 是在用户输入E后打印结果。 ***/ /*** 提示:用外层循环处理行,每行使用3个内层循环,分别处理空格、 ***/ /*** 以升序打印字母、以降序打印字母。如果系统不支持ASCII或其他数 ***/ /*** 子顺序编码,请参考练习3解决方案。 ***/ /***完成时间:2020.2.3 ***/ /***作 者:林夕 ***/ /****************************************************************************/ #include<stdio.h> int main(void) { int ch2, i, j; char ch1; printf("请输入大写字母:\n"); scanf_s("%c", &ch1,1); for (i = 65; i <= ch1; i++) {//由上图可知输入字母和A的ASCII码值加1等于行数,这样外层行数循环编写完成 for (j = 0; j < ch1 - i; j++) {//由图可知,输入字母和A的ASCII码值等于前面应该留多少空格 printf(" "); } for (j = 0,ch2 = 65; j <= i - 65; j++)//升序打印字母(含最中间项) {//从A(65)开始,行数刚好等于从空格开始到最中间项 printf("%c", ch2++); } if (ch2-1>65)//由于第一行没有倒序所以本判断用于跳过第一行 { for (ch2=ch2-2; ch2 >= 65; ch2--) {//由于最中间项已经输出,以及上一个for循环最后多加的1,所以此时应该减去2 printf("%c", ch2); } } printf("\n");//每行输入完毕然后一个换行符 } return 0; }
运行结果
6.6
/**************************************************************************/ /***题 目:编写一个程序打印一个表格,每一行打印一个整数、该数的平方、***/ /*** 该数的立方。要求用户输入表格的上下限。使用一个for循环。 ***/ /***完成时间:2020.2.3 ***/ /***作 者:林夕 ***/ /**************************************************************************/ #include<stdio.h> int main(void) { int num1 = 0, num2 = 0; printf("请输入小值:\n"); scanf_s("%d", &num1); printf("请输入大值:\n"); scanf_s("%d", &num2); for (num1; num1 <= num2; num1++) { printf("%d 平方:%d 立方:%d\n", num1, num1 * num1, num1 * num1 * num1); } printf("程序结束!"); return 0; }
运行结果
6.7
/******************************************************************************/ /***题 目:编写一个程序把一个单词读入一个字符数组中,然后倒序打印这个单词***/ /*** 提示:strlen()函数可用于计算数组最后一个字符的下标。 ***/ /***完成时间:2020.2.3 ***/ /***作 者:林夕 ***/ /******************************************************************************/ #include<stdio.h> #include<string.h> #define SIZE 50 int main(void) { char ch[SIZE] = { 0 }; int k; printf("请输入一个单词:\n"); scanf_s("%s" ,& ch, 50); k = strlen(ch); printf("倒序输出单词:\n"); for (k = k - 1; k >= 0; k--) { printf("%c", ch[k]); } return 0; }
运行结果
6.8
/********************************************************************************/ /***题 目:编写一个程序,要求用户输入俩个浮点数,并打印俩数之差除以俩数乘积***/ /*** 的结果。在用户输入非数字之前,程序应循环处理用户输入的每对值。 ***/ /***完成时间:2020.2.3 ***/ /***作 者:林夕 ***/ /********************************************************************************/ #include<stdio.h> int main(void) { float num1 = 0.0, num2 = 0.0; printf("请依次输入俩个浮点型数字:\n"); scanf_s("%f %f", &num1, &num2); if (num1 > num2) { printf("%f", (num1 - num2) / (num1 * num2)); } else printf("%f", (num2 - num1) / (num1 * num2)); return 0; }
运行结果
6.9
/************************************************************************/ /***题 目:修改程序8,使用一个函数返回计算的结果。 ***/ /***完成时间:2020.2.3 ***/ /***作 者:林夕 ***/ /************************************************************************/ #include<stdio.h> float IC(float n1,float n2); int main(void) { float num1 = 0.0, num2 = 0.0, num = 0.0; printf("请输入第一个浮点型数字:\n"); scanf_s("%f", &num1); printf("请输入第二个浮点型数字:\n"); scanf_s("%f", &num2); num=IC(num1, num2); printf("结果为:%f", num); return 0; } float IC(float n1, float n2) { float n = 0.0; if (n1 > n2) n = (n1 - n2) / (n1 * n2); else n = (n2 - n1) / (n1 * n2); return n; }
运行结果
6.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 5775 ***/ /*** Enter next set of limits: 5 5 ***/ /*** Done ***/ /***完成时间:2020.2.3 ***/ /***作 者:林夕 ***/ /****************************************************************************/ #include<stdio.h> int main(void) { int num1 = 0, num2 = 0, num = 0,i; printf("Enter lower and upper integer limits : "); scanf_s("%d %d", &num1, &num2); while (num1 < num2) { for (i = num1; i <= num2; i++) { num = num + i * i; } printf("The sums of the squares from %d to %d is %d\n", num1 * num1, num2 * num2, num); printf("Enter next set of limits: "); scanf_s("%d %d", &num1, &num2); } printf("Done\n"); return 0; }
运行结果
6.11
/******************************************************************************/ /***题 目:编写一个程序,在数组中读取八个整数,然后按倒序打印这八个整数。***/ /***完成时间:2020.2.3 ***/ /***作 者:林夕 ***/ /******************************************************************************/ #include<stdio.h> #define SIZE 10 int main(void) { int num[SIZE] = { 0 }, i = 0; printf("请依次输入整数:\n"); for (i; i < 8; i++) scanf_s("%d", &num[i]); printf("倒序输出整数:\n"); for (i = i - 1; i >= 0; i--) printf("%d ", num[i]); return 0; }
运行结果
6.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项后的总和 ***/ /*** 是否发现每个序列都收敛于某值。 ***/ /***完成时间:2020.2.3 ***/ /***作 者:林夕 ***/ /********************************************************************************/ #include<stdio.h> int main(void) { float num1 = 0.0, num2 = 0.0; int i = 0, num = 0; printf("请输入运行次数:\n"); scanf_s("%d", &num); while (num > 0) { for (i = 1; i <= num; i++)//单独计算num1 { num1 = 1.0 / i + num1; } for (i = 1; i <= num; i += 2) { num2 = num2 + 1.0 / i; } for (i = 2; i <= num; i += 2) { num2 = num2 - 1.0 / i; } printf("num1=%f\nnum2=%f\nnum1+num2=%f\n", num1, num2,num1+num2); scanf_s("%d", &num); } }
运行结果
6.13
/*********************************************************************************/ /***题 目:编写一个程序,创建一个包含8个元素的int类型数组。分别把数组元素***/ /*** 设置为2的前8次幂,使用for循环设置数组元素的值,使用do while 循环 ***/ /*** 显示数组元素的值 ***/ /***完成时间:2020.2.3 ***/ /***作 者:林夕 ***/ /*********************************************************************************/ #include<stdio.h> #include<math.h> #define SIZE 8 int main(void) { int i, num[SIZE]; for (i = 0; i < SIZE; i++) { num[i] = pow(2, i); } do { printf("%d\n", num[SIZE - i--]); } while (i>0); return 0; }
运行结果
6.14
/*******************************************************************************/ /***题 目:编写一个程序,创建俩个包含8个元素的double类型数组,使用循环提示***/ /*** 用户第一个数组输入8个值。第二个数组元素的值设置为第一个数组对 ***/ /*** 应元素的累积之和。例如,第二个数组的第4个元素的值是第一个数组前***/ /*** 4个元素之和,第二个数组的第5个元素的值是第一个数组前5个元素之和***/ /*** (用嵌套循环可以完成,但是利用第二个数组的第5个元素是第二个元素***/ /*** 的第4个元素与第一个数组的第5个元素之和,只用一个循环就能完成任 ***/ /*** 务,不需要使用嵌套循环)。最后,使用循环显示俩个数组的内容,第 ***/ /*** 一个数组显示一行,第二个数组显示再第一个数组的下一行,而且每个 ***/ /*** 元素都与第一个数组各元素相对应。 ***/ /***完成时间:2020.2.3 ***/ /***作 者:林夕 ***/ /*******************************************************************************/ #include<stdio.h> #define SIZE 8 int main(void) { double num[SIZE] = { 0 }, num2[SIZE] = { 0 }; int i; printf("请输入8个double类型数字:\n"); for (i = 0; i < SIZE; i++) { scanf_s("%lf", &num[i]); } for (i = 0; i < SIZE; i++) { if (i > 0) num2[i] = num[i] + num2[i - 1]; else num2[i] = num[i]; } printf("输出俩个数组:\n"); for (i = 0; i < SIZE; i++) { printf("%8.3lf", num[i]); } printf("\n"); for (i = 0; i < SIZE; i++) { printf("%8.3lf", num2[i]); } printf("\n"); return 0; }
运行结果
6.15
/******************************************************************************/ /***题 目:编写一个程序,读取一行输入,然后把输入的内容倒序打印出来,可以***/ /*** 把输入存储在char类型的数组中,假设每行字符不超过255,回忆一下 ***/ /*** 根据%c转换说明,scanf()函数一次只能从输入中读取一个字符,而且 ***/ /*** 在用户摁下enter键scanf()函数会生成一个换行符(\n). ***/ /***完成时间:2020.2.4 ***/ /***作 者:林夕 ***/ /******************************************************************************/ #include<stdio.h> #define SIZE 256 int main(void) { char num[SIZE] = { 0 }; int i = 0; for (i = 0; num[i-1] !='\n'; i++) { scanf_s("%c", &num[i],1); } for (i=i-1; i >= 0; i--) { printf("%c", num[i]); } return 0; }
运行结果
6.16
/******************************************************************************/ /***题 目:DAphne以10%的单利息投资了100美金(也就是说,每年投资获利相当于***/ /*** 原始投资的10%)。Deirdre以5%地复合利息投资了100美金(也就是说 ***/ /*** 利息是当前余额的5%,包含之前的利息)。编写一个程序,计算需要多***/ /*** 少年Deirdre的投资额才会超过DAphne,并显示那时俩人的投资额。 ***/ /***完成时间:2020.2.5 ***/ /***作 者:林夕 ***/ /******************************************************************************/ #include<stdio.h> int main(void) { float DAphne = 100.0, Deirdre = 100.0; int i, j; for (i = 1,j = 1; i>0; i++,j++) { DAphne = DAphne + 100.0 * 0.1; Deirdre = Deirdre + Deirdre * 0.05; if (DAphne < Deirdre) i = -1; } printf("第%d年\nDAphne=%f\nDeirdre=%f\n",j, DAphne, Deirdre); return 0; }
运行结果
6.17
/********************************************************************************/ /***题 目:Chuckie Lucky赢得了100万美元(税后),他把奖金存入年利率8%的账户***/ /*** 在每年的最后一年,Chuckie取出10万美金。编写一个程序,计算多少年 ***/ /*** 后Chuckie会取完账户的钱? ***/ /***完成时间:2020.2.5 ***/ /***作 者:林夕 ***/ /********************************************************************************/ #include<stdio.h> int main(void) { float Chuckie = 100.0; int i; for (i = 1; Chuckie > 0; i++) { Chuckie = Chuckie + Chuckie * 0.08 - 10; } printf("第%d年时已经取完账户所有钱了!\n", i); return 0; }
运行结果
6.18
/**********************************************************************************/ /***题 目:Rabnud博士加入了一个社交圈。起初他有五个朋友。他注意到他的朋友数量***/ /*** 以下面的方式增加。第一周少一个朋友,剩下的朋友翻倍;第二周少俩个朋***/ /*** 友,剩下的朋友翻倍。一般而言,第N周就少N个朋友,剩下的朋友数量翻倍***/ /*** 编写一个程序,计算并显示Rabnud博士每周的朋友圈。该程序一直运行,直***/ /*** 到超过邓巴数。邓巴数是粗略估算一个人在社交圈有稳定关系的成员的最大***/ /*** 值,该值大约150. ***/ /***完成时间:2020.2.5 ***/ /***作 者:林夕 ***/ /**********************************************************************************/ #include<stdio.h> #define SIZE 150 int main(void) { int Rabnud = 5, i; for (i = 1; Rabnud < SIZE; i++) { Rabnud = (Rabnud - i) * 2; printf("第%d周有%d个朋友!!!\n", i, Rabnud); } return 0; }
运行结果