软件技术实验报告
时间:2021-09-10 来源:博通范文网 本文已影响 人
软件技术实验报告
实验序号
一
名称
B VB 的感性认识 --B VB 基本控件
班级
学号
姓名
实验内容及完成情况:
实验内容:
1 1 )
在屏幕上开辟一个窗口(文本框),窗口的上部放置一个标签,标签中显示:“欢迎使用 0 Visual Basic6.0 中文版”。窗口的下部有三个按钮,左边按钮中标有“开始显示”,中间按钮中标有“清屏”,右边按钮中标有“结束”。当鼠标单击左边按钮时,文本框中显示“欲穷千里目,更上一层楼!”如果单击中间按钮,则清除文本框中显示的内容,单击右边按钮则程序结束。
2 2 )单击“清屏”后,让光标出 现在文本框中,此时往文本框中输入若干文字,例如“您好”,然后单击窗体,使得在窗体的指定位置上显示在文本框中输入的文字。
3 3 )如果将 1 1 )中单击左边按钮后文本框中显示的“欲穷千里目,更上一层楼!”改为“白日依山尽,黄河入海流,欲穷千里目,更上一层楼!”此时文本框在一行中将显示不下所有文本,请试调整该文本框的“ Multiline ”属性,并将文本框纵向距离调整到可容纳两行以上文字。此时再次执行程序,观察执行结果所发生的变化。
完成情况:顺利完成。
实验中遇到的问题及解决方法:
实验中所涉及的知识及技术:
文本框的双向作用(即输入与输出);窗体的双重作用(容器与输出);事件过程的编写;输入输出的简单实现;窗体、文本框、标签、命令按钮等基本控件的常用属性的动、静态设置等。
实验中的创新及功能扩充:
实验收获与体会:
备注:
文章信息量很大!
《软件开发技术基础》
实验报告
学院:XX学院
班级:XX
姓名: XX
学号:XX
《软件开发技术基础》实验报告
实验名称:实验一 顺序表的操作
班 级 学 号 姓 名 第 周 星 期 节 成 绩
一、实验目的:
1、掌握顺序表结构的实现方式;
2、掌握顺序表常用算法的实现;
3、熟悉利用顺序表解决问题的一般思路;
4、参照给定的顺序表的程序样例,验证给出的顺序表的常见算法,领会顺序表结构的优点和不足。
二、实验要求:
1、掌握顺序表的特点及常见算法。
2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。
三、实验内容:
1、设计一个静态数组存储结构的顺序表,要求编程实现如下任务:
(1)建立一个顺序表,首先依次输人整数数据元素(个数根据需要键盘给定)。 (2)删除指定位置的数据元素(指定元素位置通过键盘输入),再依次显示删除后的顺序表中的数据元素。
(3)查找指定数据的数据元素(指定数据由键盘输入),若找到则显示位置,若没有找到则显示0。
2、使用顺序表实现一个电话本的管理程序,电话本中的每条记录包括学号、姓名、手机号码和固定电话四项。要求实现菜单、初始化、添加、删除和显示等功能。
四、程序要求:
1、采用顺序表实现,假设该顺序表的数据元素个数在最坏情况下不会超过50个。
2、写出完整的程序并能调试运行。
五、实验结果:
1、顺序表的结果:
2、电话簿的结果:
六、实验中遇到的问题及解决方法:
1.在删除数据的时候如果有两个一样的数时要怎样解决? 解决方法:用while进行判断。
2.在删除操作中,删除函数中的l是指针,所以用->指向,而在主函数中l是结构体,用“.”。 3.在查找的时候有一个返回值,而这个返回值是指针,所以在写查找函数的时候要把返回值类型写上。
七、实验心得体会:
一开始不知所措,首先应该有一个大的方向,把主程序编号,再逐步求精,落实到每一个函数的编写。对于c语言要熟练掌握,要熟悉循环等得操作,要熟练掌握顺序表中的插入,删除,查找,的基本函数。在此的基础上灵活使用。 附:
1、顺序表的程序: #include #include #include #include #define MAXSIZE 50
struct Seqlist {
}; Seqlist *init() {
} void insert(Seqlist *p) {
int num=0; printf("请输入要键入的个数:"); scanf("%d",&num); if(numlength=0; return p; int data[MAXSIZE]; int length; else {
printf("键入数据为:\\\\n"); for(;num>0;num--) { p->length++; scanf("%d",p->data+p->length-1);
}
}
} if(p->length==MAXSIZE) {
} printf("数组已满\\\\n"); break; getchar(); void deletee(Seqlist *p) {
} int find(Seqlist *p) { int i=0; printf("请输入要删除元素的位置:"); scanf("%d",&i); if(ip->length) printf("表中没有第%d个元素!\\\\n",i); else {
} getchar(); for(int j=i;jlength-1;j++) p->data[j-1]=p->data[j]; p->length--;
} int x; printf("请输入要查找的数据:"); scanf("%d",&x); for(int i=0;i
} if(i>=p->length) printf("数组中没有此数据!\\\\n"); if(p->data[i]==x) {
} printf("此数据位于第%d个位置\\\\n",i+1); return i+1; getchar(); return 0; void display(Seqlist *p) {
} int main(void) { Seqlist *p; for(int i=0;i
p=init(); char flag; printf("1-插入 2-删除 3-查找 4-显示 0-退出\\\\n"); while(1) {
printf("请输入操作:"); switch(flag=getchar()) { case \\"1\\":insert(p);putchar(\\"\\\\n\\");break; case \\"2\\":deletee(p);printf("删除后数据为:");display(p);putchar(\\"\\\\n\\");getchar();break; case \\"3\\":find(p);putchar(\\"\\\\n\\");getchar();break; case \\"4\\":printf("显示数据为:");display(p);putchar(\\"\\\\n\\");break; case \\"0\\":free(p);return 0; }
}
}
2、电话簿的程序: #include #include #include #include using namespace std; typedef struct contact {
string name; string phonenumber; string phone; contact *next; }CNT; cla Phonebook { public:
Phonebook(); CNT *Input(); CNT *Turn_to_end(); void Add(); void Delete(); void Showmenu(); CNT *Find(); void Show_item(CNT *p); void Display(); void Modification(); private: };
Phonebook::Phonebook() { head=new CNT; CNT *head;
} head->next=NULL; void Phonebook::Show_item(CNT *p) { coutnamephonenumberphone
}
void Phonebook::Display() {
CNT *p; coutnext;p!=NULL;p=p->next) coutnamephonenumberphone
}
cout
CNT *Phonebook::Input() {
}
CNT *Phonebook::Turn_to_end() {
} CNT *temp=head; while(temp->next!=NULL) { } coutnext; CNT *temp; temp=new CNT; cout>temp->name; cout>temp->phonenumber; cout>temp->phone; temp->next=NULL; cout
void Phonebook::Add() {
}
void Phonebook::Delete() {
CNT *p,*q; q=p=head; string data; cout>data; for(p=p->next;p!=NULL&&p->name!=data&&p->phonenumber!=data&&p->phone!=data;CNT *temp,*p; temp=Input(); p=Turn_to_end(); p->next=temp; coutnext)
q=p; if(p!=NULL) { q->next=p->next; delete p;
} } else cout
}
CNT *Phonebook::Find() {
CNT *p=head; string data; cout>data; for(p=p->next;p!=NULL&&p->name!=data&&p->phonenumber!=data&&p->phone!=data;coutnext);
if(p!=NULL) Show_item(p); else
} cout
}
int main() { int select; Phonebook phbook; CNT *p; p=Find(); if(p!=NULL) {
} cout>p->name; cout>p->phonenumber; cout>p->phone;
phbook.Showmenu(); while(1) {
cout>select; getchar(); switch(select) { case 0: exit(0); break; case 1: phbook.Add(); break; case 2: phbook.Display(); break; case 3: phbook.Delete(); break; case 4: phbook.Find(); break; case 5: phbook.Modification(); break;
} } } return 0;
实验名称:实验二 链表的操作
(一)
班 级 学 号 姓 名 第 周 星 期
节 成 绩
一、实验目的:
1、掌握单链表结构的实现方式;
2、掌握单链表常用算法的实现。
二、实验要求:
1、掌握链表的特点及常见算法。
2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。
三、实验内容:
1、设计一个链表,要求编程实现如下任务:
(1)建立一个链表,首先依次输人整数数据元素(个数根据需要键盘给定)。 (2)删除指定值的结点(指定值通过键盘输入),再依次显示删除后的链表中的数据元素。
(3)查找指定值的结点(指定数据由键盘输入),若找到则显示查找成功,若没有找到则显示查找失败。
(4) 在第i个节点(i由键盘输入,i=0表示插入的结点作为第1个结点)之后插入一个元素为x的节点。
四、程序要求:
1、采用链表实现,假设该链表的结点数在最坏情况下不会超过40个。
2、写出完整的程序并能调试运行。
五、实验结果:
六、实验中遇到的问题及解决方法: 问题:在查找数据时显示的是一样的?
解决方法:在查找函数前要标明返回值的类型lnode *find。
七、实验心得体会:
首先要把书上的关于单链表的定义理解,在这个的基础上使用它。单链表通过结点在数据后附加后继元素的指针信息,可以更灵活的添加,删除,查找,插入,元素。要清楚指针的指向。首先要定义一个头结点,并且指针域要为空。将各个操作分别编写函数,有利于分块使用而且可以多次使用。 附:
#include int a[50],leng=0; void delet(); void chazhao(); void main()
{ cout>leng; cout>a[i]; int y; cout>y; if(y==1) delet();cout>i; if(i>=leng) { cout
} for(int j=i;j>temp; for(int i=0;i
{
if(a[i]==temp) { x=i+1; cout
} } if(x==0) cout
实验名称:实验三 链表的操作
(二)
班 级 学 号 姓 名 第 周 星 期
节 成 绩
一、实验目的:
1、熟悉利用线性链表解决问题的一般思路;
2、参照给定的链表的程序样例,验证给出的链表的常见算法,了解单链表结构的优点和不足。
二、实验要求:
1、熟练掌握链表的使用,并能运用其解决些常规问题。
2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。
三、实验内容:
1、使用链表实现一个电话本的管理程序,电话本中的每条记录包括姓名和电话两项。要求实现菜单、初始化、添加、删除和显示等功能。
四、程序要求:
1、采用链表实现,假设该链表的结点数在最坏情况下不会超过40个。
2、写出完整的程序并能调试运行。
五、实验结果:
六、实验中遇到的问题及解决方法: 1.实验结果版面不好看
解决方法:反复调试执行,每次都对自己不满意的地方进行一些改正。 2.怎样比较name与s->name?
解决方法:用string.h中的strcmp函数。 3.在传递数据时有问题?
解决方法:返回的值要注意数据类型,是指针还是整数等。
七、实验心得体会:
在应用中可以利用while实现选择,并根据选择用switch来完成选择。为了简化编程,结点插入操作可仅仅在头部进行。单链表的方法使添加操作更加简便。不需要事先分配结点空间,而是在需要时动态的申请,节省了空间。、附:
#include #include #include #include typedef struct Student { char stu_number[12]; char stu_name[12]; char stu_phone[12]; struct Student *next; }STU;
void show_menu() { puts("1添加 2删除 3查找 4插入 5显示 0退出"); }
void show_item(STU *p) { printf("|编号| 学号 | 姓名 | 电话号码 |\\\\n"); printf("|1 |%-12s|%-12s|%-12s|\\\\n",p->stu_number,p->stu_name,p->stu_phone);
}
STU *init() { STU *p; p=(STU *)malloc(sizeof(STU)); p->next=NULL; return p; }
void display(STU *head) { int i; STU *p; p=head->next; printf("|编号| 学号 | 姓名 | 电话号码 |\\\\n"); for(i=1;p!=NULL;i++,p=p->next) {
printf("|%-4d|%-12s|%-12s|%-12s|\\\\n",i,p->stu_number,p->stu_name,p->stu_phone); } }
STU *turn_to_end(STU *head) { STU *p; for(p=head;p->next!=NULL;p=p->next); return p; }
STU *putin() { STU *temp; temp=(STU *)malloc(sizeof(STU)); printf("请输入姓名:"); gets(temp->stu_name); printf("请输入学号:"); gets(temp->stu_number); printf("请输入电话号码:"); gets(temp->stu_phone); temp->next=NULL; return temp; }
void add(STU *head) { STU *temp,*p; p=head; temp=putin(); p=turn_to_end(head); p->next=temp; }
STU *find(STU *head,int i) { STU *p; if(i
puts("输入错误"); else {
for(p=head;p->next!=NULL&&i>0;i--,p=p->next);
if(i>0)
{
puts("不存在该结点");
return NULL;
} } return p; } STU *find_stu(STU *head,char *data) { STU *p,*q; q=p=head; for(p=head->next;p!=NULL&&strcmp(p->stu_name,data)!=0&&strcmp(p->stu_number,data)!=0&&strcmp(p->stu_phone,data)!=0;p=p->next)
q=p; if(p!=NULL)
return q; else {
puts("不存在该信息");
return p; } } void delet(STU *head,char *data) { STU *p,*q; p=q=head; q=find_stu(head,data); if(q!=NULL) {
p=q->next;
q->next=p->next;
free(p); } } void insert(STU *head,int i)
{ STU *p,*q,*temp; q=p=head; if(i
puts("输入错误"); else if(i==0) {
temp=putin();
temp->next=p->next;
q->next=temp;
} else if(find(head,i)!=NULL) {
q=find(head,i);
p=q->next;
temp=putin();
q->next=temp;
temp->next=p; } else
return; }
int main(void) { STU *head,*temp; int selct,node; char data[12]; head=init(); show_menu(); while(1) {
printf("请选择操作:");
scanf("%d",&selct);
getchar();
switch(selct)
{
case 1:
add(head);
putchar(\\"\\\\n\\");
break;
case 2:
display(head);
printf("请输入要删除学生的学号、姓名或电话号码:");
}
scanf("%s",data);
getchar();
delet(head,data);
display(head);
putchar(\\"\\\\n\\");
break; case 3:
puts("请输入要查找的数据");
scanf("%s",data);
getchar();
if(temp=find_stu(head,data))
{
show_item(temp->next);
}
else
puts(" 不存在该信息");
putchar(\\"\\\\n\\");
break; case 4:
puts("请输入要插入结点的位置");
scanf("%d",&node);
getchar();
insert(head,node);
putchar(\\"\\\\n\\");
break; case 5:
display(head);
putchar(\\"\\\\n\\");
break; case 0:
exit(0);
break; } } return 0;
实验名称:实验四 栈的操作
班 级 学 号 姓 名 第 周 星 期 节
成 绩
一、实验目的:
掌握栈的的定义和运算,了解栈的应用。
二、实验要求:
1、掌握栈的特点及常见算法。
2、参照给定的栈的程序样例,验证给出的栈的常见算法。
3、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。
三、实验内容:
1、堆栈的测试和应用。要求:
设计一个主函数实现对顺序堆栈代码进行测试。测试方法为:依次把数据元素1,3,5,7,9入栈,然后出栈堆栈中的数据元素并在屏幕上显示。
四、程序要求:
1、栈的长度自行确定。
2、重点理解栈的算法思想,能够根据实际情况选择合适的存储结构。
3、写出完整的程序并能调试通过。
五、实验结果:
六、实验中遇到的问题及解决方法:
七、实验心得体会:
栈是后进先出表,只允许在栈顶进行插入和删除。要掌握顺序栈初始化,出栈,入栈的基本程序,在理解得基础上加以运用。要清楚栈和单链表的区别。 附:
#include #include using namespace std; cla Sqstack { private: int *data; int top; int maxsize; public: Sqstack(); void push(); void pop(int &); void display(); void modify(); }; Sqstack::Sqstack() { top=-1; maxsize=5; data=new int[maxsize]; }
void Sqstack::push() { int temp; if(top>=maxsize-1) {
cout
cout
cin>>temp;
top++;
*(data+top)=temp; }
}
void Sqstack::pop(int &e) { if(top>-1) {
e=*(data+top);
top--;
cout
cout-1) {
i=top;
for(;i>=0;i--)
cout
cout
void Sqstack::modify() { int temp; cout>temp; if(temp>0)
maxsize=temp; else
cout0"
int main() { Sqstack test; int temp,select; cout
cout
cin>>select;
switch(select)
{
case 1:
test.push();
break;
case 2:
test.pop(temp);
break;
case 3:
test.display();
break;
case 4:
test.modify();
break;
case 0:
exit(0);
break;
default:
cout
getch();
break;
} } return 0; }
实验名称:实验五 队列的操作
班 级 学 号 姓 名 第 周 星 期 节
成 绩
一、实验目的:
掌握队列的定义及其运算,了解队列的应用。
二、实验要求:
1、掌握队列的特点及常见算法。
2、参照给定的队列的程序样例,验证给出的队列的常见算法。
3、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。
三、实验内容:
1、队列测试和应用。要求:
设计一个主函数对循环队列代码进行测试。测试方法为:依次把数据元素2,4,6,8,10入队,然后出队中的数据元素并在屏幕上显示。
四、程序要求:
1、队列的长度由自行确定。
2、重点理解队列的算法思想,能够根据实际情况选择合适的存储结构。
3、写出完整的程序并能调试通过。
五、实验结果
六、实验中遇到的问题及解决方法:
七、实验心得体会:
队列是只允许在一端进行删除操作的线性表。在操作时会有假溢出的情况出现,可以将存放队列元素的数组守卫相接,形成循环队列。 即:rear=(rear+1)%m; Front=(front+1)%m 附:
#include #include using namespace std;
typedef struct Temp {
int data;
struct Temp *next; }T; cla Linksqueue { private: T *front,*rear; public: Linksqueue(); void Enqueue(); void Dequeue(T *); void display(); };
Linksqueue::Linksqueue() { front=rear=new(T); front->next=NULL; }
void Linksqueue::Enqueue() { T *temp; temp=new(T); cout>temp->data; temp->next=NULL; rear->next=temp; rear=temp; }
void Linksqueue::Dequeue(T *s) { T *temp; if(front->next!=NULL) {
temp=front;
front=front->next;
*s=*front;
coutdata
delete temp; }
else
cout
void Linksqueue::display() { T *temp; if(front==rear)
cout
cout ";
for(temp=front->next;temp->next!=NULL;temp=temp->next)
{
coutdata
}
coutdata;
coutrear"
int main() { Linksqueue temp; T * a; a=new(T); int select; cout
cout
cin>>select;
switch(select)
{
case 1:
temp.Enqueue();
break;
case 2:
temp.Dequeue(a);
break;
case 3:
temp.display();
break;
case 0:
}
exit(0);
break; default:
cout
getch();
break; } } return 0;
实验名称:实验六 二叉树的生成与遍历
班 级 学 号 姓 名 第 周 星 期
节 成 绩
一、实验目的:
1、熟悉二叉树节点的定义和生成方式;
2、熟悉二叉树链式结构的生成方式;
3、掌握二叉树遍历算法的实现。
二、实验要求:
1、掌握二叉树的常见算法。
2、参照给定的二叉树的程序样例,验证给出的有关二叉树的常见算法,并实现有关的操作。
3、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。
三、实验内容:
1.设计实现二叉树的建立及遍历算法,要求:
(1)编写创建二叉链式存储结构的二叉树程序并输出。 (2)编写递归实现二叉树的先序、中序、后序遍历算法。
(3)编写主函数测试以上二叉树的创建和遍历函数。 2.假设二叉树采用链式存储结构进行存储,编写程序实现二叉树的所有叶子结点的统计并输出统计个数。
四、实验结果:
五、实验中遇到的问题及解决方法:
调试的时候显示没有错误但是程序运行不出来? 在if语句中的相等要用“==”。要注意!!!
六、实验心得体会:
二叉树的遍历有先序,中序,后序遍历。这三种遍历都是用递归的形式实现的。而二叉树的插入结点的算法与许多因素有关,我们要在理解二叉树结构的基础上根据需要来编写程序。我在实验中使用的二叉排序树可以作为静态查找表使用也可以作为动态查找表。 附:
#include #include #include #define maxsize 1024 typedef char datatype; typedef struct node { datatype data; struct node *lchild, *rchild; }bitree; bitree *CREATREE() //建立二叉树函数,函数返回值指向根节点指针 { char ch; bitree *Q[maxsize]; int front,rear; bitree *root,*s; root=NULL;
front=1;rear=0; printf("请输入二叉树的各节点,@表示虚节点,#表示节点:\\\\n"); scanf("%c",&ch); while(ch!=\\"#\\") {
putchar(ch);
s=NULL;
if(ch!=\\"@\\")
{
s=(bitree *)malloc(sizeof(bitree)); s->data=ch;
s->lchild=NULL;
s->rchild=NULL;
}
rear++;
Q[rear]=s;
if(rear==1) root=s;
else
{if(s&&Q[front])
if(rear%2==0)
Q[front]->lchild=s;
else Q[front]->rchild=s;
if(rear%2==1)
front++;
}scanf("%c",&ch); } return root; } void preorder(bitree *p) { if(p!=NULL) {
printf("%c",p->data);
preorder(p->lchild);
preorder(p->rchild); } return; } void inorder(bitree *p) { if (p!=NULL) {
inorder(p->lchild);
printf("%c",p->data);
inorder(p->rchild); } return; } void postorder(bitree *p) { if(p!=NULL) {
postorder(p->lchild);
postorder(p->rchild);
printf("%c",p->data); } return; } int yzjd(bitree *t) { if(t==NULL)return(0); if (t->lchild==NULL&&t->rchild==NULL) return(1);
return(yzjd(t->lchild)+yzjd(t->rchild)); } void main() { bitree *root;root=CREATREE();
printf("\\\\n先序遍历结果如下:\\\\n"); preorder(root);printf("\\\\n中序遍历结果如下:\\\\n"); inorder(root);printf("\\\\n后序遍历结果如下:\\\\n"); postorder(root);printf("\\\\n叶子节点的个数为:%d\\\\n",yzjd(root));
printf("\\\\n"); } 实验名称:实验七 查找算法实现
班 级 学 号 姓 名 第 周 星 期
节 成 绩
一、实验目的:
掌握各种查找算法的特点,测试并验证查找常见算法。
二、实验要求:
1、参照各种查找算法程序样例,验证给出的查找常见算法。
2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。
三、实验内容:
1.建立有序表,采用折半查找实现某一已知的关键字的查找。
2.利用折半查找算法在一个有序表中插入一个元素,并保持表的有序性。
四、实验结果:
五、实验中遇到的问题及解决方法:
六、实验心得体会:
本实验使用的是折半法查找,优点是查找效率高,在编程的时候要设置low,high,mid,分别表示区间和中间位置的值。
附:
#include #include #include #include #define MAXSIZE 100 struct Seqlist {
};
Seqlist * init() int data[MAXSIZE]; int length;
{
}
void insert(Seqlist *p) {
int num=0; printf("请输入要键入的个数:\\\\n"); if(num
} int temp; for(int i=1;i
for(int j=0;j
if(p->data[j]>p->data[j+1]) {
} temp=p->data[j]; p->data[j]=p->data[j+1]; p->data[j+1]=temp; printf("请输入数据:\\\\n"); for(;num>0;num--) {
}
p->length++; scanf("%d",p->data+p->length-1); if(p->length==MAXSIZE) {
}
printf("数组已满\\\\n"); break; printf("输入个数有误\\\\n"); else Seqlist *p; p=(Seqlist *)malloc(sizeof(Seqlist)); p->length=0; return p; scanf("%d",&num);
} getchar(); int binsearch(Seqlist *p) {
} void display(Seqlist *p) {
}
int main(void) {
Seqlist *p; char flag; p=init(); int i; for(i=0;i } return 0; mid=(low+high)/2; if(key==p->data[mid]) { } else if(key } printf("1-插入 2-折半法查找 3-显示 0-退出\\\\n"); while(1) { } return 0; printf("请输入操作:"); switch(flag=getchar()) { case \\"1\\" : insert(p);break; case \\"2\\" : binsearch(p);break; case \\"3\\" : printf("所有数据为:");display(p);break; case \\"0\\" : free(p);return 0; } 实验名称:实验八 排序综合实验 班 级 学 号 姓 名 第 周 星 期 节 成 绩 一、实验目的: 参照各种排序算法程序样例,验证给出的排序常见算法。 二、实验要求: 1、掌握各种排序算法的特点,测试并验证排序的常见算法。 2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。 三、实验内容: 输入一组关键字序列分别实现下列排序,并将上述几种排序的算法编写成菜单,根据输入的数字不同执行对应的排序算法(任选两种排序方法实现)。 1、直接插入排序。 2、希尔排序。 3、冒泡排序。 4、直接选择排序。 5、快速排序。 6、堆排序。 7、归并排序。 8、基数排序。 四、实验结果: 五、实验中遇到的问题及解决方法: 怎样实现待排序数据长度从键盘输入? 解决方法:设置一个n,从键盘输入n的值。 六、实验心得体会: 排序的常用方法有直接插入排序,简单选择排序,冒泡排序,快速排序。我在实验中用了冒泡排序和快速排序,冒泡排序的程序比较简单容易理解而快速排序则比较复杂。快速排序要先划分序列然后建立在划分基础上进行排序,这个排序是由递归实现的。但是快速排序的优点是排序比较快。 附: #include #include #include #include #define MAXSIZE 100 struct Seqlist { int data[MAXSIZE]; int length; }; Seqlist * init() { Seqlist *p; p=(Seqlist *)malloc(sizeof(Seqlist)); p->length=0; return p; } void insert(Seqlist *p) { int num=0; printf("请输入要键入的个数:\\\\n"); scanf("%d",&num); if(num printf("输入个数有误\\\\n"); else{ printf("请输入数据:\\\\n"); for(;num>0;num--) { p->length++; scanf("%d",p->data+p->length-1); if(p->length==MAXSIZE) printf("数组已满\\\\n"); } } getchar(); } void bublesort(Seqlist *p) { int temp; for(int i=1;i for(int j=0;j if(p->data[j]>p->data[j+1]) { temp=p->data[j]; p->data[j]=p->data[j+1]; p->data[j+1]=temp; } } void insertsort(Seqlist *p) { int i,j,temp; for(i=1;i temp=p->data[i]; j=i; while(j>0&&temp { p->data[j]=p->data[j-1]; j--; } p->data[j]=temp; } } void display(Seqlist *p) { int i; for(i=0;i printf("%-5d",p->data[i]); putchar(\\"\\\\n\\"); getchar(); } int main(void) { Seqlist *p,*q; char flag; p=init(); q=(Seqlist *)malloc(sizeof(Seqlist)); q->length=0; printf("1-输入数据 2-直接插入排序 3-冒泡排序 4-显示 0-退出\\\\n"); while(1) { printf("请输入操作:"); switch(flag=getchar()) { case \\"1\\" : insert(p);break; case \\"2\\" : *q=*p;insertsort(q);printf("直接插入排序后的数据为:");display(q);break; case \\"3\\" : *q=*p;bublesort(q);printf("冒泡排序后的数据为:");display(q);break; case \\"4\\" : printf("原数据为:");display(p);break; case \\"0\\" : free(p);return 0; } } return 0; }
实在佩服作者的才华!