课程设计:数据结构课程设计(精华版)

  • 格式:doc
  • 大小:256.50 KB
  • 文档页数:14

下载文档原格式

  / 14
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计

设计说明书

N!非递归算法的设计与实现

学生成

学号1118064050

班级网络1102班

成绩

指导教师余冬梅

数学与计算机科学学院2014年 1 月 5 日

课程设计任务书

2013 — 2014 学年第一学期

设计容:

本次课程设计的任务是N!非递归算法的设计与实现,在设计过程中应注意n值大小与数据类型表数围之间的关系,并尽可能求出较大n值的阶乘。

通过本次的实践,要求学生完成以下任务:

(一)阐述设计思想,画出流程图;

(二)说明测试方法,写出完整的运行结果;

(三)从时间、空间对算法效率进行分析;

(四)较好的界面设计;

(五)加强团队合作精神,开拓创新能力;

(六)编写课程设计报告,文档资料完整规。

指导教师:余冬梅教研室负责人:余冬梅

课程设计评阅

摘要

采用VC++作为软件开发环境,编写设计了一个非递归算法实现 n! 的计算,该软件具有计算从0到任何数之间整数的阶乘的功能。采用链式存储结构,遍历出运算结果,按照栈的先进后出思想输出结果,实现了整数的阶乘运算,界面清晰,易于用户使用。

关键词:n!,非递归,链式存储,栈

目录

1 课题描述 (1)

2 需求分析 (1)

3 概要设计 (1)

4 详细设计 (2)

4.1 定义存储结构和部分代码 (2)

4.2 流程图 (3)

5 程序编码 (4)

6 程序调试与测试 (6)

7 结果分析 (8)

8 总结 (8)

9 设计体会及今后的改进意见 (8)

参考文献 (9)

1 课题描述

尽管递归算法是一种自然且合乎逻辑的解决问题的方式,但递归算法的执行效率通常比较差。因此在求解许多问题时常采用递归算法来分析问题,用非递归方法来求解问题,另外一些程序不支持递归算法来求解问题,所以我们都会用非递归算法来求解问题。

本次课程设计主要容是:用非递归算法实现n!的计算,由于计算机中数据的存储围有限,而又要求出尽可能大的n的阶乘的值,用链表构造n的运算结果的存储结构,用链式存储方式,最后输出n!的运算结果。

本次课程设计的目的是:通过本次课程设计,可以使大家了解缓存中数据的存储围,提高自学能力,增强团队合作意识。

2 需求分析

在本次n!非递归算法的课程设计中主要用到的知识有:链表、函数,选择条件中的结构语句(if....else),和循环结构语句中的语句while()语句、do…while()语句和for()语句,选择语句if 的运用。

对n!的非递归的算法,主要是运用非递归的算法实现n的阶乘。

限制条件:

1.要求的n必须是整数;

2.n的围;

3.数据类型和表数围。

3 概要设计

递归和非递归算法是相通的,递归是一种直接或间接调用自身的算法,而非递归不调用自身函数。

递推采用的是递归和归并法,而非递推只采用递归法。递推法一般容易溢出,所以一般都采用递推法分析,而用非递推法设计程序。

本次实验分为两个步骤:

(1). 实现阶乘的模块m(n):从2开始连乘到n,实现求n的阶乘,相对简单,容易计算。

(2). 当n较大时,如果用int型结果就会溢出,所以实现阶乘需要特殊处理: 从较小值开始,进行数值分解,比如将182分解为18和2,2存储在链表数据域的第二个位置(第一个位置是1,表示0 的阶乘是1),然后将18作为进位,如果进位不为0,则继续分解。最终会以1,8,2的形式存储在链表当中,这样就不存在存的溢出。最后通过遍历的方法,遍历到最高位,及1,然后依次输出后续的数字,便是阶乘的结果。

4 详细设计

4.1 定义存储结构和部分代码

#include

//结构体列表

struct Node

{

int data;

Node* next; //指向大数的高位

Node* pre; //指向大数的低位

};

//非递归算法计算阶乘

for(i=2;i<=n;i++) //从2开始连乘到n

{

cur=head;

jinwei=0;

while(1)

{

temp=i*(cur->data)+jinwei;

cur->data=temp%10; //取个位存下来,如91*2=182,取2存储

jinwei=temp/10; //十位和百位作为进位,192中取18为进位

if(cur->next==NULL)

break;

cur=cur->next;

}

while(jinwei!=0)

{

cc=new Node;

cc->data=jinwei%10; //18中取8存储下来

cc->pre=cur;

cc->next=NULL;

cur->next=cc;

cur=cc;

jinwei/=10; //18中取1作为进位

}

}

4.2 流程图

图4.1 主函数流程图

5 程序编码

#include

struct Node

{

int data;

Node* next; //指向大数的高位

Node* pre; //指向大数的低位

};

void main()

{

int n,temp,i,jinwei,mark;

Node *head,*cc,*cur;

char ch;

printf("****计算阶乘****\n\n");

while(1)

{

head=new Node; //存放第一个节点,值为1

head->data=1;

head->pre=head->next=NULL;

printf("Please input a number: ");

mark=scanf("%d",&n);

if(n<0) //出错处理

{

printf("输入有误,请重新输入:\n");

getchar();

continue;

}

for(i=2;i<=n;i++) //从2开始连乘到n

{

cur=head;

jinwei=0;

while(1)

{

temp=i*(cur->data)+jinwei;

cur->data=temp%10; //取个位存下来,如91*2=182,取2存储

jinwei=temp/10; //十位和百位作为进位,192中取18为进位

if(cur->next==NULL)

相关主题