第一篇:C語言 課程設計 教師工資管理系統(職工工資管理系統)
課程設計 教師工資管理系統
運行平臺:VC6.0(其他平臺未經測試,不一定保證有效)
制作者:弓箭 中南大學 信息科學與工程學院
源代碼如下:
#include
struct teacher { int num;char name[20];char sex[20];char workplace[50];char address[50];long phone;double de_salary;double de_jintie;double de_shenghuobutie;double yingfa_salary;double cost_phone;double cost_water_elec;double cost_rent;double cost_tax;double cost_weisheng;double cost_gongjijin;double cost_all;double shifa_salary;struct teacher *next;};
/***********************************讀取函數************************************/ struct teacher *load(){ struct teacher *p1,*p2,*head;FILE *fp;int i=1;if((fp=fopen(“save”,“rb”))==NULL){
printf(“
文件不存在!按下任意鍵返回主菜單...”);getch();
return(NULL);} else {
head=NULL;
p1=(struct teacher *)malloc(LEN);
while(fread(p1,LEN-4,1,fp)==1)
{
if(i==1)
{
head=p1;
p2=p1;
i=2;
}
else
{
p2->next=p1;
p2=p2->next;
}
p1=(struct teacher *)malloc(LEN);
}
p2->next=NULL;
free(p1);
fclose(fp);
return(head);} }
/**********************************歡迎菜單函數*************************************/ void welcome(){ printf(“nnn
>>>>>歡迎使用教師工資管理系統Beta1.2<<<< *******************************************************n”);printf(“ * C語言課程設計 教師工資管理系統 *n”); printf(“ * 班級: 電氣信息類1001班 學號:0909100119 *n”);printf(“ * 姓名:弓箭 *n”);printf(“ *******************************************************n”);printf(“nn 按下任意鍵進入系統...”);getch();system(“cls”);} /**********************************制作人員名單*************************************/ void list(){ system(“cls”);printf(“nnn >>>>>版權所有 侵權必究<<<< 學校(College): 中南大學 Central South University *n”);printf(“* 軟件名稱(Software): 教師工資管理系統 Teacher's Salary Managing System *n”); printf(“* 版本號(Edition): Beta1.2 *n”);printf(“* 制作人(Producer): 弓箭 James *n”);printf(“* 所在班級(Class): 電氣信息類1001班 Electric Information 1001 *n”);printf(“* 所在學院(Institute):信息科學與工程學院 Information Engineering Institute*n”);printf(“*******************************************************************************n”);printf(“ >>>>>ILLEGAL COPY BANNED<<<< 按下任意鍵返回主菜單...”);getch();} /***********************************菜單函數*****************************************/ int menu(){ int i;printf(“nnn >>>>>歡迎使用教師工資管理系統Beta1.2<<<< *******************************************************n”);printf(“ * 1.輸入教師信息 *n”);printf(“ * 2.插入教師信息 *n”);printf(“ * 3.修改教師信息 *n”);printf(“ * 4.刪除教師信息 *n”);printf(“ * 5.瀏覽教師信息 *n”);printf(“ * 6.顯示制作人員名單 *n”);printf(“ * 7.退出系統 *n”);printf(“ *******************************************************n”);printf(“ 請輸入你想要的操作:”);scanf(“%d”,&i);getchar();return i;} /***********************************插入函數*****************************************/ void input(){ struct teacher *head,*p1,*p2,*p3,*px;int i,t;FILE *fp;char k,n='n',num[30],name[20];p1=p2=p3=px=(struct teacher *)malloc(LEN);if((head=load())!=NULL){ do { n='n'; printf(“ 請輸入要插入的教師信息:n”); printf(“ ------------------------------n”); printf(“ 請輸入教工號:”);gets(num);px->num=atoi(num); printf(“ 請輸入姓名:”);gets(px->name); printf(“ 請輸入性別:”);gets(px->sex); printf(“ 請輸入單位名稱:”);gets(px->workplace); printf(“ 請輸入家庭住址:”);gets(px->address); printf(“ 請輸入聯系電話:”);gets(num);px->phone=atoi(num); printf(“ 請輸入基本工資:”);gets(num);px->de_salary=atof(num); printf(“ 請輸入津貼:”);gets(num);px->de_jintie=atof(num); printf(“ 請輸入生活補貼:”);gets(num);px->de_shenghuobutie=atof(num); printf(“ 請輸入電話費:”);gets(num);px->cost_phone=atof(num); printf(“ 請輸入水電費:”);gets(num);px->cost_water_elec=atof(num); printf(“ 請輸入房租:”);gets(num);px->cost_rent=atof(num); printf(“ 請輸入個人所得稅:”);gets(num);px->cost_tax=atof(num); printf(“ 請輸入衛生費:”);gets(num);px->cost_weisheng=atof(num); printf(“ 請輸入公積金:”);gets(num);px->cost_gongjijin=atof(num); px->yingfa_salary=px->de_salary+px->de_jintie+px->de_shenghuobutie; px->cost_all=px->cost_phone+px->cost_water_elec+px->cost_rent+px->cost_tax+px->cost_weisheng+px->cost_gongjijin; px->shifa_salary=px->yingfa_salary-px->cost_all; printf(“ 數據輸入完畢,按下任意鍵繼續...”);getch(); system(“cls”); printf(“nnn >>>>>>>>>>> 插入教師信息 <<<<<<<<<< printf(“ *******************************************************n”); printf(“ * 1.輸入教師號 *n”); printf(“ * 2.輸入姓名 *n”); printf(“ * 3.返回上級菜單 *n”); printf(“ *******************************************************n”); printf(“ 請選擇插入方式:”); scanf(“%d”,&i);getchar(); while(i<1||i>3) { printf(“ 輸入有誤!請重新輸入:”); scanf(“%d”,&i);getchar(); } switch(i) { case 1:printf(“ 請輸入要插入在哪條數據后面:”); scanf(“%d”,&t);getchar(); p1=head; while(p1->num!=t) { if(p1->next!=NULL) { p1=p1->next; } else { printf(“ 查找不到相關數據!n”); break; } } if(p1->num==t) { printf(“-----------------------------要插入的信息如下:-n”); printf(“教工號 姓名 性別 單位名稱 家庭住址 聯系電話n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,px->num,px->name,px->sex,px->workplace,px->address,px->phone); printf(“電話費 水電費 房租 個人所得稅 衛生費 公積金 合計扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lfn”,px->cost_phone,px->cost_water_elec,px->cost_rent,px->cost_tax,px->cost_weisheng,px->cost_gongjijin,px->cost_all); printf(“基本工資 津貼 生活補貼 應發工資 實發工資n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,px->de_salary,px->de_jintie,px->de_shenghuobutie,px->yingfa_salary,px->shifa_salary); printf(“-----------------n”); printf(“ 確定插入嗎?(y或n):”); scanf(“%c”,&k);getchar(); } if(k=='y'||k=='Y') { if(p1->num==t) { if(p1==head)/*如果插入點為頭指針*/ { p3=p1->next; p1->next=px; px->next=p3; p2=head; } else if(p1->next==NULL)/*如果插入點為末尾指針*/ { p3=p1;p1=head;p2=head; while(p1->next!=p3) {p1=p1->next;} p1=p1->next; p1->next=px; px->next=NULL; } else{/*如果插入點為中間指針*/ p3=p1;p1=head;p2=head; while(p1->next!=p3) {p1=p1->next;} p1=p1->next; p3=p1->next; px->next=p3; p1->next=px; } if((fp=fopen(“save”,“wb”))==NULL) { printf(“ 文件不存在!按下任意鍵返回主菜單...”);getch(); } else { do { fwrite(p2,LEN-4,1,fp); if(p2->next!=NULL) p2=p2->next; }while(p2->next!=NULL); if(p2!=head) fwrite(p2,LEN-4,1,fp); }fclose(fp); printf(“ 插入成功!按下任意鍵繼續...”);getch();} } else {printf(“ 插入已被取消!按下任意鍵繼續...”);getch();} break;case 2:printf(“ 請輸入要插入的教師姓名:”);gets(name);p1=head; while(strcmp((p1->name),name)!=0) { if(p1->next!=NULL) p1=p1->next; else { printf(“ 查找不到相關數據!n”); break; } } if(strcmp((p1->name),name)==0) { printf(“-----------------------------要插入的信息如下:-n”); printf(“教工號 姓名 性別 單位名稱 家庭住址 聯系電話n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“電話費 水電費 房租 個人所得稅 衛生費 公積金 合計扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf n”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工資 津貼 生活補貼 應發工資 實發工資n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); printf(“ 確定插入嗎?(y或n):”); scanf(“%c”,&k);getchar(); } if(k=='y'||k=='Y') { if(strcmp((p1->name),name)==0) { if(p1==head)/*如果插入點為頭指針*/ { p1->next=px; p2=head; } else if(p1->next==NULL)/*如果插入點為末尾指針*/ { p3=p1;p1=head;p2=head; while(p1->next!=p3) } {p1=p1->next;} p1=p1->next; p1->next=px; px->next=NULL; } else{/*如果插入點為中間指針*/ p3=p1;p1=head;p2=head; while(p1->next!=p3) {p1=p1->next;} p1=p1->next; p1->next=px; p3=p3->next; px->next=p3; } if((fp=fopen(“save”,“wb”))==NULL) { printf(“ 文件不存在!按下任意鍵返回主菜單...”);getch(); } else { do { fwrite(p2,LEN-4,1,fp); if(p2->next!=NULL) p2=p2->next; }while(p2->next!=NULL); if(p2!=head) fwrite(p2,LEN-4,1,fp); }fclose(fp); printf(“ 插入成功!按下任意鍵繼續...”);getch(); } } else {printf(“ 插入已被取消!按下任意鍵繼續...”);getch();} break;case 3:break;default :break;} if(i!=3){ printf(“n 繼續插入其他教師的信息嗎?(y或n)”);scanf(“%c”,&n);getchar();} }while((n=='y'||n=='Y')&&i!=3); printf(“ 數據插入成功!按下任意鍵返回主菜單...”);getch(); getchar();} /***********************************輸入函數*****************************************/ void insert(){ FILE *fp;char m,num[30]; struct teacher *p1;p1=(struct teacher *)malloc(LEN);if((fp=fopen(“save”,“ab”))==NULL){ printf(“ 文件不存在!按下任意鍵返回主菜單...”);getch();} else { printf(“ 請輸入教師信息:n”); do { printf(“ ------------------------------n”); printf(“ 請輸入教工號:”);gets(num);p1->num=atoi(num); printf(“ 請輸入姓名:”);gets(p1->name); printf(“ 請輸入性別:”);gets(p1->sex); printf(“ 請輸入單位名稱:”);gets(p1->workplace); printf(“ 請輸入家庭住址:”);gets(p1->address); printf(“ 請輸入聯系電話:”);gets(num);p1->phone=atoi(num); printf(“ 請輸入基本工資:”);gets(num);p1->de_salary=atof(num); printf(“ 請輸入津貼:”);gets(num);p1->de_jintie=atof(num); printf(“ 請輸入生活補貼:”);gets(num);p1->de_shenghuobutie=atof(num); printf(“ 請輸入電話費:”);gets(num);p1->cost_phone=atof(num); printf(“ 請輸入水電費:”);gets(num);p1->cost_water_elec=atof(num); printf(“ 請輸入房租:”);gets(num);p1->cost_rent=atof(num); printf(“ 請輸入個人所得稅:”);gets(num);p1->cost_tax=atof(num); printf(“ 請輸入衛生費:”);gets(num);p1->cost_weisheng=atof(num); printf(“ 請輸入公積金:”);gets(num);p1->cost_gongjijin=atof(num); p1->yingfa_salary=p1->de_salary+p1->de_jintie+p1->de_shenghuobutie; p1->cost_all=p1->cost_phone+p1->cost_water_elec+p1->cost_rent+p1->cost_tax+p1->cost_weisheng+p1->cost_gongjijin; p1->shifa_salary=p1->yingfa_salary-p1->cost_all; fwrite(p1,LEN-4,1,fp); printf(“ 輸入下一個?(y或n)”); m=getchar(); if(m!='y'&&m!='Y') {printf(“ 數據保存成功!按下任意鍵返回主菜單...”);getch();} getchar(); }while(m=='y'||m=='Y');} fclose(fp);} /***********************************修改函數*****************************************/ void modify(){ struct teacher *head,*p1,*p2;int i;FILE *fp;char m='n',n='n',num2[30];p1=head=(struct teacher *)malloc(LEN);if((head=load())!=NULL){ do { int num=0; char name[20]; p1=head; system(“cls”); printf(“nnn >>>>>>>>>>> 修改教師信息 <<<<<<<<<< printf(“ *******************************************************n”); printf(“ * 1.輸入教師號 *n”); printf(“ * 2.輸入姓名 *n”); printf(“ * 3.返回上級菜單 *n”); printf(“ *******************************************************n”); printf(“ 請選擇修改方式:”); scanf(“%d”,&i);getchar(); while(i<1||i>3) { printf(“ 輸入有誤!請重新輸入:”); scanf(“%d”,&i);getchar(); } switch(i) { case 1:printf(“ 請輸入要修改的教師號:”); scanf(“%d”,&num);getchar(); while(p1->num!=num) { if(p1->next!=NULL) p1=p1->next; else { printf(“ 查找不到相關數據!n”); break; } } if(p1->num==num) { system(“cls”); printf(“nnn >>>>>歡迎使用教師工資管理系統Beta1.2<<<< printf(“---原信息如下:--n”); printf(“教工號 姓名 性別 單位名稱 家庭住址 聯系電話n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“電話費 水電費 房租 個人所得稅 衛生費 公積金 合計扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lfn”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工資 津貼 生活補貼 應發工資 實發工資n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); printf(“ *******************************************************n”); printf(“ * 1.教師號 2.姓名 *n”); printf(“ * 3.性別 4.單位名稱 *n”); printf(“ * 5.家庭住址 6.聯系電話 *n”); printf(“ * 7.基本工資 8.津貼 *n”); printf(“ * 9.生活補貼 10.電話費 *n”); printf(“ * 11.水電費 12.房租 *n”); printf(“ * 13.所得稅 14.衛生費 *n”); printf(“ * 15.公積金 *n”); printf(“ *******************************************************n”); do { printf(“ 請選擇要修改的數據:”); scanf(“%d”,&i);getchar(); while(i>15||i<1) { printf(“ 輸入有誤!請重新輸入:”); scanf(“%d”,&i);getchar(); } switch(i) { case 1:printf(“ 請輸入新教師號:”);gets(num2);p1->num=atoi(num2);break; case 2:printf(“ 請輸入新姓名:”);gets(p1->name);break; case 3:printf(“ 請輸入新性別:”);gets(p1->sex);break; case 4:printf(“ 請輸入新單位名稱:”);gets(p1->workplace);break; case 5:printf(“ 請輸入新家庭住址:”);gets(p1->address);break; case 6:printf(“ 請輸入新聯系電話:”);gets(num2);p1->phone=atoi(num2);break; case 7:printf(“ 請輸入新基本工資:”);gets(num2);p1->de_salary=atof(num2);break; case 8:printf(“ 請輸入新津貼:”);gets(num2);p1->de_jintie=atof(num2);break; case 9:printf(“ 請輸入新生活補貼:”);gets(num2);p1->de_shenghuobutie=atof(num2);break; case 10:printf(“ 請輸入新電話費:”);gets(num2);p1->cost_phone=atof(num2);break; case 11:printf(“ 請輸入新水電費:”);gets(num2);p1->cost_water_elec=atof(num2);break; case 12:printf(“ 請輸入新房租:”);gets(num2);p1->cost_rent=atof(num2);break; case 13:printf(“ 請輸入新所得稅:”);gets(num2);p1->cost_tax=atof(num2);break; case 14:printf(“ 請輸入新衛生費:”);gets(num2);p1->cost_weisheng=atof(num2);break; case 15:printf(“ 請輸入新公積金:”);gets(num2);p1->cost_gongjijin=atof(num2);break; default:break; } p1->yingfa_salary=p1->de_salary+p1->de_jintie+p1->de_shenghuobutie; p1->cost_all=p1->cost_phone+p1->cost_water_elec+p1->cost_rent+p1->cost_tax+p1->cost_weisheng+p1->cost_gongjijin; p1->shifa_salary=p1->yingfa_salary-p1->cost_all; printf(“ 繼續修改其他數據嗎?(y或n):”); scanf(“%c”,&m);getchar(); }while(m=='y'||m=='Y'); p2=head; if((fp=fopen(“save”,“wb”))==NULL) { printf(“ 文件不存在!按下任意鍵返回主菜單...”);getch(); } else { fwrite(head,LEN-4,1,fp); do { p2=p2->next; fwrite(p2,LEN-4,1,fp); }while(p2->next!=NULL); printf(“------------------------------修改后數據如下:--n”); printf(“教工號 姓名 性別 單位名稱 家庭住址 聯系電話n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“電話費 水電費 房租 個人所得稅 衛生費 公積金 合計扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf n”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工資 津貼 生活補貼 應發工資 實發工資n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); } fclose(fp); } break; case 2:printf(“ 請輸入要修改的教師姓名:”); gets(name); while(strcmp(p1->name,name)!=0) { if(p1->next!=NULL) p1=p1->next; else { printf(“ 查找不到相關數據!n”); break; } } if(strcmp(p1->name,name)==0) { system(“cls”); printf(“nnn >>>>>歡迎使用教師工資管理系統Beta1.2<<<< printf(“---原信息如下:--n”); printf(“教工號 姓名 性別 單位名稱 家庭住址 聯系電話n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“電話費 水電費 房租 個人所得稅 衛生費 公積金 合計扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf n”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工資 津貼 生活補貼 應發工資 實發工資n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); printf(“ *******************************************************n”); printf(“ * 1.教師號 2.姓名 *n”); printf(“ * 3.性別 4.單位名稱 *n”); printf(“ * 5.家庭住址 6.聯系電話 *n”); printf(“ * 7.基本工資 8.津貼 *n”); printf(“ * 9.生活補貼 10.電話費 *n”); printf(“ * 11.水電費 12.房租 *n”); printf(“ * 13.所得稅 14.衛生費 *n”); printf(“ * 15.公積金 *n”); printf(“ *******************************************************n”); do { printf(“ 請選擇要修改的數據:”); scanf(“%d”,&i);getchar(); while(i>15||i<1) { printf(“ 輸入有誤!請重新輸入:”); scanf(“%d”,&i);getchar(); } switch(i) { case 1:printf(“ 請輸入新教師號:”);gets(num2);p1->num=atoi(num2);break; case 2:printf(“ 請輸入新姓名:”);gets(p1->name);break; case 3:printf(“ 請輸入新性別:”);gets(p1->sex);break; case 4:printf(“ 請輸入新單位名稱:”);gets(p1->workplace);break; case 5:printf(“ 請輸入新家庭住址:”);gets(p1->address);break; case 6:printf(“ 請輸入新聯系電話:”);gets(num2);p1->phone=atoi(num2);break; case 7:printf(“ 請輸入新基本工資:”);gets(num2);p1->de_salary=atof(num2);break; case 8:printf(“ 請輸入新津貼:”);gets(num2);p1->de_jintie=atof(num2);break; case 9:printf(“ 請輸入新生活補貼:”);gets(num2);p1->de_shenghuobutie=atof(num2);break; case 10:printf(“ 請輸入新電話費:”);gets(num2);p1->cost_phone=atof(num2);break; case 11:printf(“ 請輸入新水電費:”);gets(num2);p1->cost_water_elec=atof(num2);break; case 12:printf(“ 請輸入新房租:”);gets(num2);p1->cost_rent=atof(num2);break; case 13:printf(“ 請輸入新所得稅:”);gets(num2);p1->cost_tax=atof(num2);break; case 14:printf(“ 請輸入新衛生費:”);gets(num2);p1->cost_weisheng=atof(num2);break; case 15:printf(“ 請輸入新公積金:”);gets(num2);p1->cost_gongjijin=atof(num2);break; default:break; } p1->yingfa_salary=p1->de_salary+p1->de_jintie+p1->de_shenghuobutie; p1->cost_all=p1->cost_phone+p1->cost_water_elec+p1->cost_rent+p1->cost_tax+p1->cost_weisheng+p1->cost_gongjijin; p1->shifa_salary=p1->yingfa_salary-p1->cost_all; printf(“ 繼續修改其他數據嗎?(y或n):”); scanf(“%c”,&m);getchar(); }while(m=='y'||m=='Y'); p2=head; if((fp=fopen(“save”,“wb”))==NULL) { printf(“ 文件不存在!按下任意鍵返回主菜單...”);getch(); } else { fwrite(head,LEN-4,1,fp); do { p2=p2->next; fwrite(p2,LEN-4,1,fp); }while(p2->next!=NULL); printf(“------------------------------修改后數據如下:--n”); printf(“教工號 姓名 性別 單位名稱 家庭住址 聯系電話n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“電話費 水電費 房租 個人所得稅 衛生費 公積金 合計扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf n”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工資 津貼 生活補貼 應發工資 實發工資n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); } fclose(fp); } break; case 3:break; default :break; } if(i!=3) { printf(“n 繼續修改其他教師的信息嗎?(y或n)”); scanf(“%c”,&n); } }while((n=='y'||n=='Y')&&i!=3);} } /***********************************刪除函數*****************************************/ void deletes(){ struct teacher *head,*p1,*p2,*p3;int i;char k;FILE *fp;char n='n';p1=p2=p3=(struct teacher *)malloc(LEN);if((head=load())!=NULL){ do { int num; char name[20]; p1=head; system(“cls”); printf(“nnn >>>>>>>>>>> 刪除教師信息 <<<<<<<<<< printf(“ *******************************************************n”); printf(“ * 1.輸入教師號 *n”); printf(“ * 2.輸入姓名 *n”); printf(“ * 3.返回上級菜單 *n”); printf(“ *******************************************************n”); printf(“ 請選擇刪除方式:”); scanf(“%d”,&i);getchar(); while(i<1||i>3) { printf(“ 輸入有誤!請重新輸入:”); scanf(“%d”,&i);getchar(); } switch(i) { case 1:printf(“ 請輸入要刪除的信息的教師號:”); scanf(“%d”,&num);getchar(); while(p1->num!=num) { if(p1->next!=NULL) p1=p1->next; else { printf(“ 查找不到相關數據!n”); break; } } if(p1->num==num) { printf(“-----------------------------要刪除的信息如下:-n”); printf(“教工號 姓名 性別 單位名稱 家庭住址 聯系電話n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“電話費 水電費 房租 個人所得稅 衛生費 公積金 合計扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lfn”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工資 津貼 生活補貼 應發工資 實發工資n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); printf(“ 確定刪除嗎?(y或n):”);scanf(“%c”,&k);getchar();} if(k=='y'||k=='Y'){ if(p1->num==num){ if(p1==head){ p1=p1->next; p2=p1;} else if(p1->next==NULL) { p3=p1;p1=head;p2=head; while(p1->next!=p3) {p1=p1->next;} p1->next=NULL; } else{ p2=head;p3=p1;p1=head; while(p1->next!=p3) {p1=p1->next;} p3=p3->next; p1->next=p3; } if((fp=fopen(“save”,“wb”))==NULL){ printf(“ 文件不存在!按下任意鍵返回主菜單...”);getch();} else { do { fwrite(p2,LEN-4,1,fp); if(p2->next!=NULL) p2=p2->next; }while(p2->next!=NULL);if(p2!=head) fwrite(p2,LEN-4,1,fp);}fclose(fp);printf(“ 刪除成功!按下任意鍵繼續...”);getch();} } else {printf(“ 刪除已被取消!按下任意鍵繼續...”);getch();} break; case 2:printf(“ 請輸入要修改的教師姓名:”); gets(name); while(strcmp((p1->name),name)!=0) { if(p1->next!=NULL) p1=p1->next; else { printf(“ 查找不到相關數據!n”); break; } } if(strcmp((p1->name),name)==0) { printf(“-----------------------------要刪除的信息如下:-n”); printf(“教工號 姓名 性別 單位名稱 家庭住址 聯系電話n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“電話費 水電費 房租 個人所得稅 衛生費 公積金 合計扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf n”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工資 津貼 生活補貼 應發工資 實發工資n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); printf(“ 確定刪除嗎?(y或n):”); scanf(“%c”,&k);getchar(); } if(k=='y'||k=='Y') { if(strcmp((p1->name),name)==0) { if(p1==head) { p1=p1->next; p2=p1; } } else if(p1->next==NULL) { p3=p1;p1=head;p2=head; while(p1->next!=p3) {p1=p1->next;} p1->next=NULL; } else{ p2=head;p3=p1;p1=head; while(p1->next!=p3) {p1=p1->next;} p3=p3->next; p1->next=p3; } if((fp=fopen(“save”,“wb”))==NULL) { printf(“ 文件不存在!按下任意鍵返回主菜單...”);getch(); } else { do { fwrite(p2,LEN-4,1,fp); if(p2->next!=NULL) p2=p2->next; }while(p2->next!=NULL); if(p2!=head) fwrite(p2,LEN-4,1,fp); }fclose(fp); printf(“ 刪除成功!按下任意鍵繼續...”);getch(); } } else {printf(“ 刪除已被取消!按下任意鍵繼續...”);getch();} break;case 3:break;default :break;} if(i!=3){ printf(“n 繼續刪除其他教師的信息嗎?(y或n)”);scanf(“%c”,&n);} }while((n=='y'||n=='Y')&&i!=3);} /***********************************瀏覽函數*****************************************/ void scan(){ struct teacher *head,*p1;int i;char m='n';p1=head=(struct teacher *)malloc(LEN);if((head=load())!=NULL){ system(“cls”); printf(“nnn >>>>>>>>>>> 瀏覽教師信息 <<<<<<<<<< printf(“ *******************************************************n”); printf(“ * 1.全部瀏覽 *n”); printf(“ * 2.單個瀏覽 *n”); printf(“ * 3.返回上級菜單 *n”); printf(“ *******************************************************n”); printf(“ 請輸入你想要的操作:”); scanf(“%d”,&i);getchar(); while(i<1||i>3) { printf(“ 輸入有誤!請重新輸入:”); scanf(“%d”,&i);getchar(); } switch(i) { case 1:p1=head; printf(“----------------------------所有保存的信息如下:n”); printf(“教工號 姓名 性別 單位名稱 家庭住址 聯系電話n”); do { printf(“ %-4d %-13s %s %-19s %-19s%-14ld”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); if(p1->next!=NULL) {p1=p1->next;} else break; }while(1); p1=head; printf(“電話費 水電費 房租 個人所得稅 衛生費 公積金 合計扣款n”); do { printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf ”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); if(p1->next!=NULL) {p1=p1->next;} else break; }while(1); p1=head; printf(“基本工資 津貼 生活補貼 應發工資 實發工資n”); do { printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lf n”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); if(p1->next!=NULL) {p1=p1->next;} else break; }while(1); p1=head; printf(“n-----------------n”); printf(“ 按下任意鍵返回主菜單...”); getch(); break; case 2: do { int num=0; char name[20]; p1=head; system(“cls”); printf(“nnn >>>>>>>>>>> 瀏覽教師信息 <<<<<<<<<< printf(“ *******************************************************n”); printf(“ * 1.輸入教師號 *n”); printf(“ * 2.輸入姓名 *n”); printf(“ *******************************************************n”); printf(“ 請輸入你想要的操作:”); scanf(“%d”,&i);getchar(); while(i<1||i>2) { printf(“ 輸入有誤!請重新輸入:”); scanf(“%d”,&i);getchar(); } switch(i) { case 1:printf(“ 請輸入要查詢的教師號:”); scanf(“%d”,&num);getchar(); while(p1->num!=num) { if(p1->next!=NULL) p1=p1->next; else { printf(“ 查找不到相關數據!n”); break; } } if(p1->num==num) { printf(“所查信息如下:---n”); printf(“教工號 姓名 性別 單位名稱 家庭住址 聯系電話n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“電話費 水電費 房租 個人所得稅 衛生費 公積金 合計扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf n”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工資 津貼 生活補貼 應發工資 實發工資n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); } break; case 2:printf(“ 請輸入要查詢的教師姓名:”); gets(name); while(strcmp(p1->name,name)!=0) { if(p1->next!=NULL) p1=p1->next; else { printf(“ 查找不到相關數據!n”); break; } } if(strcmp(p1->name,name)==0) { printf(“所查信息如下:---n”); printf(“教工號 姓名 性別 單位名稱 家庭住址 聯系電話n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“電話費 水電費 房租 個人所得稅 衛生費 公積金 合計扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf n”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工資 津貼 生活補貼 應發工資 實發工資n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); } break; default :break; } printf(“ 繼續瀏覽嗎?(y或n)”); scanf(“%c”,&m); }while(m=='y'||m=='Y'); case 3:break; } } } /***********************************主函數*****************************************/ void main(){ int a=1;welcome();while(1){ system(“cls”); a=menu();switch(a){ case 1:insert();break; } case 2:input();break;case 3:modify();break;case 4:deletes();break;case 5:scan();break;case 6:list();break;case 7:printf(“ 歡迎下次使用!”);getch();exit(0);break;default :printf(“ 輸入有誤,請重新輸入!”);getch();break;} } getch(); Form1: Dim errorCount As Integer Private Sub Command1_Click()If Text1.Text = “system” And Text2.Text = “1234” Then Load Form2 Form2.Show Me.Hide MsgBox “登陸成功,歡迎您進入職工工資管理系統”, vbInformation, “登陸成功” Else errorCount = errorCount + 1 If errorCount < 3 Then MsgBox “用戶名或密碼錯誤(第” & errorCount & “次)!”, vbOKOnly + vbExclamation, “登陸失敗” Text1.SetFocus End If If errorCount >= 3 Then Text1.Enabled = False Text2.Enabled = False Command1.Enabled = False MsgBox “三次輸入用戶名或密碼錯誤,程序將自動退出!”, vbOKOnly + vbExclamation, “登陸失敗” End End If End If End Sub Private Sub Command2_Click()Unload Me End Sub Private Sub Form_Load()errorCount = 0 End Sub Private Sub Form_Unload(Cancel As Integer)If MsgBox(“是否要退出程序?”, vbYesNo, “退出提示”)= vbNo Then Cancel = 1 End If End Sub For i = 1 To jlNum ygList(i).shifagongzi =(CSng(ygList(i).jibengz)+ ygList(i).gerensui CSng(ygList(i).jingtie) ygList(y).shifagongzi = ygList(zuishao).shifagongzi ygList(zuishao).shifagongzi = linShi.shifagongzi End If Next loadData End Sub Private Sub Command5_Click()Dim linShi As YuanGong linShi.ygnamg = InputBox(“請輸入要添加的姓名”, “添加員工-姓名錄入”)If Len(Trim(linShi.ygnamg))> 0 Then linShi.jibengz = InputBox(“請輸入添加員工的基本工資”, “添加員工-基本工資錄入”) If Len(Trim(linShi.jibengz))> 0 Then linShi.jingtie = InputBox(“請輸入添加員工的津貼”, “添加員工-津貼錄入”) If Len(Trim(linShi.jingtie))> 0 Then linShi.gerensui = InputBox(“請輸入添加員工的個人所得稅”, “添加員工-個稅錄入”) If Len(Trim(linShi.gerensui))> 0 Then linShi.suidianfei = InputBox(“請輸入添加員工的水電費”, “添加員工-水電費錄入”) If Len(Trim(linShi.suidianfei))> 0 Then Open filedir For Append As #1 Write #1, linShi.ygnamg;linShi.jibengz;linShi.jingtie;linShi.gerensui;linShi.suidianfei Close #1 MsgBox “添加員工成功!”, vbOKOnly + vbInformation, “成功” jlNum = 0 If Len(Trim(filedir))> 0 Then Open filedir For Input As #1 Do While Not EOF(1) Line Input #1, a If Len(Trim(a))> 0 Then jlNum = jlNum + 1 End If Loop Close #1 ReDim Preserve ygList(jlNum)As YuanGong jlNum = 0 Open filedir For Input As #1 Do While Not EOF(1) jlNum = jlNum + 1 Input #1, ygList(jlNum).ygnamg Input #1, ygList(jlNum).jibengz Input #1, ygList(jlNum).jingtie Next Close #1 MsgBox “刪除員工成功!”, vbOKOnly + vbInformation, “成功” jlNum = 0 If Len(Trim(filedir))> 0 Then Open filedir For Input As #1 Do While Not EOF(1) Line Input #1, a If Len(Trim(a))> 0 Then jlNum = jlNum + 1 End If Loop Close #1 ReDim ygList(jlNum)As YuanGong jlNum = 0 Open filedir For Input As #1 Do While Not EOF(1) jlNum = jlNum + 1 Input #1, ygList(jlNum).ygnamg Input #1, ygList(jlNum).jibengz Input #1, ygList(jlNum).jingtie Input #1, ygList(jlNum).gerensui Input #1, ygList(jlNum).suidianfei Loop Close #1 loadData Command2.Enabled = True Command3.Enabled = False Command4.Enabled = False Command5.Enabled = True Command6.Enabled = True End If Text1.Text = “姓名” & vbTab & “工資” & vbTab & “津貼” & vbTab & “所得稅” & vbTab & “水電費” & vbCrLf For i = 1 To jlNum Text1.Text = Text1.Text & ygList(i).ygnamg & vbTab & ygList(i).jibengz & vbTab & ygList(i).jingtie & vbTab & ygList(i).gerensui & vbTab & ygList(i).suidianfei & vbCrLf Next Else MsgBox “刪除員工失?。 ? vbOKOnly + vbExclamation, “失敗” End If End Sub Private Sub Command7_Click() 數據庫課程設計報告 工資管理系統 組員:廖翔, 劉小芳, 強江波, 張晶晶,馮兆強,夏沖 組長 :劉小芳 需求分析員 :張晶晶 程序員 :廖翔 , 劉小芳 , 強將波 測試員 :馮兆強 界面設計員 :夏沖 目錄 一 緒論 ··········································3 二 課程設計說明····································3 三 需求分析·········································4 四 物理結結構設計···································5 五 數據字典·········································5 六 數據庫設計·······································10 七 功能實現截圖·····································11 八,小結············································21 附錄 1.(組員及學號 廖翔(,劉小芳(41009040127,馮兆強(, 張晶晶(41009040130,夏沖(,強將波(2.開發環境說明 使用 C#進行客戶端應用程序的開發,數據庫管理系統采用 SQL SERVER 一、緒論 隨著計算機技術的飛速發展和經濟體制改革的不斷深入, 傳統企業管理方法、手段以及 工作效率已不能適應新的發展需要, 無法很好地完成員工工資管理工作。提高公司企業管理 水平的主要途徑是更新管理者的思想,增強對管理活動的科學認識?;?C#與 SQL server 數據庫技術建立一個通用工資管理系統,該系統為提供了查詢、增加記錄、刪除等 功能, 功能比較的齊全, 并對工資進行了統計如津貼管理、報表統計等?;旧夏軡M足管理 員和公司的要求。 此次數據庫課程設計的主要設計如下: 原理分析、程序設計過程、程序實現和程序調試以及數據庫的設計。需求分析、概要結構設計、邏輯結構設計、物理結構設計和數據庫的實施和維護。二.課程設計說明 1.設計題目:工資管理系統 2.設計任務與要求: 2.1實驗任務 1.掌握數據庫設計和實現的基本過程 2.掌握數據庫模式設計、分析和實現的方法 3.了解數據庫應用系統軟件開發的一般過程。2.2 實驗基本要求(1學習相關的預備知識 (2按照數據庫設計與實現過程完成數據庫的設計,應用程序的開發,上機調試、運 行 (3寫出課程設計報 3.目的 本說明書目的在于明確說明系統需求,界定系統實現功能的范圍, 指導系統設計以 及編碼。本文檔作為人力資源管理系統的需求說明文檔,用于與用戶確定最終的目標, 并成為協議文本的一部分,同時也是本系統設計人員的基礎文檔。 4.背景 工資管理系統 工資管理部門希望建立一個數據庫來管理員工的工資。要計算員工的工資, 就需要考慮 不在休假日期以內的假期、工作期間的病假時間、獎金和扣除的部分。必須指明給每個員工 發薪水的方式, 隨著時間的推移, 方式可能會有些改變。大多數的員工是通過銀行卡來結算 工資的, 但是也有一部分人使用現金或支票。如果是通過銀行卡, 就需要知道賬號和卡的類 型。付款方式只可能是一種方式。有幾種原因可以扣除工資:例如,個人所得稅、國家稅、醫療保險、退休保險或者預付款。 5.主要包括三大功能模塊: 1.登錄界面選擇 [員工登錄 ]即可進入 [員工登陸界面 ], 選擇 [管理員登陸 ]即可進入 [管理員 登錄界面 ]。 2.管理員功能模塊。3.員工功能模塊.6.操作說明 6.1 無論是管理員還是員工,操作都以員工編號來進行。 6.2 管理員可以對員工基本信息增、刪、查、改, 員工只能對本人基本信息和工資信息查詢。三.需求分析 1.功能需求分析: 該通用工資管理系統具備下列功能:登錄界面選擇 [員工登錄 ]即可進入 [員工登陸界面 ], 選 擇 [管理員登陸 ]即可進入 [管理員登錄界面 ].管理員通過輸入用戶名和密碼進下該系統后, 可以進行一些基本查詢(員工個人信息查 詢 , 員工工資信息查詢 , 修改(修改員工基本信息 , 修改工資信息 , 刪除(員工個人資料刪除 , 員工工資信息刪除 , 錄入(員工資料錄入 , 員工工資資料錄入;;通過輸入密碼,可以進行 查詢員工的數據(工資,獎金津貼,加班情況。 員工通過輸入用戶名和密碼即可進入系統 , 可以進行查詢(查詢個人基本信息和工資信 息.2.數據流需求分析: 數據庫 數據庫需求分析——數據流圖 四.物理結構設計 1.系統模塊劃分 五.數據字典 2.1表字典 2.2表字段字典 六.數據庫設計 1.建表 : EmpInfoTable(Id[主鍵 ],Name,Position,Status;SalaryInfoTable(Id主鍵 ],Name,Prize,Pasepay,RetirementInsurance,Income,Stute,Medical, Dayleave,Deduced,Paytpe,CardNumber,Cardtype,GrossSalary,NetSalary,Date;(1 員工基本信息表 :(2員工工資表 : 七.功能實現截圖 1.登錄界面 2.管理員部分 :(1管理員登陸界面 (2管理員功能選擇界面 (3.錄入員工基本信息界面(4錄入員工工資信息 (5.修改功能選擇界面 A.修改員工基本信息 B.修改工資信息 (6.管理員查詢界面 A.查詢功能選擇界面 B.查詢員工基本信息 C.查詢工資信息 (7.管理員查詢界面 A.功能選擇界面 B.管理員修改員工個人信息 C.管理員修改員工工資界面界面 (8.管理員刪除界面 A.功能選擇界面 B.刪除員工個人信息及工資信息界面 C.刪除員工工資信息界面 3.員工功能界面(1.員工登錄界面 (2.員工功能選擇界面 (3.員工查詢本人基本信息(4.員工查詢本人工資信息 4.測試分析 4.1 更改員工資料不可以更改身份。4.2 修改員工工資信息一旦失敗 就會把原有信息刪除。4.3 管理員固定,且只有一個。八.小結 該工資管理系統總體說來功能比較齊全,管理 員和員工的一些基本的功能 都已經具備; 數據庫的設計方面,建有員工表、工資表。數據庫中存在一些問題,如數據冗余,不夠完善。但在做課程設計的過程中也遇到很多問題,一開始時其中最大的問題是數 據庫的連接部分,該部分直接影響到數據庫與應用程序接口實現,而且必須注意 數據庫數據庫的名稱與連接數據庫的取名以致.后來經過大家的合作努力解決了 這個問題.在編寫程序時,確實也遇到了很多困難,后來經過調試后終于把自已想 到實現的功能一步步實現了,通過這次課程設計使我收獲了好多,熟悉了 C#的 運用,還復習了數據庫相關語句的編寫。此次課程設計讓我感受頗多:做一個數據庫其實是一件很有趣的事情。想到 自己可以創建一個小型的數據庫系統,有點學習后的滿足感。數據庫的建立并非 難事,難點在于數據庫的連接和編程語言的選擇。C#的功能很強大,這也是我以 后需要學習的課程,于是我毅然選擇了它。再就是建立數據庫系統的步驟,我的 經驗就是要先總體規劃,再局部整理。先做好總的界面,再通過該界面的布置一 步一步實現其功能!同時我體會到: 熟練的編程能力,對知識運用的強烈渴望及其創新和團隊的合作 精神設做好一個大型數據庫的基礎。因此通過此次課程設計我明顯感覺到自身的 不足,并希望以后能更加用心地運用所學知識和學習新的知識。 #include “stdio.h” /*I/O函數*/ # include “bios.h” /*ROM基本輸入輸出函數*/ #include “dos.h” /*dos接口函數*/ #include “conio.h” /*屏幕操作函數*/ #include “stdlib.h” /*其它說明*/ #include “string.h” /*字符串函數*/ #include “mem.h” /*內存操作函數*/ #include “ctype.h” /*字符操作函數*/ #include “alloc.h” /*動態地址分配函數*/ /****變量定義*******/ typedef struct z1 /*定義數據結構*/ { char no[11]; /*編號*/ char name[15];/*姓名*/ float jbgz; /*基本工資*/ float koukuan;/*扣款*/ float yfgz;/*應發工資*/ float shuijin;/*稅金*/ float sfgz; /*實發工資*/ struct z1 *prior;/*前驅指針*/ struct z1 *next;/*后繼指針*/ }SALARY; /*結構體類型名*/ struct z1 *First; /*雙鏈表頭指針*/ struct z1 *Last; /*雙鏈表尾指針*/ /******函數原型*********/ void init(); /*初始化*/ void create();/*創建鏈表*/ void calc(); /*計算應發工資*/ void delete();/*刪除*/ void search();/*查找*/ void save();/*保存文件*/ void load();/*讀取文件*/ void computer();/*計算所需各種票面張數*/ void insert();/*插入*/ void append();/*追加*/ void copy();/*復制文件*/ void sort();/*排序*/ void index();/*索引*/ void total();/*分類合計*/ void list();/*顯示所有數據*/ void print(SALARY *p);/*輸出單條記錄*/ void display();/*隨意逐條顯示*/ float fax(float x);/*計算稅金*/ int menu_select();/*主菜單*/ /*******主函數開始**********/ main(){ int i; clrscr(); for(;;) { switch(menu_select()) /*調用菜單函數返回一個整數值*/ { case 0:init();break; /*初始化*/ case 1:create();break;/*輸入數據創建雙鏈表*/ case 2:list();break;/*顯示所有數據*/ case 3:display();break;/*單條顯示*/ case 4:calc();break;/*計算實發工資*/ case 5:search();break;/*查找職工信息數據*/ case 6:delete();break;/*刪除記錄*/ case 7:insert();break;/*插入記錄*/ case 8:append();break;/*追加記錄*/ case 9:save();break;/*保存文件*/ case 10:load();break;/*讀取文件*/ case 11:copy();break;/*復制文件*/ case 12:sort();break;/*按實發工資升序排序*/ case 13:computer();break;/*計算所需票面數*/ case 14:index();break;/*按職工號索引*/ case 15:total();break;/*按部門求合計*/ case 16:exit(0); /*退出*/ } } } /*菜單函數,函數返回值為整型,代表所選的菜單項*/ menu_select(){ char *f[]= { /*定義菜單字符串數組*/ “**************MENU*************”, /*菜單的標題行*/ “ 0.init list”, /*初始化雙鏈表*/ “ 1.Enter list”, /*輸入數據,創建雙鏈表*/ “ 2.List all n”, /*顯示所有記錄*/ “ 3.Display record by step”, /*顯示單條記錄*/ “ 4.Calc the salary”, /*計算實發工資*/ “ 5.Search record on name”, /*查找記錄*/ “ 6.Delete a record”, /*刪除記錄*/ “ 7.Insert record to list”, /*插入記錄*/ “ 8.Append record to file”, /*追加記錄*/ “ 9.Save data to the file”, /*保存文件*/ “ 10.Load data from the file”,/*讀取文件*/ “ 11.Copy the file to new file”, /*復制文件*/ “ 12.Sort on sfgz”, /*排序*/ “ 13.Computer ticket number”, /*計算所需票面數*/ “ 14.Index on number”, /*索引*/ “ 15.Total on number”, /*分類合計*/ “ 16.Quit” };/*退出*/ char s[80]; int i; int key=0;/*記錄所壓鍵值*/ int c=0; gotoxy(1,25);/*移動光標*/ printf(“press any key enter menu......n”);/*壓任意鍵進入主菜單*/ getch(); clrscr();/*清屏*/ textcolor(YELLOW);/*設置文本顏色為黃色*/ textbackground(BLUE);/*設置背景顏色為蘭色*/ gotoxy(10,2); putch(0xda);/*輸出左上角邊框┏*/ for(i=1;i<44;i++) putch(0xc4);/*輸出上邊框水平線*/ putch(0xbf);/*輸出右上角邊框 ┓*/ for(i=3;i<22;i++)/*輸出左右兩邊的垂直線*/ { gotoxy(10,i);putch(0xb3); gotoxy(54,i);putch(0xb3); } gotoxy(10,22);putch(0xc0);/*輸出左上角邊框┗*/ for(i=1;i<44;i++) putch(0xc4);/*輸出下邊框水平線*/ putch(0xd9);/*輸出右下角邊框┛*/ window(11,3,53,21);/* 制作顯示菜單的窗口,大小根據菜單條數設計*/ clrscr(); /*清屏*/ for(i=0;i<18;i++) { gotoxy(10,i+1); cprintf(“%s”,f[i]);/*輸出菜單項數組*/ } i=1; gotoxy(10,2);/*設置默認選項在第一項*/ textbackground(LIGHTGREEN);/*設置背景顏色為淺綠*/ cprintf(“%s”,f[1]);/*輸出菜單項,表示選中*/ gotoxy(10,2);/*移動光標到菜單的第一項*/ while(key!=13) /*所壓鍵不是回車鍵時*/ { while(bioskey(1)==0);/*查詢是否壓下了一個鍵*/ key=bioskey(0); /*返回下一個在鍵盤壓下的鍵*/ key=key&0xff?key&0xff:key>>8;/*對所壓的鍵進行判斷*/ gotoxy(10,i+1); textbackground(BLUE);/*設置背景顏色為藍色*/ cprintf(“%s”,f[i]);/*輸出菜單項*/ if(key==72)i=i==1?17:i-1;/*如壓向上光標鍵↑,i減1,如已到第一行再上移,則到最后一行*/ if(key==80)i=i==17?1:i+1;/*如壓向下光標鍵↓,i加1,如已到最后一行再下移,則到第一行*/ gotoxy(10,i+1);/*光標移動i的下一項*/ textbackground(LIGHTGREEN);/*將背景顏色設為淺綠*/ cprintf(“%s”,f[i]);/*輸出菜單項*/ c=i-1;/*給代表菜單選項的整數賦值*/ } textbackground(BLACK);/*設置背景顏色為黑色*/ window(1,1,80,25);/*恢復原窗口大小*/ return c;/*返回代表菜單選項的整數值*/ } /*初始化函數*/ void init(){ First=NULL; Last=NULL;} /*輸入數據,創建雙鏈表*/ void create(){ int x;/*記錄行坐標*/ int i;/*記錄輸入記錄數*/ int flag=0;/*做結束標記*/ float temp; /*定義臨時變量*/ SALARY *info,*p;/*定義臨時變量*/ if(First!=NULL) init();/*如果頭指針為空,調用初始化函數*/ p=First;/*從頭指針開始*/ for(;;) { if(flag==1) break;/*如果flag=1,結束輸入*/ i=0; x=0; /*確定移動的行坐標*/ clrscr();/*清屏*/ gotoxy(1,3); printf(“*************gongziguanli*************”);/*輸出標題*/ gotoxy(1,4); printf(“ --Enter @ end--”);/*提示輸入@結束*/ gotoxy(1,5); printf(“|-----|”);/*輸出表格的起始線*/ gotoxy(1,6); printf(“| no | name | jbgz |”);/*輸出字段標題,注意空格數*/ for(;;) { gotoxy(1,7+x); printf(“|----------|----------------|--------|”);/*輸出表格的水平線*/ info=(SALARY *)malloc(sizeof(SALARY));/*申請一個記錄空間*/ if(!info) { printf(“nout of memory”);/*如沒有得到空間,輸出內存溢出信息*/ exit(0);/*退出程序*/ } info->next=NULL;/*新結點的后繼為空*/ info->prior=NULL;/*新結點的前驅為空*/ gotoxy(1,8+x);printf(“|”);/*輸出數據間的分割線*/ gotoxy(12,8+x);printf(“|”); gotoxy(29,8+x);printf(“|”); gotoxy(38,8+x);printf(“|”); gotoxy(2,8+x);/*光標到輸入編號位置*/ inputs(info->no,10);/*輸入編號,并驗證長度不超過10*/ if(info->no[0]=='@') { flag=1; break; } /*編號首字符為@結束輸入*/ gotoxy(13,8+x);/*光標到輸入姓名位置*/ inputs(info->name,14);/*輸入姓名,并驗證長度不超過14*/ gotoxy(30,8+x);/*光標到輸入基本工資位置*/ scanf(“%f”,&temp);/*輸入基本工資到臨時變量*/ info->jbgz=temp;/*基本工資賦值*/ info->koukuan=0;/*初始扣款為0,待計算工資時輸入*/ info->sfgz=0;/*初始實發工資為0,待計算工資時計算*/ info->shuijin=0;/*初始稅金為0,待計算工資時計算*/ info->yfgz=0;/*初始應發工資為0,待計算工資時計算*/ if(p==NULL)/*如果p為空,說明輸入的是第一個結點*/ { First=Last=info;/*頭指針和尾指針*/ First->prior=NULL;/*頭指針的前驅是空*/ Last->next=NULL;/*尾指針的后繼是空*/ } else /*插入的結點不是第一結點,則插入在頭結點之前*/ { info->next=p;/*新結點的后繼指向原來的頭結點*/ info->prior=p->prior;/*新結點的前驅指向原來的頭結點的前驅*/ p->prior=info;/*原來結點的前驅指向新結點*/ } p=info;/*新結點變為p結點,暫時的頭結點*/ First=info;/*新結點變為頭結點*/ x+=2; /*因為水平線,將光標下移兩行*/ gotoxy(1,8+x); i++; /*輸入記錄數加1*/ if(i%9==0) break;/*輸入9個記錄,換一頁輸入*/ } gotoxy(1,8+x); } printf(“|----------|----------------|--------|”);/*輸出結尾水平線*/ } /*字符串輸入和驗證函數*/ inputs(char *s, int count){ char p[255]; do{ scanf(“%s”,p);/*輸入字符串*/ if(strlen(p)>count)printf(“n too long!n”);/*進行長度校驗,超過count值重輸入*/ }while(strlen(p)>count); strcpy(s,p);/*將輸入的字符串拷貝到字符串s中*/ } /*顯示鏈表*/ void list(){ int i=0,n;/*記錄輸出行數*/ SALARY *p;/*定義移動指針*/ clrscr();/*清屏*/ p=First;/*從頭指針開始*/ while(i%10==0&&p!=NULL)/*外循環控制換頁*/ { i=0; /*記錄一頁的輸出行數*/ clrscr(); /*清屏*/ printf(“nnn”);/*換行三次*/ printf(“*************************************SALARY***********************************n”); /*輸出大標題*/ printf(“|nO | name | jbgz | koukuan | yfgz | shuijin | sfgz |n”);/*輸出字段標題*/ printf(“|----------|---------------|---------|---------|---------|---------|---------|n”);/*輸出水平線*/ while(p!=NULL)/*當p不為空時*/ { printf(“|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|n”,p->no,p->name,p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz); p=p->next;/*指針后移*/ i++; /*輸出行數加1 */ if(i%10==0) break;/*如果滿10行,跳出內循環*/ } printf(“****************************************end***********************************n”);/*輸出本頁的結束行*/ printf(“Press any key congtinue...n”); getch();/*輸出一頁暫停一下,壓任意鍵繼續*/ } /*返回到外循環,準備下一頁的輸出*/ } /*單條顯示記錄*/ void display(){ int ch; /*菜單選項字符*/ SALARY *p;/*定義臨時指針*/ clrscr();/*清屏*/ p=First;/*從頭指針開始*/ if(p==NULL)/*指針為空,即鏈表為空,返回主函數*/ { printf(“record is empty!n”); return; } else { print(p); /*調用輸出函數顯示頭結點信息*/ for(;;)/*循環開始*/ { printf(“nn0.Quit 1.Prior 2.Next 3.First 4.Last nn”);/*菜單項Quit退出 Prior前驅 Next后繼 First第一條 Last最后一條*/ printf(“nplease select 0~4:”);/*提示輸入菜單選項0~4*/ scanf(“%d”,&ch);/*輸入菜單選項0~4*/ if(ch==0)break;/*如果選項為0,退出*/ switch(ch) /*開關語句根據選項字符判斷*/ { case 1:p=p->prior;if(p==NULL)p=First;break;/*指向前驅,沒有前驅指向第一個*/ case 2:p=p->next;if(p==NULL)p=Last;break;/*指向后繼,沒有后繼指向最后一個*/ case 3:p=First;break;/*指向第一個結點*/ case 4:p=Last;break;/*指向最后一個結點*/ } print(p);/*調用輸出函數顯示指針所指結點信息*/ } } } /*輸出指針所指結點信息*/ void print(SALARY *p){ if(p) /*如果指針不為空,則顯示信息*/ { clrscr();/*清屏*/ printf(“nnn”);/*換行*/ printf(“************************************SALARY************************************n”);/*輸出標題信息*/ printf(“|no | name | jbgz | koukuan| yfgz | shuijin | sfgz |n”);/*輸出字段標題*/ printf(“|----------|---------------|---------|---------|---------|---------|---------|n”);/*輸出分割線*/ printf(“|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|n”, p->no,p->name,p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);/*輸出結點信息*/ printf(“***************************************end***************************** *******n”);/*輸出結束標記*/ } } /*計算實發工資*/ void calc(){ int x;/*行坐標*/ int i=0;/*記錄數*/ float temp;/*臨時變量扣款*/ SALARY *p;/*移動指針*/ clrscr(); /*清屏*/ p=First;/*從頭指針開始*/ while(p!=NULL)/*當p不為空時,也就是有記錄時,外循環控制換頁*/ { x=0; clrscr(); gotoxy(1,3); printf(“***************************gongziguanli************************************”); /*輸出標題*/ gotoxy(1,5); printf(“|------------|”); gotoxy(1,6);/*下面輸出字段標題*/ printf(“| no | name | jbgz | koukuan | yfgz |shuijin | sfgz |”); while(p!=NULL)/*當p不為空時,也就是有記錄時,內循環控制處理9條*/ { gotoxy(1,7+x); printf(“|----------|----------------|--------|----------|--------|--------|--------|”); gotoxy(1,8+x);printf(“|”); gotoxy(12,8+x);printf(“|”); gotoxy(29,8+x);printf(“|”); gotoxy(38,8+x);printf(“|”); gotoxy(49,8+x);printf(“|”); gotoxy(58,8+x);printf(“|”); gotoxy(67,8+x);printf(“|”); gotoxy(76,8+x);printf(“|”); gotoxy(2,8+x); printf(“%-10s”,p->no);/*輸出編號*/ gotoxy(13,8+x); printf(“%-15s”,p->name);/*輸出姓名*/ gotoxy(30,8+x); printf(“%.2f”,p->jbgz);/*輸出基本工資*/ gotoxy(39,8+x); scanf(“%f”,&temp);/*輸入扣款*/ p->koukuan=temp;/*扣款字段賦值*/ p->yfgz=p->jbgz-p->koukuan;/*計算應發工資=基本工資-扣款*/ gotoxy(50,8+x); printf(“%.2f”,p->yfgz);/*輸出應發工資*/ gotoxy(59,8+x); p->shuijin=(p->yfgz-1000)*fax(p->yfgz);/*否則按稅率計算稅金*/ printf(“%.2f”,p->shuijin);/*輸出稅金*/ gotoxy(68,8+x); p->sfgz=p->yfgz-p->shuijin;/*計算實發工資*/ printf(“%-8.2f”,p->sfgz);/*輸出實發工資*/ x+=2; /*行坐標下移兩行*/ i++; /*記錄數加1*/ if(i%9==0)break;/*記錄數超過9條,跳出內循環*/ p=p->next; /*指針后移,處理下一條*/ } gotoxy(1,7+x); printf(“|----------|----------------|--------|----------|--------|--------|--------|n”);/*輸出結束行*/ printf(“Press any key congtinue...n”); getch(); } } /*根據應發工資,計算稅率*/ float fax(float x){ float f1; if(x<1000) return 0; /*小于1000,返回0*/ switch((int)(x/1000)) { case 1:f1=0.05;break;/*1000~1999,返回0.05*/ case 2:f1=0.1;break;/*2000~2999,返回0.1*/ case 3:f1=0.15;break;/*3000~3999,返回0.15*/ case 4:f1=0.2;break;/*4000~4999,返回0.2*/ default:f1=0.3;break;/*5000以上,返回0.3*/ } return f1;} /*計算票面張數*/ void computer(){ SALARY *p; int i=0,a[7]={0},t100,t50,t20,t10,t5,t2,t1;/*設置數組和臨時變量保存票面張數*/ float t; /*過渡變量,保存當前剩余工資*/ p=First;/*移動指針從頭指針開始*/ while(p!=NULL)/*當p不為空時*/ { t100=(int)p->sfgz/100;/*計算100元張數*/ a[0]=a[0]+t100; /*累加保存*/ t=p->sfgz-t100*100;/*剩余工資*/ t50=(int)(t/50);/*計算50元張數*/ a[1]=a[1]+t50;/*累加保存*/ t=t-t50*50;/*剩余工資*/ t20=(int)(t/20); /*計算20元張數*/ a[2]=a[2]+t20;/*累加保存*/ t=t-t20*20;/*剩余工資*/ t10=(int)(t/10);/*計算10元張數*/ a[3]=a[3]+t10;/*累加保存*/ t=t-t10*10;/*剩余工資*/ t5=(int)(t/5);/*計算5元張數*/ a[4]=a[4]+t5;/*累加保存*/ t=t-t5*5;/*剩余工資*/ t2=(int)(t/2);/*計算2元張數*/ a[5]=a[5]+t2;/*累加保存*/ t=t-t2*2;/*剩余工資*/ t1=(int)(t);/*計算1元張數*/ a[6]=a[6]+t1;/*累加保存*/ p=p->next;/*指針后移,處理下一條記錄*/ } clrscr();/*清屏*/ printf(“nnn***********ticket number***************n”);/*輸出標題*/ printf(“--100-----50------20-----10-----5------2------1------n”); /*輸出張數標題*/ for(i=0;i<7;i++) printf(“%5d ”,a[i]);/*輸出所需的張數*/ printf(“n”);/*換行*/ } /*按編號查找記錄*/ SALARY *find(char *no){ SALARY *p;/*定義移動指針*/ p=First;/*從頭指針開始*/ while(p)/*當p不為空時*/ { if(!strcmp(no,p->no)) return p;/*比較相等,查找成功,返回指針*/ p=p->next;/*不相等指針后移*/ } printf(“not foundn”);/*沒有找到*/ return NULL;/*返回為空指針*/ } /*刪除結點*/ void delete(){ SALARY *p;/*定義臨時變量,p指向要刪除的結點p*/ char s[11];/*要刪除結點的編號*/ clrscr();/*清屏*/ printf(“please deleted non”);/*提示輸入信息*/ scanf(“%s”,s); /*輸入要刪除的職工編號*/ if((p=find(s))!=NULL)/*調用查找函數,如果找到做下面的處理*/ { if(First==p) /*如果是第一個結點*/ { First=p->next;/*將頭指針指向其后繼結點*/ if(First) /*如頭指針不為空*/ First->prior=NULL;/*將頭結點的前驅設為空*/ else Last=NULL; /*否則頭為空,尾也為空*/ } else /*刪除的不是第一個結點*/ { p->prior->next=p->next;/*p的前驅的后繼指向p原來的后繼*/ if(p!=Last) /*如果p不是最后個結點*/ p->next->prior=p->prior;/*p后繼的前驅指向p原來的前驅*/ else Last=p->prior;/*如p是最后一個結點,修改尾指針為p的前驅*/ } free(p);/*刪除結點后,不要忘記釋放空間*/ printf(“n have deleted %s SALARYn”,s); printf(“Don't forget saven”); } } /*按姓名查找結點*/ void search(){ SALARY *p;/*移動指針*/ char s[15];/*保存姓名*/ clrscr();/*清屏*/ printf(“please enter name for searchn”);/*提示輸入*/ scanf(“%s”,s);/*輸入要查找人的姓名*/ p=First;/*移動指針從頭指針開始*/ while(strcmp(p->name,s)&&p!=NULL)/*做比較判斷*/ p=p->next; /*沒找到,指針后移繼續查找*/ if(p==NULL)/*指針為空,說明沒有找到*/ printf(“nlist no %s SALARYn”,s);/*顯示沒找到信息*/ else { printf(“nn”);/*換行*/ print(p);/*查找成功,調用輸出函數輸出指針p所指記錄*/ } } /*插入結點*/ void insert(){ SALARY *p,*info;/* info為新結點,p為新結點的后繼*/ char s[11];/*保存查找的姓名*/ float temp;/*臨時變量*/ clrscr();/*清屏*/ printf(“please enter location before the non”);/*提示輸入在哪個結點之前插入*/ scanf(“%s”,s);/*輸入指定結點的編號*/ printf(“nplease new recordn”);/*提示輸入記錄*/ clrscr();/*清屏*/ gotoxy(1,3);/*定位光標,按表格形式輸入新結點信息*/ printf(“**************gongziguanli************”); gotoxy(1,5); printf(“|-----|”); gotoxy(1,6); printf(“| no | name | jbgz | ”); gotoxy(1,7); printf(“|----------|----------------|--------|”); info=(SALARY *)malloc(sizeof(SALARY));/*申請空間*/ if(!info) { printf(“nout of memory”);/*如沒有得到空間,內存溢出*/ exit(0);/*退出程序*/ } info->next=NULL;/*新結點的后繼為空*/ info->prior=NULL;/*新結點的前驅為空*/ gotoxy(1,8);printf(“|”); gotoxy(12,8);printf(“|”); gotoxy(29,8);printf(“|”); gotoxy(38,8);printf(“|”); gotoxy(2,8); inputs(info->no,10);/*輸入新結點的編號,并校驗*/ gotoxy(13,8); inputs(info->name,14);/*輸入新結點的姓名,并校驗*/ gotoxy(30,8); scanf(“%f”,&temp); /*輸入基本工資*/ info->jbgz=temp;/*給基本工資字段賦值*/ info->koukuan=0;/*扣款初始為0*/ info->yfgz=0;/*應發工資初始為0*/ info->shuijin=0;/*稅金初始為0*/ info->sfgz=0;/*實發工資初始為0*/ printf(“|----------|----------------|--------|”); p=First;/*移動指針從頭指針開始*/ while(strcmp(p->no,s)&&p!=NULL)/*查找結點確定插入位置*/ p=p->next;/*指針后移,繼續查找*/ if(p==NULL)/*如p為空*/ if(p==First)/*如p為頭指針,說明鏈表為空*/ { First=info;/*新結點為頭指針*/ First->prior=NULL;/*頭結點的前驅為空*/ Last=First;/*唯一結點,尾指針等于頭指針*/ } else /*新結點插在尾部*/ { Last->next=info; info->prior=Last; Last=info;/*尾指針指向新結點*/ } else if(p==First)/*p不為空,但p為頭指針,新結點插在第一個結點位置*/ { info->prior=NULL;/*新結點的前驅為空*/ info->next=p;/*新結點的后繼為p*/ p->prior=info;/*p的前驅是新結點*/ First=info;/*修改頭指針指向新結點*/ } else /*新結點插入在中間某一個位置p之前*/ { info->next=p;/*新結點的后繼是p*/ info->prior= p->prior;/*新結點的前驅是p的前驅*/ p->prior->next=info;/*p的前驅的后繼是新結點*/ p->prior=info;/*p的前驅是新結點*/ } printf(“nnn----have inserted %s SALARY----n”,info->name); printf(“n---Don't forget save---n”);/*提醒調用保存文件存盤*/ } /*保存文件*/ void save(){ FILE *fp;/*定義指向文件的指針*/ SALARY *p;/*定義移動指針*/ char outfile[10];/*保存輸出文件名*/ clrscr();/*清屏*/ printf(“Enter outfile name,for example c:f1 e.txt:n”);/*提示輸入文件名格式信息*/ scanf(“%s”,outfile); if((fp=fopen(outfile,“wb”))==NULL)/*為輸出打開一個二進制文件*/ { printf(“can not open filen”); return;/*返回*/ } printf(“nSaving file......n”); p=First;/*移動指針從頭指針開始*/ while(p!=NULL)/*如p不為空*/ { fwrite(p,sizeof(SALARY),1,fp);/*寫入一條記錄*/ p=p->next;/*指針后移,處理下一條記錄*/ } fclose(fp);/*關閉文件*/ printf(“-----save success!-----n”);/*顯示保存成功*/ } /*讀文件*/ void load(){ SALARY *p,*q=NULL;/*定義記錄指針變量*/ FILE *fp;/* 定義指向文件的指針*/ char infile[10];/*保存文件名*/ clrscr();/*清屏*/ printf(“Enter infile name,for example c:f1 e.txt:n”);/*輸入文件名格式*/ scanf(“%s”,infile);/*輸入文件名*/ if((fp=fopen(infile,“rb”))==NULL)/*打開一個二進制文件,為讀方式*/ { printf(“can not open filen”);/*如不能打開,則結束程序*/ return;/*返回*/ } while(First)/*當表不為空時,清空鏈表*/ { p=First;/*從頭指針開始*/ First=First->next;/*刪除頭結點*/ free(p);/*釋放空間*/ } printf(“n-----Loading file!-----n”);/*顯示正在讀文件*/ First=(SALARY *)malloc(sizeof(SALARY));/*為頭指針申請空間*/ if(!First)/*如果沒有得到空間 顯示內存溢出*/ { printf(“out of memory!n”); return;/*返回*/ } p=First;/*將頭指針賦值給p*/ while(!feof(fp))/*當文件不空時*/ { if(1!=fread(p,sizeof(SALARY),1,fp))break;/*將記錄讀到p所指的結點*/ p->next=(SALARY *)malloc(sizeof(SALARY));/*為p的后繼申請空間*/ if(!p->next)/*如果沒有得到空間顯示內存溢出*/ { printf(“out of memory!n”); return;/*返回*/ } p->prior=q;/*得到空間,則鏈接指針關系p的前驅為q*/ q=p;/*保存p做為新的p結點的前驅*/ p=p->next;/*p指針后移*/ } q->next=NULL;/*q的后繼為空*/ Last=q;/*尾指針為q*/ First->prior=NULL;/*頭指針的前驅為空*/ fclose(fp);/*關閉文件*/ printf(“---You have success read data from file!!---n”);/*顯示成功讀入記錄*/ } /*追加記錄*/ void append(){ FILE *fp; /*定義指向文件的指針*/ SALARY *info;/*指向追加信息的指針*/ char infile[10];/*保存文件名*/ float temp;/*臨時變量*/ clrscr();/*清屏*/ gotoxy(1,3); printf(“**************gongziguanli************”); gotoxy(1,5); printf(“|-----|”); gotoxy(1,6); printf(“| no | name | jbgz | ”); gotoxy(1,7); printf(“|----------|----------------|--------|”); info=(SALARY *)malloc(sizeof(SALARY));/*申請追加信息的空間*/ if(!info) { printf(“nout of memory”);/*沒有空間,內存溢出*/ exit(0);/*結束程序*/ } info->next=NULL;/*新信息的后繼為空*/ info->prior=NULL;/*新信息的前驅為空*/ gotoxy(1,8);printf(“|”); gotoxy(12,8);printf(“|”); gotoxy(29,8);printf(“|”); gotoxy(38,8);printf(“|”); gotoxy(2,8); inputs(info->no,10);/*輸入編號并校驗*/ gotoxy(13,8); inputs(info->name,14);/*輸入姓名并校驗*/ gotoxy(30,8); scanf(“%f”,&temp);/*輸入基本工資*/ info->jbgz=temp; info->koukuan=0;/*扣款為0*/ info->yfgz=0;/*應發工資為0*/ info->shuijin=0;/*稅金為0*/ info->sfgz=0;/*實發工資為0*/ printf(“|----------|----------------|--------|”); printf(“nnnEnter infile name,for example c:f1 e.txt:n”);/*提示輸入文件名*/ scanf(“%s”,infile); if((fp=fopen(infile,“ab”))==NULL)/*打開文件*/ { printf(“can not open filen”); return;/*返回*/ } printf(“n-----Appending record!-----n”); if(1!=fwrite(info,sizeof(SALARY),1,fp))/*向文件中追加記錄*/ { printf(“-----file write error!-----n”);/*寫函數返回值不為1,說明寫入錯誤*/ return;/*返回*/ } printf(“-----append sucess!----n”);/*顯示追加成功*/ fclose(fp);/*關閉文件*/ } /*文件復制*/ void copy(){ char outfile[10],infile[10];/*保存源文件名和目標文件名*/ FILE *sfp,*tfp;/*定義指向源文件和目標文件的指針*/ SALARY *p=NULL;/*定義臨時指針,暫存讀出的記錄*/ clrscr(); printf(“Enter infile name,for example c:f1 e.txt:n”); scanf(“%s”,infile);/*輸入源文件名*/ if((sfp=fopen(infile,“rb”))==NULL)/*二進制讀方式打開源文件*/ { printf(“can not open input filen”);/*顯示不能打開文件信息*/ return;/*返回*/ } printf(“Enter outfile name,for example c:f1 e.txt:n”);/*提示輸入目標文件名*/ scanf(“%s”,outfile);/*輸入目標文件名*/ if((tfp=fopen(outfile,“wb”))==NULL)/*二進制寫方式打開目標文件*/ { printf(“can not open output file n”); return; } while(!feof(sfp))/*讀文件直到文件尾*/ { if(1!=fread(p,sizeof(SALARY),1,sfp)) break;/*塊讀*/ fwrite(p,sizeof(SALARY),1,tfp);/*塊寫*/ } fclose(sfp);/*關閉源文件*/ fclose(tfp);/*關閉目標文件*/ printf(“you have success copy file!!n”);/*顯示成功拷貝*/ } /*排序*/ void sort(){ SALARY *p0,*p00,*p1,*p11,*p2;/*定義臨時指針*/ int i=1;/*統計當前排第幾個結點*/ clrscr();/*清屏*/ printf(“nn start sort....n”);/*開始排序*/ p1=p11=p2=First; while(p1!=NULL)/*當p1不為空時*/ { p0=p1; /*待比較結點從p1開始*/ p2=p1; /*p2從當前待排序位置開始*/ while(p2->next!=NULL)/*p2的后繼不為空時*/ { if(p0->sfgz>p2->next->sfgz)/*找當前最小結點*/ { p00=p2; /*找到當前最小結點記錄其前驅指針*/ p0=p2->next;/*記錄當前最小值結點的指針p0*/ } p2=p2->next;/*指針后移*/ } Last=p0;/*當前最小結點為尾結點*/ if(p1!=p0)/*判斷最小結點是否是當前排序位置,不是則作指針修改*/ { p00->next=p0->next;/*將p00的后繼指向p0的后繼*/ p0->next->prior=p00;/*p0的后繼的前驅為p00*/ p0->next=p1;/*p0的后繼指向下個排序位置p1*/ p1->prior=p0;/*p1的前驅為p0*/ if(i==1) { First=p0; /*作頭指針*/ First->prior=NULL;/*頭指針的前驅為空*/ } else /*不是第一個結點*/ { p11->next=p0; /*p11的后繼指向p0*/ p0->prior=p11;/*p0的前驅指向p11*/ } p11=p1=p0;/*因p0是排好序的最后一個結點,p1是下一個將要排序的位置,所以將p0賦值給p1和p11*/ } i++;/*排好序的結點數加1*/ p1=p1->next;/*p1后移指向下一個待排序位置*/ } printf(“sort sucess!!n”);/*輸出排序成功*/ } /*索引*/ void index(){ SALARY *p,*q,*t,*h1;/*定義臨時指針*/ clrscr();/*清屏*/ printf(“nn start index.....nn”);/*顯示開始索引*/ h1=First->next;/*將原表的頭指針所指的下一個結點作頭指針*/ First->next=NULL;/*第一個結點為新表的頭結點*/ Last=First;/*尾指針等于頭指針*/ while(h1!=NULL)/*當原表不為空時,進行排序*/ { t=h1;/*取原表的頭結點*/ h1=h1->next;/*原表頭結點指針后移*/ p=First;/*設定移動指針p,從頭指針開始*/ q=First;/*設定移動指針q做為p的前驅,初值為頭指針*/ while(strcmp(t->no,p->no)>0&&p!=NULL)/*作編號比較*/ { q=p;/*待排序點值大,應往后插,所以新表指針后移*/ p=p->next; } if(p==q)/*p==q,說明待排序點值小,應排在首位*/ { t->next=p;/*待排序點的后繼為p*/ p->prior=t;/*p的前驅結點指向待排序結點*/ First=t;/*新頭結點為待排序點*/ First->prior=NULL;/*頭指針的前驅為空*/ } else /*待排序點應插入在中間某個位置q和p之間,如p為空則是尾部*/ { t->next=p;/*t的后繼是p*/ t->prior=q;/*t的前驅是q*/ q->next=t;/*q的后繼是t*/ if(p==NULL)/*判p是否為空*/ Last=t; /*將t賦值為尾指針*/ else p->prior=t;/*否則將t賦值給p的前驅*/ } } printf(“index sucess!!n”);/*索引排序成功*/ } /*分類合計*/ void total(){ struct t1 /*定義結構體保存合計數據*/ { char u[7];/*部門*/ float s; /*合計實發工資*/ }unit[20]; /*定義一個單位部門數不超過20個*/ SALARY *p,*q;/*定義臨時指針變量*/ char sno[7],qno[7],*ptr;/*保存部門號*/ float s1;/*保存合計值*/ int i,j;/*控制變量*/ p=First;/*從指針開始*/ i=0;/*統計部門數*/ clrscr();/*清屏*/ while(p!=NULL)/*當p不為空時做下面的處理*/ { memcpy(sno,p->no,6);/*從編號中取出部門號*/ sno[6]='
主站蜘蛛池模板:
久久综合噜噜激激的五月天|
2018av天堂在线视频精品观看|
国产香蕉尹人在线视频你懂的|
欧美激情一区二区成人|
亚洲国产精品久久久久爰色欲|
亚洲大成色www永久网站|
中文幕无线码中文字蜜桃|
午夜131美女爱做视频|
日韩高清国产一区在线|
99re6在线观看国产精品|
日日做夜狠狠爱欧美黑人|
国产毛片女人高潮叫声|
四虎成人欧美精品在永久在线|
亚洲综合日韩av无码毛片|
国产亚洲3p无码一区二区|
国产一极内射視颍一|
人妻少妇精品系列|
麻豆亚洲av永久无码精品久久|
中文字幕精品无码一区二区三区|
亚洲精品亚洲人成人网|
国产精品调教视频一区|
婷婷色爱区综合五月激情|
97精品伊人久久大香线蕉app|
国产成人无码a区在线观看视频|
精品久久久久久久久中文字幕|
让少妇高潮无乱码高清在线观看|
乱人伦精品视频在线观看|
香蕉精品亚洲二区在线观看|
无码熟熟妇丰满人妻porn|
欧洲熟妇色xxxx欧美老妇软件|
国产狂喷潮在线观看|
厨房玩丰满人妻hd完整版视频|
国产成人久久综合777777麻豆|
无码人妻丰满熟妇区毛片|
人妻少妇乱子伦精品|
成人午夜福利视频镇东影视|
欧美性猛交aaaa片黑人|
亚洲毛片αv无线播放一区|
国产成人夜色高潮福利app|
免费无码成人片|
精品久久久久久无码中文字幕漫画|
第二篇:vb課程設計 職工工資管理系統代碼
第三篇:數據庫課程設計工資管理系統.
第四篇:工資管理(C語言課程設計)