好久都没有现看我喜爱的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的功能
上面是用结构体数组实现,当然,也可以采用链表来实现,然而,这显然应该不是大的数据库实现的有效方式吧