本設計完成一個工資統計的小設計,涉及的C語言重點知識有:
1,結構體
2,結構體指針數組
3,枚舉類型
1.1 設計題目
本課程設計要求設計一個公司職員的數據結構,並使用結構指針數組存儲職員信息,統計公司員工工資總額和平均工資。
1.2 設計要求
設計要求實現如下功能:
(1)使用結構指針數組設計一個公司職員的數據結構,使用下述的結構定義:
typedef structemployee{
int age;
char *name;
doublesalary;
}*PEMP;
(2)在主函數裡構造一個指針數組company,用來存放職工信息。
(3)設計一個update函數,用來給company賦值。
函數update(company,id, age, name, salary)的四個參數為:
company: 結構指針數組
id: company的下標
age: 年齡,整數類型
salary: 薪水,實數
(4)設計一個readin函數,直接采用調用update函數的方式進行賦值。例如:update(company, 2, 30, “LI MING”, 3000.0);
(5)編寫total函數對工資求和。
這個函數應該能對全體職工和某一年齡段的職工的工資求和。
(6)編寫mean函數求平均工資。
這個函數應該能對全體職工和大於某一年齡段的職工的工資求和並計算相應的平均值。
2.設計代碼
#include <stdio.h>
#include <stdlib.h>
#define EMP_NUM 10
typedef struct employee {
int age;
char name[20];
unsigned salary;
}*PEMP;
typedef enum sel_analy{
TOTAL,
AVERAGE
}sel_c;
void update_msg(PEMP company[]);
void display_msg(PEMP company[]);
void salary_analysis(PEMP company[], sel_c which);
int main(int argc, char *argv[])
{
int i = 0;
PEMP company[EMP_NUM];
char select;
sel_c which;
memset(company, NULL, sizeof(company));
do
{
printf(" <-----工資統計系統------->\n");
printf("1:更新職工信息 2:工資求和\n");
printf("3:工資求平均值 4:顯示職工信息\n");
printf("0:退出\n");
select = getch();
switch(select){
case '1':
update_msg(company);
break;
case '2':
salary_analysis(company, TOTAL);
break;
case '3':
salary_analysis(company, AVERAGE);
break;
case '4':
display_msg(company);
break;
default:
break;
};
}while(select != '0');
return 0;
}
void update_msg(PEMP company[])
{
int sel = 0;
int id;
while(1){
PEMP new_emp = (PEMP)malloc(sizeof(*new_emp));
printf("請輸入員工信息,當需要退出輸入時設ID為-1:\n");
printf("ID:");
scanf("%d", &id);
while((id<-1) || (id>EMP_NUM-1)){
printf("輸入信息錯誤,輸入的ID范圍應為0到%d之間的數:\n", EMP_NUM-1);
printf("ID:");
scanf("%d", &id);
}
if(id == -1){
free(new_emp);
return;
}
printf("姓名:");
scanf("%s", new_emp->name);
printf("年齡:");
scanf("%d", &new_emp->age);
while((new_emp->age<0) || (new_emp->age>60)){
printf("輸入信息錯誤,輸入的年齡范圍應為0到60之間的數:\n");
printf("年齡:");
scanf("%d", &new_emp->age);
}
printf("薪水:");
scanf("%d", &new_emp->salary);
while((new_emp->age<0) || (new_emp->age>20000)){
printf("輸入信息錯誤,輸入的薪水范圍應為0到20000之間的數:\n");
printf("薪水:");
scanf("%d", &new_emp->salary);
}
company[id] = new_emp;
}
}
void salary_analysis(PEMP company[], sel_c which)
{
char sel=0;
int age1, age2;
int low_age, high_age, i, j=0;
unsigned long sum = 0;
while(1){
if(which == TOTAL)
printf("1:計算某一年齡段員工的薪水總和 2:計算全部員工薪水總和\n");
else
printf("1:計算某一年齡段員工的薪水平均值 2:計算全部員工薪水平均值\n");
printf("0:返回上一層\n");
sel = getch();
if((sel != '0') && (sel != '1') && (sel != '2')){
printf("輸入錯誤,請重新輸入:\n");
continue;
}
if(sel == '0')
return;
if(sel == '1'){
printf("開始年齡:");
scanf("%d", &age1);
while(age1<0 || age1>60){
printf("輸入錯誤,請重新輸入\n");
printf("開始年齡:");
scanf("%d", &age1);
}
printf("結束年齡:");
scanf("%d", &age2);
while(age2<0 || age2>60){
printf("輸入錯誤,請重新輸入\n");
printf("結束年齡:");
scanf("%d", &age2);
}
if(age1>age2){
low_age = age2;
high_age = age1;
}
else{
low_age = age1;
high_age = age2;
}
for(i=0; i<EMP_NUM; i++){
if(company[i])
if((company[i]->age>=low_age) && (high_age>=company[i]->age)){
sum += company[i]->salary;
j++;
}
}
if(sum != 0)
if(which == TOTAL)
printf("從%d到%d年齡段的員工薪水總和為%ld\n", low_age, high_age, sum);
else
printf("從%d到%d年齡段的員工薪水平均值為%ld\n", low_age, high_age, (sum/j));
else
printf("沒有該年齡段的員工!\n");
return ;
}
if(sel == '2'){
for(i=0; i<EMP_NUM; i++){
if(company[i]){
sum += company[i]->salary;
j++;
}
}
if(sum != 0)
if(which == TOTAL)
printf("所有員工薪水總和為%ld\n", sum);
else
printf("所有員工薪水平均值為%ld\n", sum/j);
else
printf("沒有員工信息!\n");
return;
}
}
}
void display_msg(PEMP company[])
{
int i;
for(i=0; i<EMP_NUM; i++)
{
if(company[i])
printf("ID:%d 姓名:%s 年齡:%d 薪水:%d\n", i, company[i]->name,\
company[i]->age, company[i]->salary );
}
}