C语言设计之 工资统计

/*********************************
          Project: 工资统计
	  Writer:  SHOW
	  Time:    2011/12/20
	  Function: 自己输入员工信息,能统计指定年龄段的工资总和,并且显示员工信息
	  涉及知识点:1.结构指针数组
	              2.memset函数的使用
    		      3.getch与getchar函数的区别
		      4.数组复制的问题
		      5.malloc函数的灵活使用
*********************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>

typedef struct employee{
int age;
char name[10];
float salary;
} PEMP;

void total(PEMP* company[]);
void updata(PEMP* company[]);
void display(PEMP* company[]);
void deletee(PEMP* company[]);

int main(void)
{
	char ch;
	PEMP* company[6];  // 定义一个结构指针数组,数组元素为指向结构struct employee的指针

	/* 初始化company 数组里元素指针为NULL,另外的一个作用判断指针是否为NULL而知道有没有更新数据*/
	memset(company,NULL,sizeof(company)); 

	printf("********工资统计********\n");
	printf("---  更新员工信息请输入 1 ---\n");
	printf("---  显示员工信息请输入 2 ---\n");
	printf("---求工资总额请输入T or t ---\n");


	while(1)
	{
		/* getchar()输入完一个字符需要回车才执行完毕,getch()则不需要*/
		ch = getch();  
		
		switch(ch)
		{
			case '1': updata(company); 
					  break;
			case '2': display(company);
					  break;
			case 'd': deletee(company);
					  break;
			case 't': total(company);
					  break;
			case 'T': total(company);
					  break;
			default : {	printf("********工资统计********\n");
						printf("---  更新员工信息请敲 1   ---\n");
						printf("---  显示员工信息请输入 2 ---\n");
						printf("---求工资总额请输入T or t ---\n");
						printf("---求平均工资请输入P or p ---\n\n");}
		}
	}
	return 0;
}

/*  更新员工信息 */
void updata(PEMP* company[])
{
	int id,age;
	float salary;
	char name[10],ch;
	PEMP* emp;

	printf("请依次输入序号,年龄,姓名,工资:\n");
	while(1)
	{
		/*这步很重要,因为company[]是一个结构指针数组,元素并没有指向一个确定大小的内存的首地址。
		  而直接把具体的值赋给内存不明确的指向结构的指针是肯定非法的。
		  当然如果定义的是结构数组,不是结构指针数组,定义的时候就已经分配确定内存了,那就可以不用malloc了*/
		emp = (PEMP*)malloc(sizeof(struct employee)); // 每次调用此函数都会重新分配一段内存
		if(emp == NULL)
		{
			printf("分配内存失败");
			return;
		}
		
       	        printf("序号:");
		scanf("%d",&id);
		printf("年龄:");
		scanf("%d",&age);
		printf("姓名:");
		scanf("%s",name);
		printf("工资:");
		scanf("%f",&salary);

		company[id] = emp; 
		company[id]->age = age;
		strcpy(company[id]->name,name); // 把一个数组的内容复制给另一个数组
		/*错误写法:company[id]->name = name; 
     	          正确写法:strcpy(company[id]->name,name);  
		  错误思想:把数组名赋给另一个数组名
		  正确思想:因为数组的大小是不确定的,如果要复制,字符串可以用strcpy()函数,也可以用for一个一个元素复制
		*/ 
		company[id]->salary = salary;
		printf("输入下一个 n,输入完毕请敲 o\n");
		ch = getch();
		if(ch == 'o')
			break;
		if(ch == 'n')
			continue;
	}

}

/* 删除员工信息 */
void deletee(PEMP* company[])
{
	int id;
	printf("请输入你要删除的员工id号:");
	scanf("%d",&id);
	free(company[id]);
	company[id] = NULL;
}

/* 工资求和 */
void total(PEMP* company[])
{
	int age1,age2,temp,i;
	float salary_total = 0;
	printf("请输入年龄范围:\n");
	while(1)
	{
		scanf("%d%d",&age1,&age2);
		if(age1>age2)
		{
			temp =age1;
			age1 = age2;
			age2 = temp; 
		}

		if((age1>=0) && (age2<=100) && (age2>=0) && (age2<=100))
			break;
		else
			printf("年龄输入错误,请重新输入\n");
	}

	for(i=0; i<=5; i++)
	{
		if(company[i] == NULL)   // memset 函数提供了便利
			continue;
		if( (company[i]->age<=age2) && (company[i]->age>=age1) )
		{
			salary_total = company[i]->salary + salary_total;
		}
	}
	printf("年龄从%d到%d的工资总和是%f\n",age1,age2,salary_total);
}

/*  显示员工信息 */
void display(PEMP* company[])
{
	int i;
	printf("当前员工信息:\n");
	for(i=0; i<=5; i++)
	{
		if(company[i] == NULL)
			continue;
		printf("序号:%d;年龄:%d;姓名:%s;工资:%f\n",i,company[i]->age,company[i]->name,company[i]->salary);
	}
}

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值