求会的c语言大神帮我做一下 真的很急。。
学生成绩与奖学金评定系统主要实现对学生的成绩进行查询和管理。要求用结构体完成。基本功能:(1)学生基本数据的管理(包括学号、姓名、班级)。可以实现对学生信息的添加、删除和...
学生成绩与奖学金评定系统主要实现对学生的成绩进行查询和管理。要求用结构体完成。
基本功能:
(1)学生基本数据的管理(包括学号、姓名、班级)。可以实现对学生信息的添加、删除和修改功能。
(2)成绩的管理(科目包括英语、数学和C++语言等)
(3)要求可添加、删除、查询、修改学生的信息,以及浏览学生的全部信息。
(4)总成绩统计(每个学生的总成绩、平均成绩)
(5)奖学金评定(本系统可评定两个奖项:1.“学习标兵”评定方法为:单科成绩必须达75分以上(包括75分)、总分成绩居本班第一者;2.“三好学生”评定方法为满足以下所有条件者:单科成绩必须达75分以上(包括75分)、总成绩居本班前5%、评定为“学习标兵”的学生不能参与此项评比) 展开
基本功能:
(1)学生基本数据的管理(包括学号、姓名、班级)。可以实现对学生信息的添加、删除和修改功能。
(2)成绩的管理(科目包括英语、数学和C++语言等)
(3)要求可添加、删除、查询、修改学生的信息,以及浏览学生的全部信息。
(4)总成绩统计(每个学生的总成绩、平均成绩)
(5)奖学金评定(本系统可评定两个奖项:1.“学习标兵”评定方法为:单科成绩必须达75分以上(包括75分)、总分成绩居本班第一者;2.“三好学生”评定方法为满足以下所有条件者:单科成绩必须达75分以上(包括75分)、总成绩居本班前5%、评定为“学习标兵”的学生不能参与此项评比) 展开
2个回答
展开全部
采用链表实现的,自己编译运行通过。编译环境ubuntu+gcc4.8.4
如果想少输入几个人员信息看看效果,就将pernum的值修改大些,当然不要大于1
#include <stdio.h>
#define pernum 0.05
//定义结构体,该结构体被用来存储总分及平均分,为了保存函数calStuMarkByNo以及函数calStuMarkByStu的返回值
struct sumandavg
{
int allmark;
int avgmark;
};
//定义结构体,用以存储各科成绩
struct stumark
{
int englishmark;
int mathmark;
int cppmark;
};
//定义结构体,包括学生信息以及一个各科成绩的结构体变量,以及一个Next指针
struct student
{
char* stuno;
char* name;
char* classname;
struct stumark mark;
struct student* next;
};
//定义两个结构体指针,一个为链表头指针,一个为指向当前正在操作的结构体变量
struct student* head=NULL;
struct student* current=NULL;
//将学生变量添加到链表,参数为指向student结构体变量的指针
void addStudent(struct student* stu)
{
if(head==NULL)
{
head=stu;
current=stu;
stu->next=NULL;
}
else
{
current->next=stu;
current=stu;
stu->next=NULL;
}
}
//从链表中删除学生,参数为学生的学号,未对不存在的学号进行提示,直接忽略
void deleteStudent(char* no)
{
struct student* ptr=head;
while(ptr!=NULL)
{
if(ptr->next!=NULL && !strcmp(ptr->next->stuno,no))
{
ptr->next=ptr->next->next;
return;
}
else if(ptr->next==NULL)
{
head=NULL;
ptr=NULL;
}
else
{
ptr=ptr->next;
}
}
}
//通过学生学号查询学生信息,参数为学生学号
void queryStuInfo(char* no)
{
struct student* ptr=head;
while(ptr!=NULL)
{
if(!strcmp(ptr->stuno,no))
{
printf("student no.:%s name:%s class:%s english mark:%d math mark:%d cpp mark:%d\n",
ptr->stuno,ptr->name,ptr->classname,ptr->mark.englishmark,ptr->mark.mathmark,ptr->mark.cppmark);
return;
}
else
{
ptr=ptr->next;
}
}
}
//修改学生信息,参数为学生学号
void changeStudentInfo(char* no)
{
struct student* ptr=head;
while(ptr!=NULL)
{
if(!strcmp(ptr->stuno,no))
{
queryStuInfo(no);
break;
}
else
{
ptr=ptr->next;
}
}
int menuid;
printf("please select the item which you want to change:\n\
1、学号\n\
2、姓名\n\
3、班级\n\
4、英语成绩\n\
5、数学成绩\n\
6、C++成绩\n\
0、放弃修改\n");
scanf("%d",&menuid);
switch (menuid) {
case 1:
{
printf("please input new student no.:\n");
char* tmp=(char*)malloc(20*sizeof(char));;
scanf("%s",tmp);
ptr->stuno=tmp;
break;
}
case 2:
{
printf("please input new student name:\n");
char* tmp=(char*)malloc(20*sizeof(char));;
scanf("%s",tmp);
ptr->name=tmp;
break;
}
case 3:
{
printf("please input new class:\n");
char* tmp=(char*)malloc(20*sizeof(char));;
scanf("%s",tmp);
ptr->classname=tmp;
break;
}
case 4:
{
printf("please input new english mark:\n");
int tmp;
scanf("%d",&tmp);
ptr->mark.englishmark=tmp;
break;
}
case 5:
{
printf("please input new math mark:\n");
int tmp;
scanf("%d",&tmp);
ptr->mark.mathmark=tmp;
break;
}
case 6:
{
printf("please input new cpp mark:\n");
int tmp;
scanf("%d",&tmp);
ptr->mark.cppmark=tmp;
break;
}
case 0:
{
return;
}
default:
break;
}
}
//计算单个学生成绩,包括总成绩及平均成绩,参数为学生学号,返回值为结构体sumandavg的指针
struct sumandavg* calStuMarkByNo(char* no)
{
struct student* ptr=head;
struct sumandavg tmpsamark;
while(ptr!=NULL)
{
if(!strcmp(ptr->stuno,no))
{
tmpsamark.allmark=ptr->mark.cppmark+ptr->mark.englishmark+ptr->mark.mathmark;
tmpsamark.avgmark=tmpsamark.allmark/3;
return &tmpsamark;
}
else
{
ptr=ptr->next;
}
}
return NULL;
}
//计算单个学生成绩,包括总成绩及平均成绩,参数为student结构体指针,返回值为sumandavg结构体的指针
struct sumandavg* calStuMarkByStu(struct student* stu)
{
struct sumandavg tmpsamark;
tmpsamark.allmark=stu->mark.cppmark+stu->mark.englishmark+stu->mark.mathmark;
tmpsamark.avgmark=tmpsamark.allmark/3;
return &tmpsamark;
}
/*获取学习标兵及三好学生,本打算通过链表排序来实现,奈何水平有限,对链表的操作不熟,只能用下面的方法了*/
void getFirstAndPer5()
{
struct student* ptr=head;
struct student* first=head;//用于保存最高分的信息
int stunum=0;
//通过while循环计算出学生数量
while(ptr!=NULL)
{
stunum++;
ptr=ptr->next;
}
//计算符合比例情况下,学习标兵以及三好学生的总数,然后malloc总数个结构体内存空间
int threegoodstu=stunum*pernum+1;
struct student* per5=(struct student*)malloc(threegoodstu*sizeof(struct student));
ptr=head;
int i=0;
//遍历链表,将符合要求的学生与first比较,比first大的替换掉first,这样first保持的就是总分最高的人,同时将所有符合要求的学生保存在分配好的内存中
while(ptr!=NULL)
{
if(ptr->mark.cppmark>=75 && ptr->mark.englishmark>=75 && ptr->mark.mathmark>=75)
{
struct sumandavg ptrsa,firstsa;
ptrsa.allmark=ptr->mark.cppmark+ptr->mark.mathmark+ptr->mark.englishmark;
firstsa.allmark=first->mark.cppmark+first->mark.englishmark+first->mark.mathmark;
if(ptrsa.allmark>firstsa.allmark)
{
first=ptr;
}
*(per5+i)=*ptr;
i++;
}
ptr=ptr->next;
}
printf("学习标兵:%s\n",first->stuno);
int j=0;
for(;j<i;j++)
{
if(strcmp((per5+j)->stuno,first->stuno))
{
printf("三好学生:%s\n",(per5+j)->stuno);
}
}
}
int main(void)
{
int menuid;
while(1)
{
if(head==NULL)
{
printf("1、添加学生信息\n0、退出\n");
}
else
{
printf("1、添加学生信息\n\
2、删除学生信息\n\
3、查询学生信息\n\
4、修改学生信息\n\
5、浏览所有学生信息\n\
6、查看所有学生总成绩及平均成绩\n\
7、查看“学习标兵”及“三好学生”\n\
0、退出\n");
}
scanf("%d",&menuid);
switch(menuid)
{
case 1:
{
struct student* tmpstu=(struct student*)malloc(sizeof(struct student));
printf("please input student no.:\n");
tmpstu->stuno=(char*)malloc(20*sizeof(char));
scanf("%s",tmpstu->stuno);
printf("please input the name:\n");
tmpstu->name=(char*)malloc(20*sizeof(char));
scanf("%s",tmpstu->name);
printf("please input student class:\n");
tmpstu->classname=(char*)malloc(20*sizeof(char));
scanf("%s",tmpstu->classname);
printf("please input the math mark:");
scanf("%d",&tmpstu->mark.mathmark);
printf("please input the english mark:");
scanf("%d",&tmpstu->mark.englishmark);
printf("please input the cpp mark:");
scanf("%d",&tmpstu->mark.cppmark);
addStudent(tmpstu);
break;
}
case 2:
{
printf("please input the student no. which you want to delete:\n");
char* tmpch=(char*)malloc(20*sizeof(char));
scanf("%s",tmpch);
deleteStudent(tmpch);
break;
}
case 3:
{
printf("please input the student no. which you want to query:\n");
char* tmpch=(char*)malloc(20*sizeof(char));
scanf("%s",tmpch);
queryStuInfo(tmpch);
break;
}
case 4:
{
printf("please input the student no. which you want to change:\n");
char* tmpch=(char*)malloc(20*sizeof(char));
scanf("%s",tmpch);
changeStudentInfo(tmpch);
break;
}
case 5:
{
struct student* ptr=head;
while(ptr!=NULL)
{
printf("student no.:%s name:%s class:%s english mark:%d math mark:%d cpp mark:%d\n",
ptr->stuno,ptr->name,ptr->classname,ptr->mark.englishmark,ptr->mark.mathmark,ptr->mark.cppmark);
ptr=ptr->next;
}
break;
}
case 6:
{
struct student* ptr=head;
while(ptr!=NULL)
{
struct sumandavg* tmpsa;
tmpsa=calStuMarkByStu(ptr);
printf("%s: totalscore:%d averagescore:%d\n",ptr->stuno,tmpsa->allmark,tmpsa->avgmark);
ptr=ptr->next;
}
break;
}
case 7:
{
getFirstAndPer5();
break;
}
case 0:
{
exit(0);
}
default:
continue;
}
}
}
展开全部
#include "stdio.h"
#include"string"
/*定义学生结构体*/
struct Student
{
char ID[20];
char Name[20];
float Mark1;
float Mark2;
float Mark3;
float Average;
};
/*声明学生数组及学生数量*/
struct Student students[1000];
int num=0;
/*求平均值*/
float Avg(struct Student stu)
{
return (stu.Mark1+stu.Mark2+stu.Mark3)/3;
}
/*通过学号返回数组下标*/
int Student_SearchByIndex(char id[])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(students[i].ID,id)==0)
{
return i;
}
}
return -1;
}
/*通过姓名返回数组下标*/
int Student_SearchByName(char name[])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(students[i].Name,name)==0)
{
return i;
}
}
return -1;
}
/*显示单条学生记录*/
void Student_DisplaySingle(int index)
{
printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩");
printf("-------------------------------------------------------------\n");
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[index].ID,students[index].Name,
students[index].Mark1,students[index].Mark2,students[index].Mark3,students[index].Average);
}
/*插入学生信息*/
void Student_Insert()
{
while(1)
{
printf("请输入学号:");
scanf("%s",&students[num].ID);
getchar();
printf("请输入姓名:");
scanf("%s",&students[num].Name);
getchar();
printf("请输入成绩:");
scanf("%f",&students[num].Mark1);
getchar();
printf("请输入成绩:");
scanf("%f",&students[num].Mark2);
getchar();
printf("请输入成绩:");
scanf("%f",&students[num].Mark3);
getchar();
students[num].Average=Avg(students[num]);
num++;
printf("是否继续?(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/*修改学生信息*/
void Student_Modify()
{
//float mark1,mark2,mark3;
while(1)
{
char id[20];
int index;
printf("请输入要修改的学生的学号:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if (index==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要修改的学生信息为:\n");
Student_DisplaySingle(index);
printf("-- 请输入新值--\n");
printf("请输入学号:");
scanf("%s",&students[index].ID);
getchar();
printf("请输入姓名:");
scanf("%s",&students[index].Name);
getchar();
printf("请输入成绩:");
scanf("%f",&students[index].Mark1);
getchar();
printf("请输入成绩:");
scanf("%f",&students[index].Mark2);
getchar();
printf("请输入成绩:");
scanf("%f",&students[index].Mark3);
getchar();
students[index].Average=Avg(students[index]);
}
printf("是否继续?(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/*删除学生信息*/
void Student_Delete()
{
int i;
while(1)
{
char id[20];
int index;
printf("请输入要删除的学生的学号:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if (index==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要删除的学生信息为:\n");
Student_DisplaySingle(index);
printf("是否真的要删除?(y/n)");
if (getchar()=='y')
{
for (i=index;i<num-1;i++)
{
students[i]=students[i+1];//把后边的对象都向前移动
}
num--;
}
getchar();
}
printf("是否继续?(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/*按姓名查询*/
void Student_Select()
{
while(1)
{
char name[20];
int index;
printf("请输入要查询的学生的姓名:");
scanf("%s",&name);
getchar();
index=Student_SearchByName(name);
if (index==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要查询的学生信息为:\n");
Student_DisplaySingle(index);
}
printf("是否继续?(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/*按平均值排序*/
void Student_SortByAverage()
{
int i,j;
struct Student tmp;
for (i=0;i<num;i++)
{
for (j=1;j<num-i;j++)
{
if (students[j-1].Average<students[j].Average)
{
tmp=students[j-1];
students[j-1]=students[j];
students[j]=tmp;
}
}
}
}
/*显示学生信息*/
void Student_Display()
{
int i;
printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩");
printf("-------------------------------------------------------------\n");
for (i=0;i<num;i++)
{
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[i].ID,students[i].Name,
students[i].Mark1,students[i].Mark2,students[i].Mark3,students[i].Average);
}
}
/*将学生信息从文件读出*/
void IO_ReadInfo()
{
FILE *fp;
int i;
if ((fp=fopen("Database.txt","rb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
if (fread(&num,sizeof(int),1,fp)!=1)
{
num=-1;
}
else
{
for(i=0;i<num;i++)
{
fread(&students[i],sizeof(struct Student),1,fp);
}
}
fclose(fp);
}
/*将学生信息写入文件*/
void IO_WriteInfo()
{
FILE *fp;
int i;
if ((fp=fopen("Database.txt","wb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
if (fwrite(&num,sizeof(int),1,fp)!=1)
{
printf("写入文件错误!\n");
}
for (i=0;i<num;i++)
{
if (fwrite(&students[i],sizeof(struct Student),1,fp)!=1)
{
printf("写入文件错误!\n");
}
}
fclose(fp);
}
/*主程序*/
void main()
{
int choice;
IO_ReadInfo();
while(1)
{
/*主菜单*/
printf("\n------ 学生成绩管理系统------\n");
printf("1. 增加学生记录\n");
printf("2. 修改学生记录\n");
printf("3. 删除学生记录\n");
printf("4. 按姓名查询学生记录\n");
printf("5. 按平均成绩排序\n");
printf("6. 退出\n");
printf("请选择(1-6):");
scanf("%d",&choice);
getchar();
switch(choice)
{
case 1:
Student_Insert();
break;
case 2:
Student_Modify();
break;
case 3:
Student_Delete();
break;
case 4:
Student_Select();
break;
case 5:
Student_SortByAverage();
Student_Display();
break;
case 6:
exit(0);
break;
}
IO_WriteInfo();
}
}
</span>
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询