数据结构课程设计报告(一元多项式的计算)
【问题描述】
编程实现一元多项式的加法计算。
【基本要求】
能用链表实现一元多项式的加法计算,并能打印出计算结果。
【所需知识】
(1)基本编程方法和程序设计知识。
(2)链表的理解和运算与运用。
【所用算法】
遍历算法和递归算法。
【操作平台】
Visual C++
#include<stdio.h>
#include<graphics.h>
#define MAX 100
typedef struct polynode
{ float coef
int expn
struct polynode *next
}node
node * create(void)
{
node *h,*r,*s
float c
int e
h=(node *)malloc(sizeof(node))
r=h
printf("coef:")
scanf("%f",&c)
printf("expn: ")
scanf("%d",&e)
while(c!=0.0)
{
s=(node *)malloc(sizeof(node))
s->coef=c
s->expn=e
r->next=s
r=s
printf("coef:")
scanf("%f",&c)
printf("expn: ")
scanf("%d",&e)
}
r->next=NULL
return(h)
}
void polyadd(node *pa, node *pb)
{
node *p,*q,*pre,*temp
int sum
p=pa->next
q=pb->next
pre=pa
while(p!=NULL&&q!=NULL)
{
if(p->expn<q->expn)
{
pre->next=p
pre=pre->next
p=p->next
}
if(p->expn==q->expn)
{
sum=p->coef+q->coef
if(sum!=0)
{
p->coef=sum
pre->next=ppre=pre->nextp=p->next
temp=qq=q->nextfree(temp)
}
else
{
temp=p->nextfree(p)p=temp
temp=q->nextfree(q)q=temp
}
}
if (q->expn<p->expn)
{
pre->next=q
pre=pre->next
q=q->next
}
}
if(p!=NULL)
pre->next=p
else
pre->next=q
}
void print(node * p)
{
while(p->next!=NULL)
{
p=p->next
printf(" %f*x^%d",p->coef,p->expn)
}
}
void calculate()
{ float cal=1.0,mid=0.0,las
int j
float num, x
int i=0
float later=0.0
int e[MAX]float c[MAX]
printf("Please input num:")
scanf("%f",&num)
printf("Please input x:")
scanf("%f",&x)
printf("Please input e[0]:")
scanf("%d",&e[0])
printf("Please input c[0]:")
scanf("%f",&c[0])
while(e[i]!=0 &&c[i]!=0.0 )
{ cal=1
for(j=0j<e[i]j++)
{
cal=cal*x
}
i++
mid=cal*c[i-1]
later+=mid
printf("Please input e[%d] and c[%d] :",i,i)
scanf("%d%f",&e[i],&c[i])
}
las=later+num
printf("The Result is :\n")
printf("%f",las)
sleep(3)
}
void main()
{
node * pa,* pb,*pc,*p,*q,*pre
int driver=VGA,mode=VGAHI
initgraph(&driver,&mode,"c:\\tc ")
setbkcolor(BLUE)
setcolor(RED)
printf("Welcome,Let's go!\n")
printf("Next, you will see the process of computing !")
printf("\nPlease input the coef and expn of pa:\n")
pa=create()
print(pa)
printf("\nPlease input the coef and expn of pb:\n")
pb=create()
print(pb)
p=pa->next
pa->next=NULL
while(p!=NULL)
{
if(pa->next==NULL)
{
pa->next=pp=p->next
pa->next->next=NULL
}
else
{ pre=paq=pre->next
while(q!=NULL &&p->expn>q->expn)
{
pre=qq=q->next
}
q=p->next
p->next=pre->next
pre->next=p
p=q
}
}
printf("\nthe first ordered one:\n")print(pa)
p=pb->next
pb->next=NULL
while(p!=NULL)
{
if(pb->next==NULL)
{
pb->next=pp=p->next
pb->next->next=NULL
}
else
{ pre=pbq=pre->next
while(q!=NULL &&p->expn>q->expn)
{
pre=qq=q->next
}
q=p->next
p->next=pre->next
pre->next=p
p=q
}
}
printf("\nthe second ordered one:\n")print(pb)
printf("\nSum of the polys is:\n")
polyadd(pa,pb)
print(pa)
printf("\n")
setbkcolor(RED)
calculate()
}
【编后总结】
本程序在逻辑设计,详细设计,程序编码和程序调试阶段时本来都城有设计save()保存函数,和load()下载函数,分别用来保存创建的多项式,和下载其它需计算的多项式数据,这样这个系统才能更加实用,void createadj()原来的函数原型为arcnode *createdj()函数中用链表结构把adjmatrix[][]的数据都保存其中,这样就能实现数据的保存,但随之要把Dijkstra中的adjmatrix[][]转换成用arcnode 指针的形式进行表示,因为只有这样,下载后的数据才能使用。但在最后的调试阶段中,发现dijkstra无法运行,但又苦于无法用save()函数保存adjmatrix[][],最后只放弃save()和load()函数,在 main()主函数中初始化该算式。从这次程序设计中我看到自己的不足之处,今后要更努力的学习和掌握好数据结构程序设计的知识。
晕/////真麻烦。。。。。
数据结构实习报告规范
实习报告的开头应给出题目、班级、姓名、学号和完成日期,并包括以下七个内容:
1、需求分析
以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?明确规定:
(1)输入的形式和输入值的范围;
(2)输出的形式;
(3)程序所能达到的功能;
(4)测试数据:包括正确地输入及其输出结果和含有错误的输入及其输出结果。
2、概要设计
说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
3、详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数的调用关系图。
4、调试分析
内容包括:
(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;
(2)算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进思想;
(3)经验和体会等。
5、用户使用说明
说明如何使用你编写的程序,详细列出每一步操作步骤。
6、测试结果
列出你的测试结果,包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中所列。
7、附录
题 目 : [数据结构] 约瑟夫-实习报告
尺 寸 : 约瑟夫-实习报告.doc
目 录 : 一、需求分析
二、概要设计
三、程序具体设计及函数调用关系
四、调试分析
五、测试结果
原 文 : 实习报告
题目:约瑟夫(Joseph)问题的一种描述是:编号为1,2,......,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个开始重新从1报数,如此下去,直至年有人全部出列为止。试设计一个程序求出出列顺序。
班级: 姓名: 学号: 完成日期:
一、需求分析
1. 本演示程序中,利用单向循环链表存储结构存储约瑟夫环数据(即n个人的编号和密码)。
2. 演示程序以用户和计算机的对话方式执行,即在计算机终端上显示"提示信息"之后,由用户在键盘上输入演示程序中需要输入的数据,运算结果显示在其后。
3. 程序执行的命令包括:
1)构造单向循环链表;2)
4. 测试数据
m 的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m值为6(正确的出列顺序为6,1,4,7,2,1,3,5)。
二、概要设计
1.单向循环链表的抽象数据类型定义为:
ADT List{
数据对象:D={ai | ai∈正整数,I=1,2,......,n,n≥0}
数据关系:R1={<ai-1,ai >|,ai-1,ai∈D,I=1,2,......,n}
基本操作:
Init List(&L)
操作结果:构造一个空的线性表L。
List Insert(&L,i,e)
初始条件:线性表L已存在,1≤i≤List Length(L)+1.
操作结果:在L中第i个位置之前插入新的数据无素e,L长度加1。
List Delete(&L,i,&e)
初始条件:线性表L存在非空,1≤i≤List Length(L).
操作结果:删除L的第i个元素,并用e返回其值,L长度减1。
2. 程序包含四个模块:
1)主程序模块:
树的遍历:文件目录结构显示
专业 计算机科学与技术(软件工程)
学生姓名 施利华
班级 M计算机101
学号 0751401208
指导教师 吴 素 芹
起止日期 2012.1.7-2012.1.14
目录
1 简介 1
2算法说明 2
3测试结果 3
4分析与探讨 6
5小结 8
参考文献 9
附录 10
附录1 源程序清单 10
树的遍历:文件目录结构的显示
1 简介
1. 树形结构
树形结构是一类十分重要的非线性结构,它可以很好地描述客观世界中广泛存在的具有分支关系或层次特性的对象,如操作系统的文件构成、人工智能搜索算法的模型表示以及数据库系统的信息组织形式等。
2.输入要求:
输入数据包含几个测试案例。每一个案例由几行组成,每一行都代表了目录树的层次结构。第一行代表了目录的根节点。若是目录节点,那么它的孩子节点将在第二行中被列出,同时用一对圆括号“()”界定。同样,如果这些孩子节点中某一个也是目录的话,那么这个目录所包含的内容将在随后的一行中列出,由一对圆括号将首尾界定。目录的输入格式为:*name size,文件的输入格式为:name size,其中*代表当前节点是目录,表示文件或目录的名称,由一串长度不大于10的字符组成,并且name字符串中不能含有‘(’,‘),’[‘,’]‘和’*‘。size是该文件/目录的大小,为一个大于0的整数。每一个案例中最多只能包含10层,每一层最多有10个文件/目录。
3.输出要求:
对每一个测试案例,输出时要求:第d层的文件/目录名前需要插入8*d个空格,兄弟节点之间要在同一列上。不要使用Tab(制表符)来统一输出的缩进。每一个目录的大小(size)是它所包含的所有子目录和文件大小以及它自身大小的总和。
4.输入例子:
*/usr1
(*mark1*alex1)
(hw.c3*course1)(hw.c5)
(aa.txt12)
*/usr1
()
表示有两个不同的根目录,目录名都是/usr,第一个根目录/usr下包含mark和alex两个子目录,mark目录下包含大小为3的文件hw.c和子目录course,alex目录下有一个大小为5的文件hw.c,子目录course下包含文件aa.txt,其大小为12;第二个根目录/usr下为空。
5.输出例子:
|_*/usr[24]
|_*mark[17]
||_hw.s[3]
||_*course[13]
| |_aa.txt[12]
|_*alex[6]
|_hw.c[5]
|_*/usr[1]
2算法说明
typedef struct TreeNode{
int data
TreeNode *left
TreeNode *right
}TreeNode,*Tree
先序:
void first(Tree *root)
{
printf("%d ",root->data)
first(root->left)
first(root->right)
}
中序:
void mid(Tree *root)
{
mid(root->left)
printf("%d ",root->data)
mid(root->right)
}
后序:
void last(Tree *root)
{
last(root->left)
last(root->right)
printf("%d ",root->data)
}
3测试结果
将代码打入Microsoft Visual C++ 6.0软件中,改完相关错误后运行代码,开始不能出现正确的运行结果,在相关文件中新建文本文件,文件命名为”input.txt“。在文本文件中,打入输入数据,得出下列截图。
图3-1 输入数据
得出”input.txt”记事后,重新运行代码,在相关文件夹的“output.txt”会出现相关的正确的输出结果,此时得出下列两张截图。
图3-2 输出结果
图3-3 输出结果
输入正确的代码后运行程序,得出下列截图。
图3-4 运行结果
4分析与探讨
目录结构是一种典型的树形结构,为了方便对目录的查找,遍历等操作,可以选择孩子兄弟双亲链表来存储数的结构。程序中要求对目录的大小进行重新计算,根据用户的输入来建立相应的孩子兄弟双亲链表,最后输入树形结构。可以引入一个Tree类,将树的构造,销毁,目录大小的重新计算(reSize),建立树形链表结构(parse),树形结构输出(outPut)等一系列操作都封装起来,同时对于每一个树的借点,它的私有变量除了名称(Name),大小(Size)和层数(Depth)之外,根据孩子兄弟双亲链表表示的需要,还要设置三个指针,即父指针(Tree*parent),下一个兄弟指针(Tree*NextSibling)和第一个孩子指针(Tree*Firstchild)。下面是几个主要函数的实现。
1.建立树形链表结构的函数parse()
根据输入来确定树形关系是,首先读取根借点目录/文件名和大小值,并根据这些信息建立一个新的节点;然后读入后面的各行信息,对于同一括号中的内容,即具有相同父节点的那些节点建立兄弟关联。这个函数实际上是采用层数遍历建立树形链表结构。
定义一个Tree*类型的数组treeArray[ ],用来存放目录的节点信息,并定义两个整型变量head和rear,head值用来标记当前节点的父节点位置,每处理完一对括号,head需要增加1,即下一对待处理括号的父节点在treeArray[ ]中要往后移一个位置。如果当前处理的节点是目录类型,则将它放在treeArray[ ]数组中,rear是treeArray[ ]的下标变量,加入一个树的节点,并和head所指的父节点建立关联,但是不用放入treeArray[ ]中。
2.目录大小重新计算函数reSize()
输入数据中对目录大小的初始化值一般为1,而目录的真正大小应该是自身的大小和它包含的所有文件及子目录的大小之和。因此,在计算目录大小的时候,需要遍历它下面所有的文件和子目录,可以采用递归嵌套的后序遍历方式。另外要注意,采用孩子兄弟双亲链表表示时,父目录下的所有子目录和子文件都在该父目录的左子树上(右字数第一个节点是该目录的兄弟节点),所以遍历的时候只需要遍历目录的左字数即可。
3.输出树形结构的函数outPut()
输出是一个线序遍历的过程。为完成对树形的输出,兄弟目录之前需要相同的缩进,用’|’上下相连,而斧子目录或父目录和子文件之间需要设定正确的缩进,子目录或子文件要比父目录向右缩进8个空格。设置一个标志数组flag[11](每个目录下最大层次数为10),当前Tree*temp指针所指的节点如果有兄弟节点,则置flag数组值为1,否则置为0;并由此节点反复查询它的祖先节点的情况,知道根节点位置。输出时,遇到flag[ ]=1时,屏幕输出“| ”,表明是兄弟节点;遇到flag[ ]=0时则输出“ ”,这样就可以保证兄弟节点之间有相同的缩进,而子节点总比父节点享有缩进8个空格。
treeArray[]
4.消除输入总多余空格的函数skipwhiteSpace(string&s,int*i)
从用户输入数据中读入一行后,调用该函数来跳过s字符串中s[i]之后的空格,以方便后面的处理。
此外,关于读入目录名称,大小,以及将string类型的Size值转换成int类型的函数的实现,相对比较简单,此外不再赘述。
图4-1 数据异常测试案例
5小结
参考文献
[1] 刘振安,刘燕君.C程序设计课程设计[M].[北京]机械工业出版社,2004年9月
[2] 谭浩强.C程序设计(第三版).清华大学出版社,2005年7月
[3] 严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社,1997年4月
[4]吴文虎.程序设计基础.清华大学出版社,2003年
[5]王立柱.C/C++与数据结构.清华大学出版社,2002年
[6]顾元刚.数据结构简明教程.东南大学出版社,2003年
[7]郭福顺,王晓芬,李莲治.数据结构(修订本).大连理工大学出版社,1997年
[8]严蔚敏,陈文博.数据结构及应用算法教程.清华大学出版社,2004年
附录
附录1 源程序清单
#include <string>
#include <iostream>
#include <fstream>
using namespace std
string s = ""
int startPos = 0
ofstream outfile
ifstream infile
class Tree{
string Name
int Size
Tree* FirstChild
Tree* NextSibling
Tree* parent
public:
Tree(string Name = "", int Size = 0)
void parse()
void reSize()
void outPut()
~Tree()
}
Tree* treeArray[100]
int head = 0, rear = 0
Tree::Tree(string Name, int Size){
this->Name = Name
this->Size = Size
FirstChild = NULL
NextSibling = NULL
parent = NULL
}
Tree::~Tree()
{
Tree* temp
Tree* temp1
temp = FirstChild
while(temp != NULL)
{
temp1 = temp
temp = temp->NextSibling
delete temp1
}
}
void Tree::reSize()
{
Tree* temp = this
if(temp->FirstChild != 0){
temp = temp->FirstChild
while(temp != 0){
temp->reSize()
Size += temp->Size
temp = temp->NextSibling
}
}
}
bool checkName(string s)
{
if(s[0]!='*' &&s.length() >10)
return false
if(s[0]=='*' &&s.length() >11)
return false
if(s[0]!='*' &&(s[0]=='(' || s[0]==')' || s[0]=='[' || s[0]==']'))
return false
for(int i=1i<s.length()i++){
if(s[i]=='*' || s[i]=='(' || s[i]==')' || s[i]=='[' || s[i]==']')
return false
}
return true
}
void Tree::outPut()
{
Tree* temp
Tree* temp1
bool flag[11]
int i
outfile.open("output.txt",ios::app)
if(!outfile){
cout<<"cannot append the output file.\n"
exit(0)
}
if(!checkName(Name)){
cout<<"input error!--"<<Name<<endl
exit(0)
}
outfile<<"|_"<<Name<<"["<<Size<<"]\n"
outfile.close()
temp1= FirstChild
while(temp1 != NULL)
{
outfile.open("output.txt",ios::app)
if(!outfile){
cout<<"cannot append the output file.\n"
exit(0)
}
i = 0
temp = temp1
while(temp->parent != NULL)
{
if(i>=10){
//检查当前的父目录包含的子文件(或目录数)是否大于10;
cout<<"input error!--dictionary contains more than 10 levels."<<endl
exit(0)
}
temp = temp->parent
if(temp->NextSibling != NULL)
flag[i++] = true
else
flag[i++] = false
}
while(i--)
{
if(flag[i] == true)
outfile<<"| "
else
outfile<<""
}
outfile.close()
temp1->outPut()
temp1 = temp1->NextSibling
}
}
void skipWhiteSpace(string&s, int* i)
{
while(s[*i] == '\t' || s[*i] == ' ')
(*i)++
}
string getSubDir(string&line, int* startPos)
{
string res = ""
skipWhiteSpace(line,startPos)
while(line[*startPos] != ')')
res += line[(*startPos)++]
res += line[(*startPos)++]
skipWhiteSpace(line, startPos)
return res
}
int stringToNum(string s)
{
int num = 0
unsigned int i = 0
while(i <s.length())
{
num *= 10
num += s[i++] - '0'
}
return num
}
string getName(string&s, int* i)
{
string name = ""
while(s[*i] != ' ' &&s[*i] != '\t')
name += s[(*i)++]
return name
}
int getSize(string&s, int* i)
{
string size = ""
while((unsigned int)(*i) <s.length() &&s[*i] != ' ' &&s[*i] != '\t' &&s [*i] != ')')
size += s[(*i)++]
return stringToNum(size)
}
void Tree::parse()
{
Tree* temp
string line
string name
int size
while(getline(infile,line,'\n'))
{
startPos = 0
while(1)
{
s = getSubDir(line, &startPos)
int i = 1
skipWhiteSpace(s, &i)
if(s[i] != ')')
{
skipWhiteSpace(s,&i)
name = getName(s,&i)
skipWhiteSpace(s,&i)
size = getSize(s,&i)
temp = treeArray[head%100]->FirstChild = new Tree(name,size)
temp->parent = treeArray[head%100]
if(name[0] == '*')
treeArray[(rear++)%100] = temp
skipWhiteSpace(s,&i)
}
while(s[i] != ')')
{
skipWhiteSpace(s,&i)
name = getName(s,&i)
skipWhiteSpace(s,&i)
size = getSize(s,&i)
temp->NextSibling = new Tree(name,size)
skipWhiteSpace(s,&i)
temp = temp->NextSibling
temp->parent = treeArray[head%100]
if(name[0] == '*')
treeArray[(rear++)%100] = temp
}
head ++
if((unsigned int)startPos >= line.length())
break
}
if(head == rear)
break
}
}
///////////////////////////////////////////////////////////
/////
//////////////////////////////////////////////////////////
int main()
{
Tree* fileTree
string s
string name
int size
outfile.open("output.txt")
if(!outfile){
cout<<"cannot open the output file!\n"
exit(0)
}
outfile<<"The result is as follows:\n"
outfile.close()
infile.open("input.txt",ios::out)
if(!infile){
cout<<"cannot open the input file!\n"
exit(0)
}
while(getline(infile,s,'\n'))
{
int i = 0
skipWhiteSpace(s, &i)
name = getName(s,&i)
skipWhiteSpace(s,&i)
size = getSize(s,&i)
fileTree = new Tree(name, size)
if(name[0] == '*')
{
treeArray[rear++] = fileTree
fileTree->parse()
}
fileTree->reSize()
fileTree->outPut()
delete fileTree
}
infile.close()
return 0
}
算术表达式求值演示
一、概述
数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
在这次的课程设计中我选择的题目是算术表达式求值演示。表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。
二、 系统分析
1. 以字符列的形式从终端输入语法正确的、不含变量的整数表达式。利用已知的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例子在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。
2. 一般来说,计算机解决一个具体问题时,需要经过几个步骤:首先要从具体问题抽象出一个适当的数学模型,然后设计一个解决此数学模型的算法,最后编出程序,进行测试,调试直至得到想要的答案。对于算术表达式这个程序,主要利用栈,把运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法,可以使用两个栈,一个用以寄存运算符,另一个用以寄存操作数和运算结果。
3. 演示程序是以用户于计算机的对话方式执行,这需要一个模块来完成使用者与计算机语言的转化。 4. 程序执行时的命令:
本程序为了使用具体,采用菜单式的方式来完成程序的演示,几乎不用输入什么特殊的命令,只需按提示输入表达式即可。(要注意输入时格式,否者可能会引起一些错误) 5. 测试数据。
2
算术表达式求值演示
一、概述
数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
在这次的课程设计中我选择的题目是算术表达式求值演示。表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。
二、 系统分析
1. 以字符列的形式从终端输入语法正确的、不含变量的整数表达式。利用已知的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例子在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。
2. 一般来说,计算机解决一个具体问题时,需要经过几个步骤:首先要从具体问题抽象出一个适当的数学模型,然后设计一个解决此数学模型的算法,最后编出程序,进行测试,调试直至得到想要的答案。对于算术表达式这个程序,主要利用栈,把运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法,可以使用两个栈,一个用以寄存运算符,另一个用以寄存操作数和运算结果。
3. 演示程序是以用户于计算机的对话方式执行,这需要一个模块来完成使用者与计算机语言的转化。 4. 程序执行时的命令:
本程序为了使用具体,采用菜单式的方式来完成程序的演示,几乎不用输入什么特殊的命令,只需按提示输入表达式即可。(要注意输入时格式,否者可能会引起一些错误) 5. 测试数据。
操作集合:
(1)void InitStack1(SqStack1 &S1)//声明栈建立函数 (2)void InitStack2(SqStack2 &S2)//声明栈建立函数
(3)void evaluate(SqStack1 &S1,SqStack2 &S2)//确定如何入栈函数 (4)void Push1(SqStack1 &S1,char e)//声明入栈函数 (5)void Push2(SqStack2 &S2,float e)//声明入压栈函数 (6)char GetTop1(SqStack1 &S1)//声明取栈顶元素函数 (7)float GetTop2(SqStack2 &S2)//声明取栈顶元素函数 (8)char Pop1(SqStack1 &S1)//声明出栈函数 (9)float Pop2(SqStack2 &S2)//声明出栈函数 (10)char Compare(char m,char n)//声明比较函数
(11)float Operate(float a,char rheta,float b)//声明运算函数 (12)void DispStack1(SqStack1 &S1)//从栈底到栈顶依次输出各元素 (13)void DispStack2(SqStack2 &S2)//从栈底到栈顶依次输出各元素 }ADT SqStack
结构分析:
栈中的数据节点是通过数组来存储的。因为在C语言中数组是用下标从零开始的,因此我
们在调用他们的数据是要特别注意。指针变量的值要么为空(NULL),不指向任何结点;要么其值为非空,即它的值是一个结点的存储地址。注意,当P为空值时,则它不指向任何结点,此时不能通过P来访问结点,否则会引起程序错误。如果输入的数字不符合题目要求,则会产生错误结果。
算法的时空分析:
时间和空间性能分析:时间上,对于含n个字符的表达式,无论是对其进行合法性检测还是对其进行入栈出栈操作n次,因此其时间复杂度为O(n)。空间上,由于是用数组来存储输入的表达式,用栈来存储运算中的数据和运算符,而栈的本质也用到的数组,数组在定义时必须确定其大小。在不知表达式长度的情况下确定数组的长度确非易事,此时极易造成空间的浪费,因此空间性能不是很好。
8皇后算法是算法的经典了 我记得我当年C语言程序上机就有这道题目 我直接按书上抄上去的 找不到的话就去网上下 网上下的一般会有很多错误 但一般是小错误 反复改下错就可以了
“数据库课程设计”是数据库系统及应用课程的后续实验课,是进一步巩固学生的数据库知识,加强学生的实际动手能力和提高学生综合素质。
一、 课程设计目的
课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。课程设计的目的:
1. 加深对数据库原理、程序设计语言的理论知识的理解和应用水平;
2. 在理论和实验教学基础上进一步巩固已学基本理论及应用知识并加以综合提高;
3. 学会将知识应用于实际的方法,提高分析和解决问题的能力,增强动手能力;
4. 为毕业设计和以后工作打下必要基础。
二、课程设计要求
运用数据库原理的基本理论与应用知识,在微机RDBMS(SQL Server)的环境上建立一个数据库应用系统。要求把现实世界的事物及事物之间的复杂关系抽象为信息世界的实体及实体之间联系的信息模型,再转换为机器世界的数据模型和数据文件,并对数据文件实施检索、更新和控制等操作。
1. 用E-R图设计选定题目的信息模型;
2. 设计相应的关系模型,确定数据库结构;
3. 分析关系模式各属于第几范式,阐明理由;
4. 设计应用系统的系统结构图,确定系统功能;
5. 通过设计关系的主码约束、外码约束和使用CHECK实现完整性控制;
6. 为参照关系设计插入、删除、修改触发器;
7. 实现应用程序设计、编程、优化功能;
8. 对系统的各个应用程序进行集成和调试,进一步优化系统功能、改善系统用户界面完成实验内容所指定的各项要求;
9. 分析遇到的问题,总结并写出课程设计报告;
10. 自我评价
三、实验环境
开发环境VC++、C#、ASP或JAVA;ODBC/JDBC;数据库SQL Server
四、上机实现内容
1. 创建数据库的结构
2. 创建各基本表的结构
3. 编制系统各功能模块,完成数据的管理(增、删、改)及统计查询。对于程序运行界面不做考核的重点。
五、课程设计考核
1.对学生到实验室的情况进行不定时统计;
2.出勤率+课程设计报告+课程设计所开发的应用系统+其他(上机抽查和提问)=综合评定成绩。
3.课程设计结束时请将下列资料上交:
(1) 课程设计报告;
(2) 所开发的应用系统的源程序、安装和使用说明;
(3) 将(1)(2)中的资料压缩成一个压缩包,压缩包文件的命名规则:班级+学号(末2位)+姓名(例如:计科090101王鹏晓);
(4) 班长将本班每人的(3)中的压缩包刻录成光盘连同打印的课程设计报告收齐,交给任课教师。
附录﹑课程设计题目
题目1:课程设计选题管理系统(1,24)
包括三大模块:
课程设计题目维护与查询:题目的添加、修改和删除;按题目类型、名称和关键字查询以及已选与未选题目的查询;
学生信息维护与查询;
学生选题维护与管理:学生选题及查询;
具体功能细化:
前台学生选题:学生上网登录系统进行选题;
前台教师出题:
教师添加、修改和删除题目;
教师确认学生的选题;
后台管理出题和选题
添加用户及权限
题目2:书店管理系统(23)
包括四大模块:
售书(图书销售管理及销售统计,查询)
进书(通过书目,向发行商下定单订购图书)
库存(图书库存,统计)
相关查询
题目3:图书馆管理系统(11)
包括四大模块:
图书的查询
借书
还书
图书的预约
题目4:库存管理系统(8)
包括四大模块:
商品目录建立
商品入库管理
商品出库管理
商品库存查询
题目5:工资管理系统(1 人)41
包括四大模块:
系统数据初始化
员工基本信息数据的输入、修改、删除;
员工个人信息及工资表的查询;
员工工资的计算;
参考数据如下:
员工基本状况:包括员工号、员工姓名、性别、所在部门、工资级别、工资等级等。
工资级别和工资金额:包括工资等级、工资额。
企业部门及工作岗位信息:包括部门名称、工作岗位名称、工作岗位工资等。
工龄和工资金额:包括工龄及对应工资额。
公司福利表:包括福利名称、福利值。
工资信息:包括员工号、员工姓名、员工基础工资、员工岗位工资、员工工龄工资、公司福利、员工实得工资。
题目6:酒店客房管理系统 (1 人)14,26
包括四大模块:
前台操作:包括开房登记、退房结账和房状态查看
预订管理:包括预订房间、预订入住和解除预订
信息查询:包括在住客人列表、预订客人列表和历史客人列表
报表统计:包括开房记录统计、退房结账和预订房间统计
员工基本信息数据的输入、修改、删除;
参考数据如下:
住店管理:客人姓名、证件号码、房号、入住时期、预计离开日期、结账离开日期、应付金额
客人信息:姓名、性别、证件类型、证件号码、联系电话
房间信息:房号、房类型、价格、押金、房状态 预订房间
客人姓名、性别、房类型、房号、价格、证件类型、证件号码、联系电话、入住日期、预计离开日期、历史信息
题目7:旅行社管理信息系统(1 人)3
包括如下模块:
旅游团队、团队团员及旅游路线相关信息的输入
旅游团队、团队团员及旅游路线相关信息的维护(修改、浏览、删除和撤销)
旅游团队管理信息的查询(如按团队编号)
团队团员基本情况的查询(可选多种方式)
旅游路线相关信息的查询(如按线路编号)
旅游路线排行榜发布。
数据备份,更改密码。
参考数据如下:
团员信息表(路线编号,团队编号,团员编号,姓名,性别,电话,通信地址,身份证号码, 团费交否,备注)
线路信息表(路线名称,团费,简介,图形,路线编号)
团队信息表(团队编号,路线编号,团员人数,出发日期,返程日期)
旅游团队信息表(团队编号,团队负责人,团员人数,建团时间,是否出发,团费,盈亏)
密码信息(操作员,密码)
题目8:报刊订阅管理系统 (1 人)25,35
包括如下模块:
登录功能:登录统为身份验证登录。分为管理员登录和一般用户登录。分别通过不 同的用户名和密码进入报刊订阅管理界面,新的用户需要注册。
录入新信息功能:对于管理员,包括新用户信息和新报刊信息的录入功能,信息一旦 提交就存入到后台数据库中;普通用户自行注册进行可以修改个人信息。
订阅功能:用户可以订阅报刊,系统自动计算所需金额,并显示在界面上;管理员不 可订阅报刊,必须以用户身份订阅报刊。
查询功能:用户可以查询并显示自己所订阅的信息;管理员可以按人员、报刊、部门 分类查询。查询出的信息显示在界面上,并且可以预览和打印出结果。
统计功能:管理员可以按用户、部门、报刊统计报刊的销售情况,并对一些重要的订 阅信息进行统计;普通用户可以统计出自己的订阅情况,并且可以预览和打印出结果。
系统维护功能:数据的安全管理,主要是依靠管理员对数据库里的信息进行备份和恢 复,数据库备份后,如果出了什么意外可以恢复数据库到当时备份的状态,这提高了系统和 数据的安全性,有利于系统的维护
参考数据如下:
管理员表(Adminuser) :管理员名、密码。
部门表(Department) :部门号,部门名。
用户表(Users) :用户账号、密码、真实姓名、身 份证号、联系电话,联系地址,部门号(和部门表有关)等。
报刊类别表(NewspaperClass) :分类编号、 分类名称。
报刊信息表(Newspaper) :报刊代号、报刊名称、出版 报社、出版周期、季度报价、内容介绍、分类编号(和报刊类别表有关)等。
订单表(Order) :订单编号、用户编号、报刊代号、订阅份数、订阅月数等。
题目9:计算机等级考试教务管理系统(2 人)32
包括四大模块:
用户设置:对考点代码,考点名称进行设置,设置用户与密码;系统复位:即清除上一次考试数据(在之前存入历史)
报名管理: 报各库录入(姓名不能不空,之间不能有空格) 增加、删除、修改、浏览
准考证管理:准考证生成规则:xxx+yy+zz+kk,其中 XXX 为考点代码;YY 为语言代码,XX 为考场号,KK 为座位号 同一级别、语言应根据报名初始库信息按随机数生成准考证,同一考点最多可有 99*30=2970 名考生;如已生成准考证号,再重新生成准考证号,应该给予提示。 准考证打印
考务管理:考生信息查询、浏览、打印
成绩管理:成绩数据录入、接收 成绩合成(总成绩=笔试成绩*0.6+上机成绩*0.4),按大于或等于 60 合格
参考数据如下:
初始报名表(准考证号(为空) ,报名号(主键) ,级别+语言种类(外键) ,姓名,性别, 出生年份,民族,身份证号,联系地址,联系电话,照片,备注,参加培训)
含准考证号的报名表(准考证号(为主键) ,报名号,级别+语言种类(外键) ,姓名,性别, 出生年份,民族,身份证号,联系地址,联系电话,照片,备注,参加培训)
成绩表(准考证号,笔试成绩,上机成绩,总成绩) 级别语言代码表(级别语言代码,级别+语言)
用户信息表(考点代码,考点名称,用户名,密码)
题目10:人事管理系统(1 人)21
包括四大模块:
登录管理:包括操作员管理,口令设置,权限管理
人员管理:包括人事数据维护、人事信息查询和人事信息统计
工资管理
部门管理:包括部门表,职称表和年份表
查询及报表打印
参考数据如下:
人事表(编号,姓名,性别,出生日期,工作日期,部门代码,职称,婚否,简历,相片)
工资表(基本工资,岗位津贴,奖励,应发工资,水电,保险,实发工资)
部门表(代码,部门名称)
职称表(职称代码,职称名称)
年份表(年份代码,年份名称)
操作员表(操作员代码,操作员姓名,口令,部门,电话)
系统日志表(操作员代号,操作员姓名,登录时间,离开时间)
题目11:商品销售管理系统(1 人)19
包括四大模块:
用户登录
基本信息管理:包括销售情况、商品信息、库存表、员工表等信息的录入、浏览、修改、撤销、删除和查询等
商品销售管理:包括商品售出、退回和入库
盘点:包括库存盘点、当日销售盘点
参考数据如下:
商品信息表(商品编号,商品名称,品牌,型号,销售单价) 商品编号=类别代码(1 位)+品名代码(1 位)+品牌代码(2 位)+型号代码(2 位)
销售情况表(成交编号,商品编号,销售数量,总金额,销售日期,员工编号)
库存表(商品编号,供货商编号,进货日期,进货价,库存数量)
员工表(员工编号,员工姓名,性别,基本工资,职务,密码)
供货商表(供货商编号,供货商名称,所在地,联系电话)
员工资料表(员工编号,员工姓名,是否党员,简历,照片)
题目12:学生成绩管理系统(1 人)29
包括四大模块:
基本数据管理:包括院系管理,专业管理(设置院系下面的专业),班级管理(设置专业下面的班级),课程管理(设置相应专业下面的课程)
学生信息管理:包括基本信息录入、基本信息修改
学生成绩管理:包括学生成绩录入、学生成绩修改
信息查询:包括基本信息查询、成绩信息查询、学校人数统计
系统管理:用户管理、数据备份和系统帮助
参考数据如下:
院系信息(院系代码,院系名称)
院系专业信息(班级、院系代码,专业)
学生基本信息(班号,学号,姓名,性别,出生年月,籍贯,政治面貌,身份证号,入学年月,家庭地址,邮政编码,图片信息,备注)
学生成绩表(学号,课号,成绩,备注)
课程表(课号,课程名称,学期,备注)
班表(班号,班级名称)
用户信息表(用户名,密码,用户标识)
题目13:火车售票管理系统(4 人)36
包括四大模块:
售票管理
订票管理
信息查询
系统维护
参考数据如下:
车次信息表(车次,始发站,终点站,发车时间,到达时间)
订票信息表(车次,座位号,发车时期,发车时间,座位等级,票价)
车次座位等级分配及座位占用表(车次,座位号,座位等级,票价,占用标志)
用户信息表(用户名,密码,用户标识)
题目14:小型物业管理系统(1 人)
包括四大模块:
房源管理:对原始资料的录入、修改、查询和刷新。一般用户可以查询与房间有关 的统计资料;物业主管可其进行增、删、改、插等操作
租房管理:对房产出租,退租以及租房面积调整。其中物业主管可对其进行房租金 额计算和收款操作,一般用户对其查询
水电处理:根据租房资料,结合当月水、电量进行分摊,完成应收水电费。其中物 业主管对其进行计算,其他查询
交款处理:提供收款和发票打印以及交款数据查询
查询处理:对租房资料、交款资料,发票资料进行查询
参考数据如下:
房源资料(名称,面积,月租,物业,仓库)
租房资料(名称,面积,单位,月租,物业,押金,仓库)
水电资料(单位,电量,水量,电费,水费)
交费资料(收费项目,应收日期,应收金额,已收金额,未收金额,本次收款)
发票资料(单位,房租,电费,水费,物业)
权限资料(用户,密码,房源管理,租房管理,水电管理,交费管理,发票管理,系统维护) 其中系统管理员,有权进行系统维护;单位内部物业主管,有权进行物业资源调配、单元出 租,退租和收款开票操作;物业管理员,有权进行水电处理和收款处理等操行;租户代表, 有权进行种类费的查询操作
题目15:机房收费管理系统(1 人)7,34
包括四大模块:
登录模块
上机管理模块 说明:上机登记时,余额不足 3 元或卡处于挂失状态,则拒绝登记 每位同学的一次上机形成一条记录,每 36S 遍历一次上机记录表,对表中所有正上机字段为 TRUE 的记录的上机用时增加 36S,同时从上机卡表的余额减少
上机卡管理模块
充值挂失模块
查找统计模块:统计某天上机的总时数、每次上机的平均时数和机房的收入;某学 生上机的次数、上机总时数、每次上机平均时间;挂失和查询余
参考数据如下:
上机卡(卡号,姓名,专业班级,余额,状态) 状态的取值有:正常(能自费上机)
挂失上机记录(卡号,上机日期,开始时间,上机用时,正上机,管理号代码),上机用时记录学生上机时间(S);正上机是一个布尔型,为 True 表示正上机,每 36 秒刷新 其上机用时并扣除上机费用,为 False 表示上机结束。上机记录表永久保存,用于事后查询 和统计 管理员(代码,姓名,口令)
题目16:高校药房管理(1 人)31
包括四大模块:
基础数据处理:包括医生和药剂师名单的录入,修改,删除及查询
营业数据处理:包括药品进货上柜,处理划价,配药,柜存药品查询,处方综合查 询,交接班结转清。
参考数据如下:
药品信息表(货号,货名,计量单位,进货数量,进货单价,出售单价,进货日期,收货人 和供应商)
处方信息(编号,患者姓名,医生姓名,药剂师姓名,处方日期,配药日期) 处方药品信息(处方编号,药品货号,计量单位,配药数量,销售单价,已配药否)
医生名单和药剂师名单表(姓名)
题目17:考勤管理系统(2 人)40
包括四大模块:
记录每个员工每天所有进入公司的时刻和离开公司的时刻。
每天结束时自动统计当天的工作时间
每天结束时自动统计当天迟到或早退的次数。
对于弹性工作制,每天结束时自动统计当月的工时,并自动算出当月欠缺或富余的 时间
每个月末统计该月的工作时间判断是束足够
每个月末统计该月的工作天数并判断是否足够
管理人员查询并修改工作时间(特殊情况下修改)
管理人员账户管理(如设置密码等)
管理人员设定早退及迟到的条件,每个月的工作时间
管理人员设定每个月的工作日期及放假日期
参考数据如下:
员工信息(工号,姓名,年龄,入职时间,职位,性别,密码)
配置信息(上班时间小时,上班时间分钟,下班时间小时,下班时间分钟,每天工作时间)
每月统计数据表(工号,姓名,剩余的时间,迟到的次数,早退的次数,工作天数)
每天统计信息表(工号,姓名,小时,分钟,动作,时间) 其中动作指的时入或离开公司
题目18:单位房产管理系统(2 人)33,10
包括四大模块:
系统模块:完成数据库维护、系统关闭功能
物业费用模块:完成本月物业的计费、历史资料查询和财务部门接口传送数据、物 业相关费用单价设置
房屋资源模块:对房屋资源进行添加、列表显示、查询
职工信息模块:对职工进行添加、列表显示、查询以及相应部门、职务进行维护
帮助模块:对用户使用本系统提供在线帮助
参考数据如下:
职工(编号,姓名,性别,参加工作时间,行政职务,专业技术职务,评上最高行政职务时 间,评上最高专业技术职务时间,双职工姓名,现居住房号,档案号,房产证号,所在部门 编号,是否为户主)
部门(编号,部门名称) 住房级别表(编号,级别,住房标准,控制标准,级别分类)
房产情况(编号,房号,使用面积,现居住人 id,上一个居住人 id,最早居住人 ID,阳台面积)
物业费用(编号,房号,水基数,水现在值,电基数,电现在值,燃气基数,燃气现在值, 当前年份,当前月份)
价格标准(编号,水单价,电单价,燃气单价)
题目19:标准化考试系统 (2 人)15,39
功能要求: 设计一个简单的标准化考试系统,仅有单项选择题、多项选择题和判断题功能即可。
包括四大模块:
题库管理:实现试题的录入、修改、删除功能;
考试子系统:能够实现考生做题、结果自动存入到数据库中,有时间提示;
选择身份(登录)功能:系统能够记录考生输入的登录信息及交卷信息;
自动评分功能:考生交卷后能自动评分;
查看成绩功能:能够查询考生相关信息(包含成绩等)。
参考数据如下:
其它可供选择的题目:
网上教务评教系统130,127,133 16
学生日常行为评分管理系统232,110,230
网上鲜花店 38
基于BS结构的工艺品销售系统12
基于BS结构的校园二手物品交易网站 37
大学生就业管理系统201,208,234
题库及试卷管理系统
数据库原理及应用
课程设计报告
题目: 课程设计选题管理系统
所在学院:
班级:
学号:
姓名: 李四
指导教师:
2011年12月 日
目录
一、 概述
二、需求分析
三、概念设计
四、逻辑设计
五、系统实现
六、小结
一、概述