www.pudn.com > cghost.rar > GUANLIPR.C


#include "stdlib.h" 
#include "stdio.h" 
#include "dos.h" 
#define KMAX 70 
#define KNMAX 22 
#define KOPMAX 15 
#define IFNMAX 22 
/*fg型结构表示费用子项结点*/ 
struct fg{ 
char n[IFNMAX];/*费用子项名称*/ 
struct fg *p;/*指向下一费用子项的指针*/ 
}r1; 
/*rule型结构表示费用项目结点*/ 
struct rule{ 
char n[KNMAX];/*费用项目名称*/ 
char op[KOPMAX];/*四则运算符号集*/ 
struct fg *p;/*指向第一费用子项的指针*/ 
}r; 
struct rule kbase[KMAX];/*rule型结构数组存放所有算式*/ 
/*********/ 
FILE *fp,*fp2,*fopen(); 
int k_pos=-1; 
/*********/ 
main() 
{ 
char ch,nn[38],menu(); 
cls(); 
goto_xy(4,0); 
printf("\t\t\t国外建筑工程投标报价\n"); 
printf("\t\t\t数据与知识库管理系统\n\n"); 
printf("\n\n\n\n\n\n\t\t\t西南交通大学土木学院张延\n\n"); 
printf("\t\t\t     1997.07.22"); 
goto_xy(22,35); 
printf("\07"); 
if((ch=getche())=='q')exit(1); 
do{ 
ch=menu(); 
switch(ch){ 
case'1':manager(); 
} 
}while(ch!='x'); 
} 
/***********************/ 
char menu() 
{ 
char ch; 
cls(); 
goto_xy(0,0); 
printf("\n\n\n\n\t本系统出入口:\n\n\n"); 
printf("\t1.      知识库系统\n"); 
printf("\tx.      退出本系统\n"); 
printf("\n"); 
do{ 
printf("\t请按号选:");ch=tolower(getche()); 
}while(!is_in(ch,"1x")); 
printf("\n"); 
return(ch); 
} 
/**********************/ 
manager() 
{ 
char ch; 
do{ 
ch=k_menu(); 
switch(ch){ 
case 'a':k_enter(0); 
	 break; 
case 'b':k_save(); 
	 break; 
case 'c':k_load(); 
	 break; 
	 } 
}while(ch!='x'); 
} 
k_menu() 
{ 
char ch; 
cls(); 
goto_xy(5,0); 
printf("\t本系统有如下功能:\n\n"); 
printf("\ta. 输入计算公式\n"); 
printf("\tb. 存入计算公式\n"); 
printf("\tc. 装入计算公式\n"); 
printf("\tx. 退出本系统\n\n"); 
do{ 
printf("\t按英文字母选择:"); 
ch=tolower(getche()); 
}while(!is_in(ch,"abcx")); 
return(ch); 
} 
/****************************/ 
goto_xy(int row,int col) 
{ 
union REGS r; 
r.h.ah=2; 
r.h.bh=0; 
r.h.dh=row; 
r.h.dl=col; 
int86(0x10,&r,&r); 
} 
/************/ 
cls() 
{ 
union REGS r; 
r.x.ax=0x0600; 
r.x.bx=0x1700; 
r.x.cx=0x0000; 
r.x.dx=0x184f; 
int86(0x10,&r,&r); 
} 
is_in(ch,s) 
char ch,*s; 
{ 
while(*s) 
if(ch==*s++)return(1); 
return(0); 
} 
/**************************/ 
k_enter(t) 
int t; 
{ 
int j; 
struct fg *p,*oldp; 
cls(); 
goto_xy(0,0); 
printf("\t\t请输入计算公式\n\n"); 
for(;;){ 
t++; 
cls(); 
goto_xy(3,0); 
if(t>=KMAX){printf("计算公式太多了!\n");return;} 
printf("\t第%d种费用项目:",t); 
gets(kbase[t].n); 
if(!*kbase[t].n)break; 
printf("\t请输入运算符号:"); 
gets(kbase[t].op); 
p=(struct fg *)malloc(sizeof(r1)); 
if(p->p=='\0'){printf("内存已用光!\n");return;} 
kbase[t].p=p; 
j=1; 
for(;;){ 
printf("\t第%d个费用子项:",j++); 
gets(p->n); 
if(!*p->n)break; 
oldp=p; 
p->p=(struct fg *)malloc(sizeof(r1)); 
if(p->p=='\0'){printf("内存已用光!\n");return;} 
p=p->p; 
} 
oldp->p='\0'; 
} 
k_pos=t-1; 
} 
/***************************/ 
k_save() 
{ 
int t; 
struct fg *p; 
if((fp=fopen("rule.kbm","w"))==0){ 
printf("文件不能打开!\n");return;} 
printf("\t正在存入计算规则库!\n"); 
for(t=0;t<=k_pos;++t){ 
fprintf(fp,"%s%s\n",kbase[t].n,kbase[t].op); 
p=kbase[t].p; 
while(p){ 
fprintf(fp,"%s\n",p->n); 
p=p->p; 
} 
fprintf(fp,"@@@"); 
} 
fclose(fp); 
} 
/******************************/ 
k_load() 
{ 
int t; 
struct fg *p,*oldp; 
if((fp2=fopen("rule.kbm","r"))==0)return(-1); 
cls(); 
goto_xy(8,0); 
printf("\t正在装入计算规则!\n"); 
t=0; 
while(fscanf(fp2,"%s%s",kbase[t].n,kbase[t].op)!=EOF){ 
kbase[t].p=(struct fg *)malloc(sizeof(r1)); 
p=kbase[t].p; 
if(!p){printf("内存已用光!\n");return;} 
for(;;){ 
fscanf(fp2,"%s",p->n); 
if(!strcmp(p->n,"@@@")){ 
oldp->p='\0'; 
break; 
} 
p->p=(struct fg*)malloc(sizeof(r1)); 
if(!p){printf("内存已用光!\n");return;} 
oldp=p; 
p=p->p; 
} 
t++; 
} 
delay(500); 
printf("数据库装入完毕,按任意健返回\n"); 
getch(); 
fclose(fp2); 
k_pos=t-1; 
}