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;
}