文档详情

数据结构 实验报告 排序.doc

发布:2020-03-31约2.13千字共4页下载文档
文本预览下载声明
实验报告 实验目的: 掌握各种排序方法的排序过程; 了解一些排序算法的实现。 实验内容: 学生的考试成绩表由学生的学号、姓名和成绩组成,设计一个程序对给定的n个学生信息实现: 1.按分数高低排序,打印出每个学生在考试中的排名,分数相同的为同一名次,同一名次的学生按学号从小到大排列。 2.按照名次列出每个学生的名次、学号、姓名、成绩。 实验原理: 排序分为插入排序、交换排序、选择排序、归并排序等。插入排序又分为直接插入排序、其他插入排序和希尔排序;交换排序分为冒泡排序和快速排序;选择排序又分为简单选择排序和堆排序。不同的排序方法各有利弊,根据具体的情况选择合适的排序方法。 设计思想: 本程序采用简单选择排序的方法。程序中定义一个stu结构和student类。类中定义creat创建函数,selectgrade成绩排序函数,samegrade、selectnum成绩相同的按学号排序函数,print输出函数。按照选择排序的思想,先对成绩按照从高到低进行排序;然后寻找成绩相同的部分,对该局部元素的学号从小到大进行排序。然后调用输出函数,输出名次、学号、姓名、成绩。 实现部分: 源代码: #includeiostream.h struct stu { int num; char name[100]; int grade; }; class student { struct stu s[100]; int length; int start,end; public: student(){length=0;} void creat(); void selectgrade(); void samegrade(); void selectnum(); void print(); }; //创建顺序表 void student::creat() { cout请依次输入学生的学号、姓名、成绩。输入#结束:endl; int num; cinnum; while(num) {s[length].num=num; cins[length].name; cins[length].grade; cinnum; length++;}} //对成绩进行选择排序 void student::selectgrade() { stu temp; int i,j,k; for(i=0;ilength;i++) {k=i; for(j=i+1;jlength;j++) {if(s[j].grades[k].grade)k=j;} if(k!=i) {temp=s[i]; s[i]=s[k]; s[k]=temp; } } } //对成绩相同的学号进行选择排序 void student::samegrade() { int i,j; for(i=0;ilength;i++) {if(s[i].grade==s[i+1].grade) {for(j=length-1;;j--) {if(s[j].grade==s[i].grade)break;} start=i;end=j;i=j;} selectnum(); } } //对学号进行选择排序 void student::selectnum() { stu temp; int i,j,k; for(i=start;i=end;i++) {k=i; for(j=i+1;j=end;j++) {if(s[j].nums[k].num)k=j;} if(k!=i) {temp=s[i]; s[i]=s[k]; s[k]=temp; } } } void student::print() { int i,j=0,k=0; cout成绩从高到低依次为(成绩相同按学号从小到大排列)endl; cout名次 学号 姓名 成绩endl; for(i=0;ilength;i++) { if(i==0)coutk+1 s[i].num s[i].name s[i].gradeendl; else{if(s[i].grade==s[i-1].grade){j++;k=i-j;} else {j=0;k=i-j;} coutk+1 s[i].num s[i].name s[i].gradeendl;} } } int main() { student ss; ss.creat(); ss.selectgrade(); ss.samegrade(); ss.print(); } 测试用例1. 实验小节: 通过本程序的练习,对
显示全部
相似文档