数据结构实验抽象数据类型——复数运算报告
- 格式:doc
- 大小:222.00 KB
- 文档页数:7
实验一复数四则运算一、实验目的本次实验的主要目的在于帮助读者熟悉抽象数据类型的表示和实现方法。
抽象数据类型需借助固有数据类型来表示和实现,即利用高级程序设计语言中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作,具体实现细节则依赖于所用语言的功能.通过本次实习还可以帮助读者复习高级语言的使用方法.二、实验内容设计一个可进行复数运算的演示程序。
要求实现下列六种基本运算:1)由输入的实部和虚部生成一个复数;2)两个复数求和;3)两个复数求差;4)两个复数求积,5)从已知复数中分离出实部;6)从已知复数中分离出虚部。
运算结果以相应的复数或实数的表示形式显示。
三、实验仪器、设备及材料586以上微机四、实验原理复数在计算机中的表示及复数的四则运算规则.五、实验步骤1。
问题分析和任务定义;2。
数据类型和系统设计;3. 编码实现和静态检查;4。
上机准备和上机调试;5.总结和整理实验报告。
六、实验报告要求实验报告开头就给出题目、班级、姓名、学号和完成日期,并包括以下七个内容:1. 需求分析;2.概要设计;3.详细设计;4. 调试分析;5。
经验和体会等;6。
测试结果;7.附录。
七、实验注意事项实验前先预习,完成问题分析和任务定义的工作。
实验二集合的并、交和差运算一、实验目的本次实验的主要目的在于帮助学生熟练掌握线性表的基本操作在两种存储结构上的实现,其中以各种链表的操作和应用作为重点内容.二、实验内容编制一个能演示执行集合的并、交和差运算的程序。
三、实验仪器、设备及材料586以上微机四、实验原理利用链表的基本运算(插入、删除、查找及合并等)实现集合的基本运算。
五、实验步骤1。
问题分析和任务定义;2.数据类型和系统设计;3。
编码实现和静态检查;4。
上机准备和上机调试;5。
总结和整理实验报告。
六、实验报告要求实验报告开头就给出题目、班级、姓名、学号和完成日期,并包括以下七个内容:1.需求分析;2。
概要设计;3.详细设计;4.调试分析;5. 经验和体会等;6.测试结果;7. 附录。
C++实现复数加减乘除实验报告实验 C++实现复数的加减乘除试用C语言的结构类型定义表示复数Complex的抽象数据类型。
(1)在复数内部用浮点数定义其实部与虚部;(2)设计实现复数的+、-、×、÷等运算的函数。
基本操作函数接口:InitComplex( &Z, v1, v2 ):操作结果:构造复数Z,其实部和虚部分别被赋以参数v1和v2的值。
GetReal( Z, &realPart ):初始条件:复数已存在。
操作结果:用realPart返回复数Z的实部值。
GetImag( Z, &ImagPart ):初始条件:复数已存在。
操作结果:用ImagPart返回复数Z的虚部值。
Add( z1,z2, ∑ ):初始条件:z1,z2是复数。
操作结果:用sum返回两个复数z1,z2的和值。
Sub( z1,z2, &residue):初始条件:z1,z2是复数。
操作结果:用res返回两个复数z1,z2的差值。
mul( z1,z2, &product ):初始条件:z1,z2是复数。
操作结果:用product返回两个复数z1,z2的积。
div( z1,z2, "ient,&residue):初始条件:z1,z2是复数。
操作结果:用quotient 返回两个复数z1除z2的商,用residue 返回它们的余数。
要求main函数中只能是基本的输入输出语句和函数调用语句,其运行界面如下:please input first complex number : a + bithe other one : c+ diplease choice operation: +, -, * or /:+(a + bi)+ (c+ di)=……其中a,b,c,d是用户从键盘上输入的实型值,分别代表两个复数的实部和虚部。
实验代码:#include //定义一个复数类typedef struct {float realpart;float imagpart;}Complex;Complex InitComplex(float v1,float v2) //初始化{ Complex z;z.realpart=v1;z.imagpart=v2;return z;}float Getreal(Complex z){return z.realpart;}float Getimagepart(Complex z){return z.imagpart;}Complex Add(Complex z1,Complex z2) //实现加法运算{z1.realpart=z1.realpart+z2.realpart;z1.imagpart=z1.imagpart+z2.imagpart;return z1;}Complex Sub(Complex z1,Complex z2) //实现减法运算{z1.realpart=z1.realpart-z2.realpart;z1.imagpart=z1.imagpart-z2.imagpart;return z1;}Complex Mul(Complex z1,Complex z2) //实现乘法运算{z1.realpart=z1.realpart*z2.realpart;z1.imagpart=z1.imagpart*z2.imagpart;return z1;}Complex Div(Complex z1,Complex z2) // 实现除法运算{z1.realpart=z1.realpart/z2.realpart;z1.imagpart=z1.imagpart/z2.imagpart;return z1;}int main (){ float a,b,c,d;char e;Complex z1,z2,z3;printf("please input first complex number a+bi:"); //只需输入实部a,虚部b scanf("%f %f",&a,&b);z1= InitComplex(a,b);printf("please input the other :");scanf("%f %f",&c,&d);z2=InitComplex(c,d);printf("please choice operation :+,-,*,/ :"); //选择运算符getchar();scanf("%c",&e);if (e=='+') //选择运算符z3= Add( z1,z2);if(e=='-')z3=Sub(z1,z2);if(e=='*')z3=Mul(z1,z2);if(e=='/')z3=Div(z1, z2);printf("%f+%fi",z3.realpart,z3.imagpart); return 0;}运行结果:。
数据结构第一章复数实验总结数据结构是计算机科学中非常重要的一门课程,它研究的是数据的组织、存储和管理方法,以及不同数据之间的关系和操作。
在数据结构的第一章中,我们学习了复数的基本概念和运算,本文将对这一章的内容进行总结和归纳。
我们需要明确什么是复数。
复数是由实数和虚数部分组成的数,通常表示为a+bi的形式,其中a是实部,b是虚部,i是虚数单位。
在数据结构中,复数通常被用来表示坐标系中的点或者向量,可以进行加、减、乘、除等运算。
在第一章的学习中,我们了解到复数有很多重要的性质和运算规则。
首先,复数的共轭是指将复数的虚部取相反数,实部保持不变。
共轭的概念在复数的运算中非常重要,可以用来简化复数的乘法和除法运算。
其次,复数的模是指复数与原点的距离,可以用勾股定理计算。
模的平方可以表示复数的乘法运算结果的绝对值。
在进行复数的运算时,我们需要注意一些规则和性质。
首先,复数的加法和减法是按照实部和虚部分别进行计算的,即实部相加减,虚部相加减。
其次,复数的乘法是按照分配律和共轭的性质进行计算的,即实部相乘减虚部相乘。
最后,复数的除法是通过将除数和被除数同时乘以除数的共轭,然后按照乘法的规则进行计算得到的。
除了基本的运算规则之外,我们还学习了一些重要的性质和定理。
例如,复数的乘法满足交换律和结合律。
同时,我们还学习了欧拉公式和德莫佛公式,它们可以将复数表示为指数形式,方便进行后续的运算。
此外,我们还学习了复数的幂运算和根运算,它们可以通过欧拉公式和德莫佛公式进行简化和求解。
在实际应用中,复数常常用于描述和计算电路中的交流信号、傅里叶变换以及图像处理等领域。
通过使用复数,我们可以更方便地进行计算和分析,简化了问题的求解过程。
例如,在信号处理中,我们可以通过复数来表示频率和相位,进行滤波和频谱分析。
在图像处理中,我们可以利用复数进行傅里叶变换和反变换,实现图像的压缩和增强等操作。
数据结构第一章的复数实验使我们了解了复数的基本概念、运算规则和性质。
第1篇一、实验目的1. 理解复数的概念及其在数学和物理中的应用。
2. 掌握复数的四则运算规则,包括加法、减法、乘法和除法。
3. 熟悉复数在计算机编程中的应用,如复数类的实现。
4. 通过实验加深对复数运算原理的理解。
二、实验原理复数是数学中的一个重要概念,它由实部和虚部组成,形式为 a + bi,其中 a 和b 是实数,i 是虚数单位,满足i² = -1。
复数在数学、物理、工程等领域有广泛的应用,如电路分析、信号处理等。
复数的四则运算规则如下:1. 加法:两个复数相加,将它们的实部和虚部分别相加,即 (a + bi) + (c + di) = (a + c) + (b + d)i。
2. 减法:两个复数相减,将它们的实部和虚部分别相减,即 (a + bi) - (c + di) = (a - c) + (b - d)i。
3. 乘法:两个复数相乘,使用分配律和虚数单位 i 的性质,即 (a + bi)(c + di) = ac + adi + bci + bdi² = (ac - bd) + (ad + bc)i。
4. 除法:两个复数相除,先将除数乘以共轭复数,然后实部和虚部分别相除,即(a + bi) / (c + di) = [(a + bi)(c - di)] / [(c + di)(c - di)] = [(ac + bd) + (bc - ad)i] / (c² + d²)。
三、实验内容1. 复数的加法:编写程序实现两个复数的加法运算。
2. 复数的减法:编写程序实现两个复数的减法运算。
3. 复数的乘法:编写程序实现两个复数的乘法运算。
4. 复数的除法:编写程序实现两个复数的除法运算。
5. 复数类的实现:使用面向对象编程方法,实现一个复数类,包含加法、减法、乘法和除法方法。
四、实验步骤1. 加法运算:- 输入两个复数的实部和虚部。
- 计算它们的和,输出结果。
复数adt及其实现实验报告ADT(Abstract Data Type)即抽象数据类型,是一种描述数据对象和操作对象的数学模型。
它定义了数据对象的抽象特性和对其的操作,而不考虑其在计算机内部的表示和实现细节。
ADT的设计和实现对于编程的重要性不言而喻,因此本文将以复数ADT为例,详细介绍ADT的实现过程。
一、复数ADT的定义复数ADT可以定义为包含实部和虚部的数学对象。
我们可以对复数进行加减乘除等操作,并可以获取其实部和虚部的值。
二、复数ADT的操作1. 创建复数:创建一个复数对象,并初始化其实部和虚部的值。
2. 获取实部和虚部:返回复数对象的实部和虚部的值。
3. 设置实部和虚部:设置复数对象的实部和虚部的值。
4. 复数相加:将两个复数相加,并返回相加后的复数。
5. 复数相减:将两个复数相减,并返回相减后的复数。
6. 复数相乘:将两个复数相乘,并返回相乘后的复数。
7. 复数相除:将两个复数相除,并返回相除后的复数。
三、复数ADT的实现我们可以使用面向对象的思想来实现复数ADT。
首先,我们定义一个复数类(Complex),其中包含私有变量real和imag,分别表示复数的实部和虚部。
pythonclass Complex:def __init__(self, real, imag):self.real = realself.imag = imagdef get_real(self):return self.realdef get_imag(self):return self.imagdef set_real(self, real):self.real = realdef set_imag(self, imag):self.imag = imagdef add(self, other):real = self.real + other.realimag = self.imag + other.imagreturn Complex(real, imag)def subtract(self, other):real = self.real - other.realimag = self.imag - other.imagreturn Complex(real, imag)def multiply(self, other):real = self.real * other.real - self.imag * other.imagimag = self.real * other.imag + self.imag * other.realreturn Complex(real, imag)def divide(self, other):denominator = other.real 2 + other.imag 2real = (self.real * other.real + self.imag * other.imag) / denominatorimag = (self.imag * other.real - self.real * other.imag) / denominatorreturn Complex(real, imag)四、复数ADT的使用示例python创建两个复数对象c1 = Complex(1, 2)c2 = Complex(3, 4)获取实部和虚部的值print(c1.get_real) 输出:1 print(c1.get_imag) 输出:2 设置实部和虚部的值c1.set_real(5)c1.set_imag(6)print(c1.get_real) 输出:5 print(c1.get_imag) 输出:6 复数相加c3 = c1.add(c2)print(c3.get_real) 输出:8 print(c3.get_imag) 输出:10 复数相减c4 = c1.subtract(c2)print(c4.get_real) 输出:-2 print(c4.get_imag) 输出:-2 复数相乘c5 = c1.multiply(c2)print(c5.get_real) 输出:-5 print(c5.get_imag) 输出:28 复数相除c6 = c1.divide(c2)print(c6.get_real) 输出:0.44print(c6.get_imag) 输出:0.08通过上述示例,我们可以看到复数ADT的实现过程。
【实验题目】实验1. 抽象数据类型. 【问题描述】用C 或C++语言设计并实现一个可进行复数运算的演示程序。
【基本要求】1.由输入的实部和虚部生成一个复数2.两个复数求和3.两个复数求差4.从已知复数中分离出实部和虚部5.复数及相应运算结果以相应的表现形式显示。
【实现提示】定义复数为由两个相互之间存在次序关系的实数构成的抽象数据类型,则可以利用实数的操作来实现复数的操作。
(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四) 一、【实验构思(Conceive )】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)1. 首先构造结构体数组接受储存数据2. 构造函数进行模块运算3. 应用到了算法中的抽象数据类型ADT (即数据+操作),数据部分包括实部和虚部;操作部分包括加分Plus 、减法Minus 、乘法Multiply 、除法Divide 4. 运用到了复数的基本知识及四则运算法则:设 z 1=a + bi ,z 2=c + di ,(a ,b ,c ,d ∈R ,)加减法:(a + bi )±(c + di )=(a ± c )+(b ± d )i 乘法:(a + bi )*(c + di )=(ac - bd )+(ad + bc )i除法: 2222()()()()a bi a bi c di ac bd bc ad ic di cd c d++-+-==+++ 二、【实验设计(Design)】(15%) (本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系) 解答:抽象数据类型 数据部分:用结构体(数组)实现复数的储存结构 操作部分:实现复数的输入、存储、运算及输出 程序模块伪码说明: #define N 2int n=0; //控制选择语句,及检验输入是否正确 typedef struct{double real;//复数的实部double imag;//复数的虚部}paramater; //paramater是结构体变量的类型表示“复数”,声明复数的存储结构paramater cpxNum[N];//构造结构体数组储存数据paramater result;//构造result结构体储存结果int main(){//实现第一个复数的输入储存cout<<"\t请输入第一个复数的实部和虚部:";cin>>real>>imag;outs(c[0].real,c[0].imag)//初始化复数c[0]并实现输出//实现第二个复数的输入储存cout<<"\t请输入第二个复数的实部和虚部:";cin>>real>>imag;puts( c[0].real,c[0].imag);//初始化复数c[1]并实现输出//复数运算cout << "c1 + c2的结果是: "; puts(plus(c[0],c[1])); cout << endl; //调用plus函数运算加法,再用puts函数输出结果复数cout << "c1 - c2的结果是: "; puts(milus(c[0],c[1])); cout << endl; //调用mlius函数运算减法,再用puts函数输出结果复数cout << "c1 * c2的结果是: "; puts(multiply(c[0],c[1])); cout << endl; //调用multiply函数运算乘法,再用puts函数输出结果复数cout << "c1 / c2的结果是: "; puts(divide(c[0],c[1])); cout << endl; //调用divide函数运算除法,再用puts函数输出结果复数return 0;}三、【实现描述(Implement)】(25%)(本部分应包括:抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。
实验名称:复数的运算实验目的:1. 理解复数的概念及其几何意义。
2. 掌握复数的加减、乘除运算方法。
3. 熟悉复数的模和辐角的概念及计算方法。
实验器材:1. 计算器2. 复数坐标纸3. 铅笔实验原理:复数是数学中的一个重要概念,它可以表示平面上的点。
一个复数通常用a+bi表示,其中a是实部,b是虚部,i是虚数单位,满足i²=-1。
复数在几何上对应于平面直角坐标系中的一个点,其实部对应横坐标,虚部对应纵坐标。
实验步骤:1. 观察复数坐标纸,了解复数在坐标系中的表示方法。
2. 用计算器验证以下复数运算:(1)加减运算:计算复数(3+4i)和(2-5i)的和与差。
(2)乘除运算:计算复数(3+4i)和(2-5i)的乘积和商。
3. 用复数坐标纸表示计算结果,观察几何意义。
4. 计算复数(3+4i)的模和辐角。
5. 分析复数模和辐角的计算方法。
实验结果:1. 复数加减运算:和:3+4i + 2-5i = 5-1i差:3+4i - 2+5i = 1+9i2. 复数乘除运算:乘积:(3+4i)×(2-5i)= -7-2i商:(3+4i)÷(2-5i)= 0.8+1.6i3. 复数坐标纸表示:和:5-1i 对应点(5,-1)差:1+9i 对应点(1,9)乘积:-7-2i 对应点(-7,-2)商:0.8+1.6i 对应点(0.8,1.6)4. 复数(3+4i)的模和辐角:模:|3+4i| = √(3²+4²) = 5辐角:θ = arctan(4/3) ≈ 0.927弧度实验分析:1. 复数的加减运算遵循实部和虚部分别相加或相减的规则。
2. 复数的乘除运算可以转化为实部和虚部的乘除运算,同时注意虚数单位i的运算。
3. 复数的模表示复数在复平面上的长度,辐角表示复数与实轴的夹角。
4. 通过实验,我们可以直观地了解复数在复平面上的几何意义,以及复数运算的规律。
实验结论:通过本次实验,我们掌握了复数的概念、几何意义以及加减、乘除运算方法。
韶关学院学生实验报告册实验课程名称:数据结构与算法实验项目名称:实验一抽象数据类型复数四则运算实验类型(打√):(基础、综合、设计√)院系:信息工程学院计算机系专业:*****姓名:*** 学号:*****指导老师:陈正铭韶关学院教务处编制一、实验预习报告内容二、实验原始(数据)记录实验时间:2007 年 3 月21 日(星期三第7,8 节)实验同组人:三、实验报告内容2007年 3 月21 日注:1、如有个别实验的实验报告内容多,实验报告册页面不够写,或有识图,画图要求的,学生应根据实验指导老师要求另附相同规格的纸张并粘贴在相应的“实验报告册”中。
2、实验报告册属教学运行材料,院系(中心)应按有关规定归档保管。
【源程序】#include<stdio.h>#include<stdlib.h>typedef struct Complex{float real;float image;}Complex;Complex InitComplex(float a,float b) /*给复数的实部和虚部复制,并返回复数。
*/ {Complex c;c.real=a;c.image=b;return c;}Complex Add(Complex c1,Complex c2){/*两个复数相加。
公式:(a+bi)+(c+di)=(a+b)+(c+d)i。
*/Complex sum;sum.real=c1.real+c2.real ;sum.image=c1.image+c2.image ;return sum;}Complex Sub(Complex c1,Complex c2){/*两个复数相减。
公式:(a+bi)-(c+di)=(a-b)+(c-d)i。
*/Complex dif;dif.real=c1.real-c2.real ;dif.image=c1.image-c2.image ;return dif;}Complex Mul(Complex c1,Complex c2){/*两个复数相乘。
复数的运算实验报告一、实验要求:设计题:设计一个可进行复数运算的演示程序。
基本要求:实现以下四种基本运算:1)由输入的实部和虚部生成一个复数。
2)两个复数求和3)两个复数求差4)两个复数求积运算结果以相应的复数或实数的表示形式显示二、实验思路:1、设计一个复数数据类型;2、设计函数复数初始化函数initcpx(complex &y,float m,float n), 复数输出函数cpxprint(complex a), 复数求和函数sumcpx(complex&b,complex b1,complex b2 ), 复数求差函数subcpx(complex &c,complexc1,complex c2),复数乘积函数mltcpx(complex &d,complex d1,complexd2)三、源代码:#include<stdio.h>typedef struct complex{float realprt;float imgprt;}complex;void initcpx(complex &y,float m,float n){y.realprt=m;y.imgprt=n;}void cpxprint(complex a){if (a.realprt==0.0)printf("复数是:%5.2fi",a.imgprt);elseprintf("复数是:%5.2f+%5.2fi",a.realprt,a.imgprt);}void sumcpx(complex &b,complex b1,complex b2 ){b.realprt=b1.realprt+b2.realprt;b.imgprt=b1.imgprt+b2.imgprt;printf("复数的和为:%5.2f+%5.2fi",b.realprt,b.imgprt); }void subcpx(complex &c,complex c1,complex c2) {c.realprt=c1.realprt-c2.realprt;c.imgprt=c1.imgprt-c2.imgprt;printf("复数的差是:%5.2f+%5.2fi",c.realprt,c.imgprt); }void mltcpx(complex &d,complex d1,complex d2) {d.realprt=d1.realprt*d2.realprt-d1.imgprt*d2.imgprt;d.imgprt=d1.realprt*d2.imgprt+d1.imgprt*d2.realprt; printf("复数的积是:%5.2f+%5.2fi",d.realprt,d.imgprt); }void main(){float a,b,c,d;complex x1,x2,sum,sub,mlt;printf("输入第一个复数的实部:\n");scanf("%f",&a);printf("输入复数的虚部:\n");scanf("%f",&b);initcpx(x1,a,b);printf("第一个复数是:\n");cpxprint(x1);printf("\n");printf("\n");printf("输入第二个复数的实部:\n");scanf("%f",&c);printf("输入复数的虚部:\n");scanf("%f",&d);initcpx(x2,c,d);printf("第二个复数是:\n");cpxprint(x2);printf("\n");printf("\n");sumcpx(sum,x1,x2);printf("\n"); subcpx(sub,x1,x2); printf("\n"); mltcpx(mlt,x1,x2); printf("\n");printf("\n");}四、实验结果:。
实验报告一、实验题目[问题描述]设计一个可进行复数运算的演示程序。
[基本要求]实现下列六种基本运算:1)由输入的实部和虚部生成一个复数2)两个复数求和3)两个复数求差4)两个复数求积5)从已知复数中分离出实部6)从已知复数中分离出虚部运算结果以相应的复数或实数的表示形式显示。
二、概要设计1.定义复数类型:ADT Complex{数据对象:D={c i|c i=(real,image),real∈实数,image∈实数,i=1,2,3,…} 数据关心:R1={}基本操作:C_Sum(&C,C1,C2)初始条件:复数C1,C2存在。
操作结果:做和运算C1+C2,结果放在C中。
C_Difference(&C,C1,C2)初始条件:复数C1,C2存在。
操作结果:做减运算C1-C2,结果放在C中。
C_Product(&C,C1,C2)初始条件:复数C1,C2存在。
操作结果:做乘运算C1*C2,结果放在C中。
C_Print(C)初始条件:复数C存在。
操作结果:将复数C以“实部+虚部i”的形式显示输出。
}ADT Complex2.程序包含四个模块○1主程序模块main(){初始化;选择命令;while(“命令”!=“退出”){处理命令;}}○2两复数求和模块○3两复数求差模块○4两复数求积模块○5打印复数模块3.程序流程图三、详细设计1.复数数据类型typedef struct{float real;float image;}complex,*complex_ptr;void C_Difference(complex_ptr C,complex C1,complex C2) //将复数C1,C2相减,结果放入复数指针C所指向的复数单元中去。
void C_Product(complex_ptr C,complex C1,complex C2)//将复数C1,C2相乘,结果放入复数指针C所指向的复数单元中去。
【实验题目】实验1. 抽象数据类型. 【问题描述】用C 或C++语言设计并实现一个可进行复数运算的演示程序。
【基本要求】1.由输入的实部和虚部生成一个复数2.两个复数求和3.两个复数求差4.从已知复数中分离出实部和虚部5.复数及相应运算结果以相应的表现形式显示。
【实现提示】定义复数为由两个相互之间存在次序关系的实数构成的抽象数据类型,则可以利用实数的操作来实现复数的操作。
(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四) 一、【实验构思(Conceive )】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)1. 首先构造结构体数组接受储存数据2. 构造函数进行模块运算3. 应用到了算法中的抽象数据类型ADT (即数据+操作),数据部分包括实部和虚部;操作部分包括加分Plus 、减法Minus 、乘法Multiply 、除法Divide 4. 运用到了复数的基本知识及四则运算法则:设 z 1=a + bi ,z 2=c + di ,(a ,b ,c ,d ∈R ,)加减法:(a + bi )±(c + di )=(a ± c )+(b ± d )i 乘法:(a + bi )*(c + di )=(ac - bd )+(ad + bc )i除法: 2222()()()()a bi a bi c di ac bd bc ad ic di cd c d++-+-==+++ 二、【实验设计(Design)】(15%) (本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系) 解答:抽象数据类型 数据部分:用结构体(数组)实现复数的储存结构 操作部分:实现复数的输入、存储、运算及输出 程序模块伪码说明: #define N 2int n=0; //控制选择语句,及检验输入是否正确 typedef struct{double real;//复数的实部double imag;//复数的虚部}paramater; //paramater是结构体变量的类型表示“复数”,声明复数的存储结构paramater cpxNum[N];//构造结构体数组储存数据paramater result;//构造result结构体储存结果int main(){//实现第一个复数的输入储存cout<<"\t请输入第一个复数的实部和虚部:";cin>>real>>imag;outs(c[0].real,c[0].imag)//初始化复数c[0]并实现输出//实现第二个复数的输入储存cout<<"\t请输入第二个复数的实部和虚部:";cin>>real>>imag;puts( c[0].real,c[0].imag);//初始化复数c[1]并实现输出//复数运算cout << "c1 + c2的结果是: "; puts(plus(c[0],c[1])); cout << endl; //调用plus函数运算加法,再用puts函数输出结果复数cout << "c1 - c2的结果是: "; puts(milus(c[0],c[1])); cout << endl; //调用mlius函数运算减法,再用puts函数输出结果复数cout << "c1 * c2的结果是: "; puts(multiply(c[0],c[1])); cout << endl; //调用multiply函数运算乘法,再用puts函数输出结果复数cout << "c1 / c2的结果是: "; puts(divide(c[0],c[1])); cout << endl; //调用divide函数运算除法,再用puts函数输出结果复数return 0;}三、【实现描述(Implement)】(25%)(本部分应包括:抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。
)解答:抽象数据类型:数据部分,复数的储存结构typedef struct{double real;//复数的实部double imag;//复数的虚部}paramater; //paramater是结构体变量的类型表示“复数”操作部分:●主程序:定义声明、初始化基本变量,实现复数的输入与存储,调用puts函数输出复数,通过if条件语句选择运算及选择验证,运用循环语句重新输入选择,得到正确选择后调用plus、milus、multiply、divide函数分别进行四则运算●调用函数程序及调用关系:void puts(double,double); //实现复数的输出void plus(paramater,paramater);//实现复数的加法运算,结果调用puts函数输出void milus(paramater,paramater);//实现复数的减法运算,结果调用puts函数输出void multiply(paramater,paramater);//实现复数的乘法运算结果调用puts函数输出void divide(paramater,paramater);//实现复数的除法运算,结果调用puts函数输出关键的程序流程图:四、【测试结果(Testing)】(20%)注释:实现第一个复数的输入实部为2,虚部为3实现第一个复数的输出2+3i实现第二个复数的输入实部为42,虚部为2、实现第二个复数的输出42+2i,输出含有字符长度控制运算的选择选择出错提示重新选择,选择2表示选择减法运算输出计算结果四、【实验总结】(10%)(本部分应包括:自己在实验中完成的任务,注意组内的任意一位同学都必须独立完成至少一项接口的实现;对所完成实验的经验总结、心得)1.程序的实现首先要明确程序设计的目的和算法,明确所应用到的离散数学、工程数学知识等。
2.在这部分实验中应用到了复数四则运算的基本知识,和抽象数据类型的概念,而抽象数据类型中的数据部分包括复数的储存结构,操作部分应当包括四种复数运算。
3.在程序设计过程中首先明确程序的基本模块,可以用伪码先表示出,然后再根据需要添加步骤逐步完善程序:如对输入的校验,运用循环结构提示重新输入;运用条件句型选择运算;对输入输出字符长度的限定等。
4.程序设计应当保持明确的思路,尽可能在完善简化程序的过程中优化程序,如:应用函数调用简化主程序,使得程序思路更加明确清晰。
在函数调用过程中应当注意函数调用的基本格式,明确函数间调用关系,如:主程序通过调用plus、milus、multiply、divide函数分别进行四则运算,而这几个程序又通过调用puts函数实现复数运算结果的输出等。
5.可以应用流程图帮助理解设计程序,通过对算法时间度分析得到最优化的程序设计,多次重复运行程序并改变输入以校验程序的可行性。
五、【项目运作描述(Operate)】(10%)(本部分应包括:项目的成本效益分析,应用效果等的分析。
)1.这次实验的目的是用C或C++语言设计并实现一个可进行复数运算的演示程序。
2.我所设计的程序已满足基本要求,可以实现复数的输入输出、两个复数基本四则运算及运算结果的输出,并且运用了循环和条件语句实现运算的选择及校验。
3.这个程序只能针对两个复数的四则运算,并且只能进行一次运算,时间复杂度为线性阶,因此对于两个复数的基本运算效益较高,但如果要实现多个复数的运算只能多次进行程序的运行,效益较低。
4.本程序只是通过演示程序实现输入输出,没有类似于计算器的基本界面,但是通过对输入输出的字符控制,基本实现的演示程序的美观性及可读性。
六、【代码】(10%)#include<stdio.h>#include<stdlib.h>#include"math.h"#define N 2typedef struct{double real;double imag;}paramater; //paramater是结构体变量的类型paramater cpxNum[N];paramater result;void puts(double,double);int n=0; //控制选择语句,及检验输入是否正确void plus(paramater,paramater);void milus(paramater,paramater);/*实现两个复数c1, c2的减法, 差作为函数cmilus的返回值*/void multiply(paramater,paramater); /*实现两个复数c1, c2的乘法, 积作为函数cmultiply的返回值*/void divide(paramater,paramater); /*实现两个复数c1, c2的乘法, 商作为函数cdivide的返回值*/int main(){printf("\t请输入第一个复数的实部:");scanf("%lf",&cpxNum[0].real);printf("\n\t请输入第一个复数的虚部:");scanf("%lf",&cpxNum[0].imag);puts(cpxNum[0].real, cpxNum[0].imag);printf("\t请输入第二个复数的实部:");scanf("%lf",&cpxNum[1].real);printf("\n\t请输入第二个复数的虚部:");scanf("%lf",&cpxNum[1].imag);puts( cpxNum[1].real, cpxNum[1].imag);printf("\t\t请选择运算:\n");printf("\t1、加法;2、减法;3、乘法;4、除法\n");printf("\t\t请输入您的选择:");do{scanf("%d",&n);if(n!=1 && n!=2 && n!=3 && n!=4)printf("\t\t您输入有误!请重新输入:");}while( n!=1 && n!=2 && n!=3 && n!=4);if (n==1)plus(cpxNum[0],cpxNum[1]);else if (n==2)milus(cpxNum[0],cpxNum[1]);else if (n==3)multiply(cpxNum[0],cpxNum[1]);else if (n==4)divide(cpxNum[0],cpxNum[1]);elseprintf("\t\t选择出错\n");printf("\t\t运算结束");return 0;}void puts( double r, double i){if(n==0)printf("\n\t您输入的复数是:%lf + %lf i\n\n",r,i);elseprintf("\n\t计算得到的复数是:%lf + %lf i\n\n",r,i);}void plus(paramater c1,paramater c2){result.real=c1.real+c2.real;result.imag=c1.imag+c2.imag;puts(result.real,result.imag);}void milus(paramater c1,paramater c2)/*实现两个复数c1, c2的减法, 差作为函数cmilus的返回值*/{result.real=c1.real-c2.real;result.imag=c1.imag-c2.imag;puts(result.real,result.imag);}void multiply(paramater c1,paramater c2) /*实现两个复数c1, c2的乘法, 积作为函数cmultiply的返回值*/ //(ac - bd)+(ad + bc)i{result.real=(c1.real*c2.real)-(c1.imag*c2.imag);result.imag=(c1.real*c2.imag)+(c1.imag*c2.real);puts(result.real,result.imag);}void divide(paramater c1,paramater c2) /*实现两个复数c1, c2的乘法, 商作为函数cdivide的返回值*/{double a;a = pow(c1.real,2.0)+pow(c2.imag,2.0);if(a!=0.0){result.real=(c1.real*c2.real+c1.imag*c2.imag)/a;result.imag=(c1.imag*c2.real-c1.real*c2.imag)/a;puts(result.real,result.imag);}elseprintf("\n\n\t复数不能做除数,输入错误,程序结束!\n\n"); }。