- 目录
【第1篇 数据结构课程设计总结
数据结构课程设计总结篇一
本次课程设计,使我对《数据结构》这门课程有了更深入的理解。《数据结构》是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。
我的课程设计题目是线索二叉树的运算。刚开始做这个程序的时候,感到完全无从下手,甚至让我觉得完成这次程序设计根本就是不可能的,于是开始查阅各种资料以及参考文献,之后便开始着手写程序,写完运行时有很多问题。特别是实现线索二叉树的删除运算时很多情况没有考虑周全,经常运行出现错误,但通过同学间的帮助最终基本解决问题。
在本课程设计中,我明白了理论与实际应用相结合的重要性,并提高了自己组织数据及编写大型程序的能力。培养了基本的、良好的程序设计技能以及合作能力。这次课程设计同样提高了我的综合运用所学知识的能力。并对vc有了更深入的了解。《数据结构》是一门实践性很强的课程,上机实习是对学生全面综合素质进行训练的一种最基本的方法,是与课堂听讲、自学和练习相辅相成的、必不可少的一个教学环节。上机实习一方面能使书本上的知识变“活”,起到深化理解和灵活掌握教学内容的目的;另一方面,上机实习是对学生软件设计的综合能力的训练,包括问题分析,总体结构设计,程序设计基本技能和技巧的训练。此外,还有更重要的一点是:机器是比任何教师更严厉的检查者。因此,在“数据结构”的学习过程中,必须严格按照老师的要求,主动地、积极地、认真地做好每一个实验,以不断提高自己的编程能力与专业素质。
通过这段时间的课程设计,我认识到数据结构是一门比较难的课程。需要多花时间上机练习。这次的程序训练培养了我实际分析问题、编程和动手能力,使我掌握了程序设计的基本技能,提高了我适应实际,实践编程的能力。
总的来说,这次课程设计让我获益匪浅,对数据结构也有了进一步的理解和认识。
数据结构课程设计总结篇二
这学期开始两周时间是我们自己选题上机的时间, 这学期开始两周时间是我们自己选题上机的时间,虽然 上机时间只有短短两个星期但从中确实学到了不少知识。 上机时间只有短短两个星期但从中确实学到了不少知识。数 据结构可以说是计算机里一门基础课程, 据结构可以说是计算机里一门基础课程,但我觉得我们一低 计算机里一门基础课程 定要把基础学扎实, 定要把基础学扎实,然而这次短短的上机帮我又重新巩固了 c 语言知识,让我的水平又一部的提高。数据结构这是一门 语言知识 让我的水平又一部的提高。数据结构这是一门 知识, 纯属于设计的.科目,它需用把理论变为上机调试。
纯属于设计的科目,它需用把理论变为上机调试。它对我们 来说具有一定的难度。它是其它编程语言的一门基本学科。 来说具有一定的难度。它是其它编程语言的一门基本学科。 我选的上机题目是交叉合并两个链表,对这个题目, 我选的上机题目是交叉合并两个链表,对这个题目,我 觉得很基础。刚开始调试代码的时候有时就是一个很小的错 觉得很基础。刚开始调试代码的时候有时就是一个很小的错 调试代码的时候 误,导致整个程序不能运行,然而开始的我还没从暑假的状 导致整个程序不能运行, 态转到学习上,每当程序错误时我都非常焦躁, 态转到学习上,每当程序错误时我都非常焦躁,甚至想到了 放弃,但我最终找到了状态,一步一步慢慢来, 放弃,但我最终找到了状态,一步一步慢慢来,经过无数次 的检查程序错误的原因后慢慢懂得了耐心是一个人成功的 必然具备的条件! 同时,通过此次课程设计使我了解到, 必然具备的条件! 同时,通过此次课程设计使我了解到, 硬件语言必不可缺少,要想成为一个有能力的人,必须懂得 件语言必不可缺少,要想成为一个有能力的人, 硬件基础语言。在这次课程设计中, 硬件基础语言。
在这次课程设计中,虽然不会成功的编写一 个完整的程序,但是在看程序的过程中, 个完整的程序,但是在看程序的过程中,不断的上网查资料 以及翻阅相关书籍,通过不断的模索,测试,发现问题, 以及翻阅相关书籍,通过不断的模索,测试,发现问题,解决问题和在老师的帮助下一步一步慢慢的正确运行程序, 决问题和在老师的帮助下一步一步慢慢的正确运行程序,终 于完成了这次课程设计, 于完成了这次课程设计,虽然这次课程设计结束了但是总觉 得自已懂得的知识很是不足,学无止境, 得自已懂得的知识很是不足,学无止境,以后还会更加的努 力深入的学习。 力深入的学习。
【第2篇 2023年计算机二级《公共基础》知识总结:数据结构的基本概念
1.2 数据结构的基本概念
考点3 数据结构的定义
考试链接:
考点3在笔试考试中,是一个经常考查的内容,在笔试考试中出现的几率为70%,主要是以选择的形式出现,分值为2分,此考点为识记内容,读者还应该识记数据的逻辑结构和存储结构的概念。
数据结构作为计算机的一门学科,主要研究和讨论以下三个方面:
(1)数据集合中个数据元素之间所固有的逻辑关系,即数据的逻辑结构;
(2)在对数据元素进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构;
(3)对各种数据结构进行的运算。
数据:是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
数据元素:是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
数据对象:是性质相同的数据元素的集合,是数据的一个子集。
数据的逻辑结构是对数据元素之间的逻辑关系的描述,它可以用一个数据元素的集合和定义在此集合中的若干关系来表示。数据的逻辑结构有两个要素:一是数据元素的集合,通常记为d;二是d上的关系,它反映了数据元素之间的前后件关系,通常记为r。一个数据结构可以表示成
b=(d,r)
其中b表示数据结构。为了反映d中各数据元素之间的前后件关系,一般用二元组来表示。
数据的逻辑结构在计算机存储空间中的存放形式称为数据的存储结构(也称数据的物理结构)。
由于数据元素在计算机存储空间中的位置关系可能与逻辑关系不同,因此,为了表示存放在计算机存储空间中的各数据元素之间的逻辑关系(即前后件关系),在数据的存储结构中,不仅要存放各数据元素的信息,还需要存放各数据元素之间的前后件关系的信息。
一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序、链接、索引等存储结构。而采用不同的存储结构,其数据处理的效率是不同的。因此,在进行数据处理时,选择合适的存储结构是很重要的。
考点4 线性结构与非线性结构
考试链接:
考点4在笔试考试中,虽然说不是考试经常考查的内容,但读者还是对此考点有所了解,在笔试考试中出现的几率为30%,主要是以填空题出现的形式出现,分值为2分,此考点为识记内容。
根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大类型:线性结构与非线性结构。如果一个非空的数据结构满足下列两个条件:
(1)有且只有一个根结点;
(2)每一个结点最多有一个前件,也最多有一个后件。
则称该数据结构为线性结构。线性结构又称线性表。在一个线性结构中插入或删除任何一个结点后还应是线性结构。如果一个数据结构不是线性结构,则称之为非线性结构。
疑难解答:空的数据结构是线性结构还是非线性结构?
一个空的数据结构究竟是属于线性结构还是属于非线性结构,这要根据具体情况来确定。如果对该数据结构的算法是按线性结构的规则来处理的,则属于线性结构;否则属于非线性结构。
【第3篇 数据结构实验报告总结
数据结构实验报告总结
设计题目:模拟计算器程序
学生姓名:谢先斌
系 别:计算机与通信工程学院
专 业:计算机科学与技术
班 级:1班
学 号:541007010144
指导教师:卢冰 李晔
2012 年 6 月 21 日
郑州轻工业学院
课 程 设 计 任 务 书
题目 模拟计算器程序
专业、班级 计算机科学与技术10-01班 学号 541007010144 姓名 谢先斌
主要内容:
设计一个模拟计算器的程序,要求能对包含加、减、乘、除、括号运算符及sqr和abs函数的任意整型表达式进行求解。
基本要求:
要检查有关运算的条件,并对错误的条件产生报警。
主要参考资料:
严蔚敏 吴伟民 编著《数据结构(c语言版)》 清华大学出版社 第44页 3.1 栈、第52页3.2.5表达式求值
完 成 期 限: 2012年6月21日
指导教师签名:
课程负责人签名:
2012年 6月 21 日
一、 设计题目
模拟计算器的程序
设计一个模拟计算器的程序,要求能对包含加、减、乘、除、括号运算符及sqr和abs函数的任意整型表达式进行求解。
设计要求:要检查有关运算的条件,并对错误的条件产生报警。
二、 算法设计的思想
本程序设计主要是应用了栈,利用栈的“先进后出”原理,建立了两个栈,分别为运算符栈postack和运算数栈pdstack。算法的基本思想(参考课本p53页)是:
(1) 首先置操作数栈为pdstack空栈,表达式起始符为“=”,位运算符栈的栈底元素;
(2) 依次读入表达式中的每个字符,若是操作数则进入pdstack栈,若是运算符则和postack栈的栈定运算符比较优先权后作相应操作,直到整个表达式求值完毕(即postack栈的栈定元素和当前读入的字符均为“=” )。
三、 算法的流程图
本程序的流程如下附图1所示:
附图1 程序流程图
四、 算法设计分析
首先创建了两个栈:
typedef struct opstack //定义运算符栈
{
char opstack[ma__operator_num];
int top;
}opstack, _popstack;
typedef struct datastack //定义运算数栈
{
double stack[ma__data_num];
int top;
}datastack, _pdatastack;
来分别存放运算符和运算数。在两个结构体中均有一个top数据域,当top=-1时,表示该站为空栈。
定义一个evaluatee_pression_r函数来完成函数运算的主要功能:读入表达式,并计算结果。以下是对该函数的分析:
当一次运算开始时,分别调用initpopstack(popstack &postack)函数和initpdatastack(pdatastack &pdstack)函数分别对运算符栈和运算数栈进行初始化。调用pushopstack(postack, '=')函数来完成运算符栈栈低元素的设置。
通过pushopstack(popstack &postack, char ch)函数、
popopstack(popstack &postack, char &ch)函数、
pushdatastack(pdatastack &pdstack, double d)函数和popdatastack(pdatastack &pdstack, double &d)函数来分别完成运算符和运输数的进出栈操作。gettoppopstack(popstack &postack)函数和gettoppdatastack(pdatastack &pdstack) 函数主要是进行得到栈定元素的作用,特别是在对运算符栈优先级的比较中十分重要,其中还会调用isop(char &ch) 函数来区分读入的是运算符还是运算数。
changechar(char &c)函数当每次读入一个字符是都会调用一次,主要的作用就是完成不用区分a、s的大小的功能。
precede(char op1, char op2)函数主要是通过一个二维字符串数组来存放9种运算符的优先级比较的结果,每当读到一个运算符后就进行与运算符栈顶元素比较,通过返回的“<、>;、=”结果来进行下一步的操作:'<'表示栈顶元素优先级低,运算符进栈;'='表示脱括号并接受下一个字符;'>;'表示运算符和运算数各退栈一次并调用operate(double a, char theta, double b)函数(主要是对出栈的.运算符和运算数进行计算),最后将运算结果压入运算数栈pdstack。
当操作结束时运算数栈的栈顶元素就是计算结果,分别调用clearpopstack(postack)函数清空运算符栈、clearpdatastack(pdstack)函数清空运算数栈以待下一次继续进行相关操作。
print_user函数和e_it_e函数开始和结束时个调用一次,分别完成欢迎界面和退出界面的布置。main是本程序的主函数,主要通过while语句和switch语句来完成本程序的运行,当输入y(y)时调用evaluatee_pression_r函数完成计算,当输入n(n)时,调用e_it_e函数退出本程序的运行。
本程序还考虑到各种异常的处理,如运算时除数为0、被开方数为0等情况的出现,最终的处理是直接退出程序的运行。
五、 运行结果分析
1. 程序开始界面,如附图2:
附图2 开始界面
2.如下附图3,附图4分别是选择进入和退出程序界面:
附图3(在以下界面输入计算式即可运行出计算结果如附图5)
附图4 退出界面
附图5 运行界面
2. 对异常的处理
a) 对异常1除数为0,如输入“1+2/0=”程序将直接退出,如附图6:
附图6 异常1除数为0
b) 对异常2被开方数为负数,如输入“3+s(-9)=”程序将直接退出,如附图7:
附图7 异常2被开方数为负数
3.以下是对各种简单运算的运行结果,如附图8:
附图8 简单运算
3. 综合运算:如式子“1/2+a(7-8)-s(9_8)=”运行结果如附图9
附图9 综合运算
六、 收获及体会
本程序以c语言的栈的相关知识为基础,通过控制两个栈(运算数栈和运算符栈)的进出的栈操作,来实现对包含加、减、乘、除、括号运算符及sqrt和abs函数的任意整型表达式的求解运算。
从程序的编写来看,感觉这次自己真的学到了好多,特别是对程序的开发流程。从最初的选定程序,到最终的程序运行成功,让我感到如果是仅仅掌握课本上的知识是远远不能够很好的应用到实际的编程中去的。在这个过程中还需要我们更多的去考虑到实际条件的种种限制和约束。
我在写本程序的过程中也遇到了很多的问题,当然本程序的核心问题就是对两个栈的压出栈操作,需要做优先级判断,并要考虑什么时候进栈,什么时候出栈等操作。我采用了课本上第52-54页讲的通过一个二维字符串数组来控制比较“+-_、as=”共9个运算符的优先级控制。对异常,如除数为0、被开方数小于0等异常也进行了精心的处理。对操作过程中要用到的y、n、a、s等字符也进行了改进,最终本程序可以不区分大小写就完成相关操作。
总之,经过本次专业课程设计,让我掌握了开发应用软件的基本流程,运用所学编程技能的基本技巧,也让我初步了解了软件设计的基本方法,提高进行工程设计的基本技能及分析、解决实际问题的能力,为以后毕业设计和工程实践等打下良好的基础。相信通过这次的课程设计,我对所学的《数据结构(c语言版)》和各种编程语言都有了一个全新的认识。我也会积极吸取本次课程设计的经验,继续研究数据结构和所学的各种编程语言。
七、 源代码
# include
# include
# include
# include
# define ma__operator_num 100 //运算符栈数组长度
# define ma__data_num 100 //运算数栈数组长度
typedef struct opstack //定义运算符栈
{
char opstack[ma__operator_num];
int top;
}opstack, _popstack;
typedef struct datastack //定义运算数栈
{
double stack[ma__data_num];
int top;
}datastack, _pdatastack;
void initpopstack(popstack &postack) //初始化运算符栈
{
if( !(postack = (popstack)malloc(sizeof(opstack)))) //为运算符栈分配空间
{
printf('分配内存空间失败! ');
e_it(-1);
}
postack->;top = -1;
}
void initpdatastack(pdatastack &pdstack) //初始化运算数栈
{
if( !(pdstack = (pdatastack)malloc(sizeof(datastack)))) //为运算数栈分配空间
{
printf('分配内存空间失败! ');
e_it(-1);
}
pdstack->;top = -1;
}
void pushopstack(popstack &postack, char ch) //运算符进栈
{
postack->;opstack[++(postack->;top)] = ch;
}
void popopstack(popstack &postack, char &ch) //运算符出栈
{
ch = postack->;opstack[postack->;top];
postack->;top--;
}
void pushdatastack(pdatastack &pdstack, double d) //运算数进栈
{
++(pdstack->;top);
pdstack->;stack[pdstack->;top] = d;
}
void popdatastack(pdatastack &pdstack, double &d) //运算数出栈
{
d = pdstack->;stack[pdstack->;top];
pdstack->;top--;
}
void clearpopstack(popstack &postack) //清空运算符栈
{
postack->;top = -1;
}
void clearpdatastack(pdatastack &pdstack) //清空运算数栈
{
pdstack->;top = -1;
}
char gettoppopstack(popstack &postack) //获取运算符栈顶元素
{
return postack->;opstack[postack->;top];
}
double gettoppdatastack(pdatastack &pdstack) //获取运算数栈顶元素
{
return pdstack->;stack[pdstack->;top];
}
bool isop(char &ch) //区分 运算符 和 运算数 的函数,是运算符时返回true,否则返回false
{ //判断是否为符号
if ( (ch == '+') || (ch == '-') || (ch == '_') || (ch == '/') || (ch == '=') || (ch == 'a') || (ch == 's') || (ch == 'a') || (ch == 's') || (ch == '(') || (ch == ')') )
return true;
else
return false;
}
char precede(char op1, char op2) //参考《数据结构》(c语言版)第53页 3.2.5表达式求值 表 3.1
{
char tab[9][10]; //定义字符串的二维数组来存放运算符优先级的关系
strcpy( tab[0], '>;>;<<<>;<<>;' );
strcpy( tab, '>;>;<<<>;<<>;' );
strcpy( tab, '>;>;>;>;<>;<<>;' );
strcpy( tab[3], '>;>;>;>;<>;<<>;' );
strcpy( tab[4], '<<<<<=<
strcpy( tab[5], '>;>;>;>;e>;>;>;>;' );
strcpy( tab[6], '>;>;>;>;<>;>;>;>;' );
strcpy( tab[7], '>;>;>;>;<>;>;>;>;' );
strcpy( tab[8], '<<<<
printf(' | ___欢迎您的下次使用!谢谢!!!___ | '); //退出使用
printf(' |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| ');
}
double operate(double a, char theta, double b) //对出栈的运算符和运算数进行计算
{
double s;
switch(theta)
{
case '+':
s = a + b;
break;
case '-':
s = a - b;
break;
case '_':
s = a _ b;
break;
case '/':
if ( b != 0 ) //判断除数是否为0,若为0,退出程序
{
s = a/b;
break;
}
else
{
printf(' #### 除数为0,非法运算。程序终止! #### ');
e_it_e; //打印结束菜单
e_it(-1);
}
case 'a':
s = fabs(b); //调用fabs函数
break;
case 's':
if( b >;= 0) //判断被开方数是否为0,若为0,退出程序
{
s = sqrt(b); //调用sqrt函数
break;
}
else
{
printf(' #### 求负数的平方根是非法运算。程序终止! #### ');
e_it_e; //打印结束菜单
e_it(-1);
}
}
return s;
}
char changechar(char &c) //通过changechar函数来把a、s的小写字母改为大写的
{
if( c == 'a' )
c = 'a';
else if( c == 's' )
c = 's';
return c;
}
//参考《数据结构》(c语言版)第53页 3.2.5表达式求值算法3.4 evaluatee_pression_r函数
void evaluatee_pression_r //计算函数:读入表达式,并计算结果
{
popstack postack; //声明运算符栈
pdatastack pdstack; //声明运算数栈
double result; //存运算的结果
char _, theta, c; //c存放读取的字符,_、theta存放运算符栈的栈顶元素
int flag, data; //标识符,用来读入连续的数字
double s;
double getd; //存放gettopx__的结果
double a, b, cc; //a,b存放数据栈出栈的栈顶元素, c存放运算结果
flag = 0; //初始化标识符,用来判断字符串中的连续数字
data = 0; //
initpopstack(postack); //初始化运算符栈
initpdatastack(pdstack); //初始化运算数栈
pushopstack(postack, '='); //在运算符栈底放入'='
printf(' &请输入表达式以'='结束:');
c = get); //读入字符
changechar(c); //通过调用函数来实现把小写的a、s改为大写的a、s
while( c != '=' || gettoppopstack(postack) != '=')
{
if( !isop(c) ) //不是运算符进栈
{
s = c - '0'; //把字符转化为数字
if ( flag == 1 )
{
popdatastack(pdstack, getd);
s = getd_10 + s;
}
pushdatastack(pdstack, s);
flag = 1;
c = get);
changechar(c);
}
else
{
flag = 0;
switch( precede(gettoppopstack(postack), c) ) //输入元素和运算符栈顶元素比较
{
case '<': //栈顶元素优先级低
pushopstack(postack, c);
c = get);
changechar(c);
break;
case '=': //托括号并接受下一个字符
popopstack(postack, _);
c = get);
changechar(c);
break;
case '>;': //退栈并将运算结果进栈
popopstack(postack, theta);
popdatastack(pdstack, b);
popdatastack(pdstack, a);
cc = operate(a, theta, b);
pushdatastack(pdstack, cc);
break;
}//switch
}//else
}//while
result = gettoppdatastack(pdstack); //运算结束时,运算数栈的栈底元素就是计算结果
clearpopstack(postack); //清空运算符栈
clearpdatastack(pdstack); //清空运算数栈
printf(' ->;计算结果为:%.2f ', result); //输出运算结果
return ;
}
void print_user //欢迎界面
{
printf(' 欢迎使用c语言版模拟计算器 ');
printf('________________________________________________________________________ ');
printf(' |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| ');
printf(' | 模拟计算器使用说明 | ');
printf(' | 作者:谢先斌 | ');
printf(' | 本程序包括对'+'、'-'、'_'、'/'、''的运算 | ');
printf(' | 本程序中abs算用a替代、sqrt运算用s代替 | ');
printf(' | 本程序中的一切字母均不区分大小写 | ');
printf(' 正确的表达式如:1+a(7-8)+s(9_8)= ');
printf(' | 输入'='表示表达式输入结束!! | ');
printf(' | 欢迎使用!!!-->;-->; | ');
printf(' |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| ');
printf('________________________________________________________________________ ');
}
int main //主函数
{
char in;
bool b; //标识符,用来标识是否结束程序
b = true; //初始化,不结束
print_user; //打印欢迎界面
printf(' _请确认使用计算器y/n:');
while(1)
{
scanf('%c', &in); //确认是否继续操作
get); //吃掉会车,避免干扰
switch(in)
{
case 'y':
case 'y':
{
evaluatee_pression_r; //进入计算函数:读入表达式,并计算结果
break;
}
case 'n':
case 'n':
{
e_it_e;
b = false;
break;
}
//default:
// printf(' __输入错误,请重新输入y/n:');
// break;
}
if(b==false) //如果 b==false ,退出整个程序
break;
printf(' _您确定要继续使用计算机y/n:');
get); //用getchar吃掉回车,避免对后续输入中in的干扰
}
return 0;
}