資料結構程式設計回顧(六).學生成績管理系統-冒泡、快排、希爾、雙向冒泡和堆排
阿新 • • 發佈:2018-12-31
題目六:學生成績處理系統
設計要求:本設計要求採用順序儲存結構,實現關於學生成
績處理的相關問題,包括:學生資訊的錄入、查詢、修改、
排序、確定名次以及資訊的輸出。其中學生資訊包括:學號、
姓名、四門課、總分以及排名;排序方法包括:雙向冒泡排
序、希爾排序、快速排序、堆排序等方法。
選單內容:
1、 學生資訊錄入
2、 學生資訊查詢
3、 學生資訊修改
4、 學生成績排序
5、 學生成績輸出
6、 結束程式
科目一使用希爾排序
科目二使用快速排序
科目三使用堆排序
科目四使用氣泡排序
總成績使用雙向氣泡排序
希爾排序:
void sort_1(Sqlist &L){//希爾排序 printf("以下按照科目一成績希爾排序:\n"); int dlta[3]={L.length/2,L.length/4,1}; int t=3,i; for(i=0;i<t;i++){ ShellInsert(L,dlta[i]); } } void ShellInsert(Sqlist &L,int dk){ int i; for(i=0;i+dk<L.length;i++){ if(L.student[i].cj1<L.student[i+dk].cj1){ stu temp=L.student[i]; L.student[i]=L.student[i+dk]; L.student[i+dk]=temp; } } }
快速排序:
void sort_2(Sqlist &L){//快速排序 printf("以下按照科目二成績快速排序:\n"); quick_sort(L,0,L.length-1); } void quick_sort(Sqlist &L,int left,int right){ int i=left,j=right; if(left>right) return; stu temp=L.student[left]; while(i!=j){ while(L.student[j].cj2<=temp.cj2&&i<j) j--; while(L.student[i].cj2>=temp.cj2&&i<j) i++; if(i<j){ stu t=L.student[i]; L.student[i]=L.student[j]; L.student[j]=t; } } L.student[left]=L.student[i]; L.student[i]=temp; quick_sort(L,left,i-1); quick_sort(L,i+1,right); }
堆排序:
void sort_3(Sqlist &L){//堆排序 printf("以下按照科目三成績堆排序:\n"); heap_sort(L,L.length); } void heap_sort(Sqlist &L,int n){ int i; BuildHeap(L,n); for(i=n;i>=1;i--) { stu temp=L.student[0]; L.student[0]=L.student[i-1]; L.student[i-1]=temp; HeapAdjust(L,1,i-1); } } void BuildHeap(Sqlist &L,int n){ int i; for(i=(n)/2;i>=1;i--) { HeapAdjust(L,i,n); } } void HeapAdjust(Sqlist &L,int i,int n) { //調整堆 int lchild=2*i; //i的左孩子節點序號 int rchild=2*i+1; //i的右孩子節點序號 int maxi=i; //臨時變數 if(i<=n/2) //如果i不是葉節點就不用進行調整 { if(lchild<=n&&L.student[lchild-1].cj3<L.student[maxi-1].cj3) { maxi=lchild; } if(rchild<=n&&L.student[rchild-1].cj3<L.student[maxi-1].cj3) { maxi=rchild; } if(maxi!=i) { stu temp=L.student[i-1]; L.student[i-1]=L.student[maxi-1]; L.student[maxi-1]=temp; HeapAdjust(L,maxi,n); } }
氣泡排序:
void sort_4(Sqlist &L){//氣泡排序
printf("以下按照科目四成績氣泡排序:\n");
int i,j;
for(i=0;i<L.length;i++){
for(j=i;j<L.length;j++){
if(L.student[i].cj4<L.student[j].cj4){
stu temp=L.student[i];
L.student[i]=L.student[j];
L.student[j]=temp;
}
}
}
}
雙向氣泡排序:
void sort_all(Sqlist &L){//雙向冒泡
printf("以下按照總成績雙向氣泡排序:\n");
int left = 0,right = L.length-1,l,r,j;
stu temp;
while(left<right){
l=left+1;
r=right-1;
for(j = left; j < right; j++)
{
if(L.student[j].sum < L.student[j + 1].sum)
{
temp= L.student[j];
L.student[j] = L.student[j + 1];
L.student[j + 1] = temp;
r = j;
}
}
right = r;
for(j = right; j > left; j--)
{
if(L.student[j].sum > L.student[j - 1].sum)
{
temp = L.student[j];
L.student[j] = L.student[j - 1];
L.student[j - 1] = temp;
l = j;
}
}
left = l;
}
}
其他的操作見完整程式碼:
#include <stdio.h>
#include <windows.h>
#define MAXSIZE 100
#define LIST_INIT_SIZE 100
#define INCRE 10
//using namespace std;
typedef struct stu{
int num;
char name[10];
int cj1;
int cj2;
int cj3;
int cj4;
int sum;
}Stu;
typedef struct {
Stu *student;
int listsize;
int length;
}Sqlist;
void initlist(Sqlist &L){
L.student=(Stu *)malloc(LIST_INIT_SIZE*sizeof(Stu));
if(!L.student)
exit(-1);
L.length=0;
L.listsize=LIST_INIT_SIZE;
}
void sq_insert(Sqlist &L){
scanf("%d%s%d%d%d%d",&L.student[L.length].num,L.student[L.length].name,&L.student[L.length].cj1,&L.student[L.length].cj2,&L.student[L.length].cj3,&L.student[L.length].cj4);
L.student[L.length].sum=L.student[L.length].cj1+L.student[L.length].cj2+L.student[L.length].cj3+L.student[L.length].cj4;
L.length++;
}
int found(Sqlist L){
printf("請選擇查詢方式: 0.學號 1.姓名 \n");
int input;
scanf("%d",&input);
if(input==0){
printf("請輸入要查詢的學號:\n");
int find_num,i;
scanf("%d",&find_num);
for(i=0;i<L.length;i++){
if(L.student[i].num==find_num)
return i;
}
printf("cannot found.\n");
return -1;
}
else if(input==1){
printf("請輸入要查詢的姓名:\n");
char find_name[20];
int i;
scanf("%s",find_name);
for(i=0;i<L.length;i++){
if(strcmp(L.student[i].name,find_name)==0)
return i;
}
printf("cannot found.\n");
return -1;
}
}
void sq_find(Sqlist L){
int i=found(L);
if(i>=0){
printf("%d: %d %s %d %d %d %d sum=%d\n",i+1,L.student[i].num,L.student[i].name,L.student[i].cj1,L.student[i].cj2,L.student[i].cj3,L.student[i].cj4,L.student[i].sum);
}
}
void sq_modify(Sqlist L){
int i=found(L);
if(i>=0){
printf("請輸入新的全部資訊:\n");
scanf("%d%s%d%d%d%d",&L.student[i].num,L.student[i].name,&L.student[i].cj1,&L.student[i].cj2,&L.student[i].cj3,&L.student[i].cj4);
L.student[i].sum=L.student[i].cj1+L.student[i].cj2+L.student[i].cj3+L.student[i].cj4;
}
}
void print(Sqlist L){
int i;
printf("排名 學號 姓名 科目一 科目二 科目三 科目四 總分\n");
for(i=0;i<L.length;i++){
printf("%d: %d %s %d %d %d %d %d\n",i+1,L.student[i].num,L.student[i].name,L.student[i].cj1,L.student[i].cj2,L.student[i].cj3,L.student[i].cj4,L.student[i].sum);
}
}
void sort_all(Sqlist &L){//雙向冒泡
printf("以下按照總成績雙向氣泡排序:\n");
int left = 0,right = L.length-1,l,r,j;
stu temp;
while(left<right){
l=left+1;
r=right-1;
for(j = left; j < right; j++)
{
if(L.student[j].sum < L.student[j + 1].sum)
{
temp= L.student[j];
L.student[j] = L.student[j + 1];
L.student[j + 1] = temp;
r = j;
}
}
right = r;
for(j = right; j > left; j--)
{
if(L.student[j].sum > L.student[j - 1].sum)
{
temp = L.student[j];
L.student[j] = L.student[j - 1];
L.student[j - 1] = temp;
l = j;
}
}
left = l;
}
}
void ShellInsert(Sqlist &L,int dk){
int i;
for(i=0;i+dk<L.length;i++){
if(L.student[i].cj1<L.student[i+dk].cj1){
stu temp=L.student[i];
L.student[i]=L.student[i+dk];
L.student[i+dk]=temp;
}
}
}
void sort_1(Sqlist &L){//希爾排序
printf("以下按照科目一成績希爾排序:\n");
int dlta[3]={L.length/2,L.length/4,1};
int t=3,i;
for(i=0;i<t;i++){
ShellInsert(L,dlta[i]);
}
}
void quick_sort(Sqlist &L,int left,int right){
int i=left,j=right;
if(left>right)
return;
stu temp=L.student[left];
while(i!=j){
while(L.student[j].cj2<=temp.cj2&&i<j) j--;
while(L.student[i].cj2>=temp.cj2&&i<j) i++;
if(i<j){
stu t=L.student[i];
L.student[i]=L.student[j];
L.student[j]=t;
}
}
L.student[left]=L.student[i];
L.student[i]=temp;
quick_sort(L,left,i-1);
quick_sort(L,i+1,right);
}
void sort_2(Sqlist &L){//快速排序
printf("以下按照科目二成績快速排序:\n");
quick_sort(L,0,L.length-1);
}
void HeapAdjust(Sqlist &L,int i,int n) { //調整堆
int lchild=2*i; //i的左孩子節點序號
int rchild=2*i+1; //i的右孩子節點序號
int maxi=i; //臨時變數
if(i<=n/2) //如果i不是葉節點就不用進行調整
{
if(lchild<=n&&L.student[lchild-1].cj3<L.student[maxi-1].cj3)
{
maxi=lchild;
}
if(rchild<=n&&L.student[rchild-1].cj3<L.student[maxi-1].cj3)
{
maxi=rchild;
}
if(maxi!=i)
{
stu temp=L.student[i-1];
L.student[i-1]=L.student[maxi-1];
L.student[maxi-1]=temp;
HeapAdjust(L,maxi,n);
}
}
}
void BuildHeap(Sqlist &L,int n){
int i;
for(i=(n)/2;i>=1;i--)
{
HeapAdjust(L,i,n);
}
}
void heap_sort(Sqlist &L,int n){
int i;
BuildHeap(L,n);
for(i=n;i>=1;i--)
{
stu temp=L.student[0];
L.student[0]=L.student[i-1];
L.student[i-1]=temp;
HeapAdjust(L,1,i-1);
}
}
void sort_3(Sqlist &L){//堆排序
printf("以下按照科目三成績堆排序:\n");
heap_sort(L,L.length);
}
void sort_4(Sqlist &L){//氣泡排序
printf("以下按照科目四成績氣泡排序:\n");
int i,j;
for(i=0;i<L.length;i++){
for(j=i;j<L.length;j++){
if(L.student[i].cj4<L.student[j].cj4){
stu temp=L.student[i];
L.student[i]=L.student[j];
L.student[j]=temp;
}
}
}
}
void _sort(Sqlist &L){
printf("請選擇排序型別;1:科目1 2:科目2 3:科目3 4:科目4 0:總分\n");
int input;
scanf("%d",&input);
switch(input){
case 0:
sort_all(L);
break;
case 1:
sort_1(L);
break;
case 2:
sort_2(L);
break;
case 3:
sort_3(L);
break;
case 4:
sort_4(L);
break;
}
}
void input(Sqlist &L){
int i=18;
char str[10]="aefg";
for(;i<23;i++){
L.student[i-18].num=i;
strcpy(L.student[i-18].name,str);
L.student[i-18].cj1=i-18;
L.student[i-18].cj2=i-18;
L.student[i-18].cj3=i-18;
L.student[i-18].cj4=i-18;
L.student[i-18].sum=4*L.student[i-18].cj1;
L.length++;
}
}
int main()
{
printf(" -----------學生成績管理系統---------------\n");
Sqlist L;
initlist(L);
input(L);
while(1){
printf("1.學生資訊錄入 2.學生資訊查詢 3.學生資訊修改4. 學生資訊排序 5.學生資訊輸出 0.退出\n");
int input;
scanf("%d",&input);
switch(input){
case 0:return 0;
case 1:
sq_insert(L);
break;
case 2:
sq_find(L);
break;
case 3:
sq_modify(L);
break;
case 4:
_sort(L);
print(L);
break;
case 5:
print(L);
}
}
return 0;
}