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 + -
显示快捷键?