1.2实验报告(文档)书写规范实验报告(文档)应包括以下7个方面的内容:1、问题分析根据对实验任务的理解,以无歧义的陈述说明程序设计的任务,强调的是程序要做什么。
指出解决问题的关键步骤,如果问题复杂,应将问题分解成若干个子问题。
明确规定:(1)本实验的任务以及程序所能达到的功能;(2)完成该任务需要解决的关键问题;(3)程序设计中输入数据的类型、形式及输入值的范围;(4)设置测试数据:包括正确的输入及预计的输出结果和含有错误的输入及预计输出结果。
2.概要设计针对问题分析中提出的关键问题进行分析(可以列举实例进行分析),从而总结出关键问题的解决思路,给出解决关键问题的算法思想。
说明本程序中用到的所有程序模块、各程序模块之间的层次(调用)关系以及主程序的流程,各程序模块使用中文名称即可。
3.详细设计根据概要设计中提出的关键问题的解决思路,设计本程序中用到的所有数据结构,要求做到:(1)在所设计的数据结构下分析关键问题的具体解决方案和步骤,给出相应的用类C 语言描述的算法;(2)分析设计程序中需要用到的变量、全局变量及其数据类型定义;(3)设计程序中的所有模块(自定义函数和主函数),通过分析定义函数的类型、描述函数参数、说明函数名称,并给出相应类C语言描述的算法(类C语言算法达到的详细程度建议为:按照该算法可以直接写出高级程序设计语言程序);(4)画出函数和过程的调用关系图。
4.调试分析程序调试主要实现程序的语法错误检查和功能性错误检查。
调试最好分模块进行,自底向上,即先调试低层过程或函数。
在实验报告中应有如下内容:(1)记录调试过程中遇到的问题及其解决方案,如果由此反映出程序设计的不足,应对设计与实现进行回顾讨论和分析,并修正;(2)算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想;(3)经验和体会等。
5.测试结果将程序的测试结果截图,展示出你的测试过程和结果,包括输入和输出。
这里的测试数据应该完整和严格,最好多于问题分析中所列。
6.附录带注释的源程序。
如果提交源程序电子档,可以只列出程序文件名的清单。
值得注意的是,实验报告文档的前三部分要在程序开发的过程中逐渐充实形成,而不是最后补写。
实验一算法设计:(1)用指向指针的指针的方法对n个整数排序并输出。
要求将排序单独写成一个函数,n 和各整数在主函数中输入,最后在主函数中输出。
(2)编程求出10000以内的所有符合如下条件的数:其高位数字小于低位数字。
如25,349,2468等,但32,845不符合条件。
(3)编程求出数列的所有升或降的最大子序列。
如数列(1,20,30,12,3,5,7,4,6,100,11,8)的所有升或降的最大子序列如下:(1,20,30),(30,12,3),(3,5,7),(7,4),(4,6,100),(100,11,8)实验二顺序表实验【实验任务】1、程序验证(1)建立含有若干个元素的顺序表,并实现顺序表的插入、删除、查找等操作。
(2)阅读下列程序,指出算法的功能,写出其运行结果,并通过运行来验证。
#include “malloc.h”#define maxlen 50typedef struct{int data[maxlen];int last;3我}Sequenlist;Sequenlist *ABC(Sequenlist *A , Sequenlist *B){int i, j;Sequenlist *C;C = malloc(sizeof(Sequenlist));C->last = -1;for(i=0; i<=A->last; i++)for(j=0; j<=B->last; j++) {if(A->data[i]= = B->data[j]) {C->last++;C->data[C->last] = A->data[i];break;}return C;}Sequenlist *SqLset( ){Sequenlist *L;int i;L=malloc( sizeof(Sequenlist));L->last = -1;scanf(“%d”, &i); //输入表长if( i>0) {for(L->last=0; L->last <i; L->last ++)scanf(“%d”, & L->data[L->last]);L->last--;}return ( L);}main( ) {Sequenlist *A , *B, *C;int i;A = SqLset( );B = SqLset( );C = ABC(A, B);for(i=0; i<=C->last; i++)printf(“%4d”, C->data[i] );}(3)下面算法的预定功能是实现顺序表的倒置,试检查其中是否有错;若有错,指出错误所在,并修改之,然后通过运行来验证。
#include “malloc.h”#define maxlen 50typedef struct{int data[maxlen];int last;}Sequenlist;Sequenlist *SqLset( ){Sequenlist *L;int i;L=malloc( sizeof(Sequenlist));L->last = -1;scanf(“%d”, &i); //输入表长if( i>0) {for(L->last=0; L->last <i; L->last ++)scanf(“%d”, & L->data[L->last]);}return ( L);}Sequenlist *reverse(Sequenlist *L) {int i, j, x;for(i=0, j=L->last-i+1; i<= j; i ++ ) {x = L->data[i]; L->data[i]= L->data[j]; L->data[j]=x;}return ( L);}main( ) {Sequenlist *A;int i;A = SqLset( );for(i=0; i<=A->last; i++)printf(“%4d”, A->data[i] );printf(“\n”);A = Sequenlist ( );for(i=0; i<=A->last; i++)printf(“%4d”, A->data[i] );printf(“\n”);}2、算法填空请在下面算法的空格处填入适当内容,以使算法能求出顺序表中的最大和最小值,并通过运行来验证。
#include “malloc.h”#define maxlen 50typedef struct{int data[maxlen];int last;}Sequenlist;Sequenlist *SqLset( ){Sequenlist *L;int i;L=malloc( sizeof(Sequenlist));L->last = -1;scanf(“%d”, &i); //输入表长if( i>0) {for(L->last=0; L->last <i; L->last ++)scanf(“%d”, & L->data[L->last]);}return ( L);}void maxmin(Sequenlist *L) {int min, max, i;if( ) {max = min = L->data[0];for(i =1; i <= ; i ++) {if( max < L->data[i])max = L->data[i];if( min > L->data[i])min = L->data[i];}printf(“max=%d, min= %d\n”, max, min );}main( ) {Sequenlist *A;A = SqLset( );maxmin(A);}3、算法设计(1)设计算法实现删除顺序表中多余重复元素。
如:对于顺序表(1,2,3,1,3,4,3,5),删除第四个元素1及第五、第七个元素3。
(2)设计算法,实现在一个递增有序的顺序表的适当位置插入元素x,使得该顺序表仍然递增有序。
分析算法的时间复杂度。
实验三链表实验【实验任务】1、程序验证建立含有若干个元素的链表,并实现链表的插入、删除、查找等操作2、算法填空(1)下面建立以head为头指针的单链表,完善该算法,并输出表中元素。
已知单链表节点类型为:typedef struct node{int data;struct node *next;}LinkList;LinkList *create ( ){LinkList *p,*q;int k;q=head;scanf (“%d”,&k);while( k>0){;;;;scanf (“%d”,&k);}q->next = NULL;}(2)已给如下关于单链表的类型说明:typedef struct node{int data;struct node *next;}LinkList;以下程序采用链表合并的方法,将两个已排序的单链表合并成一个链表而不改变其排序性(升序),这里两链表的头指针分别为p和q。
完善该算法,输出合并后表中的元素。
LinkList *mergelink(LinkList *p,LinkList *q){LinkList *h,LinkList *r;;h->next= NULL;r=h;while( p!=NULL&&q!=NULL){if (p->data<=q->data){;r=p;p=p->next;}else{ ;r=q;q=q->next;}}if (p= =NULL) r->next=q;else ;return h;}(3)la为指向带头节点的单链表的头指针,本算法在表中第i个元素之前插入元素b。
完善该算法,并通过运行来验证。
LinkList *insert (LinkList *la,int i,datatype b){LinkList *p,*s;int j;p= ;j= ;while ( p!=NULL && ) {p = ;j=j+1;}if (p= =NULL || ) error (‘No this position’)else{s = malloc ( sizeof (LinkList) );s->data=b;s->next=p->next;p->next=s;}return la;}(4)已知双链表中节点的类型定义为:typedef struct Dnode{int data;struct Dnode *prior,*next;}DLinkList ;如下过程将在双链表第i个节点(i>=0)之后插入一个元素为x的节点。