C Primer Plus第七章编程练习补充

第七章编程练习补充

首先是第八题,因为昨天我们已经将第七题解了出来,所以在它的基础上,我们对第八题进行一下分析,首先看一下问题描述,如下:

在这里插入图片描述

首先,他要在第七题的基础上加一个工资等级选择,那么我们就要根据这个样式做一个工资等级展示,为了便于理解代码各部分的功能,我们将它单独放到一个函数中

void showMenu(void){
    printf("****************************************************************\n");
    printf("Enter the number correspoding to the desired pay rate or action:\n");
    printf("1) $8.75/hr                     2) $9.33/hr\n");
    printf("3) $10.00/hr                    4) $11.20/hr\n");
    printf("5) quit\n");
    printf("****************************************************************\n");
}

这个函数内容也很好理解,就是将题干中的内容按照格式进行一遍输出展示,然后接着往下看,程序循环运行,输入不同的工资等级要去做不同的事情,所以我们要做一个输入值筛选,我们再把这部分功能放到一个函数中,

int getDj(void){
    int input;
    while (scanf("%d",&input)!=1||input<1||input>5)
    {
        printf("您输入的值不合法,请重新输入!!\n");
    }
    return input;
}

也很好理解,就是将输入的值进行删选,不合法的值踢出,直至输入合法值,将其放到参数中返回进行下一步操作,也就是计算工资。那么我们可以把计算工资的部分也作为一个函数,因为工资等级是可变的,计算工资的算法是相同的,所以我们每次只需要在调用这个函数的时候,传递对应的工资等级实参,就可以进行反复地计算。

因为第七题的原因,这一个也不会很难搞,只需要把第七题的计算方法做一个变形就可以了,因为不确定时间与工资的关系,所以也就不好根据时间去区分应缴纳税金的档位,所以我们根据实际工资进行区分计算,也就将函数改写成了下面这样

double jiSuan(double basic){
    float times =0;//定义工作时长
    float num =0;//计算工资时长,加班为1.5倍的时间
    float money = 0;//定义初始工资
    float shui = 0;//定义税金
    float jing = 0;//定义净收入
    printf("请输入您一周工作的小时数,输入小于0或者大于168的值结束\n");
    while (scanf("%f",&times)!=1||times<0||times>168){
        printf("您输入的工作时长不合法,请重新输入:\n");
    }
    /*因为有工资等级的问题,经计算,按照昨天哪一种解法是不完全正确的,因为税金档位问题。所以
    我们统一按照昨天计算第三档的算法
    ,按照300划分,三百以下缴纳第一档税金,超过300,按照第二档缴纳
    超过450的话,第三档在第二档的基础上多缴纳5%的税金,额外再缴纳5%*/
    //计算工作时长,按照40小时划分有无加班时长
    if (times>40){
        num = 40+1.5*(times-40);
    }else{
        num = times;
    }
    money = num*basic;//计算总工资
    //计算税金
    if (money<=300){
        shui = money*SHUIONE;
    }else if (300<money&&money<=450){
        shui = 300*SHUIONE+(money-300)*SHUITWO;
    }else{
        shui = 300*SHUIONE+(money-300)*SHUITWO+(money-450)*(SHUITHREE-SHUITWO);
    }
    //净收入为工资减去税金,这没啥好说的
    jing = money-shui;
    printf("您本周的工资构成为,工资总额:%0.3f,税金:%0.3f,净收入:%0.3f 。\n",money,shui,jing);
}

所以,综上所述,我们只需要在main函数中调用这几个函数,就可以实现这一个功能了,整合之后的代码如下:

#include<stdio.h>
#define BASIC1 8.75
#define BASIC2 9.33
#define BASIC3 10.00
#define BASIC4 11.20
#define SHUIONE 0.15
#define SHUITWO 0.20
#define SHUITHREE 0.25
void showMenu(void);//展示工资等级菜单
int getDj(void);//获取工资等级
double jiSuan(double basic);//计算工资等
int main (void){
    float times = 0;//定义实际工作时长 
    int menum;//工资等级
    showMenu();
    printf("请输入您需要设置的工资等级前的数字代码:\n");
    menum = getDj();
    while (menum!=5)
    {
        switch (menum)
        {
        case 1:
            jiSuan(BASIC1);
            break;
        case 2:
            jiSuan(BASIC2);
            break;
        case 3:
            jiSuan(BASIC3);
            break;
        case 4:
            jiSuan(BASIC4);
            break;
        }
        showMenu();
        menum = getDj();
    }
    printf("\nDone!!");
    getchar();
    getchar();
    return 0;
}
void showMenu(void){
    printf("****************************************************************\n");
    printf("Enter the number correspoding to the desired pay rate or action:\n");
    printf("1) $8.75/hr                     2) $9.33/hr\n");
    printf("3) $10.00/hr                    4) $11.20/hr\n");
    printf("5) quit\n");
    printf("****************************************************************\n");
}
int getDj(void){
    int input;
    while (scanf("%d",&input)!=1||input<1||input>5)
    {
        printf("您输入的值不合法,请重新输入!!\n");
    }
    return input;
}
double jiSuan(double basic){
    float times =0;//定义工作时长
    float num =0;//计算工资时长,加班为1.5倍的时间
    float money = 0;//定义初始工资
    float shui = 0;//定义税金
    float jing = 0;//定义净收入
    printf("请输入您一周工作的小时数,输入小于0或者大于168的值结束\n");
    while (scanf("%f",&times)!=1||times<0||times>168){
        printf("您输入的工作时长不合法,请重新输入:\n");
    }
    /*因为有工资等级的问题,经计算,按照昨天哪一种解法是不完全正确的,因为税金档位问题。所以
    我们统一按照昨天计算第三档的算法
    ,按照300划分,三百以下缴纳第一档税金,超过300,按照第二档缴纳
    超过450的话,第三档在第二档的基础上多缴纳5%的税金,额外再缴纳5%*/
    //计算工作时长,按照40小时划分有无加班时长
    if (times>40){
        num = 40+1.5*(times-40);
    }else{
        num = times;
    }
    money = num*basic;//计算总工资
    //计算税金
    if (money<=300){
        shui = money*SHUIONE;
    }else if (300<money&&money<=450){
        shui = 300*SHUIONE+(money-300)*SHUITWO;
    }else{
        shui = 300*SHUIONE+(money-300)*SHUITWO+(money-450)*(SHUITHREE-SHUITWO);
    }
    //净收入为工资减去税金,这没啥好说的
    jing = money-shui;
    printf("您本周的工资构成为,工资总额:%0.3f,税金:%0.3f,净收入:%0.3f 。\n",money,shui,jing);
}

运行结果如下

在这里插入图片描述

第九题呢,昨天已经把书上的解法放到上一篇中了,今天我看一下我的笨方法能否实现。

#include<stdio.h>
#include <stdbool.h>
int main(void){
    int input;
    int num;
    int i;
    bool flag;
    printf("输入一个正整数:\n");
    while (scanf("%d",&input) == 1 && input > 0){
        if (input > 1){
            printf("以下是从1到%d之间所有的素数:\n",input);
        }else{
            printf("您输入的区间内没有整数\n");
        }
        for (num = 2; num <= input; num++){
            flag = false;
            for (i = 2; i < num-1; i++){
                if (num%i == 0){
                    flag = true;
                }
            }
            if (flag == false){
                printf("%d是一个素数!\n",num);
            }    
        }
    printf("输入下一个正整数:\n");  
    } 
    printf("DONE!!!");
    getchar();
    getchar();
    return 0;
}

其实就是把书上的解法改了一下,两层循环,将外层设置为从2到输入值,暂且称之为i,依次遍历。然后在内循环中以此对i与从2到i-1之间的值取模,如果值为零,也就是说可以整除,即代表这个值有除1和它本身的其他除数,也就不是素数,将flag设置为true,判断flag为false的为素数,输出即可。

在这里插入图片描述

下面看一下第十题

在这里插入图片描述

看上去和第八个差不多,不同的人群按照不同的税收标准,与第八个相似的,首先我们写一个函数展示四种类别的人

void showMenu(void){
    printf("*******************************************\n");
    printf("请选择您的人员类别,输入对应的类别前的代码值:\n");
    printf("1) 单身                    2) 户主\n");
    printf("3) 已婚,共有               4) 已婚,离异\n");
    printf("5) quit\n");
    printf("*******************************************\n");
}

然后,获取用户键入的类别值,判断数据的合法性,同样的,搞一个函数去做这件事情

int getLb(void){
    int input;
    while (scanf("%d",&input)!=1||input<1||input>5)
    {
        printf("您输入的值不合法,请重新输入!!\n");
    }
    return input;
}

接着,按照不同的扣税标准,去进行税金计算,再写一个函数去做这件事情

void jiSuan(double basic){
    float money = 0;//定义应纳税收入
    float shui = 0;//定义税金
    printf("请输入您的应纳税收入,输入小于0的值结束\n");
    while (scanf("%f",&money)!=1||money<0){
        printf("您输入的应纳税收入<0,请重新输入:\n");
    }
    //计算税金,以下两种算法均可
    shui = basic*SHUIONE+(money-basic)*SHUITWO;
    //shui = money*SHUIONE+(money-basic)*(SHUITWO-SHUIONE);
    printf("您要缴纳的税金为:%0.3f 。\n",shui);
}

最后,我们将这几个函数运用到main函数中,分别计算不同类别人的税金。最后的代码如下:

#include<stdio.h>
#define SHUIONE 0.15
#define SHUITWO 0.28
#define BASIC1 17850
#define BASIC2 23900
#define BASIC3 29750
#define BASIC4 14875
void showMenu(void);
int getLb(void);
void jiSuan(double basic);
int main(void){
    int lb;
    showMenu();
    lb = getLb();
    while (lb != 5)
    {
        switch (lb)
        {
        case 1:
            jiSuan(BASIC1);
            break;
        case 2:
            jiSuan(BASIC2);
            break;
        case 3:
            jiSuan(BASIC3);
            break;
        case 4:
            jiSuan(BASIC4);
            break;
        default:
            break;
        }
        showMenu();
        lb = getLb();
    }
    
    printf("Done\n");
    getchar();
    getchar();
    return 0;
}
void showMenu(void){
    printf("*******************************************\n");
    printf("请选择您的人员类别,输入对应的类别前的代码值:\n");
    printf("1) 单身                    2) 户主\n");
    printf("3) 已婚,共有               4) 已婚,离异\n");
    printf("5) quit\n");
    printf("*******************************************\n");
}
int getLb(void){
    int input;
    while (scanf("%d",&input)!=1||input<1||input>5)
    {
        printf("您输入的值不合法,请重新输入!!\n");
    }
    return input;
}
void jiSuan(double basic){
    float money = 0;//定义应纳税收入
    float shui = 0;//定义税金
    printf("请输入您的应纳税收入,输入小于0的值结束\n");
    while (scanf("%f",&money)!=1||money<0){
        printf("您输入的应纳税收入<0,请重新输入:\n");
    }
    //计算税金,以下两种算法均可
    shui = basic*SHUIONE+(money-basic)*SHUITWO;
    //shui = money*SHUIONE+(money-basic)*(SHUITWO-SHUIONE);
    printf("您要缴纳的税金为:%0.3f 。\n",shui);
}

在这里插入图片描述
在这里插入图片描述

上面的几个数据我都是算过的,没什么问题,如果遇到问题的话,请留言。

好,接下来,看一下最后一个问题

在这里插入图片描述

读完题目之后,我们一步步的来看,首先杂货店出售三种蔬菜,并且在添加运费之前,100元以上的订单有打折优惠,然后根据磅数计算运费和包装费,好,首先设置程序的入口,也就是输入不同的字母,相应不同的采购

一开始,设置几个常量,蔬菜的单价以及折扣

#define YJ 2.05
#define TC 1.15
#define HLB 1.09
#define ZK 0.05

然后读取用户输入的代码值,我们写一个函数吧,提示输入,校验输入数据的合法性。

char choice(void){
	char ch;
	printf("请按提示输入:\n");
	printf("输入a购买洋蓟;输入b购买甜菜,输入c购买胡萝卜,输入q退出程序。\n");
	scanf(" %c",&ch);
	while(ch!='q'&&ch!='a'&&ch!='b'&&ch!='c')
	{
		printf("输入错误,请重新输入:\n");
		while(getchar()!='\n')
		{
			continue;
		}
		scanf(" %c",&ch);
	}
	return ch;
}

这个函数返回一个char类型的值,然后我们根据输入的代码去进行对应的采购操作

char input;
    float mYj=0,mTc=0,mHlb=0;//设置三种蔬菜的重量
    input = choice();
    while (input != 'q'){
        switch (input)
        {
        case 'a':
            mYj += diGongA();
            break;
        case 'b':
            mTc += diGongB();
            break;
        case 'c':
            mHlb += diGongC();
            break;
        default:
            break;
        }
        input = choice();
    }

接着,我们在看一下三个订购函数

float diGongA(void){
    float a = 0;
    printf("请输入您要订购的洋蓟的磅数:\n");
    while (scanf("%f",&a)!=1||a<0){
        printf("您输入的值不合法,请重新输入您要订购的洋蓟的磅数:\n");
    }
    return a;
}
float diGongB(void){
    float b = 0;
    printf("请输入您要订购的甜菜的磅数:\n");
    while (scanf("%f",&b)!=1||b<0){
        printf("您输入的值不合法,请重新输入您要订购的甜菜的磅数:\n");
    }
    return b;
}
float diGongC(void){
    float c = 0;
    printf("请输入您要订购的胡萝卜的磅数:\n");
    while (scanf("%f",&c)!=1||c<0){
        printf("您输入的值不合法,请重新输入您要订购的胡萝卜的磅数:\n");
    }
    return c;
}

最后,就是计算各种收费以及展示订单内容的函数了,在执行完采购循环,结束订购之后,调用计算函数去展示订单信息

void jiSuan(float a,float b,float c){
    float d = a*YJ+b*TC+c*HLB;//蔬菜费用
    float z = 0;//折扣
    if (d>100){
        z = d*ZK;
    }
    float e = a+b+c;//蔬菜总重
    float f = 0;//包装费和运费
    if (e<=5){
        f = 6.5;
    }else if(5<e&&e<=20){
        f = 14;
    }else{
        f = 14 + (e-20)*0.5;
    }
    float g = d-z;//订单的总费用,不包含运费
    float h = g+f;//费用总额,包含运费
    printf("******ABC邮购杂货店订单******\n");
    printf("洋蓟售价:%0.2f美元/磅,订购的重量:%0.2f磅\n",YJ,a);
    printf("甜菜售价:%0.2f美元/磅,订购的重量:%0.2f磅\n",TC,b);
    printf("胡萝卜售价:%0.2f美元/磅,订购的重量:%0.2f磅\n",HLB,c);
    printf("订购的蔬菜费用:%0.2f元,总重量:%0.2f磅\n",d,e);
    printf("订单的总费用:%0.2f元\n",g);
    if (z>0)
    {
        printf("折扣:%0.2f元\n",z);
    }
    printf("运费、包装费:%0.2f元\n",f);
    printf("费用总额:%0.2f元\n",h);
}

最后的代码以及运行结果如下:

#include<stdio.h>
#define YJ 2.05
#define TC 1.15
#define HLB 1.09
#define ZK 0.05
float diGongA(void);
float diGongB(void);
float diGongC(void);
char choice(void);
void jiSuan(float a,float b,float c);
int main (void){
    char input;
    float mYj=0,mTc=0,mHlb=0;//设置三种蔬菜的重量
    input = choice();
    while (input != 'q'){
        switch (input)
        {
        case 'a':
            mYj += diGongA();
            break;
        case 'b':
            mTc += diGongB();
            break;
        case 'c':
            mHlb += diGongC();
            break;
        default:
            break;
        }
        input = choice();
    }
    jiSuan(mYj,mTc,mHlb);
    printf("Done!!!");
    getchar();
    getchar();
    return 0;
}
float diGongA(void){
    float a = 0;
    printf("请输入您要订购的洋蓟的磅数:\n");
    while (scanf("%f",&a)!=1||a<0){
        printf("您输入的值不合法,请重新输入您要订购的洋蓟的磅数:\n");
    }
    return a;
}
float diGongB(void){
    float b = 0;
    printf("请输入您要订购的甜菜的磅数:\n");
    while (scanf("%f",&b)!=1||b<0){
        printf("您输入的值不合法,请重新输入您要订购的甜菜的磅数:\n");
    }
    return b;
}
float diGongC(void){
    float c = 0;
    printf("请输入您要订购的胡萝卜的磅数:\n");
    while (scanf("%f",&c)!=1||c<0){
        printf("您输入的值不合法,请重新输入您要订购的胡萝卜的磅数:\n");
    }
    return c;
}
char choice(void){
	char ch;
	printf("请按提示输入:\n");
	printf("输入a购买洋蓟;输入b购买甜菜,输入c购买胡萝卜,输入q退出程序。\n");
	scanf(" %c",&ch);
	while(ch!='q'&&ch!='a'&&ch!='b'&&ch!='c')
	{
		printf("输入错误,请重新输入:\n");
		while(getchar()!='\n')
		{
			continue;
		}
		scanf(" %c",&ch);
	}
	return ch;
}
void jiSuan(float a,float b,float c){
    float d = a*YJ+b*TC+c*HLB;//蔬菜费用
    float z = 0;//折扣
    if (d>100){
        z = d*ZK;
    }
    float e = a+b+c;//蔬菜总重
    float f = 0;//包装费和运费
    if (e<=5){
        f = 6.5;
    }else if(5<e&&e<=20){
        f = 14;
    }else{
        f = 14 + (e-20)*0.5;
    }
    float g = d-z;//订单的总费用,不包含运费
    float h = g+f;//费用总额,包含运费
    printf("******ABC邮购杂货店订单******\n");
    printf("洋蓟售价:%0.2f美元/磅,订购的重量:%0.2f磅\n",YJ,a);
    printf("甜菜售价:%0.2f美元/磅,订购的重量:%0.2f磅\n",TC,b);
    printf("胡萝卜售价:%0.2f美元/磅,订购的重量:%0.2f磅\n",HLB,c);
    printf("订购的蔬菜费用:%0.2f元,总重量:%0.2f磅\n",d,e);
    printf("订单的总费用:%0.2f元\n",g);
    if (z>0)
    {
        printf("折扣:%0.2f元\n",z);
    }
    printf("运费、包装费:%0.2f元\n",f);
    printf("费用总额:%0.2f元\n",h);
}

在这里插入图片描述

以上就是对于第七章,编程练习中后面四个的分析与实现,昨天在最后一个问题上出了点问题,没有看到累计两个字,导致昨天没有完成这几个编程练习。好,接下来就要正式进入第八章的学习了。

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值