C语言编写的四则运算器

C语言编写的四则运算器
C语言编写的四则运算器

/* =============================================== */

/* 头文件声明*/

#include /* In Out printf().. */

#include /* pow(M,n) 开M^n */

#include /* strcpy... */

#include /* atof... */

#include /* getch()... */

#define Max 256 /* 表达式长度定义,可以在这里调节*/

/* =============================================== */

/* 函数声明*/

/* 计算字符串(不带括号的),计算的核心部分*/

char *Calculate_f(char *chpString);

/* 主操作过程,输入式子串,返回double 型结果*/

double Operation(char *chpString);

/* Source1、Source2 加起来到Destination 中*/

char *AddStrings_f(char *chpDestination, char *chpSource1, char *chpSource2);

/* 寻找char_to_find 在Source 中的位置,后移一位*/

int FindChar(char *chpSource, char chCharToFind);

/* 获取字符串的长度*/

int Len_f(char *chpSource);

/* 将Source 左边Length 个字符放在Destination 中*/

char *Left_f(char *chpSource, char *chpDestination, int nLength);

/* 将Source 右边Length 个字符放在Destination 中*/

char *Right_f(char *chpSource, char *chpDestination, int nLength) ;

/* 将Source 中从Start 开始Length 长度的字符串截下来放在Destination 中*/ char *Midstr_f(char *chpSource, char *chpDestination, int nStart, int nLength);

/* 在字符串中删除一个字符del '+' */

void DelChar(char *chpString,int sPos);

/* 在字符串中插入一个字符*/

int InsChar(char *chpString,int sPos,char sChar);

/* 替换字符串中的某个字符*/

void StrReplace(char *chpString,char strOld ,char strNew);

/* 将实数值变为字符串*/

char *Str_f(double nValue, char *chpDestination);

/* 计算字符串的值,返回实数值*/

double Val_f(char *chpSource) ;

/* =============================================== */

/* 主菜单... */

int Menu_Sel();

/* 手工输入表达式求值*/

int Do_Press();

/* 文件导入表达式求值*/

int Do_File();

/* 文件检查0 重新输入,1 继续*/

int FileChk(char *FN);

/* 式子的合法性检查0 含有非法字符,1 正常2 关系运算*/

int StrChk(char *chpSource);

/* 关系运算*/

int Nexus(char strIn[]);

/* =============================================== */

/* 全局变量声明*/

int Debug=1; /* 调试信息显示开关0 不显示,1 显示*/

char *TF_Info[3]={"FALSE","TURE","Error"}; /* 关系运算信息*/

/* 将Source 左边Length 个字符放在Destination 中*/

char *Left_f(char *chpSource, char *chpDestination, int nLength)

{

*(chpDestination+ --nLength+1)=0; /* 设置目标字符串最后一个为NULL*/

while (nLength>=0) /* 直到目标字符串的最后一个*/

{

*(chpDestination+nLength)=*(chpSource+nLength--);

}

return chpDestination;

}

/* 将Source 中从Start 开始Length 长度的字符串截下来放在Destination 中*/

char *Midstr_f(char *chpSource, char *chpDestination, int nStart, int nLength)

{

chpSource+=nStart-1; /* 设置源起点*/

*(chpDestination+--nLength+1)=0; /* 设置目标字符串最后一个为NULL */

while (nLength>=0) /* 直到目标字符串的最后一个*/

{

*(chpDestination+nLength)=*(chpSource+nLength--);

}

return chpDestination;

}

/* 将Source 右边Length 个字符放在Destination 中*/

char *Right_f(char *chpSource, char *chpDestination, int nLength)

{

while (*chpSource != 0)

{

chpSource++;

} /* 将源指针移到最后*/

chpSource-=nLength; /* 将源指针跳到开始复制点*/ *(chpDestination+--nLength+1)=0; /* 设置目标字符串最后一个为NULL */

while (nLength>=0) /* 直到目标字符串的最后一个*/

{

*(chpDestination+nLength)=*(chpSource+nLength--);

}

return chpDestination;

}

/* 在字符串中删除一个字符del '+' */

void DelChar(char *chpString,int sPos)

{

char sBuf[Max];

int nCount;

strcpy(sBuf,chpString);

for(nCount=sPos;sBuf[nCount];nCount++)

{

sBuf[nCount]=sBuf[nCount+1];

}

strcpy(chpString,sBuf);

}

/* 在字符串中插入一个字符*/

int InsChar(char *chpString,int sPos,char sChar)

{

char sBuf[Max];

int iLen;

int nCount;

strcpy(sBuf,chpString);

iLen=strlen(sBuf);

if(iLen

{

sBuf[iLen+1]='/0';

for(nCount=iLen;nCount>=sPos;nCount--)

{

sBuf[nCount+1]=sBuf[nCount];

}

sBuf[sPos]=sChar;

strcpy(chpString,sBuf);

}

else

return 0;

return 1;

}

/* 替换字符串中的某个字符'#' to '-' */

void StrReplace(char *chpString,char strOld ,char strNew)

{

char sBuf[Max];

int nCount=0;

strcpy(sBuf,chpString);

while(sBuf[nCount])

{

if (sBuf[nCount]==strOld) sBuf[nCount]=strNew;

nCount++;

}

strcpy(chpString,sBuf);

}

/* 寻找char_to_find 在Source 中的位置,后移一位*/

int FindChar(char *chpSource, char chCharToFind)

{

int nPos=0;

while(*(chpSource+nPos)!=0) /* 直到目标字符串的最后一个*/ {

if (chCharToFind == *(chpSource+nPos++)) /* 比较.. */

{

return nPos; /* 返回第一个出现点,加一*/ }

}

return 0;

}

/* 获取字符串的长度*/

int Len_f(char *chpSource)

{

int nRetval=0; /* 初始化长度*/

while (*(chpSource+nRetval++)!=0){} /* 移动指针到Null */

return --nRetval;

}

/* 将实数值变为字符串*/

char *Str_f(double nValue, char *chpDestination)

{

char strTmp[Max];

gcvt(nValue,sizeof(double)+1,strTmp); /* 实数值转字符串*/

if(strTmp[0]=='-') /* 将'-' 负号转译为'#' */

{

strTmp[0]='#';

}

strcpy(chpDestination,strTmp);

if(Debug) printf("...Conversion Double to String:%f - >%s\n",nValue,chpDestination);

return chpDestination;

}

/* Source1、Source2 加起来到Destination 中*/

char *AddStrings_f(char *chpDestination, char *chpSource1, char *chpSource2)

{

char *chpTempdest=chpDestination;

while(*chpSource1!=0) /* 先把chpSource1 放入chpDestination */

{

*(chpTempdest++)=*(chpSource1++);

}

while(*chpSource2!=0) /* 在chpDestination 后继续写入chpSource2 */

{

*(chpTempdest++)=*(chpSource2++);

}

*chpTempdest=0; /* 指针位置归零*/

return chpDestination;

}

/* 计算字符串的值,返回实数值*/

double Val_f(char *chpSource)

{

double nResult=0.;

char strTmp[Max];

strcpy(strTmp,chpSource);

if(strTmp[0]=='#') /* 将'#' 转译为'-' 负号*/

{

strTmp[0]='-';

}

nResult=atof(strTmp); /* 字符串转为实数*/

if(Debug) printf("...Conversion String to Double:%s -> %s -> %f\n",chpSource,strTmp,nResult);

return nResult;

}

/* 计算字符串(不带括号的),计算的核心部分*/

char *Calculate_f(char *chpString)

{

char szBuf1[Max], szBuf2[Max], szBuf3[Max], szBuf4[Max], szBuf5[Max]; /* buffers for string handlers */

char sOps[2][4]={"^*+","^/-"}; /* 符号优先级问题已经解决*/

double nLeftnr; /* 操作符左边的结果*/

double nRightnr; /* 操作符右边的结果*/

double nResult; /* 表达式的结果*/

int nOppos; /* 操作符的位置+1 */

int nOppos2;

int nOp=0; /* 用哪一个同级的操作符*/

int nCount; /* 长度计数,就是两个操作符间的内容的长度*/

int nPosInOpstr; /* 操作符索引*/

if(Debug) printf("\n...Starting Calculate, The Parameter is:%s\n", chpString );

for (nPosInOpstr=0; nPosInOpstr<3; nPosInOpstr++) /* 同级关系运算符问题,有待解决*/

{ /* szOpstr 中操作符的顺序就是优先级顺序*/

while

(FindChar(chpString,sOps[0][nPosInOpstr])!=0||FindChar(chpString,sOps[1][nPosInOpstr])!=0)

/* 寻找五种符号,当找不到就退出*/

{ /* 提取左边的操作数计算*/ nOppos=FindChar(chpString,sOps[0][nPosInOpstr]); /* 行0 找到操作符的位置,+1 */

nOppos2=FindChar(chpString,sOps[1][nPosInOpstr]); /* 行1 找到操作符的位置,+1 */

if(Debug) printf("...Operator Priority Level:nOppos=%d nOppos2=%d nOp=",nOppos,nOppos2);

if(nOppos==0) /* 取靠前的,0 是个问题,跳过... */

{

nOp=1;

nOppos=nOppos2;

}

else if(nOppos2==0)

{

nOp=0;

}

else if(nOppos>nOppos2)

{

nOp=1;

nOppos=nOppos2;

}

else nOp=0;

if(Debug) printf("%d\n",nOp);

for (nCount=nOppos-2; nCount>=0; nCount--) /* 向左边查找操作符*/

{

if

((*(chpString+nCount)=='+')||(*(chpString+nCount)=='/')||(*(chpString+nCount)=='-')||(*(chpStr ing+nCount)=='*')||(*(chpString+nCount)=='^'))

{

if

((nCount>1)&&((*(chpString+nCount-1)=='e')||(*(chpString+nCount-1)=='E')||(*(chpString+nCou nt-1)=='^'))) continue; /* 注意1e-1 等,'-' 并不是单独的操作符*/

nLeftnr=Val_f(Midstr_f(chpString,&szBuf1[0], nCount+2, nOppos-nCount-2)); /* 符号左边的字符串变为数值*/

nCount=-1;

}

else if (nCount==0) /* 如果从头开始复制... */

{

nLeftnr=Val_f(Left_f(chpString,&szBuf1[0],nOppos-1));

}

}

if(Debug) printf("...Left Operand:%f\n",nLeftnr);

/* 提取右边的操作数计算*/ for (nCount=nOppos;nCount

{

if

((*(chpString+nCount)=='+')||(*(chpString+nCount)=='/')||(*(chpString+nCount)=='-')||(*(chpStr ing+nCount)=='*')||(*(chpString+nCount)=='^'))

{

if

((*(chpString+nCount-1)=='e')||(*(chpString+nCount-1)=='E')||(*(chpString+nCount-1)=='^')) continue; /* 注意1e-1 等,'-' 并不是单独的操作符*/

nRightnr=Val_f(Midstr_f(chpString,&szBuf2[0],nOppos+1,nCount-nOppos)); /* 符号右边的字符串变为数值*/

nCount=Len_f(chpString);

}

else if (nCount==Len_f(chpString)-1)

{

nRightnr=Val_f(Right_f(chpString,&szBuf2[0],Len_f(chpString)-nOppos));

}

}

if(Debug) printf("...Right Operand:%f\n",nRightnr);

/* 计算*/

if (sOps[nOp][nPosInOpstr]=='+') /* 加*/

{ nResult=nLeftnr+nRightnr; }

else if (sOps[nOp][nPosInOpstr]=='-') /* 减*/

{ nResult=nLeftnr-nRightnr; }

else if (sOps[nOp][nPosInOpstr]=='/') /* 除*/

{ nResult=nLeftnr/nRightnr; }

else if (sOps[nOp][nPosInOpstr]=='*') /* 乘*/

{ nResult=nLeftnr*nRightnr; }

else if (sOps[nOp][nPosInOpstr]=='^') /* 次方/开方*/

{ nResult=pow(nLeftnr,nRightnr);}

/* 组建新的字符串*/

/* 格式AddStrings_f(目标,源1,源2) */

AddStrings_f(&szBuf3[0],

Left_f(chpString,&szBuf4[0],nOppos-Len_f(&szBuf1[0])-1), Str_f(nResult,&szBuf5[0]));

AddStrings_f(chpString,

&szBuf3[0],Right_f(chpString,&szBuf5[0],Len_f(chpString)-nOppos-Len_f(&szBuf2[0])));

if(Debug) printf( "...Scaning:%c,Find:%f%c%f/n...Calculate to a New String:%s/n/n",

sOps[nOp][nPosInOpstr], nLeftnr,sOps[nOp][nPosInOpstr], nRightnr,chpString );

}

}

if(Debug) printf( "...Finish Calculate, The Result is: %s\n\n", chpString);

return chpString;

}

/* 主操作过程,输入式子串,返回double 型结果,起着移除括号的重任*/

double Operation(char *chpString)

{

char szStrn[Max],szBuf1[Max],szBuf2[Max],szBuf3[Max],szBuf4[Max];

int nCount, nLastOpen;

strcpy(szStrn,chpString);

if(Debug) printf( "\n...Starting Bracket Removal Loop...\n");

while(FindChar(&szStrn[0],'('))

{

for (nCount=0; nCount<=Len_f(&szStrn[0]); nCount++) /* 不断地查找配对的括号... */

{

if (szStrn[nCount]=='(') /* 起始括号*/

{

nLastOpen=nCount; /* 最近一个'(' ,是指最接近')' 的那个,使之配对*/

}

if (szStrn[nCount]==')') /* 如果最近有一个配对的括号,就进入计算*/

{ /* 将括号内的字符串打印出来*/

if(Debug) printf("...In %s Find %s, Calling Calculate Unit...\n",szStrn,Midstr_f(&szStrn[0],&szBuf1[0],nLastOpen+2,nCount-nLastOpen-1));

/* 将括号中的结果计算出来,连同括号左边的字符串形成新的字符串放入缓冲区,再与括号右边的字符串形成新的字符串*/

/* 复合形式...有点难看懂.. 和Calculate_f 中的基本一样*/

AddStrings_f(&szStrn[0],AddStrings_f(&szBuf1[0],Left_f(&szStrn[0],&szBuf3[0],nLastOpen),

Calculate_f(Midstr_f(&szStrn[0],&szBuf4[0],nLastOpen+2,nCount-nLastOpen-1))),

Right_f(&szStrn[0],&szBuf2[0],Len_f(&szStrn[0])-nCount-1));

if(Debug) printf("...New String: %s\n", szStrn);

nCount=Len_f(&szStrn[0])+1; /* 移动当前指向... */

}

}

}

if(Debug) printf("...Brackets Removed, Final String is:%s, Calculating...\n", szStrn);

/* 计算剩余的式子*/ Calculate_f(&szStrn[0]);

if (szStrn[0] == 0)

{

szStrn[0]='0';

szStrn[1]=0;

}

if(Debug) printf("...Finish Expression Calculate.\n");

return Val_f(szStrn); /* 返回计算结果*/

}

/* 式子的合法性检查0 含有非法字符,1 正常2 关系运算*/

int StrChk(char *chpSource)

{

char strIn[Max]; /* 源*/

char strTmp; /* 单个字符*/

int nCount=0;

int LB=0,RB=0; /* 括号计数变量*/

int nNexus=0;

int iLen;

strcpy(strIn,chpSource);

iLen=strlen(strIn);

/* 开头符号合法性检查*/

strTmp=strIn[0];

if(strTmp=='+') /* 移除多余的'+' */

{

DelChar(strIn,0);

iLen--;

}

if(strTmp=='*'||strTmp=='/'||strTmp=='e'||strTmp=='E'||strTmp=='^'||strTmp==')'||strTmp=='=' ||strTmp=='>'||strTmp=='<')

{

printf("In %s Head Find Illegal Char:%c,",strIn,strTmp); /* 其实可以去掉非法字符在判断的... */

return 0;

} /* 返回错误信息*/

/* 结尾符号合法性检查*/

strTmp=strIn[strlen(strIn)-1];

if((strTmp>='0'&&strTmp<='9')||strTmp==')'); /* 注意,有个分号的*/

else

{

printf("In %s End Find Illegal Char:%c,",strIn,strTmp); /* 其实可以去掉非法字符在判断的... */

return 0;

}

for(nCount=0;strIn[nCount];nCount++) /* 检查是否有非法字符*/

{

strTmp=strIn[nCount];

if((strTmp>='0'&&strTmp<='9'||strTmp=='+'||strTmp=='-'||strTmp=='*'||strTmp=='/'||strTmp==' .'||strTmp=='e'||strTmp=='E'||

strTmp=='^'||strTmp=='('||strTmp==')'||strTmp=='='||strTmp=='>'||strTmp=='<'||strTmp=='#'|| strTmp=='!'))

{ /* 展示可能出现的字符*/ if(strTmp=='='||strTmp=='>'||strTmp=='<'||strTmp=='!')

{ /* 检查关系操作符*/

if(strTmp!='!') /* != 检查,这样不利于以后的拓展*/

{

nNexus=1; /* Pass */

}

else

{

if (strIn[nCount+1]!='=')

{

printf("In %s Find /'!/',But The Next Char NOT /'=/',",strIn);

return 0;

}

else if (strIn[nCount-1]=='='||strIn[nCount-1]=='>'||strIn[nCount-1]=='<')

{

printf("In %s Find /'!/',But The Previous Char IS /'%c/',",strIn,strIn[nCount-1]);

return 0;

}

}

}

continue;

}

printf("In %s Find Illegal Char:%c,",strIn,strTmp); /* 其实可以去掉非法字符在判断的... */

return 0; /* 返回错误信息*/ }

/* 表达式的修复处理*/

for(nCount=0;strIn[nCount];nCount++)

{

strTmp=strIn[nCount]; /* 括号修复*/

if(strTmp=='('||strTmp==')')

{

if (strTmp=='(') LB++;

else RB++;

if(LB

{

InsChar(strIn,0,'(');

LB++;

nCount++;

iLen++;

if(Debug) printf("...Add a Left Bracket.\n");

}

}

}

LB=0; RB=0; /* 复位很重要,或者重新定义*/

for(nCount=0;strIn[nCount];nCount++)

{

strTmp=strIn[nCount]; /* 括号计数*/

if(strTmp=='(') LB++;

if(strTmp==')') RB++;

}

if (LB!=RB) /* 判断括号的对称性*/

{

if(abs(LB-RB)

{

if(LB>RB) /* 右括号配对*/

{

for(nCount=0;nCount

{

InsChar(strIn,iLen,')'); /* 在最右边插入')' */

iLen++;

}

if(Debug) printf("...The Result of Right Bracket Partnership:%s\n",strIn);

}

else if(LB

{

for(nCount=0;nCount

{

InsChar(strIn,0,'('); /* 在最左边插入'(' */

}

if(Debug) printf("...The Result of Left Bracket Partnership:%s\n",strIn);

}

}

else

{

printf("Bracket NOT Partnership:%s\n",strIn);

return 0;

}

}

/* 补上'(' 前的'*' 以及处理后一个非法字符*/

for(nCount=1;strIn[nCount];nCount++)

{

if (strIn[nCount]=='(')

{

strTmp=strIn[nCount+1]; /* 取后一个字符*/

if(strTmp=='*'||strTmp=='/'||strTmp=='e'||strTmp=='E'||strTmp=='^'||strTmp=='<'||strTmp =='>'||strTmp=='='||strTmp==')')

{

printf("Find Err Operator In:%s,",strIn);

return 0;

}

strTmp=strIn[nCount-1]; /* 取前一个字符*/

if(strTmp>='0'&&strTmp<='9'||strTmp==')')

{

InsChar(strIn,nCount,'*');

nCount++;

if(Debug) printf("...The Result of Plus Operator /'*/':%s\n",strIn);

}

}

}

/* 补上')' 后的'*' */

for(nCount=1;strIn[nCount];nCount++)

{

if (strIn[nCount]==')')

{

strTmp=strIn[nCount-1]; /* 取前一个字符*/

if(strTmp=='*'||strTmp=='/'||strTmp=='e'||strTmp=='E'||strTmp=='^'||strTmp=='<'||strTmp =='>'||strTmp=='='||strTmp=='(')

{

printf("Find Err Operator In:%s,",strIn);

return 0;

}

strTmp=strIn[nCount+1]; /* 取后一个字符*/

if(strTmp>='0'&&strTmp<='9'||strTmp=='(')

{

InsChar(strIn,nCount,'*');

nCount++;

if(Debug) printf("...The Result of Add Operator /'*/':%s\n",strIn);

}

}

}

/* 移除多余的'+' */

for(nCount=1;strIn[nCount];nCount++)

{

if (strIn[nCount]=='+')

{

strTmp=strIn[nCount-1]; /* 取前一个字符,如果是下列字符,这判正号*/

if(strTmp=='+'||strTmp=='-'||strTmp=='*'||strTmp=='/'||strTmp=='e'||strTmp=='E'||strTmp=='^'

||strTmp=='('||strTmp=='<'||strTmp=='>'||strTmp=='=')

{

DelChar(strIn,nCount);

iLen--;

if(Debug) printf("...The Result of Conversion Add /'+/' to /'0/':%s\n",strIn);

strTmp=strIn[nCount+1]; /* 取后一个字符,过滤三重字符-Plus*/

if(strTmp=='+'||strTmp=='-'||strTmp=='*'||strTmp=='/'||strTmp=='e'||strTmp=='E'||strTmp =='^'||strTmp=='('||strTmp=='<'||strTmp=='>'||strTmp=='=')

{

printf("Have Overmany Operator In:%s,",strIn);

return 0;

}

}

}

}

/* 将'-' 负号替换为'#' */

if(strIn[0]=='-') strIn[0]='#';

for(nCount=1;strIn[nCount];nCount++)

{

if (strIn[nCount]=='-')

{

strTmp=strIn[nCount-1]; /* 取前一个字符,如果是下列字符,这判负号*/

if(strTmp=='+'||strTmp=='-'||strTmp=='*'||strTmp=='/'||strTmp=='e'||strTmp=='E'||strTmp=='^'

||strTmp=='('||strTmp=='<'||strTmp=='>'||strTmp=='=')

{

strIn[nCount]='#';

if(Debug) printf("...The Result of Conversion Minus /'-/' to /'#/':%s\n",strIn);

strTmp=strIn[nCount+1]; /* 取后一个字符,过滤三重字符-Plus*/

if(strTmp=='+'||strTmp=='-'||strTmp=='*'||strTmp=='/'||strTmp=='e'||strTmp=='E'||strTmp =='^'||strTmp=='('||strTmp=='<'||strTmp=='>'||strTmp=='=')

{

printf("Have Overmany Operator In:%s,",strIn);

return 0;

}

}

}

}

/* 重叠符号检查*/

for(nCount=1;strIn[nCount];nCount++)

{

strTmp=strIn[nCount];

if (strTmp=='+'||strTmp=='-'||strTmp=='*'||strTmp=='/'||strTmp=='^')

{

strTmp=strIn[nCount+1]; /* 取前一个字符,如果是下列字符,这判负号*/

if(strTmp=='+'||strTmp=='-'||strTmp=='*'||strTmp=='/'||strTmp=='^')

{

printf("Find Double Operator %c and %c,",strIn[nCount],strTmp);

return 0;

}

}

}

strcpy(chpSource,strIn);

return 1+nNexus; /* 通过合法检查*/

}

/* 传说中的主函数*/

int main(int argc, char *argv[])

{

Debug=0; /* Debug 调试开关*/

if (argc>1) /* 调试信息显示开关*/

{

Debug=!strcmp("/debug",argv[1]); /* 设置调试开关参数为/debug */

if(Debug)

{

system("cls");

printf("\n == NOTE ==\n");

printf(" * Debugging Information Has Opened *\n");

printf(" * These Messages Primarily to the Process of Debugging Phase *\n");

printf("* This Information Reflects the Detailed Process of Calculating *\n");

printf(" * NULL *\n");

printf("\n");

}

}

for(;;)

{

switch (Menu_Sel()) /* 返回选择的项目序号*/

{

case 0: case -21:case 'E'-'0': case 'e'-'0':

case 'X'-'0': case 'x'-'0': /* 退出*/

printf("\n Thank You Use \n");

getch();

return 0;

case 1: case 'P'-'0': case 'p'-'0': /* 手工输入*/

Do_Press();

break;

case 2: case 'L'-'0': case 'l'-'0': /* 导入文件*/

Do_File();

break;

case 3: case 'C'-'0': case 'c'-'0': /* 清屏*/

system("cls");

break;

case 20: /* 调试信息显示控制开关,隐藏的*/

if(Debug) /* 由大写的字母'D' */

{

printf("\n************ Debugging Information Are Closed ************\n");

Debug=0;

}

else

{

printf("\n************ Debugging Information Has Opened ************\n");

Debug=1;

}

}

}

}

/* 显示主菜单... */

int Menu_Sel()

{

char Sel;

int MaxItem=3;

printf(" MENU \n");

printf(" ===================================\n");

printf(" | 1.[P]ress an Expression |\n");

printf(" | 2.[L]oad Expression From File |\n");

printf(" | ----------------------------- |\n");

printf(" | 3.[C]lear Screen |\n");

printf(" | 0.[E]xit |\n");

printf(" ===================================\n");

printf(" Press a Key to Continue(0-%d):",MaxItem);

for (;;)

{

Sel=getch();

((Sel<'0'||Sel>MaxItem+'0')&&Sel!='D'&&Sel!='P'&&Sel!='p'&&Sel!='L'&&Sel!='l'&&Sel!='C'&&Sel !='c'&&

Sel!='A'&&Sel!='a'&&Sel!='E'&&Sel!='e'&&Sel!='X'&&Sel!='x'&&Sel!=27) { /* 输入范围检查*/

printf("\nPress Error! Please Retry(0-%d):",MaxItem);

}

else

break;

}

return Sel-'0';

}

/* 手工输入表达式求值*/

int Do_Press()

{

char sel;

int WF=0; /* 文件写入开关*/

char FN[256]; /* 文件名*/

char strExp[Max]; /* 要计算的表达式*/

double strRes; /* 计算结果*/

int TF=0; /* 真假判断*/

int strChk_Re=0;

FILE *fp;

printf("\nWhether Save The Expression and Result to File(Y/N)?");

scanf("%s",&sel); /* 保存到文件*/

if(sel=='Y'||sel=='y')

{

WF=1;

for(;;)

{

printf("Press a File Name for Save Log(Press ` to Exit):");

scanf("%s",FN);

if(FN[0]=='`') /* 设置取消陷阱*/

{

WF=0;

printf("\nYou Cancelled Save Log Operation!\n");

break;

}

if (FileChk(FN)) /* 文件检查*/

{

fp=fopen(FN,"a");

break;

}

}

for(;;)

{

printf("Please Press an Expression(Press a ` to Exit):\n");

scanf("%s",strExp);

if(strExp[0]=='`') break; /* 设置取消陷阱*/

strChk_Re=StrChk(strExp);

if(strChk_Re==0) /* 错误退出*/

{

printf("NO Activate Calculation...\n");

}

else if(strChk_Re==1) /* 表达式计算*/

{

strRes=Operation(strExp);

StrReplace(strExp,'#','-');

if((long int)strRes==strRes) /* 去掉小数点*/

{

if(Debug) printf("...Conversion Double to Long Int.\n");

printf("\n%s=%ld\n",strExp,(long int)strRes);

if(WF) fprintf(fp,"%s=%ld/n",strExp,(long int)strRes);

}

else

{

printf("\n%s=%f\n",strExp,strRes);

if(WF) fprintf(fp,"%s=%f\n",strExp,strRes);

}

}

else /* 表达式关系判断*/

{

TF=Nexus(strExp); /* 调用判断函数判断*/

StrReplace(strExp,'#','-');

printf("\n%s --> %s\n",strExp,TF_Info[TF]);

if(WF) fprintf(fp,"%s --> %s\n",strExp,TF_Info[TF]);

}

getch();

}

if(WF) fclose(fp);

return 0;

}

/* 文件导入表达式求值*/

int Do_File()

{

char iFN[256]; /* 输入文件名*/

char oFN[256]; /* 临时文件名*/

FILE *ifp,*ofp;

double strRes; /* 计算结果*/

char strExp[Max]; /* 读取的字符串,也就是要计算的字符串*/

int TF=0; /* TRUE FALSE Error 索引*/

int OutOther=0; /* 输出到其它文件开关*/ int strChk_Re;

for(;;)

{

printf("\nPlease Press a File Name to Open(Press a ` to Exit):\n"); /* 输入要打开的文件名*/

scanf("%s",iFN);

if(iFN[0]=='`') return 0;

ifp=fopen(iFN,"r");

if(ifp==0) /* 文件存在检查*/

{

printf("File %s NOT Exist or Open Error!\n",iFN);

}

else break;

}

for(;;)

{

printf("\nPlease Press a File Name To Save(Press a ` to Save to %s):\n",iFN); /* 输入要打开的文件名*/

scanf("%s",oFN);

if(oFN[0]=='`')

{

strcpy(oFN,iFN); /* 临时文件名,以及打开它*/

strcat(oFN,".null");

ofp=fopen(oFN,"w");

OutOther=0;

break;

}

else

{

if (FileChk(oFN))

{

ofp=fopen(oFN,"a");

OutOther=1;

break;

}

}

}

while(feof(ifp)==0) /* 如果没有读到文件尾*/ {

fscanf(ifp,"%s\n",strExp); /* 逐行读取文件内容*/

strChk_Re=StrChk(strExp);

if(strChk_Re==0) /* 合法性检查*/

{

printf("Fall Across Illegal Char...\n");

fprintf(ofp,"%s Include Illegal Char, Can't Calculate!/n",strExp);

}

else if(strChk_Re==1) /* 表达式计算*/

{

strRes=Operation(strExp); /* 计算*/

StrReplace(strExp,'#','-');

if((long int)strRes==strRes) /* 去掉小数点及其后的'0' */

{

if(Debug) printf("...Conversion Double to Long Int.\n");

printf("\n%s=%ld\n",strExp,(long int)strRes);

fprintf(ofp,"%s=%ld\n",strExp,(long int)strRes);

}

else

{

printf("\n%s=%f\n",strExp,strRes); /* 屏幕打印*/

fprintf(ofp,"%s=%f\n",strExp,strRes); /* 打印输出到文件*/ }

}

else /* 表达式关系判断*/ {

TF=Nexus(strExp);

StrReplace(strExp,'#','-');

printf("\n%s --> %s\n",strExp,TF_Info[TF]);

fprintf(ofp,"%s --> %s\n",strExp,TF_Info[TF]);

}

}

fclose(ifp); /* 关闭文件*/

fclose(ofp);

if(OutOther)

{

printf("\nFile %s Operation Completed and The Result Save to %s...\n",iFN,oFN); }

else

{

C语言简易计算器的实现

目录 一.课程设计目的 (1) 二.设计环境 (1) 三.设计内容 (1) 四.设计说明 (2) 五.设计程序流程图 (2) 六.调试 (4) (1)错误原因分析一 (4) (2)语法错误 (5) (3)逻辑错误 (5) 七. 调试结果图 (6) 八. 结论与心得体会 (7) 九.附录 (8) 具体代码实现 (8) 十.参考文献 (18)

一.课程设计目的 1.通过一个学期的学习,我认为要学号C语言程序这门课程,不仅要认真阅读课本知识,更重要的是要通过上机实践来巩固我 们的知识,特别是学计算机专业的,我们更应该注重这一环节, 只有这样我们才能成为一个合格的计算机人才。通过这一个课程 设计,进一步来巩固所学的语句,如:循环,和分支结构的运用。还要熟悉四则运算和函数的算法。 2.通过这次课程设计扩展自己的知识面,课本上的东西是远 远不够的,可以通过上网或去图书馆查资料等方式得到一些新的 知识, 3.通过课程设计,加深对课程化设计思想的理解,能进行一 个系统功能分析,并设计一个合理的模块化结构,提高程序开发 能力。 二.设计环境 1.硬件:一台完整的电脑,包括键盘、鼠标,最小硬盘空间1GHz 2.软件:安装有Microsoft visual c++6.0 三.设计内容 以简易计算器为例,通过对简单应用软件计算器的设计,编制、调试,实现

简单的加,减,乘,除等运算,以学习应用MFC库类编写对话框的原理,加深对C++类的学习及应用。 (1)定义一个结构体类型数组,输入0~9及+、--、*等符号的信息,将其信息存入文件中; (2)输入简单的加减乘除算术计算式,并在屏幕上显示计算结果; (3)画出部分模块的流程图; (4)编写代码; (5)程序分析与调试。 四.设计说明 1)包含的功能有:加、减、乘、除运算,开方、平方等功能。 (2)计算器上数字0—9为一个控件数组,加、减、乘、除为一个控件数组,其余为单一的控件。 (3)输入的原始数据、运算中间数据和结果都显示在窗口顶部的同一个标签中。 (4)计算功能基本上是用系统内部函数。 (5)程序可以能自动判断输入数据的正确性,保证不出现多于一个小数点、以0开头等不正常现象。 (6)“CE”按钮可以清除所有已输入的数据从头计算 五.设计程序流程图

c语言程序设计课程计算器设计报告

课程设计说明书 题目计算器程序设计 起讫日期 2006 年 7月 3日至 2006 年 8月 6日 所在院系软件学院 专业机械+软件班级 04-2 学生姓名偶偶哦学号 指导教师 2006年 8 月日

摘要 当今社会是信息社会,科技经济高速发展的社会!为了更方便人们的工作生活和加速人们处理信息的速度,计算器应运而生。由于它体积小巧,携带方便,价格便宜,构造简单等诸多的优点成为人们生活中的必备品! 随着科技的发展计算器的种类变得更多,功能变得更强大,体积变得更小!电脑的出现改变人们的生活习惯,很多事情都可以电脑来完成!电脑的更大一个优点就是可以通过软件的应用无限的延伸电脑功能的外延!下面我们将用我们学习的c语言编写一个简易的计算器程序!实现简单的初步的计算功能! 本程序的编写基础是Tubro 汉化版,它在tubro c的原有基础上实现了多汉字的支持方便了我们的使用。生成的程序可移植性强兼容性好稳定!现在只实现了加、减、乘、除、求幂、求模,求平方根,求Sin,求Cos,求Log10,以及一个时钟原代码。这个系统是基于软件发展的生命周期来研制的,它可以直接输入数学表达式,不需要任何转换,就可以直接输出数学四则运算的结果。但是,每次只能运算一个表达式。不能运算多个表达式。在程序里面在添加一组选择函数即可。本论文主要介绍了本课题的开发背景,开发的过程和所要完成的功能。重点的说明了系统设计思想,设计的步骤、难点技术和解决方案。 关键词:C语言 Tubro c 汉化版计算器时钟

目录 第一章综述 (1) 1.1 课题的现实意义 (1) 1.2 软件环境 (1) 1.3 硬件环境 (1) 第二章系统设计流程图 (2) 2.1 系统流程图 (2) 2.2 主要功能表 (2) 第三章系统分析和设计 (3) 3.1 图形的绘制和输出 (3) 3.2 文本的输出显示 (3) 3.3 计算函数的调用 (4) 3.4 程序的运行和退出 (5) 第四章系统测试 (6) 4.1 系统测试 (6) 4.2 调试 (6) 4.3 错误原因分析一 (6) 4.4 错误原因分析二 (6) 第五章用户使用说明书 (8)

简单的四则运算计算器程序

简单的四则运算计算器程序

注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。 2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。

附件:程序源代码 // sizheyunsuan.cpp : Defines the entry point for the console application. #include #include const int MAX=100; class Operand{ private: double operS; public: Operand(){} Operand(double opers){ operS=opers; } void set(double opers){ operS=opers; } double get() { return operS;} }; class Operator{ private: char operF; int priority; public: Operator(){} Operator(char operf) { operF=operf; switch(operf) { case'(':priority=-1;break; case'+':priority=0;break; case'-':priority=0;break; case'*':priority=1;break; case'/':priority=1;break; case')':priority=2;break; } } void set(char operf){ operF=operf; } char get(){ return operF;} int getpriority(){ return priority; } };

C语言实现计算器功能

实验一多功能计算器 一、问题描述 设计一个多功能计算器,可以完成基本的计算。 设计要求: 1、具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。依次输入第一个运算数、运算符(+,-,*,/)、第二个运算数,然后输出结果。结果可以作为下一个运算的第一运算数。按‘C’清屏,按‘R’返回菜单。 例如:输入:2 + 5 输出:7 2、实现单运算符表达式计算的功能。输入的操作数可以包含整数或浮点数。输入表达式如下: 例如:输入:2+5 输出:7 二、算法说明 1.数据结构说明(可以图示说明,也可以文字说明) 本程序主要根据选择菜单编写了六个自定义函数,用于在main()函数中调用,在main()中,用一个字符变量num1来记录下菜单选项的标号,根据num1的值来决定调用哪个函数。 程序要完成的功能及所要用到的函数如下:

下面就是整个程序的流程图:

2.算法说明(即函数说明) void suanshuyunsuan() //做算术运算时调用的函数 void suanshuyunsuan2() //选择继续做算术运算调用的函数,将上次运算的结果做为下次算术运算的第一个操作数//判断算术运算就是否继续 void panduan() //判断算术运算就是否继续 void biaodashiyunsuan() //单运算符表达式实现函数 void qingping() //清除屏幕 void fanhuicaidan() //显示菜单 三、测试结果(这部分需文字与图示结合) 1.第一组测试用例 (1)测试输入: 测试目的:测试算术运算的功能 结果输出:

(2)再一次输入:1测试目的:测试算术运算就是否能继续 结果输出: (3)这时输入:0 测试目的:退出算术运算 结果输出:

C语言课程设计 简单计算器程序

课程设计名称:C语言课程设计课程设计题目:简单计算器程序

目录 第1章需求分析 (1) 1.1设计要求 (1) 1.2任务 (1) 第2章总体设计 (2) 2.1设计简介及设计方案论述 (2) 2.2功能模块层次图 (2) 第3章详细设计 (3) 3.3由(后缀)逆波兰表达式计算中缀表达式原理 (8) 3.3.1算法描述 (8) 第4章调试分析 (10) 4.1程序设计中所遇到的错误及犯错的原因 (10) 4.2错误的解决方法 (10) 第5章用户手册 (11) 总结 (15) 参考文献 (16) 附录(程序清单) (17)

第1章需求分析 1.1 设计要求 (1)用 C 语言数据结构实现程序设计; (2)利用结构体、栈、进行相关信息处理; (2)系统的各个功能模块要求用函数的形式实现; (4)界面简单,可操作性高。 1.2任务 (1)定义一个结构体类型数组,输入0~9 及+、--、*等符号的信息,将其信息存储起来; (2)输入简单的加减乘除算术计算式,并在屏幕上显示逆波兰(后缀式)表达式和计算结果; (3)编写代码; (4)程序分析与调试。 说明: 本课程设计将实现一个简单计算器。在功能上尽量模仿windows 的计算器。系统界面不做牵制要求。该程序能实现标准型中+、-、*、/、(、)、.、的混合运算表达式(一般意义上的中缀表达式),将其转换成逆序波兰表达式(后缀表达式)并计算输出结果。在进行运算后可以选择继续运算或者结束当前运算。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。

第2章 总体设计 2.1设计简介及设计方案论述 逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相 关的两个运算对象之间,所以,这种表示法也称为中缀表达式。波兰逻辑学家 J.Lukasiewicz 于 1929 年提出了另一种表示表达式的方法。按此方法,每一运算符都置 于其运算对象之后,故称为后缀表达式。 后缀表达式的优点是显而易见的, 编译器在处理时候按照从左至右的顺序读取逆波 兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实 际编程的时候就会体会到它的好处了。 逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转 换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运 算级别的特殊处理。 2.2功能模块层次图 将算术表达式转化为逆波兰表达式 计算逆波兰表达式的值 简单计算器 表 达 式 格 式 转 换 系统 求 值 计 算 系 统

四则运算计算器

基于单片机实现的四则运算计算器 姓名 学号: 班级: 专业名称:测控技术与仪器 指导教师: 东北大学 2016年1月

课程设计(论文)任务书课程设计(论文)题目:基于单片机实现的四则运算计算器 基本内容和设计要求: 1、主机的矩阵键盘输入数和运算符号,从机显示运算结果。 2、主从单片机串行通信系统,并在LCD上显示运算内容及结果。 3、计算结果超过十位数字则显示错误。 4、运算除法时,结果只取整数,不是四舍五入。 5、有清零功能。

目录 课程设计(论文)任务书................................................................................................ i i 摘要 (1) 第1章绪论 (2) 1.1计算器简介 (2) 1.2设计主要内容 (2) 第2章系统硬件设计 (4) 2.1硬件组成 (4) 2.2输入模块 (4) 2.3输出模块 (5) 2.4运算模块 (5) 第3章系统软件设计 (7) 3.1 主程序 (7) 3.1.1主程序框图及初始化 (7) 3.1.2LCD程序框图及初始化 (8) 3.1.3键盘程序框图及初始化 (9) 3.1.4运算程序框图 (10) 第4章调试测试与实验分析 (11) 4.1 计算器调试 (11) 参考文献 (12) 心得体会 (13) 附录硬件原理图及PCB图 (14) 附录程序清单 (15) 附录实物照片 (28)

摘要 单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。本设计是基于89C52RC单片机来进行的四则运算计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除的基本四则运算,并在LCD1602液晶显示屏上显示相应的结果。本电路采用89C52RC单片机为主要控制电路,利用4*4矩阵键盘作为计算器以及运算符的输入。显示采用字符LCD静态显示。软件用C语言编程,并用开发板进行演示。 关键词:计算器,89C52RC单片机,LCD,矩阵键盘

大学计算机c语言计算器源代码

C++语言编写。。 #include #include #include using namespace std; const double pi = 3.14159265; const double e = 2.718281828459; const int SIZE = 1000; typedef struct node//为了处理符号而建立的链表(如: 1+(-2)) { char data; node *next; }node; typedef struct stack_num//存储数的栈 { double *top; double *base; }stack_num; typedef struct stack_char//存储运算符号的栈 { char *top;

char *base; }stack_char; stack_num S_num;//定义 stack_char S_char;//定义 char fu[18] = {'\n', ')', '+', '-', '*', '/', '%', '^', 'Q', 'L', 'C', 'S', 'T', 'c', 's', 't', '('}; int compare[1000];//表现出各运算符号的优先级 double shu[1000];//存储"数"的数组 double dai_result;//运算的结果,是为了处理M运算(简介函数里有M的定义) int biao = 0;//和dia_result一样,为了处理M运算 char line[SIZE];//输入的所要计算的表达式 void init()//初始化 { compare[fu[0]] = -2;//用数字的大小表现出符号的优先级 compare[fu[1]] = -1; compare[fu[2]] = 2; compare[fu[3]] = 2; compare[fu[4]] = 4; compare[fu[5]] = 4; compare[fu[6]] = 4;

C语言四则运算测试程序设计报告

昆明理工大学 《计算机程序设计基础》课程 综合实践型教学课题报告 课题名称:100以内的整数四则运算测试程序设计 组长:学号 040401067 姓名周绍平 组员:学号 040401070 姓名邓磊 学号 040401106 姓名刘云路 学号姓名 学号姓名 学号姓名 学号姓名 学院:信自学院专业班级:自动化0421 指导教师:耿植林 昆明理工大学计算中心 2005 年 6月18日

昆明理工大学计算中心 《计算机程序设计基础》课程综合实践型教学课题报告课程名称:100以内的整数四则运算测试程序设计

正文内容: 一、问题描述 这是一个进行数学计算的程序,且要求拥有多种功能,包括(1)选项菜单集成各功能函数模块(2)出题(每次出10道题目)(3)答题并评分(4)答错的题给出正确答案(5)显示答卷。总体看来,大多数功能要求调用错题,所以面临的两个难题便是出题和保存答题者做错的题以便其它函数调用。另外,由于除法的特殊性——其除数不能为0。又因为这是一个用于100以内整数的四则运算的程序,又对除法这个特殊成员提出了新的要求——要使得到的结果为整数。所以有必要把除法单独拿出来作为一个函数处理。 二、问题分析 这是一个任务很明确的程序设计—用于100以内的整数的四则运算。这个程序要求拥有选项菜单、出题、答题评分、显示答卷、错题再解、重复练习的功能。既然是一个用于计算的程序那它的主要作用就是给练习者答题,并验证答题的正确与否。当然,还要有一些附加功能,比如:把答卷显示出来,错题给出正解,错题再抽出来再做。 这个程序只要求100以内的四则运算,所以随机出现的数字只能是100以内的,并且要求其为整数。不论是数据的输入与输出,都要求其为整数。 鉴于这个程序所要求达到的功能,我们小组决定把它分为计算、菜单、答卷、重做、正解、评价、除法七个函数模块。 对各成员的分工如下: 计算、正解和菜单(周绍平) 评价和除法(邓磊) 答卷和重做(刘云路) 主函数及各函数的连接则由小组成员共同完成。 三、程序设计思路功能模块说明 各函数流程图: 1、除法(chufa) 2、计算(jisuan)

第6章 四则运算计算器

第6章四则运算计算器 本章介绍的项目是大家十分熟悉的计算器,通过该项目的实践,我们将学习状态图的一些基本知识、C# 中方法的概念和应用以及键盘事件的运用,同时,训练编写一个略微复杂的Windows应用程序的设计思路。 为了使读者能够循序渐进地学习此类项目的设计,我们根据难度的不同,分为三个项目分别实现,首先完成项目一:整数的四则运算计算器,然后在此基础上完善,实现项目二:实数四则运算计算器,最后添加记忆功能,完成项目三:带记功能的实数四则运算计算器。 6.1 项目一:整数四则运算计算器设计 6.1.1 工作目标 终极目标:完成一个整数四则运算的计算器,界面如图6.1所示: 图6.1 整数四则运算计算器

促成目标: 1.完成整数四则运算计算器整体设计——状态机分析; 2.完成整数四则运算模块设计——流程分析; 3.完成整数四则运算计算器的程序界面设计及属性设置; 4.完成整数四则运算器的程序编码; 5.对整数四则运算计算器进行必要的运行测试,如有错误进行调试修改。 6.1.2 工作任务 工作任务一:构建计算器的状态图; 工作任务二:设计程序模块的流程图; 工作任务三:设计界面完成窗体及控件的属性设置; 工作任务四:编写程序代码; 工作任务五:测试软件,对错误进行调试修改。 6.1.3 工作任务一:构建计算器的状态图 1、知识准备——状态图 状态图(Statechart Diagram)是描述一个实体基于事件反应的动态行为,显示了该实体如何根据当前所处的状态对不同的事件做出反应的。状态图用于显示状态机(它指定对象所在的状态序列)、使对象达到这些状态的事件和条件、以及达到这些状态时所发生的操作。状态机由状态组成,各状态由转移链接在一起。状态是对象执行某项活动或等待某个事件时的条件。转移是两个状态之间的关系,它由某个事件触发,然后执行特定的操作或评估并导致特定的结束状态。图6.2描绘了状态机的各种元素。

C语言-四则运算

四则运算 姓名: 学号: 班级: 1.功能结构图 2.程序功能 进行整数的加减乘除和求模运算。程序采用随机产生1~100的两个数进行运算每种运算有10个题目用户输入对应的答案程序提示答案的对错最后统计正确率。每次给出两次答题机会。 3.程序流程图

4.函数列表及功能

5.源程序代码 #include #include #include #define N 10 int f(int a,int b) { //自定义函数int result; result=a+b; return result; } int f1(int a,int b) { int result; result=a-b; return result; } int f2(int a,int b) { int result; result=a*b; return result; } int f3(int a,int b) { int result; result=a*b/b; return result; } int mod(int a,int b) { int result; result=a%b; return result; } int main() { int a,b,res,ans; int i,count; int op,c; srand((unsigned)time(NULL)); while(1) {

printf("\n---加减乘除运算练习系统---\n"); printf("1.加法运算\n"); printf("2.减法运算\n"); printf("3.乘法运算\n"); printf("4.除法运算\n"); printf("5.求模运算\n"); printf("6.混合运算\n"); printf("0.退出练习\n"); printf(" 请输入数字0~6:"); scanf("%d",&op); //输入相应数字进行练习switch(op) { case 1:printf("--请进行加法运算--\n"); count=0; for(i=1;i<=N;i++) { a=rand()%100+1; b=rand()%100+1; res=f(a,b); //调用加法函数 printf("%d+%d=",a,b); scanf("%d",&ans); //输入数值 if(ans==res) { printf("Very Good!\n"); count++; } else { printf("wrong! 请重新输入\n"); scanf("%d",&ans); if(ans==res) printf("Very Good!\n"); else printf("Wrong Answer!\n"); } } printf("***正确率为%.0f%%***\n",100.0*count/N); break; case 2:printf("--请进行减法运算--\n"); count=0; for(i=1;i<=N;i++) { a=rand()%100+1; b=rand()%100+1;

汇编语言课程设计报告实现加减乘除四则运算的计算器

实现加减乘除四则运算的计算器 目录 1 概述 (1) 1.1 课程设计目的 (1) 1.2 课程设计内容 (1) 2 系统需求分析 (1) 2.1 系统目标 (1) 2.2 主体功能 (2) 3 系统概要设计 (2) 3.1 系统的功能模块划分 (2) 3.2 系统流程图 (3) 4系统详细设计 (4) 5 测试 (5) 5.1 正确输出 (5) 5.2 实际输出 (6) 6 小结 (7) 参考文献 (8) 附录 (9) 附录1 源程序清单 (9)

汇编语言课程设计报告(2011) 实现加减乘除四则运算计算器的设计 1 概述 1.1 课程设计目的 运用汇编语言,实现简单计算器的一般功能.通过该程序设计,让我们熟悉并掌握DOS系统功能调方法用及BIOS系统功能调用方法,同时在程序设计过程中熟悉并掌握各种指令的应用,知道编程的具体流程,以及掌握DEBUG的一系列的功能执行命令,及用它进行调试,运行功能。 汇编语言是计算机能够提供给用户使用的最快而又最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。由于汇编语言如此的接近计算机硬件,因此,它可以最大限度地发挥计算机硬件的性能。由此可见汇编语言的重要性,学好这门课程,同样可为相关的专业打下基础。 汇编语言程序设计课程设计是在教学实践基础上进行的一次试验,也是对该课程所学理论知识的深化和提高。因此,要求学生能综合应用所学知识,设计和制造出具有具有一定功能的应用系统,并且在实验的基本技能方面进行了一次全面的训练。 此外,它还可以培养学生综合运用所学知识独立完成汇编程序课题的能力,使学生能够较全面的巩固和应用课堂上所学的基本理论和程序设计方法,能够较熟练地完成汇编语言程序的设计和调试。它同样可以提高学生运用理论去处理实际问题的能力和独立思考的能力,使学生的编程思想和编程能力有所提高,最终达到熟练地掌握编写汇编源程序的基本方法的目的。 1.2 课程设计内容 设计一个能实现加减乘除取余计算的程序。将键盘输入的表达式预放入一缓冲区中,然后从该缓冲区的第一个字符开始读取判断,当读到一个有效的表达式时对表达式进行相应的运算后,输出用十六进制数表示的运算结果。 2 系统需求分析 2.1 系统目标 1.熟悉汇编指令、宏汇编语言的编程方法 2. BIOS中断调用、系统功能中断调用方法 3.磁盘文件、及文件内容操作 目标:要求该程序接受从键盘输入的十六进制数,执行相应的计算后,计算结 1

C语言制作简单计算器

C语言制作简单计算器 一、项目介绍 我们要用c语言做一个简单的计算器,进行加、减、乘、除操作。本程序涉及的所有数学知识都很简单,但输入过程会增加复杂性。我们需要检查输入,确保用户没有要求计算机完成不可能的任务。还必须允许用户一次输入一个计算式,例如:32.4+32 或者9*3.2 项目效果图 编写这个程序的步骤如下: ?获得用户要求计算机执行计算所需的输入。 ?检查输入,确保输入可以理解。 ?执行计算。 ?显示结果。 三、解决方案 1.步骤1

获得用户输入是很简单的,可以使用printf()和scanf()。下面是读取用户输入的程序代码: #includeint main(){ double number1=0.0; //定义第一个操作值 double number2=0.0; //定义第二个操作值 char operation=0; //operation必须是'+''-''*''/'或'%' printf("\nEnter the calculation\n"); scanf("%lf%c%lf",&number1,&operation,&number2); return0; } 2.步骤2 接着,检查输入是否正确。最明显的检查是要执行的操作是否有效。有效的操作有+、-、*、/和%,所以需要检查输入的操作是否是其中的一个。 还需要检查第二个数字,如果操作是/或者%,第二个数字就不能是0。如果右操作数是0,这些操作就是无效的。这些操作都可以用if语句来完成,switch语句则为此提供了一种更好的方式,因此它比一系列if语句更容易理解。 switch(operation) { case'+': printf("=%lf\n",number1+number2); break; case'-': printf("=%lf\n",number1-number2); break; case'*': printf("=%lf\n",number1*number2); break; case'/': if(number2==0) printf("\n\n\aDavision by zero error!\n"); else printf("=%lf\n",number1/number2); break;

C语言实验报告四则运算

《C语言》课内实验报告 学生姓名: 及学号: 学院: 班级: 课程名称:C语言 实验题目:实验二选择结构程序设计 指导教师 姓名及职称: 年月日

一、实验目的 1.掌握逻辑表达式和if语句、嵌套的if语句、switch语句和break语句的格式、语义。 2.掌握选择结构程序设计方法。 二、实验内容 编写程序实现两个数的四则运算,要求从键盘输入进行运算的两个数字以及相应的运算符('+'、'-'、'*'、'/'),程序给出算数表达式及运算结果。(如下图所示,要求使用if语句和switch语句两种方法实现) 三、实验结果 1、流程图

2、源程序 (1)使用if语句 #include void main() { float a,b; char c; printf("please input two numbers:"); scanf("%f%f",&a,&b); getchar(); printf("\nplease input the operator:"); //fflush(stdin); scanf("%c",&c); printf("\n"); if(c=='+') printf("%10.2f+%10.2f=%10.2f\n",a,b,a+b); else if (c=='-') printf("%10.2f-%10.2f=%10.2f\n",a,b,a-b); else if (c=='*') printf("%10.2f*%10.2f=%10.2f\n",a,b,a*b); else if (c=='/') printf("%10.2f/%10.2f=%10.2f\n",a,b,a/b); else printf("Input error!\n"); } (2)使用switch语句 #include void main() { float a,b; char c; printf("please input two numbers:"); scanf("%f%f",&a,&b); //输入a,b的值 getchar(); printf("\nplease input the operator:"); //输入操作符 scanf("%c",&c); printf("\n"); switch(c) //判断输入操作符 { case '+': //若操作符为'+',输出a+b printf("%10.2f+%10.2f=%10.2f\n",a,b,a+b); break;

汇编语言课程设计报告——实现加减乘除四则运算的计算器

汇编语言课程设计报告( 2011 -- 2012 年度第 2 学期) 实现加减乘除四则运算的计算器 专业计算机科学与技术 学生姓名 班级 学号 指导教师 完成日期

目录 目录 (1) 1概述 0 设计目的 0 设计内容 0 2系统需求分析 0 系统目标 0 主体功能 (1) 开发环境 (1) 3 系统概要设计 (1) 系统的功能模块划分 (1) 系统流程图 (2) 4系统详细设计 (3) 5测试 (4) 测试方案 (4) 测试结果 (4) 6小结 (4) 参考文献 (6) 附录 (7) 附录源程序清单 (7)

实现加减乘除四则运算的计算器 1 概述 设计目的 本课程设计是在学完教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。 设计内容 能实现加、减、乘、除的计算;该程序接受的是16进制数;执行时,需要在文件名后直接跟上计算表达式,如在命令提示符下执行结果如下: c:\tasm>js 3+2 5 2 系统需求分析 系统目标 本次汇编语言课程设计的最终目的是要实现一个简单加减乘除四则运算的计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。比如,十进制数的加减乘除四则运算。我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。

设计一个简单计算器的C语言课程设计报告

C语言课程设计报告题目:设计一个简单计算器 目录 1. 设计目的 2. 内容

3. 总体设计(有流程图) 4. 源程序编写(附上了运行图) 5. 执行结果 6. 心得体会 一、设计目的 设计一个简单计算器,在功能上功能尽量模拟windows 操作系统中的计算器,系统界面不做强制要求。 全面熟悉、掌握C语言基本知识,掌握C程序设计中的顺序、分支、循环三种结构及数组、函数、指针和文件的操作,把编程和实际结合起来,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,规范编程思想,为以后在专业

课程中应用计算机系统解决计算、分析、实验和设计等学习环节打下较扎实的基础。 二、内容 1、程序设计的一般步骤 a、确定数据结构 b、确定算法 C、编程 d、调试 e、总结资料 2、基本要求 a .设计正确,方案合理,能实现相应功能。 b .界面友好,使用方便。 c .程序精炼,结构清晰。 d .设计报告含程序设计说明,用户使用说明,源程序清单及程序框图。 e .上机演示。

三、总体设计(程序设计组成框图、流程图)

四、源程序编与 #in clude #in clude #in clude double jisua n( char a[]) { int i=1,j,k,m,cnt=0,t1=0,t2=0,t3=0; char nibo[50],zha n2[50]; double x,n, l,z=0,zha n3[20]; typedef struct { double d1; int d2; }dd; typedef struct {

C语言课程设计小学生四则运算

#include"stdio.h" #include"stdlib.h" void main() { int a,b,c,d,e,f,g,t; printf("****************************欢迎使用!************************\n"); printf("\n"); printf("1.加法运算\n"); printf("2.减法运算\n"); printf("3.乘法运算\n"); printf("4.除法运算\n"); printf("*****************************请选择运算类型:"); scanf("%d",&a); while(a<1||a>4) { printf("输入错误,请重新输入"); scanf("%d",&a); } if(a==1) { printf("5,一位数加一位数\n"); printf("6,一位数加两位数\n"); printf("7,两位数加两位数\n"); printf("*********************************请输入题型:"); scanf("%d",&a); while(a<5||a>7) { printf("输入错误,请重新输入"); scanf("%d",&a); } if(a==5) { loop:b=rand()%10; c=rand()%10; d=b+c; printf("%d+%d=?\n",b,c); printf("请输入答案:"); scanf("%d",&e); while(e!=d) { printf("回答错误,请重做"); printf("%d+%d=?\n",b,c); printf("请输入答案:"); scanf("%d",&e);

四则运算计算器

前言 本次课程设计的题目是用汇编语言实现一个简单的计算器,要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用。本次课程设计以实现一个基本功能完善,界面友好,操作简便易行的计算器为最终目的。通过对具有加减乘除基本功能的计算器的设计实现,学会使用汇编语言实现输入输出模块的设计,模块合理调用的设计,加减乘除运算的判断以及退出程序的判断的设计。通过对各种指令的合理使用,熟悉并加深对各种指令的用法。学会使用汇编语言设计各个功能模块。当实现各个程序模块后,学会通过程序的调用最终实现一个具有基本计算功能的简单计算器。 1

中文摘要 实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。 设计当用户根据提示信息输入一个算式后,按下enter键或是‘=’符号键时,程序依据输入的算式进行计算,并将结果显示在屏幕上。如果用户输入错误,则返回,提示信息让用户重新输入算式,当用户按下Q或q键时退出程序。在各个子功能模块设计好的情况下,通过主题模块的合理调用,最终实现一个具有简单运算功能的计算 关键字:计算器、四则运算、进位、错位、清屏

目录 1系统分析 -------------------------------------------------2系统总体设计----------------------------------------------3详细设计-------------------------------------------------- 4统测试 ---------------------------------------------------5软件使用说明书 ------------------------------------------- 设计总结----------------------------------------------------参考文献----------------------------------------------------致谢——————————————————————————————————— 3

大整数的四则运算高质量c语言程序

设计题目:大整数的四则运算 1. 功能简介:编写出实现大整数之间相加,相减,相乘,相除的程序,并输出计算结构。 课程设计要求:采用模块化程序设计 源程序中应有足够的注释 必须上机调试通过 注重算法运用,优化存储效率与运算效率 需提交源程序(含有注释)及相关文件(数据或数据库文件); 提交设计报告书。 2.总体结构:

数据初判断运算符 加法 正整数非正整 转变为 减法 转变为 乘法除法 转变为 退出 流程图:

3 .概要设计:

1)加法运算 利用两个整形数组分别存放两个数a和b的每一位的数值,最低位存放符号。如果a 和b同号,从最低为开始计算,如果有进位则保存在高一位,本为则减10,然后反序将计算后的各个位的数值保存在一个数组c并输出,如果a和b都是负数则在前面要输出负号,函数的返回值为c的位数。如果a和b异号,也即两个正整数相减,从最低位开始相减,如果要借位则本位加10再相减,高一位要减1,然后反序将计算后的各个位的数值保存在一个数组c并输出,在前面要输出相应的符号位。 2)减法运算 可将减法运算转化为加法运算,只要将被减数的符号改变即可。 3)乘法运算 符号存放在最低位,将其中一个数a的每一位分别乘以另一个数b的每一位,并将结果保存在数组c中,然后重复计算a的下一位跟b的每一位的乘积,把上一次计算保存在c 的值加上本次计算后的值,并保存在c自身中,直到a的最高位,最后输出符号和相应的计算结果。 4)除法运算 利用乘法和减法,将除数分别乘以1到9,直到其值大于等于被除数的对应的数,然后被除数对应的数减去其乘积,保存在一个数组中,下一次循环把它归到被除数中继续做除法运算,最后得到余数并输出。 4.函数功能: 1.void init(int a[],int b[],int *p1,int *p2) 2.功能说明:读入所要计算的数值,数据初始化 3.i nt plus(int a[],int b[],int c[],int m,int n) 4.功能说明:两个正整数相加 3. void change(int a[],int b[],int m,int n) 功能说明:当两异号数相加时,改变其符号以符合加法运算 5.i nt minus(int a[],int b[],int d[],int m,int n)

简单WINDOWS小程序设计——四则运算计算器

实验一:简单WINDOWS小程序——四则运算计算器 题目基本要求:创建一个Windows程序,在文本框中输入两个整数,按“计算”按钮后输出这两个整数的和、差、积、商。程序运行范例参见所提供的范例。 程序设计的具体要求如下: (1)用户在两个文本框中输入2个整数后单击“计算”按钮,可在标签框中显示计算结果。 (2)要求计算结果标签框中的内容分行显示 (3)当除数输入为0以及输入的是非数值时,观察程序的运行状态,为什么? 程序提示: (1)每个一在窗体中的控件都应该是一个对象,其中name属性为该控件在程序中的名字。(不能使用汉字) (2)文本框控件为:Textbox,其中text属性即为用户输入的文本,其类型为字符串类型(3)字符串String 为系统已经定义的一个类,其中有很多可以直接使用的方法,如:字符串连接、字符串复制等等。 (4)通过文本框输入的数据类型是字符串,并不能直接用于数值计算,同理,计算之后的结果也不能直接显示在文本框或者标签中,需要转换! 相关代码和使用到的方法如下: int.Parse(txtNumber1.Text) //将字符串txtNumber1.Text转换为相应的整数,不考虑字符串输入错误,不能转换为整数的情况。 int x = 5; txtNumber1.Text =x.ToString(); //将整数转换成字符串并赋值给文本框的text属性。 (5)和C语言一样,在C#/C++中,整数和整数相除仍然得整数。 (6)要分行显示,可以使用回车,但它是转义字符,为\n,比如: string s1=”abc”+”\n”+”efg”,可以实现字母的分行显示 (7)所谓文本框清空,也就是文本框的text属性值为空串。也可以使用clear()事件 (8)在Windows窗体程序中,经常使用label控件(标签)完成显示和输出,属性text 用于显示,类型为字符串。 (9)C#中,类的全部属性和方法定义都是放在类中的。不允许类外定义方法。 思考: (1)什么是对象,什么是类,有什么关系,在上述程序中,哪些是类,哪些是对象。 (2)对象和对象之间是如何区分的。 (3)什么是属性,什么是方法,在上述代码中,哪些是属性,哪些是方法,在控件的使用过程中,对象和属性能否改变 (4)你认为面向对象的程序设计的关键应该在哪里?使用系统或者第三方软件公司已经定义好的类有什么好处,又有什么坏处? 需要在网络辅助教学平台上提交的作业: 简要回答上述四道思考题!

相关文档
最新文档