上海海事大学自动化专业C语言课程代码参考(第六周)

在摆烂了两周之后终于跟上版本了,感人!

话不多说,直接看题吧

目录

上机实验

3-11 比较大小

输入格式:

输出格式:

输入样例:

输出样例:

3-12 输出三角形面积和周长

输入格式:

输出格式:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

3-13 计算电费

输入格式:

输出格式:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

输入格式:

输出格式:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

输入样例3:

输出样例3:

3-15 计算个人所得税

输入格式:

输出格式:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

输入样例3:

输出样例3:

输入样例4:

输出样例4:

输入样例5:

输出样例5:

3-16 计算油费

输入格式:

输出格式:

输入样例:

输出样例:

3-17 计算绝对值(二)

输入格式:

输出格式:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

3-18 四则运算(二)

输入格式:

输出格式:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

3-19 成绩转换(三)

输入格式:

输出格式:

输入样例:

输出样例:

3-20 计算天数

输入格式:

输出格式:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

结语


上机实验

很欣慰这次终于没有书上的题了

3-11 比较大小

本题要求编写程序,将输入的任意3个整数从小到大输出。

输入格式:

输入在一行中给出3个整数,其间以空格分隔。

输出格式:

在一行中将3个整数从小到大输出,其间以“->”相连。

输入样例:

529

输出样例:

2 -> 5 -> 9

排序是非常经典的算法,要讲的话可以有很多能说道的东西。但这道题只需要给三个数排序,简单比较大小就行。不过作为第一道排序题,还是得重点关注一下排序的逻辑。

先看代码吧

#include <stdio.h>

int main()
{
    int a, b, c, x;

    scanf("%d%d%d", &a, &b, &c);
    if(a > b)
    {
        x = a;
        a = b;
        b = x;
        if(b > c)
        {
            x = c;
            c = b;
            b = x;
        }
    }
    else if(b > c)
    {
        x = c;
        c = b;
        b = x;
    }//将最大的数放到了c
    if(a > b)
    {
        x = a;
        a = b;
        b = x;
    }//进行ab的排序
    printf("%d -> %d -> %d", a, b, c);

    return 0;
}

考虑到这么讲解可能会很难理解,我将debug录成了视频,大家看视频内a b c的数据变化或许会更好理解。视频如下

C语言课程代码参考(第六周)3-11debug视频

视频被csdn压缩过了,非常模糊(悲。需要原视频的可以私聊我

3-12 输出三角形面积和周长

本题要求编写程序,根据输入的三角形的三条边abc,计算并输出面积和周长。注意:在一个三角形中, 任意两边之和大于第三边。三角形面积计算公式:area=√​s(sa)(sb)(sc)​​​,其中s=(a+b+c)/2。

输入格式:

输入为3个正整数,分别代表三角形的3条边abc

输出格式:

如果输入的边能构成一个三角形,则在一行内,按照下列格式输出,保留两位小数。

area = 面积; perimeter = 周长

否则,输出

These sides do not correspond to a valid triangle

输入样例1:

5 5 3

输出样例1:

area = 7.15; perimeter = 13.00

输入样例2:

1 41

输出样例2:

These sides do not correspond toa valid triangle

这与之前的算三角形面积相比只多了一个参数合法性判断,即两边之和大于第三边。

在这里我想教大家一个小技巧,就是使用写过的代码,不要重复造轮子。这可以大大减少我们写代码的量。比如这一题,若我们直接写,就是这样

#include <stdio.h>
#include <math.h>

int main()
{
    int a, b, c;
    float s;

    scanf("%d%d%d", &a, &b, &c);
    if(a + b > c
        && a + c > b
        && b + c > a)
    {
        s = (a + b + c) / 2;
        printf("area = %.2f, perimeter = %.2f\n", sqrt(s * (s - a) * (s - b) * (s - c)), 2 * s);
    }
    else
        printf("These sides do not correspond to a valid triangle\n");

    return 0;
}

但如果我们先用上一题的代码排序,需要写另外写的东西就少了很多。只要写成这样就行

#include <stdio.h>
#include <math.h>

int main()
{
    int a, b, c, x;
    float s;

    scanf("%d%d%d", &a, &b, &c);
    if(a > b)
    {
        x = a;
        a = b;
        b = x;
        if(b > c)
        {
            x = c;
            c = b;
            b = x;
        }
    }
    else if(b > c)
    {
        x = c;
        c = b;
        b = x;
    }//将最大的数放到了c
    if(a > b)
    {
        x = a;
        a = b;
        b = x;
    }//进行ab的排序
    // printf("%d -> %d -> %d", a, b, c);//上一题,这题用不到
    
    /**************新写的代码***************/
    if(a + b > c)
    {
        s = (a + b + c) / 2;
        printf("area = %.2f, perimeter = %.2f\n", sqrt(s * (s - a) * (s - b) * (s - c)), 2 * s);
    }
    else
        printf("These sides do not correspond to a valid triangle\n");

    return 0;
}

乍一看好像代码量变多了,实际上都是调用之前的代码,新写的只有最后的几行。相比第一种办法直接上if判断,第二种的if就相对简单一些。

3-13 计算电费

本题要求编写程序,为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时,若用电量小于0,则输出"Invalid Value!"。要求计算电费。

输入格式:

输入在一行中给出某用户的月用电量(单位:千瓦时)。

输出格式:

在一行中输出该用户应支付的电费(元),结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Value!"。

输入样例1:

10

输出样例1

cost = 5.30

输入样例2:

100

输出样例2:

cost = 55.50

这题并没有前面的几题复杂,在此直接列出代码

#include <stdio.h>

int main()
{
    float a;

    scanf("%f", &a);
    if(a < 0)
        printf("Invalid Value!");
    else if(a <= 50)
        printf("cost = %.2f", a * 0.53);
    else
        printf("cost = %.2f", 50 * 0.53 + (a - 50) * 0.58);

    return 0;
}

3-14 出租车计价

本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:

  • 起步里程为3公里,起步费10元;
  • 超起步里程后10公里内,每公里2元;
  • 超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
  • 营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。

输入格式:

输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。

输出格式:

在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。

输入样例1:

2.6 2

输出样例1:

10

输入样例2:

5.1 4

输出样例2:

14

输入样例3:

12.5 9

输出样例3:

34

#include <stdio.h>

int main()
{
    float a;
    int b;

    scanf("%f%d", &a, &b);
    if (a < 3)
        printf("%d", 10 + 2 * (b / 5));
    else if (a <= 10)
        printf("%.0f", (a - 3) * 2 + 10 + 2 * (b / 5));
    else
        printf("%.0f", 24 + (a - 10) * 3 + 2 * (b / 5));

    return 0;
}

计算稍微复杂,逻辑还是很简单的。

为什么这个出租车这么贵啊!

3-15 计算个人所得税

本题要求编写程序,计算应缴的所得税。假设个人所得税为:税率×(工资−1600),其中税率定义为:

  • 当工资不超过1600时,税率为0;
  • 当工资在区间(1600, 2500]时,税率为5%;
  • 当工资在区间(2500, 3500]时,税率为10%;
  • 当工资在区间(3500, 4500]时,税率为15%;
  • 当工资超过4500时,税率为20%。

输入格式:

输入在一行中给出非负工资。

输出格式:

在一行输出个人所得税,精确到小数点后2位。

输入样例1:

1600

输出样例1:

0.00

输入样例2:

1601

输出样例2:

0.05

输入样例3:

3000

输出样例3:

140.00

输入样例4:

4000

输出样例4:

360.00

输入样例5:

5000

输出样例5:

680.00

逻辑并不复杂,直接看代码吧

#include <stdio.h>

int main()
{
    float a, b;

    scanf("%f", &a);
    if (a <= 1600)
        b = 0;
    else if (a <= 2500)
        b = 0.05;
    else if (a <= 3500)
        b = 0.1;
    else if (a <= 4500)
        b = 0.15;
    else
        b = 0.2;
    printf("%.2f", b * (a - 1600));

    return 0;
}

3-16 计算油费

现在92号汽油6.95元/升、95号汽油7.44元/升、97号汽油7.93元/升。为吸引顾客,某自动加油站推出了“自助服务”和“协助服务”两个服务等级,分别可得到5%和3%的折扣。(现在明明不是这个价

本题要求编写程序,根据输入顾客的加油量a,汽油品种b(92、95或97)和服务类型c(m - 自助,e - 协助),计算并输出应付款。

输入格式:

输入在一行中给出两个整数和一个字符,分别表示顾客的加油量a,汽油品种b(92、95或97)和服务类型c(m - 自助,e - 协助)。

输出格式:

在一行中输出应付款额,保留小数点后2位。

输入样例:

40 97 m

输出样例:

301.34

直接看代码吧

#include <stdio.h>

int main()
{
    float dis, pri;
    int a, b;
    char c;

    scanf("%d%d%c%c", &a, &b, &c, &c);
    switch (c)
    {
    case 'm':
        dis = 0.95;
        break;
    case 'e':
        dis = 0.97;
        break;
    }
    switch (b)
    {
    case 92:
        pri = 6.95;
        break;
    case 95:
        pri = 7.44;
        break;
    case 97:
        pri = 7.93;
        break;
    }
    printf("%.2f", (float)a * pri * dis);

    return 0;
}

注意这里的scanf()会将空格识别为一个字符,所以进行了两次赋值

3-17 计算绝对值(二)

本题目要求计算下列分段函数 y=|x|的值(利用条件运算符实现)

输入格式:

输入在一行中给出实数x。

输出格式:

在一行中按“|x| = y”的格式输出,

输入样例1:

7

输出样例1:

|7.0| = 7.0

输入样例2:

-3

输出样例2:

|-3.0| = 3.0 

先看看啥是条件运算符

这东西…真的有人用吗…

直接拿之前代码的if改就好了,直接看代码

#include <stdio.h>

int main()
{
    float a;

    scanf("%f", &a);
    (a >= 0)?
        printf("|%.1f| = %.1f", a, a)
    :
        printf("|%.1f| = %.1f", a, -a);

    return 0;
}

直接写一行读起来麻烦,分行写也没有if简洁直观

3-18 四则运算(二)

本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除运算。题目保证输入和输出均不超过整型范围。

输入格式:

输入在一行中依次输入操作数1、运算符、操作数2、=,操作数的数据类型为整型,且保证除法的分母非零。

输出格式:

当运算符为+-*/时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除四种运算符以外的其他符号)则输出ERROR

输入样例1:

7/2=

输出样例1:

3

输入样例2:

2&7=

输出样例2:

ERROR

只要善用%d, %c这些字符,这题也可以比较简单地做出来。看代码

#include <stdio.h>

int main()
{
    int a, b;
    char c;

    scanf("%d%c%d", &a, &c, &b);
    switch (c)
    {
    case '+':
        printf("%d", a + b);
        break;
    case '-':
        printf("%d", a - b);
        break;
    case '*':
        printf("%d", a * b);
        break;
    case '/':
        printf("%d", a / b);
        break;
    default:
        printf("ERROR");
        break;
    }

    return 0;
}

3-19 成绩转换(三)

本题要求编写程序,将一个百分制成绩转换为五分制成绩。(利用switch语句实现),转换规则:

  • 大于等于90分为A;
  • 小于90且大于等于80为B;
  • 小于80且大于等于70为C;
  • 小于70且大于等于60为D;
  • 小于60为E。

输入格式:

输入在一行中给出一个整数的百分制成绩。

输出格式:

在一行中输出对应的五分制成绩。

输入样例:

95

输出样例:

A

那个啥…咱上次好像就是用switch case实现的…?所以上次是得用if是吧。不过无所谓了,直接拷上次的代码来就行

#include <stdio.h>

int main()
{
    int a;

    scanf("%d", &a);
    a /= 10;
    switch (a)
    {
    case 9:
        printf("A");
        break;
    case 8:
        printf("B");
        break;
    case 7:
        printf("C");
        break;
    case 6:
        printf("D");
        break;

    default:
        printf("E");
        break;
    }

    return 0;
}

3-20 计算天数

本题要求编写程序计算某年某月某日是该年中的第几天。(利用switch语句实现)

输入格式:

输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。

输出格式:

在一行输出日期是该年中的第几天。

输入样例1:

2009/03/05

输出样例1:

64

输入样例2:

2000/03/07

输出样例2:

67

咱先复习一下小学二年级学过的口诀 “一三五七八十腊,三十一天永不差”、“四年一闰,百年不闰,四百年又润”

#include <stdio.h>

int main()
{
    int year, month, day;
    int leap = 28;
    char c;

    scanf("%d%c%d%c%d", &year, &c, &month, &c, &day);
    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)//闰年判断
        leap = 29;
    for (c = 1; c < month; c++)//遍历每个月, 本月不计入
    {
        switch (c)
        {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            day += 31;
            break;
        case 2:
            day += leap;
            break;
        default:
            day += 30;
            break;
        }
    }
    printf("%d", day);

    return 0;
}

可能会有同学有疑惑,为什么能将char类型的c作为整形使用?这个其实问题不大啦,实际上char本身就是存储-128~127的整形,所以混用也没啥关系(但最好不要)。

结语

本周作业部分题目有一点难度,可以仔细研究一下,不是很理解的可以在评论区提问哦。

呼~终——于!写完了!好不容易赶上版本。不过这周不是学习的循环吗,为什么作业还是以条件判断为主。另外条件判断语句,那个"?",感觉真的没咋用过,刚看到题目的时候都没反应过来是啥

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值