c语言写学生成绩排序系统,求改错!排序不知为什么功能实现不正常,是一个学生成绩系统...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

错误1:这个是主要错误:选择4排序时,一部分的学生的信息没有了,而有一部分会重复,如下图

706a85f7e6f0e1ac0a6d8e536318d8e8.png

错误2:选择5操作时,输出成绩会显示一大串的“烫烫烫烫烫烫烫、、、”等乱码,如下图

40d65e309cf5408307f8678078d7b840.png

错误3:选择3操作,修改成绩时候,“总分”“名次” 两项不知道为什么会出现小数

62c227bb3a1366e44690384d62f9f276.png

#include

#include

#include

typedef struct

{

char sno[11];

char name[16];

int score[4];

int total;

int mc;//名次

}student;

//函数的申明

void sr(student stud[],int n); //信息录入函数

void cx(student stu[],int n); //信息查询函数

void xg(student stu[], int n); //信息修改函数

void sc(student stud[],int n); //信息输出函数

void qdmc(student stud[],int n); //排序选择函数

void px(student stud[],int n); //排序选择函数

void denglu(); //界面登陆函数

int del(student stud[],int n); //删除函数

//主函数

main()

{

denglu();

system("cls");

printf("\n\n\t\t 您已经成功登陆学生管理系统!\n\n\n");

student stud[41];

int xz=1,n;

while(xz)

{

printf("\t\t \n");

printf("\t\t*********************学生成绩管理************************\n");

printf("\t\t=========================================================\n");

printf("\t\t@ 1. 学生成绩的录入 @\n");

printf("\t\t@ 2. 学生成绩查询 @\n");

printf("\t\t@ 3. 学生信息修改 @\n");

printf("\t\t@ 4. 学生成绩排序 @\n");

printf("\t\t@ 5. 学生成绩的输出 @\n");

printf("\t\t@ 6. 学生信息的删出 @\n");

printf("\t\t@ 0. 退出系统 @\n");

printf("\t\t=========================================================\n");

printf("请选择需要的操作<0-6>:");

scanf("%d",&xz);

switch(xz)

{

case 0: break;

case 1: printf("请输入你想建立的学生总人数:");

scanf("%d",&n);sr(stud,n);break;

case 2: cx(stud,n);break;

case 3: xg(stud,n);break;

case 4: px(stud,n);break;

case 5: sc(stud,n);break;

case 6: n=del(stud,n);break;

}

}

system("PAUSE");

return 0;

}

//信息录入程序

void sr(student stud[],int n)

{

int i;

for(i=1;i<=n;i++)

{

printf("输入第%d个学生的学号\n",i);

fflush(stdin);

scanf("%s",&stud[i].sno);

fflush(stdin);

printf("输入第%d个学生的姓名\n",i);

scanf("%s",&stud[i].name);

printf("请输入第%d个学生的四门成绩\n",i);

printf("英语 高数 JAVA C#\n") ;

scanf("%d%d%d%d",&stud[i].score[0],&stud[i].score[1],&stud[i].score[2],&stud[i].score[3]);

stud[i].total=stud[i].score[0]+stud[i].score[1]+stud[i].score[2]+stud[i].score[3];

stud[i].mc=i;

}

}

//信息查询程序

void cx(student stud[],int n)

{

int xz,i;

char no[10],nm[16];

printf("1.按学号查找 \n");

printf("2.按姓名查找 \n");

printf("请选择 :");

scanf("%d",&xz);

getchar();

if(xz==1)

{

printf("输入学号:");

gets(no);

}

else if(xz==2)

{

printf("输入姓名:");

gets(nm);

}

for(i=1;i<=n;i++)

{

switch(xz)

{

case 1:

if(strcmp(stud[i].sno,no)==0)

{

printf(" 学号 姓名 英语 高数 JAVA C# 总分 名次\n");

printf("%8s,%12s,%6d,%6d,%6d,%6d,%6d,%4d\n",stud[i].sno,stud[i].name,stud[i].score[0],

stud[i].score[1],stud[i].score[2],stud[i].score[3],stud[i].total,stud[i].mc);

return;

}

case 2:

if(strcmp(stud[i].name,nm)==0)

{

printf(" 学号 姓名 英语 高数 JAVA C# 总分 名次\n");

printf("%8s,%8s,%6d,%6d,%6d,%6d,%6d,%4d\n",stud[i].sno,stud[i].name,stud[i].score[0],

stud[i].score[1],stud[i].score[2],stud[i].score[3],stud[i].total,stud[i].mc);

return;

}

}

}

if(i>n)

printf("你要查找的学生没有查找到!\n");

getchar();

system("cls");

}

//信息修改程序

void xg(student stud[], int n)

{

char no[10];

int i, j;

printf("请输入要修改的学生学号:\n");

getchar();

gets(no);

for(i=1;i<=n;i++)

if(strcmp(stud[i].sno,no)==0)

{

printf(" 学号 姓名 英语 高数 JAVA C# 总分 名次\n");

printf("%8s,%8s,%5d,%5d,%5d,%5d,%5d,%4d\n",stud[i].sno,stud[i].name,stud[i].score[0],

stud[i].score[1],stud[i].score[2],stud[i].score[3],stud[i].total);

printf("输入最新成绩:\n");

// scanf("%d,%d,%d,%d",&stud[i].score[0],&stud[i].score[1],&stud[i].score[2],&stud[i].score[3]);

//break;

printf("英语\t高数\tJVAVA\tC#\n");

for(j=0;j<4;j++)

scanf("%d",&stud[i].score[j]);/*找到该学生成绩后进行修改,跳出for循环*/

stud[i].total=stud[i].score[0]+stud[i].score[1]+stud[i].score[2]+stud[i].score[3];

printf("修改成功\n");

break;

}

if(i>n)

{

printf("你要查找的学生没有查到,请核对后再查!\n");

}

}

//排名次程序

void qdmc(student stud[],int n)

{

int i;

for(i=1;i<=n;i++)

stud[i].mc=i;

for(i=2;i<=n;i++)

if(stud[i].total==stud[i-1].total)

stud[i].mc=stud[i-1].mc;

}

//信息的输出程序

void sc(student stud[],int n)

{

system("cls");

int i;

printf(" \n\n\n\n\n\t\t\t\t\n");

//printf(" 学号 姓名 英语 高数 JAVA C# 总分 名次\n");

//for(i=0;i<=n;i++)

//printf("%6s,%6s,%6d,%6d,%6d,%6d,%6d,%4d\n",stud[i].sno,stud[i].name,stud[i].score[0],

//stud[i].score[1],stud[i].score[2],stud[i].score[3],stud[i].total,stud[i].mc);

printf(" 学号 姓名 英语 高数 JAVA C# 总分 名次\n");

for(i=0;i<=n;i++)

printf("%8s,%12s,%6d,%6d,%6d,%6d,%6d,%4d\n",stud[i].sno,stud[i].name,stud[i].score[0],

stud[i].score[1],stud[i].score[2],stud[i].score[3],stud[i].total,stud[i].mc);

getchar();

}

//排序选择程序

void px(student stud[],int n)

{

int num,i;

int d[5],t;

void DbubbleSort (student stud[],int n),ShellSort(student stud[],int d[],int n,int t),

QuickSort(student stud[],int ,int ),HeapSort(student stud[],int ),qdmc(student stud[],int);

printf(" *************排序的方法选择*************\n");

printf(" ========================================\n");

printf(" 1.双向冒泡排序 \n");

printf(" 2.希 尔 排 序 \n");

printf(" 3.快 速 排 序 \n");

printf(" 4.堆 排 序 \n");

printf("=========================================\n");

printf(" ****************************************\n");

printf("请选择需要的操作<1-4>:");

scanf("%d",&num);

switch(num)

{

case 1:DbubbleSort(stud,n);break;

case 2:printf("输入增量个数:\n");

scanf("%d",&t);

printf("输入增量:\n");

for(i=0;i

scanf("%d",&d[i]);

ShellSort(stud,d,n,t);break;

case 3: QuickSort(stud,1,n);break;

case 4: HeapSort(stud,n);break;

}

qdmc(stud,n);

}

//双向冒泡排序

void DbubbleSort(student R[],int n )

{

int i ,j;

student t;

int NoSwap;

NoSwap=1;

i=1;

while(NoSwap)

{

NoSwap=0;

for(j=n-i+1;j>=i+1;j--)

if(R[j].total>R[j-1].total)

{

t=R[j];

R[j]=R[j-1];

R[j+1]=t;

NoSwap=1;

}

i=i+1;

}

}

//希尔排序

void ShellInsert(student R[],int n,int dk)

{

int i,j;

for(i=dk+1;i<=n;i++)

if(R[i].total>R[i-dk].total)

{

R[0]=R[i];

j=i-dk;

while(j>0&&R[0].total>R[j].total)

{

R[j+dk]=R[j];

j=j-dk;

}

R[j+dk]=R[0];

}

}

void ShellSort(student R[],int d[],int n, int t)

{

int k;

for(k=0;k

ShellInsert(R,n,d[k]);

}

//快速排序的一次划分程序

int Partition(student R[],int i,int j)

{

student x=R[i];

while(i

j--;

if(i

{

R[i]=R[j];i++;

}

while(i=x.total)

i++;

if(i

{

R[j]=R[i];j--;

}

R[i]=x;

return i;

}

//快速排序的递归程序

void QuickSort(student R[],int low,int high)

{

int p;

if(low

{

p=Partition(R,low,high);

QuickSort(R,low,p-1);

QuickSort(R,p+1,high);

}

}

//调整小根堆的程序

void Sift(student R[],int i, int h)

{

int j;

student x=R[i];

j=2*i;

while(j

{

if(jR[j+1].total)

j++;

if(x.total

R[i]=R[j];

i=j;j=2*i;

}

R[i]=x;

}

//堆排序

void HeapSort(student R[],int n)

{

int i;

for(i=n/2;i>0;i--)

Sift(R,i,n);

for(i=n;i>1;i--)

{

R[0]=R[1];R[1]=R[i];R[i]=R[0];

Sift(R,1,i-1);

}

}

//登陆界面函数

void denglu()

{

int i=1;

int m,w=123456;

printf(" \n\n\n\t\t*****************欢迎使用系统*****************\n");

printf(" \t\t &========================================&\n");

printf(" \t\t & &\n");

printf(" \t\t & 学生成绩管理 &\n");

printf(" \t\t & &\n");

printf(" \t\t & &\n");

printf(" \t\t &========================================&\n");

printf(" \t\t**********************************************\n");

printf(" \t\t请输入您的密码并按回车键进入:");

scanf("%d",&m);

printf("\n\n");

for(i=1;i<=3;i++)

{

if(m==w)

{

break;

}

else

{

printf(" \t\t\t对不起,您的输入有误:");

scanf("%d",&m);

}

}

}

int del(student stud[],int n)

{

int i;

char t[20],m;

printf("请输入您要删除的学生的学生号:");

scanf("%s",&t);

getchar();

for(i=0;i<=n;i++)

{

if(strcmp(stud[i].sno,t)==0)

{

printf("您确定要删除该学生的所有信息吗?如果是请输入'Y'/'y',否则按任意键退出。");

scanf("%c",&m);

if(m=='y'||m=='Y')

{

stud[i]=stud[i+1];

n=n-1;

system("cls");

printf("\n\n\t\t\t\t删除成功!\n\n");

return n;

}

else

{

printf("\n\n\t\t\t删除失败!请按任意键返回管理界面。\n\n");

getchar();

return n;

}

}

}

if(strcmp(stud[i].sno,t)!=0)

{

printf("没有查找到你要查找的学生!\n");

return n;

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值