实验三

Part1: 验证性内容 从键盘上输入3个数,让它们代表3条线段的长度,编写一个c程序判断这3条线段组成的三角形属于什么类 型(一般三角形、等腰三角形、等边三角形或不构成三角形)。(程序源码: demo1.cpp)

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

思考: 把 demo1.cpp中嵌套使用的if语句部分替换成以下代码,是否可以?在软件环境中,替换代码,然 后运行程序,输入不同边长数据进行测试验证。(程序源码: demo1_1.cpp)

#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.cpp中输入三边长并且判断三角形类型的代码放到while循环里,运行程序,观察结果,体 验并学习组合使用while和if带来的运行测试便捷性。(程序源码: demo2.cpp)

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

当程序的while语句修改后,程序出现了错误,不太明白为什么

用scanf()函数输入一个百分制成绩(整型量),要求输出成绩等级A,B,C,D,E。其中,90~100分为A,80~89 分为B, 70~79分为C, 60~69分为D,60分以下为E。(程序源码: 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(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;
 } 

printf("输入学生成绩: ");
if(scanf("%d",&score) == 0) 这个地方的输入是针对while之下的整个输入,当输入的不是数字时,sacnf就无法得到有效值,这时scanf会出错,对score不做处理,同时以返回值方式报错,即if语句中的条件成立,进入break终止程序。
break;

if(score<0 || score > 100) {   
printf("输入成绩有误!\n\n");
continue; // 结束本次循环,开始下一次循环
}

 

用switch语句改写(程序源码: demo4.cpp)。运行程序,理解这个示例中用到的控制语句:if, switch, while, continue, break

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

改写后的代码使程序运行更快

分别运行程序demo5_1.cpp和demo5_2.cpp,结合运行结果,对比和理解控制语句continue和break的功 能。 

1.输出结果是1245,相当于输出1~5之间非3 的倍数的数字,若没有continue则会输出3,故根据算法需要添加continue可以帮助我们控制相应的数据

2.输出结果是12,相当于输出1~5之间出现第一个3的倍数结束,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;
} 
#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;
} 

分别运行程序demo6_1.cpp和demo6_2.cpp,结合运行结果,对比和理解在嵌套的循环中控制语句 continue和break的功能。 源码文件demo6_1.cpp:

实验证明,内层循环出现break和continue只控制其内层循环,上述两个程序只控制了col对line这个变量并没有影响

Part2: 补足程序,使得程序运行 编程找出5个整数中的大数和小数,并输出找出的大数和小数。 算法思路描述 第1步,输入第1个数,它既是当前的大数,也是小数; 第2步,输入第2个数,把它与当前的大数比较,如果比大数还要大,则更新当前的大 数;否则,把它与当前的小数比较,如果比小数还要小,则更新当前的小数; 第3步,重复第2步,直到第5个数输入并比较完。 待补足的程序源码文件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;
} 

起初我令number<=5,最后程序输出的是六个数字

拓展思考: 对比《C语言程序设计教程学习指导》p124代码,体会和理解合理运用循环的优点。 当编程解决应用问题时,算法思路不止一种,即使基于相同的算法思路,每个人的实现细节也会有所 差异(比如使用的循环语句不同,初始值的设置不同,等等)。尝试使用for或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;
} 

 Part3:编程练习

编程输出101~200之间所有素数,并输出这一区间内素数个数。 预期输出结果如下:

/*输出101~200之间的所有素数及个数,并且以五列对齐格式输出*/
#include<stdio.h>
int main(){
    int x;
    int cnt = 0;
    
    for(x=101;x<200;x++){
        int i;
        int isPrime = 1;
        for(i=2;i<x;i++){
            if(x % i == 0){
                isPrime = 0;
                break; //判断x是否可以被1以外的数整除,可以则停止本次循环 
            }
        }
        if(isPrime == 1){
            cnt++; //将得到的素数个数计数 
            printf("%d\t",x); //输出得到的素数且对齐 
            if(cnt % 5 == 0){
                printf("\n");
            } //控制输出的格式 
        }
    }
    printf("\n101~200共有%d个素数", cnt); //开头换行使输出结果美观 
    return 0;
}

这个程序代码是在看完翁恺老师的课件后打出的,起初我打出的代码在break语句处使用了continue语句,导致输出结果只有101。现在的代码还额外增加了输出格式的控制,学习运用\t来控制输出数字对齐,解决了控制列数的问题。

 

打印星号

#include<stdio.h>
int main()
{
    int x, y, z, line;
    int blank, as;
    
    for(line=1;line<=5;line++){
        x = 5 - line;
        y = 2 * line - 1;
        z = y + 1;
        
        //printf("%d %d\n", a, t);
        
        for(blank=1;blank<=x;blank++)
        { 
        printf(" ");
        //printf("blank=%d\n", blank);
        } 
        for(as=1;as<=y;as++)
         printf("*");
         if(as==z)
         printf("\n"); //在第n+1个星号后面换行 
         
    }
    
    return 0;
} 

posted @ 2019-04-09 22:03  yy-Siri  阅读(275)  评论(1编辑  收藏  举报