基于C的简易计算器程序的设计论文.docx
《基于C的简易计算器程序的设计论文.docx》由会员分享,可在线阅读,更多相关《基于C的简易计算器程序的设计论文.docx(49页珍藏版)》请在冰豆网上搜索。
基于C的简易计算器程序的设计论文
引言
根据毕业设计论文——“基于C的简易计算器程序设计”这个课题所需涉与到的知识以与如何用这些知识完成需要达到的任务或目标,我决定将毕业设计论文(以下简称“论文”)分为2章,即
论文容包括:
●第1章:
将大致介绍“基于C的”知识即C语言的基础知识和在本课题中的应用①。
●第2章:
根据论文所涉到的具体任务或目标,将介绍如何把第1篇的知识具体应用到“计算器程序设计”中。
对于论文课题的实现,可以大致归纳为以下几个方面的关键词,即
论文相关:
◆设计目的:
设计一个基于C的简易计算器程序,在功能上尽量模拟windows操作系统中的计算器,系统界面不做强制要求。
◆所需知识:
全面熟悉、掌握C语言基本知识,掌握C程序设计中的顺序、选择、循环三种结构与数组、函数、指针和文件的操作,把编程和实际结合起来,对不同的问题运用和灵活选择合适的数据结构以与算法描述,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法。
◆一般步骤:
a、确定数据结构b、确定算法c、编程d、调试e、总结。
◆采用工程模式即模块化,文件包括四个重要组成部分②:
Øcalc.h(运算主函数头文件,包括各运算符的操作以与其辅助函数)。
ØMain.h(窗体类的声明头文件)。
ØCalc.cpp(工程初始化文件)。
ØMain.cpp(代码主文件,包括各空间操作的函数)以与一些其它附属文件,包括dll动态库。
◆计算器程序实现功能:
在参考了Windows里的计算器以后,决定在我的课程设计中实现:
0~9的数字输入功能(小数点除外);实现:
加、减、乘、整除、取模、阶乘、位运算左移、x的y次方、与、异或、x立方、x平方运算功能;二进制、八进制、十进制、十六进制转换功能;正负转换功能;退格、归零等功能。
1说明:
由于需要使功能尽量模仿Windows下的计算器,而很多功能要以图形界面实现,故用BorlandC++Builder编写。
所以用的是面向对象程序设计。
但因为这是C语言的课程设计,所以除了面向对象的使用以外,所有语法都是按照C语言的格式编写。
2说明:
这里所说的“四个重要组成部分”即为“程序设计”的核心容。
第一章
第1节数据类型、算法描述的简要介绍
第2节程序的3种基本结构
第3节数组、函数、指针、文件简要介绍
1.1数据类型与算法描述
1.1.1数据类型
程序在运行时要做的容就是处理数据。
程序要解决复杂的问题,就要处理不同的数据。
不同的数据都是以自己本身的一种特定形式存在的,不同的数据类型占用不同存储空间。
C语言中有多种不同的数据类型,其中包括几个大的方向:
基本类型、构造类型、指针类型和空类型。
1.1.2算法描述
算法包含算法设计和算法分析两方面容。
算法设计主要研究怎样针对某一特定类型的问题设计出求解步骤,算法分析则要讨论所设计出来的算法步骤的正确性和复杂性。
对于一些问题的求解步骤,需要一种表达方式,即算法描述。
常用的算法描述有自然语言、流程图、N-S流程图等。
1.2程序的3种基本结构
1.2.1顺序结构
顺序结构的语句是自顶向下依次执行的。
1.2.2选择结构
选择结构中的语句是根据条件判断来控制执行的。
1.2.3循环结构
循环结构中的语句执行是根据判断条件是真是假来控制某些操作是否反复执行。
1.3数组、函数、指针和文件
1.3.1数组
数组是用以存储数列中数据的集合。
1.3.2函数
定义的函数包括函数头和函数体两部分。
函数头包括返回值类型、函数名、参数表。
函数体包括局部变量的声明和函数的可执行代码。
1.3.3指针
通过地址能访问指定的存存储单元,地址可以形象的称为指针。
1.3.4文件
文件是指一组相关数据的有序集合。
第二章
第1节具体操作与原理流程图
第2节文件的四个组成部分即具体实现
2.1具体操作与原理流程图
具体操作将描述在使用本编程软件对输入的要求以与几种常见的输入情况;原理流程图将描述编程软件的运行机制与其细节。
2.1.1具体操作
打开Calc.exe,模拟Windows下的计算器功能。
基本功能为输入数字,再输入运算符,然后输入运算符对应数字,按等号;输入数字,再输入运算符,输入等于号的结果为“当前输入的数字→运算符→当前输入的数字”,可以调节正负号;输入“数字,运算符,数字,运算符...数字,运算符…”。
2.1.2原理流程图
2.2文件的四个组成部分即具体实现
本章将说明构成本软件的源代码部分即四个重要组成部分:
calc.h(运算主函数头文件,包括各运算符的操作以与其辅助函数)、Main.h(窗体类的声明头文件)、Calc.cpp(工程初始化文件)、Main.cpp(代码主文件,包括各空间操作的函数)以与一些其它附属文件。
2.2.1Calc.h(运算函数集头文件)
包括实现运算所需的头文件;实现软件各种运算(加、减、乘、除、取模等)的源代码的编程部分。
#include
#include
#include
#defineHIGHstructhigh
#defineMAXN5000
#defineMAXSHOW40
#definekey_num0
#definekey_sym1
structhigh{
intnum[MAXN];
};
HIGHans,actNum,nowShow;
charnowSym='N',lastSym='N';
bool_isincMed=true,_lastKey=key_num;
intjz=10;
bool_isbig(HIGHa,HIGHb)
{
inti;
for(i=MAXN-1;i>0;i--)
{
if(a.num[i]>b.num[i])returntrue;
else
if(a.num[i]}
returnfalse;
}
voidcopy(char*str,char*rstr,intop,intlen)//将str的从op开始的len个字符复制到rstr中
{
inti=0,j=op-1;
for(;i<=len-1||str[j]=='\0';i++,j++)rstr[i]=str[j];
rstr[i]='\0';
}
voidcopyint(HIGHnum,HIGH*rint,intop,intlen)//将str的从op开始的len个字符复制到rstr中
{
inti=1,j=op;
for(;i<=len&&jnum[i]=num.num[j];
}
voidinitNum(HIGH*numb)//初始化
{
inti;
HIGHtmp;
memset(tmp.num,0,sizeof(tmp.num));
*numb=tmp;
}
intabsCmp(HIGHa,HIGHb)//比较绝对值大小
{
inti;
for(i=MAXN-1;i>0;i--)
{
if(a.num[i]!
=b.num[i])return(a.num[i]>b.num[i]);
}
return-1;
}
intgetMed(HIGHa)//获取位数
{
inti,med;
for(i=MAXN-1;i>0;i--)
if(a.num[i]!
=0)
{
med=i;
break;
}
if(i==0)med=1;
returnmed;
}
voidturnSym(HIGH*a)//变号
{
a->num[0]=a->num[0]==0?
-1:
0;
}
voiddecMed(HIGH*a)//减去一位
{
inti,med=getMed(*a);
if(med==MAXN-1)med--;
for(i=1;i<=med;i++)a->num[i]=a->num[i+1];
a->num[med]=0;
}
voidincMed(HIGH*a,intb)//加一位
{
inti,med=getMed(*a);
HIGHr;
initNum(&r);
if(med{
for(i=2;i<=med+1;i++)r.num[i]=a->num[i-1];
r.num[1]=b;
r.num[0]=a->num[0];
}
elser=*a;
*a=r;
2.2.1.1高精度乘法的实现
MUL函数介绍:
MULAB乘法指令的功能是将A和B中两个无符号8位二进制数相乘,所得的16位积的低8位存于A中,高8位存于B中。
如果乘积大于256,即高位B不为0,则OV置1;否则OV清0,CY总是清0。
HIGHmul(HIGHa,HIGHb)//高精度乘法
{
inti,j,k,ma,mb;
HIGHtmpr,r,zero;
initNum(&zero);
initNum(&r);
ma=getMed(a);
mb=getMed(b);
for(i=1;i<=ma;i++)
{
initNum(&tmpr);
for(j=1;j<=mb;j++)
{
tmpr.num[j]=a.num[i]*b.num[j];
}
inttmpMed=getMed(tmpr);
if(tmpMed+i>MAXN)
{
initNum(&r);
Application->MessageBox("数字太大!
","错误",MB_OKCANCEL);
nowSym='N';
_lastKey=key_num;
lastSym='N';
returnr;
}
for(k=1;k{
tmpr.num[k+1]+=(tmpr.num[k]/10);
tmpr.num[k]%=10;
}
if(tmpr.num[tmpMed]>10)
tmpMed=getMed(tmpr);
if(tmpMed+i>MAXN)
{
initNum(&r);
Application->MessageBox("数字太大!
","错误",MB_OKCANCEL);
nowSym='N';
_lastKey=key_num;
lastSym='N';
returnr;
}
for(j=1;j<=tmpMed;j++)r.num[j+i-1]+=tmpr.num[j];
}
for(i=1;i{
r.num[i+1]+=(r.num[i]/10);
r.num[i]%=10;
}
if(r.num[MAXN-1]>9)
{
initNum(&r);
Application->MessageBox("数字太大!
","错误",MB_OKCANCEL);
nowShow=zero;
nowSym='N';
_lastKey=key_num;
lastSym='N';
returnr;
}
if((a.num[0]==-1&&b.num[0]==-1)||(a.num[0]==0&&b.num[0]==0))
r.num[0]=0;
elser.num[0]=-1;
returnr;
}
2.2.1.2高精度减法的实现
DEC函数介绍:
英文全称为Decimal,简称DEC
表示a:
=a-1dec(a,b):
=a:
=a-b;
在pascal中,dec(a)表示a:
=a-1dec(a,b):
=a:
=a-b;
HIGHdec(HIGHa,HIGHb)//高精度减法
{
inti,med;
HIGHr;
HIGHinc(HIGHa,HIGHb);
boolm=false;
initNum(&r);
if(a.num[0]==-1&&b.num[0]==-1)m=true;
else
if(a.num[0]==-1)
{
b.num[0]=-1;
returninc(a,b);
}
else
if(b.num[0]==-1)
{
a.num[0]=-1;
returninc(a,b);
}
if(!
absCmp(a,b))
{
a.num[0]=(a.num[0]==0)?
-1:
0;
b.num[0]=(b.num[0]==0)?
-1:
0;
returndec(b,a);
}
med=getMed(a);
for(i=1;i<=med;i++)r.num[i]=a.num[i]-b.num[i];
for(i=1;i<=med;i++)
{
if(r.num[i]<0)
{
r.num[i+1]-=1;
r.num[i]=10+r.num[i];
}
}
if(m)r.num[0]=-1;
returnr;
}
2.2.1.3高精度加法的实现
INC函数介绍:
inc(i,n)是自增函数
相应的等同于i:
=i+n;(n指相应的增量)
Dec(i,n)是自减函数
只针对整数(inc同)
HIGHinc(HIGHa,HIGHb)//高精度加法
{
inti;
HIGHr,zero;
boolm=false,err=false;
initNum(&r);
initNum(&zero);
if(a.num[0]==-1&&b.num[0]==-1)m=true;
else
if(a.num[0]==-1)
{
a.num[0]=0;
returndec(b,a);
}
else
if(b.num[0]==-1)
{
b.num[0]=0;
returndec(a,b);
}
for(i=1;ifor(i=1;i{
r.num[i+1]+=(r.num[i]/10);
r.num[i]%=10;
}
if(r.num[MAXN-1]>9)
{
initNum(&r);
Application->MessageBox("数字太大!
","错误",MB_OKCANCEL);
nowSym='N';
_lastKey=key_num;
lastSym='N';
nowShow=zero;
returnr;
}
if(m)r.num[0]=-1;
returnr;
}
2.2.1.4高精度整除的实现
DIV函数介绍:
对于ADIVB 中当A,B同号时按一般除法即A/B(取整)计算,若A,B异号则先按一般除法计算,商为负
HIGHdiv(HIGHa,HIGHb)//高精度整除
{
inti,j,ma=getMed(a),mb=getMed(b);
HIGHr,tmpHigh,cmp,someZero,theone;
initNum(&r);
initNum(&theone);
if(a.num[0]==b.num[0]);
elser.num[0]=-1;
a.num[0]=0;
b.num[0]=0;
for(i=ma-mb+1;i>0;i--)
{
initNum(&tmpHigh);
copyint(a,&tmpHigh,i,ma);
initNum(&cmp);
for(j=0;!
_isbig(cmp,tmpHigh);j++)
{
cmp=inc(cmp,b);
}
theone.num[1]=j;
if(_isbig(mul(theone,b),tmpHigh))j--;
r.num[i]=j;
initNum(&someZero);
someZero.num[i]=j;
someZero=mul(someZero,b);
a=dec(a,someZero);
}
returnr;
}
2.2.1.5高精度取模的实现
MOD函数介绍:
函数功能:
在FreeMat、MATLAB中,该函数用于进行取模(取余)运算。
在matlab的命令窗口中输入helpmod或者docmod可以获得该函数的帮助信息。
HIGHmod(HIGHa,HIGHb)//高精度取模
{
inti,j;
HIGHtmpans;
tmpans=div(a,b);
returndec(a,mul(tmpans,b));
2.2.1.6进制间的转换(先得到十六进制,再转换成相应进制)
{
if(a==10)return"A";
else
if(a==11)return"B";
else
if(a==12)return"C";
else
if(a==13)return"D";
else
if(a==14)return"E";
else
if(a==15)return"F";
}
intgetHex(HIGHa)//十六进制取余
{
if(a.num[2]==0)returna.num[1];
elsereturna.num[2]*10+a.num[1];
}
2.2.1.6.1转化为十六进制
HIGHhex(HIGHa)//转化十六进制
{
inti=0,j;
HIGHzero,r,sixteen;
initNum(&zero);
initNum(&r);
initNum(&sixteen);
sixteen.num[1]=6;
sixteen.num[2]=1;
if(a.num[0]==-1)
{
initNum(&r);
Application->MessageBox("不能为负数!
","错误",MB_OKCANCEL);
nowSym='N';
_lastKey=key_num;
lastSym='N';
nowShow=zero;
returnr;
}
while(_isbig(a,zero))
{
i++;
r.num[i]=getHex(mod(a,sixteen));
a=div(a,sixteen);
if(getMed(r)>MAXSHOW)
{
initNum(&r);
Application->MessageBox("数字太大!
","错误",MB_OKCANCEL);
nowShow=zero;
nowSym='N';
_lastKey=key_num;
lastSym='N';
returnr;
}
}
returnr;
}
2.2.1.6.2转化为八进制
HIGHbajinzhi(HIGHa)//转化八进制
{
inti=0,j;
HIGHzero,r,eight;
initNum(&zero);
initNum(&r);
initNum(&eight);
eight.num[1]=8;
if(a.num[0]==-1)
{
initNum(&r);
Application->MessageBox("不能为负数!
","错误",MB_OKCANCEL);
nowSym='N';
_lastKey=key_num;
lastSym='N';
nowShow=zero;
returnr;
}
while(_isbig(a,zero))
{
i++;
r.num[i]=mod(a,eight).num[1];
a=div(a,eight);
if(getMed(r)>MAXSHOW)
{
initNum(&r);
Application->MessageBox("数字太大!
","错误",MB_OKCANCEL);
nowShow=zero;
nowSym='N';
_lastKey=key_num;
lastSym='N';
returnr;
}
}
returnr;
}
2.2.1.6.3转化为二进制
HIGHbin(HIGHa)//转化二进制
{
inti=0,j;
HIGHzero,r,two;
initNum(&zero);
initNum(&r);
initNum(&two);
two.num[1]=2;
if(a.num[0]==-1)
{
initNum(&r);
Application->MessageBox("不能为负数!
","错误",MB_OKCANCEL);
nowShow=zero;
nowSym='N';
_lastKey=key_num;
lastSym='N';
returnr;
}
while(_isbig(a,zero))
{
i++;
r.num[i]=a.num[1]%2;
a=div(a,two);
if(getMed(r)>MAXSHOW)
{
ini