题目六:学生成绩处理系统
设计要求:本设计要求采用顺序存储结构,实现关于学生成
绩处理的相关问题,包括:学生信息的录入、查询、修改、
排序、确定名次以及信息的输出。其中学生信息包括:学号、
姓名、四门课、总分以及排名;排序方法包括:双向冒泡排
序、希尔排序、快速排序、堆排序等方法。
菜单内容:
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;
}