数据库大作业
- 格式:doc
- 大小:687.50 KB
- 文档页数:17
摘要1968年美国的唐纳德教授出版的《计算机程序设计艺术》第一卷《基本算法》,首次系统的阐述了数据结构的主要内容,即数据的逻辑结构、存储结构、及对数据的操作。
现在数据结构不仅是计算机科学与技术的核心课程,同时也是很多与计算机有关的专业的一门重要的选修课或必修课。
数据库结构是组织和访问数据的系统方法,是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。
一个数据结构是由数据元素依据某种逻辑联系组织起来的。
对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。
一个逻辑数据结构可以有多种存储结构,且各种存储结构影响数据处理的效率。
在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。
许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。
许多时候,确定了数据结构后,算法就容易得到了。
有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。
不论哪种情况,选择合适的数据结构都是非常重要的。
本次课程设计的主要目的是利用单向循环链表存储结构模拟joseph环报数过程,并且按照出列的顺序输出各个人的编号。
其次以学生成绩为数据元素建立一个一维数组,统计每位学生的平均成绩,并利用冒泡排序。
关键字:数据结构,系统方法, joseph环,冒泡排序目录摘要 (1)第一章课题 (3)1.1joseph环 (3)1.2以学生成绩为数据元素建立一个一维数组。
(3)第二章程序概要设计 (4)1.1基本思路 (4)1.1.1joseph环 (4)1.1.2一维数组 (4)1.2程序流程图 (5)1.2.1joseph环设计流程图 (5)1.2.2一维数组流程图 (6)第二章详细设计 (7)2.1joseph环 (7)2.2一维数组 (7)第三章调试分析 (9)3.1joseph环 (9)3.2一维数组 (10)第四章总结 (12)4.1遇到的问题或错误 (12)4.2总结 (12)附录 (13)参考文献 (17)第一章课题1.1joseph环任务:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。
设计一个程序来求出出列顺序。
要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。
测试数据:n=7 ,7个人的密码依次为3,1,7,2,4,7,4,首先m=6,则正确的输出是什么?要求:输入数据:建立输入处理输入数据,输入m的初值,n ,输入每个人的密码,建立单循环链表。
输出形式:建立一个输出函数,将正确的输出序列1.2以学生成绩为数据元素建立一个一维数组。
一个学生的成绩信息包括学号、姓名以及数学、语文、英语3科的成绩。
程序中预定义10位同学的成绩,这些记录按学号有序。
在程序中实现下列功能:(1)统计每位同学3门课程的平均成绩;(2)按平均成绩高低进行冒泡排序并显示结果。
第二章程序概要设计1.1基本思路1.1.1joseph环利用单向循环链表存储结构模拟此过程,因为循环链表最后一个结点的指针域指向头结点,整个链表形成一人环,刚好和题中的“n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)”内容要求一致,而且,循环链表中任一结点出发均可找到表中其他结点,利用这一优点可较容易地找出报数的人及下一个报数的人,最后按照出列的顺序用一个for语句实现。
循环链表的存储结构如下:typedef struct LNode{int password; //密码int No; //序号struct LNode *next; //下一成员指针}LNode,*Link; //组成成员结构体1.1.2一维数组先定义结构体struct stu{int num;char *name;float score[3];}先统计学生成绩,再算出平成绩,然后再利用冒泡排序。
1.2程序流程图Array1.2.1joseph1.2.2一维数组流程图第二章详细设计2.1joseph环创建joseph环,实现数据的输入:LinkList* CreateList_L(LinkList *L,int z)//返回LinkList类型struct LNode{int key,i;LinkList p,q;(*L)=(LinkList)malloc(sizeof(LNode)); //L指向首地址q = (*L);q->next = NULL;for(i=1;i<=z;i++){p=(LinkList)malloc(sizeof(LNode));q->next = p;p->next = NULL;//必须保持空p->data = i;printf("输入第%d个人的密码:",i);scanf("%d",&key);p->password = key;q = p;}*L = (*L)->next;//是删除L,L是否改变p->next = *L;//实现循环//p->next = (*L)->next;return L;//返回首地址}利用joseph环实现数据的输入,将数据和其密码输入。
2.2一维数组建立循环程序实现冒泡法:for(i=0;i<10;i++)//ave2[i]=ave[i];for(i=0;i<10;i++)for(j=0;j<10-i;j++)if(ave[j]<=ave[j+1]){t=ave[j];ave[j]=ave[j+1];ave[j+1]=t;}//最大的数向后排,进行交换来实现for(i=0;i<10;i++){for(j=0;j<10;j++)if(ave[i]==ave2[j])printf("%s\n",strdent[j].name);//输出名字printf("%f\n",ave[i]);//输出成绩}}将学生的成绩进行冒泡排序,排序中每次对相邻两个数据比较大小,发现逆序便进行交换,第一次外循环结束时最大者下沉到表的最后面,由于该数据已在其应在的位置上,下一轮排序不再考虑这个数据,只对未排好序的长度缩短了的表在进行上述过程,直至整个表排好序为止。
第三章调试分析3.1joseph环程序界面调试页面3.2一维数组程序界面调试结果页面第四章总结4.1遇到的问题或错误1.软件是英文版的,操作起来不太熟悉;2.对所需要的程序不是能够很好的掌握与运用;3.调试过程中遇到编译错误,不太会找错;4.2总结通过这次的数据结构课的课程设计,自己感觉有许多收获。
以前也用过C 语言知道一些流程步骤,通过这次课程设计使我对C语言的使用更加熟练,对本学期所学的知识有一个更好的了解。
在这次实验中遇到过一些困难,通过查阅书籍、上网浏览我获得很大的启发,我也有很多问题是在同学的帮助下解决的。
通过这次实验,对数据结构这门课程了解得更加深刻,它需要你一直地钻研。
当你深入了解时,你会发现其实也十分有趣。
我们可能还处于初级阶段,我们还需努力学习,掌握更多知识。
所以无论做什么都应该本着一种钻研的态度,这样就会收获很多,学到一些平时学不到的技能。
同时通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
附录joseph环:#include<stdio.h>#include<stdlib.h>#define ElemType int#define OK 0#define OVERFLOW 0#define ERROR 0typedef struct LNode{int data;int password;struct LNode *next;}LNode, *LinkList;//创建约瑟夫环LinkList* CreateList_L(LinkList *L,int z)//返回LinkList类型struct LNode**可不可以去掉一个星{int key,i;LinkList p,q;(*L)=(LinkList)malloc(sizeof(LNode)); //L指向首地址q = (*L);q->next = NULL;for(i=1;i<=z;i++){p=(LinkList)malloc(sizeof(LNode));q->next = p;p->next = NULL;//必须保持空p->data = i;printf("输入第%d个人的密码:",i);scanf("%d",&key);p->password = key;q = p;}*L = (*L)->next;//是删除L,L是否改变p->next = *L;//实现循环//p->next = (*L)->next;return L;//返回首地址}//对单循环链表进行操作Operate(LinkList L,int h,int n){int i = 1,j;LinkList J;for(i =1;i<n;i++){for(j =1;j<h;j++){J=L;L=L->next;}J->next = L->next;printf("第%d个出列的人的编号是:%d 密码是:%d\n",i,L->data,L->password);h = L->password;L = L->next;}i = L->password;j = L->data;printf("最后一个出局的人的编号是:%d 密码是:%d/n",j,i);}void main(){LinkList I,*k;int n,m;printf("输入参加人数n");scanf("%d",&n);printf("起始报数的上限值m");scanf("%d",&m);k = CreateList_L(&I,n);//返回值L的首地址I = *k;//?欲把操作的首地址再指向约瑟夫环的首地址printf("输出结果为:\n");Operate(I,m,n);}学生成绩:#include<stdio.h>struct str{int num; //用于存储学号char *name;//用于存储姓名float score[3];//用于存储三科的成绩}strdent[10]={{101,"张",70,87,90},{102,"李",71,81,61},{103,"王",72,82,92},{104,"张",73,83,73},{105,"赵",94,84,94},{106,"陈",75,45,95},{107,"六",75,76,77},{108,"马",76,86,96},{109,"周",79,89,99},{110,"冯",82,80,60}//建立长度为10的数值存放所有学生的信息};main() //运行主程序{int i,j;//声明两个int型的变量float ave[10],ave2[10],s[10],t;//声明for(i=0;i<10;i++)//建立循环程序s[i]=0;//初始化for(i=0;i<10;i++){for(j=0;j<3;j++)s[i]+=strdent[i].score[j];//三科成绩相加ave[i]=s[i]/3;//算出平均成绩}printf("每个同学的平均成绩\n");//输出“每个同学的平均成绩”for(i=0;i<10;i++)//建立循环输出程序{printf("%s\n",strdent[i].name);//输出名字printf("%f\n",ave[i]);//输出平均成绩}printf("最终平均成绩排名\n");//输出:最终平均成绩排名成绩for(i=0;i<10;i++)//建立循环程序实现冒泡法ave2[i]=ave[i];for(i=0;i<10;i++)for(j=0;j<10-i;j++)if(ave[j]<=ave[j+1]){t=ave[j];ave[j]=ave[j+1];ave[j+1]=t;}//最大的数向后排,进行交换来实现for(i=0;i<10;i++){for(j=0;j<10;j++)if(ave[i]==ave2[j])printf("%s\n",strdent[j].name);//输出名字printf("%f\n",ave[i]);//输出成绩}}参考文献[1]、王昆仑。