实验3 分支语句和循环语句(1)

实验三 

PART 1 验证性内容

§¹ 从键盘上输入3个数,让它们代表3条线段的长度,编写一个c程序判断这3条线段组成的三角形属于什么类

(一般三角形、等腰三角形、等边三角形或不构成三角形)。程序源码(demo1)如下↓

#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)
            printf("构成等边三角形\n");
        else if(a==b || a==c || b==c)
            printf("构成等腰三角形\n");
        else
            printf("构成一般三角形\n");
    }
    else
        printf("不能构成三角形\n");
    
    return 0;
}

 运行结果↓

 

 ◊ 思考: 把嵌套使用的if语句部分在软件环境中,替换demo1中的if部分,然后运行程序,输入不同边长数据进行测试验证,目前运行正常。

嵌套使用if语句时注意:C语言对if语句的规定是else总是与最近的一个没有被else匹配的if相配对,这里就要关注{}的准确使用,以免混乱逻辑顺序。

程序源码(demo1.1)如下↓

#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;
    
}

 运行结果↓

 

 ◊ 拓展 :把 demo 1中输入三边长并且判断三角形类型的代码放到while循环里,运行程序,观察结果,程序源码(demo 2)如下↓

/*这是在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;
}

运行结果↓                                         右图是我在“按组合键Ctrl+D(同时按下Ctrl和D键),然后按回车键结束”之后出现的结果,

                                                           这样的结果会无限重复循环,只能强制结束程序,不是很明白要怎么终止程序¯\_(ツ)_/¯

 

                                      

 

右图是我在“0+回车键”或者“按组合键Ctrl+D(同时按下Ctrl和D键),然后按回车键结束”之后出现的结果,无限重复循环,只能强制结束程序,就不是很明白要怎么终止程序。

组合使用while和if结构可以连续输出这样真的很便捷,可以不断输入不断判断运行结果,可是不知道如何终止程序,甚至让它无限循环下去这样的结果真的不是很好_(:_」∠)_...

(我还是需要再多了解一些结束程序这一块的内容,继续摸索一下这个软件)

之后参照以下程序进行更改后还是没有结束程序,这里就很叫人困惑,求助(编程软件Xcode)

 

int x;
while(scanf("%d",&x) != 0) { // 等价于while( scanf("%d",&x) != EOF )
                                           // 也等价于while( scanf("%d", &x) )
//...

对于以下的更改,我认为是限定输入,如果输入不足三个数字那么在这里既可判定其不可构成三角形,简化程序运行。

while(scanf("%ld", &a) && scanf("%ld", &b) && scanf("%ld", &c) ){
    // ...

§² 用scanf()函数输入一个百分制成绩(整型量),要求输出成绩等级A,B,C,D,E。

其中,90~100分为A,80~89分为B, 70~79分为C, 60~69分为D,60分以下为E。程序源码( demo3 )如下↓

/*《C语言程序设计教程学习指导》p122实验内容(2):输入百分制分数,测算并输出等级制分数这是一个综合使用while语句、多分支if语句
 和continue、break实现分数段判断的示例 运行程序,输入不同分数值进行测试,
 理解和巩固这些控制语句的用法 按下组合键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; // 结束本次循环,开始下一次循环
        }
        else if(score>=90 && score<=100)
            grade = 'A';
        else if(score>=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;
}

运行结果↓

在此次运行中很偶然的发现了退出运行的方法,只要输入的不是数字就可以退出运行¯\_(ツ)_/¯  这样的退出方法不确定是程序还是软件设定,求助

 

回答问题:

1.结合程序demo5_1.cpp和demo5_2.cpp运行结果对比,总结在循环中使用控制语句continue和break, 其功能区别是什么?

答:“break” 不管是 for 循环,还是 while 循环,或者是 do…while 循环,都可以用 break 跳出来,但是 break 只能跳出一层循环。

当有多层循环嵌套的时候,break只能跳出“包裹”它的最里面的那一层循环,无法一次跳出所有循环。同样,在多层 switch 嵌套的程序中,

break 也只能跳出其所在的距离它最近的 switch。

“continue”  作用为结束本次循环,即跳过循环体中下面尚未执行的语句,然后进行下一次是否执行循环的判定。continue 不能在 switch 中使用,

除非 switch 在循环体中。此时 continue 表示的也是结束循环体的本次循环,跟 switch 也没有关系。

continue 语句和 break 语句的区别是:

continue 语句只结束本次循环,而不是终止整个循环。break 语句则是结束整个循环过程,不再判断执行循环的条件是否成立。

而且,continue 只能在循环语句中使用,即只能在 for、while 和 do…while 中使用,除此之外 continue 不能在任何语句中使用。

2.结合程序demo6_1.cpp和demo6_2.cpp运行结果对比,回答:

在两层嵌套循环中,内层循环中如果出现continue,是否影响外层循环?

答:不影响

在两层嵌套循环中,内层循环中如果出现break,是否影响外层循环?

答:不影响

 

PART 2 补足程序,使得程序运行

编程找出5个整数中的最大数和最小数,并输出找出的最大数和最小数。

/*编程找出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语句,程序源码如下↓

/*用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 = 1; 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; }

 运行结果↓

以下是用do...whlie语句实现编程,程序源码如下↓ 

/*用do...while语句实现编程*/
#include<stdio.h>
int main()
{
    int number, max, min, n;
    n = 1;
    printf ("输入第%d个数: ", n );
    scanf ("%d", &number );
    max = number;
    min = number;
    do
    {
        n++;
        printf ("输入第%d个数: ",n );
        scanf ("%d", &number );
        if ( number > max )
            max = number;
        else if ( number < min )
            min = number;
    }
    while ( n < 5 );
    printf ("最大数为: %d\n", max );
    printf ("最小数为: %d\n", min );
    return 0;
}

运行结果↓

这里是一个讲解while和do while的网页http://c.biancheng.net/c/while/

这里是一个讲解for循环的网页http://c.biancheng.net/view/308.html

总的网页还是在C语言中文网(好像我在每一篇实验里都推荐了这个网页(///▽///)真的有很多干货)

 

 PART 3 编程练习

θ  编程输出101~200之间所有素数,并输出这一区间内素数个数,程序源码如下↓

#include <stdio.h>
#include <math.h>
int main()
{
    int i , n , x ;
    x = 0 ;
    for(i = 101 ; i < 201 ; i++)
    {
        for(n = 2 ; n < sqrt(i) ; n+=1)
        {
            if(i%n == 0 )
                break;
        }
        if(n > sqrt(i))
        {
            printf("%4d",i);
            x+=1;
        }
    }
    printf("\n101~200之间共有%d个素数",x) ;
    
    return 0;
}

运行结果↓

附错误的运行结果:

是在条件判断这里不同而造成结果的不同(¬_¬)

 

θ 编程打印输出如下图案,程序源码如下↓

#include<stdio.h>
int main(){
    int line , star , blank , a , b ;
    for(line = 1 ; line <= 5 ; line+=1 ){
        star = 5 - line ;
        blank = 2 * line - 1 ;
        for (a = 1 ; a <= star ; a++ )
            printf (" ");
        for (b = 1 ; b <= blank ; b++ )
            printf("*");
           printf("\n");
    }
    return 0;
}

运行结果如下↓

 这里是一个倒置金字塔的程序源码↓

#include<stdio.h>
int main ()
{
    int i ,j ;
    for ( i = 0 ; i < 5 ; i++ )
    {
        for ( j = 0;j < i ; j++ )
            printf(" ");
        for ( j = 0;j < (4-i) * 2 + 1 ; j++ )
            printf("*");
        printf("\n");
    }
    return 0 ;
}

运行结果如下↓

附几个奇奇怪怪的星星:

(就是在for语句的不同位置加了个“;”(●°u°●)​ 」)

 

 

实验总结与体会

这次试验最后两个程序是完全需要自己编写的,每次上课听老师讲流程都感觉很简单,但到自己分析的时候就感觉怎么也顺不下来,

自己的流程图总是不可以很顺利的用C语言语句实现,需要找很多程序实例参考有关程序写法,不断运行之后从运行结果里面分析自己是哪里写出了问题 T^T...

然后渐渐纠正最终做出一个程序,过程中也暴露出自己对do while语句还不熟很熟悉,对循环的判断条件分析还欠妥,日后多多练习,不断纠正。

在这次实验的输入过程中我误关“我的随笔”这个页面好多次...真的十分感谢网页自动保存的功能,不用担心一下的手滑让辛辛苦苦的实验内容全丢掉了。

(每手滑关掉一次就会恢复一次,所以最后的我文末就出现了这么多次记录(⊙_⊙)真的恢复了好多好多次...)

最后感谢舍友耐心讲解才写出来素数的程序,感谢ʕ •ᴥ•ʔ ♥~

(之后的一周内我将进行互评环节,链接会以评论的形式附在这篇实验后,如果我在后期可以顺利的更新本篇实验的话就会直接加链接在最后面的(。・ω・。)

posted @ 2019-04-16 22:49  王钰敬  阅读(592)  评论(3编辑  收藏  举报