课程设计一元多项式计算器

课程设计一元多项式计算器
课程设计一元多项式计算器

1、课程设计目的

1.1、本次课程设计的主要目的是设计一个一元多项式简单计算器,体会链

式存存储结构和顺序存储结构各自的优缺点和适用性;

1.2、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计

能力;

1.3、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基

本方法和技

1.4、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

1.5、加深对常用数据结构的理解,强化学生的逻辑思维能力和动手能力,巩

固良好的编程习惯,掌握工程软件设计的基本方法,为后续课程的学习打下坚实基础。

2、课程设计的准备和功能要求

2.1、需求环境

本课程设计需要的设备为硬件要求和软件配置要求具体要求如下:

①硬件要求:一台计算机。

②软件配置:windows XP或windows 7、VC++6.0。

2.2、目标程序的功能要求

集合链式存储结构和顺序存储结构实现一元多项式计算器的设计,并使该计算器具有以下功能:

①能够按照多项式变量的指数降序创建一个多项式;

②能够对已创建的多项式进行显示;

③能够对已创建的多项式之间的加法运算;

④能够对已创建的多项式之间的减法运算;

⑤能够对已创建的多项式进行删除;

⑥能够实现计算器退出操作;

2.3、系统总框图

3、课程设计过程

3.1、菜单界面设计

考虑到计算器的操作应具备简易性,我们采取用户和计算机的

对话方式执行,即程序运行时,在计算机终端上显示该计算器的功能 菜单栏,其中包括对应的选项共用户选择输入;当用户根据选项中的“提示信息”在键盘上输入多项式的项数及各项的系数和指数,然后 进行显示、相加运算、相减运算、多项式删除以及计算器退出操作。 如下所示:

用户菜单

多项式的显示

多项式的相加

多项式的相减

多项式的删除

退出 菜单

多项式的建立

3.2、菜单选项的实现

对于计算器菜单中各选项的设计处理,我们采用了switch (menu) 语句并将各选项前的数字定义为字符型。然后根据所输入的不同的memu列出对应的6种case分支情况。

3.3、数据类型和数据存储结构的选择

(1)结构体:

当许多项都与某一项相关联时(如本程序:多项式的项数,项的系数和指数都与某多项式的名称有关联),如果将系数,指数分别定义为互相独立的简单变量,则难以反映他们之间的关系,于是便利用数据结构中的结构体把他们组织成一个组合项,这种方法相当于高级语言的“记录”。

其中,声明一个结构体类型的一般形式为:

typedef struct PolyNode

{

float coef;(各项系数)

int expn; (各项指数)

struct PolyNode *next;(各项的后一项所对应的下一项的地址)

};

(2)指针数组:(顺序存储结构)

考虑到指针数组比较适合用来指向若干个字符串,使字符串处理更加方便更加灵活,因此我们选择用顺序结构的指针数组来描述一个多项式。分别定义一些多项式头指针而头指针后面可以根据需要创建并接上更多单项,如果想对已经创建的各个头指针进行随机存取,不必改动各头指针的位置,只需改动指针数组中各元素的指向(即改变各元素的值,这些值都是各头指针的首地址)。这样,各多项式的长度可以不同,而且移动指针变量的值(地址)要比移动字符串所花的

时间要少得多。采用自定义类型typedef,同时建立一个新的结构体类型名和结构体指针类型名。

代码表示为:

typedef struct PolyNode

{

float coef;

int expn;

PolyNode *next;

}Poly,*P_Poly;

定义结构体指针数组:

P_Poly PolyHead[26]={0};//定义结构体指针数组,一元多项式的名称

结构体指针数组的应用:

READ_CHAR(name);

printf (" *\n");

if (NULL!=PolyHead[name-'a']) { //限制多项式名称只能为26个小写字母之一

printf (" * 此多项式名不合法! *\n");

break;

}

(3)线性链表

线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这存储单元可以是连续的,也可以是不连续的)。用线性链表表示线性表的时候,数据元素之间的逻辑关系是由结点中的指针指示的。也就是说,指针为数据元素中间的逻辑关系的映像,则逻辑上相邻的两个数据元素其存储的物理位置不要求相邻。

考虑到一元多项式的项数不确定性,我们放弃采用顺序结构线性表大量初始化存储单元的方式,而选择线性链表从而能够使设计的程序灵活的对多项式进行加项、减项、删除等操作。

实现代码如下:

for (i=0;i

{

p=(Poly*)malloc(sizeof(Poly)); //(创建新链结,添加新单项式) printf (" * 请输入第%d项(系数,指数)(输完按空格):",i+1);

cscanf ("%f,%d",&(p->coef),&(p->expn));

printf (" *");

printf (" ");

tail->next=p;

tail=p;

}

3.4、多项式创建功能的设计

(1)多项式创建功能的实现,采用函数:

int CreatPoly(P_Poly*,int);

(2)多项式输出功能的实现,采用函数:

void OutP_Poly(P_Poly PolyHead)

(3)求多项式和的功能的实现,采用函数:

void AddPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2)

(4)求多项式差的功能的实现,采用函数:

void DecPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2)

(5)删除多项式功能的实现,采用函数:

void DelPoly(P_Poly* P_PolyHead)

(6)计算器退出操作,实现代码:

case '6': {

tuichu=1;break; //选择退出***

}

}

if(tuichu==1)break;

}

return OK;

}

4、程序设计问题的解决

程序设计过程中遇到的*号输入问题

case '1':

{

int n;

printf (" * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");

printf (" * 请输入要创建的多项式的名称(单个小写字母表示)");

cscanf("%c",&name);

printf (" *\n");

if (NULL!=PolyHead[name-'a']) //限制多项式名称只能为26个小写字母之一

{

printf (" * 此多项式名不合法! *\n");

break;

}

printf (" * 请输入项数(输入数字后按空

格):");

cscanf ("%d",&n);

printf (" *\n");

if(CreatPoly(&PolyHead[name-'a'],n))

printf (" * 多项式%c创建完毕! *\n",name);

printf (" * * * * * * * * * * * * * * * * * *

* * * * * * * * * * *\n");

break;

}

case '2':

{

printf (" * * * * * * * * * * * * * * * * * * *

* * * * * * * * * *\n");

printf (" * 请输入要输出的多项式的名称:");

cscanf("%c",&name);

printf (" *\n");

printf (" * * * * * * * * * * * * * * * * * *

* * * * * * * * * * *\n");

if (NULL==PolyHead[name-'a'])

{

printf ("此多项式不存在!\n");

break;

}

OutP_Poly(PolyHead[name-'a']);

break;

}

4.1、按照我们的设计方案,该多项式计算器的菜单栏是被我们用

多个*号框起来显示的,而同时我们也试图在选定每一个菜单选项后

所出现的该选项的下一步输入提示(以及提示后的输入)也会被自动

包含在*型框中。但是如果在出现下一步输入提示后,当代码采用

READ(name)替代上文代码中的

cscanf("%c",&name);

输入时,输入后会出现自动换行,而不能将输入数据也包含在*型框

中,如:

所以为解决这个问题我们通过网络找到了cscanf函数并改用:

cscanf("%c",&name);

这样上面的问题得到解决。

4.2、但是这样新的问题又出现了。采用cscanf函数后当执行菜单选项1,创建完成一个多项式后,下一步菜单操作的执行中无论选择那个操作选项,运行操作会自动跳过cscanf操作,而出现乱码输出,但是接下来继续从菜单中选择操作选项后却可以顺利执行出来。

如:情况一,

继续再次操作2却可以顺利进行:

情况二类似:

首先创建好一个多项式后,再创建一个则出现:

总之,问题就是:只有当创建完第一个多项式后,接下来的第一个操作中的cscanf函数会被跳过,但是继续选择菜单操作则不再出现。这就是我们一直苦恼的地方。

为了解决这个问题,我们通过资料查找和咨询老师,

最后得出问题的症结在于:

因为宏定义RADE()中的getchar函数是从stdio读数据,而cscanf是从console 读数据,混合使用出现了问题。

因而我们通过建立一个新函数:

void READ_CHAR (char& c)

{

do{

cscanf("%c",&c);

}while(c=='\n' || c==' ' || c=='\t');

}

在case2 中读入字符的地方都调用函数READ_CHAR(name)代替cscanf("%c",&name); ,以去掉空白符。

5、调试总结与心得体会

经过半个学期对数据结构的学习,我们对C语言编译调试程序的过程和方法有了更深刻的了解,一个完整的,健壮的程序需要有合理的算法和数据结构作为基础,算法是程序的灵魂,是程序的主线,是实现问题的方法和基本步骤的描述,而一个好的算法的实现要建立在合理熟练的逻辑结构和存储结构上

调试程序之前要对所要编译的程序有个整体的了解,需要用什么样的逻辑结构和存储结构,用什么样的算法去实现。要重视对结构体变量的运用,因为无论是线形结构还是链式结构都难免用到结构体变量,结构体中要包含所要描述问题的各个数据域和指针域的指向;使用外部变量的时候要注意它的范围是整个函数,使用的时候要考虑到从上一个函数下来之后所带回的值,要小心使用;程序设计中最重要的也是最容易出错的地方是指针,因此要熟练掌握指针的使用方法,对整个程序中指针的指向,什么时候为空,有确切的了解,否则很容易出错,

但要是能将指针用好的话程序设计也就简单了许多;关于数组,在调用函数实参时也容易出错,因为在用数组做实参时传递的是数组指针。

要想编译出一个好的程序真不是一件简单的事情,这次的作业又花了我们大量的时间,但是无论是C语言还是数据结构,在学习过程中收获最大的还是最后的大作业,通过大作业,对一些实际操作中算法的描述,数据结构的使用才有了更深一层的了解,同时也积累了一些在解决实际问题中的经验,处理一般的编译,连接错误的方法,并能够一步一步的进行调试,编程的过程确实很辛苦,但是有了成果之后又觉得很轻松。所以感觉要是投入进去的话编程还不是很难的,只要能够把基础的知识学好,多在操作中练习,多积累些解决实际问题的经验,以后再做这方面的工作就简单多了。

课题设计使得我对这学期所学的专业课有了更为深刻的认识,对于我们来说这不仅仅是一次课程设计,更重要的是使我们明白了在学习的过程中,所有的问题要一个人去面对,有问题要想尽各种办法解决,克服困难,在解决这些困难的过程中提高了我们学习的能力、解决问题的能力和实际工作的能力,学到了许多书本以外的认识。通过这次课程设计我们觉得我们学习《数据结构》的方法存在一定的弊端,《数据结构》的效果直接影响到我们对其它专业课的学习和今后业务的成长。我们觉得我们对于《数据结构》的学习不仅包括理论部分的学习,还要让我们勤动手,多实践。最后我们要衷心的感谢所有给予我们帮助和指导的老师和同学,没有他们的帮助我们的课程设计也不会完成得这么顺利!

最后,通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正学以致用,从而提高自己的实际动手能力和独立思考的能力。而且,编程非常考验人的耐心和信心,这也在性格方面给了我很多磨练。通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍,可以说是收获不少。

参考文献

[1] 李春葆.数据结构(C语言版)习题与解析[M]. 清华大学出版社,2000.5:47-51

[2] 严蔚敏,吴伟民数据结构(C语言版) [M]. 清华大学出版社2007:27-63

[3] 陈文博,朱青. 数据结构与算法[M]. 机械工业出版社,1996.5:3:47-51

[4] 李邦几,王敬华. 最新C语言实用教程[M]. 化学工业出版社,1996.3:66-68

[5] 杨明:数据结构知识点与典型例题解析[M]. 清华大学出版社,2005.9:19-76

[6] 徐孝凯,魏荣.数据结构 [M]. 机械工业出版社, 1996.1:26-103

[7] 陆松年.数据结构教程 [M].北京:科学出版社,2002:121-124.

[8] 苏小红, 陈惠鹏, 温东新,李秀坤.C语言程序设计教程[M].北京:电子工业出版社,2004.1(3):123-133.

代码清单:

//一元多项式计算器

#include

#include

#include

#define OK 1;

#define READ(I) while ((I=getchar())=='\n'); //读入合法字符** typedef int status;

typedef struct PolyNode

{

float coef;

int expn;

struct PolyNode *next;

}Poly,*P_Poly;

void READ_CHAR (char& c)

{

do{

cscanf("%c",&c);

}while(c=='\n' || c==' ' || c=='\t');

}

status CreatPoly(P_Poly*,int); //创建多项式链表

void OutP_Poly(P_Poly); //输出多项式

void AddPoly(P_Poly*,P_Poly,P_Poly); //求和

void DecPoly(P_Poly*,P_Poly,P_Poly); //求差

void DelPoly(P_Poly*); //删除并释放多项式

status main()

{

P_Poly PolyHead[26]={0};//定义结构体指针数组,一元多项式的名称

char menu,name;

int tuichu=0,j;

for (j=0;;j++) {

if(j!=0)printf("\n\n\n再次选择:\n");

printf (" 请注意:为确保其他子函数正常运行,入口参数要求不

含同类项、指数递减.\n");

printf (" * * * * * * * * * * * * * * * * * * * * * *

* * * * * * *\n");

printf (" * 1.建立多项式

*\n");

printf (" * 2.输出多项式

*\n");

printf (" * 3.求两个多项式之和(必须先创建),建立

和式并输出 *\n");

printf (" * 4.求两个多项式之差(必须先创建),建立

差式并输出 *\n");

printf (" * 5.删除多项式

*\n");

printf (" * 6.退出

*\n");

printf (" * * * * * * * * * * * * * * * * * * * * * *

* * * * * * *\n");

printf (" 请选择指令:");

READ(menu);

printf("\n");

switch (menu) {

case '1': {

int n;

printf (" * * * * * * * * * * * * * * * * * * * * * *

* * * * * * *\n");

printf (" * 请输入要创建的多项式的名称(单个小

写字母表示)");

cscanf("%c",&name);

printf (" *\n");

if (NULL!=PolyHead[name-'a']) { //限制多项式名称只能为26个小写字母

之一

printf (" * 此多项式名不合法! *\n");

break;

}

printf (" * 请输入项数(输入数字后按空格):");

cscanf ("%d",&n);

printf (" *\n");

if(CreatPoly(&PolyHead[name-'a'],n))

printf (" * 多项式%c创建完毕! *\n",name);

printf (" * * * * * * * * * * * * * * * * * * * * * *

* * * * * * *\n");

break;

}

case '2': {

printf (" * * * * * * * * * * * * * * * * * * * * * *

* * * * * * *\n");

printf (" * 请输入要输出的多项式的名称:");

READ_CHAR(name);

printf (" *\n");

printf (" * * * * * * * * * * * * * * * * * * * * * *

* * * * * * *\n");

if (NULL==PolyHead[name-'a']) {

printf ("此多项式不存在!\n");

break;

}

OutP_Poly(PolyHead[name-'a']);

break;

}

case '3': {

char name1,name2;

printf ("请输入加式一的名称:");

READ(name1);

if (NULL==PolyHead[name1-'a']) {

printf ("此多项式不存在!请先创建\n");

break;

}

printf ("请输入加式二的名称:");

READ(name2);

if (NULL==PolyHead[name2-'a']) {

printf ("此多项式不存在!请先创建\n");

break;

}

printf ("请输入要创建的和式的名称:");

READ(name);

if (NULL!=PolyHead[name-'a']) {

printf ("此多项式名不合法!\n");

break;

}

AddPoly(&PolyHead[name-'a'],PolyHead[name1-'a'],PolyHead[name2-'a']); OutP_Poly(PolyHead[name-'a']);

break;

}

case '4': {

char name1,name2;

printf ("请输入被减式的名称:");

READ(name1) ;

if (NULL==PolyHead[name1-'a']) {

printf ("此多项式不存在!请先创建\n");

break;

}

printf ("请输入减式的名称:");

READ(name2) ;

if (NULL==PolyHead[name2-'a']) {

printf ("此多项式不存在!请先创建\n");

break;

}

printf ("请输入要创建的差式的名称:");

READ(name) ;

if (NULL!=PolyHead[name-'a']) {

printf ("此多项式已经存在!\n");

break;

}

DecPoly(&PolyHead[name-'a'],PolyHead[name1-'a'],PolyHead[name2-'a']); OutP_Poly(PolyHead[name-'a']);

break;

}

case '5': {

printf ("请输入要删除的多项式名称:");

READ(name) ;

if (NULL==PolyHead[name-'a']) {

printf ("此多项式不存在!\n");

break;

}

DelPoly(&PolyHead[name-'a']);

printf ("多项式%c已删除!\n",name);

break;

}

case '6': {

tuichu=1;break; //选择退出***

}

}

if(tuichu==1)break;

}

return OK;

}

//1 一元多项式链表创建函数

status CreatPoly(P_Poly* P_PolyHead,int n)// P_PolyHead是指向指针的指针***

{

//为确保其他子函数正常运行,入口参数要求不含同类项、指数递减 **** int i;

P_Poly p,tail;

*P_PolyHead=(Poly*)malloc(sizeof(Poly));

(*P_PolyHead)->expn=n;

tail=*P_PolyHead;

printf (" * 请按照指数递减序输入最简形式的多项式*\n");

for (i=0;i

{

p=(Poly*)malloc(sizeof(Poly));

printf (" * 请输入第%d项(系数,指数)(输完按空格):",i+1);

cscanf ("%f,%d",&(p->coef),&(p->expn));

printf (" *");

printf (" ");

tail->next=p;

tail=p;

}

tail->next=NULL; //确定链尾指针

return OK;

}

//2 多项式输出函数

void OutP_Poly(P_Poly PolyHead)

{

int i;

P_Poly p;

printf ("\n总项数为:%d\n ",PolyHead->expn);//链表头数据域**

p=PolyHead->next;

for (i=0;iexpn;i++)

{

if(i==0)

printf ("%f*x^%d",p->coef,p->expn);

else

if(p->coef>=0)

printf ("+%f*x^%d",p->coef,p->expn);

else

printf ("%f*x^%d",p->coef,p->expn);

p=p->next;

}

printf ("\n");

}

//3 求多项式的和的函数

void AddPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2)

{

int i=0;

P_Poly p1,p2,p,tail;

p1=PolyHead1->next;

p2=PolyHead2->next;

*P_PolyHead=(P_Poly)malloc(sizeof(Poly)); //给新创建的链表分配动态存储空间做链头

p=tail=*P_PolyHead;

while(p1&&p2)

{

int e1,e2;

e1=p1->expn;

e2=p2->expn;

if (e1>e2)

{

p=(P_Poly)malloc(sizeof(Poly));

tail->next=p;

tail=p;

*p=*p1;

p1=p1->next;

i++;

}

else if(e1==e2)

{

float sum_c=p1->coef+p2->coef;

if (sum_c!=0.0)

{

p=(P_Poly)malloc(sizeof(Poly));

tail->next=p;

tail=p;

p->coef=sum_c;

p->expn=e1;

i++;

}

p1=p1->next;

p2=p2->next;

}

else if (e1

{

p=(P_Poly)malloc(sizeof(Poly));

tail->next=p;

tail=p;

*p=*p2;

p2=p2->next;

i++;

}

}

while (p1) //将p1中p2多出的想补充道新建多项式链表的后面

{

p=(Poly*)malloc(sizeof(Poly));

*p=*p1;

tail->next=p;

tail=p;

p1=p1->next;

i++;

}

while (p2) //将p2中p1多出的想补充道新建多项式链表的后面

{

p=(Poly*)malloc(sizeof(Poly));

*p=*p2;

tail->next=p;

tail=p;

p2=p2->next;

i++;

}

(*P_PolyHead)->expn=i;

tail->next=NULL; //确定链尾指针

}

//4 求多项式差的函数

void DecPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2) {

int i=0;

P_Poly p1,p2,p,tail;

p1=PolyHead1->next;

p2=PolyHead2->next;

*P_PolyHead=(P_Poly)malloc(sizeof(Poly)); //给新创建的链表分配动态存储空间做链头

p=tail=*P_PolyHead;

while(p1&&p2)

{

int e1,e2;

e1=p1->expn;

e2=p2->expn;

if (e1>e2)

{

p=(P_Poly)malloc(sizeof(Poly));

tail->next=p;

tail=p;

*p=*p1;

p1=p1->next;

i++;

}

else if(e1==e2)

{

float dif_c=p1->coef-p2->coef;

if (dif_c!=0.0)

{

p=(P_Poly)malloc(sizeof(Poly));

tail->next=p;

tail=p;

p->coef=dif_c;

p->expn=e1;

i++;

}

p1=p1->next;

p2=p2->next;

}

else if (e1

{

p=(P_Poly)malloc(sizeof(Poly));

tail->next=p;

tail=p;

p->coef=-p2->coef;

p->expn=p2->expn;

p2=p2->next;

i++;

}

}

while (p1)

{

p=(Poly*)malloc(sizeof(Poly));

*p=*p1;

tail->next=p;

tail=p;

p1=p1->next;

i++;

}

while (p2) //***

{

p=(Poly*)malloc(sizeof(Poly)); p->coef=-p2->coef;

p->expn=p2->expn;

tail->next=p;

tail=p;

p2=p2->next;

i++;

}

(*P_PolyHead)->expn=i;

tail->next=NULL;

}

//5 多项式删除操作函数

void DelPoly(P_Poly* P_PolyHead)

{

P_Poly p,prior;

p=prior=*P_PolyHead;

while (p->next)

{

p=p->next;

free(prior);

prior=p;

}

*P_PolyHead=NULL;

}

一元稀疏多项式计算器实验(报告+程序)

一元稀疏多项式计数器预习报告 :刘茂学号0062 一、实验要求 (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。序列按指数降序排列; (3)多项式a和b相加,建立多项式a+b; (4)多项式a和b相减,建立多项式a-b。 (5)多项式求值; (6)多项式求导; (7)求多项式的乘积。 二、测试数据: 1、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7); 2、(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15 )=(-7.8x^15-1.2x^9+12x^-3-x); 3、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5); 4、(x+x^3)+(-x-x^3)=0; 5、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200); 6、(x+x^2+x^3)+0=x+x^2+x^3. 7、互换上述测试数据中的前后两个多项式。

三、思路分析 用带表头结点的单链表存储多项式。 本程序要求输入并建立多项式,能够降幂显示出多项式,实现多项式相加相减的计算问题,输出结果。 采用链表的方式存储链表,定义结点结构体。运用尾差法建立两条单链表,以单链表polyn p和polyn h分别表示两个一元多项式a和b。 为实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q 结点的指数项。 ①若p->expnexpn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。 ②若p->expn=q->expn,则将两个结点中的系数相加,当和不为0时修改结点p的系数。 ③若p->expn>q->expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。 四、实验程序 //头文件 #include #include #include //定义多项式的项 typedef struct Polynomial{ float coef; int expn; struct Polynomial *next; }*Polyn,Polynomial;

简单计算器c++课程设计

简单计算器 1 基本功能描述 简单计算器包括双目运算符和单目运算符。双目运算符包含基本的四则运算及乘幂功能,单目运算符包含正余弦、阶乘、对数、开方、倒数等运算。可对输入任意操作数包含小数和整数及正数和负数进行以上的所有运算并能连续运算。出现错误会给出提示,同时包含清除、退格、退出功能以及有与所有按钮相对应的菜单项。 2 设计思路 如图1,是输入数据子函数的流程图。打开计算器程序,输入数据,判断此次输入之前是否有数字输入,如果有,则在之前输入的数字字符后加上现有的数字字符;如果没有,则直接使编辑框显示所输入的数字字符。判断是否继续键入数字,如果是,则继续进行前面的判断,如果否,则用UpdateData(FALSE)刷新显示。 如图2,是整个计算器的流程图。对于输入的算式,判断运算符是双目运算符还是单目运算符。如果是双目运算符,则把操作数存入数组a[z+2]中,把运算符存入b[z+1]中;如果是单目运算符,则把字符串转化为可计算的数字,再进行计算。下面判断运算符是否合法,如果合法,则将结果存入a[0],不合法,则弹出对话框,提示错误。结束程序。

输入一个数字 在之前输入的数字字符后面加上现在的数字字符。 Eg :m_str+=”9”。 直接使编辑框显示所输入的数字字符。 Eg :m_str=”9”。 pass3=1表示已有数字输入 开始 之前是否有数字输入? pass3==1? 继续键入数字? 用UpdateData(FALSE)刷新显示 图1 输入数据子函数流程图 Y N Y N

输入开始 双目运算符 是否每一个操作数都存入a[]数组? 把操作数存入a[z+2],把运算符存入b[z+1]。 单目运算符 将字符串转换 为可计算的数进行运算 运算是否合法? 将结果存入a[0] 弹出对话框提示错误 结束Y Y N N 图2 简单计算器总流程图

计算器java课程设计(完整版)

《面向对象程序设计》课程设计报告 课程设计题目:计算器 学生姓名:李婉如 专业:信息管理与信息系统 班级:1424603 指导教师:司红伟 2016年 5 月 25 日

一、课设任务及要求 1)课设任务: ⑴设计的计算器应用程序可以完成加法、减法、乘法、除法以及取余运 算(可以进行浮点数和负数的运算)。 ⑵有求倒数、退格和清零功能。 2)创新要求: 能进行正切、余弦,以及求平方根、指数(包括对e)、自然对数运算。 3)设计要求 ①设计的计算器应用程序可以完成加法、减法、乘法、除法和取余运算。且有小数点、正负号、求倒数、退格和清零功能。 ②课程设计可选用Eclipse、JBuilder、NetBeans等作为开发平台以提高开发效率,通过资料查阅和学习尽可能熟练掌握其中一种集成开发环境。 ③认真按时完成课程设计报告,课程设计报告内容包括:设计任务与要求、需求分析、设计思路、详细设计、运行调试与分析讨论和设计体会与小结六个部分。

二、设计思路 ⑴本应用程序继承自框架类(JFrame),容器Container c采用BorderLayout 边缘布局,将单行文本框加入到“North”区域,包含各种按钮的面板JPanel p加入到”Center”区域。包含各种按钮的面板JPanel p 采用3行6列的网格布局,然后将数字按钮和运算符按钮以及控制按钮用一个for循环添加到面板中同时注册按钮事件监听器。如: Button b=new Button(); b.addActionListener(事件监听器); ⑵事件监听器中的事件处理方法void actionPerformed(ActionEvent evt)完成主要的按钮事件的处理。事件处理分以下几种情况:数字按钮事件(”0”,”1”,”2”…”8”,”9”)、运算符按钮事件(”+”,”-“,”*”,”/”,”%”)、正负号按钮事件(”+/-“)、小数点按钮事件(”.”)、等号按钮事件(”=”)、求倒按钮事件(”求倒”)、退格按钮事件(”退格”)、清除按钮事件(“C”) 、正切(tan)、余弦(cos),以及求平方根(sqrt)、指数(pow)、对e的指数(exp)、对数运算(log)。 ⑶在事件处理,触发按钮事件时,先判断是或是数字是或是“-/+”是或是“.”,是的话就将负号“-”、数字、小数点“.”分别写入文本框并存放在sum中,然后判断是或是“退格”、“求倒”等,是的话进行相应的处理,都不是的话则跳到doOperation()执行运算同时将运算符存放在preOperater中。触发按钮事件时,要进一步分析,是重新开始计算时触发的按钮事件还是计算中间触发的按钮事件。 ⑷计算器完成的是一个数学表达式,如:3+2,所以可以采用一个数组来存储数字或字符,如3,+,2分别存储在数组中,最后运算时,可以一一取出来进行运算。 ⑸利用按钮设计计算器的各个运算符和操作符,通过按钮的事件处理实现按钮计算功能。 ⑹利用文本框显示操作数和运算结果。

实验报告——2 一元稀疏多项式计算器

华北水利水电学院一元稀疏多项式计算器实验报告 2010~2011学年第一学期 09 级计算机科学与技术专业班级: 2009119 学号: 200911902 姓名:万婷婷 一、实验目的 设计一个医院稀疏多项式简单计算器 熟练掌握线性表的基本操作在两种存储结构上的实现,其中以各种链表的操作和应用 二、实验要求 a)输入并建立多项式 b)输出多项式,输出形式为整数序列:n,c 1,e 1 ,c 2 ,e 2 ……c n ,e n ,其中n是多 项式的项数,c i ,e i 分别为第i项的系数和指数。序列按指数降序排列。 c)多项式a和b相加,建立多项式a+b,输出相加的多项式。 d)多项式a和b相减,建立多项式a-b,输出相减的多项式。 用带表头结点的单链表存储多项式。 测试数据: (1) (2x+5x8-3.1x11)+(7-5x8+11x9) (2) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2+7.8x15) (3)(1+x+x2 +x3 +x4 +x5)+( -x3- x4) (4)(x+x2+x3)+0 (5)(x+x3)-(-x-x-3) (6) (x+x2 +x3 )+0 三、实验内容 主要算法设计 typedef struct Node { float coef; int index; struct Node *next; }LinkList; 本程序涉及到多项式的建立、多项式的输出、两个多项式的相加减。用带头结点的单链表存储多项式; 程序中共定义了5个函数:

void Insert(LinkList *p,LinkList *h)//把节点p插入到链表h中LinkList *Creat_L(LinkList *head,int m)//创建一个链表,项数为m void Printf(LinkList *L) LinkList *ADDlist(LinkList *head,LinkList *pb) LinkList *MinusList(LinkList *head,LinkList *pb) 四、程序源代码 #include #include #include #include typedef struct Node { float coef; int index; struct Node *next; }LinkList; void Insert(LinkList *p,LinkList *h)//把节点p插入到链表h中 { LinkList *q1,*q2; int flag=0; q1=h; if(p->coef==0) free(p); else { if(q1->next==NULL) { q1->next=p; }

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功能模块层次图 将算术表达式转化为逆波兰表达式 计算逆波兰表达式的值 简单计算器 表 达 式 格 式 转 换 系统 求 值 计 算 系 统

JAVA实现计算器课程设计

JAVA实现计算器课程设计 计算机科学系 计应0701班 指导老师:刘其昌 设计人员:陈秀桃 设计日期:2009年11月10日——2009年12月20日 计算器的设计 目录 第一章绪 论 ..................................................................... .. (2)

1.1 开发环 境 ..................................................................... . (2) 1.2 基本功能介 绍 ..................................................................... ......... 2 第二章系统设 计 ..................................................................... (3) 2.1 系统流程 图 ..................................................................... . (3) 2.2 系统功能框 图 ..................................................................... (3) 2.3 需求分 析 ..................................................................... ................ 4 第三章软件设 计 ..................................................................... (5) 3.1 界面设 计 ..................................................................... . (5) 3.2 代码设 计 .....................................................................

多项式的运算(c语言实现)

#include"stdio.h" #include"stdlib.h" #include"conio.h" typedef struct Item{ double coef;//系数 int expn;//指数 struct Item *next; }Item,*Polyn; #define CreateItem(p) p=(Item *)malloc(sizeof(Item)); #define DeleteItem(p) free((void *)p); /************************************************************/ /* 判断选择函数 */ /************************************************************/ int Select(char *str) { char ch; printf("%s\n",str); printf("Input Y or N:"); do{ ch=getch(); }while(ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n'); printf("\n"); if(ch=='Y'||ch=='y') return(1); else return(0); } /************************************************************/ /* 插入位置定位函数 */ /**************************************************************/ int InsertLocate(Polyn h,int expn,Item **p) { Item *pre,*q; pre=h; q=h->next; while(q&&q->expnnext; } if(!q) { *p=pre; return(1); } else if(q->expn==expn) { *p=q; return(0); } else { *p=pre; return(-1); } } /************************************************************/ /* 插入结点函数 */ /************************************************************/ void insert(Item *pre,Item *p) {

(整理)一元稀疏多项式计算器

云南大学软件学院数据结构实验报告 (本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □ C □ 学期:2012秋季学期 任课教师: 实验题目: 一元稀疏多项式计算器 小组长: 联系电话: 电子邮件: 完成提交时间:2012 年 11 月 10 日 云南大学软件学院2012学年秋季学期

《数据结构实验》成绩考核表 学号: 20111120 姓名:本人承担角色:算法设计整体流程控制 综合得分:(满分100分) 指导教师: 年月日

云南大学软件学院2010学年秋季学期 《数据结构实验》成绩考核表 学号: 20111120 姓名:本人承担角色:函数实现整体流程控制 综合得分:(满分100分) 指导教师: 年月日

(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%) 多项式计算器的呈现方式是用控制台程序呈现,;多项式的加减乘以及求导的函数中利用链表保存头结点以及循环结构保存和输出数据;还有利用一个简单的降序排列的函数,在输出时更加明了。 二、【实验设计(Design)】(20%) 在头文件中申明变量,源文件中创建指数和系数的指针的头结点,并为此申请空间。首先考虑指数为0,1和系数为0,1时的特殊情况的表示;然后利用SORT函数对输出时进行降序排列;其次就是加减乘以及求导函数的实现;最后是一个输出界面的设计。 三、【实现描述(Implement)】(30%) //--------函数原型说明-------- typedef struct Node { double xishu; int zhishu;//数据域 //int data; struct Node* pnext;//指针域 }Node,*pNode; pNode phead=(pNode)malloc(sizeof(Node));//创建头节点 pNode creat_list(void);创建链表 void traverse_list(pNode phead);//遍历链表 pNode sort(pNode phead);//对链表进行降序排列 pNode add(pNode phead1,pNode phead2);//两个多项式相加 pNode hebing(pNode phead)//合并同类项 pNode multi(pNode phead1,pNode phead2);//多项式相乘 pNode sub(pNode phead1,pNode phead2);//多项式相减 //多项式求导没有声明和定义函数,而是直接卸载程序里了

简易计算器课程设计

评阅教师评语:课程设计成绩 考勤成绩 实做成绩 报告成绩 总评成绩指导教师签名: 课程设计报告 论文题目基于ARM的简易计算器设计 学院(系):电子信息与自动化学院 班级:测控技术与仪器 学生姓名:同组同学: 学号:学号: 指导教师:杨泽林王先全杨继森鲁进时间:从2013年 6 月10 日到2013年 6 月28 日 1

目录 1、封面—————————————————————P1 2、目录—————————————————————P2 3、前言—————————————————————P3 4、关键字————————————————————P3 5、原理与总体方案————————————————P3 6、硬件设计———————————————————P6 7、调试—————————————————————P10 8、测试与分析——————————————————P11 9、总结—————————————————————P13

10、附件—————————————————————P14 前言 近几年,随着大规模集成电路的发展,各种便携式嵌入式设备,具有十分广阔的市场前景。嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分。通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板。事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是是由单个程序实现整个控制逻辑。在嵌入式系统中,数据和命令通过网络接口或串行口经过ARM程序处理后,或显示在LCD上,或传输到远端PC上。 本文通过周立功的LPC2106芯片完成的简易计算器,正是对嵌入式应用的学习和探索。 一、摘要: 计算器一般是指“电子计算器”,是能进行数学运算的手持机器,拥有集成电路芯片。对于嵌入式系统,以其占用资源少、专用性强,在汽车电子、航空和工控领域得到了广泛地应用。本设计就是先通过C语言进行相应程序的编写然后在ADS中进行运行最后导入PROTUES进行仿真。最后利用ARM中的LPC2106芯片来控制液晶显示器和4X4矩阵式键盘,从而实现简单的加、减、乘、除等四则运算功能。 关键字:中断,扫描,仿真,计算 二、原理与总体方案: 主程序在初始化后调用键盘程序,再判断返回的值。若为数字0—9,则根据按键的次数进行保存和显示处理。若为功能键,则先判断上次的功能键,根据代号执行不同功能,并将按键次数清零。程序中键盘部分使用行列式扫描原理,若无键按下则调用动态显示程序,并继续检测键盘;若有键按下则得其键值,并通过查表转换为数字0—9和功能键与清零键的代号。最后将计算结果拆分成个、十、百位,再返回主程序继续检测键盘并显示;若为清零键,则返回主程序的最开始。 电路设计与原理:通过LPC2106芯片进行相应的设置来控制LCD显示器。 而通过对键盘上的值进行扫描,把相应的键值通过MM74C922芯片进行运算从而

一元稀疏多项式计算器C语言课程设计

2014-2015学年第二学期学号1308210115 《软件工程》 课程设计报告 题目:一元稀疏多项式计算器 专业:计算机科学与技术 班级:计算机科学与技术(2)班 姓名: 指导教师: 成绩:

一、问题描述 (3) 二、需求分析 (3) 三、概要设计 (4) 四、详细设计 (5) 五、源代码 (6) 六、程序测试 (18) 七、使用说明 (24) 八、课设总结 (25)

一、问题描述 1.1基本要求 (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1, c2,e2,,,,,,, cn,en,其中n是多项式的项数,ci,ei,分别是第i项的系数和指数,序列按指数降序排序; (3)多项式a和b相加,建立多项式a+b; (4)多项式a和b相减,建立多项式a-b; (5)计算多项式在x处的值。 (6)计算器的仿真界面。 1.2设计目的 数据结构是实践性很强的课程。课程设计是加强学生实践能力的一个强有力手段。课程设计要求学生在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用 二、需求分析 2.1 设计开发环境: 软件方面:系统windows 7 编程软件:VC++ 6.0 2.2思路分析: ①一般情况下的一元n次多项式可写成 pn(x)=p1xe1+p2xe2+……+pmxem 其中,p1是指数为ei的项的非零系数,且满足0≦e1

简易计算器课程设计

基于单片机的计算器的设计 摘要:本设计是一个实现加减乘除的计算器,它的硬件主要由四部分构成,一个8051单片机芯片,两个八段共阴极数码管,一个4*4键盘,它可以实现一位数的加减乘除运算。 显示部分:采用LED动态显示。 按键部分:采用4*4键盘。采用软件识别键值,并执行相应的操作。 关键词:LED接口;键盘接口;8255A;汇编语言 一、概述 1.1设计要求及任务: (1)设计4*4的键盘,其中10个数字键0~9,其余六个键“+”、“—”、“*”、“/”、“=”、和“C”键; (2)设计两位LED接口电路; (3)实现1位数的简单运算 1.2设计原理 (1)LED显示器接口技术 LED动态显示接口技术 (2)键盘显示技术 逐行(逐列扫描法) 二、系统总体方案和硬件设计 2.1计算器总体思想 显示部分:采用LED动态显示。 按键部分:采用4*4键盘。采用软件识别键值,并执行相应的操作。 执行过程:开机显示零,等待键入数值,当键入数字,经通过数码管显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在数码管上输出运算结果。 图1 系统设计框图

2.2硬件的选择与连接 图二硬件连接总图 2.2.1硬件选择 (1)由于本设计比较简单,因此选用内部含有4KBE2PROM的89C51单片机作为系统的核心。 (2)扩展输入/输出端口 在扩展输入/输出端口时,要求输入口能够缓冲,,输出口能够锁存。常用小规模集成电路芯片74LS244或74LS245等扩展输入端口,用74LS273、74LS373、 74LS377扩展输出端口。这种扩展方法的特点是电路简单,但功能单一、灵活性差。因而常采用中规模的可编程并行接口芯片8255A扩展输入/输出端口。 (3)锁存电路采用74LS373 2.2.2接口设计 (1)单片机与8255A的接口设计 8255A中的数据总线缓冲器为三态双向数据缓冲存储器,用于将8255A的数据线 D0~D7和单片机的数据总线(P0口)连接,实现单片机和接口间的数据传送。 读写控制部件的接口设计 1、/CS为片选信号,接成低电平表示8255A 被选中。/CS与P2.7相连,用P2口的最高位控制8255A是否工作。即将P2.7控制为低电平。 2、RESET-复位信号,高电平有效,接在单片机的RST端。 3、/RD和/WR为读写控制信号,低电平有效。分别将两个端口接单片机的/RD和/WR 4、A1和A0-端口选择信号,分别与单片机的低两位地址线P1.1和P1.0相连。用于选择不同端口。采用74LS373三态锁存器,用于分离P0口第八位地址线,将它的Q0和Q1口接至8255A的地址输入端A0和A1。

VB科学计算器课程设计

湖南医药学院 VB计算器课程设计题目: VB科学计算器 院(系)别临床医学院 专业临床医学 班级本临一班 学号 2015101010121 姓名夏铭锴 指导教师李跃强 二○一六年四月

目录 一、设计内容及要求 二、设计原始资料 三、设计完成后提交的文件和图表设计 四、进程安排 五、主要参考资料 [摘要] 用VB制作这个程序的简单计算器,它包括一个标准的计算器和一个科学计算器。它可以实现简单的加减乘除四则运算,数字的平方、平方根,正弦、余弦、正切,倒数、指数函数、对数函数,角度、弧度、梯度的转换,以及各进制的相互转换。而且它的功能还有退格,清除当前数据,清除所有数据,复制数据,粘贴数据。 在这个计算器的程序中,我用到了单行选择语句If…Then…Else…, 块语句if…then…end if,If语句的嵌套,多条件选择语句Select Case,而且还用到了按钮、文本框、框架、单选按钮控件,菜单的设计。 在此报告中我重点叙述了计算机的各个功能及用法。特别是进制间的转换和数字与运算符之间的联系。。虽然描述的不太完整,但我会尽力使用系统结构图,划分多个模块,让大家明白我设计的运算器的功能的。 [关键词] Visual Basic;计算器;对象;代码 1

2

3

四、进程安排 (1)创建应用程序的界面。 (2)设置属性。 (3)编写代码。 4

附页: 设计原始资料 Private Sub Command1_Click() '删除数字的最后一位If Label3.Caption <> "" Then Label3.Caption = Left(Label3.Caption, Len(Label3.Caption) - 1) Else c = MsgBox("内容已为空!不可删除一位!", 49, "注意!") End If End Sub Private Sub Command10_Click() '输入数字6 Label3.Caption = Label3.Caption + Command10.Caption End Sub Private Sub Command11_Click() If Label3.Caption <> "" Then '输入符号* Label1.Caption = Label3.Caption Label2.Caption = Command11.Caption Label3.Caption = "" Else c = MsgBox("请输入数据后输入符号!", 49, "注意!") End If End Sub 5

一元稀疏多项式计算器(数据结构)

【问题描述】 设计一个一元稀疏多项式简单计算器 【基本要求】 一元多项式简单计算器的基本功能是: 1,输入并建立多项式; 2,输出多项式,输出形式为整数序列:n,c1,e1,c2,c2,...,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; 3,多项式a和b相加,建立多项式a+b; 4,多项式a和b相减,建立多项式a-b. 【测试数据】 1,(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7) 【实现提示】 用带表头结点的单链表存储多项式。 #include #include typedef struct node { float coef; int expn; struct node *next; }Lnode, *polynmial; void create(polynmial &L); //输入并建立多项式L void display(polynmial L); //显示,输出多项式L void sort(polynmial &L); //多项式L按指数排序 void reverse(polynmial &L); //逆置 void select(); //用户选择加减操作 void add(polynmial La, polynmial Lb, polynmial &Lc); //多项式La,Lb相加void subtract(polynmial La, polynmial Lb, polynmial &Ld); //多项式La减去Lb,结果给Ld void create(polynmial &L) //输入并建立多项式L { int i, n; static struct node *p; scanf("%d", &n); L = (struct node *)malloc (sizeof(struct node)); L->next = NULL; for(i = 0; i < n; i++) { p = (struct node *)malloc(sizeof(struct node)); scanf("%f %d", &p->coef, &p->expn); p->next = L->next; L->next = p; } }

硬件课程设计简易计算器设计

中国矿业大学徐海学院 单片机课程设计 姓名:XXX学号: 22090XXX 专业:计算机09-4班 题目:硬件课程设计 专题:简易计算器设计 指导教师: XXX 设计地点:嘉园时间: 2011-12-23 20011年12月

单片机课程设计任务书 专业年级计算机09-4 学号22090XXX 学生姓名XXX 任务下达日期:2011年12 月15日 设计日期:2011 年12 月15 日至2011 年12 月23日 设计题目:硬件课程设计 设计专题题目:简易计算器设计 设计主要内容和要求: 摘要: 利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个计算器。 主要能实现 1.加法:能够计算四位以内的数的加法。 2减法:能计算四位数以内的减法。 3乘法:能够计算两位数以内的乘法。 4除法:能够计算四位数的乘法 5有清零功能,能随时对运算结果和数字输入进行清零。 关键词:单片机; 计算器 ; 加减乘除 指导教师签字:

目录 1 系统概述 (1) 1.1硬件知识概述 (1) 1.1.1 单片机 (1) 1.1.2 C语言 (1) 1.1.3 ISP (1) 1.2设计基本思想 (1) 2硬件电路设计 (2) 2.1 单片机最小系统 (2) 2.2键盘接口电路 (2) 2.3数码管显示电路 (3) 3 软件设计 (4) 3.1 复位电路 (4) 4.系统调试 (5) 4.1 软件流程图 (5) 4.1.1系统软件系统流程图 (5) 5.结束语 (6) 参考文献 (7) 附录 (8)

1 系统概述 1.1硬件知识概述 1.1.1 单片机 单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。 1.1.2 C语言 C语言是一种计算机程序设计语言。它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所的D.M.Ritchie于1972年推出。1978后,C语言已先后被移植到大、中、小及微型机上。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画。具体应用比如单片机以及嵌入式系统开发。 1.1.3 ISP ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码,而不需要从电路板上取下器件,已经编程的器件也可以用ISP 方式擦除或再编程。本次课程设计便使用ISP 方式,直接将编写好的程序下载到连接好的单片机中进行调试 1.2设计基本思想 利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个计算器,用四位一体数码管显示计算数值及结果。要求用Protel 画出系统的电路原理图,绘出程序流程图,并给出程序清单。 主要能实现 1.加法:能够计算四位以内的数的加法。 2减法:能计算四位数以内的减法。 3乘法:能够计算两位数以内的乘法。 4除法:能够计算四位数的乘法 5有清零功能,能随时对运算结果和数字输入进行清零。

一元稀疏多项式计算器实验

一元稀疏多项式计数器预习报告 姓名:刘茂学号2220 一、实验要求 (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。序列按指数降序排列; (3)多项式a和b相加,建立多项式a+b; (4)多项式a和b相减,建立多项式a-b。 (5)多项式求值; (6)多项式求导; (7)求多项式的乘积。 二、测试数据: 1、(2x+5x^^11)+(7-5x^8+11x^9)=^11+11x^9+2x+7); 2、(6x^-3-x+^^9+^9)-(-6x^-3+^2-x^2+^15 )=^^9+12x^-3-x); 3、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5); 4、(x+x^3)+(-x-x^3)=0; 5、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200); 6、(x+x^2+x^3)+0=x+x^2+x^3. 7、互换上述测试数据中的前后两个多项式。 三、思路分析 用带表头结点的单链表存储多项式。 本程序要求输入并建立多项式,能够降幂显示出多项式,实现多项式相加相减的计算问题,输出结果。

采用链表的方式存储链表,定义结点结构体。运用尾差法建立两条单链表,以单链表polyn p和polyn h分别表示两个一元多项式a和b。 为实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q 结点的指数项。 ① 若p->expnexpn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。 ② 若p->expn=q->expn,则将两个结点中的系数相加,当和不为0时修改结点p的系数。 ③ 若p->expn>q->expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。 四、实验程序 //头文件 #include<> #include<> #include<> //定义多项式的项 typedef struct Polynomial{ float coef; int expn; struct Polynomial *next; }*Polyn,Polynomial; void Insert(Polyn p,Polyn h){ if(p->coef==0) free(p);//系数为0的话释放结点 else

一元稀疏多项式计算器(数据结构)

院系:计算机科学学院 专业:软件工程 年级: 2013级 课程名称:数据结构 姓名:韦宜(201321092034)指导教师:宋中山 2015年 12 月 15日

题目:设计一个一元稀疏多项式简单计算器 班级:软件工程1301 姓名:韦宜学号:201321092034 完成日期:12月15日 一、需求分析 问题描述:设计一个一元多项式加法器 基本要求: 输入并建立多项式; (2)两个多项式相加; (3)输出多项式:n, c1, e1, c2, e2, …cn , en, 其中,n是多项式项数,ci和ei分别是第i 项的系数和指数,序列按指数降序排列。 (4)计算多项式在x处的值; (5)求多项式的导函数。 软件环境:Windows,UNIX,Linux等不同平台下的Visual C++ 6.0 硬件环境: 512MB内存,80Gb硬盘,Pentium4 CPU,CRT显示器。

二、概要分析 本程序有五个函数: PolyNode *Input()(输入函数); PolyNode *Deri(PolyNode *head)(求导函数); PolyNode * Plus(PolyNode *A,PolyNode *B)(求和函数); void Output(PolyNode*head)(输出函数); int main()(主函数) 本程序可使用带有附加头结点的单链表来实现多项式的链表表示,每个链表结点表示多项式的一项,命名为node,它包括两个数据成员:系数coef和指数exp,他们都是公共数据成员,*next为指针域,用链表来表示多项式。适用于不定的多项式,特别是对于项数再运算过程中动态增长的多项式,不存在存储溢出的问题。其次,对于某些零系数项,在执行加法运算后不再是零系数项,这就需要在结果多项式中增添新的项;对于某些非零系数项,在执行加法运算后可能是零系数项,这就需要在结果多项式中删去这些项,利用链表操作,可以简单的修改结点的指针以完成这种插入和删除运算(不像在顺序方式中那样,可能移动大量数据项)运行效率高。

单片机简易计算器课程设计报告书

课程设计 题目名称简易计算器设计 课程名称单片机原理及应用 学生姓名 班级学号 2018年 6 月20日

目录 一设计目的 (2) 二总体设计及功能介绍 (2) 三硬件仿真图 (3) 四主程序流程图 (4) 五程序源代码 (4) 六课程设计体会 (17)

一设计目的 本设计是基于51系列单片机来进行的简单数字计算器设计,可以完成计算器的键盘输入,进行加、减、乘、除六位整数数围的基本四则运算,并在LED上显示相应的结果。软件方面使用C语言编程,并用PROTUES仿真。 二总体设计及功能介绍 根据功能和指标要求,本系统选用MCS-51系列单片机为主控机,实现对计算器的设计。具体设计及功能如下: 由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LED 显示数据和结果; 另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘; 执行过程:开机显示零,等待键入数值,当键入数字,通过LED显示出来,当键入+、-、*、/运算符,计算器在部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LED上输出运算结果。

三硬件仿真图 硬件部分比较简单,当键盘按键按下时它的那一行、那一列的端口为低电平。因此,只要扫描行、列端口是否都为低电平就可以确定是哪个键被按下。

四主程序流程图 程序的主要思想是:将按键抽象为字符,然后就是对字符的处理。将操作数分别转化为字符串存储,操作符存储为字符形式。然后调用compute()函数进行计算并返回结果。具体程序及看注释还有流程图 五程序源代码 #include #include #include/* isdigit()函数 */ #include/* atoi()函数 */ #define uchar unsigned char #define uint unsigned int

相关文档
最新文档