C语言第六次作业

(一)改错题:

源程序(有错误的程序)

#include
int main()
{int flag,n;double eps,item,s;printf("Input eps: ");scanf("%f",&eps);flag = 1;s = 0;n = 1;do{item = 1/ n;s = s + flag * item;  flag = -flag;n = n + 3;}while( item < eps)printf( "s = %f\n",s);return 0;
}

①错误信息:1242637-20171113130240937-496236992.png
错误原因:格式错误
改正方法:在 }while( item < eps)后面加;
②错误信息:1242637-20171113131634765-1274471546.png
错误原因:精度错误在double中的item不能除整数
改正方法:将1变成1.0
③错误信息:1242637-20171113133151327-1593477968.png
错误原因:循环表达错误,while中成立才循环
改正方法:将while中的=
④错误信息:1242637-20171113134336327-931661002.png
错误原因:输入格式错误
改正方法:将scanf()中的%f改为%lf
(二)学习总结:
1.语句while(1)和for(;;)是什么意思?,如何保证这种循环能正常执行?
while和for都是循环语句,while相对for来说个人感觉比较简洁,没有for的条条框框,循环条件也简单只要while()中的成立时,循环就一直进行,然后就可以在循环{}中改变条件使条件不满足时跳出循环,而for的循环中就要注意循环语句是两个分号中间的才是循环语句,for语句是计制循环体,满足循环语句则循环正常进行。
2.一般情况下,设计循环结构时,使用for、while、do while三种语句都可以,并且三种语句可以相互转换,但是,在某些特定情况下,我们应该优先选择某种语句来快速实现循环设计。如果有如下情况:
(1)循环次数已知
(2)循环次数未知,但循环条件在进入循环时明确
(3)循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确
针对上面三种情况,分别采用什么循环语句实现比较好?对每种情况,用我们完成的两次循环结构作业中的题目加以说明。
(1)循环次数已知:当循环次数已知时,for丶while丶do while这三种语句都是可以的,三种语句是可以互相转换。如:7-5 统计字符(15 分)
本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。就是典型的循环次数已知,在这种情况下,三种语句是可以相互转换的。
(2)循环次数未知,但循环条件在进入循环时明确:当这种情况是,是在循环条件明确下,三种都可以使用,但是通常都是同for和while来进行编写,如:7-1 求奇数分之一序列前N项和(10 分)本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。这种就是循环条件明确,循环条件就是输入N以N来进行循环。
(3)循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确:在这种情况下就是只能用do while来进行循环,如:7-2 猜数字游戏(20 分)
猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。这个题就是典型的先执行后判断的题。
3.有如下问题:输入一批学生成绩,以-1作为结束,计算学生的平均成绩。
要求分别用for语句、while语句、do while语句三种循环语句实现,并说明你认为哪种形式更合适?
我认为输入一批学生成绩未知学生人数,无法确定循环次数,而且循环结束语句是以-1结束在只种情况下,do while更合适,因为do while和while都是无限循环,而在我的个人的习惯是比较喜欢do while,在do while的语句中,插入if语句进行判断,先进行if(变量==-1)判断,当判断成立时,进行break;结束循环输出学生的平均成绩。
4.运行下面程序,输入1到10,结果分别是什么?为什么?
(1)

#include
int main()
{int n,s,i;s = 0;for(i = 1; i <= 10; i++){scanf("%d",&n);     if(n % 2 == 0)break;      s = s + n;      }printf("s = %d\n",s);return 0;
}    

执行结果:
1242637-20171116203040499-930532079.png

1242637-20171116203205999-122586451.png

1242637-20171116203239077-1551447753.png

1242637-20171116203301249-2066621883.png

1242637-20171116203326452-2103534128.png

当输入1~10时,单次循环中,if语句判断的是,当输入数字是偶数时,break是结束循环,程序是输入奇数时进行加和,输入偶数时,结束循环。

(2)

#include
int main()
{int n,s,i;s = 0;for(i = 1; i <= 10; i++){scanf("%d",&n);     if(n % 2 == 0)continue;       s = s + n;      }printf("s = %d\n",s);return 0;
}

执行结果:1242637-20171116204215546-1410140694.png

当输入1~10时,continue是跳出循环,当输入数字是奇数时,进行加和,当输入数字是偶数时,跳出循环,总体程序是将输入的奇数数字进行加和。
前面程序基本相同,而break和continue的不同导致程序结果不同。break是结束循环,continue是跳出单次循环。
(三)实验总结:
(1)题目:7-1 求给定精度的简单交错序列部分和(10 分)
本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。
(2)流程图:
1242637-20171116222330593-197316962.png

(3)源代码:

#include
#include
int main()
{int n = 1;double eps,a = 1.0,S = 1.0,sum = 0.0;scanf("%lf",&eps);do{a = 1.0 / (S* pow(-1,n+1));S = S + 3 ;sum = sum + a;n++;}while(fabs(a) > eps);printf("sum = %lf",sum);return 0;} 

(4)实验分析:
问题1:精度输出问题
原因:精度导致循环提前结束,输出结果不对。
改正方法:查看精度临界差值,
(5)本题PTA提交列表:
1242637-20171118095800124-1987496882.png

(1)题目:
7-2 猜数字游戏(20 分)
猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。
(2)流程图:
1242637-20171116225404452-856363108.png

1242637-20171116225413702-483778866.png

(3)源代码:

#include
int main()
{int M,N,n = 0,math;scanf("%d%d",&M,&N);do{   n++;scanf("%d",&math);if(math<0){printf("Game Over");break;}else if(n>N){printf("Game Over");break;}else if(math==M){if(n==1){printf("Bingo!");break;}else if(n==2||n==3){printf("Lucky You!");break;}else{printf("Good Guess!");break;}}else if(mathM){printf("Too big\n");}   }while(1);return 0;
}

(4)实验分析:
问题2:多重语句的套构
原因:不同语句的顺序问题导致输出问题
改正方法:多次尝试改正顺序
(5)本题PTA提交列表:
1242637-20171118095845609-1493161047.png

(1)题目:
7-3 求奇数和(10 分)
本题要求计算给定的一系列正整数中奇数的和。
(3)源代码:

#include
int main()
{int sum=0,n;do{scanf("%d",&n);if(n<=0){break;}else if(n%2!=0){sum=sum+n;}}while(1);printf("%d",sum);return 0;   }

(4)实验分析:
本题无问题。
(5)本题PTA提交列表:
1242637-20171118095923671-1473409530.png
博客互评:
李晓晓:
http://www.cnblogs.com/Reloaded/p/7825734.html
许天笑:
http://www.cnblogs.com/snxtx/p/7824427.html
郭展旭:
http://www.cnblogs.com/1234569ss/p/7824423.html

转载于:https://www.cnblogs.com/SYDneyHZY/p/7824429.html


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

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部