2011~2012第一学期数据结构实验报告
班级:信管一班
学号:201051018
姓名:史孟晨
实验报告题目及要求
一、实验题目
设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。
1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统),
输出实验结果。(15分)
2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学
生的学号、姓名和成绩。
3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。
二、实验要求
1.修改算法。将奇偶排序算法升序改为降序。(15分)
2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分))
3.编译、链接以上算法,按要求写出实验报告(25)。
4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。
5.用A4纸打印输出实验报告。
三、实验报告说明
实验数据可自定义,每种排序算法数据要求均不重复。
(1) 实验题目:《N门课程学生成绩名次排序算法实现》;
(2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性;
(3) 实验要求:对算法进行上机编译、链接、运行;
(4) 实验环境(Windows XP-sp3,Visual c++);
(5) 实验算法(给出四种排序算法修改后的全部清单);
(6) 实验结果(四种排序算法模拟运行后的实验结果);
(7) 实验体会(文字说明本实验成功或不足之处)。
三、实验源程序(算法)
Score.c
#include "stdio.h"
#include "string.h"
#define M 6
#define N 3
struct student
{ char name[10];
int number;
int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M];
void changesort(struct student a[],int n,int j)
{int flag=1,i;
struct student temp;
while(flag)
{ flag=0;
for(i=1;i
{ temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
flag=1;
}
for(i=0;i if (a[i].score[j]>a[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } } } void print_score(struct student a[],int n,int j) { int i,k; printf(“ 奇偶交换成绩 %d 排序表",j+1); printf("\n"); printf(" 名次学号姓名分数\n"); k=1; for(i=0;k { if(i>0&&a[i].score[j]!=a[i-1].score[j]) k++; p rintf(" %4d ",k); p rintf("%4d",a[i].number); p rintf(" %s",a[i].name); p rintf(" %6d",a[i].score[j]); p rintf("\n"); } } main() { int i,j,k; for (i=0;i { printf("请输入第 %d 名学生分数: ",i+1);printf("\n"); printf("姓名: "); s canf("%s",stu[i].name); printf("编号: "); scanf("%4d",&stu[i].number); printf("数据结构: "); scanf("%4d",&stu[i].score[0]); printf("离散数学: "); scanf("%4d",&stu[i].score[1]); printf("大学英语: "); scanf("%4d",&stu[i].score[2]); } for(i=0;i { stu[i].score[N]=0; for(j=0;j stu[i].score[N]+=stu[i].score[j]; } changesort(stu,M,N); /*对总分进行排序*/ printf(" 学生总分成绩排序表\n"); printf(" 名次学号姓名数据结构离散数学大学英语总分\n"); k=1; for(i=0;i { if(i>0&&stu[i].score[N]!=stu[i-1].score[N]) k++; printf("%4d",k); printf(" %4d",stu[i].number); printf(" %s",stu[i].name); for(j=0;j printf(" %6d",stu[i].score[j]); printf("\n"); } changesort(stu,M,0); /*对数据结构成绩进行排序*/ print_score(stu,M,0); /*输出数据结构前 3 名同学成绩*/ changesort(stu,M,1); /*对离散数学成绩进行排序*/ print_score(stu,M,1); /*输出离散数学前 3 名同学成绩*/ changesort(stu,M,2); /*对大学英语成绩进行排序*/ print_score(stu,M,2); /*输出大学英语前 3 名同学成绩*/ } 源代码结果: 请输入第1 名学生分数: 姓名: 史孟晨 编号: 01 数据结构: 87 离散数学: 90 大学英语: 78 请输入第2 名学生分数: 姓名: 袁欣 编号: 02 数据结构: 78 离散数学: 80 大学英语: 92 请输入第 3 名学生分数: 姓名: 赵宇 编号: 03 数据结构: 88 离散数学: 76 大学英语: 95 请输入第4 名学生分数: 姓名: 滕芷 编号: 04 数据结构: 79 离散数学: 84 大学英语: 88 请输入第5 名学生分数: 姓名: 张一析 编号: 05 数据结构: 78 离散数学: 68 大学英语: 91 请输入第6 名学生分数: 姓名: 白晓彤 编号: 06 数据结构: 88 离散数学: 76 大学英语: 90 学生总分成绩排序表 名次学号姓名数据结构离散数学大学英语总分 1 5 张一析78 68 91 237 2 2 袁欣78 80 92 250 3 4 滕芷79 84 88 251 4 6 白晓彤88 76 90 254 5 1 史孟晨87 90 78 255 6 3 赵宇88 76 95 259 奇偶交换成绩1 排序表 名次学号姓名分数 1 5 张一析78 1 2 袁欣78 2 4 滕芷79 3 1 史孟晨87 奇偶交换成绩2 排序表 名次学号姓名分数 1 5 张一析68 2 6 白晓彤76 2 3 赵宇76 3 2 袁欣80 奇偶交换成绩3 排序表 名次学号姓名分数 1 1 史孟晨78 2 4 滕芷88 3 6 白晓彤90 Press any key to continue #include "stdio.h" #include "string.h" #define M 6 #define N 3 void changesort(struct student a[],int n,int j); void print_score(struct student a[],int n,int j); struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; main() { int i,j,k; for (i=0;i { printf("请输入第%d 名学生分数: ",i+1);printf("\n"); printf("姓名: "); scanf("%s",stu[i].name); printf("编号: "); scanf("%4d",&stu[i].number); printf("数据结构: "); scanf("%4d",&stu[i].score[0]); printf("离散数学: "); scanf("%4d",&stu[i].score[1]); printf("大学英语: "); scanf("%4d",&stu[i].score[2]); } for(i=0;i { stu[i].score[N]=0; for(j=0;j stu[i].score[N]+=stu[i].score[j]; changesort(stu,M,N); /*对总分进行排序*/ printf(" 学生总分成绩排序表\n"); printf(" 名次学号姓名数据结构离散数学大学英语总分\n"); k=0; for(i=0;i { if(i>0&&stu[i].score[N]!=stu[i-1].score[N]) { k++; printf("%4d",k); printf(" %4d",stu[i-1].number); printf(" %s",stu[i-1].name); for(j=0;j { printf(" %6d",stu[i-1].score[j]); } } printf("\n"); } changesort(stu,M,0); /*对数据结构成绩进行排序*/ print_score(stu,M,0); /*输出数据结构前3 名同学成绩*/ changesort(stu,M,1); /*对离散数学成绩进行排序*/ print_score(stu,M,1); /*输出离散数学前3 名同学成绩*/ changesort(stu,M,2); /*对大学英语成绩进行排序*/ print_score(stu,M,2); /*输出大学英语前3 名同学成绩*/ } void changesort(struct student a[],int n,int j) { int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;i if (a[i].score[j] < a[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } for(i=0;i if (a[i].score[j] < a[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } } } void print_score(struct student a[],int n,int j) { int i,k; printf(" 奇偶交换成绩%d 排序表",j+1); printf("\n"); printf(" 名次学号姓名分数\n"); k=1; for(i=0;k { if(i>0&&a[i].score[j]!=a[i-1].score[j]) k++; printf(" %4d ",k); printf("%4d",a[i].number); printf(" %s",a[i].name); printf(" %6d",a[i].score[j]); printf("\n"); } } 升序改降序: 请输入第1 名学生分数: 姓名: 史孟晨 编号: 01 数据结构: 87 离散数学: 90 大学英语: 78 请输入第2 名学生分数: 姓名: 袁欣 编号: 02 数据结构: 78 离散数学: 80 大学英语: 92 请输入第3 名学生分数: 姓名: 赵宇 编号: 03 数据结构: 88 离散数学: 76 大学英语: 95 请输入第4 名学生分数: 姓名: 滕芷 编号: 04 数据结构: 79 离散数学: 84 大学英语: 88 请输入第5 名学生分数: 姓名: 张一析 编号: 05 数据结构: 78 离散数学: 68 大学英语: 91 请输入第6 名学生分数: 姓名: 白晓彤 编号: 06 数据结构: 88 离散数学: 76 大学英语: 90 学生总分成绩排序表 名次学号姓名数据结构离散数学大学英语总分 1 3 赵宇88 76 95 259 2 1 史孟晨87 90 78 255 3 6 白晓彤88 76 90 254 4 4 滕芷79 84 88 251 5 2 袁欣78 80 92 250 6 5 张一析78 68 91 23 7 奇偶交换成绩1 排序表 名次学号姓名分数 1 3 赵宇88 1 6 白晓彤88 2 1 史孟晨87 3 4 滕芷79 奇偶交换成绩2 排序表 名次学号姓名分数 1 1 史孟晨90 2 4 滕芷84 3 2 袁欣80 奇偶交换成绩3 排序表 名次学号姓名分数 1 3 赵宇95 2 2 袁欣92 3 5 张一析91 Press any key to continue #include "stdio.h" #include "string.h" #define M 6 #define N 3 void changesort(struct student a[],int n,int j); void print_score(struct student a[],int n,int j); struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; main() { int i,j,k; for (i=0;i { printf("请输入第%d 名学生分数: ",i+1);printf("\n"); printf("姓名: "); scanf("%s",stu[i].name); printf("编号: "); scanf("%4d",&stu[i].number); printf("数据结构: "); scanf("%4d",&stu[i].score[0]); printf("离散数学: "); scanf("%4d",&stu[i].score[1]); printf("大学英语: "); scanf("%4d",&stu[i].score[2]); } for(i=0;i { stu[i].score[N]=0; for(j=0;j stu[i].score[N]+=stu[i].score[j]; changesort(stu,M,N); /*对总分进行排序*/ printf(" 学生总分成绩排序表\n"); printf(" 名次学号姓名数据结构离散数学大学英语总分\n"); k=0; for(i=0;i { if(i>0&&stu[i].score[N]!=stu[i-1].score[N]) { k++; printf("%4d",k); printf(" %4d",stu[i-1].number); printf(" %s",stu[i-1].name); for(j=0;j { printf(" %6d",stu[i-1].score[j]); } } printf("\n"); } changesort(stu,M,0); /*对数据结构成绩进行排序*/ print_score(stu,M,0); /*输出数据结构前3 名同学成绩*/ changesort(stu,M,1); /*对离散数学成绩进行排序*/ print_score(stu,M,1); /*输出离散数学前3 名同学成绩*/ changesort(stu,M,2); /*对大学英语成绩进行排序*/ print_score(stu,M,2); /*输出大学英语前3 名同学成绩*/ } void changesort(struct student a[],int n,int j) { int flag=1,i,m,k; struct student temp; while(flag) { flag=0; for(i=0;i { k=i; for(m=i+1;m if (a[m].score[j]>a[k].score[j]) { k=m; temp=a[i]; a[i]=a[k]; a[k]=temp; flag=1; } } } } void print_score(struct student a[],int n,int j) { int i,k; printf(" 选择交换成绩%d 排序表",j+1); printf("\n"); printf(" 名次学号姓名分数\n"); k=1; for(i=0;k { if(i>0&&a[i].score[j]!=a[i-1].score[j]) k++; printf(" %4d ",k); printf("%4d",a[i].number); printf(" %s",a[i].name); printf(" %6d",a[i].score[j]); printf("\n"); } } 简单选择: 请输入第1 名学生分数: 姓名: 史孟晨 编号: 01 数据结构: 87 离散数学: 90 大学英语: 78 请输入第2 名学生分数: 姓名: 袁欣 编号: 02 数据结构: 78 离散数学: 80 大学英语: 92 请输入第3 名学生分数: 姓名: 赵宇 编号: 03 数据结构: 88 离散数学: 76 大学英语: 95 请输入第4 名学生分数: 姓名: 滕芷 编号: 04 数据结构: 79 离散数学: 84 大学英语: 88 请输入第5 名学生分数: 姓名: 张一析 编号: 05 数据结构: 78 离散数学: 68 大学英语: 91 请输入第6 名学生分数: 姓名: 白晓彤 编号: 06 数据结构: 88 离散数学: 76 大学英语: 90 学生总分成绩排序表 名次学号姓名数据结构离散数学大学英语总分 1 3 赵宇88 76 95 259 2 1 史孟晨87 90 78 255 3 6 白晓彤88 76 90 254 4 4 滕芷79 84 88 251 5 2 袁欣78 80 92 250 6 5 张一析78 68 91 23 7 选择交换成绩1 排序表 名次学号姓名分数 1 3 赵宇88 1 6 白晓彤88 2 1 史孟晨87 3 4 滕芷79 选择交换成绩2 排序表 名次学号姓名分数 1 1 史孟晨90 2 4 滕芷84 3 2 袁欣80 选择交换成绩3 排序表 名次学号姓名分数 1 3 赵宇95 2 2 袁欣92 3 5 张一析91 Press any key to continue #include "stdio.h" #include "string.h" #define M 6 #define N 3 void changesort(struct student a[],int n,int j); void print_score(struct student a[],int n,int j); struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; main() { int i,j,k; for (i=0;i { printf("请输入第%d 名学生分数: ",i+1);printf("\n"); printf("姓名: "); scanf("%s",stu[i].name); printf("编号: "); scanf("%4d",&stu[i].number); printf("数据结构: "); scanf("%4d",&stu[i].score[0]); printf("离散数学: "); scanf("%4d",&stu[i].score[1]); printf("大学英语: "); scanf("%4d",&stu[i].score[2]); } for(i=0;i { stu[i].score[N]=0; for(j=0;j stu[i].score[N]+=stu[i].score[j]; changesort(stu,M,N); /*对总分进行排序*/ printf(" 学生总分成绩排序表\n"); printf(" 名次学号姓名数据结构离散数学大学英语总分\n"); k=0; for(i=0;i { if(i>0&&stu[i].score[N]!=stu[i-1].score[N]) { k++; printf("%4d",k); printf(" %4d",stu[i-1].number); printf(" %s",stu[i-1].name); for(j=0;j { printf(" %6d",stu[i-1].score[j]); } } printf("\n"); } changesort(stu,M,0); /*对数据结构成绩进行排序*/ print_score(stu,M,0); /*输出数据结构前3 名同学成绩*/ changesort(stu,M,1); /*对离散数学成绩进行排序*/ print_score(stu,M,1); /*输出离散数学前3 名同学成绩*/ changesort(stu,M,2); /*对大学英语成绩进行排序*/ print_score(stu,M,2); /*输出大学英语前3 名同学成绩*/ } void changesort(struct student a[],int n,int j) { { int flag=1,i; struct student temp; while(flag) { flag=0; for(i=0;i if (a[i].score[j] < a[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } } } } void print_score(struct student a[],int n,int j) { int i,k; printf(" 冒泡交换成绩%d 排序表",j+1); printf("\n"); printf(" 名次学号姓名分数\n"); k=1; for(i=0;k { if(i>0&&a[i].score[j]!=a[i-1].score[j]) k++; printf(" %4d ",k); printf("%4d",a[i].number); printf(" %s",a[i].name); printf(" %6d",a[i].score[j]); printf("\n"); } } 运行结果: 请输入第1 名学生分数: 姓名: 史孟晨 编号: 01 数据结构: 87 离散数学: 90 大学英语: 78 请输入第2 名学生分数: 姓名: 袁欣 编号: 02 数据结构: 78 离散数学: 80 大学英语: 92 请输入第3 名学生分数: 姓名: 赵宇