fun_save_expression.cpp
来自「本程序是完成一个函数计算器的功能,通过输入表达式,然输入表达的未知数,则可以计算」· C++ 代码 · 共 161 行
CPP
161 行
#include "head.h"
extern FILE *fp;
extern expression expre;
/* 从指定文件读入一个公式 */
int ReadExpression(FILE *fpt,expression *rpt)
{
char buf[BUFLEN];
if (fscanf(fpt,"%d",&(rpt->g_iNumber)) !=1 ) //从指定文件中读取数字内容到rpt->g_iNumber中
return 0;
fscanf(fpt,"%s",buf) ;
memcpy(rpt->p_Expression,buf,MAX); //从指定文件中读取字符串到rpt->p_Exprssion中
return 1;
}
/* 对指定文件写入一个公式*/
void WriteExpression(FILE *fpt,expression *rpt)
{
fprintf(fpt , "%d " , rpt->g_iNumber) ; //把rpt->g_iNumber写入到ftp所指定的文件中
fprintf(fpt,"%s\n",rpt->p_Expression) ; //把rpt->p_Expression写入到ftp所指定的文件中
return ;
}
/* 显示一个公式 */
void DisplayExpression(expression *rpt)
{
printf("%d ",rpt->g_iNumber);
printf(" %s\n",rpt->p_Expression);
}
/* 构造链表 */
listExpression *MakeList(char *fname)
{
listExpression *h,*u,*p;
if((fp=fopen(fname,"r"))==NULL) //指定的文件不存在,结束本函数
{
printf("Can't open file %s.\n",fname);
return NULL;
}
h=NULL;
p=(listExpression *)malloc(sizeof(listExpression)); //为结构体分配内存
p->p_Expression =(char*)malloc(50);
while(ReadExpression(fp,(expression *)p)!=0) //把fp所指定的文件内容存入链表中
{
if(h==NULL)
h=p;
else
u->next=p;
p->next=NULL;
u = p ;
p=(listExpression *)malloc(sizeof(listExpression));
p->p_Expression =(char*)malloc(50);
}
free(p);
fclose(fp);
return h;
}
/*统计文件夹中表达式个数*/
int countExpression(listExpression *node)
{
if(node == NULL)
{
return 0 ;
}
else
{
return(1+countExpression(node->next)) ;
}
}
/*把输入公式链接到链表中*/
void Concatenate(listExpression *a, listExpression *b)
{
if(a->next == NULL)
a->next = b ;
else
Concatenate(a->next , b); //递归调用,把要链接的 b 连接到未尾
}
/*判断输入公式序号是否已存在文件夹中*/
int JudgeExpressionNumber(int no ,FILE *fp)
{
expression s ;
if((fp=fopen(FileName ,"r"))==NULL) // FileName文件不存在,结束本函数
{
printf("Can't open file %s.\n",FileName );
return 0;
}
s.p_Expression = (char*)malloc(50);
while(ReadExpression(fp,&s)!=0) //读取FileName文件中序号为no的文件内容
{
if(s.g_iNumber - no ==0)
{
return 0 ;
}
}
fclose(fp);
return 1;
}
/*保存公式*/
void SaveExpression()
{
expression sigle_expression;
char c;
int s_countExpression = 0 ;
listExpression *p ,*node ,*temp;
if((fp=fopen(FileName ,"r"))==NULL) // 若要打开的文件不存在, 是否创建它
{
printf("The file %s doesn't exit, do you want to creat it? (Y/N)\n>",FileName );
getchar();
c=getchar();
if(c=='Y'||c=='y')
{
fp=fopen(FileName ,"w");
fclose(fp);
}
else
{
return ;
}
}
node = MakeList(FileName ) ; //构造链表node ,把文件FileName 的内容写入到链表中
s_firstStore = countExpression(node) ;
if(s_firstStore == 0) //若第一次写入内容 , 则直接把结构体变expre 保存在FileName中
{
fp=fopen(FileName ,"w");
s_countExpression++ ;
expre.g_iNumber = s_countExpression ;
WriteExpression(fp,&expre);
fclose(fp);
}
else if(s_numberExpression <= 50) // 否则 判断文件中的内容个数是否超出所规定的范围
{
node = MakeList(FileName ) ; //构造链表node ,把文件FileName 的内容写入到链表中
p=(listExpression *)malloc(sizeof(listExpression));
printf("please input the expression number:") ;
scanf("%d" , &s_countExpression);
fp=fopen(FileName ,"r");
while(JudgeExpressionNumber(s_countExpression ,fp) == 0) // 判断文件中公式序号是否与输入的公式序号相同,相同,重新输入,不相同,保存到文件中
{
printf("The expression %d is in the file %s.you should other number\n",s_countExpression,FileName );
printf("please input the expression number again: ") ;
scanf("%d" , &s_countExpression);
}
p->g_iNumber = s_countExpression ;
p->p_Expression = expre.p_Expression;
p->next = NULL ;
Concatenate(node, p); //最后 expre的内容链接到链表未尾
fp=fopen(FileName ,"w");
do
{ //把链表node 中的内容写入到文件FileName 中
sigle_expression.g_iNumber = node->g_iNumber ;
sigle_expression.p_Expression = node->p_Expression ;
WriteExpression(fp,&sigle_expression);
temp = node->next;
node =temp ;
} while(node !=NULL) ; //while(node !=NULL);
fclose(fp); // 关闭文件
}
else
{
return ;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?