数据结构课设报告_长整型的加法运算
数据结构课程设计长整数四则运算

数据结构课程设计题目:长整数四则运算班级学号学生姓名提交日期成绩计算机与通信工程学院长整数四则运算一需求分析:问题描述:设计一个实现任意长的整数进行加法运算的演示程序。
基本要求:利用双向循环链表实现长整数的存储,每个结点含一个整形变量。
任何整形变量的范围是 -(2^15 - 1) (2^15 - 1)。
输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
在现实生活中有很多地方,例如航空航海、生物医疗等等方面,都需要很大的数来表示,这些用int甚至长整型long long都是远不够的,所以需要有一种算法来解决这种大数的表示和运算。
该问题只要求了大数的相加运算。
二详细设计:大致思路:【存储】用两个链表,每个节点保存一位数,在链表头保存数的正负,正数保存1,负数保存-1,如果是正数,后面每一位都储存正数,负数每一位都储存负数,数字按照链表头到链表尾从高位到低位的顺序;【相加】从两个链表的尾部开始同步向前相加,加完存到第一个链表,第二个加完的结点销毁,会存在两个链表不一样长的情况,没加的直接连到链表的前面,最高位的符号存到链表的头;【调整】根据表头的符号,调整后面的数字的值,中间会产生进位或者退位的问题,各个节点的符号不一定相同,但对于正负数都可以建立同样的调整模式,将正负到tmp中(1或-1)加或者减(tmp*10),然后对前一位加或者减tmp*1即可。
第一位保留符号不变,这样不用处理多余的进位,也就不用再产生新的节点,也不用保存符号。
【输出】从前到后遍历已经处理好的表,将每一位进行输出就可以了。
结构体定义struct Node{Node *pre;Node *next;int data;};功能函数void Input(Node *p,Node *t)//处理输入和保存void disply(Node *h,Node *t,int l)//输出void add(Node *h1,Node *t1,Node *h2,Node *t2)//每一位相加int adjust(Node *h,Node *t)//将各个位的正负、大小、进位进行调整源程序:。
长整数加减-实验报告

实验一线性表实现方法题目:编制一个长整数加减运算实现的程序班级:计科0906 姓名:陆遥学号:2009481406015 完成日期:2010-11-10一、需求分析1、本实验中演示中,长整数的每位上的数字必须为数字[0——9]之间,长整数的位数要求无限长。
测试的时候输入数据,当输入回车键的时候结束输入,如果输入的字符不符合题目要求,则程序能过滤这些不符合要求的字符。
2、演示程序以用户和计算机的对话方式执行,即在计算机显示“提示信息”后之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤去输入中不符合要求的字符)和运算结果显示在其后。
3、程序执行的命令包括:(1)创建第一个长整数;(2)执行加法或者减法;(3)创建第二个长整数;(4)结束。
4、测试数据(1)Please Enter the First long Integer:123456789+ or - :+Please Enter the Second long Integer:12345678123456789+12345678=135802467(2)Please Enter the First long Integer:123456789987654321+ or - :-Please Enter the Second long Integer:987654321123456789=-864197531135802468二、概要设计为实现上述程序功能,可以用链表或者长数组表示长整数,如果用数组表示长整数有个缺点就是长整数不能无限长,而链表能动态开辟空间,它克服了这个缺点,所以次试验用链表来表示长整数。
1、链表的抽象数据类型定义为:ADT Number{数据对象:D={a i| a i∈(0,1,…,9),i=0,1,2,…,n,n≥0}数据关系:R={< a i-1, a i >| a i-1, a i∈D,i=1,2,…,n}基本操作:CreateList (&L )操作结果:创建一个链表L 。
长整数的加法运算-数据结构与算法课程设计

题目:长整数的加法运算学院:计算机科学与工程学院专业:信息安全******学号:**********指导教师:***2014年10月18日目录引言 (4)1、系统概述 (4)2、系统分析 (5)2.1需求分析 (5)2.2系统功能 (5)2.3开发环境 (5)3、详细设计 (5)3.1功能结构框图 (6)3.2 软件设计 (6)3.2.1 定义链表与接收数据输入 (6)3.2.2长整数的加法运算 (8)3.2.3显示长整数相加结果 (10)4、所遇到的问题和分析解决 (10)5、系统特色及关键技术 (11)6、结论 (11)参考文献 (12)引言随着计算机技术的发展,人们利用计算机开发了许许多多方便的,实用的应用软件,在信息化的现代社会里,人们依赖着很多的应用软件,这些软件在推进社会发展的同时,也丰富了人们的生活,然而,在开发过程中,由于计算机系统的局限性,在需要某些功能时,总会遇到困难。
例如在开发某些工程项目时,有时需要对很大的数进行计算。
但是计算机本身无法计算某些较大的数,所以我们有必要设计专门的算法对一些较大的数进行相应的计算,通过简化运算之后,对其他程序功能的编写能起到良好的促进作用,大大的减轻了程序员的负担。
此次设计的程序将用于长整数的加法运算,程序运行时,将提示用户输入两个长整数,然后将两个长整数相加的结果输出。
1、系统概述在该长整数加法运算系统中,我将定义双向循环链表来表示长整数,按照中国对长整数的表示方法,如199999999表示为1,9999,9999。
双向循环链表数据域存储的是长整数的每4位。
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。
所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
通过造双向循环链表,可以对长整数进行方便的存储,在对长整数进行数学运算时,也能通过方便的操作链表,从而对长整数进行需要的计算。
数据结构课程设计长的整数加法

数据结构课程设计题目名称:长的整数加法计算机科学与技术学院一、需求分析1.问题描述:设计一个程序实现两个任意长的整数的求和运算。
2.基本要求:利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。
要求输入和输出每四位一组,组间用逗号隔开。
如:1,0000,0000,0000,0000。
3.任务陈述:(a)输入的形式和输入值的范围:本实验中演示中,长整数的每位上的数字必须为数字[0 ——9]之间,长整数的位数要求无限长。
测试的时候输入数据,当输入回车键的时候结束输入,如果输入的字符不符合题目要求,则程序能过滤这些不符合要求的字符。
(b)输出的形式: 整数的范围无限制,可为正数,可为负数。
按照中国对于长整数的表示习惯,每四位是一组,组间用逗号隔开。
(c)程序所能达到的功能: 演示程序以用户和计算机的对话方式执行,即在计算机显示“提示信息”后之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后,并对错误。
(d)测试数据: ①—⑧为正确输入数据,⑨为错误输入数据( 超出 4 位) ,⑩为错误输入数据( 不足 4 位)。
①两长整数a=b=0请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234---- 按该模式输入输入长整数 a您的输入结果为:0 ---------------------- 显示a(防止错误输入)请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234---- 输入长整数 b 您的输入结果为:您的运算结果为:输出②b>a>01,1111,1111,1111您的输入结果为:1,1111,1111,11119,9999,9999,9999您的输入结果为:9,9999,9999,9999您的运算结果为:11,1111,1111,1110③a>b>09999,9999,9999您的输入结果为:9999,9999,9999请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234 请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234 请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234您的输入结果为:2您的运算结果为:1,0000,0000,0001 ④b<a<0请按照如下形式输入第一个长整数,每四位一组-2345,6789您的输入结果为:-2345,6789请按照如下形式输入第二个长整数,每四位一组-7654,3211您的输入结果为:-7654,3211您的运算结果为:-1,0000,0000⑤a<0,b>0,|a|>|b|请按照如下形式输入第一个长整数,每四位一组-1,0000,00001您的输入结果为:-1,0000,0001请按照如下形式输入第二个长整数,每四位一组2您的输入结果为:: -1234,1234,1234 : -1234,1234,1234 : -1234,1234,1234 : -1234,1234,12342您的运算结果为:-9999,9999⑥a<0,b>0,|a|<|b|请按照如下形式输入第一个长整数,每四位一组-9999您的输入结果为:-9999请按照如下形式输入第二个长整数,每四位一组1,0000您的输入结果为:1,0000您的运算结果为:1⑦a>0,b<0,|a|>|b|请按照如下形式输入第二个长整数,每四位一组1,0000,0000您的输入结果为:1,0000,0000请按照如下形式输入第二个长整数,每四位一组-9999您的输入结果为:-9999您的运算结果为:9999,0001⑧a>0,b<0,|a|<|b| : -1234,1234,1234: -1234,1234,1234: -1234,1234,1234: -1234,1234,1234请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234您的输入结果为: 1请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234-1,0000,0000您的输入结果为:-1,0000,0000您的运算结果为:-9999,9999⑨错误输入(例:输入超过四位,则自动取其前四位进行运算)请按照如下形式输入第一个长整数,每四位一组: -1234,1234,12341,00000您的输入结果为:1,0000请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234-99998,01234您的输入结果为:-9999,1234您的运算结果为:-9998,1234⑩错误输入(例:非第一次输入少于四位,则在输入前加0 补足四位进行运算)请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234 1,000您的输入结果为:1,0000请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234-1,11您的输入结果为:-1,0011您的运算结果为:-11二、概要设计1.目标需求与设计思想通过尾插输入长整数,为实现顺序存入,并用头插存储的运算后的长整数,因为运算必定从后向前计算,同样为了实现顺序存入。
数据结构课程设计长整数加减运算

课程名称数据结构课程设计题目长整数加减运算一、需求分析设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。
长整数的长度没有限制,可以是任意长。
正确处理好运算之后的进位和借位。
(1)输入:[-]**,****,****;[-]*,****,****,**** //[-]表示“-”可选(2)输出:**,****,****,****是否继续计算(Y/N):(3)功能:能正确进行相关数据的加减运算(4)测试数据:0;0;输出“0”2345,6789;7654,3211;输出“1,0000,0000”1,0000,0000,0000;-9999,9999;输出“9999,0000,0001”1,0001,00001;-1,0001,0000;输出“0”自选数据二、概要设计1、使用双向循环链表实现长整数的运算及存储,构造双向循环链表,创建双向循环链表表示两个整数2、设计两整数相加的函数Add(),addtwo(),其中Add()调用addtwo()函数,addtwo()具体实现两个整数的加减操作,进位及借位问题;设计显示函数Display()及主函数main()三、详细设计1、数据结构设计双向循环链表的构造t ypedef struct LinkNode{int data; //记录每个节点的整数(小于)LinkNode *next, *pre; //记录下一个节点的地址和前一个节点的地址}linklist;2、创建两个长整数的链表伪算法void Creat(char a[]) //引入字符串,创立两个链表,分别表示两个整数{int 记录字符串i;记录加数节点数j;记录被加数节点数s;标记字符串中的‘-’号记录字符串中的字符转化为整数的值k,使每个节点记录位l while(指针所指不是“;”)被加数字符数m自动加1 //m记录字符串中被加数的字符数n=m;while(执政没有指到结尾处) 总字符串n位数自动加1; //n记录字符串的总字符数if被加数不是负数{head0->data=(-1); //记录整数符号w=1;}else {head0->data=1;}for(i=m-1;i>=w;i--){If指针所指为数字,而不是“,” //把字符转化为整数{k+=(a[i]-'0')*sum(l); //sum()计算的乘方l++;}if(a[i]==','||i==w){把整数存到双向循环链表中s++; //节点数加k=0; //重新初始化k和ll=0;}}head0->pre->data*=s; //存储整数符号和节点数}四、调试分析a、调试过程中,连续输入数字运算,速度会明显变慢,发现在初始化链表及运算后没有释放链表,造成系统资源浪费,经改造后自爱后面添加了析构函数b、算法的时空分析创建整数链表有三个循环,次数都为n。
长整数加减运算实验报告

计算机存储的数据是有范围限制的,对于超出存储限制的数据无法直接在计算机中计算,为此需要设计相应的程序来完成这种超出范围限制的长整数间的四则运算。
设计一个实现任意长的整形数进行四则运算的程序,要求完成长整数的加、减运算,乘除运算可选做。
在这里长整数没有范围限制,可任意长。
运算后的进位、借位等都要进行正确处理,可实现动态的输入,实时的输出。
学习使用基本的数据结构解决实际应用中的问题,将学习的理论知识应用于实践,增强学生解决实际问题的能力。
这里可采用的基本数据结构为线性表。
1) 输入:动态输入以数字开头,可以任意长度,中间不用输入分隔符,直接输入即可。
2) 输出:实时输出的结果是加减运算后的结果。
3) 功能:实现长整数的加减运算。
4) 测试数据: 0、0;输出“0”2345,6789、-7654,3211;输出“1,0000,0000”1,0000,0000,0000、9999,9999;输出“9999,0000,0001”1,0001,0001、;1,0001,0001;输出“0”此实验采用的数据结构是双向循环链表。
这样可以很容易的找到他的前驱以及它的后继。
节点采用结构体类型,代码如下:typedef struct Node // 双向链表的结构体定义{int data;struct Node *prior;struct Node *next;}DLNode;1) void ListInitiate(DLNode **head)操作结果:初始化一个头结点为head 的双向循环链表;2) int ListLength(DLNode *head)操作结果:计算以head 为头结点的链表的长度3) int ListInsert(DLNode *head,int i,int x)操作结果:将节点数据为x 的节点插到第i 个位置上去。
4) int abs(int x)操作结果:绝对值函数,返回x 的绝对值。
5) int InputNumber(DLNode *head)操作结果:将从键盘中接收数据并把得到的数据存入以head 为头结点的链表中。
数据结构课程设计报告长整数运算范文
数据结构课程设计报告长整数运算数据结构课程设计报告题目:长整数四则运算一、需求分析1.问题描述:由于工程上有时候需要对很大的数进行计算,可是计算机本身提供的数据类型无法保存几百位甚至几千位的数字,因此需要设计专门的算法对数据进行相应的计算。
此程序的设计任务是:设计一个程序能够实现长整数运算的程序,而且能够对一些错误异常进行辨别调整,计算出正确的结果。
程序输入格式是字符串,保存时需要用双向循环链表将字符串每四位保存在循环链表中的一个节点中,然后再计算后运行出结果。
2.基本功能功能一:建立双向循环链表,计算链表个数,对链表的数据进行修改,能在链表中插入结点。
功能二:将字符串转换成相应的数字存储在双向循环链表中功能三:对存入双向循环链表的长整数进行相加,相减,相除。
3.输入输出程序输入以字符串的形式输入,数据的类型是字符串,包含元素的范围是数字,逗号,负号。
输入时用字符串输入,输出时以一链表结点输出,而且每个结点表示四位。
二、概要设计1.设计思路:由于计算机无法完成位数很大的数字计算,设计思路就是将很长的数据进行分割,一部分一部分的用计算机固有数据类型进行计算。
将各部分的结果整合起来。
由于计算机固有的整数类型存数的对大整数是2^15-1,因此为了方便,且符合中国人对长整数的表示习惯,建立一个双向循环链表,每个结点存储四位数字,以万为进制。
从最低位开始加法,超过一万向上进位,因此每次加法应该是对应两个结点和进位数相加,进位值初始为0;减法也是一个结点计算一次,每次计算应该是第一个链表对应的结点值减去第二个结点的值和借位值的和,借位值初始值为0;除法的计算能够借助减法,被减数被减数减一次则最终结果加一;直至被减数比减数小。
2.数据结构设计:因为计算的是一个连续的数字,需要桉顺序一次计算,因此采用的数据结构的逻辑结构是线性表。
因为要求每一个结点只存储四位数字,为了将数字连接起来,采用的数据结构的存储结构是链式。
数据结构课程设计---长整数运算
数据结构课程设计---长整数运算没有测试,代码仅供参考!!!1:需求分析用户输入2个任意长整数,求它们的加法,减法和乘法,并将结果显示;2:设计思想a:数据结构的选用为了实现任意长整数的加法,减法和乘法,因为这几种运算都存在进位和借位以及位移等操作,因此选择双链表的结构体,它有一个data,left,right;考虑到data表示的数据的范围,使它只接受4个数字的整数,这样一个长整数就分为若干段,每一段为4个数字,便于进位和借位以及位移的操作;b:2个长整数的输入首先输入数的正负号,将它转化为相应的0和1;接着采用头插法的方式,当输入一个4个数字的整数时,就产生一个新的节点,它的值为输入的整数值,建立起它的左右指针,并用头节点指向它;为了判断一个长整数是否输入结束,定义一个结束标志,当输入正数时就继续,当输入负数时,就结束一个长整数的输入;同时用一个函数得到长整数的尾节点和段数,段数在比较2个数的大小有用。
c:2个长整数的加法先定义一个部分加法的函数,就是2个正的长整数的加法的运算;它从2个长整数的尾部开始,同时相加,接着再向左移一段,又同时相加;当2个数据的某一段同时存在时,就相加;当一个数据已经全部被相加后,另外一个数据的剩下的段就要全部复制到和中;在实行加法的时候,设置一个进位标志位,目的是为了使结果正确;当一段的数据相加产生进位时,那么进位标志位为1;下一次一段的数据相加就要加上这个进位标志位;而且如果2个长整数的所有的段的数据都相加完了,还要判断是否产生了进位标志位,如果有的话,就要新建一个节点,它的值就是1;2个正的长整数的求和就完成了。
再定义一个部分减法的函数,就是2个正的长整数的减法的运算;第一个长整数的大小一定大于第二个长整数的大小;它从2个长整数的尾部开始,同时相减,接着再向左移一段,又同时相减;当2个数据的某一段同时存在时,就相加;当第二个长整数已经全部被相减后,第一个数据的剩下的段就要全部复制到结果中;在实行减法的时候,设置一个借位标志位,目的是为了使结果正确;当一段的数据相减产生借位时,那么借位标志位为1;下一次一段的数据相减就要借去这个进位标志位;2个正的长整数的减法就完成了。
数据结构课程设计报告长整数运算
数据结构课程设计报告题目:长整数四则运算一、需求分析1. 问题描述:由于工程上有时候需要对很大的数进行计算,但是计算机本身提供的数据类型无法保存几百位甚至几千位的数字,所以需要设计专门的算法对数据进行相应的计算。
此程序的设计任务是:设计一个程序能够实现长整数运算的程序,而且能够对一些错误异常进行辨别调整,计算出正确的结果。
程序输入格式是字符串,保存时需要用双向循环链表将字符串每四位保存在循环链表中的一个节点中,然后再计算后运行出结果。
2. 基本功能功能一:建立双向循环链表,计算链表个数,对链表的数据进行修改,能在链表中插入结点。
功能二:将字符串转换成相应的数字存储在双向循环链表中功能三:对存入双向循环链表的长整数进行相加,相减,相除。
3. 输入输出程序输入以字符串的形式输入,数据的类型是字符串,包含元素的范围是数字,逗号,负号。
输入时用字符串输入,输出时以一链表结点输出,而且每个结点表示四位。
二、概要设计1. 设计思路:由于计算机无法完成位数很大的数字计算,设计思路就是将很长的数据进行分割,一部分一部分的用计算机固有数据类型进行计算。
将各部分的结果整合起来。
由于计算机固有的整数类型存数的对大整数是2人15-1 ,所以为了方便,且符合中国人对长整数的表示习惯,建立一个双向循环链表,每个结点存储四位数字,以万为进制。
从最低位开始加法,超过一万向上进位,所以每次加法应该是对应两个结点和进位数相加,进位值初始为0 ;减法也是一个结点计算一次,每次计算应该是第一个链表对应的结点值减去第二个结点的值和借位值的和,借位值初始值为0 ;除法的计算可以借助减法,被减数被减数减一次则最终结果加一;直至被减数比减数小。
2. 数据结构设计:因为计算的是一个连续的数字,需要桉顺序一次计算,所以采用的数据结构的逻辑结构是线性表。
因为要求每一个结点只存储四位数字,为了将数字连接起来,采用的数据结构的存储结构是链式。
1.双向循环链表的抽象数据类型定义为:ADT Link{数据对象:D={ai | ai € CharSet , i=1 , 2 , .......... , n, n > 0}数据关系;R={<ai-1,ai> | ai-1,ai € D,i=2 , ............ , n}}基本操作:InitLinkList(&L,a) 操作结果:构造一个双向循环链表L ,用a 判断是正数还是负数DestroyList(&L)初始条件:双向循环两已经存在操作结果:销毁有序表LInsert(&L,a) 初始条件:双向循环链表已经存在操作结果:在循环链表的末尾插入一个结点,且此结点的数据值为 a HeadInsert(&L,a)初始条件:双向循环链表已经存在操作结果:在循环链表的头结点后插入一个结点,且此结点的数据值为 a CountNode(&L)初始条件:双向循环链表存在操作结果:计算出链表中结点的个数,并返回个数Compare(&L1, &L2) 初始条件:L1 和L2 存在操作结果:比较两个双向循环链表的大小,用返回值 1 表示L1 大于L2, 返回值-1 标志L1 小于L2, 返回值0 标志L1 和L2 相等ToNum(*s,i,&e)初始条件:s 为字符串中指向某个字符的指针操作结果:将s 的前i 个字符转换为数字,存入 e 中CreatNum(&L,&s)初始条件:s 为某个字符串,双向循环链表L 存在操作结果:将字符串s 转换成数字存入到循环链表L 中Add(L1 ,L2, op)初始条件:双向循环链表L1 和L2 存在,op 为结果的标识符操作结果:两个链表相加,求出结果。
《数据结构》课程设计报告-任意长的整数加减法运算
中国石油大学(北京)远程教育学院《数据结构》课程设计报告2019 ~2019 学年第 1 学期课程设计题目第一题任意长的整数加减法运算2019 年8 月任意长的整数加减法运算1需求分析设计算法,实现一个任意长的整数进行加法、减法运算的演示程序。
例如:1234,5123,4512,3451,2345与-1111,1111,1111,1111,1111的加法结果为:0123,4012,3401,2340,1234。
基本要求如下:(1)利用链表实现长整数的存储,每个节点含一个整型变量;(2)整型变量的范围:-(2^15 -1)~(2^15 -1);(3)输入与输出形式每四位一组,组间用逗号分隔开。
如:1986,8213,1935,2736,3299;(4)界面友好,每步给出适当的操作提示,并且系统具有一定的容错能力。
至少给出下面的测试数据:(1)0;0(2)-2345,6789;-7654,3211(3)-9999,9999;1,0000,0000,0000(4)1,0001,0001;-1,0001,0001(5)1,0001,0001;-1,0001,0000(6)-9999,9999,9999;-9999,9999,9999(7)1,0000,9999,9999; 12概要设计注意这里是整数,浮点数需要额外的操作,实现大整数的加减,三个栈就OK了,两个运算整数栈,一个结果栈,基本的逻辑的就是利用栈的先入后出的特点将高位push到栈底,低位push到栈顶,之后两个栈pop出来之后push到结果栈,结果栈pop出来就是我们想要的结果。
typedef char ElemType;typedef struct{ElemType *base;ElemType *top;int stacksize;}sqStack;void initStack(sqStack *s)void Push(sqStack *s, ElemType e)void Pop(sqStack *s , ElemType *e)int StackLen(sqStack s)void ADD(sqStack *s1,sqStack *s2,sqStack *s3)3详细设计1. 主函数设计int main(){char e;sqStack s1,s2,s3;initStack(&s1); /*初始化堆栈s1,存放加数*/initStack(&s2); /*初始化堆栈s2,存放加数*/initStack(&s3); /*初始化堆栈s3,存放结果*/printf("江紫花090451\n"); /*输入第一个任意长整数,按”#”结尾*/printf("Please input the first integer\n"); /*输入第一个任意长整数,按”#”结尾*/scanf("%c",&e);while(e!='#'){Push(&s1,e); /*将加数(字符串)入栈s1*/scanf("%c",&e);}getchar(); /*接收回车符*/printf("Please input the second integer\n"); /*输入第二个任意长整数,按”#”结尾*/scanf("%c",&e);while(e!='#'){Push(&s2,e); /*将加数(字符串)入栈s2*/scanf("%c",&e);}ADD(&s1,&s2,&s3); /*加法运算,将结果存放在s3中*/printf("The result is\n");while(StackLen(s3)!=0) /*输出结果,打印在屏幕上*/{Pop(&s3,&e);printf("%c",e);}void initStack(sqStack *s){/*内存中开辟一段连续空间作为栈空间,首地址赋值给s->base*/s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));if(!s->base) exit(0); /*分配空间失败*/s->top = s->base; /*最开始,栈顶就是栈底*/s->stacksize = STACK_INIT_SIZE; /*最大容量为STACK_INIT_SIZE */ }/*入栈操作,将e压入栈中*/void Push(sqStack *s, ElemType e){if(s->top - s->base >= s->stacksize){/*栈满,追加空间*/s->base = (ElemType *)realloc(s->base, (s->stacksize +STACKINCREMENT)*sizeof(ElemType));if(!s->base) exit(0); /*存储分配失败*/s->top = s->base + s->stacksize;s->stacksize = s->stacksize + STACKINCREMENT; /*设置栈的最大容量*/}*(s->top) = e; /*放入数据*/s->top++;}/*出栈操作,用e将栈顶元素返回*/void Pop(sqStack *s , ElemType *e){if(s->top == s->base) return;*e = *--(s->top);}/*计算堆栈s当前的长度*/int StackLen(sqStack s){return (s.top - s.base) ;}void ADD(sqStack *s1,sqStack *s2,sqStack *s3){char a1,a2,a3,c=0; /*a1,a2分别存放从堆栈s1,s2中取出的(数据)元素,a3=a1+a2,c中存放进位*/while(StackLen(*s1)!=0 && StackLen(*s2)!=0){Pop(s1,&a1); /*取出s1栈的栈顶元素给a1*/Pop(s2,&a2); /*取出s2栈的栈顶元素给a2*/a3 = (a1-48) + (a2-48) + c + 48; /*相加*/if(a3>'9'){a3 = a3 - '9' + 47; /*产生进位的情况*/c = 1;}elsec = 0; /*不产生进位*/Push(s3,a3); /*将结果入栈s3*/}if(StackLen(*s1)!=0) /*栈s1不为空的情况*/{while(StackLen(*s1)!=0){Pop(s1,&a1); /*取出s1栈的栈顶元素给a1*/a3 = a1 + c ; /*与进位标志c相加*/if(a3>'9'){a3 = a3 - '9' + 47; /*产生进位的情况*/c = 1;}elsec = 0; /*不产生进位*/Push(s3,a3); /*将结果入栈s3*/}}else if(StackLen(*s2)!=0) /*栈s1不为空的情况*/{while(StackLen(*s2)!=0){Pop(s2,&a2); /*取出s1栈的栈顶元素给a1*/a3 = a2 + c; /*与进位标志c相加*/if(a3>'9'){a3 = a3 - '9' + 47; /*产生进位的情况*/c = 1;}elsec = 0; /*不产生进位*/Push(s3,a3); /*栈s1不为空的情况*/}}if(c==1)Push(s3,'1'); /*如果最后有进位,将字符’1’入栈s3*/ }4程序测试(1)0;0(2)-2345,6789;-7654,3211(3)-9999,9999;1,0000,0000,0000(4)1,0001,0001;-1,0001,0001(5)1,0001,0001;-1,0001,0000(6)-9999,9999,9999;-9999,9999,9999(7)1,0000,9999,9999; 15感想与体会这是一门纯属于设计的科目,它需用把理论变为上机调试。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计(论文)任务书软件学院学院专业班一、课程设计(论文)题目长整数的加法运算二、课程设计(论文)工作自2011 年 12 月 26 日起至 2011 年 12 月 30 日止三、课程设计(论文) 地点:四、课程设计(论文)内容要求:1.本课程设计的目的⑴训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题;⑵初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;⑶提高综合运用所学的理论知识和方法独立分析和解决问题的能力,巩固、深化学生的理论知识,提升编程水平。
2.课程设计的任务及要求1)基本要求:⑴要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编写上机程序和上机调试等若干步骤完成题目,最终写出完整的报告;⑵在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率;⑶程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;⑷每位同学需提交可独立运行的程序和规范的课程设计报告。
2)课程设计论文编写要求⑴理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订;⑵课程设计报告(论文)包括中文目录、设计任务、需求分析、概要设计、详细设计、编码实现、调试分析、课设总结、谢辞、参考文献、附录等;目录1.设计任务 (3)2.功能需求分析 (3)3.功能算法设计 (4)4.编码实现 (5)5.程序的调试与结果 (8)5课设小结 (9)6参考文献 (9)1.设计任务问题描述:设计一个实现任意长的整数进行加法运算的演示程序。
基本要求:1利用双向循环链表实现长整数的存储,每个结点含一个整型变量。
2任何整型变量的范围是-(2^15-1)~(2^15-1)。
3输入和输出形式按照中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
如:-2345,6789,3211;2.功能需求分析1.因为要实现任意长的整数进行加法运算,本程序使用C语言的整型变量int存放数据,一个int型的变量值的范围为-32768~32767,显然远远不能满足。
因此利用双向循环链表实现长整数的存储,每个结点存放一个整型变量,且只存10进制数的4位,即不超过9999的非负整数,整个链表表示为万进制数。
表头数据域的符号代替长整数的符号。
相加过程不破坏两个操作数链表。
长整数位数没有上限。
2.演示程序以用户和计算机的对话方式执行,在计算机终端上显示提示信息之后,由用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在后。
3.程序执行的命令包括:1)构造链表1存放第一个输入数据2)构造链表2存放第二个输入数据3)求两数之和4)结束4.测试数据⑴0;0;应输出0⑵-2345,6789;-7654,3211;应输出-1,0000,0000⑶-9999,9999;1,0000,0000,0000;应输出9999,0000,00013.功能算法设计ADT Lixt{数据对象:D={a i∣a i∈ElemSet,i=1,2,…,n,n≥0}数据关系:R1={<a i-1,a i>∣a i-1,a i∈D,i=2,…,n}基本操作:InitList(&L)操作结果:构造一个空的线性表DestroyList(&)初始条件:线性表L已存在操作结果:销毁线性表LClearList(L)初始条件:线性表L已存在操作结果:将L重置为空表ListEmpty(L)初始条件:线性表L已存在操作结果:若L为空表,则返回TRUE,否则返回FALSEListLength(L)初始条件:线性表L已存在操作结果:返回L中数据元素个数GetElem(L,i.&e)初始条件:线性表L已存在,1≤i≤ListLength(L)操作结果:用e返回L中第i个数据元素的值ListInsert(&L,I,e)初始条件:线性表L已存在,1≤i≤ListLength(L)+1操作结果:在L中第i个位置插入新的数据元素e,L的长度加1 ListDelete(&L,I,&e)初始条件:线性表L已存在,且非空,1≤i≤ListLength(L)操作结果:删除L的第i个元素,并且用e返回其值,L的长度减1 }ADT List4.编码实现1.节点的定义:typedef struct node{int data;struct node *pre;struct node *next;}DataNode;2.对于程序中数据的输入以及对输入数据检测,主要利用for和while循环语句对输入的数据进行检测和判断:DataNode* Input(){char ch[50];DataNode *temp,*node;int count=0,count1=0,i,j,n,sum=0;scanf("%s",ch);while(ch[count++]!='\0');count--;node=(DataNode*)malloc(sizeof(DataNode));temp=node;count1++;if(ch[0]=='-'||ch[0]=='+'){if((count-1)%2)count1+=(count-1)/2+1;elsecount1+=(count-1)/2;}else{if(count%2)count1+=count/2+1;elsecount1+=count/2;}count--;for(i=1;i<count1;i++){temp->pre=(DataNode*)malloc(sizeof(DataNode)); temp->pre->next=temp;temp=temp->pre;temp->data=0;for(j=0;j<2&&ch[count]!='-'&&ch[count]!='+';j++) {if(count<0)break;sum=ch[count--]-'0';for(n=0;n<j;n++)sum*=10;temp->data+=sum;}}temp->pre=node;node->next=temp;if(ch[0]=='-')count1=0-count1;node->data=count1;return node;}3.对于数据的输出同样利用for和while循环,通过对条件的判定进行数据的输出。
具体代码实现如下:void Output(DataNode *node){int n,i;DataNode *temp;n=node->data;temp=node->next;if(n<0){printf("\n-");n=0-n;}for(i=0;i<n-1;i++){if((n-1-i)%2==0&&i!=0)printf(",");if(n==1){printf("%d",temp->data);break;}if(i==0)printf("%d",temp->data);else if(i==n-2)printf("%02d",temp->data);elseprintf("%02d",temp->data);temp=temp->next;}}3.在主函数main中,主要实现链表的定义,以及对于程序的输出提示做好输出,最后再通过switch语句根据条件的不同输出不同的提示语句。
使程序变得更便于使用。
5.程序的调试与结果进入演示程序后即显示如下用户界面(图):以上为主界面,只有简单的三个功能,只要输入每个选项前面的数字,后按回车运算。
5课设小结感谢***老师,在*的的课堂上我学得到很多实用的知识,在此表示感谢!同时,对给过我帮助的所有同学和其他的老师再次表示衷心的感谢!此次课程设计,感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在做课设的这些的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针……通过这次课程设计之后,我把前面所学过的知识又重新温故了一遍。
6参考文献[1] 严蔚敏,吴伟民。
数据结构(C语言版)清华大学出版社[2]数据结构教程(第三版)上级实验指导清华大学出版社[3]数据结构课程设计(c/c++语言描述)电子工业出版社附录:#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<graphics.h>typedef struct node{int data;struct node *pre;struct node *next;}DataNode;int CF;DataNode* Input(){char ch[50];DataNode *temp,*node;int count=0,count1=0,i,j,n,sum=0;scanf("%s",ch);while(ch[count++]!='\0');count--;node=(DataNode*)malloc(sizeof(DataNode));temp=node;count1++;if(ch[0]=='-'||ch[0]=='+'){if((count-1)%2)count1+=(count-1)/2+1;elsecount1+=(count-1)/2;}else{if(count%2)count1+=count/2+1;elsecount1+=count/2;}count--;for(i=1;i<count1;i++){temp->pre=(DataNode*)malloc(sizeof(DataNode));temp->pre->next=temp;temp=temp->pre;temp->data=0;for(j=0;j<2&&ch[count]!='-'&&ch[count]!='+';j++){if(count<0)break;sum=ch[count--]-'0';for(n=0;n<j;n++)sum*=10;temp->data+=sum;}}temp->pre=node;node->next=temp;if(ch[0]=='-')count1=0-count1;node->data=count1;return node;}void Output(DataNode *node){int n,i;DataNode *temp;n=node->data;temp=node->next;if(n<0){printf("\n-");n=0-n;}for(i=0;i<n-1;i++){if((n-1-i)%2==0&&i!=0)printf(",");if(n==1){printf("%d",temp->data);break;}if(i==0)printf("%d",temp->data);else if(i==n-2)printf("%02d",temp->data);elseprintf("%02d",temp->data);temp=temp->next;}}int test(DataNode *node1,DataNode *node2) {DataNode *temp1,*temp2;int i,count;temp1=node1;temp2=node2;if(abs(temp1->data)>abs(temp2->data))return 1;else if(abs(temp1->data)<abs(temp2->data))return 2;else{count=abs(temp1->data);for(i=1;i<count;i++){temp1=temp1->next;temp2=temp2->next;if((temp1->data)>(temp2->data))return 1;if((temp1->data)>(temp2->data))return 2;if((temp1->data)==(temp2->data))if(i==count-1)return 0;}}}DataNode* add(DataNode *node1,DataNode *node2) {int i,flag,max,min;DataNode *temp1,*temp2;DataNode *result,*temp;result=(DataNode*)malloc(sizeof(DataNode));if((node1->data)*(node2->data)>0){if(abs(node1->data)>abs(node2->data)){max=abs(node1->data);min=abs(node2->data);flag=1;}else{max=abs(node2->data);min=abs(node1->data);flag=2;}CF=0;temp1=node1->pre;temp2=node2->pre;temp=result;for(i=1;i<max;i++){temp->pre=(DataNode*)malloc(sizeof(DataNode));temp->pre->next=temp;temp=temp->pre;if(i<min){temp->data=(temp1->data+temp2->data+CF)%100;CF=(temp1->data+temp2->data+CF)/100;temp1=temp1->pre;temp2=temp2->pre;}else if(flag==1){temp->data=(temp1->data+CF)%100;CF=(temp1->data+CF)/100;temp1=temp1->pre;}else{temp->data=(temp2->data+CF)%100;CF=(temp2->data+CF)/100;temp2=temp2->pre;}}if(CF!=0){max++;temp->pre=(DataNode*)malloc(sizeof(DataNode));temp->pre->next=temp;temp=temp->pre;temp->data=CF;}temp->pre=result;result->next=temp;if((node1->data)<0)max=0-max;result->data=max;return result;}else{switch(test(node1,node2)){case 0:result->data=2;result->next=(DataNode*)malloc(sizeof(DataNode));result->next->data=0;result->next->pre=result;result->pre=result->next;return result;case 1:CF=0;max=abs(node1->data);min=abs(node2->data);temp1=node1->pre;temp2=node2->pre;temp=result;for(i=1;i<max;i++){temp->pre=(DataNode*)malloc(sizeof(DataNode));temp->pre->next=temp;temp=temp->pre;if(i<min){if((temp1->data)>(temp2->data))temp->data=(temp1->data)-(temp2->data)+CF;else if((temp1->data)<(temp2->data)){temp->data=100+(temp1->data)-(temp2->data)+CF;CF=-1;}else{if(CF!=0){temp->data=100+CF;CF=-1;}elsetemp->data=0;}}else{if(temp1->data==0){temp->data=(temp1->data)+CF+100;CF=-1;}else{temp->data=(temp1->data)+CF;CF=0;}}temp1=temp1->pre;temp2=temp2->pre;}temp->pre=result;result->next=temp;result->data=node1->data;break;case 2:CF=0;max=abs(node2->data);min=abs(node1->data);temp1=node1->pre;temp2=node2->pre;temp=result;for(i=1;i<max;i++){temp->pre=(DataNode*)malloc(sizeof(DataNode));temp->pre->next=temp;temp=temp->pre;{if((temp2->data)>(temp1->data))temp->data=(temp2->data)-(temp1->data)+CF;else if((temp2->data)<(temp1->data)){temp->data=100+(temp2->data)-(temp1->data)+CF;CF=-1;}else{if(CF!=0){temp->data=100+CF;CF=-1;}elsetemp->data=0;}}else{if(temp2->data==0){temp->data=(temp2->data)+CF+100;CF=-1;}else{temp->data=(temp2->data)+CF;}}temp1=temp1->pre;temp2=temp2->pre;}temp->pre=result;result->next=temp;result->data=node2->data;break;}while((result->next->data)==0){if(abs(result->data)==2)break;temp=result->next;result->next=temp->next;result->next->pre=result;if((result->data)>0)(result->data)--;else(result->data)++;}return result;}}void gotoxy(int a,int b){int x=0x0b;HANDLE hInput, hOutput;COORD loc;loc.X = a; loc.Y=b;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOutput, loc);}void main(){DataNode *data1,*data2,*result;char key;char menus[5][20]={"Please choose:","1:Input the data","2:Plus Function","3:Quit",};int i,flag=0;for(i=0;i<5;i++){gotoxy(25,i*2+6);cprintf(menus[i]);}scanf("%c",&key);while(key!='3'){switch(key){case '1':system("cls");printf("Please Input The First Data:");data1=Input();printf("\nPlease Input The Second Data:");data2=Input();flag=1;break;case '2':if(flag==0){system("cls");printf("\016There is no data existing!");}else{system("cls");result=add(data1,data2);printf("\nThe result:");Output(result);getch();}break;}system("cls");for(i=0;i<5;i++){gotoxy(25,i*2+6);cprintf(menus[i]);}scanf("%c",&key);}}21。