实验三小结
(实验准备:1. if语句和switch语句的用法和注意事项
if语句:if(表达式){语句}[三目运算符的了解];if ……else……的用法,if……else if……else的用法
switch语句:多分支语句,当运算结果与某“case”后的结果一致时,开始输出,☆break在switch中的用法
2. while语句、do...while语句、for语句的用法和注意事项
一系列的语句序列千万不能忘记用大括号包起来,do……while中的分号,for“()”中的分号等(不能误操作为“,”)
3. 什么是循环的嵌套;在循环的嵌套中,内层循环和外层循环的执行过程
4. 控制语句continue、break的功能和用法
一个是略过本次循环中剩下的步骤,进入下一个循环,一个是中止本循环;都采取就近原则,且只与部分语句兼容)
Part1.
demo1-1.cpp
程序:
/* demo1_1.cpp: 《C语言程序设计教程学习指导》p122 实验内容(1) 这是一个使用多分支if语句编程解决非数值类问题示例 运行程序,输入不同边长数据进行测试,观察输出结果是否正确,理解和巩固if语句功能和用法 */ #include <stdio.h> int main() { double a,b,c; scanf("%lf %lf %lf", &a, &b, &c); if(a+b>c && a+c>b && b+c>a) { if(a==b || a==c || b==c) { if (a==b && a==c) printf("构成等边三角形\n"); else printf("构成等腰三角形\n"); } else printf("构成一般三角形\n"); } else printf("不能构成三角形\n"); return 0; }
实际验证:
因此将demo1-1.cpp中的if语句替换到demo1.cpp中判断三角形的形状可行。
demo2.cpp
这是在demo1.cpp的基础上行,增加了一小部分代码,可以循环判断多组数据 要终止输入和判断:按组合键Ctrl+D(同时按下Ctrl和D键),然后按回车键结束 */ #include <stdio.h> int main() { double a,b,c; printf("输入三角形三边:\n"); while(scanf("%lf%lf%lf",&a,&b,&c)) { if(a+b>c && a+c>b && b+c>a) { if(a==b && a==c) printf("构成等边三角形\n"); else if(a==b || a==c || b==c) printf("构成等腰三角形\n"); else printf("构成一般三角形\n"); } else printf("不能构成三角形\n"); printf("\n输入三角形三边:\n"); } return 0; }
了解了以上结构可以使得输入验证环节更加便捷连贯的作用
但是,下面这个问题并没有得到答案:
希望走过路过的大佬帮忙解答一下,蟹蟹
demo3.cpp
#include <stdio.h> int main() { int score; // 用于存放百分制分数 char grade; // 用于存放等级制分数(取值'A', 'B','C','D', 'E') while(1) { printf("输入学生成绩: "); if(scanf("%d",&score) == 0) // 如果检测到没有成绩输入,则结束整个循环 break; if(score<0 || score > 100) { printf("输入成绩有误!\n\n"); continue; // 结束本次循环,开始下一次循环 } else if(score>=90 && score<=100) grade = 'A'; else if(scor“e>=80 && score<=89) grade = 'B'; else if(score>=70 && score<=79) grade = 'C'; else if(score>=60 && score <=69) grade = 'D'; else grade = 'E'; printf("等级为: %c\n\n", grade); } return 0; }
while语句:while(1)其中1代表一个常量表达式,它永远不会等于0。循环会一直执行下去。除非你设置break等类似的跳出循环语句循环才会中止。
break语句:在没有成绩输入的时候使得整个程序终止运行
if和continue语句:(continue用于跳过本次循环余下的语句,转去判断是否需要执行下次循环,continue终止此次循环,不会终止if。)
首先判断输入的成绩数值是否在合理范围内,如果不在合理范围内,则输出相应提示之后不再进行本次循环内其他语句的执行
如果在合理范围内,直接在“else if ”程序部分进行判断
demo4.cpp
/* 相较于demo3.cpp,这个代码实现中,分数从百分制转换为等级制的部分,使用switch语句实现 按下组合键Ctrl+D(同时按下Ctrl和D),然后按回车键,结束判断 */ #include <stdio.h> int main() { int score; // 用于存放百分制分数 char grade; // 用于存放等级制分数(取值'A', 'B','C','D', 'E') while(1) { printf("输入学生成绩: "); if(scanf("%d",&score) == 0) // 如果检测到没有成绩输入,则结束整个循环 break; if(score<0 || score > 100) { printf("输入成绩有误!\n\n"); continue; // 结束本次循环,开始下一次循环 } switch(score/10) { // 使用switch进行分数等级判断 case 10: case 9: grade='A'; break; case 8: grade='B'; break; case 7: grade='C'; break; case 6: grade='D'; break; default: grade='E'; } printf("等级为: %c\n\n", grade); } return 0; }
break语句,continue语句和demo3中的基本一致
demo5-1.cpp demo5-2.cpp
// 对比demo5_1.cpp和demo5_2.cpp,理解控制语句continue和break的功能 #include <stdio.h> int main() { int i; // 在循环语句中使用continue for(i=1; i<=5; i++) { if (i%3 == 0) // 如果i是3的倍数,则结束本次循环,开始下一次循环 continue; printf("i=%d\n",i); } return 0; }
// 对比demo5_1.cpp和demo5_2.cpp,理解控制语句continue和break的功能 #include <stdio.h> int main() { int i; // 在循环语句中使用break for(i=1; i<=5; i++) { if (i%3 == 0) // 如果i是3的倍数,则结束整个循环 break; printf("i=%d\n",i); } return 0; }
5-1和5-2相同的位置分别使用了break和continue,运行结果如下
5-1 continue表示循环到i=3时结束本次循环,但是继续开始下一次循环(即i=4时仍然正常)
5-2 break表示运行到i=3时符合if()的条件,从此终止程序运行
demo6-1.cpp和demo6-2.cpp
// 对比demo6_1.cpp和demo6_2.cpp,理解在嵌套的循环中,控制语句continue和break的功能 #include <stdio.h> const int LINE=3; // 定义符号常量LINE const int COLUME=5; // 定义符号常量COLUME int main() { int line; // 定义变量line, 用来控制行数 int col; // 定义变量col, 用来控制列数 // 输出LINE行信息 for(line=1; line<=LINE; line++) { // 每一行中,利用循环,输出各列信息 for(col=1; col<=COLUME; col++) { if(col%3 == 0) // 如果col是3的倍数,则结束本次循环,开始下一次循环 continue; printf("%5d", col); } printf("\n"); // 每输出完一行,换行 } return 0; }
// 对比demo6_1.cpp和demo6_2.cpp,理解在嵌套的循环中,控制语句continue和break的功能 #include <stdio.h> const int LINE=3; // 定义符号常量LINE const int COLUME=5; // 定义符号常量COLUME int main() { int line; // 定义变量line, 用来控制行数 int col; // 定义变量col, 用来控制列数 // 输出LINE行信息 for(line=1; line<=LINE; line++) { // 每一行中,利用循环,输出各列信息 for(col=1; col<=COLUME; col++) { if(col%3 == 0) // 如果col是3的倍数,则结束内层循环体 break; printf("%5d", col); } printf("\n"); // 每输出完一行,换行 } return 0; }
6-1
6-2
由于本题特意设计的数字(行列与3密切相关),很容易得出,双层嵌套循环中,内层有break,continue语句并不影响外层循环。(在switch语句中同样如此)
Part2.
blank1.cpp
一个假理科生在台灯底下想了半天,快想混乱了才填出来(鱼的智商实锤)
/* 编程找出5个整数的最大数和最小数 《C语言程序设计教程学习指导》p122实验内容(3) */ #include <stdio.h> int main() { int number, max, min, n; n=1; printf("输入第%d个数: ", n); scanf("%d", &number); max = number; min = number; while(n<5) { n++; printf("输入第%d个数: ", n); scanf("%d", &number); if(number>=max) max = number; else if(number<=min) min = number; } printf("最大数为: %d\n", max); printf("最小数为: %d\n", min); return 0; }
自我验证结果:
合理运用循环可以有效简化程序内容,并且使得结构更加清晰;
用for循环语句改写:
#include <stdio.h>
int main() {
int number, max, min, n;
n=1;
printf("输入第%d个数: ", n) ;
scanf("%d",&number);
max=number;
min=number;
for(n=2;n<=5;n++)
{printf("输入第%d个数: ", n);
scanf("%d",&number);
if(number<=min)
min=number;
else if(number>=max)
max=number;
}
printf("最大数为: %d\n", max);
printf("最小数为: %d\n", min);
return 0;
}
一共修改了三次
主要的问题出在一下几个方面:
①:较基础的:完整语句末尾的分号忘了,for语句序列整体的大括号不能忘记
②:printf语句的位置以及出现的个数如果书写不对会导致出现无限刷屏现象
③:赋值的方向性,如果赋值的方向性错了会导致部分输入数据不被比较,产生错误
运行后:
用do……while语句改写:
#include <stdio.h> int main() { int number, max, min, n; n=1; printf("输入第%d个数: ", n); scanf("%d", &number); max = number; min = number; n=n+1; do{ printf("输入第%d个数:",n); scanf("%d",&number); if(number<=min) min=number; else if(number>=max) max=number; n++; }while(n<=5); printf("最大数为: %d\n", max); printf("最小数为: %d\n", min); return 0; }
验证:
把for写完以后感觉这个简单多了(捂脸)
注意点:
n=n+1或者n=2不要写在do后面的大括号里,否则会覆盖掉之前的n++操作
Part3.
101~200的素数
#include<stdio.h> #include<math.h> int main() {int i,m,n,number; n=101; number=0; do{ m=sqrt(n); for(i=2;i<=m;i++) if(n%i==0)break; if(i>m) {printf("%d ",n); number=number+1;} n++;}while(n<=200);printf("\n"); printf("101~200之间共有%d个素数",number); return 0; }
依靠自主编程排版还不会(cry)
符号阵型
#include<stdio.h> int main() { int a,b,c; for(a=1;a<=5;a++) { for(b=5-a;b>=1;b--) {printf(" "); } for(c=1;c<=2*a-1;c=c+1) {printf("*"); } printf("\n"); } return 0; }
验证:
因为对于这种依靠行列计算的方式来输出符号(/数字)的题型还不够熟练,在操作时寻求了同学的帮助
但是,在参看了同学们的作业之后发现这题的做法不止一种,也可以不用等差数列的方法进行输出。
总结:吐槽与教训都穿插在题目中了,但是对于循环语句的掌握尚不够熟练,还需要多看题目,尤其对于行列自加自减为中介进行输出的题目
走过路过的小伙伴看到错误别忘了指出来w,蟹蟹(/w\)