/* * * * *頭文件(。h)* * * * * * * */
#include "stdio.h" /*I/O函數*/
# include "bios.h" /*ROM基本輸入輸出函數*/
#include "dos.h" /*dos接口函數*/
#包含“conio . h”/*屏幕操作功能*/
#include "stdlib.h" /*其他註釋*/
#include "string.h" /*字符串函數*/
#include "mem.h" /*存儲器操作功能*/
#include "ctype.h" /*字符操作函數*/
#include "alloc.h" /*動態地址分配函數*/
/* * * *變量定義* * * * */
Typedef struct z1 /*定義數據結構*/
{
字符編號[11];/*編號*/
char name[15];/*姓名*/
浮動jbgz/*基本工資*/
浮動扣款;/*扣除*/
浮動yfgz/*應付工資*/
浮動金水;/*稅*/
浮動sfgz/*實際工資*/
struct z 1 * prior;/*前驅指針*/
struct z 1 * next;/*後續指針*/
}工資;/*結構類型名稱*/
struct z 1 * First;/*雙向鏈表頭指針*/
struct z 1 * Last;/*雙向鏈表尾指針*/
/* * * * * *函數原型* * * * * * * *
void init();/*初始化*/
void create();/*創建壹個鏈表*/
void calc();/*計算應付工資*/
void delete();/*刪除*/
void search();/*查找*/
void save();/*保存文件*/
空載荷();/*讀取文件*/
void計算機();/*計算所需賬單的數量*/
void insert();/*插入*/
void append();/*添加*/
void copy();/*復制文件*/
void sort();/*排序*/
void索引();/*索引*/
void total();/*按類別分列的總數*/
void list();/*顯示所有數據*/
作廢打印(工資* p);/*輸出單個記錄*/
void顯示();/*隨意逐項顯示*/
浮點傳真(浮點x);/*計算稅款*/
int menu _ select();/*主菜單*/
/* * * * * *主功能啟動* * * * * * * *
主()
{
int I;
clr SCR();
for(;;)
{
Switch(menu_select()) /*調用菜單函數返回壹個整數值*/
{
案例0:init();打破;/*初始化*/
案例1:create();打破;/*輸入數據以創建雙向鏈表*/
案例二:list();打破;/*顯示所有數據*/
情況三:顯示();打破;/*單壹顯示*/
案例四:calc();打破;/*計算實際工資*/
案例五:搜索();打破;/*查找員工信息數據*/
情況6:delete();打破;/*刪除記錄*/
案例7:insert();打破;/*插入記錄*/
案例8:append();打破;/*附加記錄*/
案例九:save();打破;/*保存文件*/
案例10:load();打破;/*讀取文件*/
案例11:copy();打破;/*復制文件*/
案例12:sort();打破;/*按實際工資升序排序*/
案例13:計算機();打破;/*計算所需的面值*/
案例14:索引();打破;/*按員工編號索引*/
案例15:合計();打破;/*按部門分列的總數*/
案例16:出口(0);/*退出*/
}
}
}
/*菜單函數,返回值為整數,代表選中的菜單項*/
menu_select()
{
Char *f[]= {/*定義菜單字符串數組*/
“* * * * * * * * * * * * * * * *菜單* * * * * * * * * *”,/*菜單的標題行*/
"0.init list ",/*初始化雙向鏈表*/
"1.輸入列表",/*輸入數據以創建雙向鏈表*/
"2.列出所有\n ",/*顯示所有記錄*/
"3.按步驟顯示記錄",/*顯示單個記錄*/
"4.Calc the salary ",/*計算實際工資*/
"5.按名稱搜索記錄",/*查找記錄*/
"6.刪除記錄",/*刪除記錄*/
"7.將記錄插入列表",/*插入記錄*/
"8.將記錄追加到文件中",/*追加記錄*/
"9.保存數據到文件",/*保存文件*/
"10.從文件中加載數據",/*讀取文件*/
"11.將文件復制到新文件",/*復制文件*/
"12.按sfgz排序",/* Sort */
"13.ComputerTicketNumber ",/*計算所需的面號*/
"14.數字上的索引",/* index */
"15.數量合計",/*按類別合計*/
" 16.退出" };/*退出*/
char s[80];
int I;
int key = 0;/*記錄下按下的鍵值*/
int c = 0;
gotoxy(1,25);/*移動光標*/
printf("按任意鍵進入菜單......\ n ");/*按任意鍵進入主菜單*/
getch();
clr SCR();/*清空屏幕*/
textcolor(黃色);/*將文本顏色設置為黃色*/
textbackground(藍色);/*將背景顏色設置為藍色*/
gotoxy(10,2);
putch(0x da);/*輸出左上角邊框┏ */
for(I = 1;我& lt44;i++)
putch(0x C4);/*輸出上邊框水平線*/
putch(0x BF);/*輸出右上角邊框┓ */
for(I = 3;我& lt22;I++)/*輸出左右豎線*/
{
gotoxy(10,I);putch(0x B3);
gotoxy(54,I);putch(0x B3);
}
gotoxy(10,22);putch(0xc 0);/*輸出左上角邊框┗ */
for(I = 1;我& lt44;i++)
putch(0x C4);/*輸出下邊框水平線*/
putch(0xd 9);/*輸出右下角邊框┛ */
窗口(11,3,53,21);/*制作壹個顯示菜單的窗口,窗口的大小根據菜單的數量來設計*/
clr SCR();/*清空屏幕*/
for(I = 0;我& lt18;i++)
{
gotoxy(10,I+1);
cprintf("%s ",f[I]);/*輸出菜單項數組*/
}
I = 1;
gotoxy(10,2);/*在第壹項中設置默認選項*/
textbackground(淺綠色);/*將背景顏色設置為淺綠色*/
cprintf("%s ",f[1]);/*輸出菜單項,表示*/
gotoxy(10,2);/*將光標移動到菜單中的第壹項*/
而(鍵!=13) /*當按下的鍵不是Enter鍵時*/
{
while(BIOS key(1)= = 0);/*查詢是否有按鍵被按下*/
key = BIOS key(0);/*返回到鍵盤上按下的下壹個鍵*/
鑰匙=鑰匙& amp0xff?鑰匙和鑰匙。0x ff:key & gt;& gt8;/*判斷按下的鍵*/
gotoxy(10,I+1);
textbackground(藍色);/*將背景顏色設置為藍色*/
cprintf("%s ",f[I]);/*輸出菜單項*/
if(key==72) i=i==1?17:I-1;/*如果按向上光標鍵↑, I減1。如果您已經移到第壹行,您將移到最後壹行*/
if(key==80)i=i==17?1:I+1;/*如果妳按下向下光標鍵↓,我就加1,如果妳已經到了最後壹行然後下移,就到了第壹行*/
gotoxy(10,I+1);/*光標移動的下壹項i */
textbackground(淺綠色);/*將背景顏色設置為淺綠色*/
cprintf("%s ",f[I]);/*輸出菜單項*/
c = I-1;/*為代表菜單選項的整數賦值*/
}
textbackground(黑色);/*將背景顏色設置為黑色*/
窗口(1,1,80,25);/*恢復原始窗口大小*/
返回c;/*返回表示菜單選項的整數值*/
}
/*初始化函數*/
void初始化()
{
First = NULL
Last = NULL
}
/*輸入數據並創建壹個雙向鏈表*/
void創建()
{
int x;/*記錄線坐標*/
int I;/*記錄輸入的記錄數*/
int flag = 0;/*標記結束*/
浮動溫度;/*定義臨時變量*/
薪資*信息,* p;/*定義臨時變量*/
如果(先!=空)
init();/*如果頭指針為空,調用初始化函數*/
p =第壹;/*從頭指針開始*/
for(;;)
{
if(flag==1)
打破;/*如果flag=1,結束輸入*/
I = 0;
x = 0;/*確定移動線坐標*/
clr SCR();/*清空屏幕*/
gotoxy(1,3);
printf(" * * * * * * * * * * * * * *宮子關裏* * * * * * * * * * * *);/*輸出標題*/
gotoxy(1,4);
printf("-Enter @ end-");/*提示輸入@ End */
gotoxy(1,5);
printf(" |-| ");/*輸出表的起始行*/
gotoxy(1,6);
printf(" | no | name | jbgz | ");/*輸出字段標題,註意空格數*/
for(;;)
{
gotoxy(1,7+x);
printf(" |-|-|-| ");/*輸出表格的水平線*/
info=(薪金*)malloc(sizeof(薪金));/*請求錄制空間*/
如果(!信息)
{
printf(" \ n內存不足");/*如果沒有空間,輸出內存溢出信息*/
退出(0);/*退出程序*/
}
信息-& gt;next = NULL/*新節點的後繼節點為空*/
信息-& gt;先驗=空;/*新節點的前置任務為空*/
gotoxy(1,8+x);printf(" | ");/*輸出數據之間的分界線*/
gotoxy(12,8+x);printf(" | ");
gotoxy(29,8+x);printf(" | ");
gotoxy(38,8+x);printf(" | ");
gotoxy(2,8+x);/*將光標移到輸入數字的位置*/
輸入(信息-& gt;否,10);/*輸入數字並驗證長度不超過10*/
if(info-& gt;沒有[0]=='@ ')
{
flag = 1;
打破;
}/*數字的首字符是@ End Input */
gotoxy(13,8+x);/*將光標移動到輸入名稱的位置*/
輸入(信息-& gt;姓名,14);/*輸入名稱,並驗證長度不超過14*/
gotoxy(30,8+x);/*光標進入基本工資崗位*/
scanf("%f ",& amptemp);/*將基本工資輸入臨時變量*/
信息-& gt;jbgz = temp/*基本工資分配*/
信息-& gt;kou Kuan = 0;/*初始扣款為0。輸入*/
信息-& gt;sfgz = 0;/*初次發放工資為0,在計算工資時計算*/
信息-& gt;金水= 0;/*初始稅為0,在計算工資時計算*/
信息-& gt;yfgz = 0;/*初始應付工資為0,在計算工資時計算*/
If(p==NULL)/*如果p為空,則輸入第壹個節點*/
{
First = Last = info/*頭指針和尾指針*/
首先-& gt;先驗=空;/*頭指針的前任為空*/
最後-& gt;next = NULL/*尾指針的後繼指針為空*/
}
Else /*如果插入的節點不是第壹個節點,則插入到頭節點之前*/
{
信息-& gt;next = p;/*新節點的後繼節點指向原來的頭節點*/
信息-& gt;prior=p->先驗;/*新節點的前任指向原始頭節點的前任*/
p->;prior = info/*原始節點的前任指向新節點*/
}
p = info/*新節點成為P節點,臨時頭節點*/
First = info/*新節點成為頭節點*/
x+= 2;/*由於水平線的原因,將光標下移兩行*/
gotoxy(1,8+x);
i++;/*輸入記錄數加上1*/
如果(i%9==0)
打破;/*輸入9條記錄,並在新的壹頁上輸入*/
}
gotoxy(1,8+x);
}
printf(" |-|-|-| ");/*輸出端水平線*/
}
/*字符串輸入和驗證函數*/
輸入(字符*s,整數)
{
char p[255];
做{
scanf("%s ",p);/*輸入字符串*/
if(strlen(p)>count)printf("\n太長!\ n ");/*檢查長度,然後重新輸入*/
}while(strlen(p)>計數);
strcpy(s,p);/*將輸入字符串復制到字符串s */
}
/*顯示鏈接列表*/
無效列表()
{
int i=0,n;/*記錄輸出行數*/
工資* p;/*定義移動指針*/
clr SCR();/*清空屏幕*/
p =第壹;/*從頭指針開始*/
while(I % 10 = = 0 & amp;& ampp!=NULL) /*外環控制頁面變化*/
{
I = 0;/*記錄壹頁的輸出行數*/
clr SCR();/*清空屏幕*/
printf(" \ n \ n \ n ");/*換行三次*/
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *工資* * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");/*輸出標題*/
printf(" | nO | name | jbgz | kou Kuan | yfgz |金水| sfgz | \ n ");/*輸出字段標題*/
printf(" |-|-|-|-|-|-|-|-| \ n ");/*輸出水平線*/
而(p!=NULL) /*當p不為空時*/
{
printf(" | %-10s | %-15s | % 9.2f | % 9.2f | % 9.2f | % 9.2f | % 9.2f | \ n ",
p->;不,p-& gt;姓名,p-& gt;jbgz,p-& gt;寇寬,p-& gt;yfgz,p-& gt;金水,p-& gt;sfgz);
p = p-& gt;接下來;/*指針向後移動*/
i++;/*輸出行數加上1 */
if(i%10==0)
打破;/*如果10行已滿,則跳出內循環*/
}
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * end * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");/*輸出本頁的結束行*/
printf("按任意鍵繼續...\ n ");
getch();/*輸出壹頁並暫停,按任意鍵繼續*/
}/*返回到外部循環,準備下壹頁的輸出*/
}
/*單壹顯示記錄*/
空顯示()
{
int ch/*菜單選項字符*/
工資* p;/*定義臨時指針*/
clr SCR();/*清空屏幕*/
p =第壹;/*從頭指針開始*/
If(p==NULL) /*指針為空,即鏈表為空,主函數*/
{
printf("記錄為空!\ n ");
返回;
}
其他
{
打印(p);/*調用output函數顯示頭節點信息*/
for(;;)/*周期開始*/
{
printf("\n\n0。退出1。前情提要2。下壹個3。前4個。last \ n \ n ");
/*菜單項退出退出上壹個前置任務下壹個後續任務第壹個最後壹個最後壹個*/
printf(" \ n請選擇0 ~ 4:");/*提示菜單選項0~4*/
scanf("%d ",& ampch);/*輸入菜單選項0~4*/
if(ch = = 0)break;/*如果選項為0,則退出*/
switch(ch) /* switch語句根據選項字符*/判斷
{
case 1:p=p->先驗;if(p = = NULL)p = First;打破;/*指向前任,沒有前任指向第壹個*/
情況2:p=p->接下來;if(p = = NULL)p = Last;打破;/*指向後繼,沒有後繼指向最後壹個*/
情況三:p =第壹;打破;/*指向第壹個節點*/
情況4:p =最後;打破;/*指向最後壹個節點*/
}
打印(p);/*調用output函數顯示指針指向的節點信息*/
}
}
}
/*輸出指針指向的節點信息*/
作廢打印(薪資*p)
{
If(p) /*如果指針不為空,顯示信息*/
{
clr SCR();/*清空屏幕*/
printf(" \ n \ n \ n ");/*換行*/
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *工資* * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");/*輸出標題信息*/
printf(" | no | name | jbgz | kou Kuan | yfgz |金水| sfgz | \ n ");/*輸出字段標題*/
printf(" |-|-|-|-|-|-|-|-| \ n ");/*輸出分割線*/
printf(" | %-10s | %-15s | % 9.2f | % 9.2f | % 9.2f | % 9.2f | % 9.2f | \ n ",p-& gt;不,p-& gt;姓名,
p->;jbgz,p-& gt;寇寬,p-& gt;yfgz,p-& gt;金水,p-& gt;sfgz);/*輸出節點信息*/
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * end * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");/*輸出結束標記*/
}
}
/*計算實際工資*/
void calc()
{
int x;/*線坐標*/
int I = 0;/*記錄數量*/
浮動溫度;/*臨時可變扣除*/
工資* p;/*移動指針*/
clr SCR();/*清空屏幕*/
p =第壹;/*從頭指針開始*/
而(p!=NULL) /*當p不為空時,即有記錄時,外循環控制換頁*/
{
x = 0;
clr SCR();
gotoxy(1,3);
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");/*輸出標題*/
gotoxy(1,5);
printf(" |-| ");
gotoxy(1,6);/*輸出下面的字段標題*/
printf(" | no | name | jbgz | kou Kuan | yfgz |金水| sfgz | ");
而(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-& gt;否);/*輸出編號*/
gotoxy(13,8+x);
printf("%-15s ",p->;姓名);/*輸出名稱*/
gotoxy(30,8+x);
printf("%.2f ",p-& gt;jbgz);/*輸出基本工資*/
gotoxy(39,8+x);
scanf("%f ",& amptemp);/*輸入扣除額*/
p->;koukuan = temp/*扣減字段分配*/
p->;yfgz = p-& gt;jbgz-p-& gt;扣款;/*計算應付工資=基本工資-扣除*/
gotoxy(50,8+x);
printf("%.2f ",p-& gt;yfgz);/*應付產出工資*/
gotoxy(59,8+x);
p->;金水=(p-& gt;yfgz-1000)*傳真(p-& gt;yfgz);/*否則按稅率計稅*/
printf("%.2f ",p-& gt;金水);/*出口關稅*/
gotoxy(68,8+x);
p->;sfgz = p-& gt;yfgz-p-& gt;金水;/*計算實際工資*/
printf("%-8.2f ",p->;sfgz);/*輸出實際工資*/
x+= 2;/*線坐標下移兩行*/
i++;/*記錄數加上1*/
if(i%9==0)中斷;/*如果記錄數超過9,將跳出內循環*/
p = p-& gt;接下來;/*指針向後移動,下壹個*/
}
gotoxy(1,7+x);
printf(" |-|-|-|-|-|-|-|-| \ n ");/*輸出結束線*/
printf("按任意鍵繼續...\ n ");
getch();
}
}
/*根據應付工資計算稅率*/
浮點傳真(浮點x)
{
浮點f 1;
if(x & lt;1000)
返回0;/*小於1000,返回0*/
開關((int)(x/1000))
{
案例1:f 1 = 0.05;打破;/*1000~1999,返回0.05*/
情況二:f 1 = 0.1;打破;/*從2000到2999,0.1*/
案例三:f 1 = 0.15;打破;/*3000~3999,返回0.15*/
情況四:f 1 = 0.2;打破;/*4000~4999,返回0.2*/
默認:f 1 = 0.3;打破;/*超過5000,返回0.3*/
}
返回f 1;
}
/*計算優惠券的數量*/
無效計算機()
{
工資* p;
int i=0,a[7]=,t100,t50,t20,t10,t5,t2,t 1;/*設置數組和臨時變量保存的優惠券數量*/
浮動t;/*過渡變量,保存當前剩余工資*/
p =第壹;/*將指針從頭指針移開*/
而(p!=NULL) /*當p不為空時*/
{
t 100 =(int)p->;sfgz/100;/*計算100元的張數*/
a[0]= a[0]+t 100;/*累積並保存*/
t = p-& gt;sfgz-t 100 * 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;/*剩余工資*/
t 10 =(int)(t/10);/*計算10元的張數*/
a[3]= a[3]+t 10;/*累積並保存*/
t = t-t 10 * 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;/*剩余工資*/
t 1 =(int)(t);/*計算1元張*/
a[6]= a[6]+t 1;/*累積並保存*/
p = p-& gt;接下來;/*將指針移回並處理下壹條記錄*/
}
clr SCR();/*清空屏幕*/
printf(" \ n \ n \ n * * * * * * * * * * *票號* * * * * * * * * * * * * * \ n ");/*輸出標題*/
printf("-100-50-20-10-5-2-1-\ n ");
/*輸出工作表標題*/
for(I = 0;我& lt7;i++)
printf("%5d ",a[I]);/*輸出所需張數*/
printf(" \ n ");/*換行*/
}
/*按編號查找記錄*/
薪金*查找(字符*否)
{
工資* p;/*定義移動指針*/
p =第壹;/*從頭指針開始*/
While(p) /*當p不為空時*/
{
如果(!strcmp(否,p-& gt;沒有))
返回p;/*比較相等,搜索成功,指針*/
p = p-& gt;接下來;/*不相等的指針向後移動*/
}
printf("未找到\ n ");/*未找到*/
返回NULL/*返回空指針*/
}