C Primer Plus(第五版)学习(六)

接着上次第7章继续写下去,现在的程序代码比较大不像前几张可以直接写出来,更多的需要在纸上先画出流程图,勾勒出哪些部分用函数来写,函数的入口与返回等等。

不多说直接上图:

8.修改练习7中的假设a,是程序提供一个选择工资等级的菜单。用switch选择工资等级。程序运行的开头应该像这样:

***************************************************************************

Enter the number corresponding to the desired pay rate or action:

!) $8.75/hr                                2) $9.33/hr

3)$10.00/hr                              4) $11.20/hr

5)quit

****************************************************************************

如果选择1到4,那么程序应该请求输入工作小时数。程序应该一直循环运行,直到输入5.如果输入1到5以外的选项,那么程序应该提醒用户合适的选项是哪些,然后再循环。用#define为各种工资等级和税率定义常量。

#include <stdio.h>
#define FOUD_1 8.75//基本工资8.75美元/小时
#define FOUD_2 9.33//基本工资9.33美元/小时
#define FOUD_3 10.00//基本工资10.00美元/小时
#define FOUD_4 11.20//基本工资11.20美元/小时
#define RAT_1 0.15//税率前300美元为15%
#define RAT_2 0.20//下一个150美元为20%
#define RAT_3 0.25//余下的为25%
#define B_T 40//加班时间分界点
#define BREAK_1 300//分界点300美元
#define BREAK_2 450//分界点450美元


double tax(double fg);//用来计算税金
void tishi(void);//用来输出提示信息
double grade(char cc);//选择工资等级

int main(void)
{
	double total=0,taxes=0,netpay=0;//总额,税金,净工资
	int time;//一周工作时间
	char c;
	double foud;//基本工资,也作标志位
	tishi();
	printf("请输入工资等级:");
	while ((c=getchar())!='5')
	{
		if('\n'==c)//忽略换行符
			continue;
		foud=grade(c);//所选择的基本工资foud
		if (0==foud)
		{
			printf("请输入正确的选项:\n");
				continue;
		}
		printf("请输入您一周工作时间:");
		scanf("%d",&time);
		if (time<=B_T)
		{
			total=foud*time;
			taxes=tax(total);
			netpay=total-taxes;
		}
		else
		{
			total=foud*B_T+foud*(time-B_T)*1.5;
			taxes=tax(total);
			netpay=total-taxes;
		}
		printf("您的工资总额 %.1f,税金 %.1f,净工资 %.1f.\n",total,taxes,netpay);
		printf("请输入工资等级:");
	}
	
}
//函数:计算所得税金
double tax(double fg)
{
	if (fg<=BREAK_1)
		return (fg*RAT_1);
	else if(fg<=BREAK_2)//总额在300美元到450美元之间
		return ((fg-BREAK_1)*RAT_2+BREAK_1*RAT_1);
	else//总额超过450美元的时候 
		return (BREAK_1*RAT_1+(BREAK_2-BREAK_1)*RAT_2+(fg-BREAK_2)*RAT_3);
}


//函数:用来直到用户输入的提示信息
void tishi(void)
{
	int i;
	for(i=0;i<65;i++)
		printf("*");
	printf("\n");
	printf("Enter the number correspond to the desired pay rate or action:\n");
	printf("1) $8.75/hr		2) $9.33/hr\n"
		   "3) $10.00/hr		4) $11.20/hr\n"
		   "5) quit\n");
	for(i=0;i<65;i++)
		printf("*");
	printf("\n");

}

//函数:选择工资等级
double grade(char cc)
{
	switch(cc)
	{
	case '1':
		return FOUD_1;
		break;
	case '2':
		return FOUD_2;
		break;
	case '3':
		return FOUD_3;
		break;
	case '4':
		return FOUD_4;
		break;
	default:
		return 0;
		
	}
}

9.编写一个程序,接受一个整数输入,然后显示所有小于或等于该数的素数。

#include <stdio.h>
int main(void)
{
	int num;
	int div;
	int cout=0;
	int member=2;
	printf("请输入一个整数:");
	scanf("%d",&num);
	printf("小于或等于该数的素数有:");
	while(member++<=num)
	{
		for(div=2;div<=member;div++)
		{
			if(member%div==0)
			{
				continue;
			}
			else
			{
				printf("%4d",member);
			}
		}
	}
	printf("\n");
	

}

10.1988年United States Federal Tax Schedule是近期最基本的。它分为4类,每类有两个等级。下面是其摘要:美元为应征税的收入:

种类税金
单身前17,850美元按15%,超出部分按28%
户主
前23,900美元按15%,超出部分按28%
已婚,共有前29,750美元按15%,超出部分按28%
已婚,离异前14,875美元按15%,超出部分按28%
例如,有20000美元应征税收入的单身雇佣劳动者应缴纳税金0.15X17850美元+0.28X(20000美元-17850美元)。编写一个程序,让用户指定税金种类和应征税收入,然后计算税金。使用循环以便用户可以多次输入。
#include <stdio.h>
#define BREAK_1 17850//单身收税分界点
#define BREAK_2 23900//户主
#define BREAK_3 29750//已婚,共有
#define BREAK_4 14875//已婚,离异
#define RATE_1 0.15//在分界点之前的税率
#define RATE_2 0.28//在分界点之后的税率

void menu(void);

int main(void)
{
	char varity;//税金种类
	int taxes;//用户指定的应征税收入
	double bill=0;//税金
	menu();
	printf("请用户输入税金种类和应征税收入:");
	scanf("%c%d",&varity,&taxes);
	while('#'!=varity)//当用户第一个输入为#号时退出
	{
		switch(varity)
		{
		case '1'://单身情况的税金
			if(taxes<=BREAK_1)
				bill=taxes*RATE_1;
			else
				bill=BREAK_1*RATE_1+(taxes-BREAK_1)*RATE_2;
			break;
		case '2'://户主
			if(taxes<=BREAK_2)
				bill=taxes*RATE_1;
			else
				bill=BREAK_2*RATE_1+(taxes-BREAK_2)*RATE_2;
			break;
		case '3'://已婚,共有
			if(taxes<=BREAK_3)
				bill=taxes*RATE_1;
			else
				bill=BREAK_3*RATE_1+(taxes-BREAK_3)*RATE_2;
			break;
		case '4'://已婚,离异
			if(taxes<=BREAK_4)
				bill=taxes*RATE_1;
			else
				bill=BREAK_4*RATE_1+(taxes-BREAK_4)*RATE_2;
			break;
		default:
			break;
		}
		printf("税金是%.1f.\n",bill);
		printf("请用户输入税金种类和应征税收入:");
		scanf("%c,%d",&varity,&taxes);
	}
	return 0;
}

//
void menu(void)
{
	printf("1)单身		2)户主\n"
			"3)已婚,共有	4)已婚,离异\n");
}

11.ABC Mail Order Grocery朝鲜鱼的售价是1.25/磅,甜菜的售价是0.65美元/磅,胡萝卜的售价是0.89美元/磅。在添加运输费用之前,他们为100美元的订单提供5%的打折优惠。对5磅或以下的订单收取3.50美元的运输和装卸费用;超过5磅而不足20磅的定单收取10.00美元的运输和装卸费用;20磅或以上的运输,在8美元的基础上每磅加收0.1美元。编写程序,在循环中使用switch语句,以便对输入a的响应是让用户输入所需的朝鲜鱼磅数,b为甜菜的磅数,c为胡萝卜的磅数,而q允许用户退出订购过程,然后程序计算总费用、折扣和运输费用(如果有运输费的话),以及总数。随后程序应该显示所有的购买信息:每磅的费用、订购的磅数

该订单每种蔬菜的费用

订单的总费用

折扣,如果有的话加上运输费用,以及所有费用的总数。

#include <stdio.h>
#define PRICE_1 1.25//朝鲜鱼的单价
#define PRICE_2 0.65//甜菜的单价
#define PRICE_3 0.89//胡萝卜的单价
#define BREAK_1 5//分界点1
#define BREAK_2 20//分界点2

void menu(void);//用来显示提示信息
int buy(void);//订购方式
double total(void);//计算花费

int weight_1;//订购朝鲜鱼的磅数
int weight_2;//订购甜菜的磅数
int weight_3;//订购胡萝卜的磅数

int main(void)
{
	int heavy;//总重量
	double cost_1,cost_2,cost_3;
	double traffic;//运输费用
	menu();//打印提示信息
	heavy=buy();//一共有heavy磅
	cost_1=total();
	if(cost_1>100)
		cost_2=cost_1*0.05;

	if(heavy<=BREAK_1)
		traffic=3.50;
	else if(heavy<BREAK_2)
		traffic=10.00;
	else
		traffic=(heavy-8)*0.1;
	cost_3=cost_2+traffic;

	printf("订购的总榜数%d\n"
			"订朝鲜鱼话费%.1f,订甜菜花费%.1f,订胡萝卜花费%.1f\n",heavy,weight_1*PRICE_1,
			weight_1*PRICE_2,weight_3*PRICE_3);
	printf("订单的总费用%.1f\n",cost_1);

	return 0;
}

//用来显示提示信息
void menu(void)
{
	printf("*******************************\n");
	printf("请用户按如下菜单项选择:\n");
	printf("a)朝鲜鱼磅数	b)甜菜磅数\n"
			"c)胡萝卜磅数	q)退出订购\n");
	printf("********************************\n");
}



//订购方式
int buy(void)
{
	char fg;
	while((fg=getchar())!='q')
	{
		switch(fg)
		{
		case 'a':
			printf("请输入朝鲜鱼的磅数:");
			scanf("%d",&weight_1);
			break;
		case 'b':
			printf("请输入甜菜的磅数:");
			scanf("%d",&weight_2);
			break;
		case 'c':
			printf("请输入胡萝卜的磅数:");
			scanf("%d",&weight_3);
			break;
		default:
			break;
		}
	}
	return (weight_1+weight_2+weight_3);//共有多少磅
}

//计算花费
double total(void)
{	return (weight_1*PRICE_1+weight_2*PRICE_2+weight_3*PRICE_3);
}


	
	


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值