C高级语言程序设计实验报告之选择结构程序设计

实验目的

1、了解C语言表示辑量的方法(以0代表“假”,以非0代表“真”)
2、学会正确使用遷辑运算符和遷辑表达式
3、熟掌握if语句的使用(包括if语句的嵌套)
4、熟掌握多分支选语句-——switch 语句
5、结合程序掌握一些简单的算法
6、进一步学习调试程序的方法

题目

本实验要求事先编好解决下面问题的程序,然后上机输入程序并调试运行程序。
(1)有一函数:
在这里插入图片描述

(1)写程序,输入x的值,输出y相应的值。用scanf 函数输入x的值,求y值(第 4章第6 题)。
运行程序,输入x的值(分别为x<1、1≤x<10、x≥10这3种情况),检查输出的 y值 是否正确。
(2)从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数, 则输 出其整数部分)。要求在输入数据后先对其进行检查是否小于1000的正数。若不是,则要求重新输入(第4章第5题)
(3)给出一个百分制成绩,要求输出成绩等级A,B,C,D,E。90分以上为A,81~89分 为B,7079分为C,6069分为D,60分以下为E(第4章第8题)
①事先编好程序,要求分别用if语句和switch 语句来实现。运行程序,并检查 结果是否正确。
②再运行一次程序,输入分数为负值(如-70),这显然是输入时出错,不应给出等级,修改程序,使之能正确处理任何数据,当输入数据大于100和小于0时, 通知用户“输入数据错”,程序结束。
(4)输入4个整数,要求按由小到大顺序输出(本题是教材第4章第11题)。 在得到正确结果后,修改程序使之按由大到小顺序输出。

代码

题一

#include <stdio.h>
//(1)有一函数:
//
//写程序,输入x的值,输出y相应的值。用scanf 函数输入x的值,求y值(第	4章第6 题)。
int main(void){
    int x,y;

    //获取输入
    printf("%s","请输入x的值:");//打印提示信息
    scanf("%d",&x);
    //判断x的范围并计算x的值
    //在这里我尽量不要直接写“printf("%d",x)”这种代码,
    // 他是对的但是对我们后期的修改以及代码的阅读不友好
    //"y=x;"这种写法将多个入口但是它只有单一出口y,这种写法更值得提倡
    if(x<1){
        y=x;
    }else if(x>=1&&x<=10){
        y=2*x-1;
    }else{
        y=3*x-11;
    }
    //在需要执行语句只有一行时代码还可以改成
    //毫无疑问这更加简洁,但是他对多行语句是不适用的
//    if(x<1)
//        y=x;
//    else if(x>=1&&x<=10)
//        y=2*x-1;
//    else
//        y=3*x-11;
    printf("计算获得的y的值为:%d",y);
    return 0;

}

题二


//从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输 出其整数部分)。
// 要求在输入数据后先对其进行检查是否小于1000的正数。
// 若不是,则要求重新输入(第4章第5题)

//这个题目没有要求使用scarf和printf我们使用更加方便的std类库中的cout和cin
//题目要求求根 ,所以需要引入数学函数库<math.h> ,它为我们提供了函数sqrt()
//sqrt函数解释:
//double sqrt(double n);该函数要求传入需要求平方根的数n(double型)
//之后返回对应开根结果(double型)

#include <iostream>
#include <math.h>

//告诉编译器找不到函数时查找std类库
//若不加此声明则不能直接使用cout与cin函数,需要改为 std::cout 和 std::cin
using namespace std;//全局生效

int main(void){
    //using namespace std; //可以添加到函数体内,这时只在该函数范围内生效


    double x;//x接受输出正数
    int y;//y负责储存结果
    //这里我们定义x为double是因为如果为int那么只能存储整数,实测输入20.5接收到的是2020,无语
    //而我们y的值定义为int是因为题目要求返回的平方根是整数
    //sqrt的返回值是double,将y定义为int系统会自动转换类型
    //你也可以手动转换,例如:
    //double y;
    //y = sqrt(double n);
    //cout<<int(y);


    //判断x输入是否合法
    //获取输入
//    printf("%s","请输入需要求平方根的正数(要求小于1000):");//打印提示信息
//    cin>>x;
//    if(x>0&&x<1000){
//        合法后执行的语句
//    }else{
//        不合法执行的语句
//    }
//   上述是该程序的初步思路,但是他不能解决用户重复输入错误的情况(除非你在else块里再套一层if-else语句然后无限套娃)
//   不难发现他的逻辑都是重复的,检查是否大于零小于1000,成功执行,不成功再次输入,再检查以此循环,那么我们写一个循环就好了
//   下面是循环的思路:
//   程序开始,先进入死循环(我们不知道用户会输错几次,也就是需要循环几次)所以让循环的判断语句始终为true,之后我们在循环体中
//   获取用户输入,检查用户输入,成功跳出循环(break;),执行接下来的步骤,失败则继续循环(continue;)
    while (true){
        //获取输入
        cout<<"请输入需要求平方根的正数(要求小于1000):";//打印提示信息
        cin>>x;
//        //进行合法检查
//        if(x>0&&x<1000){
//            //合法退出循环
//            break;
//        }else{
//            //失败继续,这里我们可以使用continue(跳过本次循环,进入下一次循环)
//            //但是因为之后并没有什么语句,没什么可以跳的所以传入空语句也可以(;)
//            ;
//        }
        //下面是更简便的写法
        //进行合法检查
        if(x>0&&x<1000) {
            //合法退出循环
            break;
        }
    }
    //求平方根
    //先声明sqrt函数,虽然在math.h库中已为我们定义,但是我们使用前还需要对他进行声明
    double sqrt(double n);
    y = sqrt(x);
    cout<<x<<"的开根结果为:"<<y;

}

题三

int main()
{
    //获取输入
    int m = 95;
    cout<<"请输入您的成绩(0-100):";

    //switch语句中case后需要一个具体的值,而不是判断条件
    //而我们将输入的m进行整除(其实就是直接除,因为m为int型,小数部分就会自己省掉了)
    //如果m之前在10-20之间那么整除就会只剩下10,以此类推
    //这里注意100时结果是10,不能和90多的数混淆
    //代码也就简洁明了了

    m = m/10;
    switch (m) {
        case 10:
        case 9:
            cout<<"A\n"; break;
        case 8:
            cout<<"B\n"; break;
        case 7:
            cout<<"C\n"; break;
        case 6:
            cout<<"D\n"; break;
        default:
            cout<<"E\n"; break;
    }

    //注意这里的写法
//    case 10:
//    case 9:
//    是简化过的,switch的机制是找到符合的那个case语句然后往下执行,也就是说
//    如果我们在每个语句后不加break;跳出的话,当m = 7后会输出D之后不会自动结束而是继续执行输出E
//    利用这个特性,因为10和9的输出情况是相同的,我们简化代码让他们共用一条输出语句即可

    return 0;
};
//(3)给出一个百分制成绩,要求输出成绩等级A,B,C,D,E。90分以上为A,81~89分
// 为B,70~79分为C,60~69分为D,60分以下为E(第4章第8题)
//①事先编好程序,要求分别用if语句和switch 语句来实现。运行程序,并检查结果是否正确。
//②再运行一次程序,输入分数为负值(如-70),这显然是输入时出错,不应给出等级,
// 修改程序,使之能正确处理任何数据,当输入数据大于100和小于0时,	通知用户“输入数据错”,程序结束。
#include <iostream>
using namespace std;

int main()
{
    //获取输入
    int m;
    cout<<"请输入您的成绩(0-100):";
    cin>>m;

    //只有一条语句的时候大括号可以省略让代码更简洁
    if(m>=90)
        cout << "A";
    else if (m >= 80)
        cout << "B";
    else if (m >= 70)
        cout << "C";
    else if (m >= 60)
        cout << "D";
    else
        cout << "E";

    //这里的条件,比如说m>=70其实是隐含的 70<=m<=80,因为if语句是从上到下一次判断的
    //当其判断到m>=70就意味着着m>=80不通过,我们利用这一点简化了代码
    //注意这样的前提是:你必须先判断大范围然后范围依次缩小,否则会出错比如说你倒过来写,当m=90时
    //先判断他大于60输出D然后退出代码块,注意是直接退出而不会继续向下执行了(重点)!,观察if-else if-else的
    //流程图可知只有当前面条件不满足时才会继续向下判断,否则执行完对应代码块中语句会直接跳出if-else if块
    //另外在编写if条件代码时按照先大范围后小范围的顺序书写是一个很好的习惯

    return 0;
};
//(3)给出一个百分制成绩,要求输出成绩等级A,B,C,D,E。90分以上为A,81~89分
// 为B,70~79分为C,60~69分为D,60分以下为E(第4章第8题)
//①事先编好程序,要求分别用if语句和switch 语句来实现。运行程序,并检查结果是否正确。
//②再运行一次程序,输入分数为负值(如-70),这显然是输入时出错,不应给出等级,
// 修改程序,使之能正确处理任何数据,当输入数据大于100和小于0时,	通知用户“输入数据错”,程序结束。
#include <iostream>
using namespace std;

int main()
{
    //获取输入
    int m;

    //和上一道题目类似,我们使用循环来一直获取用户输入,直到输入合法为止
    while(true){
        cout<<"请输入您的成绩(0-100):";
        cin>>m;
        if(m>=0&&m<=100) break;
        //c++是不看你的代码格式的,之前我们换行加缩进是为了让自己看的更清楚,
        // 这里因为只有一个break跟在后面就好,简洁又轻松
    }

    //只有一条语句的时候大括号可以省略让代码更简洁
    if(m>=90)
        cout << "A";
    else if (m >= 80)
        cout << "B";
    else if (m >= 70)
        cout << "C";
    else if (m >= 60)
        cout << "D";
    else
        cout << "E";

    //这里的条件,比如说m>=70其实是隐含的 70<=m<=80,因为if语句是从上到下一次判断的
    //当其判断到m>=70就意味着着m>=80不通过,我们利用这一点简化了代码
    //注意这样的前提是:你必须先判断大范围然后范围依次缩小,否则会出错比如说你倒过来写,当m=90时
    //先判断他大于60输出D然后退出代码块,注意是直接退出而不会继续向下执行了(重点)!,观察if-else if-else的
    //流程图可知只有当前面条件不满足时才会继续向下判断,否则执行完对应代码块中语句会直接跳出if-else if块
    //另外在编写if条件代码时按照先大范围后小范围的顺序书写是一个很好的习惯

    return 0;
};

题四


//(4)输入4个整数,要求按由小到大顺序输出(本题是教材第4章第11题)。
// 在得到正确结果后,修改程序使之按由大到小顺序输出。
#include <iostream>

//选择法:是第一个数逐次跟每个数比较,之后最小的放在第一位上,以此类推
//注意是从小到大排
int main(){
    using namespace std;//这次用过局部的换个花样
    int i,j,m;

    int numbers[4];
    //定义一个数组来存放输入的四个数,
    //这样做有两个好处,其一你不用像使用变量那样再为每一个变量起名,尤其是当需要保存的数据多了以后
    //其二,在获取完一个数后我们可以很方便获取它的上一个或者下一个数(遍历)

    //循环获取四个数,并存入数组
    for(i=0;i<4;i++){
        cout<<"请输入第"<<i+1<<"个数:";
        cin>>numbers[i];
    }
    //怎么判断是否从小到大排列呢?其实很简单,随便拿出一个数让它比它之后的每一个数都小就好了
    //所以我们需要俩个计数变量i和j
    //其中j始终比i至少大一,这样的话number[j]就始终是number[i]后面的数了
    //这时我们只需要保证number[i]<number[j]就好,如果不成立咋办,将两数互换位置呗


    j = 1;
    //外层函数是依次按数组顺序拿出数,配合内层函数实现依次拿出数组中的数和之后的每一个数相比
    //成功的状态是number[i]<number[j]一直成立,如果失败了那么将这两个数的位置对调
    for(i=0;i<4;i++){
        //让j初始状态始终比i大一,放到实际来说是你不用要求这个数比他之前的数小
        for(j=i+1;j<4;j++){
            if(numbers[i]>numbers[j]){
                //大数给中间变量m
                m = numbers[i];
                //小数给number[i]
                numbers[i] = numbers[j];
                numbers[j] = m;
            }
        }
    }
    //循环遍历输出排序结果
    cout<<"将您输入的四个数从小到大排列得到结果:";
    for(i=0;i<4;i++){
        cout<<numbers[i];
        //下面是输出一个<号,主要是输出后好看点,无关紧要的
        if(i==3)
            cout<<endl;
        else
            cout<<" < ";
    }

}

//(4)输入4个整数,要求按由小到大顺序输出(本题是教材第4章第11题)。
// 在得到正确结果后,修改程序使之按由大到小顺序输出。
#include <iostream>

//选择法:是第一个数逐次跟每个数比较,之后最小的放在第一位上,以此类推
//注意是从大到大排
int main(){
    using namespace std;//这次用过局部的换个花样
    int i,j,m;

    int numbers[4];
    //定义一个数组来存放输入的四个数,
    //这样做有两个好处,其一你不用像使用变量那样再为每一个变量起名,尤其是当需要保存的数据多了以后
    //其二,在获取完一个数后我们可以很方便获取它的上一个或者下一个数(遍历)

    //循环获取四个数,并存入数组
    for(i=0;i<4;i++){
        cout<<"请输入第"<<i+1<<"个数:";
        cin>>numbers[i];
    }

    //这次我们修改条件为number[i]>number[j]即可
    //即随机拿出一个数,它都比它之后的数大

    j = 1;
    //外层函数是依次按数组顺序拿出数,配合内层函数实现依次拿出数组中的数和之后的每一个数相比
    //成功的状态是number[i]>number[j]一直成立,如果失败了那么将这两个数的位置对调
    for(i=0;i<4;i++){
        //让j初始状态始终比i大一,放到实际来说是你不用要求这个数比他之前的数小
        for(j=i+1;j<4;j++){
            if(numbers[i]<numbers[j]){
                //大数给中间变量m
                m = numbers[i];
                //小数给number[i]
                numbers[i] = numbers[j];
                numbers[j] = m;
            }
        }
    }
    //循环遍历输出排序结果
    cout<<"将您输入的四个数从大到小排列得到结果:";
    for(i=0;i<4;i++){
        cout<<numbers[i];
        //下面是输出一个>号,主要是输出后好看点,无关紧要的
        if(i==3)
            cout<<endl;
        else
            cout<<" > ";
    }

}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盧瞳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值