数据结构课程设计报告 第 10 页,共 页
} { } printf(\文件打开失败!\\n\ exit(1); //读入记录数 fscanf(fp,\ for(i=0;i 数据结构课程设计报告 第 12 页,共 页 五 附录(源程序清单) #include { double BubTime1, //按第一个关键字代表的学科成绩用冒泡法排序执行的时间 BubTime2, BubTime3, BubTime4, BubTimeSum, //冒泡法排序的总时间 DCTime1, //按第一个关键字代表的学科成绩用分配和收集的方法执行的时间 DCTime2, DCTime3, DCTime4, DCTimeSum; //分配和收集法排序的总时间 int score[10000][5],//随机创建的模拟学生记录源数组 bubble[10000][5], //进行冒泡法排序时用来存放学生记录源数组,并且随排序进行数组中的记录发生交换 copy[10000][5]; //从模拟的学生记录源txt文件中读取学生记录到该数组 struct LSD d[301]; //分配数组,该处考虑到把总分(0-300)也列入优先级序列中,因此建立了301个队列 int *c[10000]; //用来存放收集到的学生记录 char x[5]; //存放有优先关系的学科代号序列 /*初始化c,使其与score函数\同步\ for(int i=0;i<10000;i++) c[i]=score[i]; InitDivide(d); //初始化队列 /*在实际中全部学生的高考记录是存放在一个文件中的,程序运行时是从该文件中读取的源记录数据。 *本程序要求随机模拟创建该文件,所以下面要创建每个学生的记录(CreatScore())并保存到一个文件中(save()) *调用这两个函数后就生成了全部学生的记录 */ CreatScore(score); //伪随机生成各科成绩,并将考号和总成绩一并生成在score数组中 savesources(score,10000); //将随机生成的记录信息保存在record.txt中,该文件在程序运行的时候是不变的 load(copy); //从源记录文件record.txt中读取学生记录到数组copy中 /*为了防止改变源记录,在进行冒泡法排序的时候用bubble这个数组*/ for(i=0;i<10000;i++) for(int j=0;j<5;j++) bubble[i][j]=copy[i][j]; //将源记录赋值给bubble数组 printf(\请输入您要按照哪种优先级顺序对学生成绩进行排序:比如(总分,数学,语文,英语)\\n就请输入smce(即各科的英文首字母序列)\ scanf(\ //输入进行排序的关键字的优先序列 for(i=3;i>=0;i--) { printf(\现在程序正在按%c代表的学科进行成绩分配,请稍后…\ switch(x[i]) { case 'c': //Chinese DCTime1=DCSort(d,c,0); //按语文这个关键字用分配和收集法排序,并返回时间 BubTime1=BubbleSort(bubble,0); //按语文这个关键字用冒泡法排序 break; case 'm': //Math DCTime2=DCSort(d,c,1); BubTime2=BubbleSort(bubble,1); 数据结构课程设计报告 第 14 页,共 页 break; case 'e': //English DCTime3=DCSort(d,c,2); BubTime3=BubbleSort(bubble,2); break; case 's': //Sum DCTime4=DCSort(d,c,3); BubTime4=BubbleSort(bubble,3); break; default: printf(\您输入的科目代号错误\\n\//输入代号错误提示 break; } } DCTimeSum=DCTime1+DCTime2+DCTime3+DCTime4; //分配排序法的总时间等于按照各个关键字进行排序的分时间的和 BubTimeSum=BubTime1+BubTime2+BubTime3+BubTime4; printf(\用分配和收集的方法排序,执行的总时间为:%.3f\\n\ printf(\用冒泡法排序,执行的总时间为:%.3f\\n\ printf(\请问您要提取多少条学生的成绩信息(0-10000):\ int n; scanf(\ saveresults(bubble,n); //将前n名学生的记录保存在结果文件recordresults.txt中 Print(); //从结果文件recordresults.txt中读取记录到屏幕上 return 0; } /*创建一个含有10000名学生成绩记录的score,包含语文、数学、英语、总分和学号,随机生成语文、数学、英语的成绩。 *传递的参数是成绩数组score,无返回值 */ void CreatScore(int score[10000][5]) { int i, j; srand(time(NULL)); //利用时间设置随机种子产生随机数 /*伪随机生成语文、数学、英语的成绩*/ for(i=0;i<10000;i++) { for(j=0;j<3;j++) { score[i][j]=rand()1; //成绩的范围是0-100 } } /*总分成绩初始化*/ for(i=0;i<10000;i++) { score[i][3]=score[i][0]+score[i][1]+score[i][2]; //总成绩为各科成绩之和 } /*学号的初始化*/ for(i=0;i<10000;i++) score[i][4]=i+1; //学号是按从前到后的顺序依次赋值的