简易c语言开发工具简易计算器的设计和实现

如何用C语言实现一元多项式简单计算器的设计
如何用C语言实现一元多项式简单计算器的设计
〔问题描述〕输入并建立两个多项式并输出多项式设计一个程序:对两个多项式进行加、减法及乘法运算,建立一个新多项式并输出.
或设计一个程序对其中一个多项式求导。 〔实现提示〕
选择带头结点的单链表或循环链表存储多项式,头结点中存放多项式的参数.此单链表的数据结构为:typedef struct pdode{
float coef ;
/* 系数域*/
int expn ;
/* 指数域*/
struct pnode
} pnode ,*polylink
补充:是数据结构的题目~~要教过程为什么加分
不区分大小写匿名
/*:--------------一元稀疏多项式计算(部分)--------------*
* 基本功能:(1)输入并建立多项式; *
* (2)多项式输出,以 c1,e1,c2,e2,...输出 *
* 其中ci为系数,ei为指数; *
* (3)多项式相加,c=a+b。 *
* 说明: (1)多项式一指数升序排序,但输入时不检查; *
* (2)以带头指针的单链表存储。 *
*-------------------------------------------------------*/
#define OK 1
#define FAILE 0
#define ERROR 0
#define OVERFLOW 0
#include &iostream&
typedef struct PolynNode { /*某一项*/
} ElemType,
typedef struct LNode {
struct LNode *
}LNode,*LinkL
typedef LinkList P /*带头结点*/
int init_polyn(Polyn head,int n)
{/*创建有n项的多项式,n应大于0,但不作检查*/
/*指数e1&e2&e3...,但不作检查,间隔地输入系数与指数,即c1 e1 ...*/
Polyn p,q =
if(head == NULL)
return ERROR;
if((p = (Polyn)malloc(sizeof(LNode))) == NULL)
return OVERFLOW;
printf(&Please input n pairs of coef and expn.\n&);
for(count = 0;count &count++) {
scanf(&%f%d&,&coef,&expn);
p-&data.coef =
p-&data.expn =
if((p = (Polyn)malloc(sizeof(LNode))) == NULL)
return OVERFLOW;
q-&next = NULL;/*尾*/
return OK;
int print_polyn(Polyn head)
Polyn p=head-&
if(head == NULL)
return ERROR;
while(p != NULL) {
printf(&%.4lf % 3d&,p-&data.coef,p-&data.expn);
if((count % 10 == 0) && (!count))
printf(&\n&);
return OK;
int add_polyn(Polyn ha,Polyn hb,Polyn hc)
{/*多项式相加*/
Polyn p1 = ha,p2 = ha,q1 = hb,q2 =
while( (p1 != NULL) && (q1 != NULL)) {
if(p1-&data.expn & q1-&data.expn) { /*p1指数&q1指数*/
if(p1-&data.expn == q1-&data.expn) { /*q1指数==p1指数*/
if(!(p1-&data.coef + q1-&data.coef)) {/*系数之和为0*/
free(p2-&next);
p2-&next = p1;
free(q2-&next);
q2-&next =q1;
else { /*系数之和不为0*/
p1-&data.coef += q1-&data.
free(q2-&next);
q2-&next =q1;
else { /*q1指数&p1指数*/
p2-&next = q1;
q1-&next = p1;
q2-&next = q1;
if(p1 == NULL) { /*p1结束了,q1未结束*/
p2-&next = q1;
ha-&next = NULL;
return OK;
int main()
int creat_polyn(Polyn head);
int init_polyn(Polyn head,int n);
int print_polyn(Polyn head);
int add_polyn(Polyn ha,Polyn hb,Polyn hc);
LNode polyn1,polyn2;
Polyn ha = &polyn1,hb = &polyn2,
printf(&How many terms do you want to initial the polynomial ha?Input a number.\n&);
scanf(&%d&,&n);
init_polyn(ha,n);
print_polyn(ha);
printf(&How many terms do you want to initial the polynomial hb?Input a number.\n&);
scanf(&%d&,&n);
init_polyn(hb,n);
print_polyn(hb);
add_polyn(ha,hb,hc);
print_polyn(hc);
#include &stdio.h&
#include &stdlib.h&
//如果需要小数,把int改成float
void min()
printf(&1:&);
scanf(&%d&,&a);
fflush(stdin);
printf(&+-*/:&);
scanf(&%c&,&op);
fflush(stdin);
printf(&2:&);
scanf(&%d&,&b);
fflush(stdin);
switch(op)
printf(&+-/*!!!error&);
printf (&%d\n&,c);
int main()
等待您来回答
编程领域专家文档贡献者
该文档贡献者很忙,什么也没留下。
下载此文档
正在努力加载中...
c语言课程设计报告
计算器的实现(内含完整报告,流程图,截屏,总结等)
文档星级:
内容提示:c语言课程设计报告
计算器的实现(内含完整报告,流程图,截屏,总结等),c语言计算器,c语言计算器程序,简单计算器c语言,计算器c语言代码,c语言流程图,用c语言编写计算器,c语言简易计算器,c语言程序流程图,c语言流程图生成器,c语言流程图软件
文档格式:DOC|
浏览次数:14|
上传日期: 05:38:29|
下载积分:
该用户还上传了这些文档
官方公共微信
下载文档:c语言课程设计报告
计算器的实现(内含完整报告,流程图,截屏,总结等).DOC文档贡献者
该文档贡献者很忙,什么也没留下。
下载此文档
正在努力加载中...
C语言课程设计--一个简易计算器的设计与实现
文档星级:
内容提示:C语言课程设计--一个简易计算器的设计与实现
文档格式:PDF|
浏览次数:273|
上传日期: 15:48:19|
下载积分:
该用户还上传了这些文档
官方公共微信
下载文档:C语言课程设计--一个简易计算器的设计与实现.PDF第13课 学了C语言,如何写一个更高级的计算器?(如何计算一个字符串表示的计算式的值?——递归算法实现) - C语言动手训练营 - 好知网
L13学了C语言,如何写一个更高级的计算器?(如何计算一个字符串表示的计算式的值?——递归算法实现)
在的8.7.3 向main()函数传递数据这一小节中,我们介绍了如何通过main()函数的参数,向程序传递两个数据并计算其和值的简单加法计算器add.exe。这个程序,好用是好用,就是太简单,还停留在幼儿园大班的水平,只能计算两位数的加法。我们现在基本都已经是大学生了,如果还是用这个简陋的加法计算器去向面试官展示我们的编程能力,肯定会遭到他们的笑话。在看完后,我们的编程能力已经今非昔比了。自然,我们也可以利用从这本书中学到的知识(函数,字符串处理等),把这个计算器改进一下,让他成为一个可以计算更多数据更多算符的高级计算器。我们是怎么计算一个复杂计算式的?我们总是根据要求列出一个计算式,这个计算式中有数字(整数)和对数字进行操作的算符(+,-,*,/四种运算),然后,从左到右依次计算,最后得到结果。比如,我们要计算1 + 2 – 3 * 4我们总是先计算3*4得到12,然后计算1+2得到3,最后计算3-12得到结果-9;而如果我们想用程序对这个字符串表示的计算式进行计算,又该如何进行呢?如果这个计算式比较简单,比如,只有1+2,我们倒是可以找出其中的符号和数字字符,然后将数字字符转换为数字进行计算,而如果这个计算式比较复杂,比如这里的1+2-3*4又该如何进行呢?回想一下,在数学课上老师是怎么教我们的?面对复杂的计算式,我们可以把它拆分成多个不太复杂的计算式,而不太复杂的计算式我们又可以将它拆分成简单的计算式。这种“大事化小,小事化了”的解题思路,刚好切合了我们的递归函数的设计思路。换句话说,他们都是将一个大问题转化为同类型的小问题,逐渐分解,直到最后可以很容易的得到结果。按照这样的递归函数的设计思路,同时结合数学中计算式的结合律(为了符合结合律,我们查找字符串中的运算符时,从字符串的末尾find_last()开始查找,这样可以避免运算顺序改变后更改运算符号。比如,6-3-3,如果我们从字符串的开始查找运算符,首先找到第一个减号,计算式被分为了(6) – (3-3)两部分,这样计算的结果就不正确了,如果我们从末尾开始查找运算符,则分解后得到(6-3) – (3)这样计算结果就是正确的。)另外还需要注意的是,乘除运算的优先级是高于加减运算的,因为函数的递归,实际上是最先计算最里层的函数,所以,我们应该先分解加减运算,将乘除运算放到最里层。按照上面的思路分析,我们可以把这个更高级的,可以计算计算式字符串的计算器实现如下:
// eval.c 计算字符串计算式的值
#include &string.h&
#include &stdio.h&
int find_last(const char* s,char a)
int pos = strlen(s);
// 从字符串末尾位置开始查找
const char* p = s +
// 如果没有到达字符串开始的前一个位置(s-1)
while((s-1)!=p)
// 如果当前位置的字符就是要查找的字符
if(*p == a)
18: // 结束查找哦啊
p--; // 变换到下一个位置
if((s-1)!=p) // 找到字符
else // 未找到
return -1;
// 取得字符串的左半部分
char* left_str(char* s,int pos)
s[pos] = '\0';
// 取得字符串的右半部分
char* right_str(char* s,int pos)
return s + pos + 1;
// 计算字符串计算式s的值
int eval(char* s)
int n = 0;
// 找到最后一个加号
n = find_last(s,'+');
if(-1 != n)
// 以加号所在的位置,将字符串分为左右两部分分别计算
// 然后将两部分的值加起来
return eval(left_str(s,n)) + eval(right_str(s,n));
n = find_last(s,'-');
if(-1 != n)
return eval(left_str(s,n)) - eval(right_str(s,n));
n = find_last(s,'*');
if(-1 != n)
return eval(left_str(s,n)) * eval(right_str(s,n));
n = find_last(s,'/');
if(-1 != n)
return eval(left_str(s,n)) / eval(right_str(s,n));
// 当字符串中不包含运算符时,返回这个数字本身
return atoi(s);
int main(int argc,char* argv[])
// 检查参数是否合法
if(2 != argc)
puts("usage: eval 1+2+3");
// 复制从参数得到的计算式字符串
char expr[32] = "";
strcpy(expr,argv[1]);
// 对计算式字符串进行计算,得到结果
int res = eval(expr);
// 输出结果
printf("%s = %d",argv[1],res);
} 现在,我们就可以用这个更高级的计算器计算最开始的那个计算式了:F:\code&gcc -o eval.exe 35.cF:\code&eval 1+2-3*41+2-3*4 = -9把这个程序给那些面试官们看看,亮瞎他们的双眼!
恭喜您完成了该课时的学习,还有3课时未学,
该操作需要登录,请先或。
课程创建人
自 2004 年起连续被评为微软最有价值专家。著有《我的第一本C++书》《C程序设计伴侣》,并译有《C++11 FAQ中文版》。乐于帮助他人学习C/C++语言。
课程最新笔记
程序较易懂,使用两个嵌套的While循环实现连续猜数和重复游戏,同时使用了两个Break语句在条件满足时退出内外循环,退...
课程最新问题
相关小组最新话题
学习路上要有伙伴同行!
每天同学们在这儿学习数万课时,登录后一起学习交流吧。
已有好知网帐号? 也可从合作网站帐号登录:}

我要回帖

更多关于 简易c语言开发工具 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信