数值分析课程设计.doc_第1页
数值分析课程设计.doc_第2页
数值分析课程设计.doc_第3页
数值分析课程设计.doc_第4页
数值分析课程设计.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

郑州轻工业学院课 程 设 计 任 务 书31一、基本要求及主要内容1.1项目一:数值问题的数据结构分析与实现数值问题的雅可比迭代:设方程组的系数矩阵对角线元素,为最大迭代次数,为容许误差。雅可比(Jacobi)迭代法解方程组算法步骤如下: 1. 取初始向量,令. 2. 对,计算 . 3. 如果,则输出,结束;否则执行4. 4. 如果,则不收敛,终止程序;否则,转2.1.2项目二:实际问题的数据结构分析与实现。个人通讯录的制作:要求每条信息至包含姓名(name )城市(city)电话(tel)QQ号(qq),完成如下功能:(1) 输入信息 enter(); (2) 显示信息display( ); (3) 查找以姓名作为关键字 search( ); (4) 删除信息delete( ); (5) 存盘(将数据保存在文件中,此功能选做)save ( ).二、主要参考文献1 施吉林, 刘淑珍等. 计算机数值方法(第三版)M. 北京: 高等教育出版社, 2009.2 李根强,谢月娥等. 数据结构(C+版)M. 北京: 中国水利水电出版社, 2005.3 刘斌,王忠. 面向对象程序设计Visual C+M. 北京: 清华大学出版社, 2003.4 李根强等. 数据结构(C+描述)习题解答及实验M. 北京: 中国水利水电出版社, 2002.5 唐宁九, 游洪跃等. 数据结构与算法(C+版)M. 北京: 清华大学出版社, 2009.6 郭学军. 非线性方程组牛顿的离散化及固定点形式的转化J. 安阳工学院报 2009(04). 7 热比亚努尔, 穆塔里夫阿赫迈德. 基于Excel的连续梁内力有限元数值迭代计算. 机械与电子, Machinery & Electronics, 编辑部邮箱 2007, 02.8 杜豫川, 孙立军, 黄仕进等. 基于有限元方法的连续型交通分配模型解法. 同济大学学报(自然科学版), Journal of Tongji University, 编辑部邮箱 2005,01.9 翁蓝天, 王禹民等.链表拓扑环境下基于配网结构特点的多源有环短路计算. 电工技术学报, Transactions of China Electrotechnical Society, 编辑部邮箱 2010, 10.10 刘丽赏, 刘洪娜等. 用于生物检测的链霉亲和素修饰-Fe_2O_3Au复合颗粒的制备与表征. 化学学报, Acta Chimica Sinica, 编辑部邮箱 2010年 20期. 11 杨善红. 小议结构体变量的字节对齐. 民营科技, 编辑部邮箱 2010年 09期. 12 颜伟, 黄正波等. 潮流计算中的二层链表与有序节点关联信息生成法. 电网技术, Power System Technology, 编辑部邮箱 2010年 11期13 马燕, 王朝阳等. 阿片肽链中L-苯丙氨酸的保护全合成及表征. 精细与专用化学品, Fine and Specialty Chemicals, 编辑部邮箱 2010年 01期.14 钟治初. 在C语言中集合类型数据的定义及集合运算的实现. 嘉应大学学报.2000,18(6). 完成期限:2011.1.7指导教师签名:课程负责人签名:2011.1.7摘 要利用c+语言的数据结构来实现数值问题的雅可比迭代和实际问题中的通讯录的实现。其中数值问题的雅可比迭代的算法是通过给定迭代的初始向量,然后计算一次迭代的结果,比较迭代结果若符合一定的要求则输出本次迭代结果,并终止程序,否则的话继续进行迭代,控制迭代次数看是否在规定的次数内,若超出规定的迭代次数则终止程序;否则继续进行迭代。通讯录的实现是通过结构体的线性表的链式存储结构来实现的,在链表中的建立、插入、删除等操作来实现通讯录输入信息,、显示信息、查找信息、更新信息、删除信息、保存信息等操作。【关键词】雅可比迭代 结构体 线性表的链式存储 通讯录目录一、设计目的与内容71.1设计目的71.2设计内容:7二、算法的基本思想72.1项目1的基本算法思想:72.2项目2的基本算法思想:9三、测试数据133.1 程序1的测试数据:133.1.1二元一次方程组133.1.2三元一次方程组143.2程序2的测试数据:15四、源程序及系统文件使用说明174.1项目1的源程序:174.2项目2的源程序:19五、心得体会30六、参考文献30数据结构课程设计报告项目1题目数值问题的雅可比迭代项目2题目个人通讯录的制作班 级: 信息与计算科学081班 学 号: 200810010105 姓 名: 丁 烨 时 间: 2010.12.272011.1.7 一、设计目的与内容1.1设计目的1、熟悉雅可比迭代的算法并实现。2、熟练掌握结构体的线性表链式存储表示和基本操作的实现,能够利用结构体线性表链式存储的算法解决简单的应用问题。1.2设计内容:1、通过输入方程的系数,常数,和迭代的初始点,利用循环控制着最大迭代次数100,在迭代中通过控制前两次迭代的插值来决定迭代的结果是否达到要求来实现雅可比迭代。2、利用线性表的链式存储编写一个简单的通讯录结构体链式表。用户可以输入,显示,删除,查询或者保存到文件,从文件中读取一系列记录来实现通讯录。二、算法的基本思想2.1项目1的基本算法思想:用#define来声明能处理的最大的方程组数100,即#define N 100;在运行程序中根据提示输入必要的数据,在主函数中通过k小于100来控制着最大的迭代计算的次数。若k大于100,则终止程序的运行。否则,通过逐步计算每次迭代的结果并输入,通过控制前后两次迭代结果的最大差值z,若z小于10e-6则该次迭代的结果即为即为雅可比迭代所要求的结果。若z大于等有10e-6则说明该次迭代的结果未达到要求,以该次迭代的结果为基础再次开始迭代。输入方程的个数:ni=0;in输入第i+1个方程系数,i+是i=0;in是输入第i+1个方程的常数i=0;in是输入迭代初始点的第i+1个坐标k=0;k100结束程序否否否否是i=0;in是j=0;jn是j!=i时,计算sum=sum+aij*xj否计算yi=(bi-sum)/aii否通过for循环输出每次迭结果寻找z=maxfabs(yi-xi)z10e-6输出迭代次数和最终结果是否通过for循环xi=yi在主函数中通过提示逐步的输入数据:1) 提示输入方程的个数n:,输入方程的个数n;2) 通过for循环提示并输入第i+1个方程的系数,输入该方程的n个系数,最终的方程的系数的为nn的矩阵;3) 通过for循环输入方程的n个常数,输入方程的n个常数;4) 提示输入初始的迭代点的坐标,输入初始点的n维坐标;5) 通过k控制着最大的迭代次数,若k100则转6,否则终止程序;6) 通过for循环i控制计算,在for循环i下构造for循环jn时,转7;7) 计算yi=(bi-sum)/aii,完成该次迭代的计算结果;8) 通过for驯化输出该次迭代的结果;9) 计算前后两次计算的最大差值z=fabs(yi-xi),判断z小于10e-6则该次的该次的迭代结果为最终结果,输出迭代次数和最终结果。否则k+转5).2.2项目2的基本算法思想:通过构建结构体Address的链表来实现通讯录的建立。通过编写单个单个函数来实现对通讯录的操作。通过指针函数*CreatList来实现添加纪律,指针函数*ShowList来实现显示记录,指针函数*FindPerson来实现查询记录,指针函数*MoveAway来实现删除记录,指针函数*ReSet来实现更新记录,指针函数*KeepList来实现保存记录指针函数*ReadFile来实现读入记录。通过结构体和一系列指针函数可以实现一个完整的通讯录,以及对通讯录的操作。1.添加记录个人通讯录2.显示内容3.查询记录4.删除记录5.更新记录6.保存记录7.读入记录0.退出记录1选择更新name4.选择更新qq3.选择更新tel2.选择更新city5.选择更新email6.选择更新relation1、指针函数*CreatList(Address *head)用来实现添加记录;基本思路如下:(1)提示添加记录一直到输入人名为0时结束;(2)判断name若不为0怎继续输入。否则,返回头指针;(3)判断name若不为0时,判断head是否为空,若为空则提示列表不存在,新建链表,否则,将s赋值给p-next;(4)通过动态申请结构体的内存,输入name,判断name若不为0时,继续输入通讯录的各项。否则,跳出循环。转(3);(5)将链表的最后复制为NULL;(6)返回头指针head。2、指针函数*ShowList(Address *head)用来实现显示记录;利用连接表的输出来实现已经输入的通讯录的输出。基本思路如下:(1) 提示输入的内容;(2) 判断是否到通讯录的结尾,若到,则跳出该循环。否则转(3);(3) 输出该条记录的各项,并将指针指向下一位;/(4) 返回头指针;3、指针函数*FindPerson(Address *head)用来实现查找记录;基本思路如下:(1) 提示输入要查询的姓名,并输入姓名;(2) 判断是否已到通讯录的结尾,若是,则跳出循环。若否,怎转(3);(3) 判断该条记录的姓名这一项和输入的姓名这一项是否相同,若是,则输出该条记录,并跳出循环。否则,则转(3);(4) 将指针指向下一位记录,并转(3);(5) 判断这时的指针若为空,则输出没有你要找的记录;(6) 返回头指针,并终止程序。4、指针函数*MoveAway(Address *head)用来实现删除记录;基本思路如下:(1) 提示要删除记录的姓名并输入姓名;(2) 通过判断是否到记录的结尾,若是则跳出循环,否则转(3);(3) 判断该条记录是否为为要删除的,若是则输出该条记录,否则提示没有你要找的记录,并跳出循环;(4) 判断要删除的结点为头结点时;删除该类型的结点并转(6);(5) 要删除的结点不为头结点,通过for循环建立删除该类型结点的交换指针,并转(6);(6) 返回头指针并终止程序;5、指针函数*ReSet(Address *head)用来实现更新记录;基本思路如下:(1) 提示输入要更新记录的名字并输入;(2) 通过while循环找到要更新的记录;(3) 输出更新的菜单提示选择并选择;(4) 对作出的相应选择,通过swtich做出相应更新;(5) 输出更新成功,并输出该条记录,并跳出循环;(6) 返回头指针并终止程序;6、指针函数*KeepList(Address *head)用来实现保存记录;基本思路如下:(1) 建立输出文件流对象;(2) 提示要保存记录的文件名并输入;(3) 链接文件,并尝试打开;若不能打开,则提示文件不能打开并新建,否则转(4);(4) 提示开始保存并判断是否为指针的结尾,若未到指针的结尾则向文件流转中插入数据,并将记录指针指向下一位。转(4);(5) 关闭文件,提示已保存,返回头指针并终止程序。7、指针函数*ReadFile()用来实现读取记录;基本思路如下:(1) 建立文件输出流,并尝试打开文件;(2) 若不能打开则提示文件不能打开并建立;(3) 若能读入数据输出该条记录并尝试读取下一条记录,转(3);(4) 关闭文件并返回头指针;8、函数menu()建立菜单作出选择并操作,通过的嵌套调用来实现整个程序的运行;9、主函数main()调用函数menu来运行整个程序。三、测试数据3.1 程序1的测试数据:3.1.1二元一次方程组3.1.2三元一次方程组3.2程序2的测试数据:四、源程序及系统文件使用说明4.1项目1的源程序:#include #include #define N 100using namespace std;void main()int n;float bN,aNN;float xN,yN,sum,z;int i,j,k;coutn;cout请输入方程的系数:endl;for(int t=0;tn;t+)cout第t+1个方程的系数:;for(int s=0;sats;cout请输入方程的常数:;for(int p=0;pbp;cout请输入迭代的初始点;for(int q=0;qxq;for (k=0;k100;k+)/控制迭代的最大次数for(i=0;in;i+)/求第i次迭代的结果sum=0;for(j=0;jn;j+)if(j!=i)sum=sum+aij*xj;yi=(bi-sum)/aii;for(i=0;in;i+)/输出本次迭代的结果printf(x=%-10f,yi);coutt;coutendl;z=fabs(y0-x0);for(i=0;in;i+)if(zfabs(yi-xi)z=fabs(yi-xi);if(z10e-6) /迭代的结果符合要求cout迭代次数为:k+1endl;cout迭代结果为:n;for(i=0;in;i+)printf(x%d=%-10f,i+1,yi);coutendl; break;else /迭代的结果未达到要求for(i=0;in;i+)xi=yi;4.2项目2的源程序:#include#include#include#include#includestruct Addresschar name20;char city50;char tel20;char qq20;char email50;char relation10;Address *next;/添加记录Address *CreatList(Address *head) /引用参数是表头指针Address *s,*p;cout(添加记录一直到输入人名为0时结束。)endl;s=new Address;couts-name;if(strcmp(s-name,0)couts-city;couts-tel;couts-qq;couts-email;couts-relation;while(1)if(head=NULL) /判断列表是否已经存在。若不存在,则首先自动新建一个链表。cout列表不存在,新建一个链表。next=s;/head-next=p-next;p=s;s=new Address;couts-name;if(strcmp(s-name,0)couts-city;couts-tel;couts-qq;couts-email;couts-relation;else break;p-next=NULL;/delete s;/ 释放名字为0的结点coutendl;/return p;return head;/显示记录Address *ShowList(Address *&head)Address *p=head;cout显示当前所有记录:n;coutnametcitytteltqqtemailtrelationn;while(p!=NULL)coutnametcitytteltqqtemailtrelationnext;coutendl;return head;/查询记录Address *FindPerson(Address *head)Address *p=head;char in_name20;coutin_name;while(p!=NULL)if(strcmp(p-name,in_name)=0)/比较名字是否相等。coutnametcitytteltqqtemailtrelationnext; /head=head-next;if(p=NULL)cout没有你要找的名字!;coutendl;return head;/删除记录Address *MoveAway(Address *head)Address *start,*present=head;char in_name20;coutin_name;while(head)if(strcmp(head-name,in_name)=0) /比较名字是否相等。cout要删除的内容是: endl;coutnametcitytteltqqtemailtrelationnext!=NULL)head=head-next;elsecout没有你要找的名字!; break;coutendl;coutendl;start=present;present=head;head=start;if(!head)cout列表是空的。n; coutnext;delete start;start=NULL;cout已删除。next)/被删除节点不是头节点。找到被删除节点的前一节点。if(start-next=present)start-next=present-next;delete present;present=NULL;cout已删除。endl;return head;return head;/更新记录Address *ReSet(Address *head)Address *s=head;char in_name20;coutin_name;int i;while(head) /首先判断该记录是否存在。if(strcmp(head-name,in_name)=0) /比较名字是否相等。cout要更新的内容存在。endl;coutnametcitytteltqqtemailtrelationnext;if(head=NULL)cout没有你要找的名字!;coutname,in_name)=0) /比较名字是否相等。cout要更新的内容?endl;cout*endl;cout* 输入1.选择更新name; *endl;cout* 输入2.选择更新city; *endl;cout* 输入3.选择更新tel; *endl;cout* 输入4.选择更新qq; *endl;cout* 输入5.选择更新email; *endl;cout* 输入6.选择更新relation; *endl;cout*i;cout输入要更改的内容。s-name;break;case 2: cins-city;break;case 3: cins-tel;break;case 4: cins-qq;break;case 5: cins-email;break;case 6: cins-relation;break;cout更新成功!endl;coutnametcitytteltqqtemailtrelationnext;return head;/保存记录Address *KeepList(Address *head)char fileName80;ofstream outstuf; /建立输出文件流对象coutfileName;outstuf.open(fileName,ios:out|ios:binary); /链接文件,指定打开方式if(!outstuf) /调用重载算符函数测试流cerr文件无法打开。endl;abort();cout开始保存记录endl;Address *s=head;while(s) /向流插入数据outstufnametcitytteltqqtemailtrelationnnext;outstuf.close(); /关闭文件cout记录已保存。endl;return head;/读入记录Address *ReadFile()Address *head,*sa;ifstream instuf(Phonebook.txt,ios:in|ios:binary); /打开文件if(!instuf)cerr文件无法打开。sa-namesa-citysa-telsa-qqsa-emailsa-relation)/提取数据cout读入成功,数据为:endl;coutname city tel qq email relationnext=sa;head=head-next;head-next=NULL;instuf.close(); /关闭文件return head;void menu(Address *h)int choice;Address *p=h;cout*endl;cout* 1.添加记录 *endl;cout* 2.显示记录 *endl;cout* 3.查询记录 *endl;cout* 4.删除记录 *endl;cout* 5.更新记录 *endl;cout* 6.保存记录 *endl;cout* 7.读入记录 *endl;cout* 0.退出通讯录 *endl;cout*endl;cout请输入相应的序号选择要执行的任务choice)switch(choice)case 1 : menu(CreatList(p);continue;case 2 : menu(ShowList(p);continue;case 3 : menu(FindPerson(p);continue;case 4 : menu(MoveAway(p);continue;case 5 : menu(ReSet(p);continue;case 6 : menu(KeepList(p);continue; case 7 : menu(ReadFile();continue;if(choice=0)cout退出操作endl;break;void main()Address *head=NULL;menu(head);五、心得体会通过这次课程设计,我学会了很多东西,明白了很多道理。在这次课程设计中我遇到了很多问题,每当问题结束时,总有一种成就感。我明白了要做好一个好程序并不容易,你要考虑各方面的问题。遇到问题是要好好思考下是哪里出问题了,怎样解决。这样才能把问题解决了。要静下心来去做,不然你什么都做不了。每当一个个问题是你就会有非常高兴那是有一种成就

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论