第七章编程练习补充
首先是第八题,因为昨天我们已经将第七题解了出来,所以在它的基础上,我们对第八题进行一下分析,首先看一下问题描述,如下:
首先,他要在第七题的基础上加一个工资等级选择,那么我们就要根据这个样式做一个工资等级展示,为了便于理解代码各部分的功能,我们将它单独放到一个函数中
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",×)!=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",×)!=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);
}
以上就是对于第七章,编程练习中后面四个的分析与实现,昨天在最后一个问题上出了点问题,没有看到累计两个字,导致昨天没有完成这几个编程练习。好,接下来就要正式进入第八章的学习了。