学生成绩管理系统,请大佬们帮帮忙

设计和实现一个“学生成绩管理系统”,满足以下要求: 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;
}