好久都没有现看我喜爱的C了,纯是看看,熟练熟练!按《计算机语言 综合实训》上面和校改的,不多说了,贴码:
//preProcess.h
/*
*源文件编译预处理命令,包括加载头文件,定义结构体、常量和变量,并对它们进行初始化
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define HEADER1 "----------------------GongZi--------------------------------------------------\n"
#define HEADER2 "|number| name | jbgz | jj | kk | yfgz | sk | sfgz |\n"
#define HEADER3 "|------|-----------|-----------|-------|-------|-----------|-------|-----------|\n"
#define FORMAT "|%-5s|%-10s|%8.2f|%8.2f|%8.2f|%8.2f|%8.2f|%8.2f|\n"
#define DATA p->num,p->name,p->jbgz,p->jj,p->kk,p->yfgz,p->sk,p->sfgz
#define END "------------------------------------------------------------------------------\n"
#define N 60
//事实上,这个saveflag全局变量虽然是全局使用,但不应放在预编译中
//int saveflag=0; /*需要存盘的标志变量*/
/*定义员工数据结构,各成员名在数据库中也称为字段*/
typedef struct employee
{
/* data */
char num[10]; /*员工编号*/
char name[15]; /*员工姓名*/
float jbgz; /*基本工资*/
float jj; /*奖金*/
float kk; /*扣款*/
float yfgz; /*应发工资*/
float sk; /*税款*/
float sfgz; /*实发工资*/
}ZGGZ;//main.c
#pragma once
#include "preProcess.h"
int saveflag=0; /*需要存盘的标志变量*/
int main(){
ZGGZ gz[N]; /*定义ZGGZ结构体*/
FILE *fp;
int select; /*保存选择结果变量*/
char ch; /**/
int count=0; /*定义保存记录数*/
void menu(); /*主菜单界面*/
void printheader();
void PRINTdata(ZGGZ pp);
void disp(ZGGZ tp[],int n);
void wrong();
void nofind();
void stringinput(char *t,int lens,char *notice);/*输入字符串,并进行长度验证明,长度必须小于lens,*/
float numberinput(char *notice);/*输入数值浮点数,对数值检验后返回该值,数值必须大于等于0*/
void save(ZGGZ tp[],int n); /*存储记录*/
int add(ZGGZ tp[],int n);/*增加记录*/
int insert(ZGGZ tp[],int n);/*插入记录*/
fp=fopen("E:\zggz\gzgl.data","ab+"); /*追加方式打开二进制文件,可读/写。此文件若不存在则新建*/
if (fp==NULL)
{
/* code */
printf("\n Can not open file!\n");
exit(0);
}
while(!feof(fp)){
if(fread(&gz[count],sizeof(ZGGZ),1,fp)==1)
count++;
}
fclose(fp);
printf("\n==>open file success,the total records number is:%d.\n",count);
getchar();
//system("pause");
menu();
while(1){
system("cls");
menu(); //调用主菜单
printf("\n Please Enter your choice(0~9):");
scanf("%d",&select);
if (select==0)
{
/* code */
if (saveflag==1) /*若对数组中数据修改过且未存盘,则此标志为1*/
{
/* code */
getchar();
printf("\n==>Whether save the modified records to file?(y/n)");
scanf("%c",&ch);
if (ch=='y'||ch=='Y')
{
save(gz,count);
/* code */
}
}
printf("\n===>Thank you for useness!\n");
getchar();
break;
}
switch(select){
case 1:count=add(gz,count);break; /*增加记录*/
//case 2:count=del(gz,count);break; /*删除记录*/
//case 3:qur(gz,count);break; /*查询记录*/
//case 4:modify(gz,count);break; /*修改记录*/
case 5:count=insert(gz,count);break; /*插入记录*/
default:wrong();getchar();break; /*按键有误,或功能还未实现*/
}
}
system("pause");
return 0;
}//mainMenu.c
#pragma once
#include "preProcess.h"
/*主菜单界面*/
void menu(){
system("cls"); /*调用Dos命令清屏*/
//textcolor(10); /*在文本模式中选择新的字符颜色*/
//gotoxy(10,5); /*在文本窗口中设置光标*/
cprintf(" The employee's Salary Management System\n");
//gotoxy(10,8);
cprintf(" ***************************Menu******************************* \n");
//gotoxy(10,9);
cprintf(" * 1.input record 2.delete record *\n");
//gotoxy(10,10);
cprintf(" * 3.search record 4.modify record *\n");
//gotoxy(10,11);
cprintf(" * 5.insert record 6.count record *\n");
//gotoxy(10,12);
/***/
cprintf(" ************************************************************** \n");
}//add.c
/*增加记录*/
#pragma once
#include "preProcess.h"
void disp(ZGGZ tp[],int n);
void wrong();
void stringinput(char *t,int lens,char *notice);/*输入字符串,并进行长度验证明,长度必须小于lens,*/
float numberinput(char *notice);/*输入数值浮点数,对数值检验后返回该值,数值必须大于等于0*/
int add(ZGGZ tp[],int n){
char ch,num[10];
int i,flag=0;
system("cls"); /*清屏*/
disp(tp,n); /*显示已有员工工资信息*/
while(1){ /*一次可输入多条记录,直到输入编号为0的记录才结束添加*/
while(1){ /*输入员工编号,保证该编号没有被使用,若输入编号为0 ,则退出添加操作*/
stringinput(num,10,"input number(press '0' return menu):");/*格式化输入编号并检验*/
flag=0;
if (strcmp(num,"0")==0) /*输入为0,则退出添加操作,返回主界面*/
{
/* code */
return n;
}
i=0;
while(i<n){ /*查询该编号是否已经存在,若存在,则重新输入一个未被占用的编号*/
if (strcmp(tp[i].num,num)==0)
{
/* code */
flag=1;
break;
}
i++;
}
if (flag==1) /*提示用户是否重新输入*/
{
/* code */
getchar();
printf("======>The number %s is existing,try again?(y/n):", num);
scanf("%c",&ch);
if (ch=='y'||ch=='Y')
{
/* code */
continue;
}
else
return n;
}
else
break;
}
strcpy(tp[n].num,num); /*将字符串num复制到tp[n].num中*/
stringinput(tp[n].name,15,"Name:");
tp[n].jbgz=numberinput("jbgz:"); /*输入并校验基本工资*/
tp[n].jj=numberinput("jiangjin:"); /*输入并检验奖金*/
tp[n].kk=numberinput("koukuan:"); /*输入并检验扣款*/
tp[n].yfgz=tp[n].jbgz+tp[n].jj-tp[n].kk; /*计算应发工资*/
tp[n].sk=tp[n].yfgz*0.12l; /*计算税金,假定取应发工资的12%*/
tp[n].sfgz=tp[n].yfgz-tp[n].sk; /*计算实发工资*/
n++;
}
return n;
}inputFunc.c
/*输入字符串,并进行长度验证明,长度必须小于lens,*/
void stringinput(char *t,int lens,char *notice){
char n[255];
do{
printf(notice); /*显示提示信息*/
scanf("%s",n); /*输入字符串*/
if (strlen(n)>lens)
{
/* code */
printf("\n exceed the required length!\n");/*长度校验,超过lens值重新输入*/
}
}while(strlen(n)>lens);
strcpy(t,n); /*将输入字符串复制到字符串t中*/
}
/*输入数值浮点数,对数值检验后返回该值,数值必须大于等于0*/
float numberinput(char *notice){
float t=0.00;
do{
printf(notice);/*显示提示信息*/
scanf("%f",&t);
if (t<0)
{
/* code */
printf("\n score must>=0!\n");/*进行数值校验*/
}
}while(t<0);
return t;
}//insert.c
#pragma once
#include "preProcess.h"
void printheader();
void PRINTdata(ZGGZ pp);
void disp(ZGGZ tp[],int n);
void wrong();
void nofind();
void stringinput(char *t,int lens,char *notice);/*输入字符串,并进行长度验证明,长度必须小于lens,*/
float numberinput(char *notice);/*输入数值浮点数,对数值检验后返回该值,数值必须大于等于0*/
extern int saveflag; /*需要存盘的标志变量*/
/*插入记录*/
int insert(ZGGZ tp[],int n){
char ch,num[10],s[10]; /*s数组保存插入点之前的编号,num数组保存输入的新记录编号*/
ZGGZ newinfo;
int flag=0,i=0,kkk=0;
system("cls");
disp(tp,n);
while(1){
stringinput(s,10,"Please input insert location after the Number:");
flag=0;i=0;
while(i<n){ /*查询,flag=1为表示该编号存在*/
if (strcmp(tp[i].num,s)==0)
{
/* code */
kkk=i;
flag=1;
break;
}
i++;
}
if (flag==1)
{
/* code */
break; /* 若编号存在,则进行插入之前的新记录输入操作*/
}
else{
getchar();
printf("\n=====>The Number %s is not existing,try again?(y/n):",s);
scanf("%c",&ch);
if (ch=='y'||ch=='Y')
{
/* code */
continue;
}
else
return n;
}
}
/*以下新记录的插入操作与add()相同*/
while(1){
stringinput(num,10,"input new employee Number:");
i=0;flag=0;
while(i<n){ /*查询,flag为1时表示该编号存在*/
if (strcmp(tp[i].num,num)==0)
{
/* code */
flag=1;break;
}
i++;
}
if (flag==1)
{
/* code */
getchar();
printf("\n====>Sorry,The number %s is existing,try again(y/n)",num);
scanf("%c",&ch);
if (ch=='y'||ch=='Y')
{
/* code */
continue;
}else
return n;
}else
break;
}
strcpy(newinfo.num,num); /*将字符串num复制到newinfo.num中*/
stringinput(newinfo.name,15,"Name:");
newinfo.jbgz=numberinput("jbgz:"); /* 输入并校验基本工资*/
newinfo.jj=numberinput("jiangjin"); /*输入并梭验jiangjing */
newinfo.kk=numberinput("koukuan:"); /*输入并检验koukuan*/
newinfo.yfgz=newinfo.jbgz+newinfo.jj-newinfo.kk;
newinfo.sk=newinfo.yfgz*0.12;
newinfo.sfgz=newinfo.yfgz-newinfo.sk;
saveflag=1; /*在main()中有对该全局变量的判断,若为1则存盘*/
for(i=n-1;i>kkk;i--){
strcpy(tp[i+1].num,tp[i].num);
strcpy(tp[i+1].name,tp[i].name);
tp[i+1].jbgz=tp[i].jbgz;
tp[i+1].jj=tp[i].jj;
tp[i+1].kk=tp[i].kk;
tp[i+1].yfgz=tp[i].yfgz;
tp[i+1].sk=tp[i].sk;
tp[i+1].sfgz=tp[i].sfgz;
}
strcpy(tp[kkk+1].num,newinfo.num);/*在tp[kkk]元素位置后插入新记录*/
strcpy(tp[kkk+1].name,newinfo.name);
tp[kkk+1].jbgz=newinfo.jbgz;
tp[kkk+1].jj=newinfo.jj;
tp[kkk+1].kk=newinfo.kk;
tp[kkk+1].yfgz=newinfo.yfgz;
tp[kkk+1].sk=newinfo.sk;
tp[kkk+1].sfgz=newinfo.sfgz;
n++;
disp(tp,n);
printf("\n\n");
getchar();
return n;
}//out.c
#pragma once
#include "preProcess.h"
/*printheader()函数用于在屏幕上以表格形式显示记录。记录的显示经常要进行,因此单独设置
printheader()函数,便于其他模块调用,减少代码的重复
*/
void printheader(){
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
}
void PRINTdata(ZGGZ pp){/*格式化输出表中数据*/
ZGGZ *p;
p=&pp;
printf(FORMAT,DATA);
}
void disp(ZGGZ tp[],int n){/*显示数组tp[]中存储的记录,内容为*/
int i;
if (n==0)
{
/* code */
printf("\n========>No employees record!\n");
getchar();
return ;
}
printf("\n\n");
printheader(); /*输出表格头部*/
i=0;
while(i<n){ /*逐条输出数组中存储的员工信息*/
PRINTdata(tp[i]);
i++;
printf(HEADER3);
}
getchar();
}
void wrong(){ /*输出按键错误信息*/
printf("\n\n\n\n*******Error:input has wrong!press any key to continue*******\n");
getchar();
}
void nofind(){ /*输出未查找到此员工的信息*/
printf("\n====>Not find this employee record!\n");
}//save.c
#pragma once
#include "preProcess.h"
extern int saveflag; /*需要存盘的标志变量*/
/*存储记录*/
void save(ZGGZ tp[],int n){
FILE *fp;
int i=0;
fp=fopen("E:\zggz\gzgl.data","wb");
if (fp==NULL)
{
/* code */
printf("\n=======>open file error!\n");;
getchar();
return ;
}
for (i = 0; i < n; ++i)
{
/* code */
if (fwrite(&tp[i],sizeof(ZGGZ),1,fp)==1) /*每次写一条记录或一个结构数组元素到文件中草药*/
{
/* code */
continue;
}
else
break;
}
if (i>0)
{
/* code */
getchar();
printf("\n\n===========>save file complete,total saved's record number is :%d\n",i);
getchar();
saveflag=0;
}
else
{
system("cls");
printf("the current link is empty,no employee record is saved!\n");
getchar();
}
fclose(fp);
}注意:insert功能只有在数据库(其实这里即文件)里有记录才能进行,所以,这里又还是把add功能加上,目前只是有insert和add、save的功能
上面是用结构体数组实现,当然,也可以采用链表来实现,然而,这显然应该不是大的数据库实现的有效方式吧
本文介绍了一个使用C语言实现的员工工资管理系统,详细阐述了预处理命令、数据结构设计、输入输出函数以及主要功能模块的实现,旨在帮助程序员巩固C语言技能并解决实际业务需求。

1441

被折叠的 条评论
为什么被折叠?



