用C语言解决一元多项式运算问题

用C语言解决一元多项式运算问题
用C语言解决一元多项式运算问题

用C语言解决一元多项式运算问题

摘要本数据结构课程设计运用一元多项式运算的基本法则,对一元多项式的加法、减法运算进行设计,并有人机交换界面。本课程设计中,系统开发平台为Windows XP;程序设计语言主要采用C语言,其中也掺入了C++部分语句,兼而两者的优势并存;开发环境为Microsoft Visual C++ 6.0,友好的界面、功能更加强大,相比较于C语言的专用开发环境Turbo C,其操作简单却已能完全在其环境中借用C语言开发设计出源程序;程序运行平台为Windows 98/2000/XP,程序兼容特性比较强,具有很好的移植特性。在程序设计中,整个程序层次结构突出,直观性与易理解性优势明显。程序通过调试运行后,完成了一元多项式运算的各种操作的设想,符合题目要求,初步实现了设计目标,达到了预期的效果。

关键词:数据结构课程设计; C程序语言;多项式

1 引言

计算机的快速发展,特别是计算机网络的发展,越来越深刻地改变了人们生活的方方面面。但同时,也要求人们能高效、有效地完成某些运算任务。而“数据结构”是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心课程,而且已成为其他理工专业的热门选修课。本课程设计主要是对所学的数据结构知识进行整合和运用,解决在一元多项式的运算,包括加法、减法及乘法运算,通过该程序,将大大减少运算时间,提高工作效率。

2 课程设计目的

在我们对一个具体的问题进行分析时,往往要抽象出一个模型,设计一个算法来实现所需要达到的功能。

在此程序中,我们主要是综合运用所学过的知识,回顾VC++编程的同时,熟悉并掌握数据结构中的算法分析与设计。

同时,要掌握类C语言的算法转换成C程序并上机调试的基础;

这次课程设计,要求设计一个C语言程序,该程序能够按照指数的降幂排列,并完成多个一元多项式的相加、相减、相乘,并将结果输出。

通过这次课程设计,进一步巩固《数据结构》等课程所学的知识,特别加强指针、结构体、文件数据类型的应用,熟悉面向过程的结构化、了解面向对象设计方法,通过本次课程设计的实践,加强动手能力的操作,掌握程序设计的流程,以及用C程序语言编写程序,从而解决实际问题的能力,了解掌握Visual C++开发环境,在老师的指导下,独立完成课程设计的全部内容,培养严谨的科学态度和认真学习的工作作风,培养创造性思维方式。

3 系统分析

3.1 问题描述

用C语言编写一段程序,该程序的功能相当于一个一元多项式的计算器,能够实现按照指数降幂建立并输出多项式,并且能够完成多个多项式的相加、相减及相乘运算及结果输出的功能。

此程序的数据结构是选择用带表头结点的单链表存储多项式。虽然一元多项式可以用顺序和链表存储结果表示,但顺序结构的最大长度很难确定。比如当多项式的系数较大时,此时就会浪费存储空间,所以应该选用链表结构来存储一元多项式。但链表的结构体可以用来存储多项式的系数、指数、下一个指针3个元素,这样便于实现任意多项式的加法、减法、乘法运算。

3.2 设计思路

通过对问题的描述,可设计出如图2-1所示的一元多项式总流程图:

图3-1 一元多项式运算总流程图

(1)一元多项式的建立

输入多项式采用头插法的方式,输入多项式中的一个项的系数和指数,就产生一个新的结点,建立起它的右指针,并用头结点指向它;为了判断一个多项式是否输入结束,定义一个结束标志,当输入非0时就继续;输入为0时,就结束一个多项式的输入。(2)显示一元多项式

如果系数是大于0的话就输出<+系数x^指数>的形式;如果系数是小于0的话就输出<系数x^指数>的形式;如果指数为0的话就直接输出<系数>;如果指数是1的话就直接输出<+x>;如果指数是-1的话,就直接输出<-x>。

(3)一元多项式加法运算

从两个多项式的头部开始判断,当两个多项式的某一项度不为空时,假设P、Q分别指向多项式A和多项式B中当前进行比较的结点,然后比较两个结点中的指数项,有三种情况:1、当P所指结点的指数小于Q的话,就应该复制P的结点到多项式链中。2、P所指结点的指数如果大于Q的指数的话,就应该复制Q的结点到多项式链中。3、当P 所指结点的指数等于Q所指结点的指数时,则将两个结点中的系数相加,若和不为0,则修改P所指结点的系数值,同时释放Q所指结点;若和为0,从多项式A的链表中删除相应结点,并释放P、Q所指结点。加法流程图如图2-2所示:

(4

从两个多项式的头部开始判断,当两个多项式的某一项度不为空时,假设P、Q分别指向多项式A和多项式B中当前进行比较的结点,然后比较两个结点中的指数项,有三种情况:1、当P所指结点的指数小于Q的话,就应该复制P的结点到多项式链中。2、P所指结点的指数如果大于Q的指数的话,就应该复制Q的结点到多项式链中,并将建立的结点系数变为相反数。3、当P所指结点的指数等于Q所指结点的指数时,并将Q 的结点系数变为相反数,并将两个结点中的系数相加,若和不为0,则修改P所指结点的系数值,同时释放Q所指结点;若和为0,从多项式A的链表中删除相应结点,并释放P、Q所指结点。减法流程图如图2-3所示:

图3-3 一元多项式减法运算流程图

4 系统的详细设计

4.1 主要算法设计

(1)结构式的定义

typedef int status;

typedef struct NodeType { float fCoeff; //系数

int iExpon; //指数

struct NodeType *next; //下一个指针

} NodeType, *LinkType;

(2)系统中使用的各函数说明:

status MakePolyBuff(PolyPointer *, const int);

status MakeNode(polynomial *, const float, const int);

void AppNodeToList(polynomial *, polynomial); /* 在链表尾追加结点*/ status CreatePolyn(PolyPointer, int);

//输入m项的系数和指数,建立表示一元多项式的有序链表

status ProcStrError(const char[]); /* 检查输入的数据*/

void SortPolyn(PolyPointer, int); /* 根据iExpon域对链表进行升序排序*/ void DestroyBuff(PolyPointer, const int); //销毁一元多项式

void DestroyPolyn(polynomial);

int PolynLength(const polynomial); /* 求链表的长度*/

void AddProcess(PolyPointer, const int, PolyPointer, const int); //加法运算

void SubstractProcess(PolyPointer, const int, PolyPointer); //减法运算

void MultiplyProcess(PolyPointer, const int, PolyPointer); //乘法运算

void PrintPolyn(const polynomial); //打印输出的一元多项式

void MergePolynCoeff(PolyPointer, int); /* 在有序链表中,合并同类项*/ (3)主函数:

int main(void) {

int iCounter,

iPolyNum; /* 多项式链表缓冲区中链表的个数*/

PolyPointer PolyBuff = NULL; /* 用户输入的多项式链表缓冲区*/ polynomial PolyAddRes = NULL, /* 存放连加结果链表*/ PolySubRes = NULL, /* 存放连减结果链表*/

PolyMulRes = NULL; /* 存放连乘结果链表*/

char strNum[10];

do {

printf("请输入需要构造多项式的个数,至少2个: ");

gets(strNum);

iPolyNum = atoi(strNum);

} while (iPolyNum < 2);

MakePolyBuff(&PolyBuff, iPolyNum); //分配内存

CreatePolyn(PolyBuff, iPolyNum); //建立多项式的有序链表SortPolyn(PolyBuff, iPolyNum);

MergePolynCoeff(PolyBuff, iPolyNum);

printf("\n打印用户输入并整合后的多项式:\n");

for (iCounter = 0; iCounter < iPolyNum; iCounter++) { //依次输入非零项printf("第%d个项式:\n", iCounter + 1);

PrintPolyn(*(PolyBuff + iCounter)); //打印输出该多项式

}

4.2 输入多项式时正确形式的实现

status ProcStrError(const char str[]) { //判断是否输入

const char *cpCurr = str;

if (!strlen(str)) {

printf("你没有输入数据!\n");

return FALSE;

}

while (*cpCurr != '\0') { //判断输入方式是否正确

if (!(*cpCurr == ' ' || *cpCurr == ',' || *cpCurr == ';' || *cpCurr == '-') && ('0' > *cpCurr || *cpCurr > '9') || (*(cpCurr + 1) == '\0' && *cpCurr != ';')) {

printf("输入数据出错,请注意正确的输入方式!\n");

return FALSE;

}

cpCurr++;

}

4.3 运行结果分析:

对程序进行编译运行,按照窗口的提示,输入多项式个数。

首先考虑多项式个数为2,且各指数的系数为正数时。输入数据是,特别注意多项式系数、指数的输入,如图图3-1的所示:

图3-1 多项式的输入运行图

最终运算结果,如图3-2:

图3-2 一元多项式运算运行图1

当多项式个数大于等于2时,且输入各指数的系数均为正数时,对程序进行编译。输入多项式个数为3,具体运行图如图3-3所示:

当输入的多项式系数中存在负数时,对程序进行编译,结果运行图如图3-4所示:

5 结束语

5.1端正程序设计态度

在这次课程设计中,我遇到了不少困难,但是在我的坚持和虚心请教中都得到顺利解决。在这次课程设计中,我发现理论必须和实践相结合,才能真正学会程序设计,才能完成一个课题。在这次设计中我参考了不少书籍,从中学到了课堂中无法学到的许多东西,对此我感到很兴奋。原来不断的学习,不断的探索是苦中带着甜,虽然经历了不少弯路,经历了不少挫折,但当程序调试成功后,当运行能达到要求后,我感到十二分成就感。面对课题,要展现自信出来,这是成功的一半,在这个设计过程中,不懂的可以虚心向老师请教,与同学交流经验。态度是成功的基石!

5.2 程序设计体会

在我这课题中,关键在于对一元多项式的表示及相加的操作。这个实际问题,在学习过的知识中找到一种合适的模型来模拟,数据结构的选择是主要,而对于编写代码,所涉及的并不是很复杂,对于链表数据存储访问方式,在C语言的学习过程中已经有过很多讲解,为了进一步了解,我还阅读了一些数据结构中关于链表的叙述。对于这个课题,运用C语言简单一点的结构化程序设计已足能满足要求而不至于结构过于复杂,为了简便的实现插入操作,我选择了一个带表头结点的链表。在写源代码时要注意指针使用的正确性,为产生的新结点需及时分配存储空间。在设计中将问题抽象化,而完成后在运行时,可以说是用抽象的数据模型来解决实际问题。我的这个课题相比较于其他同学来说,是相对简单的一点的。在现实中,很多功能现在都没法实现,对于文件的写入,我也只是参考了一些书籍,只能写,不能读,还有不少操作需进一步完善,这次程序设计有很多不足处,可能是因为经验不足,对问题预期不够等一些不可预见的原因所致,这些都是我以后要汲取的教训。

参考文献

[1] 严蔚敏,吴伟民.数据结构(C语言版). 北京:清华大学出版社,1997

[2]李云清,杨庆红.数据结构(C语言版). 北京:人民邮电出版社,2006

[3][美]Brian W.Kernighan,Dennis M.Ritchie 。C程序设计语言(第2版?新版). 机械工业出版社 2004

[4] Stephen prata. C.Primer.Plus.第五版.北京:北京邮电大学,2004

[5] 王敬华,林萍,陈静. C语言程序设计. 北京:清华大学出版社,2006

太平洋网站,https://www.360docs.net/doc/8c8590036.html,/Info/38/Info15372/:2010-3-5

附录1:结构化设计源程序清单

//程序名称:v.cpp

//程序功能:应用数据结构,采用C语言设计程序,实行一元多项式的加减乘法运算//程序作者:

//最后修改日期:

#include

#include

#include

#include

#define TRUE 1

#define FALSE 0

#define POSITIVE 1

#define NEGATIVE -1

typedef int status;

typedef struct NodeType { //项的表示,多项式的项作为数据元素

float fCoeff; //系数

int iExpon; //指数

struct NodeType *next;

} NodeType, *LinkType;

typedef LinkType polynomial; //用带表头结点的有序链表表示多项式

typedef polynomial *PolyPointer;

//……………基本操作的函数原型说明…………….

status MakePolyBuff(PolyPointer *, const int);

status MakeNode(polynomial *, const float, const int);

void AppNodeToList(polynomial *, polynomial); /* 在链表尾追加结点*/

status CreatePolyn(PolyPointer, int);

//输入m项的系数和指数,建立表示一元多项式的有序链表

status ProcStrError(const char[]); /* 检查输入的数据*/

void SortPolyn(PolyPointer, int); /* 根据iExpon域对链表进行升序排序*/ void DestroyBuff(PolyPointer, const int); //销毁一元多项式

void DestroyPolyn(polynomial);

int PolynLength(const polynomial); /* 求链表的长度*/

void AddProcess(PolyPointer, const int, PolyPointer, const int); //加法运算void SubstractProcess(PolyPointer, const int, PolyPointer); //减法运算

void MultiplyProcess(PolyPointer, const int, PolyPointer); //乘法运算

void PrintPolyn(const polynomial); //打印输出的一元多项式

void MergePolynCoeff(PolyPointer, int); /* 在有序链表中,合并同类项*/ //主程序

int main(void) {

int iCounter,

iPolyNum; /* 多项式链表缓冲区中链表的个数*/

PolyPointer PolyBuff = NULL; /* 用户输入的多项式链表缓冲区*/ polynomial PolyAddRes = NULL, /* 存放连加结果链表*/

PolySubRes = NULL, /* 存放连减结果链表*/

PolyMulRes = NULL; /* 存放连乘结果链表*/

char strNum[10];

do {

printf("请输入需要构造多项式的个数,至少2个: ");

gets(strNum);

iPolyNum = atoi(strNum);

} while (iPolyNum < 2);

MakePolyBuff(&PolyBuff, iPolyNum); //分配内存

CreatePolyn(PolyBuff, iPolyNum); //建立多项式的有序链表

SortPolyn(PolyBuff, iPolyNum);

MergePolynCoeff(PolyBuff, iPolyNum);

printf("\n打印用户输入并整合后的多项式:\n");

for (iCounter = 0; iCounter < iPolyNum; iCounter++) { //依次输入非零项printf("第%d个项式:\n", iCounter + 1);

PrintPolyn(*(PolyBuff + iCounter)); //打印输出该多项式

}

AddProcess(PolyBuff, iPolyNum, &PolyAddRes, POSITIVE);

printf("\n----------------连加结果-----------------\n");

PrintPolyn(PolyAddRes); //打印输出连加结果

SubstractProcess(PolyBuff, iPolyNum, &PolySubRes);

printf("\n----------------连减结果-----------------\n");

PrintPolyn(PolySubRes); //打印输出连减结果

MultiplyProcess(PolyBuff, iPolyNum, &PolyMulRes);

printf("\n----------------连乘结果-----------------\n");

PrintPolyn(PolyMulRes); //打印输出连乘结果

printf("\n运行完毕!\n");

/* 回收资源*/

DestroyBuff(PolyBuff, iPolyNum); //销毁一元多项式

DestroyPolyn(PolyAddRes); //销毁连加结果

DestroyPolyn(PolySubRes); //销毁连减结果

DestroyPolyn(PolyMulRes); //销毁连乘结果

getch();

return 0;

}

status MakePolyBuff(PolyPointer *polyBuffHead, const int iPolyNum) { int iCounter; //定义多项式个数

*polyBuffHead = (PolyPointer)

malloc(sizeof(polynomial) * iPolyNum); //分配内存

if (!(*polyBuffHead)) { //内存溢出

printf("错误,内存溢出!\n");

return FALSE;

}

for (iCounter = 0; iCounter < iPolyNum; iCounter++)

*(*polyBuffHead + iCounter) = NULL;

return TRUE;

}

status CreatePolyn(PolyPointer PolyBuff, int iPolyNum) {

//输入m项的系数和指数,建立表示一元多项式的有序链表

int iCounter, iExpon; //分别定义多项式个数,及指数

float fCoeff; //系数

char strNum[100], strTemp[64], *cpCurr, *cpCurrNum;

polynomial pNewNode = NULL, pInsPos = NULL; //初始化

printf("\n请输入构造多项式的系数和指数...\n");

printf("输入一个多项式的方式为: 系数, 指数; ... ; 系数, 指数;\n例如: 3, 4; 5, 6; 7, 8;\n");

for (iCounter = 0; iCounter < iPolyNum; iCounter++) { //依次输入m个非零项

printf("\n请输入第%d个多项式:\n", iCounter + 1);

gets(strNum);

if(!ProcStrError(strNum)) return FALSE; //当前链表不存在该指数项

cpCurr = cpCurrNum = strNum;

while (*cpCurr != '\0') {

if (*cpCurr == ',') {

strncpy(strTemp, cpCurrNum, cpCurr - cpCurrNum);

strTemp[cpCurr - cpCurrNum] = '\0';

fCoeff = (float)atof(strTemp);

cpCurrNum = cpCurr + 1;

}

else if (*cpCurr == ';') {

strncpy(strTemp, cpCurrNum, cpCurr - cpCurrNum);

strTemp[cpCurr - cpCurrNum] = '\0';

iExpon = atoi(strTemp);

MakeNode(&pNewNode, fCoeff, iExpon);

AppNodeToList(PolyBuff + iCounter, pNewNode);

cpCurrNum = cpCurr + 1;

}

cpCurr++;

}

}

return TRUE;

}

status MakeNode(LinkType *pp, const float coeff, const int expon) { //创建结点if (!(*pp = (LinkType)malloc(sizeof(NodeType) * 1))) {

printf("Error, the memory is overflow!\n");

return FALSE;

}

(*pp)->fCoeff = coeff;

(*pp)->iExpon = expon;

(*pp)->next = NULL;

return TRUE;

}

void AppNodeToList(polynomial *pHead, polynomial pNewNode) {

//多项式加法,利用两个多项式结点构成“和多项式”

static polynomial pCurrNode;

if (!(*pHead)

(*pHead) = pCurrNode = pNewNode;

else {

pCurrNode->next = pNewNode;

pCurrNode = pCurrNode->next;

}

}

void SortPolyn(PolyPointer PolyBuff, int iPolyNum) { //建立有序链表int iCounter;

polynomial pTemp, pTempCurrNode, /* 临时链表*/ pPrevMinExp, pCurrMinExp,/* 指向最小iExpon结点的指针*/ pCurrNode, pPrevNode;

for (iCounter = 0; iCounter < iPolyNum; iCounter++) {

pTemp = NULL;

while (*(PolyBuff + iCounter) != NULL) {

pPrevNode = pPrevMinExp = pCurrMinExp =

*(PolyBuff + iCounter);

pCurrNode = (*(PolyBuff + iCounter))->next;

while (pCurrNode != NULL) {

if (pCurrMinExp->iExpon > pCurrNode->iExpon) {

pPrevMinExp = pPrevNode;

pCurrMinExp = pCurrNode;

}

pPrevNode = pCurrNode;

pCurrNode = pCurrNode->next;

}

C语言中的运算符总结解读

C语言中的运算符总结 C语言中的操作符:算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用、函数调用和结构成员。 1.算术操作符:+ - * / % 1除了% 操作符之外,其他的几个操作符均可以作用于整数和浮点数。 2对于/ 操作符,如果两个操作数都为整数,执行整数除法;而只要有浮点数执行的就是浮点数除法。 3% 操作符的两个操作数必须为整数,返回的是整除之后的余数。 2.移位操作符: << 左移操作符和 >> 右移操作符(针对二进制位、是对整数的操作 1左移操作符移位规则:左边丢弃、右边补0。 2右移操作符移位规则:(1算术移位:左边补符号位,右边丢弃。 (2逻辑移位:左边补0,右边丢弃。 注:对于移位运算符,不能移动负数位,这个是标准未定义的。 3.位操作符:& 按位与 | 按位或 ^ 按位异或(操作数都必须是整数,是针对二进制数的操作 4.赋值操作符:= 可以重新为变量赋值(赋值操作符是可以连续使用的,从右向左执行,不建议使用。 5.复合赋值符:+= = *= /= %= >>= <<= &= |= ^= 6.单目操作符:! 逻辑反操作(真---假

- 负值+ 正值 & 取地址从内存中取地址,不能从寄存器register 中取址。 sizeof 操作数的类型长度(以字节为单位 ~ 一个数的二进制按位取反 -- 前置、后置-- ++ 前置、后置++ (1前置++和--:先自增后使用,表达式的值是自增之后的值。 先自减后使用,表达式的值是自减之后的值。 (2后置++和--:先使用再自加。 先使用再自减。 * 间接访问操作符(解引用操作符 (类型强制类型转换 7.关系操作符:> >= < <= != 不相等 == 相等 注:== 相等 = 赋值,二者易混淆,需注意。 8.逻辑操作符:&& 逻辑与|| 逻辑或 注:逻辑与、逻辑或是判断真假的,按位与、按位或是对二进制数进行操作的。 对逻辑与操作,只要有一个为假,便不必再进行后边的计算;对逻辑或操作,只要有一个为真,便不必再进行后边的操作。 9.条件操作符(三目操作符:exp1 ? exp2 : exp3 先计算表达式1 的值,如果表达式1 为真,整个表达式的值就是表达式 2 的值,如果为假,整个表达式的值就是表达式 3 的值。

数据结构实验报告,一元多项式资料

数据结构课程设计报告

目录 一、任务目标,,,,,,,,,,,, 3 二、概要设计,,,,,,,,,,,, 4 三、详细设计,,,,,,,,,,,, 6 四、调试分析,,,,,,,,,,,, 8 五、源程序代码,,,,,,,,,, 8 六、程序运行效果图与说明,,,,, 15 七、本次实验小结,,,,,,,,, 16 八、参考文献,,,,,,,,,,, 16

任务目标 分析(1) a. 能够按照指数降序排列建立并输出多项式 b.能够完成两个多项式的相加,相减,并将结果输入要求:程序所能达到的功能: a.实现一元多项式的输入; b.实现一元多项式的输出; c.计算两个一元多项式的和并输出结果; d.计算两个一元多项式的差并输出结果;除任务要求外新增乘法: 计算两个一元多项式的乘积并输出结果 (2)输入的形式和输入值的范围:输入要求:分行输入,每行输入一项,先输入多项式的指数,再输入多项式的系数,以0 0 为结束标志,结束一个多项式的输入。 输入形式: 2 3 -1 2 3 0 1 2 0 0 输入值的范围:系数为int 型,指数为float 型 3)输出的形式: 第一行输出多项式1; 第二行输出多项式2; 第三行输出多项式 1 与多项式 2 相加的结果多项式; 第四行输出多项式 1 与多项式 2 相减的结果多项式;第五行输出多项式 1 与多项式 2 相乘的结果多项式 二、概要设计 程序实现 a. 功能:将要进行运算的二项式输入输出;

b. 数据流入:要输入的二项式的系数与指数; c.数据流出:合并同类项后的二项式; d.程序流程图:二项式输入流程图; e.测试要点:输入的二项式是否正确,若输入错误则重新输入

一元多项式加减乘除运算

中国计量学院实验报告 实验课程:算法与数据结构实验名称:一元二项式班级:学号: 姓名:实验日期: 2013-5-7 一.实验题目: ①创建2个一元多项式 ②实现2个多项式相加 ③实现2个多项式相减 ④实现2个多项式相乘 ⑤实现2个多项式相除 ⑥销毁一元多项式 实验成绩:指导教师:

二.算法说明 ①存储结构:一元多项式的表示在计算机内可以用链表来表示,为了节省存储 空间,只存储多项式中系数非零的项。链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。 ②加法算法

三.测试结果 四.分析与探讨 实验数据正确,部分代码过于赘余,可以精简。 五.附录:源代码#include<> #include<> #include<> typedef struct Polynomial { float coef; int expn; struct Polynomial *next; }*Polyn,Polynomial; 出多项式a和b\n\t2.多项式相加a+b\n\t3.多项式相减a-b\n"); printf("\t4.多项式相除a*b\n\t5.多项式相除a/b\n\t6.销毁多项式\n"); printf("\t7.退出

\n*********************************** ***********\n"); printf("执行:"); scanf("%d",&flag); switch(flag) { case(1): printf("多项式a:");PrintPolyn(pa); printf("多项式b:");PrintPolyn(pb);break; case(2): pc=AddPolyn(pa,pb); printf("多项式a+b:");PrintPolyn(pc); DestroyPolyn(pc);break; case(3): pd=SubtractPolyn(pa,pb); printf("多项式a-b:");PrintPolyn(pd); DestroyPolyn(pd);break; case(4): pf=MultiplyPolyn(pa,pb); printf("多项式a*b:");PrintPolyn(pf); DestroyPolyn(pf);break; case(5): DevicePolyn(pa,pb); break; case(6): DestroyPolyn(pa); DestroyPolyn(pb); printf("成功销毁2个一元二项式\n"); printf("\n接下来要执行的操作:\n1 重新创建2个一元二项式 \n2 退出程序\n"); printf("执行:"); scanf("%d",&i); if(i==1) { // Polyn pa=0,pb=0,pc,pd,pf;//定义各式的头指针,pa与pb在使用前付初值NULL printf("请输入a的项数:"); scanf("%d",&m); pa=CreatePolyn(pa,m);// 建立多项式a printf("请输入b的项

C语言运算符大全 (2)

C语言运算符大全C语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言有三大运算符:算术、关系与逻辑、位操作。另外,C还有一些特殊的运算符,用于完成一些特殊的任务。 表2-5列出了C语言中允许的算术运算符。在C语言中,运算符“+”、“-”、“*”和“/”的用法与大多数计算机语言的相同,几乎可用于所有C语言内定义的数据类型。当“/”被用于整数或字符时,结果取整。例如,在整数除法中,10/3=3。 一元减法的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。模运算符“%”在C 语言中也同它在其它语言中的用法相同。切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。 最后一行打印一个0和一个1,因为1/2整除时为0,余数为1,故1%2取余数1。 C语言中有两个很有用的运算符,通常在其它计算机语言中是找不到它们的—自增和自减运算符,++和--。运算符“++”是操作数加1,而“--”是操作数减1,换句话说:x=x+1;同++x;x=x-1;同--x; 自增和自减运算符可用在操作数之前,也可放在其后,例如:x=x+1;可写成++x;或x++;但在表达式中这两种用法是有区别的。自增或自减运算符在操作数之前,C语言在引用操作数之前就先执行加1或减1 操作;运算符在操作数之后,C语言就先引用操作数的值,而后再进行加1或减1操作。请看下例: x=10; ;y=++x;

此时,y=11。如果程序改为: x=10;y=x++; 则y=10。在这两种情况下,x都被置为11,但区别在于设置的时刻,这种对自增和自减发生时刻的控制是非常有用的。在大多数C编译程序中,为自增和自减操作生成的程序代码比等价的赋值语句生成的代码 要快得多,所以尽可能采用加1或减1运算符是一种好的选择。 。下面是算术运算符的优先级: :最高++、- -- -(一元减) *、/、%最低+、-编译程序对同级运算符按从左到右的顺序进行计算。当然,括号可改变计算顺序。C语言 处理括号的方法与几乎所有的计算机语言相同:强迫某个运算或某组运算的优先级升高。 关系运算符中的“关系”二字指的是一个值与另一个值之间的关系,逻辑运算符中的“逻辑”二字指的是连接关系的方式。因为关系和逻辑运算符常在一起使用,所以将它们放在一起讨论。关系和逻辑运算符概念中的关键是True(真)和Flase(假)。C语言中,非0为True,0为Flase。使用关系或逻辑运算符的表达式对Flase和Ture分别返回值0或1(见表2-6)。 表2-6给出于关系和逻辑运算符,下面用1和0给出逻辑真值表。关系和逻辑运算符的优先级比算术运算符低,即像表达式10>1+12的计算可以假定是对表达式10>(1+12)的计算,当然,该表达式的结果为Flase。在一个表达式中允许运算的组合。例如: 10>5&&!(10<9)||3<=4 这一表达式的结果为True。

数据结构中实现一元多项式简单计算

数据结构中实现一元多项式简单计算: 设计一个一元多项式简单的计算器。 基本要求: 一元多项式简单计算器的基本功能为: (1)输入并建立多项式; (2)输出多项式; (3)两个多项式相加,建立并输出和多项式; (4)两个多项式相减,建立并输出差多项式; #include #include #define MAX 20 //多项式最多项数 typedef struct//定义存放多项式的数组类型 { float coef; //系数 int exp; //指数 } PolyArray[MAX]; typedef struct pnode//定义单链表结点类型 { float coef; //系数 int exp; //指数 struct pnode *next; } PolyNode; void DispPoly(PolyNode *L) //输出多项式 { PolyNode *p=L->next; while (p!=NULL) { printf("%gX^%d ",p->coef,p->exp); p=p->next; } printf("\n"); } void CreateListR(PolyNode *&L,PolyArray a,int n) //尾插法建表 { PolyNode *s,*r;int i; L=(PolyNode *)malloc(sizeof(PolyNode)); //创建头结点 L->next=NULL; r=L; //r始终指向终端结点,开始时指向头结点for (i=0;i

c语言34种运算符

C语言运算符 算术运算符 TAG:运算符,数据类型 TEXT:算术运算符对数值进行算术运算,其中:加、减、乘、除、求余运算是双目运算。其结果可以是整数、单精度实数和双精度实数。自增、自减运算是单目运算,其操作对象只能使整型变量,不能是常量或表达式等其他形式。 REF:.TXT,+运算符.txt,-运算符.txt,*运算符.txt,/运算 符.txt,%运算符,++运算符,--运算符 加+ TAG:算术运算符,运算符,数据类型 TEXT:双目运算符,算数加法。单目运算符,表示正数。REF:.TXT,算数运算符.txt 减- TAG:算术运算符,运算符,数据类型 TEXT:双目运算符,算数减法。单目运算符,表示负数。REF:.TXT,算数运算符.txt 乘* TAG:算术运算符,运算符,数据类型 TEXT:*,双目运算符,算数乘法。 REF:.TXT,算数运算符.txt

除/ TAG:算术运算符,运算符,数据类型 TEXT:/,双目运算符,算数除法;如果两个参与运算的数是整数,表示整除,舍去小数部分。 如5.0/2等于2.5,而5/2等于2。 REF:.TXT,算数运算符.txt 取余% TAG:算术运算符,运算符,数据类型 TEXT:/,双目运算符,算数除法;如果两个参与运算的数是整数,表示整除,舍去小数部分。 如5.0/2等于2.5,而5/2等于2。 REF:.TXT,算数运算符.txt 自加++ TAG:算术运算符,运算符,数据类型 TEXT:单目运算符,针对整数运算,可以放在运算数的两侧,表示运算数增1。 REF:.TXT,算数运算符.txt 自减-- TAG:算术运算符,运算符,数据类型 TEXT:单目运算符,针对整数运算,可以放在运算数的两侧,表示运算数减1。

数据结构一元多项式的计算

课程设计成果 学院: 计算机工程学院班级: 13计科一班 学生姓名: 学号: 设计地点(单位): 设计题目:一元多项式的计算 完成日期:年月日 成绩(五级记分制): _________________ 教师签名:_________________________ 目录 1 需求分析 ......................................................................... 错误!未定义书签。 2 概要设计 ......................................................................... 错误!未定义书签。 2.1一元多项式的建立 ............................................................... 错误!未定义书签。 2.2显示一元多项式 ................................................................... 错误!未定义书签。 2.3一元多项式减法运算 ........................................................... 错误!未定义书签。 2.4一元多项式加法运算 ........................................................... 错误!未定义书签。 2.5 设计优缺点.......................................................................... 错误!未定义书签。3详细设计 .......................................................................... 错误!未定义书签。 3.1一元多项式的输入输出流程图........................................... 错误!未定义书签。 3.2一元多项式的加法流程图................................................... 错误!未定义书签。 3.3一元多项式的减法流程图.................................................. 错误!未定义书签。 3.4用户操作函数....................................................................... 错误!未定义书签。4编码 .................................................................................. 错误!未定义书签。5调试分析 .......................................................................... 错误!未定义书签。4测试结果及运行效果...................................................... 错误!未定义书签。5系统开发所用到的技术.................................................. 错误!未定义书签。参考文献 ............................................................................. 错误!未定义书签。附录全部代码................................................................... 错误!未定义书签。

C++一元多项式合并实验报告

实验二一元多项式相加问题本实验的目的是进一步熟练掌握应用链表处理实际问题的能力。 一、问题描述 一元多项式相加是通过键盘输入两个形如P 0+P 1 X1+P 2 X2+···+PnX n的多项式,经过程序运算后在屏幕上输出它 们的相加和。 二、数据结构设计 分析任意一元多项式的描述方法可知,一个一元多项式的每一个子项都由“系数—指数”两部分组成,所以可将它抽象成一个由“系数—指数对”构成线性表,由于对多项式中系数为0的子项可以不记录他的数值,对于这样的情况就不再付出存储空间来存放它了。基于这样的分析,可以采取一个带有头结点的单链表来表示一个一元多项式。具体数据结构定义为: typedef struct node { float ce; //系数域 float ex; //指数域 struct node *next; //指针域 }lnode,*linklist; 三功能(函数)设计 1、输入并建立多项式的功能模块 此模块要求按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项的“系数—指数对”,输入一个子项建立一个相关的节点,当遇到输入结束标志时结束输入,而转去执行程序下面的部分。 屏幕提示: input ce & ex and end with 0: ce=1 ex=2 ce=0 ex=0 //输入结束标志 input ce & ex and end with 0: ce=2 ex=2 ce=0 ex=0 //输入结束标志 输入后程序将分别建立两个链表来描述两个一元多项式: A=X^2 B=2X^2 这两个多项式的相加的结果应该为: C=3X^2 2、多项式相加的功能模块 此模块根据在1中建立的两个多项式进行相加运算,并存放在以C为头指针的一个新建表中。可以采用以下方法进行设计: 开始时a,b分别指向A,B的开头,如果ab不为空,进行判断:如果a所指的结点的指数和b所指的结点的指数相同,将它们的系数相加做成C式中的一项,如果不一样则将小的一项加到C中。 if(a->ex==b->ex) //判断指数是否相等 {s->ce=a->ce+b->ce; if(s->ce!=0) s->ex=a->ex; else delete s; a=a->next; b=b->next; }

C语言一元多项式计算

C语言一元多项式计算集团标准化工作小组 #Q8QGGQT-GX8G08Q8-GNQGJ8-MHHGN#

#include <> #include <> #include <> #define LEN sizeof(node) //结点构造 typedef struct polynode { int coef; //系数 int exp; //指数 struct polynode *next; }node; node * create(void) { node *h,*r,*s; int c,e; h=(node *)malloc(LEN); r=h; printf("系数:"); scanf("%d",&c); printf("指数:"); scanf("%d",&e); while(c!=0) { s=(node *)malloc(LEN); s->coef=c; s->exp=e; r->next=s; r=s; printf("系数:"); scanf("%d",&c); printf("指数:"); scanf("%d",&e); } r->next=NULL; return(h);

} void polyadd(node *polya, node *polyb) { node *p,*q,*pre,*temp; int sum; p=polya->next; q=polyb->next; pre=polya; while(p!=NULL&&q!=NULL) { if(p->exp>q->exp) { pre->next=p; pre=pre->next; p=p->next; } else if(p->exp==q->exp) { sum=p->coef+q->coef; if(sum!=0) { p->coef=sum; pre->next=p;pre=pre->next;p=p->next; temp=q;q=q->next;free(temp); } else { temp=p->next;free(p);p=temp; temp=q->next;free(q);q=temp; } } else { pre->next=q; pre=pre->next; q=q->next; } } if(p!=NULL) pre->next=p; else pre->next=q; } void print(node * p) {

C语言中条件运算符的语法为

条件运算符的语法为: (条件表达式)?(条件为真时的表达式):(条件为假时的表达式) 例如: x=ay?"greater than":x==y?"equal to":"less than" 它等价于: (x>y)?"greater than":((x==y)?"equal to":"less than") 当x>y时,值为"greater than",x==y时,值为"equal to",否则,值为"less than"。条件运算符的嵌套可读性不够好。 在一个条件运算符的表达式中,如果后面两个表达式的值类型相同,均为左值,则该条件运算符表达式的值为左值表达式。例如: int x=5; long a,b; (x?a:b)=1;//ok:因为a和b都是左值 (x?x:a)=2;//error:x和a不同类型。编译器将其解释为(1ong)x和a (x==271:a)=3;//error:1非左值 "(x?a:b)=1"表示当x为0时,b=1,否则a=1。这里的括号是必须的,否则将被看作x?a:(b=1)。"(x?x:a)=2”中,尽管x是左值,a也是左值,但x与a不同类型,条件运算符要对其进行操作数的隐式转换,使之成为相同的类型。任何被转换的变量都不是左值。 ->在C中,条件运算符是不能作左值的,所以"(x?a:b)=1;"将通不过编译。 getchar 函数名: getchar 功能: 从stdio流中读字符 用法: int getchar(void); 注解:

链表实现多项式相加实验报告

实验报告 课程名称:数据结构 题目:链表实现多项式相加 班级: 学号: 姓名: 完成时间:2012年10月17日

1、实验目的和要求 1)掌握链表的运用方法; 2)学习链表的初始化并建立一个新的链表; 3)知道如何实现链表的插入结点与删除结点操作; 4)了解链表的基本操作并灵活运用 2、实验内容 1)建立两个链表存储一元多项式; 2)实现两个一元多项式的相加; 3)输出两个多项式相加后得到的一元多项式。 3、算法基本思想 数降序存入两个链表中,将大小较大的链表作为相加后的链表寄存处。定义两个临时链表节点指针p,q,分别指向两个链表头结点。然后将另一个链表中从头结点开始依次与第一个链表比较,如果其指数比第一个小,则p向后移动一个单位,如相等,则将两节点的系数相加作为第一个链表当前节点的系数,如果为0,则将此节点栓掉。若果较大,则在p前插入q,q向后移动一个,直到两个链表做完为止。 4、算法描述 用链表实现多项式相加的程序如下: #include #include #include struct node{ int exp; float coef; struct node*next; };

void add_node(struct node*h1,struct node*h2); void print_node(struct node*h); struct node*init_node() { struct node*h=(struct node*)malloc(sizeof(struct node)),*p,*q; int exp; float coef=1.0; h->next=NULL; printf("请依次输入多项式的系数和指数(如:\"2 3\";输入\"0 0\"时结束):\n"); p=(struct node*)malloc(sizeof(struct node)); q=(struct node*)malloc(sizeof(struct node)); for(;fabs(coef-0.0)>1.0e-6;) { scanf("%f %d",&coef,&exp); if(fabs(coef-0.0)>1.0e-6) { q->next=p; p->coef=coef; p->exp=exp; p->next=NULL; add_node(h,q); } } free(p); free(q); return(h); } void add_node(struct node*h1,struct node*h2) { struct node*y1=h1,*y2=h2; struct node*p,*q; y1=y1->next; y2=y2->next; for(;y1||y2;) if(y1) { if(y2) { if(y1->expexp) y1=y1->next; else if(y1->exp==y2->exp) { y1->coef+=y2->coef; if(y1->coef==0)

一元多项式相加完整实验报告

一元多项式相加实验报告 一元多项式的相加

一实验内容 根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加 二需求分析 1掌握线性结构的逻辑特性和物理特性。 2建立一元多项式。 3将一元多项式输入,并存储在内存中,并按照指数降序排列输出多项式。 4能够完成两个多项式的加减运算,并输出结果。 三概要设计 1 本程序所用到的抽象数据类型: typedef OrderedLinkList polynomial; // 用带表头结点的有序链表表示多项式 结点的数据元素类型定义为: typedef struct { // 项的表示 float coef; // 系数 int expn; // 指数 term, ElemType; V oid AddPolyn(polynomail&Pa,polynomail&Pb) Position GetHead() Position NextPos(LinkList L,Link p) Elem GetCurElem(Link p) int cmp(term a term b) Status SetCurElem(Link&p, ElemType e) Status DelFirst(Link h, Link &q) Status ListEmpty(LinkList L) Status Append(LinkList&L, Link S) FreeNode() 2 存储结构

一元多项式的表示在计算机内用链表来实现,同时为了节省存储空间,只存储其中非零的项,链表中的每个节点存放多项式的系数非零项。它包含三个域,分别存放多项式的系数,指数,以及指向下一个项的指针。 创建一元多项式链表,对运算中可能出现的各种情况进行分析,实现一元多项式的相加相减操作。 3 模块划分 a) 主程序;2)初始化单链表;3)建立单链表; 4)相加多项式 4 主程序流程图 四详细设计 根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项,对

一元多项式计算器

一元多项式计算器 目录 摘要 (1) 1绪论 (1) 2系统分析 (1) 2.1功能需求 (1) 2.2数据需求 (1) 2.3性能需求 (1) 3总体设计 (2) 3.1系统设计方案 (2) 3.2功能模块设计 (2) 4详细设计 (3) 4.1建立多项式 (4) 4.2多项式相加 (4) 4.3多项式相减 (5) 4.4多项式相乘 (5) 4.5计算器主函数 (6) 5调试与测试 (7) 5.1调试 (7) 5.2测试 (8) 6结论 (9) 结束语 (9) 参考文献 (9) 附录1-用户手册 (10) 附录2-源程序 (12)

摘要 随着生活水平的提高,现代科技也日益发达。日常生活中多位计算再所难免,因此设计一个简单计算器可解决许多不必要的麻烦。 开发这样一个程序主要运用了C的结点,链表等方面知识。系统主要实现了多项式的建立,多项式的输入输出,以及多项式加减乘等运算。 报告主要从计算器的程序段,对输入输出数据的要求,计算器的性能,以及总体的设计来介绍此计算器程序的实现过程。 关键词:多项式;链表;结点 1绪论 随着日益发达的科技,计算器已应用于各行各业。设计一个计算器需要运用C中多方面知识,更是以多项式的建立,输入输出,以及结点,链表为主。(扩充) 任务书。。。。。 2系统分析 2.1 功能需求 多项式的建立多项式输入输出多项式加减乘等运算 2.2数据需求 在输入过程中,首先要确定输入的数据,数据不能是字母,只能是数字。不能连续输入数据,必须按要求配以空格输入要计算的数据。 (1) 链节节点数字 (2) 数字 2.3 性能需求 系统必须安全可靠,不会出现无故死机状态,速度不宜过慢。

一元多项式的运算

数据结构课程设计实验报告 专业班级: 学号: 姓名: 2011年1月1日

题目:一元多项式的运算 1、题目描述 一元多项式的运算在此题中实现加、减法的运算,而多项式的减法可以通过加法来实现(只需在减法运算时系数前加负号)。 在数学上,一个一元n次多项式P n(X)可按降序写成: P n(X)= P n X^n+ P(n-1)X^(n-1)+......+ P1X+P0 它由n+1个系数惟一确定,因此,在计算机里它可以用一个线性表P来表示: P=(P n,P(n-1),......,P1,P0) 每一项的指数i隐含在其系数P i的序号里。 假设Q m(X)是一元m次多项式,同样可以用一个线性表Q来表示: Q=(q m,q(m-1),.....,q1,q0) 不是一般性,假设吗吗m

用多项式模型进行数据拟合实验报告(附代码)

实验题目: 用多项式模型进行数据拟合实验 1 实验目的 本实验使用多项式模型对数据进行拟合,目的在于: (1)掌握数据拟合的基本原理,学会使用数学的方法来判定数据拟合的情况; (2)掌握最小二乘法的基本原理及计算方法; (3)熟悉使用matlab 进行算法的实现。 2 实验步骤 2.1 算法原理 所谓拟合是指寻找一条平滑的曲线,最不失真地去表现测量数据。反过来说,对测量 的实验数据,要对其进行公式化处理,用计算方法构造函数来近似表达数据的函数关系。由于函数构造方法的不同,有许多的逼近方法,工程中常用最小平方逼近(最小二乘法理论)来实现曲线的拟合。 最小二乘拟合利用已知的数据得出一条直线或曲线,使之在坐标系上与已知数据之间的距离的平方和最小。模型主要有:1.直线型2.多项式型3.分数函数型4.指数函数型5.对数线性型6.高斯函数型等,根据应用情况,选用不同的拟合模型。其中多项式型拟合模型应用比较广泛。 给定一组测量数据()i i y x ,,其中m i ,,3,2,1,0Λ=,共m+1个数据点,取多项式P (x ),使得 min )]([020 2=-=∑∑==m i i i m i i y x p r ,则称函数P (x )为拟合函数或最小二乘解,此时,令 ∑==n k k k n x a x p 0 )(,使得min ])([02 002=??? ? ??-=-=∑∑∑===m i n k i k i k m i i i n y x a y x p I ,其中 n a a a a ,,,,210Λ为待求的未知数,n 为多项式的最高次幂,由此该问题化为求),,,(210n a a a a I I Λ=的极值问题。 由多元函数求极值的必要条件:0)(200 =-=??∑∑==m i j i n k i k i k i x y x a a I ,其中n j ,,2,1,0Λ= 得到: ∑∑∑===+=n k m i i j i k m i k j i y x a x )(,其中n j ,,2,1,0Λ=,这是一个关于n a a a a ,,,,210Λ的线 性方程组,用矩阵表示如下所示:

(完整word版)C语言运算符与表达式的练习题答案

C语言运算符与表达式的练习题 单项选择题 (1)以下选项中,正确的 C 语言整型常量是(D)。 A. 32L B. 510000 C. -1.00 D. 567 (2)以下选项中,(D)是不正确的 C 语言字符型常量。 A. 'a' B. '\x41' C. '\101' D. "a" (3)字符串的结束标志是(C)。 A. 0 B. '0' C. '\0' D. "0" (4)算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为(B)。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运算、赋值运算 C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 (5)逻辑运算符中,运算优先级按从高到低依次为(D)。 A. && ! || B. || && ! C. && || ! D. ! && || (6)表达式!x||a==b 等效于(D)。 A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b) (7)设整型变量 m,n,a,b,c,d 均为1,执行 (m=a>b)&&(n=c>d)后, m,n 的值是(A)。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 *(8)设有语句 int a=3;,则执行了语句 a+=a-=a*=a; 后,变量 a 的值是(B)。 A. 3 B. 0 C. 9 D. -12 (9)在以下一组运算符中,优先级最低的运算符是(D)。 A. * B. != C. + D. = (10)设整型变量 i 值为2,表达式(++i)+(++i)+(++i)的结果是(B,上机13)。 A. 6 B. 12 C. 15 D. 表达式出错 (11)若已定义 x 和 y为double 类型,则表达式的值是(D)。

两个一元多项式相加-c++版

《数据结构》实验报告 ——两个一元多项式相加 一、实验题目:两个一元多项式相加 二、实验内容: 根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加 三、设计思想: (1)建立两个顺序列表,分别用来表示两个一元多项式;顺序列表奇数位,存储该多项式的系数;顺序列表的偶数位,存储该相应多项式的指数。 (2)用成员函数merg(qList&l2)实现两多项式的相加。实现的大致方法为:比较第二个多项式列表与第一个多项式列表的偶数位的数值大小(指数),如果 相同,则将他们的前一位数(系数)相加;如果不同,就将他的前一位数(系 数)及它自己(指数)插入第一个多项式列表的后面。 (3)建立函数shu(double a[],int j)实现多项式的输入。 四、源程序代码 #include "stdafx.h" #include using namespace std; template class List { private: Telem * elem; int curlen; int maxlen; public: List(int maxsz=100):maxlen(maxsz) { curlen=0; elem=new Telem{maxlen}; }; List(Telem a[],int n,int maxsz=100):maxlen(maxsz) { curlen=n; elem=new Telem[maxlen]; for(int i=0;i

一元多项式计算(数据结构课程设计)

一元多项式计算(数据结构课程设计)

一、系统设计 1、算法思想 根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应指数相加(减),若其和(差)不为零,则构成“和(差)多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别写到“和(差)多项式”中去。 因为多项式指数最高项以及项数是不确定的,因此采用线性链表的存储结构便于实现一元多项式的运算。为了节省空间,我采用两个链表分别存放多项式a 和多项式b,对于最后计算所得的多项式则利用多项式a进行存储。主要用到了单链表的插入和删除操作。

(1)一元多项式加法运算 它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果指数相等的话,系数就应该相加;相加的和不为零的话,用头插法建立一个新的节点。P 的指数小于q的指数的话就应该复制q的节点到多项式中。P的指数大于q的指数的话,就应该复制p节点到多项式中。当第二个多项式空,第一个多项式不为空时,将第一个多项式用新节点产生。当第一个多项式空,第二个多项式不为空时,将第二个多项式用新节点产生。 (2)一元多项式的减法运算 它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果指数相等的话,系数就相减;相加的和不为零的话,用头插法建立一个新的节点。p的指数小于q的指数的话,就应该复制q的节点到多项式中。P的指数大于q的指数的话就应该复制p的节点到多项式中,并且建立的节点的系数为原来的相反数;当第二个多项式空,第一个多项式不为空时,将第一个多项式用新节点产生。当第一个多项式空,第二个多项式不为空时,将第二个多项式用新节点产生,并且建立的节点的系数为原来的相反数。 2、概要设计 (1)主函数流程图: (注:a代表第一个一元二次方程,b代表第二个一元二次方程)

C语言中的逻辑运算符和位运算符总结

一、逻辑运算符: 包括:1。&&逻辑与 2。||逻辑或 3。!逻辑非 逻辑运算符用于对包含关系运算符的表达式进行合并或取非 对于使用逻辑运算符的表达式,返回0表示“假”,返回1表示“真”。关于逻辑运算符的解释 请注意:任何使用两个字符做符号的运算符,两字符之间不应有空格,即将==写成= =是错误的。 假设一个程序在同时满足条件a<10和b==7时,必须执行某些操作。应使用关系运算符和逻辑运算符“与”来写这个 条件的代码。用&&表示“与”运算符,该条件代码如下: (a<10) && (b==7); 类似地,“或”是用于检查两个条件中是否有一个为真的运算符。它由两个连续的管道符号(||)表示。如果上例 改为:如果任一语句为真,则程序需执行某些操作,则条件代码如下: (a<10) || (b==7); 第三个逻辑运算符“非”用一个感叹号(!)表示。这个运算符对表达式的真值取反。例如,如果变量s小于10,程序 程序需执行某些操作,则条件代码如下: (s<10) 或 (!(s>=10)) //s不大于等于10 关系运算符和逻辑运算符的优先级一般都低于算术运算符。例如,5>4+3的计算与5>(4+3)运算符是一样的,即 先计算4+3,再执行关系运算。此表达示的结果为“假”,即,将返回0。 下面的语句 printf("%d",5>4+3); 将输出 0 可以总结为:&&的结果是真真为真。||的结果是假假为假。 与A&&B 只有A B都为真才是真 或A||B 只有A B都为假才是假 非 ~A A为真时,此式为假 二、位运算符: 包括:1。&位与符 2。|位或符 3。^位异或符 4。~位取反符 以操作数12为例。位运算符将数字12视为1100。位运算符将操作数视为位而不是数值。数值 可以是任意进制的:十进制、八进制或十六进制。位运算符则将操作数转化为二进制,并相应地返回1或0。 位运算符将数字视为二进制值,并按位进行相应运算,运算完成后再重新转

相关文档
最新文档