该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
错误1:这个是主要错误:选择4排序时,一部分的学生的信息没有了,而有一部分会重复,如下图
错误2:选择5操作时,输出成绩会显示一大串的“烫烫烫烫烫烫烫、、、”等乱码,如下图
错误3:选择3操作,修改成绩时候,“总分”“名次” 两项不知道为什么会出现小数
#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;
}
}