#include<stdlib.h>
#include<stdio.h>
#include<string.h>
struct{
char v[10];
int f;
int k;
}V[100];
struct{
char ss[10];//
int F;
}C[100];//定义结构体数组,用来保存输入的症状类型
void main()
{
int K;
printf("请输入你要进行的操作,1专家诊断,2增加知识,3更新知识库\n");//进行选择要输入的操作
scanf("%d",&K);//输入
getchar();
if(K==1){//如果输入的是1,则进行专家诊断
FILE *fp;//定义一个文件指针
int i,f1;//定义变量
int j=0,j1=0;//定义变量并赋值
int l=0,l1=0;//定义变量并赋值
int m=0,n=0;//定义变量并赋值
int a=0;//定义变量并赋值
char c;
char s[30];
char S[30];
for(i=0;i<100;i++){//循环
V[i].f=0;//给个标志位赋值为0
V[i].k=0;
C[i].F=0;
}
i=0;
printf("请输入您的症状,按!结束\n");//提示
c=getchar();//输入
while(c!='!'){//判断是否输入结束
if(c!='\n') //如果不是回车
C[m].ss[C[m].F++]=c;//把输入的症状存入结构体变量
else
{
C[m].ss[C[m].F++]='\0';//否则在字符串的末尾加字符串结束标志结束字符串输入
m++;//输入症状的个数加1
}
c=getchar();//接受一个字符
}
C[m].ss[C[m].F]='\0';//在输入结束后,在最后一个字符串末尾加字符串结束标志
if((fp=fopen("h","rb"))==NULL)//打开保存症状的文件
{
printf("文件打开出错\n");//如果文件出错,则给出提示
exit(0);
}
for(n=0;n<=m;n++)//循环
{
while(!feof(fp))//当没到文件末尾
{
a=0;//给a赋值为0
c=fgetc(fp);//接收从文件读出的字符
while(c!='!')//当不是维生素结束的标志
{
if(feof(fp))//文件指针在文件末尾
goto l1;//跳出
s[a++]=c;//
c=fgetc(fp);//取一个字符
}
s[a]='\0';//添加字符串结束标志
c=fgetc(fp);//从文件取一个字符
while(c!='#')//当不是症状结束表示时候,继续
{
if(feof(fp))//如果文件指针到达文件末尾
goto l1;//跳出
S[i++]=c;//把从文件中取出的字符赋给数组
c=fgetc(fp);//在从文件取一个字符
}
S[i]='\0';//添加字符川结束标志
if(strcmp(C[n].ss,S)==0)//把输入的症状和从文件中取出的症状进行比较
{ printf("bb");
if(j==0)//如果相等
{
strcpy(V[0].v,s);//把输入的症状暂时存储在数组中
f1=0;//标志为0
j++;//个数加1
//printf("ss");
}
else
for(j1=0;j1<j;j1++)//循环
if(strcmp(V[j1].v,s)==0){//进行比较,如果想等
f1=j1; //把该症状对应的维生素标志赋给f1
//printf("aa");
break;//结束
}
if(j1==j&&f1!=j-1||j1==j&&f1==0){//如果输入的症状和在症状暂存的数组C里没有,则把症状存入该数组
strcpy(V[j].v,s);//字符川赋值
f1=j;//症状想对应的维生素标志
j++; //症状个数加一
//printf("dd");
}
if(n==1){//如果n=1,责结束
printf("\n");//回车
// printf("s=%s\n",s);
}
V[f1].k++;//症状的个数加1
}
i=0;//i重新置0
j1=0;
}
l1:rewind(fp);
}
if(j==0)
printf("信息库中没有你要查找的消息\n");
else
{
for(j1=0;j1<=j;j1++)
if(V[j1].k!=0)//如果V[j1].k!=0,说明在文件里能找到该症状
{
printf("你缺乏的可能是:\n");
printf("维生素:");
printf("%s\n",V[j1].v);
printf("因为缺乏该维生素可能会引起的症状是:");
rewind(fp);//文件指针回到文件头部
while(!feof(fp))//当文件指针不在末尾,则循环读取数据
{
a=0;
i=0;
c=fgetc(fp);//取字符
while(c!='!')//当不是维生素结束的标志
{
if(feof(fp))//如果到文件末尾
break;//退出
s[a++]=c;//把字符赋给数组
c=fgetc(fp);//再次取字符
}
s[a]='\0';//添加字符串结束标志
c=fgetc(fp);//从文件取字符
while(c!='#')//当不是症状结束标志,循环
{
if(feof(fp))//如果到文件末尾
break;//退出
S[i++]=c;//字符赋给数组
c=fgetc(fp);//从文件取字符
}
S[i]='\0';//字符川结束标志
if(strcmp(V[j1].v,s)==0)//把从文件中取出的字符和输入的字符进行比较
//{
for(n=0;n<=m;n++)//循环
if(strcmp(C[n].ss,S)==0)//如果相等
{
printf("“");
printf("%s",S);
printf("”");
}
else printf("%s",S);
printf(" ");
//}
}
}
}
fclose(fp);//关闭文件
}
else if(K==2){//如果选择2
FILE *fp;
int fl=0;
char c;
char C='#';
int i=0;
char v[10];
int f=0;
if((fp=fopen("h","ab"))==NULL)
{
printf("文件打开出错\n");
exit(0);
}
printf("请输入维生素类型,并按!结束\n");
c=getchar();
//c=getchar();
while(c!='!')
{
fputc(c,fp);
v[f++]=c;
c=getchar();
}
fputc('!',fp);
getchar();
fl++;
printf("请输入缺乏该维生素会引起的症状,并按#结束\n");
c=getchar();//接受输入的一个字符
while(c!='#'){//如果输入没有结束
if(c=='\n')//如果输入的是回车,即另一个症状
{
c='#';//在前一个症状结束后在末尾加一个结束标志
fputc(c,fp);//把刚才输入的字符写入文件
for(i=0;i<f;i++)//循环
fputc(v[i],fp);//在每个症状前面输入一个该症状所对应的维生素类型
fputc('!',fp);//维生素结束标志
}
else//如果没有回车,说明输入的症状还没有结束
fputc(c,fp);//继续把字符写入文件
c=getchar();//继续取字符
}
fputc('#',fp);//如果输入的症状结束,则把结束标志送到症状末尾
fclose(fp);//关闭文件
}
else if(K==3)//选择3
{
FILE *fp;
int fl=0;
char c;
char C='#';
int i=0;
char v[10];
int f=0;
if(fl==0)
printf("知识库中没有任何信息,请输入:\n");
if((fp=fopen("h","wb"))==NULL)
{
printf("文件打开出错\n");
exit(0);
}
printf("请输入维生素类型,并按!结束\n");
c=getchar();
while(c!='!')//当没有结束输入
{
fputc(c,fp);//把字符一个个写到文件
v[f++]=c;
c=getchar();//接收一个字符
}
fputc('!',fp);//在维生素结束的末尾加一个结束标志!
getchar();//接受回车键
fl++;//文件里的记录个数加1
printf("请输入缺乏该维生素会引起的症状,并按#结束\n");
c=getchar();//接收一个字符
while(c!='#'){//如果输入不结束
if(c=='\n')//如果输入的是回车
{
c='#';//在末尾添加结束标志
fputc(c,fp);//把字符写到文件中
for(i=0;i<f;i++)//循环
fputc(v[i],fp);
fputc('!',fp);//写入字符结束标志
}
else
fputc(c,fp);//如果输入没结束,直接把字符写到文件
c=getchar();//继续接受字符
}
fputc('#',fp);//在文件末尾添加一个症状结束标志
fclose(fp);//关闭文件
}
}
评论13
最新资源