搜档网
当前位置:搜档网 › 用C语言编写的简易计算器

用C语言编写的简易计算器

#include
#include
#include

/* 变量的声明 */
#define EXP_NUM 100 //表达式字符串的长度
#define DATA_NUM 50 //计算对象的个数

char exp[EXP_NUM]; //输入字符串存储区
double data[DATA_NUM]; //运算对象存储区
int data_size; //运算对象的实际个数存储区
char ch[DATA_NUM]; //运算符号存储区
int ch_size; //运算符号的实际个数存储区
char ReCal; //判断再次计算的状态存储区

/* 其他子函数 的声明 */
void Hint() //软件头提示函数
{
printf("**********请输入您所需要运算的表达式**********\n");
printf("********** 如: a+b-c*d/e= **********\n");
printf("计 算:");
}

void InPut() //表达式输入函数
{
scanf("%s",exp);
}

unsigned int InPutTest()
{
int i = 0;

switch(exp[0]) //检测首字符是否为数字,如不是,则视为不合法
{
case'+':
case'-':
case'*':
case'/':
case'=':
case'.': return 0; //首字符不为数字,视为不合法则输出0,退出函数
default: break;
}

for( i=0; exp[i]!='\0'; i++)
{ //检测输入表达式是否有连续的运算符号,如有则报错
if( exp[i]=='+' && ( exp[i+1]=='+' || exp[i+1]=='-' || exp[i+1]=='*' || exp[i+1]=='/' || exp[i+1]=='.' || exp[i+1]=='='))
return 0;
if( exp[i]=='-' && ( exp[i+1]=='+' || exp[i+1]=='-' || exp[i+1]=='*' || exp[i+1]=='/' || exp[i+1]=='.' || exp[i+1]=='='))
return 0;
if( exp[i]=='*' && ( exp[i+1]=='+' || exp[i+1]=='-' || exp[i+1]=='*' || exp[i+1]=='/' || exp[i+1]=='.' || exp[i+1]=='='))
return 0;
if( exp[i]=='/' && ( exp[i+1]=='+' || exp[i+1]=='-' || exp[i+1]=='*' || exp[i+1]=='/' || exp[i+1]=='.' || exp[i+1]=='='))
return 0;
if( exp[i]=='.' && ( exp[i+1]=='+' || exp[i+1]=='-' || exp[i+1]=='*' || exp[i+1]=='/' || exp[i+1]=='.' || exp[i+1]=='='))
return 0;

if( exp[i] == '.') //检测输入表达式的运算对象中是否有多个小数点,如有则报错
{
int j = i;
while( exp[j]!='+' && exp[j]!='-' && exp[j]!='*' && exp[j]!='/' && exp[j]!='=')
{
j++;
if( exp[j] == '.')
return 0;
}
}
}

for( i=0; exp[i]!='\0'; i++) //限定输入的合法字符为 +-*/.0123456789=
{
switch(exp[i])
{
case'+':
case'-':
case'*':
case'/':
case'=':
case'.':
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9': break;
default: return 0; //不合法则输出0,退出函数
}
}

for( i=0; exp[i]!='\0'; i++) //检测等号后面是否有字符,有则为非法,没有则为合法
{
if(exp[i]=='=' && exp[i+1]!='\0')
return 0; //等号 后面还有字符,不合法则输出0,退出函数
}

if(exp[i-1]!='=')
return 0; //等号 不在最后,不合法则输出0,退出函数

return 1; //合法则输出1,退

出函数
}

void HintAgain() //输入错误,重新输入提示
{
printf("******** 输入格式不正确,请重新输入。 *******\n");
printf("******** 如: a+b-c*d/e= *******\n");
printf("计 算:");
}

// DataProcessing
unsigned int DataStore() //将输入的表达式中的运算对象逐个存入实数存储区data
{ //同时返回运算对象的数量
int i = 0, j = 0;

for( i=0; exp[j]!='\0'; i++)
{
char temp[DATA_NUM] = {'\0'}; //临时存放单个运算对象字符串
int k = 0;

while((exp[j]>='0' && exp[j]<='9') || exp[j]=='.')
{
temp[k] = exp[j]; //将单个运算对象字符串存入temp
j++;
k++;
}

data[i] = atof(temp); //利用系统函数atof()将字符串转换成实数

j++; //每存入一个对象跳过一个符号位,准备下存放一个对象
}

return i; //返回运算对象的数量
}

unsigned int ChStore() //将输入的表达式中的运算符号逐个存入符号存储区ch
{ //同时返回运算符号的数量
int i = 0, j = 0;

for( i=0; exp[i]!='\0'; i++)
{
if( exp[i]=='+' ||
exp[i]=='-' ||
exp[i]=='*' ||
exp[i]=='/' ||
exp[i]=='=' ) //只有+-*/=才被存入
{
ch[j] = exp[i]; //将单个运算对象字符串存入ch
j++; //每存入一个符号,j自加1,准备下存放一个符号
}
}

return j; //返回运算符号的数量
}

void DeleteData( double *pdata, int num) //删除data中的第num个元素,后面的元素自动补齐
{
while( num < data_size)
{
*(data+num) = *(data+num+1);
num++;
}

data_size --;
}

void DeleteCh( char *pch, int num) //删除ch中的第num个元素,后面的元素自动补齐
{
while( num < ch_size)
{
*(pch+num) = *(pch+num+1);
num++;
}

ch_size --;
}

unsigned int DivisorTest() //判断除数是否为0,若是0,则返回1,若不是,则返回0
{
int i = 0;
for( i=0; ch[i]!='\0'; i++)
{
if( ch[i]=='/' && data[i+1]==0)
return 1;
}
return 0;
}

void Calculator( double *pdata, char *pch, int *pch_size)
{
int i = 0;
for( i=0; i < *pch_size; i++)
{
if( *(ch+i)=='*' || *(ch+i)=='/')
{
switch(*(ch+i))
{
case'*':
{
*(data+i+1) = *(data+i) * *(data+i+1);
DeleteData( data, i);
DeleteCh( ch, i);
i--;
}
break;
case'/':
{
*(data+i+1) = *(data+i) / *(data+i+1);
DeleteData( data, i);
DeleteCh( ch, i);
i--;
}
break;
}
}
}

for( i=0; i < *pch_size; i++)
{
if( *(ch+i)=='+' || *(ch+i)=='-')
{
switch(*(ch+i))
{
case'+':
{
*(data+i+1) = *(data+i) + *(data+i+1);
DeleteData( data, i);
DeleteCh( ch, i);
i--;
}
break;
case'-':
{
*(data+i+1) = *(data+i) - *(data+i+1);
DeleteData( data, i);
DeleteCh( ch, i);
i--;

}
break;
}
}
}
}

void OutPut()
{
printf("结果是:%f\n", data[0]); //输出结果
printf("****按 Y 键再次计算; 按其他键退出程序。****\n"); //提示用户选择
ReCal = getche(); //查看用户的选择
printf("\n");
}

void main()
{
printf("**********************************************\n"); //分界线
do
{
Hint(); //输入提示
InPut(); //输入表达式
data_size = DataStore();
ch_size = ChStore();
while( !InPutTest() || DivisorTest()) //判断输入是否合法
{
HintAgain(); //再次提示
InPut();
data_size = DataStore();
ch_size = ChStore();
}
Calculator( data, ch, &ch_size);
OutPut();
}
while( ReCal=='y'|| ReCal=='Y'); //如果用户按下的是 Y 键,则再次计算;其他键则退出程序
printf("********** 谢谢使用! **********"); //结束语
}

相关主题