20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises05

本文提供多个C语言编程实例,涵盖数值排序、三角形面积计算、条件判断等核心技能,通过实际操作加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

20201015-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises05

P270

在这里插入图片描述

题解和分析

第一种方式,直接判断

/*
编写一程序P270.C实现以下功能
  从键盘读入3个实数,按由大到小的顺序输出这3个数。
    编程可用素材:
        printf("请输入3个数:")、
        printf("\n这三个数由大到小为: %.2f   %.2f   %.2f\n"…。
  程序的运行效果应类似地如图1所示,图1中的红色部分是从键盘输入的内容。

        请输入3个数:200.35 1056.1 72.132

        这三个数由大到小为: 1056.10   200.35   72.13

    解题思路
        1. 直接判断,给出结果
        2. 要注意考虑到所有情况
*/

#include <stdio.h>

int main(void)
{
    double data1, data2, data3;

    printf("请输入3个数:");
    scanf("%lf %lf %lf", &data1, &data2, &data3);

    if (data1 >= data2 && data1 >= data3)
    {
        if (data2 >= data3)
        {
            printf("\n这三个数由大到小为: %.2lf   %.2lf   %.2lf\n", data1, data2, data3);
        }
        else
        {
            printf("\n这三个数由大到小为: %.2lf   %.2lf   %.2lf\n", data1, data3, data2);
        }
    }

    if (data2 >= data1 && data2 >= data3)
    {
        if (data1 >= data3)
        {
            printf("\n这三个数由大到小为: %.2lf   %.2lf   %.2lf\n", data2, data1, data3);
        }
        else
        {
            printf("\n这三个数由大到小为: %.2lf   %.2lf   %.2lf\n", data2, data3, data1);
        }
    }

    if (data3 >= data1 && data3 >= data2)
    {
        if (data1 >= data2)
        {
            printf("\n这三个数由大到小为: %.2lf   %.2lf   %.2lf\n", data3, data1, data2);
        }
        else
        {
            printf("\n这三个数由大到小为: %.2lf   %.2lf   %.2lf\n", data3, data2, data1);
        }
    }

    return 0;
}

第二种方式,节省判断,直接排序

/*
编写一程序P270.C实现以下功能
  从键盘读入3个实数,按由大到小的顺序输出这3个数。
    编程可用素材:
        printf("请输入3个数:")、
        printf("\n这三个数由大到小为: %.2f   %.2f   %.2f\n"…。
  程序的运行效果应类似地如图1所示,图1中的红色部分是从键盘输入的内容。

        请输入3个数:200.35 1056.1 72.132

        这三个数由大到小为: 1056.10   200.35   72.13

    解题
        1. 可以采用交换的思路
        2. 最大端和最小端位置固定即可    
*/

#include <stdio.h>

int main(void)
{
    double data1, data2, data3;
    double tmp;

    printf("请输入3个数:");
    scanf("%lf %lf %lf", &data1, &data2, &data3);

    // 始终让data1最大, data2中,则data3最小
    if (data1 < data2)
    {
        tmp = data1;
        data1 = data2;
        data2 = tmp;
    }
    if (data1 < data3)
    {
        tmp = data1;
        data1 = data3;
        data3 = tmp;
    }
    if (data2 < data3)
    {
        tmp = data2;
        data2 = data3;
        data3 = tmp;
    }

    printf("\n这三个数由大到小为: %.2lf   %.2lf   %.2lf\n", data1, data2, data3); //由大到小

    return 0;
}

/*
	分析:
	1. 注意其中的交换两个数的实现,其实,这里可以抽取出来,重构程序,生成交换函数
	2. 这个程序更简洁,是因为进行了数据交换,也就是算法上有了变化
	3. 任何一个问题,都可能会有多种解决思路和算法
*/

P723

在这里插入图片描述

题解和分析

/*
编写一程序P723.C实现以下功能
    输入三角形的三边长a、b、c(边长可以是小数),求三角形面积area,并输出。
    如果输入的三边构不成三角形,应给出“data error”的信息提示。
    注:根据“海伦-秦九韶”公式,area=√p(p-a)(p-b)(p-c),其中p=(a+b+c)/2。
    编程可用素材:
        printf("please input triange sides: ")、
        printf("\ndata error\n")、printf("\narea=…\n"…。
    程序的运行效果应类似地如图1和图2所示,图中的红色部分是从键盘输入的内容。
            please input triange sides: 3, 4, 5

            area=6.00

    图1 程序运行效果示例
            please input triange sides: 3, 4, 8

            data error
*/

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

int main(void)
{
    double edgeA, edgeB, edgeC;
    double circle,semi_circle;
    double area;

    printf("please input triange sides: ");
    scanf("%lf, %lf, %lf", &edgeA, &edgeB, &edgeC);

    // 如果不能构成三角形
    if(((edgeA+ edgeB)<=edgeC) || ((edgeA+ edgeC)<=edgeB) || ((edgeC+ edgeB)<=edgeA)) 
    {
        printf("\ndata error\n");
    }
    else
    {
        // 可以构成三角形
        circle = edgeA + edgeB + edgeC;
        semi_circle = circle / 2;
        area = sqrt(semi_circle * (semi_circle - edgeA) * (semi_circle - edgeB) * (semi_circle - edgeC));

        printf("area=%.2lf", area);
    }

    return 0;
}

/*
	分析:
	1. 在以后的程序中,有很多程序动作, 是有前提条件的,当条件不满足时,做这个动作是没有意义的
		比如这里的三角形求面积,如果都已经不能构成三角形了,面积本身也就没有意义了
		无意义的事情,计算机是无法完成的
	2. 程序是为了解决问题而编写的,是依赖于合理的算法写出来的,算法不合理时,程序肯定会有问题
	3. if作为一个开关,试先置于程序开头或是检查节点部分,是以后设计程序时的一种常用思路
*/

P737

在这里插入图片描述

题解和分析

/*
编写一程序P737.C实现以下功能
    从键盘输入3个整数,输出绝对值最大的数。
    编程可用素材:
        printf("Input 3 numbers: ")、
        printf("\nThe number with maximum absolute value is ….\n"…。
    程序的运行效果应类似地如图1所示,图1中的红色部分是从键盘输入的内容。
        Input 3 numbers: 1, -362, 300

        The number with maximum absolute value is -362.
*/

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

int main(void)
{
    int data1, data2, data3;
    int myMax = 0;

    printf("Input 3 numbers: ");
    scanf("%d, %d, %d", &data1, &data2, &data3);

    if (abs(data1) > abs(data2) && abs(data1) > abs(data3))
    {
        myMax = data1;
    }
    if (abs(data2) > abs(data1) && abs(data2) > abs(data3))
    {
        myMax = data2;
    }
    if (abs(data3) > abs(data1) && abs(data3) > abs(data2))
    {
        myMax = data3;
    }

    printf("\nThe number with maximum absolute value is %d.\n", myMax);

    return 0;
}

/*
	分析:
	1. 使用库函数
	2. 判断三个数的最大值,算法很多,这只是一种
	3. 计算顺序:先取绝对值,再判断
*/

P111

在这里插入图片描述

题解和分析

/*
编写一程序P111.C实现以下功能
  x(x只考虑整数int且必须定义为int、但F(x)完全可能超过int的表示范围)通过键盘输入(输入前给出提示Please input x:),
    然后计算并在屏幕上输出函数值。
    编程可用素材:printf("Please input x: ")、printf("\nF(…) = …。
     ┌ -5x+27   (x<0)
  F(x)= ├ 7909     (x=0)
     └ 2x-1     (x>0)
  程序的运行效果应类似地如图1所示,图中的红色部分是从键盘输入的内容。
        Please input x: 3

        F(3) = 5
*/

#include <stdio.h>

int main(void)
{
    int data;

    printf("Please input x: ");
    scanf("%d", &data);

    if(data < 0)
    {
        printf("F(%d) = %lu", data, (unsigned long )(-5 * (unsigned long )data + 27));
    } 
    else if(data > 0)
    {
        printf("F(%d) = %lu", data, (unsigned long )(2 * (unsigned long )data -1));
    }
    else
    {
        printf("F(%d) = 7909", data);
    }

    return 0;
}

/*
	分析:
	1. 在一开始合理的数据表示范围里,即允许的值域里,表达数据没有问题,但运算过后的结果,可能超出值域范围,这就需要扩大值域范围来保证精度
	2. 这个程序,可以分析出,结果是正数,可以使用无符号数,来扩大表示范围,保证结果表示的正确性
	3. 要先转换,再计算
*/

P703

在这里插入图片描述

题解和分析

/*
编写一程序P703.C实现以下功能
  已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与利润提成的关系如下(计量单位:元):
        profit≤1000           没有提成;
        1000<profit≤2000        提成10%;
        2000<profit≤5000        提成15%;
        5000<profit≤10000       提成20%;
        10000<profit          提成25%。
  请根据输入的利润计算员工的薪水。编程可用素材:printf("Input  profit: ")、printf("\nsalary=…\n"…。
  程序的运行效果应类似地如图1所示,图中的红色部分是从键盘输入的内容。
Input  profit: 2000

salary=700.00
*/

#include <stdio.h>

int main(void)
{
    double profit;
    double salary = 500.00;

    printf("Input  profit: ");
    scanf("%lf", &profit);

    if(profit > 10000)
    {
        salary += profit * 0.25;
    } 
    else if (profit > 5000 && profit <= 10000)
    {
        salary += profit * 0.20;
    }
    else if (profit > 2000 && profit <= 5000)
    {
        salary += profit * 0.15;
    }
    else if (profit > 1000 && profit <= 2000)
    {
        salary += profit * 0.10;
    }

    printf("\nsalary=%.2lf\n", salary);

    return 0;
}
/*
	分析:
	1. a<b<c这样的数学书上的表达方式,在这里,其实是一个并且的关系,需要使用逻辑运算符来表达
	2. 要特别注意这个条件范围 ,用数学集来表示,是左开区间,右闭区间,要特别注意取值的端点
	3. 复合赋值运算符的使用
	4. if...else...的嵌套使用,连续的if判断,要特别注意else与if的匹配
*/

P113

在这里插入图片描述

题解和分析

/*
编写一程序P113.C实现以下功能
  已知某银行整存整取存款不同期限的年息利率分别为:
        3.15%期限一年,3.63%期限二年, 4.02%期限三年,4.69%期限五年,5.36%期限八年。
    从键盘上输入存钱的本金(以元为单位,必须定义为int且应考虑金额很大的情况)和存款期限(只考虑1,2,3,5,8),
    求到期时能从银行得到的利息(以元为单位,应考虑有小数,不计复利)。
    编程可用素材:
        printf("Please input benjin,cunqi: ")、
        printf("\nlixi = … yuan"…。
  程序的运行效果应类似地如图1所示,图中的红色部分是从键盘输入的内容。
        Please input benjin,cunqi: 10000,8

        lixi = 4288.00 yuan
*/

#include <stdio.h>

int main(void)
{
    int benjin, cunqi;
    double lixi = 0.0;

    printf("Please input benjin,cunqi: ");
    scanf("%d,%d", &benjin, &cunqi);

    if ( cunqi == 1 )
    {
        lixi = benjin * 0.0315;
    }
    if ( cunqi == 2 )
    {
        lixi = benjin * 0.0363 * 2;
    }
    if ( cunqi == 3 )
    {
        lixi = benjin * 0.0402 * 3;        
    }
    if ( cunqi == 5 )
    {
        lixi = benjin * 0.0469 * 5;
    }
    if ( cunqi == 8 )
    {
        lixi = benjin * 0.0536 * 8;
    }

    printf("\nlixi = %.2lf yuan\n", lixi);

    return 0;
}

/*
	分析
	1. 只考虑1,2,3,5,8,可以直接使用if判断后处理
	2. 如果不是,则需要仔细分析和思考,确定相应的条件,再使用if语句来完成
	3. 注意程序编辑上的缩进
*/
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值