用C语言实现多项式简单计算器的设计
多项式计算器-C语言作业
![多项式计算器-C语言作业](https://img.taocdn.com/s3/m/524e473d0b4c2e3f57276358.png)
command = getchar ();
temp = getchar ();
if (command != 'y' && command != 'Y')
{
printf ("操作已取消。\n\n");
return ERROR;
scanf ("%d",&i);
temp = getchar ();
if (i <= 0 || i > 10) //检查i值合法性
{
printf ("输入编号不存在!\n\n");
return ERROR;
}
if (headunit[i - 1] != NULL) //若输入编号已存放信息则出现选项
{
printf ("输入系数为零!添项已取消。\n\n");
return ERROR;
}
if (q -> exp < p -> exp)
{
printf ("欲执行操作的多项式已存放信息,确认操作?\n输入y继续执行,输入其他字符取消:");
command = getchar ();
temp = getchar ();
if (command != 'y' && command != 'Y')
{
printf ("操作已取消。\n\n");
temp = getchar ();
while (p -> coef == 0) //第一项的系数不为零,此时未设取消输入的控制链接,因为操作并不繁琐,可在输入第二项时退出创建
一元稀疏多项式计算器C语言课程设计
![一元稀疏多项式计算器C语言课程设计](https://img.taocdn.com/s3/m/e3bc46ac2b160b4e777fcfc0.png)
2014-2015学年第二学期《软件工程》课程设计报告题目:一元稀疏多项式计算器专业:计算机科学与技术班级:计算机科学与技术(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.02.2思路分析:①一般情况下的一元n次多项式可写成pn(x)=p1xe1+p2xe2+……+pmxem其中,p1是指数为ei的项的非零系数,且满足0≦e1<e2<……<em=n ,若用一个长度为m且每个元素有两个数据项(系数项和指数项)的线性表((p1,e1),(p2,e2),……,(pm,em))便可惟一确定多项式pn(x)。
②用两个带表头结点的单链表分别存储两个多项式③根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项;④只需要将第二个多项式的系数改为其相反数,然后根据一元多项式相加的运算规则便可以得到其相应的“差多项式”三、概要设计图3-1功能模块图为实现上述程序功能,用带表头结点的单链表存储多项式。
C语言课程设计报告(多项式简单的计算器)
![C语言课程设计报告(多项式简单的计算器)](https://img.taocdn.com/s3/m/2b6ff2aff5335a8103d2200f.png)
沈阳航空航天大学课程设计报告课程设计名称:C 语言课程设计课程设计题目:多项式简单的计算器院(系):计算机学院专业:计算机科学与技术班级:14010106学号:2011040101258 姓名:崔雨濛指导教师:孙恩岩完成日期:2012年3月16日第1章概要设计 (2)1.1题目的内容与要求 (2)1.2总体结构 (2)第2章详细设计 (3)2.1主模块 (3)2.2多项式建立模块 (4)2.3计算模块 (5)2.4显示模块 (6)第3章调试分析 (7)3.1无法完整输出多项式 (7)3.2多项式中出现多余的项目 (7)3.3用户无法自行选择结束运行程序 (7)第4章使用说明与执行结果 (8)参考文献 (10)附录(程序清单) (11)第1章概要设计1.1题目的内容与要求课程设计的内容是设计一个简单的单词替换程序,可以替换文本文件中指定的单词。
要求:(1)输入多项式各项并建立多项式。
(2)输出多项式。
(3)两个多项式相加减,并输出结果多项式。
(4)采用VC环境进行调试运行。
1・2总体结构本程序主要分为四个模块(功能模块图见图1.1):主模块,多项式建立模块, 计算模块,显示模块。
主模块:输入多项式各项,建立多项式,输出多项式。
多项式建立模块:将输入的多项式各项以链表形式建立起来。
计算模块:比较两个多项式的系数和指数,合并同类项。
显示模块:显示输入的多项式及结果多项式。
图1.1功能模块图第2章详细设计2.1主模块控制整个程序的运行,控制菜单操作,通过主函数模块分别调用各个模块, 实现各项功能,流程如图2.1所示。
图2.1主模块流程图2.2多项式建立模块注释:根据多项式的项数循环存入结构体中2.3计算模块比较两个多项式的系数和指数,合并同类项。
流程图如图 2.3所示图2.3计算模块流程图注释:具体比较方法如下:(1)qa->expn < qb->expnqa所指节点应为结果多项式中的结点,qa后移:qa=qa->next; qb不动。
数据结构C语言实现多项式源代码
![数据结构C语言实现多项式源代码](https://img.taocdn.com/s3/m/8631211c866fb84ae45c8d55.png)
一、一元稀疏多项式计算器#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define OK 1#define ERROR 0#define OVERFLOW -1typedef int Status;#define LIST_INIT_SIZE 51 //假设次数不超过50typedef struct{//coef表示系数,expo表示指数。
float coef;int expo;}ElemType;typedef struct LNode{ //结点类型ElemType data;struct LNode *next;}LNode,*LinkList;//记:Link与Position均为指向LNode的指针类型typedef LinkList Polynomail;//在单链表的基础上定义并实现//多项式用链表存储Status CreateList_L(LinkList &L){int n;printf("请输入需创建的多项式的长度:\n");scanf("%d",&n);LNode *CurPtr,*PrePtr;//创建递增链表L=(LinkList) malloc(sizeof(LNode));L->next=NULL;if(!L) exit(OVERFLOW);PrePtr=L;for(int i=1;i<=n;++i){CurPtr=(LNode *)malloc(sizeof(LNode));printf("请输入不同的多项式的非0系数:");scanf("%f",&(CurPtr->data).coef );printf("请输入不同的多项式的指数:");scanf("%d",&(CurPtr->data).expo );CurPtr->next=NULL;PrePtr->next=CurPtr;PrePtr=PrePtr->next;//插入到表头}CurPtr->next =L;//冒泡排序法对多项式按指数由大到小排列。
(完整word版)一元多项式计算器报告(C语言编程)
![(完整word版)一元多项式计算器报告(C语言编程)](https://img.taocdn.com/s3/m/270b0b89783e0912a3162a0a.png)
题目:编制一个一元多项式基本运算的程序姓名: 学号:PB110130一、需求分析1.在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难确定。
由稀疏多项式的特点,故采用链式存储结构,可以不会带来浪费存储空间。
2.程序中单链表存储,根据链表的指数域,对链表进行升序排序,可给运算带来方便。
3.程序设计是在VC6.0环境下设计的的。
4.程序执行的命令为(程序主界面):二、概要设计抽象数据类型一元多项式的定义如下:1.LNode *MakeNode(double coef, int exp) 通过传入指数和系数创建一个节点,返回该节点的地址。
2.void InitList(LinkList &L)初始化,带头节点3.void PrintPolyn (LinkList L) 传入链表的指针,打印该链表4.LinkList CreatPolyn(void)//输入m项的系数和指数,建立表示一元多项式的有序链表L5.double SumPolyn(LinkList L,double x) 传入链表的指针及x值,求多项式的值。
6.void DestroyPolyn (LinkList &L) 销毁多项式,去掉头节点7.void ClearPolyn (LinkList &L) 清空多项式,保留节点实验报告8.void CopyPolyn (LinkList La,LinkList &Lb) 将La位置的多项式复制到Lb位置9.void AddPolyn(LinkList L,LinkList J ,LinkList &K) 将a和b多项式相加存到c10.void MultiplyPolyn(LinkList L,LinkList J,LinkList &K)将a和b相减存到c11. void MultiplyPolyn(LinkList L,LinkList J,LinkList &K)将a和b多项式相乘存到c12。
多项式计算器C语言代码
![多项式计算器C语言代码](https://img.taocdn.com/s3/m/1464f70aa6c30c2259019e87.png)
printf("x^%d",p->exp);
}
else if(p->exp!=1){printf("+x^%d",p->exp);}
else if(p->coef!=1){
do{
printf("输入有误!已输入过常数项,请输入非常数项:");
printf("输入系数%d:",i);
scanf("%d",&c);
printf("输入指数%d:",i);
scanf("%d",&e);
}while(e==0);
}
else if(p->exp!=1&&p->coef==1){printf("+x^%d",p->exp);}
else if(p->coef!=1&&p->exp==1){
printf("%d",p->coef);
printf("+x",p->exp);}
Node* q;
q=L;
while(q->next!=NULL&&q->exp!=e){
q=q->next;
}
if(q->next==NULL)return 1;
else return 0;
}
int compare(int a,int b){
C语言实现简易计算器(可作加减乘除)
![C语言实现简易计算器(可作加减乘除)](https://img.taocdn.com/s3/m/05fb98621fb91a37f111f18583d049649b660e99.png)
C语⾔实现简易计算器(可作加减乘除)C语⾔实现简易计算器(加减乘除)计算器作为课设项⽬,已完成答辩,先将代码和思路(注释中)上传⼀篇博客已增添、修改、整理⾄⽆错且可正常运⾏虽使⽤了栈,但初学者可在初步了解栈和结构语法后理解代码#include <stdlib.h>#include <stdio.h>#include <string.h>#define IsDouble 0#define IsChar 1//_______________________________________________________________________________________________________________________________________________________ //1.⽀持浮点数和字符的栈typedef struct {char * buffer;int typesize;int top;int max;} stack;stack * CreateStack(int max, int typesize);//创建⼀个栈void DestroyStack(stack *);//释放栈的空间void ClearStack(stack *);//清空栈int Push(stack *, void *);//⼊栈int Pop(stack *, void *);//出栈int GetSize(stack *s);//得到栈的⼤⼩int GetTop(stack *, void *);//找到栈顶int IsEmpty(stack *);//判断是否为空栈,空则下溢int IsFull(stack *);//判断栈是否已满,满则溢出stack * CreateStack(int max, int typesize){stack * s = (stack*)malloc(sizeof(stack));//为栈s malloc内存if (!s) return 0;//为结构中buffer元素malloc内存s->buffer = (char *)malloc(sizeof(char) * max * typesize);if (!s->buffer) return 0;//初始化结构中的栈顶,最⼤值,类型⼤⼩s->top = -1;s->max = max;s->typesize = typesize;return s;}void DestroyStack(stack* s){free(s->buffer);//先释放buffer的空间free(s);//在释放s的空间}void ClearStack(stack * s){s->top = -1;//清空栈(栈头位置归零)}int Push(stack * s, void * data){if (IsFull(s)) return 0;//如果栈已满则return 0,防⽌溢出//栈未满则将栈头移动打动下⼀位置,并将data中的元素拷⼊栈中buffer的第top位置s->top++;memcpy(s->buffer + s->top*s->typesize, data, s->typesize);//⼊栈成功return 1return 1;}int Pop(stack * s, void * data){if (IsEmpty(s)) return 0;//出栈判断栈是否为空,若为空则return 0//栈未空则将buffer中top位置的字符拷⼊data记录,并让栈头向前移动⼀个位置memcpy(data, s->buffer + s->top*s->typesize, s->typesize);s->top--;//成功则return 1return 1;}int GetSize(stack *s){return s -> top+1;//栈头位置+1得到⼤⼩}int GetTop(stack *s, void * data){if (IsEmpty(s)) return 0;//如果栈空return 0//栈不为空则将top位置的字符拷回data记录,得到栈头memcpy(data, s->buffer + s->top*s->typesize, s->typesize);//成功则return 1;return 1;}int IsEmpty(stack * s){return s->top == -1;//如果top为-1则栈空}int IsFull(stack * s){return s->top == s->max-1;//如果top为max-1则栈满}//___________________________________________________________________________________________________________________________________________________ //2.定义⼀个cal类型,其中data存数时sign为IsDouble,存字符时,sign为Ischartypedef struct {double data;char sign;} cal;//3.查找对应符号(找到则返回该符号下标)(找不到则说明该部分为数字返回-1)int SearchCode(char ch){char * code = "+-*/()@";//@为终⽌符,算式输⼊结束int index = 0;//while (code[index]){if (code[index] == ch) return index;index++;}return -1;}//4.得到两个符号间的优先级//与SearchCode相对应,char GetPriority(char ch, char next){//创建⼀个perferen表,第i⾏(列)对应SearchCode函数中code中的第i个字符char perferen[7][7] = {">><<<>>",">><<<>>",">>>><>>",">>>><>>","<<<<<=E",">>>>E>>","<<<<<E="};//找到两个形参对应的字符int c = SearchCode(ch);int n = SearchCode(next);//如果找不到对应运算符(字符不是运算符⽽是为数字)return Eif (c==-1 || n==-1) return 'E';//如果找到两个对应运算符则按照优先级表返回两个运算符的优先级return perferen[c][n];}//5.四则运算double add(double a, double b) { return a+b; }double sub(double a, double b) { return a-b; }double mul(double a, double b) { return a*b; }double ddiv(double a, double b) { return a/b; }//整合四种运算double calcu(double a, char ch, double b){double (*calculation[4])(double,double) = {add,sub,mul,ddiv};return calculation[SearchCode(ch)](a,b);}//6.检测字符串int CheckStr(char * buffer){int n;//遍历字符串确保算式中⽆⾮法字符若检测到⾮法字符return 0,若都合法则return 1for (n = 0;buffer[n];n++){if ((SearchCode(buffer[n]) != -1 || buffer[n] == '.' || (buffer[n] >= '0' && buffer[n] <= '9')) && buffer[n] != '@') continue;else return 0;}buffer[n] = '@';//加上终⽌符,表⽰算式结束buffer[n+1] = '\0';return 1;}//7.得到数据转化为double类型存⼊rsint GetDigit(char * buffer, int * n, double * rs){char str[30];int i,j = 0;for (i = 0;SearchCode(buffer[*n]) == -1;i++){str[i] = buffer[*n];//从*n位置开始,将这⼀串数字字符存⼊str(*n)++;}str[i] = '\0';for (i = 0;str[i];i++){if (str[i] == '.') j++;}//如果⼀段⼩数有多个⼩数点或⼩数点在数字⾸尾,return 0if (j>1 || str[i-1] == '.' || str[0] == '.') return 0;//rs接收转化为double的数据*rs = atof(str);//操作成功return 1return 1;}//8.将⽤户输⼊的buffer字符串转化为可供程序运算的calstr数组int resolu(char * buffer, cal * calstr){int i = 0, j = 0;cal c;while (buffer[i]){if (SearchCode(buffer[i]) == -1){//如果得到数据不成功则return 0if (GetDigit(buffer,&i, &c.data) == 0) return 0;//如果成功得到数据则在c.sign标记为浮点数c.sign = IsDouble;//将c存⼊数组calstr中calstr[j++] = c;}else{//若符号为运算符//判断正负号if (buffer[i] == '-' && (buffer[i-1] == '('||buffer[i-1] == '+'||buffer[i-1] == '-'||buffer[i-1] == '*'||buffer[i-1] == '/') || (i==0 && buffer[0] == '-')){ i++;if (GetDigit(buffer,&i, &c.data) == 0) return 0;//在符号的下⼀位开始查找,若找不到数字return 0//否则,给数字取相反数,c.sign标记为浮点数,存⼊calstr中c.data = 0 - c.data;c.sign = IsDouble;calstr[j++] = c;} else//如果是正号,与符号处理⽅式同理if (buffer[i] == '+' && (buffer[i-1] == '('||buffer[i-1] == '+'||buffer[i-1] == '-'||buffer[i-1] == '*'||buffer[i-1] == '/') || (i==0 && buffer[0] == '+')){ i++;if (GetDigit(buffer, &i, &c.data) == 0) return 0;c.sign = IsDouble;calstr[j++] = c;}else{//如果不是正负号,则为运算符,先强制转换为double类型存在c.data⾥,然后c.sign标记为char类型,存⼊calstrc.data = (double)buffer[i++];c.sign = IsChar;calstr[j++] = c;}}}//操作蔡成功则return 1return 1;}//9.计算出结果int result(cal * calstr, double * rs){stack * pst = CreateStack(100,sizeof(char));//运算符栈stack * pnd = CreateStack(100,sizeof(double));//数据栈double num1,num2;int n = 0;char ch = '@';Push(pst, &ch);//在转换得到的calstr中遍历直到终⽌符'@"while(ch != '@' || !(calstr[n].sign == IsChar && (char)calstr[n].data == '@')){//如果calstr的n位上是浮点数,则将这个data压栈进⼊数据栈pnd中if (calstr[n].sign == IsDouble){Push(pnd, &(calstr[n].data));n++;}//反之,如果是运算符,则要检测优先级else{switch( GetPriority(ch, (char)calstr[n].data)){//如果运算符优先级较⼩,则让ch等于优先级⼤的符号并压⼊符号栈pst中case '<':ch = (char)calstr[n].data;Push(pst, &ch);n++;break;//如果结果为等号,让符号出栈暂存到ch中case '=':if (!Pop(pst, &ch)) return 0;n++;break;//如果ch优先级较⾼,则将前两个数字及运算符出栈,分别储存⾄num2,ch,num1中,进⾏运算,得到的结果再次压栈进⼊pnd中 case '>':if (!(Pop(pnd,&num2) && Pop(pst,&ch) && Pop(pnd,&num1))) return 0;num1 = calcu(num1,ch,num2);Push(pnd, &num1);break;//如果符号顺序出错,return 0case 'E':return 0;}}//检测是否可以得到栈顶符号,栈空则return 0if (!GetTop(pst, &ch)) return 0;}//如果栈中得到了最终结果,并且取出pnd中的最终结果到rs,return 1if (GetSize(pnd) == 1 && GetTop(pnd,rs)){DestroyStack(pst);DestroyStack(pnd);return 1;}//否则 return 0else{return 0;}}//10.⽤户交互函数void treatment(){char buffer[100];//⽤户输⼊的字符串(算式)cal calstr[50];//计算⽤的数组double rs = 0;//计算结果printf("Enter your equation:");gets(buffer);//让⽤户输⼊算式buffer//⽤户不输⼊"exit"就不退出while (!(buffer[0]=='e' && buffer[1]=='x' && buffer[2]=='i' && buffer[3]=='t')){//检查buffer中字符君合法,成功将buffer转化为⽤于计算的calstr数组,成功计算出结果存⼊rsif (CheckStr(buffer) && resolu(buffer,calstr) && result(calstr,&rs)){printf("\n%lf\n",rs);}else{printf("\nError!\n");}printf("Enter \"exit\"to quit");printf("\nEnter your equation:");gets(buffer);//再次让⽤户输⼊算式}printf("\nbye\n");}//11.主函数int main(){treatment();}参考⽂献链接如下[参考⽂献]()。
元稀疏多项式计算器实验报告c编写,附源代码(1)
![元稀疏多项式计算器实验报告c编写,附源代码(1)](https://img.taocdn.com/s3/m/4b421328a9114431b90d6c85ec3a87c240288ad0.png)
元稀疏多项式计算器实验报告c编写,附源代码(1)实验报告:元稀疏多项式计算器引言:本次实验是运用C语言编写一个元稀疏多项式计算器,该计算器可以实现多项式的加法、减法、乘法、求导、积分、求值等操作。
本次实验旨在通过编写实践,加深对多项式计算的理解和程序设计能力。
一、设计思路及实现方法1.1 多项式的表示方式多项式可以用数组来表示,数组的下标表示多项式的幂次,数组的内容表示该幂次项的系数。
例如多项式:2x^4 + 3x^2 + 5可以表示为数组:{0,0,3,0,2,5}。
1.2 多项式的操作函数及实现方法本次实验实现了以下多项式操作函数:1)add(多项式加法):将两个多项式相加并返回结果多项式。
2)subtract(多项式减法):将两个多项式相减并返回结果多项式。
3)multiply(多项式乘法):将两个多项式相乘并返回结果多项式。
4)differential(求导):求一个多项式的导数并返回结果多项式。
5)integral(积分):对一个多项式进行积分并返回结果多项式。
6)evaluate(求值):给定一个值,计算多项式在该值处的值并返回结果。
以上操作函数的实现方法都是通过循环遍历数组,并运用相应的多项式计算公式来计算。
二、程序设计及实验结果2.1 程序设计本次实验采用C语言编写完成,主函数的框架如下:int main(int argc, char const *argv[]) {// 输入多项式各项系数和幂次// 调用各个多项式计算函数// 输出计算结果return 0;}2.2 实验结果本次实验的实验结果如下:1)将多项式2x^3 + 3x^2 + 5x + 2与多项式3x^3 - 2x^2 + 4相加:输入:2 3 5 2 3 -2 0 4输出:5x^3 + x^2 + 5x + 62)将多项式2x^3 + 3x^2 + 5x + 2与多项式3x^3 - 2x^2 + 4相减:输入:2 3 5 2 3 -2 0 4输出:-1x^3 + 5x^2 + 5x - 23)将多项式2x^3 + 3x^2 + 5x + 2与多项式3x^3 - 2x^2 + 4相乘:输入:2 3 5 2 3 -2 0 4输出:6x^6 + 5x^5 + 4x^4 + 4x^3 + 26x^2 + 14x + 84)求多项式2x^3 + 3x^2 + 5x + 2的导数:输入:2 3 5 2输出:6x^2 + 6x + 55)对多项式2x^3 + 3x^2 + 5x + 2进行积分:输入:2 3 5 2输出:0.5x^4 + 1x^3 + 2.5x^2 + 2x + 06)计算多项式2x^3 + 3x^2 + 5x + 2在x=3处的值:输入:2 3 5 2 3输出:59以上实验结果均能正确输出。
一元稀疏多项式计算器实验报告(c++编写,附源代码)
![一元稀疏多项式计算器实验报告(c++编写,附源代码)](https://img.taocdn.com/s3/m/79961e42ba1aa8114431d994.png)
一元稀疏多项式计算器实验报告级班年月日学号_1.实验题目设计一个一元稀疏多项式简单计算器。
2.需求分析本程序用VC编写,实现一元浮点系数,整数指数稀疏多项式的创建、两个一元多项式相加、两个一元多项式相减、输出一元多项式。
①输入的形式和输入值的围:A.输入指定的数字,以此选择两个多项式的运算方式,运算方式有两个一元多项式相加、两个一元多项式相减。
B.创建多项式时,需要输入此多项式,每一项的系数和指数。
②输出的形式:每次输入一个完整的多项式后、每次得出多项式运算结果时,会以指定的方式输出多项式。
③程序所能达到的功能:实现一元稀疏多项式的创建、两个一元多项式相加、两个一元多项式相减、输出一元多项式。
④测试数据:输入数据:A.出现选择两个多项式的运算方式菜单时,输入1(即使两个多项式相加);B.首先输入多项式p的每一项系数和指数,当输入的指数为-5000时,表示该多项式输入完毕,输入的数据依次为:3,3,0,-5000;C.其次输入多项式q的每一项系数和指数,输入数据依次为:2,2,0,-5000。
输出结果:多项式q+p的结果为:多项式为:3x3+2x23.概要设计1)为了实现上述程序功能,需要定义多项式结点的抽象数据类型:class Term{数据对象:float coef; 该数据对象为多项式一项中的系数。
int exp; 该数据对象为多项式一项中的指数。
Term* link; 该数据对象为指向下一个多项式结点的指针。
基本操作:A. Term (float c, int e)初始条件:无操作结果:初始化多项式结点对象,将c赋值给该结点的数据成员coef(表示系数),将e赋值给该结点的数据成员exp(表示指数),将该结点的数据成员link赋值为0。
B.Term (float c, int e, Term* next)初始条件:无操作结果:初始化多项式结点对象,将c赋值给该结点的数据成员coef(表示系数),将e赋值给该结点的数据成员exp(表示指数),将next赋值给该结点的数据成员link(link表示指向下一个多项式结点的指针)。
多功能计算器的C语言实现 (1)
![多功能计算器的C语言实现 (1)](https://img.taocdn.com/s3/m/0fb34a8351e79b89680226da.png)
多功能计算器的C语言实现题目:设计一个多功能计算软件实现功能:具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。
依次输入第一个运算数、运算符(+,-,*,/)、第二个运算数,然后输出结果。
结果可以作为下一个运算的第一运算数。
按‘C’清屏,按‘R’返回菜单。
例如:输入:2+5输出:7C语言实现:#include<stdio.h>#include<string.h>#include<stdlib.h>#define MaxLength 50void Show_screen(){printf("####################################################\n");printf("#依次输入操作数1、运算符和操作数2,例如:2+5。
#\n");printf("#按回车键显示运算结果,其可作为下一个输入的操作数。
#\n");printf("#按键c清除屏幕,按键r返回菜单。
#\n");printf("####################################################\n");}double myadd(double x, double y){double sum;sum=x+y;if(sum-(int)sum==0)printf("%.0f",sum);elseprintf("%.6f",sum);return sum;}double mysub(double x, double y){double sub;sub=x-y;if(sub-(int)sub==0)printf("%.0f",sub);elseprintf("%.6f",sub);return sub;}double mymul(double x, double y){double mul;mul=x*y;if(mul-(int)mul==0)printf("%.0f",mul);elseprintf("%.6f",mul);return mul;}double mydiv(double x, double y){double div;div=x/y;if(div-(int)div==0)printf("%.0f",div);elseprintf("%.6f",div);return div;}int main(){int myoffset;int flag;//判断是否将上次计算结果作为下次运算操作数1的标志,是的话值为1。
C语言简单计算器实现四则运算可带括号
![C语言简单计算器实现四则运算可带括号](https://img.taocdn.com/s3/m/b7633869657d27284b73f242336c1eb91b373378.png)
C语言简单计算器实现四则运算可带括号```c#include <stdio.h>#include <stdlib.h>int priority(char op)if (op == '+' , op == '-')return 1;else if (op == '*' , op == '/')return 2;else if (op == '(')return 0;elsereturn -1;void calculate(char op, int *numStack, int *top, char *opStack, int *opTop)int num2 = numStack[(*top)--];int num1 = numStack[(*top)--];switch (op)case '+':numStack[++(*top)] = num1 + num2; break;case '-':numStack[++(*top)] = num1 - num2; break;case '*':numStack[++(*top)] = num1 * num2; break;case '/':numStack[++(*top)] = num1 / num2; break;}int eval(char *expr)int numStack[100];char opStack[100];int numTop = -1;int opTop = -1;int num = 0;int sign = 1;while (*expr != '\0')if (*expr >= '0' && *expr <= '9')num = num * 10 + (*expr - '0');} else if (*expr == '+' , *expr == '-')numStack[++numTop] = num * sign;num = 0;sign = (*expr == '+') ? 1 : -1;} else if (*expr == '*' , *expr == '/')while (opTop >= 0 && priority(*expr) <=priority(opStack[opTop]))calculate(opStack[opTop--], numStack, &numTop, opStack, &opTop);}opStack[++opTop] = *expr;} else if (*expr == '(')opStack[++opTop] = '(';} else if (*expr == ')')while (opStack[opTop] != '(')calculate(opStack[opTop--], numStack, &numTop, opStack, &opTop);}opTop--;}expr++;}numStack[++numTop] = num * sign;while (opTop >= 0)calculate(opStack[opTop--], numStack, &numTop, opStack, &opTop);}return numStack[0];int maichar expr[100];printf("请输入表达式:");scanf("%s", expr);int result = eval(expr);printf("计算结果:%d\n", result);return 0;```以上是一个简单的C语言四则运算计算器的实现。
一元稀疏多项式计算器c语言
![一元稀疏多项式计算器c语言](https://img.taocdn.com/s3/m/511cbd18443610661ed9ad51f01dc281e53a5625.png)
一元稀疏多项式计算器c语言一、背景。
在计算机领域中,一元稀疏多项式是一种较为重要的数据类型,它广泛应用于科学计算、图像处理等领域。
由于传统计算方法需要大量时间和计算资源,因此研究一种高效的一元稀疏多项式计算器显得十分重要。
二、需求分析。
基于以上背景,我们需要完成以下需求:1.实现一元稀疏多项式的基本运算,如加、减、乘、除法等。
2.实现一元稀疏多项式的系数排序,可以按照任意顺序排列。
3.实现一元稀疏多项式的表示方式,可供用户输入和输出。
三、设计方案。
为了满足以上需求,我们可以采用以下设计方案:1.多项式基本结构。
为了处理一元稀疏多项式的各种运算,我们需要为多项式定义一个基本的数据结构。
这个结构需要包含多项式的各项系数、指数、项数等信息。
我们可以采用数组或链表等方式实现这个数据结构。
2.多项式运算。
为了完成多项式的加、减、乘、除法等运算,我们需要实现相应的算法。
这些算法包括基于快速傅里叶变换的多项式乘法、除法等。
3.系数排序。
为了满足用户不同的需求,我们需要实现多项式系数的排序功能。
由于用户可以选择任意的顺序,我们需要保证排序算法的稳定性和高效性。
4.多项式表示。
为了方便用户输入和输出多项式,我们需要设计一个简洁易用的多项式表示方式。
用户可以根据需要选择带有系数和指数的输入方式,也可以选择只输入系数或指数。
四、实现细节。
为了优化计算效率和减少内存占用,我们可以在实现多项式运算时采用以下方法:1.采用链表存储多项式的数据结构,可以有效减少内存占用和复制开销。
2.对于多项式的加、减、乘、除法等运算,我们可以根据具体情况选择合适的运算算法。
如多项式加减可以直接遍历链表进行计算;多项式乘法可以使用快速傅里叶变换等算法。
3.为了提高排序效率,我们可以采用基于快速排序、归并排序等的排序算法。
对于多项式系数相同时,可以使用指数作为比较因素。
五、总结。
通过以上设计方案和实现细节,我们可以实现一个高效的一元稀疏多项式计算器。
(2023)一元稀疏多项式计算器实验报告c编写,附源代码(一)
![(2023)一元稀疏多项式计算器实验报告c编写,附源代码(一)](https://img.taocdn.com/s3/m/c5d27d950129bd64783e0912a216147917117e66.png)
(2023)一元稀疏多项式计算器实验报告c编写,附源代码(一)实验报告:(2023)一元稀疏多项式计算器实验目的本实验旨在编写一款一元稀疏多项式计算器,实现对两个多项式的加、减、乘、求导、求值等操作。
实验环境•操作系统:Windows 10•开发工具:Visual Studio Code•编程语言:C实验过程1. 首先定义多项式的结构体typedef struct PolyTerm {int coef;// 系数unsigned int power;// 指数struct PolyTerm* next;// 下一项}PolyTerm;typedef struct Poly {int degree;// 多项式最高次项PolyTerm* head;// 首项指针}Poly;2. 实现多项式的输入与输出void inputPoly(Poly* poly);// 输入多项式void outputPoly(Poly* poly);// 输出多项式3. 实现多项式的加、减、乘操作Poly* addPoly(Poly* p1, Poly* p2);// 多项式加法Poly* subPoly(Poly* p1, Poly* p2);// 多项式减法Poly* multPoly(Poly* p1, Poly* p2);// 多项式乘法4. 实现多项式求导void derivative(Poly* poly);// 多项式求导5. 实现多项式求值int evaluate(Poly* poly,int x);// 多项式求值6. 主函数的实现主函数通过简单的菜单方式,实现用户输入选项,选择需要进行的操作。
实验结果通过对多项式加、减、乘、求导、求值等操作的实现,成功完成了一元稀疏多项式计算器的编写,实现了对多项式运算的基本掌握。
实验总结在本次实验中,我们通过C语言实现了一元稀疏多项式计算器,并体验了多项式运算的具体操作。
C语言简易计算器的实现
![C语言简易计算器的实现](https://img.taocdn.com/s3/m/fa2f78d4dc88d0d233d4b14e852458fb760b3855.png)
C语言简易计算器的实现计算器是一个常见的应用程序,用于执行数学运算。
在C语言中,可以通过使用条件判断、循环和函数来实现一个简易计算器。
下面是一个实现四则运算的简易计算器的示例代码:```c#include <stdio.h>float add(float a, float b)return a + b;float subtract(float a, float b)return a - b;float multiply(float a, float b)return a * b;float divide(float a, float b)return a / b;int maifloat num1, num2;char operator;printf("请输入两个数:");scanf("%f %f", &num1, &num2);printf("请输入操作符:");scanf(" %c", &operator); // 注意空格,以防止读取上一个输入时的换行符float result;switch (operator)case '+':result = add(num1, num2);printf("结果为:%.2f\n", result);break;case '-':result = subtract(num1, num2);printf("结果为:%.2f\n", result);break;case '*':result = multiply(num1, num2);printf("结果为:%.2f\n", result);break;case '/':if (num2 == 0)printf("除数不能为0!\n");} elseresult = divide(num1, num2);printf("结果为:%.2f\n", result);}break;default:printf("操作符无效!\n");break;}return 0;```在这个简易计算器中,使用了四个函数来执行加法、减法、乘法和除法运算,这些函数分别返回运算结果。
一元稀疏多项式计算器c语言
![一元稀疏多项式计算器c语言](https://img.taocdn.com/s3/m/2f6473174a73f242336c1eb91a37f111f1850d09.png)
一元稀疏多项式计算器c语言下面是一个使用C语言编写的一元稀疏多项式计算器的示例代码。
```c#include<stdio.h>#include<stdlib.h>//定义多项式的一个节点typedef struct Nodeint coefficient; // 系数int exponent; // 指数struct Node* next; // 下一个节点} Node;//创建一个节点Node* createNode(int coefficient, int exponent)Node* newNode = (Node*)malloc(sizeof(Node));newNode->coefficient = coefficient;newNode->exponent = exponent;newNode->next = NULL;return newNode;//插入节点到多项式中Node* insertNode(Node* head, int coefficient, int exponent) Node* newNode = createNode(coefficient, exponent);if(head == NULL)return newNode;} elseNode* temp = head;while(temp->next != NULL)temp = temp->next;}temp->next = newNode;return head;}//打印多项式void printPolynomial(Node* head)Node* temp = head;while(temp != NULL)printf("%dx^%d ", temp->coefficient, temp->exponent);temp = temp->next;if(temp != NULL)printf("+ ");}}printf("\n");//计算两个多项式的和Node* addPolynomials(Node* polynomial1, Node* polynomial2) Node* result = NULL;while(polynomial1 != NULL && polynomial2 != NULL)if(polynomial1->exponent > polynomial2->exponent)result = insertNode(result, polynomial1->coefficient, polynomial1->exponent);polynomial1 = polynomial1->next;} else if(polynomial1->exponent < polynomial2->exponent) result = insertNode(result, polynomial2->coefficient, polynomial2->exponent);polynomial2 = polynomial2->next;} elseresult = insertNode(result, polynomial1->coefficient + polynomial2->coefficient, polynomial1->exponent);polynomial1 = polynomial1->next;polynomial2 = polynomial2->next;}}//将剩余的节点加入结果中while(polynomial1 != NULL)result = insertNode(result, polynomial1->coefficient, polynomial1->exponent);polynomial1 = polynomial1->next;}while(polynomial2 != NULL)result = insertNode(result, polynomial2->coefficient, polynomial2->exponent);polynomial2 = polynomial2->next;}return result;//主函数int maiNode* polynomial1 = NULL;Node* polynomial2 = NULL;Node* result = NULL;//输入第一个多项式int numTerms1;printf("Enter the number of terms in polynomial 1: ");scanf("%d", &numTerms1);printf("Enter each term of polynomial 1 (coefficient exponent):\n");for(int i=0; i<numTerms1; i++)int coefficient, exponent;scanf("%d %d", &coefficient, &exponent);polynomial1 = insertNode(polynomial1, coefficient, exponent);}//输入第二个多项式int numTerms2;printf("Enter the number of terms in polynomial 2: ");scanf("%d", &numTerms2);printf("Enter each term of polynomial 2 (coefficient exponent):\n");for(int i=0; i<numTerms2; i++)int coefficient, exponent;scanf("%d %d", &coefficient, &exponent);polynomial2 = insertNode(polynomial2, coefficient, exponent);}//打印两个多项式printf("\nPolynomial 1: ");printPolynomial(polynomial1);printf("Polynomial 2: ");printPolynomial(polynomial2);//计算两个多项式的和result = addPolynomials(polynomial1, polynomial2);//打印结果多项式printf("\nSum of polynomials: ");printPolynomial(result);return 0;```这个计算器使用了链表来表示多项式,每个节点包含一个系数和一个指数。
用C语言实现多项式简单计算器的设计
![用C语言实现多项式简单计算器的设计](https://img.taocdn.com/s3/m/aa4524f36294dd88d0d26baa.png)
设计题目:用 C 语言实现多项式简单计算器的设计
设计目的
1.巩固和加深课堂所学知识、学会分析研究数据对象的特性及数据的组织方法; 2.选择合适的数据的逻辑结构和存储结构以及相应操作,实现简单的多项式计算; 3.提高程序设计能力、加强查阅、运用资料的能力、算法分析与程序设计素质培养 ;
设计任务 (在规定的时间内完成下列任务)
学号 10212812141
武汉理工大学华夏学院 课程设计报告书
课程名称: 数据结构
题 目:用 C 语言实现多项式简单计算器的设计
系 名:
信息工程系
专业班级:
软件工程 1121 班
姓 名:
邓燕蓉
指 月 28 日
课程设计任务书
学生姓名: 邓燕蓉 指导教师: 王绪梅
专业班级: 软件工程 1121 班 工作单位:华夏学院计算机教研室
为了实现处理,设 p、q2 分别指向单链表 polya 和 polyb 的当前项,比较 p、q2 结点的指数 由此得到下列运算规则:
① 若 p->expn<q2->expn,则结点 q2 所指的结点应是“和多项式”中的一项,令指针 q2 后移。 ② 若 p->expn=q2->expn,则将两个结点中的系数相加,当和不为 0 时修改结点 q2 的系数。 ③ 若 p->expn>q2->expn,则结点 p 所指的结点应是“和多项式”中的一项,将结点 p 插入在结点 q2 之前,且令指针 p 在原来的链表上后移。
2.2 设计思路
(1)定义线性表的动态分配顺序存储结构; (2)建立多项式存储结构,定义指针*next; (3)利用链表实现队列的构造,每次输入一项的系数和指数,可以构造一元多项式; (4)演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在 键盘上输入演示程序中规定的运行命令;最后根据相应的数据进行输入建立多项式以及多项式相加,减, 乘的运行结果在屏幕上显示。 设计思路分析:
用C语言实现多项式简单计算器的设计概要
![用C语言实现多项式简单计算器的设计概要](https://img.taocdn.com/s3/m/18f4bfac5ff7ba0d4a7302768e9951e79b8969fb.png)
用C语言实现多项式简单计算器的设计概要一、引言多项式是数学中重要的概念之一,在实际问题中经常用到。
多项式的运算包括加法、减法、乘法和除法等,因此设计一个多项式简单计算器是很有实用价值的。
本文将使用C语言实现多项式简单计算器的设计概要。
二、设计目标多项式简单计算器的设计目标是实现多项式的基本运算,包括多项式的输入、输出和常见运算。
具体目标如下:1.可以输入多项式,并以合适的格式显示出来;2.可以进行两个多项式的加法、减法和乘法运算;3.可以进行一个多项式的常数乘法;4.可以进行多项式的求导;5.可以根据给定点的横坐标,计算多项式的函数值;6.可以清空计算器的当前结果。
三、设计思路为了实现以上目标,需要设计以下功能模块:1.输入模块:从键盘获取用户输入,并将输入的多项式存储起来;2.输出模块:以合适的格式将多项式输出到屏幕上;3.加法模块:将两个输入的多项式相加,生成一个新的多项式;4.减法模块:将第二个输入的多项式从第一个输入的多项式中减去,生成一个新的多项式;5.乘法模块:将两个输入的多项式相乘,生成一个新的多项式;6.常数乘法模块:将一个输入的多项式与指定常数相乘,生成一个新的多项式;7.求导模块:对输入的多项式进行求导运算,生成一个新的多项式;8.函数值计算模块:根据给定点的横坐标,计算多项式在该点的函数值;9.清空模块:清空当前计算器的结果。
四、设计过程1.输入模块的设计输入模块可以通过逐项输入多项式的系数和指数,使用链表来存储多项式。
每一个链表节点包括系数(coefficient)和指数(exponent),使用两个变量分别存储。
可以引入一个头指针和一个尾指针来指向链表的首和尾部。
2.输出模块的设计输出模块将使用循环遍历链表,根据每个节点的系数和指数,将多项式以合适的格式输出到屏幕上。
3.加法模块的设计加法模块将根据两个链表的节点的指数进行比较,如果指数相等,则将系数相加,并将结果存储到一个新的链表中。
多项式简单的计算器
![多项式简单的计算器](https://img.taocdn.com/s3/m/a242a23d998fcc22bdd10d32.png)
目录1 软件开发平台 (1)2 软件功能说明 (1)2.1 功能分析说明图 (1)2.2 各项功能说明 (3)3 软件设计详细内容 (5)3.1 采用的主要数据结构类型 (5)3.2 流程图 (5)4 软件测试 (8)4.1 软件测试用例 (8)4.2 软件测试报告 (8)5 总结和致谢 (13)6 附录 (13)6.1 软件使用说明 (13)6.2 源码 (16)6.3 参考文献 (26)1.软件开发平台配置环境Windows XP 系统或Windows 7 系统运行环境Windows XP 系统或Windows 7 系统开发工具VC++6.0程序语言 C 语言2.软件功能说明一元多项式简单的计算器该计算器具有以下功能:①能够按照多项式变量的指数降序创建一个多项式;②能够对已创建的多项式进行显示;③能够对已创建的多项式之间的加法运算;④能够对已创建的多项式之间的减法运算;⑤能够对已创建的多项式进行删除;⑥能够实现计算器退出操作;2.1功能分析说明图2.2各项功能说明要求对分别上面的每个功能模块进行详细的文字说明主函数模块main() 建立一个可供选择的菜单,通过switch语句,选择1则是去建立多项式,选择2则是去显示出多项式,选择3则是去进行两个多项式的相加,选择4则是进行两个多项式的相减,选择5则是去进行多项式的删除,选择6则是退出菜单。
多项式的建立模块Creatpol() 建立一个链表,头指针均用结构体指针数组中的元素表示,且头指针所指的结构体的指数是表示该链表表示的多项式的项数,而后以指数递减的次序依次输入各项,链表中的第二个节点表示的是多项式中的第一项,依次类推,不断把多项式各项的指数,系数的值输入链表的节点中,并使链尾指针为空。
多项式的输出模块Outp_pol() 首先用一个指针指向需要输出的多项式对应的链表的头指针,头指针的指数成员表示项数,接着通过链表依次输出各项,从第二项开始,系数不小于的项与系数小于0的项输出是不一样的,判断后依次输出。
一元多项式计算器 c语言
![一元多项式计算器 c语言](https://img.taocdn.com/s3/m/03bbde10964bcf84b9d57bfb.png)
typedef struct Linklistomial{
float coef;
int expn;
struct Linklistomial *next;
}Linklistomial,*Linklist;
void Insert(Linklist p,Linklist h){
Linklist qa=pa->next;
Linklist qb=pb->next;
Linklist headc,hc,qc;
hc=(Linklist)malloc(sizeof(struct Linklistomial));//建立头结点
hc->next=NULL;
scanf("%f %d",&p->coef,&p->expn);
Insert(p,head); //调用Insert函数插入结点
}
return head;
}
void DestroyLinklist(Linklist p){ //销毁多项式p
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
break;
}
case -1: {
qc->expn=qa->expn;
qa=qa->next;
break; }
case 0: {
qc->coef=qa->coef-qb->coef;
qc->coef=-qb->coef;
qc->expn=qb->expn;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
武汉理工大学华夏学院课程设计报告书课程名称:数据结构题目:用C语言实现多项式简单计算器的设计系名:信息工程系专业班级:软件工程1121班*名:*******:***2013 年6月28日课程设计任务书学生姓名:邓燕蓉专业班级:软件工程1121班指导教师:王绪梅工作单位:华夏学院计算机教研室设计题目:用C语言实现多项式简单计算器的设计设计目的1.巩固和加深课堂所学知识、学会分析研究数据对象的特性及数据的组织方法;2.选择合适的数据的逻辑结构和存储结构以及相应操作,实现简单的多项式计算;3.提高程序设计能力、加强查阅、运用资料的能力、算法分析与程序设计素质培养;设计任务(在规定的时间内完成下列任务)〔问题描述〕输入并建立两个多项式并输出多项式设计一个程序:对两个多项式进行加、减法及乘法运算,建立一个新多项式并输出.或设计一个程序对其中一个多项式求导。
〔实现提示〕选择带头结点的单链表或循环链表存储多项式,头结点中存放多项式的参数及单链表的数据具体要完成的任务是:A.编制完成上述问题的C语言程序、进行程序调试并能得出正确的运行结果。
B.写出规范的课程设计报告书;时间安排:6月24日---28日具体要求1. 课程设计报告按统一通用格式书写,具体内容如下:①设计任务与要求②总体方案与说明③软件主要模块的流程图④源程序清单与注释⑤问题分析与解决方案(包括调式记录、调式报告,即在调式过程中遇到的主要问题、解决方法及改进设想);⑥小结与体会附录:①源程序(必须有简单注释)②使用说明③参考资料2.每位学生应独立完成各自的任务且每天至少在设计室工作半天;指导教师签名:王绪梅2013 年6月22日教研室主任(或责任教师)签名:2013年6月24日目录1.设计题目 (1)2.需求分析 (1)2.1一元多项式的简单计算器的基本功能 (1)2.2 设计思路 (1)3.系统过程 (2)3.1 概要设计 (2)3.2 详细设计 (3)4.调用关系图 (3)4.1 总流程图 (4)4.2 加法流程图 (5)4.3 减法流程图 (6)5.测试 (7)5.1 测试数据 (7)5.2 打开程序时的主界面 (7)5.3 输入并建立多项式 (8)5.4 选择执行的操作及执行的结果 (9)6.心得体会及总结 (10)7.参考文献 (10)附录 (11)数据结构课程设计报告书1 设计题目用C语言实现多项式简单计算器的设计2 需求分析2.1一元多项式的简单计算器的基本功能(1)输入并建立多项式;(2)输出多项式;(3)多项式a和b相加,建立多项式a+b;(4)多项式a和b相减,建立多项式a-b;(5)多项式a和b相乘,建立多项式a*b。
2.2 设计思路(1)定义线性表的动态分配顺序存储结构;(2)建立多项式存储结构,定义指针*next;(3)利用链表实现队列的构造,每次输入一项的系数和指数,可以构造一元多项式;(4)演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;最后根据相应的数据进行输入建立多项式以及多项式相加,减,乘的运行结果在屏幕上显示。
设计思路分析:要解决多项式相加,相减,相乘,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表,所以我将结点结构体定义为:运用尾插法建立两个单链表,以单链表Polyn p和Polyn h分别表示一元多项式a和b,a+b的求和运算等同于单链表的插入问题(将Polyn p中的结点插入到单链表Polyn h中),因此“和多项式”的结点无须另生成。
为了实现处理,设p、q2分别指向单链表polya和polyb的当前项,比较p、q2结点的指数由此得到下列运算规则:① 若p->expn<q2->expn,则结点q2所指的结点应是“和多项式”中的一项,令指针q2后移。
② 若p->expn=q2->expn,则将两个结点中的系数相加,当和不为0时修改结点q2的系数。
③ 若p->expn>q2->expn,则结点p所指的结点应是“和多项式”中的一项,将结点p插入在结点q2之前,且令指针p在原来的链表上后移。
3 系统设计3.1 概要设计系统的主功能模块结构如图3—1所示。
图3—1 系统的主功能模块结构3.2 详细设计1、元素类型、结点类型和指针类型:typedef struct Polynomial{float coef; //系数int expn; //指数struct Polynomial *next;}*Polyn,Polynomial;2、建立一个头指针为head、项数为m的一元多项式, 建立新结点以接收数据, 调用Insert函数插入结点:Polyn CreatePolyn(Polyn head,int m){int i;Polyn p;p=head=(Polyn)malloc(sizeof(struct Polynomial));head->next=NULL;for(i=0;i<m;i++){p=(Polyn)malloc(sizeof(struct Polynomial));printf("请输入第%d项的系数与指数:",i+1);scanf("%f %d",&p->coef,&p->expn);Insert(p,head); //调用Insert函数插入结点}return head;}3、主函数和其他函数:int main(){int m,n,flag=0;float x;Polyn pa=0,pb=0,pc,pd,pe,pf;}void PrintPolyn(Polyn P) //输出多项式a和bPolyn AddPolyn(Polyn pa,Polyn pb) //求解并建立多项式a+b,返回其头指针Polyn SubtractPolyn(Polyn pa,Polyn pb) //求解并建立多项式a-b,返回其头指针Polyn MultiplyPolyn(Polyn pa,Polyn pb) //求解并建立多项式a*b,返回其头指针4 调用关系图4.1 总流程图总流程图如图4—1所示。
执行加法流程图如图4—2所示。
图4—2 执行加法流程图执行减法流程图如图4—3所示。
图4—3 执行减法流程图5测试5.1 测试数据1、(-3x11+5x8 +4x)+( 11x9-5x8+7)=(-3x11+11x9+4x+7);2、(7x-3 +4.4x2-1.2x9-x)-(-6x-3+5.4x2-x2+7.8x15)=(-7.8x15-1.2x9+13x-3-x);3、(9x8+4x6-5x4+8x)*( x14+2x4)=(9x22+4x20-5x18+8x15+18x12+8x10-10x8+16x5);4、(x+x3)+(-x-x3)=0;5、(1-x+x2+x3-x4)*(-x3-x4)=(x8-2x6-x3)。
5.2. 打开程序时的主界面打开程序时的主界面如图5—1所示。
图 5—1 打开程序时的主界面5.3 .输入并建立多项式输入并建立多项式如图5—2所示。
图5—2 输入并建立多项式5.4 选择执行的操作及执行操作的结果选择执行的操作及执行操作的结果如图5—3、5—4、5—5所示。
图 5—3 选择执行的操作及执行操作的结果图 5—4 选择执行的操作及执行操作的结果图5—5 选择执行的操作及执行操作的结果6 心得体会及总结通过这次课程设计,我感觉到要自己动手真正做出一个程序并不很容易,但只要用心去做,总会有收获,特别是当我遇到问题,问老师,问同学,想尽办法去解决,最后终于找到方法时,心里的那份喜悦之情真是难以形容.编写程序中遇到问题再所难免,应耐心探究其中的原因,从出现问题的地方起,并联系前后程序,仔细推敲,逐个排查.直到最终搞清为止。
对于数据结构有了更深层次的理解,数据结构体现的是解决问题的一种思想,怎样把这种思想体现出来,需要我们对每个方面的系统了解。
并发现了许多自己的不足,平时没掌握的的知识在实践中暴露,经过不断的思考,查阅书籍和上网查资料及上机运行,解决了大部分的问题,还有一些小问题。
但是,我相信在今后的学习中,一定能把它解决好。
当今计算机应用在生活中可以说是无处不在。
因此作为二十一世纪的大学生来说掌握程序开发技术是十分重要的,而C语言又是最常见,功能最强大的一种高级语言,因此做好c语言版数据结构课程设计是十分必要的。
我不仅巩固了数据结构程序设计的内容,掌握设计的基本方法,强化了上机动手能力,还进一步掌握了以下知识:数据类型,分支控制,循环控制,结构体及数组,指针,文件操作,编译预处理等;通过课程设计,掌握了程序的局部测试,调试方法,建立程序系统调试,测试的基本概念和思想,学会较大程序的系统测试和调试方法。
当我选择通讯录管理系统时,首先系统分析主要思路和框架哦,与同学讨论,联系所学的知识。
我知道书上和老师讲的有限,所以上网搜也是一种利用资源的表现。
在编程中,特别是结构体,指针的部分,几乎是一片空白。
不过经过几天的努力,大体把课本上的知识点看了一遍,知识点也基本上掌握了,所以下一步就是开始正式的编程序了。
当读懂了C语言编程的基本过程和方法,经过一波三折,终于开始正式编程。
通过这次的课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的知识与实际结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力。
在课程设计过程中,收获知识,提高能力的同时,我也学到了很多的人生哲理,懂得了怎么去制定计划,怎么去实现这个计划,并掌握了在执行的过程中怎样去克服心理上的不良情绪。
因此在以后的生活和学习的过程中,我一定把课程设计的精神带到生活中,使生活变得更好。
7 参考文献[1]唐国民,王国均.数据结构(C语言版)·北京:清华大学出版社.[2] 严蔚敏,吴伟民.数据结构(C语言版).北京:清华大学出版社,1997.[3] 詹春华,杨沙. 《C语言程序设计教程》科学出版社,2011.8[4]董志民,崔建平,肖利娜.《C语言程序设计》教学改革探索与实践[J].福建电脑.[5] 王路明•C语言程序设计教程•北京:北京邮电大学出版社,2005年5月[6] 谭浩强·C++程序设计·北京:清华大学出版社·2004[7]范策.算法与数据结构(C语言版).北京:机械工业出版社,2004.附录#include<stdio.h>#include<malloc.h>typedef struct Polynomial{ float coef;int expn;struct Polynomial *next;}*Polyn,Polynomial; //Polyn为结点指针类型void Insert(Polyn p,Polyn h){ if(p->coef==0) free(p); //系数为0的话释放结点else{ Polyn q1,q2;q1=h;q2=h->next;while(q2&&p->expn<q2->expn) //查找插入位置{ q1=q2;q2=q2->next;}if(q2&&p->expn==q2->expn) //将指数相同相合并{ q2->coef+=p->coef;free(p);if(!q2->coef) //系数为0的话释放结点{ q1->next=q2->next;free(q2);}}else //指数为新时将结点插入{ p->next=q2;q1->next=p;}}}//InsertPolyn CreatePolyn(Polyn head,int m) //建立一个头指针为head、项数为m的一元多项式{ int i;Polyn p;p=head=(Polyn)malloc(sizeof(struct Polynomial));head->next=NULL;for(i=0;i<m;i++){ p=(Polyn)malloc(sizeof(struct Polynomial)); //建立新结点以接收数据printf("请输入第%d项的系数与指数:",i+1);scanf("%f %d",&p->coef,&p->expn);Insert(p,head); //调用Insert函数插入结点}return head;}//CreatePolynvoid DestroyPolyn(Polyn p) //销毁多项式p{ Polyn q1,q2;q1=p->next;q2=q1->next;while(q1->next){ free(q1);q1=q2; //指针后移q2=q2->next;}}void PrintPolyn(Polyn P){ Polyn q=P->next;int flag=1; //项数计数器if(!q) //若多项式为空,输出0{ putchar('0');printf("\n");return;}while (q){ if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项if(q->coef!=1&&q->coef!=-1) //系数非1或-1的普通情况{ printf("%g",q->coef);if(q->expn==1) putchar('X');else if(q->expn) printf("X^%d",q->expn);}else{ if(q->coef==1){if(!q->expn) putchar('1');else if(q->expn==1) putchar('X');else printf("X^%d",q->expn);}if(q->coef==-1){ if(!q->expn) printf("-1");else if(q->expn==1) printf("-X");else printf("-X^%d",q->expn);}}q=q->next;flag++;}//whileprintf("\n");}//PrintPolynint compare(Polyn a,Polyn b){ if(a&&b){ if(!b||a->expn>b->expn) return 1;else if(!a||a->expn<b->expn) return -1;else return 0;}else if(!a&&b) return -1; //a多项式已空,但b多项式非空else return 1; //b多项式已空,但a多项式非空}//comparePolyn AddPolyn(Polyn pa,Polyn pb) //求解并建立多项式a+b,返回其头指针{ Polyn qa=pa->next;Polyn qb=pb->next;Polyn headc,hc,qc;hc=(Polyn)malloc(sizeof(struct Polynomial)); //建立头结点hc->next=NULL;headc=hc;while(qa||qb){ qc=(Polyn)malloc(sizeof(struct Polynomial));switch(compare(qa,qb)){ case 1:{ qc->coef=qa->coef;qc->expn=qa->expn;qa=qa->next;break;}case 0:{qc->coef=qa->coef+qb->coef;qc->expn=qa->expn;qa=qa->next;qb=qb->next;break;}case -1:{qc->coef=qb->coef;qc->expn=qb->expn;qb=qb->next;break;}}//switchif(qc->coef!=0){qc->next=hc->next;hc->next=qc;hc=qc;}else free(qc);//当相加系数为0时,释放该结点}//whilereturn headc;}//AddPolynPolyn SubtractPolyn(Polyn pa,Polyn pb) //求解并建立多项式a-b,返回其头指针{ Polyn h=pb;Polyn p=pb->next;Polyn pd;while(p) //将pb的系数取反{ p->coef*=-1;p=p->next;}pd=AddPolyn(pa,h);for(p=h->next;p;p=p->next) //恢复pb的系数p->coef*=-1;return pd;}//SubtractPolynPolyn MultiplyPolyn(Polyn pa,Polyn pb) //求解并建立多项式a*b,返回其头指针{ Polyn hf,pf;Polyn qa=pa->next;Polyn qb=pb->next;hf=(Polyn)malloc(sizeof(struct Polynomial)); //建立头结点hf->next=NULL;for(;qa;qa=qa->next){ for(qb=pb->next;qb;qb=qb->next){ pf=(Polyn)malloc(sizeof(struct Polynomial));pf->coef=qa->coef*qb->coef;pf->expn=qa->expn+qb->expn;Insert(pf,hf); //调用Insert函数以合并指数相同的项}}return hf;}//MultiplyPolynint main(){int m,n,flag=0;float x;Polyn pa=0,pb=0,pc,pd,pe,pf; //定义各式的头指针,pa与pb在使用前赋初值NULL printf("请输入a的项数:");scanf("%d",&m);pa=CreatePolyn(pa,m); //建立多项式aprintf("请输入b的项数:");scanf("%d",&n);pb=CreatePolyn(pb,n); //建立多项式b//输出菜单printf("********************操作提示**************************\n");printf("\t 1.输出多项式a和b\n");printf("\t 2.建立多项式a+b\n");printf("\t 3.建立多项式a-b\n");printf("\t 4.建立多项式a*b\n");printf("\t 5.退出\n*******************************************\n"); for(;;flag=0){printf("执行操作");scanf("%d",&flag);if(flag==1){printf("多项式a:");PrintPolyn(pa);printf("多项式b:");PrintPolyn(pb);continue;}if(flag==2){pc=AddPolyn(pa,pb);printf("多项式a+b:");PrintPolyn(pc);DestroyPolyn(pc);continue;}if(flag==3){pd=SubtractPolyn(pa,pb);printf("多项式a-b:");PrintPolyn(pd);DestroyPolyn(pd);continue;}if(flag==4){pf=MultiplyPolyn(pa,pb);printf("多项式a*b:");PrintPolyn(pf);DestroyPolyn(pf);continue;}if(flag==5) break;if(flag<1||flag>8) printf("Error\n");continue;}//forDestroyPolyn(pa);DestroyPolyn(pb);return 0; }。