c语言课后题——循环结构

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、知识点
  • 二、例题和课后题
    • 1.用多项式求Π
    • 2.判断是否为素数
    • 3.求100-200之间的素数
    • 4.翻译密码
    • 4.课后习题1--求最大公约数和最小公倍数
    • 5.课后习题2--统计输入一串字符中得英文字母、空格、数字和其他字符的个数。
    • 6.课后习题3--求Sn=a+aa+aa+```+n个a相加。
    • 7.课后习题4--求从1-20的n!
    • 8.课后习题5--输出所有的水仙花数
    • 9.课后习题6--找出1000以内的完数
    • 10.课后习题7--计算前20项分式的和
    • 11.课后习题8--猴子摘桃
    • 12.课后习题9--迭代法求根号n
  • 总结


前言

大概内容介绍

循环语句介绍


提示:以下是本篇文章正文内容,下面案例可供参考

一、知识点

  • while循环语句——while(表达式) 语句——先判断后执行
  • do~while循环语句——do 语句 while(表达式)——先执行后判断
  • for语句循环——for(初始条件;循环条件;循环变量增值) 语句
  • break 语句提前终止循环——只能用在循环语句和switch语句里面
  • continue; 语句结束本次循环

二、例题和课后题

1.用多项式求Π

代码如下(示例):

#include
#include
int main() {double n = 1.0, pi = 0.0, term = 1.0;  //n是分母,pi是Π值,term是当前的值。int sign = 1;  //正负的符号while (fabs(term)>1e-6) {pi = pi + term;n = n + 2;sign = -sign;term = sign / n;}pi = pi * 4;printf("pi=%10.8f\n",pi);return  0;
}

2.判断是否为素数

素数:除了1和本身之外,相除没有整数

int main() {  //输入一个大于3的整数,判断是否为素数int n,i;printf("请输入一个大于3的整数");scanf("%d", &n);for (i = 2; i <= n - 1;i++) {if (n % i == 0)break;}if (i < n)printf("%d不是素数\n", n);elseprintf("%d是素数\n", n);
}

需要注意的问题:变量i在外部声明之后就会变成全局变量,在for循环内的变化就会带到if的条件判断里面

3.求100-200之间的素数

题目分析:
1.辨析好素数的条件:2-本身相除无整数or2-根号n本身的范围
2.需要的变量有:循环变量i 和题目给的数n,k为根号n
3.结构:一个判断素数的if条件,一个从2-n-1的for循环,一个从100-200的for循环
4.break终止内循环,在否定答案判断时,可以直接跳出内循环。
5.时间复杂度为根号n

int main() {  //请输出100-200之间的素数int i, n, k;for (n = 101;n <= 200;n=n+2) {  //101-200之间的循环,且偶数一定不是素数k = sqrt(n);                              //k为根号nfor (i = 2;i <= k;i++) {              //从2-根号n之间循环if (n % i == 0) {				//如果不是素数,跳出这个循环break;}}if (i >=k+1) {						//如果循环结束时,i仍然没有可以整除的就是素数printf("100-200之间的素数为:%d\n", n);}}
}

4.翻译密码

题目分析:
1.要求:把字母换成字母数字+4的字母,非字母字符保持不变
2.分析:主要有两大问题:怎么判断字母和非字母?字母之间怎么转换?
3.怎么判断字母和非字母?——先判断是不是字母,然后判断是大写还是小写(两个if条件)
小写字母ASCII码为97-122,大写字母65-90
怎么判断是不是字母?用isalpha()函数判断,头文件是ctype.h或者用ASCII码转换进行判断
4.怎么转换字母?——ASCII码进行转换,但是大写字母还是转换成大写字母
怎么进行大写(小写)字母的循环转换?——大写字母ASCII码+4看看是不是大于90,若大于90,相应的值-26即可。
小写字母同理——原本字母ASCII码+4是否大于122,若大于,则该值-26.此处用到if条件语句
4.用到的结构:if循环结构。
5.元素有:c为输入字母的标志
6.字符常量包括:普通字符(字母),转义字符(\n等)和其他字符
7顺序:判断是否为字母,再根据ASCII码判断是否为大写字母,是,看看是否超过90;否。看看是否超过122。或者用字母直接判断。

int main() {    //用字母直接判断,用ASCII码判断有些繁琐char c;c = getchar();        //getchar的用法要注意while (c != '\n') {      //当字母不是换行符if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {   //如果是大小写字母,直接判断是否是大小写if ((c >= 'w'&&c<='z') || (c >= 'W'&&c<='Z')) {    //如果是超过这个循环c = c + 4 - 26;}else {											//如果没有超过这个循环c = c + 4;}}//大小写判断完毕后printf("%c", c);								//输出更改后的字符c = getchar();								//然后进行获取字符的行动,进而结束}return 0;
}			//getchar();函数是将字母转化成int形式的函数,获取一个字母的函数
//一个单词里的字母会不断调用getchar函数。
//单引号的内容是字母,可以是单个字母或者多个字母。

一定要注意getchar()和putchar()函数的使用方法


4.课后习题1–求最大公约数和最小公倍数

知识点:最大公约数——两个及以上的整数共有最大能约去的整数。最小公倍数——两个及以上的整数有最小的相同倍数。
数学方法怎么求?最大公约数——辗转相除法,递归法,更相减损法,穷举法。最小公倍数——两个数的乘积/最大公约数
辗转相除法的内容?大数除以小数,若有余数m,则继续小数除以余数,直到没有余数时,最大公约数时最小的余数
也可以用m作为中间变量,当a和b都与m相除无余数且是从ab两者之间得最小数者开始循环。更好理解,且更加便捷。只需要做一个条件判断即可。
除数和被除数:a/b中,a是被除数,b是除数

int main() {   //求最大公约数和最小公倍数int a = 0, b = 0, m = 0,n=0;			//a是被除数,b是除数,m是最大公约数,n是最小公倍数scanf("%d,%d", &a, &b);m = a < b ? a : b;					//m是ab之间偏小的数while (m) {if ((a % m == 0) && (b % m == 0)) {			//如果m是a和b的最大公约数printf("最大公约数是:%d\n", m);n = (a * b) / m;									//求得最小公倍数printf("最小公倍数是:%d\n", n);break;											//结束内循环(while)循环}else {m--;				//如果不是a和b的公约数,m继续相减}}//whilereturn 0;
}

5.课后习题2–统计输入一串字符中得英文字母、空格、数字和其他字符的个数。

1.可以用getchar()函数对输入的字符串进行自主遍历
2.然后用if条件多个条件嵌套判断是否是字母或者空格数字等相关。

int main() {       //统计字符串之间相同类型的个数int zimu = 0, space = 0, number = 0, other = 0;char ch;			//ch为接收字符串的承受者printf("请输入一组字符串:\n");ch = getchar();while (ch != '\n') {		//为了避免上面输出结尾的\n被机器误以为是输入的字符串if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))zimu++;else if (ch == ' ')space++;else if (ch >= '0' && ch <= '9')number++;elseother++;}//whileprintf("输入的字符串中:英文字母有%d个,空格有%d个,数字有%d个,剩余其他字符%d个\n", zimu, space, number, other);return 0;
}

6.课后习题3–求Sn=a+aa+aa+```+n个a相加。

1.其中a是数字,n是键盘输入的位数
2.怎么实现?首先,规律是,a+(a10+a)+((a10+a)10+a)等等。
3.即,有数a,tn初始值为0且tn=tn+a,a在每次循环后有a=a
10,sn为所求的和。
4.n个a相加怎么解决?用循环,最简便就用while循环

代码如下:

int main() {		//求sn=a+aa+aaa+~~~之和int a, i=0,n, tn = 0, sn=0;					//a是数,i是循环变量,n是位数,tn是中间一个数,sn是所求之和printf("请输入a的数以及n的个数:");scanf("%d,%d", &a, &n);while (i <= n) {tn = a + tn;sn = sn + tn;a = a * 10;++i;}printf("sn的结果为:%d", sn);return 0;
}

7.课后习题4–求从1-20的n!

1.跟求sn的思路是一样的。n的阶乘=m,i为变量
m=m*i,for循环

int main() {			//求n的阶乘int n , m = 1;printf("请输入阶乘n\n");scanf("%d", &n);for (int i = 1;i <= n;++i) {m = m * i;}printf("阶乘n为:%d", m);
}

求n阶乘的和。就是有一个s=s+m

int main() {			//求n的阶乘之和int n , m = 1,s=0;printf("请输入阶乘n\n");scanf("%d", &n);for (int i = 1;i <= n;++i) {m = m * i;s = s + m;}printf("阶乘n为:%d\n", m);printf("阶乘之和为:%d\n", s);
}

8.课后习题5–输出所有的水仙花数

水仙花数是什么?一个三位数,且每位的三次方之和=该三位数
三位数,a,b,c这三个分别代表个位十位百位。
水仙花数为 n,则n=a3+b3+c3
个位数c=n%10,十位数b=((n%100)-c)/10,百位数a=(n-(b*10+c))/100
循环变量i,从100-999,且i<=999,i++。

int main() {    //求水仙花数int a, b, c;for (int i = 100;i < 1000;++i) {c = i % 10;							//个位数a = i / 100;						//百位数b = i/10-a *10;						//十位数if (i= (a * a * a) + (b * b * b) +( c * c * c))printf("%d\n", i);}return 0;
}

但是结果却一直不对
在这里插入图片描述
以下代码为正确结果

int main() {    //求水仙花数int a, b, c,i;for (i = 100;i < 1000;++i) {        //从100-1000内的循环c = i % 10;							//个位数a = i / 100;							//百位数b = i/10-a *10;						//十位数//printf("%d,%d,%d,%d\n", a, b, c, (a * a * a) + (b * b * b) + (c * c * c));if (i==a * a * a + b * b * b + c * c * c ) {printf("水仙花数为:%d\n", i);}}return 0;
}

注意!==是判断相等,=是赋值操作!
在这里插入图片描述

9.课后习题6–找出1000以内的完数

完数:一个数=它的因子之和。e.g:6=1+2+3
因子:指除了自身以外的约数
约数:a能整除以b,b是a的约数。a/b==0,b是约数
sum=因子之和,因子个数不确定。—用for循环遍历,循环出因子并输出
m为完数,a是1000以内遍历的数,b是1~(b-1)以内的数。因子n:a/b=0的数
for循环1-1000遍历——>约数的循环——最后输出结果

int main() {			 //求1000以内的完数int  b, n, m, sum;			//sum是因子之和,m为完数,b是小于b-1以内的数for ( m = 2;m < 1000;m++) {//1000以内的数字循环sum = 0;for (b = 1;b < m;b++) {						//b是因子if ((m % b) == 0) {									//当m为完数时sum = sum + b;}							//sum是因子之和//printf("因子之和:%d", sum);}//ifif (sum == m) {										//如果因子之和等于m时,m此时就是完数printf("%d its factors are\n", m);			//输出完数mfor (int i = 1;i < m;i++){					//遍历循环输出因子if (m % i == 0)			//当i是m的约数时{printf("%d", i);printf("\n");}}//for}}//forreturn 0;
}

10.课后习题7–计算前20项分式的和

前二十项——for循环遍历
规律:分子为n,分母为m,n=n+m,m=n,但是相互交叉会改变值,所以用中间变量t来进行变换
最重要一点,分式之和一定是float型,定义时需要注意,输出时想好输出格式
printf(%m.nf) ,表示一共m个长度的数字,n个小数点后的数字
double输出的格式为%lf,float输出的格式为%f

int main() {			  //求前二十项数列之和double m, n,  sum, t;int i;m = 1;n = 2;sum = 0;for (i = 1;i <= 20;i++) {sum = sum + (n / m);t = n;n = m + n;m = t;}printf("前20项为%16.10f\n", sum);return 0;
}

11.课后习题8–猴子摘桃

主要是逆向思维

int main() {			//猴子摘桃问题,逆向思维int n = 1;for (int i = 9;i > 0;--i) {n = 2 * (n + 1);}printf("桃子为%d", n);return 0;
}

12.课后习题9–迭代法求根号n

分解题意
1.x要有一个初值x0
2.要用公式先求出x
3,选择循环——单一条件的循环用while或者do—while
4.要求x0和x的差值绝对值小于10-5,用1e-5来表达,绝对值的函数为abs()

int main() {		//迭代法求根号nfloat x, x0,a;printf("请输入一个数");scanf("%f",&a);x0 = a / 2;x = (x0 + a / x0) / 2;do {x0 = x;x = (x0 + a / x0) / 2;} while (fabs(x - x0) >= 1e-5);printf("%5.2f的根号为:%8.5f", a,x);return 0;
}

总结

在写代码的时候,一定要梳理好接替顺序,将其中的数学概念弄明白,任务一步一步拆解为一个小模块。一定要注意一些小点,比如此处变量应不应该用整型,小数点的输出怎么表达?指数形式怎么表达?再比如,==和=的含义就不一样。以后一定要注意这些小细节。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部