设计和实现一个“学生成绩管理系统”,满足以下要求: 1.系统以菜单方式工作; 2.使用链表或结构数组对学生成绩进行管理和维护; 3.使用二进制文件在磁盘上保存学生记录信息; 4.链表中各结点或结构数组中各元素包括“学号、姓名、语文、数学、外语、总分、平均分”基本字段; 5.实现如下基本功能: (1)查看所有学生信息 (2)查找学生(查找并显示该学生的学号、姓名、所有课程成绩及平均分) 按学号查找 按姓名查找 (3)删除学生(删除指定学号的学生) (4)排序 按学号排序 按总分排序 (5)添加学生 (此功能下可实现学生信息的录入) (6)插入学生 (在已按学号有序的提下,将学生插入到合适的位置) (7)计算总分和平均分 (8)将学生记录保存到文件(将数据以文件的形式存盘) (9)从文件中读出学生记录(将已经存盘的文件数据读入内存)
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
int n;
struct student//结构体
{
int xuehao;
char name[20];
int score;
}student[20];
//student[i].xuehao;
//student[i].name;
//student[i].score;
int color(int c) //颜色函数
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c); //更改文字颜色
return 0;
}
void input(struct student *p)//学生信息输入
{
int i;
printf("学生信息输入\n");
printf("请输入学生的实际人数:");
scanf("%d",&n);//输入最大人数
printf("请输入学生的学号 姓名 成绩:");
for(i=0;i<n;i++)//输入每一个学生的学号,名字,成绩
{
scanf("%d %s %d",&p[i].xuehao,&p[i].name,&p[i].score);
}
printf("学生信息输入已完成\n");
printf("按回车键继续");
getch();
}
void del(struct student *p)//学生信息删除
{
int number,i,flag;
printf("学生信息删除\n");
printf("请输入要删除的学生学号:");
scanf("%d",&number);
for(i=0;i<n;i++)
{
if(p[i].xuehao==number)
{
printf("%s的信息是你要删除的吗?\n",p[i].name);
printf("%d %s %d\n",p[i].xuehao,p[i].name,p[i].score);
printf("1:确定 0:否定\n");
scanf("%d",&flag);
if(flag==1)//执行确定删除
{
p[i].score=-1;
}
}
}
printf("学生信息删除已完成\n");
printf("按回车键继续");
getch();
}
void find(struct student *p)//学生信息查询
{
int number,i;
int flag=0;
printf("学生信息查询\n");
printf("请输入要查找的学生学号:");
scanf("%d",&number);
for(i=0;i<n;i++)
{
if(p[i].score==-1)
{
continue;
}
if((number==p[i].xuehao)&&(p[i].score!='\0'))
{
flag=1;
printf("你要查询的学生信息是%d %s %d\n",
p[i].xuehao,p[i].name,p[i].score);
}
}
if(flag==0){
printf("没有找到该学生信息\n");
}
printf("学生信息查询已完成\n");
printf("按回车键继续");
getch();
}
void sort(struct student *p)//学生信息排序
{
int i,j;
struct student t;
printf("学生信息排序\n");
for(i=0;i<n-1;i++)
{
if(p[i].score==-1)
{
continue;
}
for(j=0;j<n-1-i;j++)
{
if(p[j].score>p[j+1].score)
{
t=p[j];
p[j]=p[j+1];
p[j+1]=t;
}
}
}
for(i=0;i<n;i++){
if(p[i].score==-1){
continue;
}
printf("%d %s %d\n",p[i].xuehao,p[i].name,p[i].score);
}
printf("学生信息排序已完成\n");
printf("按回车键继续");
getch();
}
void display(struct student *p)//显示学生信息
{
int i;
printf("显示成绩\n");
for(i=0;i<n;i++)
{
if(p[i].score!=-1)
{
printf("%d %s %d\n",p[i].xuehao,p[i].name,p[i].score);
}
}
printf("学生信息显示已完成\n");
printf("按回车键继续");
getch();
}
void save(struct student *p)//学生信息保存
{
int i;
FILE *fp;
if((fp=fopen("student.dat","w"))==NULL)
{
printf("open file error\n");
return;
}
for(i=0;i<n;i++)
{
if(p[i].score==-1)
{
continue;
}
fprintf(fp,"%d %s %d\n",p[i].xuehao,p[i].name,p[i].score);
}
fclose(fp);//关闭
printf("学生信息保存已完成\n");
printf("按回车键继续");
getch();
}
int main(){
while(1){
int x;
system("cls");
color(11);
printf("\n");
printf(" 欢迎使用学生成绩管理系统 \n");
printf("\n");
printf("\n");
printf(" *************************** \n");
printf(" * 主菜单 *\n");
printf(" ***************************\n");
printf("\n");
printf("\n");
printf(" 1 成绩输入 2 成绩删除 \n");
printf("\n");
printf(" 3 成绩查询 4 成绩排序 \n");
printf("\n");
printf(" 5 显示成绩 6 成绩保存 \n");
printf("\n");
printf(" 7 退出系统\n");
printf("\n");
printf(" 请选择[1/2/3/4/5/6/7]: ");
scanf("%d",&x);
printf("\n");
switch(x){
case 1:input(&student[0]);break;
case 2:del(&student[0]);break;
case 3:find(&student[0]);break;
case 4:sort(&student[0]);break;
case 5:display(&student[0]);break;
case 6:save(&student[0]);break;
case 7:printf("退出系统\n");break;
default:printf("所调用菜单函数不存在,请重新输入。\n");
}
if(x==7) break;
}
return 0;
}
你要说明你现在能设计到哪个阶段,碰到什么具体问题, 然后大家才能帮你。
#include<stdio.h>
#include<string.h>
#include "student.h"
void first_menu()
{
printf("\t\t学生成绩管理系统\n");
printf("************************************************\n");
printf("\t\t1.老师\n");
printf("\t\t2.学生\n");
printf("\t\t3.管理员\n");
printf("************************************************\n");
}
void student_menu()
{
printf("\t\t学生成绩管理系统\n");
printf("************************************************\n");
printf("\t\t3.成绩查询\n");
printf("\t\t8.退出程序\n");
printf("************************************************\n");
}
void adm_menu()
{
printf("\t\t学生成绩管理系统\n");
printf("************************************************\n");
printf("\t\t1.成绩添加\n");
printf("\t\t2.成绩删除\n");
printf("\t\t3.成绩查询\n");
printf("\t\t4.成绩统计\n");
printf("\t\t5.成绩修改\n");
printf("\t\t6.成绩打印\n");
printf("\t\t8.退出程序\n");
printf("************************************************\n");
}
void teacher_menu()
{
printf("\t\t学生成绩管理系统\n");
printf("************************************************\n");
printf("\t\t1.成绩添加\n");
printf("\t\t2.成绩删除\n");
printf("\t\t8.退出程序\n");
printf("************************************************\n");
}
void student_print(struct student std)//打印单个数据(测试使用)
{
printf("********************************************************************************\n");
printf("学号\t姓名\t性别\t年龄\t英语\t\t语文\t\t数学\n");
printf("%d\t%s\t%c\t%d\t%f\t%f\t%f\n",std.no,std.name,std.sex,std.age,std.english,std.chinese,std.math);
printf("********************************************************************************\n");
}
void student_array_print(int len, struct student stu[])//打印结构体
{
int i;
printf("********************************************************************************\n");
printf("学号\t姓名\t性别\t年龄\t英语\t\t语文\t\t数学\n");
for(i=0; i<len; i++)
{
printf("%d\t%s\t%c\t%d\t%f\t%f\t%f\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].age,stu[i].english,stu[i].chinese,stu[i].math);
}
printf("********************************************************************************\n");
}
int student_array_save(int len,struct student stu[])//将数据存储在硬盘上
{
FILE *fp;//先定义一个文件指针
if((fp=fopen("student.dat","wb"))==NULL)//wb存储一个二进制文件
{
printf("文件打开失败。");
return -1;//失败就是返回-1
}
int i;
for(i=0; i<len; i++)
{
//取一下这个结构体的地址
fwrite(&stu[i],sizeof(struct student),1,fp);//int fwrite(const void *buffer,size,cout,FILE *stream)从buffer(缓存区中)写count个大小为size的对象到stream(流)指定的流,返回值是自己的对象
if(ferror(fp))//判断状态位是否错了
{
printf("数据写入文件失败。\n");
return -2;
}
}
fclose(fp);//关闭文件
return 0;//返回0表示成功
}
//我们将实参传进来后 len的值也会随之二变化,这样就可以跟上面的return 0 保持一致性
int student_array_init(int *len,struct student stu[])//初始化数组,并且返回一个数组的长度
{
FILE *fp;//先定义一个文件指针
if((fp=fopen("student.dat","ab+"))==NULL)//wb存储一个二进制文件,+表示可以读,ab+不会把原来的数据清除
{
printf("文件打开失败。");
return -1;//失败就是返回-1
}
fread(&stu[0],sizeof(struct student),1,fp);//指针地址,读写大小,读几次,指向打开的文件(先读一次,让fp有一个状态位,之后在进行读取)
int i=0;
while(!feof(fp))//这个是判断是否结束了
{
i++;
fread(&stu[i],sizeof(struct student),1,fp);
if(ferror(fp))//判断状态位是否错了
{
printf("数据读取文件失败。\n");
return -3;
}
}
*len = i;
fclose(fp);
return 0;
}
int student_add(int *len,struct student stu[])
{
struct student std;
int num,i;
printf("请输入要处理的学生人数:");
scanf("%d",&num);
for(i=0; i<num; i++)
{
printf("请输入第%d个的学生成绩:\n",i+1);
printf("输入学号:");
scanf("%d",&std.no);
printf("请输入姓名:");
scanf("%s",&std.name);
fflush(stdin);//输入缓冲区
printf("请输入性别:");
scanf("%c",&std.sex);
printf("请输入年龄:");
scanf("%d",&std.age);
printf("请输入英语成绩:");
scanf("%f",&std.english);
printf("请输入语文成绩:");
scanf("%f",&std.chinese);
printf("请输入数学成绩:");
scanf("%f",&std.math);
stu[*len] = std;
(*len)++;
}
student_array_save(*len,stu);
student_array_print(*len,stu);
return 0;
}
int student_del_by_name(char name[],int *len,struct student stu[])
{
int i;
for(i=0; i<*len; i++)
{
if(strcmp(name,stu[i].name)==0)//字符串1等于字符串2,strcmp函数返回零;
break;
}
if(i == *len)
{
printf("删除失败,无法找到学生%s的信息\n",name);
return -1;
}
for(i; i<*len-1; i++) //????????这里是做一个覆盖,一个往前覆盖数组的变化
{
stu[i] = stu[i+1];
}
(*len)--;
return 0;
}
int student_del_by_no(unsigned int no,int *len,struct student stu[])
{
int i;
for(i=0; i<*len; i++)
{
if(no == stu[i].no)
break;
}
if(i == *len)
{
printf("删除失败,无法找到学生%d的信息\n",no);
return -1;
}
for(i; i<*len-1; i++) //????????
{
stu[i] = stu[i+1];
}
(*len)--;
return 0;
}
int student_delete(int *len,struct student stu[])
{
student_array_print(*len,stu);
printf("*******************************\n");
printf("1.通过姓名查找删除\n");
printf("2.通过学号查找删除\n");
printf("*******************************\n");
int select;
printf("请输入您想要选择的序号:");
scanf("%d",&select);
if( select == 1)
{
char name[20];
printf("请输入要删除学生的姓名:");
scanf("%s",name);
student_del_by_name(name,len,stu);
}
if( select == 2 )
{
unsigned int no;
printf("请输入要删除学生的学号:");
scanf("%d",&no);
student_del_by_no(no,len,stu);
}
student_array_save(*len,stu);//修改完要保存
student_array_print(*len,stu);
return 0;
}
int student_find_by_name(char name[],int len,struct student stu[])
{
int i;
for(i=0; i<len; i++)
{
if(strcmp(name,stu[i].name)==0)//字符串1等于字符串2,strcmp函数返回零;
break;
}
if(i == len)
{
printf("查询失败,无法找到学生%s的信息\n",name);
return -1;
}
printf("查找成功\n");
student_print(stu[i]);
return 0;
}
int student_find_by_no(unsigned int no,int len,struct student stu[])
{
int i;
for(i=0; i<len; i++)
{
if(no == stu[i].no)
break;
}
if(i == len)
{
printf("查询失败,无法找到学生%d的信息\n",no);
return -1;
}
printf("查找成功\n");
student_print(stu[i]);
return 0;
}
int student_find(int len,struct student stu[])
{
printf("*******************************\n");
printf("1.通过姓名查找\n");
printf("2.通过学号查找\n");
printf("*******************************\n");
int select;
printf("请输入您想要选择的序号:");
scanf("%d",&select);
if( select == 1)
{
char name[20];
printf("请输入要查询学生的姓名:");
scanf("%s",name);
student_find_by_name(name,len,stu);
}
else if( select == 2 )
{
unsigned int no;
printf("请输入要查询学生的学号:");
scanf("%d",&no);
student_find_by_no(no,len,stu);
}
else
{
printf("输入无效");
}
}
int student_modify_by_name(char name[],int len,struct student stu[])
{
int i;
for(i=0; i<len; i++)
{
if(strcmp(name,stu[i].name)==0)//字符串1等于字符串2,strcmp函数返回零;
break;
}
if(i == len)
{
printf("查询失败,无法找到学生%s的信息\n",name);
return -1;
}
printf("***********************\n");
printf("1.修改学号:\n");
printf("2.修改姓名:\n");
printf("3.修改性别:\n");
printf("4.修改年龄:\n");
printf("5.修改英语成绩:\n");
printf("6.修改语文成绩:\n");
printf("7.修改数学成绩:\n");
printf("***********************\n");
printf("请输入修改选项:");
int select;
scanf("%d",&select);
switch(select)
{
case 1:
printf("请输入新学号");
scanf("%d",&stu[i].no);
break;
case 2:
printf("请输入新姓名");
scanf("%s",stu[i].name);
break;
case 3:
printf("请输入新性别");
scanf("%c",&stu[i].sex);
break;
case 4:
printf("请输入新年龄");
scanf("%d",&stu[i].age);
break;
case 5:
printf("请输入新英语成绩");
scanf("%f",&stu[i].english);
break;
case 6:
printf("请输入新语文成绩");
scanf("%f",&stu[i].chinese);
break;
case 7:
printf("请输入新数学");
scanf("%f",&stu[i].math);
break;
default:
printf("输入无效\n");
break;
}
student_print(stu[i]);
return 0;
}
int student_modify_by_no(unsigned int no,int len,struct student stu[])
{
int i;
for(i=0; i<len; i++)
{
if(no == stu[i].no)
break;
}
if(i == len)
{
printf("查询失败,无法找到学生%d的信息\n",no);
return -1;
}
printf("***********************\n");
printf("1.修改学号\n");
printf("2.修改姓名\n");
printf("3.修改性别\n");
printf("4.修改年龄\n");
printf("5.修改英语\n");
printf("6.修改语文\n");
printf("7.修改数学\n");
printf("***********************\n");
printf("请输入修改选项:");
int select;
scanf("%d",&select);
switch(select)
{
case 1:
printf("请输入新学号");
scanf("%d",&stu[i].no);
break;
case 2:
printf("请输入新姓名");
scanf("%s",stu[i].name);
break;
case 3:
printf("请输入新性别");
scanf("%c",&stu[i].sex);
break;
case 4:
printf("请输入新年龄");
scanf("%d",&stu[i].age);
break;
case 5:
printf("请输入新英语成绩");
scanf("%f",&stu[i].english);
break;
case 6:
printf("请输入新语文成绩");
scanf("%f",&stu[i].chinese);
break;
case 7:
printf("请输入新数学");
scanf("%f",&stu[i].math);
break;
default:
printf("输入无效\n");
break;
}
student_print(stu[i]);
return 0;
}
int student_modify(int len,struct student stu[])
{
printf("*******************************\n");
printf("1.通过姓名查找修改\n");
printf("2.通过学号查找修改\n");
printf("*******************************\n");
int select;
printf("请输入您想要选择的序号:");
scanf("%d",&select);
if( select == 1)
{
char name[20];
printf("请输入要修改学生的姓名:");
scanf("%s",name);
student_modify_by_name(name,len,stu);
}
else if( select == 2 )
{
unsigned int no;
printf("请输入要修改学生的学号:");
scanf("%d",&no);
student_modify_by_no(no,len,stu);
}
else
{
printf("输入无效");
}
student_array_save(len,stu);
student_array_print(len,stu);
}
int student_tongji(int len,struct student stu[])
{
float chinese_avr=0,english_avr=0,math_avr=0;//平均分
int chinese_num=0,english_num=0,math_num=0;//不及格人数
int total_num=0;//总的不及格人数
float score_avr[len];//计算某个学生的平均成绩
float avr = 0;//总的平均分
int i;
for(i=0; i<len; i++)
{
chinese_avr += stu[i].chinese;
english_avr += stu[i].english;
math_avr += stu[i].math;
score_avr[i] = stu[i].chinese + stu[i].english + stu[i].math;
score_avr[i] /= 3;
if( stu[i].chinese < 60 )//计算不及格的人数
{
chinese_num++;
}
if( stu[i].english < 60 )//计算不及格的人数
{
english_num++;
}
if( stu[i].math < 60 )//计算不及格的人数
{
math_num++;
}
}
chinese_avr /= len;
english_avr /= len;
math_avr /= len;
total_num = chinese_num + english_num + math_num;
avr = ( chinese_avr + english_avr + math_avr )/3;
printf("*******************************************************************\n");
printf(" 学生成绩统计 \n");
printf("学号\t姓名\t平均分\n");
for(i=0; i<len; i++)
{
printf("%d\t%s\t%f\n",stu[i].no,stu[i].name,score_avr[i]);
}
printf("*******************************************************************\n");
printf("语文平均成绩:%f\t\t不及格人数:%d\n",chinese_avr,chinese_num);
printf("英语平均成绩:%f\t\t不及格人数:%d\n",english_avr,english_num);
printf("数学平均成绩:%f\t\t不及格人数:%d\n",math_avr,math_num);
printf("*******************************************************************\n");
printf("总平均分:%f\n",avr);
printf("全部不及格的人数:%d\n",total_num);
printf("*******************************************************************\n");
return 0;
}