实验3
Posted lizhangrui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验3相关的知识,希望对你有一定的参考价值。
实验结论:
Part1: 验证性内容
从键盘上输入3个数,让它们代表3条线段的长度,编写一个c程序判断这3条线段组成的三角形属于什么类
型(一般三角形、等腰三角形、等边三角形或不构成三角形)
1 /* 2 《C语言程序设计教程学习指导》p122 实验内容(1) 3 这是一个使用多分支if语句编程解决非数值类问题示例 4 运行程序,输入不同边长数据进行测试,观察输出结果是否正确,理解和巩固if语句功能和用法 5 */ 6 #include <stdio.h> 7 int main() { 8 double a,b,c; 9 scanf("%lf %lf %lf", &a, &b, &c); 10 if(a+b>c && a+c>b && b+c>a) { 11 if(a==b && a==c) 12 printf("构成等边三角形 "); 13 else if(a==b || a==c || b==c) 14 printf("构成等腰三角形 "); 15 else 16 printf("构成一般三角形 "); 17 } 18 else 19 printf("不能构成三角形 "); 20 return 0; 21 }
结果如图:
修改后:
1 #include <stdio.h> 2 int main() { 3 double a,b,c; 4 scanf("%lf %lf %lf", &a, &b, &c); 5 if(a+b>c && a+c>b && b+c>a) { 6 if(a==b || a==c || b==c) { 7 if (a==b && a==c) 8 printf("构成等边三角形 "); 9 else 10 printf("构成等腰三角形 "); 11 } 12 else 13 printf("构成一般三角形 "); 14 } 15 else 16 printf("不能构成三角形 "); 17 return 0; 18 }
同样适用;
用while修改后:
1 /* 2 这是在demo1.cpp的基础上行,增加了一小部分代码,可以循环判断多组数据 3 要终止输入和判断:按组合键Ctrl+D(同时按下Ctrl和D键),然后按回车键结束 4 */12 #include <stdio.h> 13 int main() { 14 double a,b,c; 15 printf("输入三角形三边: "); 16 while(scanf("%lf%lf%lf",&a,&b,&c)) { 17 if(a+b>c && a+c>b && b+c>a) { 18 if(a==b && a==c) 19 printf("构成等边三角形 "); 20 else if(a==b || a==c || b==c) 21 printf("构成等腰三角形 "); 22 else 23 printf("构成一般三角形 "); 24 } 25 else 26 printf("不能构成三角形 "); 27 printf(" 输入三角形三边: "); 28 } 29 return 0; 30 }
运行结果例如:
用scanf()函数输入一个百分制成绩(整型量),要求输出成绩等级A,B,C,D,E。其中,90~100分为A,80~89
分为B, 70~79分为C, 60~69分为D,60分以下为E
1 /* 2 《C语言程序设计教程学习指导》p122 实验内容(2):输入百分制分数,测算并输出等级制分数 3 这是一个综合使用while语句、多分支if语句和continue、break实现分数段判断的示例 4 运行程序,输入不同分数值进行测试,理解和巩固这些控制语句的用法 5 按下组合键Ctrl+D(同时按下Ctrl和D)结束判断 6 */ 7 #include <stdio.h> 8 int main() { 9 int score; // 用于存放百分制分数 10 char grade; // 用于存放等级制分数(取值‘A‘, ‘B‘,‘C‘,‘D‘, ‘E‘) 11 while(1) { 12 printf("输入学生成绩: "); 13 if(scanf("%d",&score) == 0) // 如果检测到没有成绩输入,则结束整个循环 14 break; 15 if(score<0 || score > 100) { 16 printf("输入成绩有误! "); 17 continue; // 结束本次循环,开始下一次循环 18 } 19 else if(score>=90 && score<=100) 20 grade = ‘A‘; 21 else if(score>=80 && score<=89) 22 grade = ‘B‘; 23 else if(score>=70 && score<=79) 24 grade = ‘C‘; 25 else if(score>=60 && score <=69) 26 grade = ‘D‘; 27 else 28 grade = ‘E‘; 29 printf("等级为: %c ", grade); 30 } 31 return 0; 32 }
运行结果例如:
在尝试过程中注意到,当输入字符时同样会结束循环
用switch语句改写
1 /* 2 相较于demo3.cpp,这个代码实现中,分数从百分制转换为等级制的部分,使用switch语句实现 3 按下组合键Ctrl+D(同时按下Ctrl和D),然后按回车键,结束判断 4 */ 5 #include <stdio.h> 6 int main() { 7 int score; // 用于存放百分制分数 8 char grade; // 用于存放等级制分数(取值‘A‘, ‘B‘,‘C‘,‘D‘, ‘E‘) 9 while(1) { 10 printf("输入学生成绩: "); 11 if(scanf("%d",&score) == 0) // 如果检测到没有成绩输入,则结束整个循环 12 break; 13 if(score<0 || score > 100) { 14 printf("输入成绩有误! "); 15 continue; // 结束本次循环,开始下一次循环 16 } 17 switch(score/10) { // 使用switch进行分数等级判断 18 case 10: 19 case 9: grade=‘A‘; break; 20 case 8: grade=‘B‘; break; 21 case 7: grade=‘C‘; break; 22 case 6: grade=‘D‘; break; 23 default: grade=‘E‘; 24 } 25 printf("等级为: %c ", grade); 26 } 27 return 0; 28 }
分别运行程序demo5_1.cpp和demo5_2.cpp,结合运行结果,对比和理解控制语句continue和break的功能
1 // 对比demo5_1.cpp和demo5_2.cpp,理解控制语句continue和break的功能 2 #include <stdio.h> 3 int main() { 4 int i; 5 // 在循环语句中使用continue 6 for(i=1; i<=5; i++) { 7 if (i%3 == 0) // 如果i是3的倍数,则结束本次循环,开始下一次循环 8 continue; 9 printf("i=%d ",i); 10 } 11 return 0; 12 }
1 // 对比demo5_1.cpp和demo5_2.cpp,理解控制语句continue和break的功能 2 #include <stdio.h> 3 int main() { 4 int i; 5 // 在循环语句中使用continue 6 for(i=1; i<=5; i++) { 7 if (i%3 == 0) // 如果i是3的倍数,则结束整个循环 8 break; 9 printf("i=%d ",i); 10 } 11 return 0; 12 }
在循环中使用控制语句continue和break,其功能区别在于:
continue只能用于循环语句,跳过循环位于该语句后所有语句提前结束本次循环进入新一轮循环;
break只能用于循环或switch语句,跳出本层循环或本层switch结构
分别运行程序demo6_1.cpp和demo6_2.cpp,结合运行结果,对比和理解在嵌套的循环中控制语句
continue和break的功能
1 // 对比demo6_1.cpp和demo6_2.cpp,理解在嵌套的循环中,控制语句continue和break的功能 2 #include <stdio.h> 3 const int LINE=3; // 定义符号常量LINE 4 const int COLUME=5; // 定义符号常量COLUME 5 int main() { 6 int line; // 定义变量line, 用来控制行数 7 int col; // 定义变量col, 用来控制列数 8 // 输出LINE行信息 9 for(line=1; line<=LINE; line++) { 10 // 每一行中,利用循环,输出各列信息 11 for(col=1; col<=COLUME; col++) { 12 if(col%3 == 0) // 如果col是3的倍数,则结束本次循环,开始下一次循环 13 continue; 14 printf("%5d", col); 15 } 16 printf(" "); // 每输出完一行,换行 17 } 18 return 0; 19 }
1 // 对比demo6_1.cpp和demo6_2.cpp,理解在嵌套的循环中,控制语句continue和break的功能 2 #include <stdio.h> 3 const int LINE=3; // 定义符号常量LINE 4 const int COLUME=5; // 定义符号常量COLUME 5 int main() { 6 int line; // 定义变量line, 用来控制行数 7 int col; // 定义变量col, 用来控制列数 8 // 输出LINE行信息 9 for(line=1; line<=LINE; line++) { 10 // 每一行中,利用循环,输出各列信息 11 for(col=1; col<=COLUME; col++) { 12 if(col%3 == 0) // 如果col是3的倍数,则结束内层循环体 13 break; 14 printf("%5d", col); 15 } 16 printf(" "); // 每输出完一行,换行 17 } 18 return 0; 19 }
Q:在两层嵌套循环中,内层循环中如果出现continue,是否影响外层循环?
在两层嵌套循环中,内层循环中如果出现break,是否影响外层循环?
A:内层循环出现continue或break不会影响外层循环
Part2: 补足程序,使得程序运行
编程找出5个整数中的最大数和最小数,并输出找出的最大数和最小数。
算法思路描述
第1步,输入第1个数,它既是当前的最大数,也是最小数;
第2步,输入第2个数,把它与当前的最大数比较,如果比最大数还要大,则更新当前的最大
数;否则,把它与当前的最小数比较,如果比最小数还要小,则更新当前的最小数;
第3步,重复第2步,直到第5个数输入并比较完。
已补足程序:
1 /* 2 编程找出5个整数的最大数和最小数 3 《C语言程序设计教程学习指导》p122实验内容(3) 4 */ 5 #include <stdio.h> 6 int main() { 7 int number, max, min, n; 8 n=1; 9 printf("输入第%d个数: ", n); 10 scanf("%d", &number); 11 max = number; 12 min = number; 13 while(n<=4) { 14 n++; 15 printf("输入第%d个数: ", n); 16 scanf("%d", &number); 17 if(number>max) 18 max = number; 19 else if(number<=min) 20 min = number; 21 } 22 printf("最大数为: %d ", max); 23 printf("最小数为: %d ", min); 24 return 0; 25 }
运行结果如图:
for循环改写:
1 #include<stdio.h> 2 int main() 3 { 4 int number, max, min, n=1; 5 printf("输入第%d个数: ", n); 6 scanf("%d", &number); 7 max = number; 8 min = number; 9 for(n=1;n<=4;) 10 { 11 n++; 12 printf("输入第%d个数: ",n); 13 scanf("%d", &number); 14 if(number>max) 15 max = number; 16 else if(number<min) 17 min = number; 18 } 19 printf("最大数为: %d ", max); 20 printf("最小数为: %d ", min); 21 return 0; 22 }
do...while循环改写:
1 #include<stdio.h> 2 int main() 3 { 4 int number, max, min, n=1; 5 printf("输入第%d个数: ", n); 6 scanf("%d", &number); 7 max = number; 8 min = number; 9 do 10 { 11 n++; 12 printf("输入第%d个数: ",n); 13 scanf("%d", &number); 14 if(number>max) 15 max = number; 16 else if(number<min) 17 min = number; 18 }while(n<=4); 19 printf("最大数为: %d ", max); 20 printf("最小数为: %d ", min); 21 return 0; 22 }
改写后运行结果均为:
Part3:编程练习
编程输出101~200之间所有素数,并输出这一区间内素数个数。
程序如下:
1 #include <stdio.h> 2 int main() 3 { 4 int i,n,x=0,col,COLUME=5; 5 for(i=101;i<=200;i+=2) 6 { 7 for(n=2;n<(i/2);n++) 8 { 9 if(i%n==0) 10 break; 11 } 12 if(n==i/2) 13 { 14 for(col=1;col<=COLUME;col++) 15 printf("%5d",i); 16 x+=1; 17 } 18 } 19 printf(" 101~200之间共有%d个素数",x) ; 20 21 return 0; 22 }
结果如下:
这是错误演示,每个数都出现了5次,不清楚控制列数的for循环该放在何处
编程打印输出三角形图案
程序如下:
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,k; 5 char scape=‘ ‘; 6 for(i=0;i<5;i++) 7 { 8 for(j=4;i<j;j--) 9 { 10 printf("%c",scape); 11 } 12 for(k=1;k<=2*i+1;k++) 13 { 14 printf("*"); 15 } 16 printf(" "); 17 } 18 return 0; 19 }
或
1 #include<stdio.h> 2 int main() 3 { 4 int i,j; 5 for(i=1;i<=5;i++) 6 { 7 for(j=5-i;j>0;j--) 8 { 9 printf(" "); 10 } 11 for(j=1;j<=2*i-1;j++) 12 { 13 printf("*"); 14 } 15 printf(" "); 16 } 17 return 0; 18 }
均借鉴了网上的代码
结果均为:
实验总结与体会:循环嵌套不熟悉,还需课下多编写才可能熟练
以上是关于实验3的主要内容,如果未能解决你的问题,请参考以下文章
20155201 李卓雯 《网络对抗技术》实验一 逆向及Bof基础
[NTUSTISC pwn LAB 7]Return to libc实验(puts泄露libc中gadget片段定位)