实验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基础

JSP 设计教师与学生不同登陆界面(带验证码)

[NTUSTISC pwn LAB 7]Return to libc实验(puts泄露libc中gadget片段定位)

缓冲区溢出漏洞实验

使用 React 实验性中继片段:缺少属性 '"$fragmentRefs"'

chapter1.高通量序列实验简介:设计与生物信息学分析