/*********************************
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);
}
}