C语言课题设计----学生学籍信息管理系统(附打包下载)

简介: C语言课题设计----学生学籍信息管理系统(附打包下载)

目录

写在前面

程序设计要求

概要设计

主菜单模块

编辑

录入/增加信息模块

查找信息模块

删除基本信息模块

删除学生成绩模块

展示学生信息模块

展示学生成绩模块

学生信息排序模块

源码

实验报告源码流程图下载链接


写在前面

本文为本人大一程序设计课选题代码,文章开头末尾附带源码和实验报告及流程图下载,欢迎关注评论留言。

链接:https://pan.baidu.com/s/1CyxfN4hxRw6KDftwmeXO8w?pwd=1234 

提取码:1234

程序设计要求

1、需求分析

学生基本信息、学生成绩基本信息要存入文件当中,因而要提供文件的输入输出操作;查询功能要求提供查找和显示操作;删除功能要求实现删除操作;排序功能要求实现排序操作;另外还应该提供键盘式选择菜单以实现功能选择。

2、总体设计

整个系统可以设计为数据录入模块、数据查询模块、数据删除模块和数据排序模块。

3、详细设计

(1)数据录入模块

学生基本信息文件可以在磁盘建立,采用写文件方式录入学生成绩基本信息。综合成绩和实得学分通过计算得到。

(2)查询模块

通过菜单选择查询功能,再选择学生基本情况查询和成绩查询

若选择前者,再通过菜单选择学号、姓名或宿舍号码,按照基本查找算法查找A.TXT,然后把查找结果输出

若选择后者,则先在A.TXT中查找学号对应的姓名,再在B.TXT中查找该学生的课程情况,并统计科目和实得总学分,输出结果。(fread和查找算法的应用)

(3)删除模块

通过菜单选择删除学生的功能,输入要删除学生的学号,则分别在A.TXT和B.TXT中查找该生信息,删除之;或者输入学生的姓名,先在A.TXT中得到该生的学号,删除该生信息,再在B.TXT中删除该学号对应的信息。注意:C语言中没有直接删除信息的函数,需要自己实现,可以采取读出数据,判断数据(如果不删除,则进入缓冲区,否则删除),写入数据(把缓冲区中的数据写入文件)的步骤进行。

(4)排序模块

通过菜单选择排序依据,采用排序算法(冒泡、插入、选择等)对数据进行排序并输出结果。首先要读文件(fread)。

struct 
{
  char  stuNo[15];     //学号
  char  name[20];   //姓名
  char  sex[3];     //性别
  char  domNum[10];   //宿舍号 
  char  tel[12];        //电话号码 
}StuInfo[N];   //学生基本信息结构体
struct
{
  char  stuNo[15];     //学号
  char  courseNo[10];  //课程编号
  char  courseName[20];  //课程名称
  int  creditHour;  //学分
int  triGrade;  //平时成绩
int  experiGrade;  //实验成绩
int  examGrade;  //卷面成绩
float  totalGrade;  //综合成绩
float  finalCreHour;  //实得学分
}StuGraInfo[N];   //学生成绩基本信息结构体

image.gif

以上为题目要求,下面是具体代码实现,分为各个模块实现,最后附有全部代码。

概要设计

image.gif编辑

主菜单模块

image.gif编辑

enum option
{    exit,             //退出
  add,             //增加
  search,           //搜索
  delInfo,          //删除基本信息
  delGrade,        //删除成绩信息
  showinfor,       //展示基本信息
  showgrade,      //展示成绩信息
  order,           //排序
};
int main()
{
  int input =1;
  menu();
  do 
  {
    printf("请选择:-->");
    scanf("%d", &input);
    switch (input)  //初始界面进行选择
    {
    case add:
      Add();break;
    case search:
      Search();break;
    case delInfo:
      DelInfo();break;
    case delGrade:
      DelGrade();break;
    case showinfor:
      showInfor();break;
    case showgrade:
      showGrade();break;
    case order:
      Order();break;
    case exit:break;
    default:printf("输入格式错误");
    }
  } while (input);
  return 0;
}

image.gif

录入/增加信息模块

首先创建或打开文件,若失败则返回错误提示信息,再提示用户输入Y/N进行是否输入用户基本信息和用户成绩信息,如此做可使得用户自主选择输入所需的信息进行存储,每次结束输入时再提示用户是否继续输入,可提供多次输入。

image.gif编辑

void Add()
{
  int i, m = 0,n=0;
  char ch[2]={'\0'};
  printf("进行学生基本信息录入:\n");
  FILE* fp1;
  FILE* fp2;
  if ((fp1 = fopen("A.txt", "wb")) == NULL)
  {
    printf("无法打开学生基本信息\n");
  }
  for (i = 0; i < m; i++)
  {
    fwrite(&stu[i], LEN, 1, fp1);
  }
  printf("请进行选择-->(y/n):");
  scanf("%s", ch);
  while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
  {
    printf("学号:"); 
    scanf("%s", &stu[m].stuNo);
    printf("姓名:");
    scanf("%s", stu[m].name);
    printf("性别:");
    scanf("%s", &stu[m].sex);
    printf("宿舍号:");
    scanf("%s", &stu[m].domNum);
    printf("电话号码:"); 
    scanf("%s", &stu[m].tel);
    if (fwrite(&stu[m], LEN, 1, fp1) != 1)
    {
      printf("无法保存!"); 
    }
    else 
    { 
      printf("%s 保存成功!\n", stu[m].name); 
      m++; 
    }
    printf("是否继续存储?(y/n):");
    scanf("%s", ch);
  }
  fclose(fp1);
  printf("进行学生成绩基本信息录入:\n");
  if ((fp2 = fopen("B.txt", "wb")) == NULL)
  {
    printf("无法打开学生成绩基本信息\n");
  }
  for (i = 0; i < n; i++)
  {
    fwrite(&stu2[i], LEN2, 1, fp2);
  }
  printf("是否进行信息录入(y/n):");
  scanf("%s", ch);
  while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
  {
    printf("学号:");
    scanf("%s", &stu2[n].stuNo);
    printf("课程编号:");
    scanf("%s", stu2[n].courseNo);
    printf("课程名称:");
    scanf("%s", &stu2[n].courseName);
    printf("学分:");
    scanf("%d", &stu2[n].creditHour);
    printf("平时成绩:");
    scanf("%d", &stu2[n].triGrade);
    printf("实验成绩:");
    scanf("%d", &stu2[n].experiGrade);
    printf("卷面成绩:");
    scanf("%d", &stu2[n].examGrade);
    printf("综合成绩:");
    scanf("%f", &stu2[n].totalGrade);
    printf("实得学分:");
    scanf("%f", &stu2[n].finalCreHour);
    if (fwrite(&stu2[n], LEN2, 1, fp2) != 1)
    {
      printf("保存失败!");
    }
    else
    {
      printf("%s 成绩保存成功!\n", stu[n].name);
      n++;
    }
    printf("是否继续录入?(y/n):");
    scanf("%s", ch);
  }
  fclose(fp2);
  printf("录入完毕!\n");
}

image.gif

查找信息模块

实现查找模块代码首先要确认查找哪部分信息,其次要确认查找的依据是什么,则首先打开对应的文件,首先判断是否有信息和打开情况,无误后进行查找,再将查找的结果显示到显示屏上,提示用户找到与否和是否输出,即可完成该模块的代码实现。

image.gif编辑

void Search()
{
  char str[20] = { '\0' };
  int num = 0;
  printf("1.学生信息查询      2.学生成绩查询");
  printf("请选择你的查询方式:-->");
  scanf("%d",&num);
  FILE* fp;
  int snum, i, m = 0;
  char ch[2];
  if ((fp = fopen("A.txt", "rb")) == NULL)
  {
    printf("无法打开\n"); 
    return;
  }
  while (!feof(fp))  
    if (fread(&stu[m], LEN, 1, fp) == 1)
      m++;
  fclose(fp);
  if (m == 0) 
  {
    printf("无信息记录!\n"); 
    return; 
  }
  if (num == 1)
  {
    int op = 0;
    printf("1.学号  2.姓名  3.宿舍号码");
    printf("请选择你的查询方式-->");
    scanf("%d", &op);
    switch (op)
    {
    case 1:
      printf("请输入要查找的学号:");
      scanf("%s", &str);
      for (i = 0; i < m; i++)
        if (strcmp(stu[i].stuNo, str) == 0)
        {
          printf("找到了,是否显示?(y/n)");
          scanf("%s", ch);
          if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
          {
            printf("%-8s%-8s%-8s%-8s%-8s%\n",
              stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel);
            break;
          }
        }
      if (i == m)
        printf("未找到该学生信息!\n");
      break;
    case 2:
      printf("请输入要查找的姓名:");
      scanf("%s", &str);
      for (i = 0; i < m; i++)
        if (strcmp(stu[i].name, str) == 0)
        {
          printf("找到了,是否显示?(y/n)");
          scanf("%s", ch);
          if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
          {
            printf("%-8s%-8s%-8s%-8s%-8s%\n",
              stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel);
            break;
          }
        }
      if (i == m)
        printf("未找到该学生信息!\n");
      break;
    case 3:
      printf("请输入要查找的宿舍号:");
      scanf("%s", &str);
      for (i = 0; i < m; i++)
        if (strcmp(stu[i].domNum, str) == 0)
        {
          printf("找到了,是否显示?(y/n)");
          scanf("%s", ch);
          if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
          {
            printf("%-8s%-8s%-8s%-8s%-8s%\n",
              stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel);
            break;
          }
        }
      if (i == m)
        printf("未找到该学生信息!\n");
      break;
    }
  }
  else if (num == 2)
  {
    char stunum[20];
    printf("请输入要查找的学号:");
    scanf("%s", &str);
    for (i = 0; i < m; i++)
      if (strcmp(stu[i].stuNo, str) == 0)
      {
        strcpy(stunum, stu[i].stuNo);
      }
    if (i == m)
      printf("未找到该学生信息!\n");
    FILE* fp2;
    int snum2, i2, m2 = 0;
    char ch2[2];
    if ((fp2 = fopen("B.txt", "rb")) == NULL)
    {
      printf("无法打开\n"); return;
    }
    while (!feof(fp))  
      if (fread(&stu2[m2], LEN2, 1, fp2) == 1) 
        m2++;
    fclose(fp);
    if (m2 == 0) 
    {
      printf("无信息记录!\n");
      return; 
    }
    for (i = 0; i < m; i++)
      if (strcmp(stunum,stu2[i].stuNo)==0)
      {
        printf("找到了,是否显示?(y/n)");
        scanf("%s", ch);
        if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
        {
          printf("课程名称\t实得学分\t\n");
          printf("%-8s-8f%",stu2[i].courseName, stu2[i].finalCreHour);
          break;
        }
      }
    if (i == m) 
      printf("无法找到该学生!\n");
  }
  else
    printf("输入格式错误,请重新输入\n");
}

image.gif

删除基本信息模块

基本思路为让用户输入一个学号,再到信息库中寻找,找到了把它删除,找不到反馈用户,则首先要打开文件,然后提示用户输出一个学号,再将学号与信息库中的所有项目进行比较,如果找到了询问用户是否删除,删除后提示用户删除成功,若失败则反馈失败原因。

image.gif编辑

void DelInfo()
{
  FILE* fp1;
  FILE* fp2;
  char snum[20];
  int i, j, m = 0;
  char ch[2];
  if ((fp1 = fopen("A.txt", "r+")) == NULL)
  {
    printf("无法打开\n"); 
    return;
  }
  while (!feof(fp1))  
    if (fread(&stu[m], LEN, 1, fp1) == 1)
      m++;
  fclose(fp1);
  if (m == 0)
  {
    printf("无内容,请先添加!\n");
    return;
  }
  printf("请输入要删除的学号:");
  scanf("%s", &snum);
  for (i = 0; i < m; i++)
    if (strcmp(snum,stu[i].stuNo)==0)
      break;
  printf("找到了,是否删除?(y/n)");
  scanf("%s", ch);
  if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
    for (j = i; j < m; j++)
      stu[j] = stu[j + 1];
  m--;
  if ((fp1 = fopen("A.txt", "wb")) == NULL)
  {
    printf("无法打开文件\n"); 
    return;
  }
  for (j = 0; j < m; j++)
    if (fwrite(&stu[j], LEN, 1, fp1) != 1)
      printf("无法存储!\n");
  fclose(fp1);
  printf("删除成功!\n");
}

image.gif

删除学生成绩模块

基本思路为让用户输入一个学号,再到信息库中寻找,找到了把它删除,找不到反馈用户,则首先要打开文件,然后提示用户输出一个学号,再将学号与信息库中的所有项目进行比较,如果找到了询问用户是否删除,删除后提示用户删除成功,若失败则反馈失败原因。

image.gif编辑

void DelGrade()  //删除成绩信息 和学生信息模块相似
{
  FILE* fp2;
  int i, j, n = 0;
  char snum[20];
  char ch[2];
  if ((fp2 = fopen("B.txt", "r+")) == NULL)
  {
    printf("无法打开\n"); 
    return;
  }
  while (!feof(fp2))  
    if (fread(&stu2[n], LEN2, 1, fp2) == 1) 
      n++;
  fclose(fp2);
  if (n == 0)
  {
    printf("找不到记录!\n");
    return;
  }
  printf("请输入要删除的学号:");
  scanf("%s", snum);
  for (i = 0; i < n; i++)
    if (strcmp(snum,stu2[i].stuNo)==0)
      break;
  printf("找到了,是否删除?(y/n)");
  scanf("%s", ch);
  if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
    for (j = i; j < n; j++)
      stu[j] = stu[j + 1];
  n--;
  if ((fp2 = fopen("data.txt", "wb")) == NULL)
  {
    printf("无法打开文件\n"); 
    return;
  }
  for (j = 0; j < n; j++)
    if (fwrite(&stu2[j], LEN2, 1, fp2) != 1)
    {
      printf("无法存储!\n");
    }
  fclose(fp2);
  printf("删除成功!\n");
}

image.gif

展示学生信息模块

只需要利用一个循环结构将文件中的数据都读取出来然后输出即可,则只需要先读取文件然后按格式输出信息即可。

image.gif编辑

void showInfor()
{
  FILE* fp1;
  int i, m = 0;
  fp1 = fopen("A.txt", "rb");
  while (!feof(fp1))
  {
    if (fread(&stu[m], LEN, 1, fp1) == 1) m++;
  }
  fclose(fp1);
  printf("学号\t姓名\t性别\t宿舍号\t电话号\t\n");
  for (i = 0; i < m; i++)
  {
    printf("%-8s%-8s%-8s%-8s%-8s\n",
      stu[i].stuNo,stu[i].name,stu[i].sex,stu[i].domNum,stu[i].tel);
  }
}

image.gif

展示学生成绩模块

只需要利用一个循环结构将文件中的数据都读取出来然后输出即可,则只需要先读取文件然后按格式输出信息即可。

image.gif编辑

void showGrade()
{
  FILE* fp2;
  int i, m = 0;
  fp2 = fopen("B.txt", "rb");
  while (!feof(fp2))
  {
    if (fread(&stu2[m], LEN2, 1, fp2) == 1)
      m++;
  }
  fclose(fp2);
  printf("学号\t课程编号\t课程名称\t学分\t平时成绩\t实验成绩\t卷面成绩\t综合成绩\t实得学分\t\n");
  for (i = 0; i < m; i++)
  {
    printf("%-8s%-8s%-8s%-8d%-8d%-8d%-8d%-8f%-8f\n",
      stu2[i].stuNo,stu2[i].courseNo,stu2[i].courseName,stu2[i].creditHour,
    stu2[i].triGrade,stu2[i].experiGrade,stu2[i].examGrade,stu2[i].totalGrade,stu2[i].finalCreHour);
  }
}

image.gif

学生信息排序模块

首先进行选择,选择需要的排序方式,接着读取文件中的信息,引入一个冒泡排序进行排序,最后提示用户排序完成,用户可选择展示功能查看排序完成后的结果。

image.gif编辑

void Order()
{
  int option = 0;
  printf("1.平时成绩         2.实验成绩\n");
  printf("3.卷面成绩         4.综合成绩\n");
  printf("请选择排序依据:-->");
  scanf("%d", &option);
  FILE* fp2;
  struct stu_grade t;
  int i = 0, j = 0, m = 0;
  if ((fp2 = fopen("B.txt", "r+")) == NULL)
  {
    printf("无法打开!\n");
    return;
  }
  while (!feof(fp2))
    if (fread(&stu2[m], LEN2, 1, fp2) == 1)
      m++;
  fclose(fp2);
  if (m == 0)
  {
    printf("无输入记录!\n");
    return;
  }
  if ((fp2 = fopen("B.txt", "wb")) == NULL)
  {
    printf("无法打开\n");
    return;
  }
  switch (option)
  {
  case 1:
    for (i = 0; i < m - 1; i++)
      for (j = i + 1; j < m; j++)
        if (stu2[j].triGrade > stu2[j+1].triGrade)
        {
          t = stu2[i];
          stu2[i] = stu2[j];
          stu2[j] = t;
        }
    break;
  case 2:
    for (i = 0; i < m - 1; i++)
      for (j = i + 1; j < m; j++)
        if (stu2[i].experiGrade <= stu2[j].experiGrade)
        {
          t = stu2[i]; 
          stu2[i] = stu2[j]; 
          stu2[j] = t;
        }
    break;
  case 3:
    for (i = 0; i < m - 1; i++)
      for (j = i + 1; j < m; j++)
        if (stu2[i].examGrade<= stu2[j].examGrade)
        {
          t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t;
        }
    break;
  case 4:
    for (i = 0; i < m - 1; i++)
      for (j = i + 1; j < m; j++)
        if (stu2[i].totalGrade <= stu2[j].totalGrade)
        {
          t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t;
        }
    break;
  default:
    printf("输入格式错误,请重新输入");
  }
  if ((fp2 = fopen("B.txt", "wb")) == NULL)
  {
    printf("无法打开\n");
    return;
  }
  for (i = 0; i < m; i++)
    if (fwrite(&stu2[i], LEN2, 1, fp2) != 1)
    {
      printf("%s 无法存储!\n");
    }
  fclose(fp2);
  printf("存储成功\n");
}

image.gif

源码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>  //输入输出必须头文件
#include <string.h>  //用于计算分配内存的头文件 strlen函数
struct stu_info 
{
  char  stuNo[15];     //学号
  char  name[20];   //姓名
  char  sex[3];     //性别
  char  domNum[10];   //宿舍号 
  char  tel[12];        //电话号码 
};   //学生基本信息结构体
struct stu_grade 
{
  char  stuNo[15];     //学号
  char  courseNo[10];  //课程编号
  char  courseName[20];  //课程名称
  int  creditHour;  //学分
  int  triGrade;  //平时成绩
  int  experiGrade;  //实验成绩
  int  examGrade;  //卷面成绩
  float  totalGrade;  //综合成绩
  float  finalCreHour;  //实得学分
};   //学生成绩基本信息结构体
struct stu_info stu[80];
int LEN = sizeof(struct stu_info);
struct stu_grade stu2[80];
int LEN2 = sizeof(struct stu_grade);
void menu() //主菜单函数
{
  printf("***********************************************\n");
  printf("*** 1.录入学生信息          2.搜索学生信息  ***\n");
  printf("*** 3.删除基本信息          4.删除成绩信息  ***\n");
  printf("****5.展示基本信息          6.展示成绩信息  ***\n");
  printf("****7.学生信息排序          0.退出管理系统  ***\n");
  printf("***********************************************\n"); //打印菜单的模式图
}
void showInfor() //展示学生信息模块
{
  FILE* fp1;
  int i, m = 0;
  fp1 = fopen("A.txt", "rb");  //打开已经创建好的存储学生信息的文件
  while (!feof(fp1))
  {
    if (fread(&stu[m], LEN, 1, fp1) == 1)  //读取文件函数信息
      m++;
  }
  fclose(fp1);
  printf("学号\t姓名\t性别\t宿舍号\t电话号\t\n");
  for (i = 0; i < m; i++)
  {
    printf("%-8s%-8s%-8s%-8s%-8s\n",   //循环结构打印学生信息
      stu[i].stuNo,stu[i].name,stu[i].sex,stu[i].domNum,stu[i].tel);
  }
}
void showGrade()   //展示学生成绩信息
{
  FILE* fp2;
  int i, m = 0;
  fp2 = fopen("B.txt", "rb");  //打开已经存储好的成绩文件
  while (!feof(fp2))
  {
    if (fread(&stu2[m], LEN2, 1, fp2) == 1)   //读取文件
      m++;  //m为存储信息的条数
  }
  fclose(fp2);  //关闭文件
  printf("学号\t课程编号\t课程名称\t学分\t平时成绩\t实验成绩\t卷面成绩\t综合成绩\t实得学分\t\n");
  for (i = 0; i < m; i++)
  {
    printf("%-8s%-16s%-16s%-8d%-16d%-16d%-16d%-16.2f%-16.2f\n", //循环打印成绩信息
      stu2[i].stuNo,stu2[i].courseNo,stu2[i].courseName,stu2[i].creditHour,
    stu2[i].triGrade,stu2[i].experiGrade,stu2[i].examGrade,stu2[i].totalGrade,stu2[i].finalCreHour);
  }
}
void Add()  //增加学生信息的模块
{
  int i, m = 0,n=0;
  char ch[2]={'\0'};
  printf("进行学生基本信息录入:\n");
  FILE* fp1; //学生成绩和学生信息两个模块
  FILE* fp2;
  if ((fp1 = fopen("A.txt", "wb")) == NULL)  //如果打不开则返回错误
  {
    printf("无法打开学生基本信息\n");
  }
  for (i = 0; i < m; i++)
  {
    fwrite(&stu[i], LEN, 1, fp1);  //写入学生信息 LEN为大小
  }
  printf("请进行选择-->(y/n):");
  scanf("%s", ch);  //给用户一定的选择权
  while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)  //防止出现大小写问题
  {
    printf("学号:");   //依次提示用户输入相关的信息
    scanf("%s", &stu[m].stuNo);
    printf("姓名:");
    scanf("%s", stu[m].name);
    printf("性别:");
    scanf("%s", &stu[m].sex);
    printf("宿舍号:");
    scanf("%s", &stu[m].domNum);
    printf("电话号码:"); 
    scanf("%s", &stu[m].tel);
    if (fwrite(&stu[m], LEN, 1, fp1) != 1)
    {
      printf("无法保存!"); 
    }
    else 
    { 
      printf("%s 保存成功!\n", stu[m].name); 
      m++; 
    }
    printf("是否继续存储?(y/n):");  //给予用户选择的权力
    scanf("%s", ch);
  }
  fclose(fp1);
  printf("进行学生成绩基本信息录入:\n");
  if ((fp2 = fopen("B.txt", "wb")) == NULL)  //打开文件失败返回错误信息
  {
    printf("无法打开学生成绩基本信息\n");
  }
  for (i = 0; i < n; i++)
  {
    fwrite(&stu2[i], LEN2, 1, fp2);  //写入一个LEN2的大小文件
  }
  printf("是否进行信息录入(y/n):");
  scanf("%s", ch);
  while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
  {
    printf("学号:");  //依次写入用户信息 存储
    scanf("%s", &stu2[n].stuNo);
    printf("课程编号:");
    scanf("%s", stu2[n].courseNo);
    printf("课程名称:");
    scanf("%s", &stu2[n].courseName);
    printf("学分:");
    scanf("%d", &stu2[n].creditHour);
    printf("平时成绩:");
    scanf("%d", &stu2[n].triGrade);
    printf("实验成绩:");
    scanf("%d", &stu2[n].experiGrade);
    printf("卷面成绩:");
    scanf("%d", &stu2[n].examGrade);
    printf("综合成绩:");
    scanf("%f", &stu2[n].totalGrade);
    printf("实得学分:");
    scanf("%f", &stu2[n].finalCreHour);
    if (fwrite(&stu2[n], LEN2, 1, fp2) != 1)  //用户信息存储失败返回错误
    {
      printf("保存失败!");
    }
    else
    {
      printf("%s 成绩保存成功!\n", stu[n].name);
      n++;
    }
    printf("是否继续录入?(y/n):");
    scanf("%s", ch);
  }
  fclose(fp2);
  printf("录入完毕!\n");
}
void DelInfo()   //删除学生信息模块
{
  FILE* fp1;
  FILE* fp2;
  char snum[20];
  int i, j, m = 0;
  char ch[2];
  if ((fp1 = fopen("A.txt", "r+")) == NULL)  //打开失败返回错误信息
  {
    printf("无法打开\n"); 
    return;
  }
  while (!feof(fp1))  
    if (fread(&stu[m], LEN, 1, fp1) == 1)  //读取学生文件错误信息
      m++;
  fclose(fp1);
  if (m == 0)
  {
    printf("无内容,请先添加!\n");  //没有信息则返回错误信息
    return;
  }
  printf("请输入要删除的学号:");  //提示用户输入要删除的字符串
  scanf("%s", &snum);
  for (i = 0; i < m; i++)
    if (strcmp(snum,stu[i].stuNo)==0)
      break;
  printf("找到了,是否删除?(y/n)");
  scanf("%s", ch);
  if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
    for (j = i; j < m; j++)
      stu[j] = stu[j + 1];
  m--;
  if ((fp1 = fopen("A.txt", "wb")) == NULL)  //在对应文件中找寻信息
  {
    printf("无法打开文件\n"); 
    return;
  }
  for (j = 0; j < m; j++)
    if (fwrite(&stu[j], LEN, 1, fp1) != 1)
    {
      printf("无法存储!\n");
    }
  fclose(fp1);
  printf("删除成功!\n"); //提示删除成功
}
void DelGrade()  //删除成绩信息 和学生信息模块相似
{
  FILE* fp2;
  int i, j, n = 0;
  char snum[20];
  char ch[2];
  if ((fp2 = fopen("B.txt", "r+")) == NULL)
  {
    printf("无法打开\n"); 
    return;
  }
  while (!feof(fp2))  
    if (fread(&stu2[n], LEN2, 1, fp2) == 1) 
      n++;
  fclose(fp2);
  if (n == 0)
  {
    printf("找不到记录!\n");
    return;
  }
  printf("请输入要删除的学号:");
  scanf("%s", snum);
  for (i = 0; i < n; i++)
    if (strcmp(snum,stu2[i].stuNo)==0)
      break;
  printf("找到了,是否删除?(y/n)");
  scanf("%s", ch);
  if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
    for (j = i; j < n; j++)
      stu[j] = stu[j + 1];
  n--;
  if ((fp2 = fopen("data.txt", "wb")) == NULL)
  {
    printf("无法打开文件\n"); 
    return;
  }
  for (j = 0; j < n; j++)
    if (fwrite(&stu2[j], LEN2, 1, fp2) != 1)
    {
      printf("无法存储!\n");
    }
  fclose(fp2);
  printf("删除成功!\n");
}
void Order()  //学生排序模块信息
{
  int option = 0;
  printf("1.平时成绩         2.实验成绩\n");
  printf("3.卷面成绩         4.综合成绩\n");
  printf("请选择排序依据:-->");
  scanf("%d", &option);  //选择进入循环选择
  FILE* fp2;
  struct stu_grade t;
  int i = 0, j = 0, m = 0;
  if ((fp2 = fopen("B.txt", "r+")) == NULL)  
  {
    printf("无法打开!\n");  //错误则返回错误信息
    return;
  }
  while (!feof(fp2))
    if (fread(&stu2[m], LEN2, 1, fp2) == 1)
      m++;
  fclose(fp2);
  if (m == 0)
  {
    printf("无输入记录!\n");
    return;
  }
  if ((fp2 = fopen("B.txt", "wb")) == NULL)
  {
    printf("无法打开\n");
    return;
  }
  switch (option)  //选择对应的根据进行冒泡排序
  {
  case 1:
    for (i = 0; i < m - 1; i++)  //经典的冒泡排序结构进行排序
      for (j = i + 1; j < m; j++)
        if (stu2[j].triGrade > stu2[j+1].triGrade)
        {
          t = stu2[i];
          stu2[i] = stu2[j];
          stu2[j] = t;
        }
    break;  //结束则跳出循环
  case 2:
    for (i = 0; i < m - 1; i++)
      for (j = i + 1; j < m; j++)
        if (stu2[i].experiGrade <= stu2[j].experiGrade)
        {
          t = stu2[i]; 
          stu2[i] = stu2[j]; 
          stu2[j] = t;
        }
    break;
  case 3:
    for (i = 0; i < m - 1; i++)
      for (j = i + 1; j < m; j++)
        if (stu2[i].examGrade<= stu2[j].examGrade)
        {
          t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t;
        }
    break;
  case 4:
    for (i = 0; i < m - 1; i++)
      for (j = i + 1; j < m; j++)
        if (stu2[i].totalGrade <= stu2[j].totalGrade)
        {
          t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t;
        }
    break;
  default:
    printf("输入格式错误,请重新输入");
  }
  if ((fp2 = fopen("B.txt", "wb")) == NULL)
  {
    printf("无法打开\n");
    return;
  }
  for (i = 0; i < m; i++)
    if (fwrite(&stu2[i], LEN2, 1, fp2) != 1)
    {
      printf("%s 无法存储!\n");  //存储失败返回错误信息
    }
  fclose(fp2);
  printf("存储成功\n");
}
void Search()  //查找功能模块
{
  char str[20] = { '\0' };
  int num = 0;
  printf("1.学生信息查询      2.学生成绩查询\n");
  printf("请选择你的查询方式:-->");
  scanf("%d",&num);
  FILE* fp;
  int  i, m = 0;
  char ch[2];
  if ((fp = fopen("A.txt", "rb")) == NULL)
  {
    printf("无法打开\n"); 
    return;
  }
  while (!feof(fp))  
    if (fread(&stu[m], LEN, 1, fp) == 1)  //读取文件信息
      m++;
  fclose(fp);
  if (m == 0) 
  {
    printf("无信息记录!\n"); 
    return; 
  }
  if (num == 1)
  {
    int op = 0;
    printf("1.学号  2.姓名  3.宿舍号码\n");
    printf("请选择你的查询方式-->");
    scanf("%d", &op);
    switch (op)
    {
    case 1:
      printf("请输入要查找的学号:");
      scanf("%s", &str);
      for (i = 0; i < m; i++)
        if (strcmp(stu[i].stuNo, str) == 0)
        {
          printf("找到了,是否显示?(y/n)");
          scanf("%s", ch);
          if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
          {
            printf("学号\t姓名\t性别\t宿舍号\t电话号\t\n");
            printf("%-8s%-8s%-8s%-8s%-8s%\n",
              stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel);
            break;
          }
        }
      if (i == m)
        printf("未找到该学生信息!\n");
      break;
    case 2:
      printf("请输入要查找的姓名:");
      scanf("%s", &str);
      for (i = 0; i < m; i++)
        if (strcmp(stu[i].name, str) == 0)
        {
          printf("找到了,是否显示?(y/n)");
          scanf("%s", ch);
          if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
          {
            printf("学号\t课程编号\t课程名称\t学分\t平时成绩\t实验成绩\t卷面成绩\t综合成绩\t实得学分\t\n");
            printf("%-8s%-8s%-8s%-8s%-8s%\n",
              stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel);
            break;
          }
        }
      if (i == m)
        printf("未找到该学生信息!\n");
      break;
    case 3:
      printf("请输入要查找的宿舍号:");
      scanf("%s", &str);
      for (i = 0; i < m; i++)
        if (strcmp(stu[i].domNum, str) == 0)
        {
          printf("找到了,是否显示?(y/n)");
          scanf("%s", ch);
          if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
          {
            printf("%-8s%-8s%-8s%-8s%-8s%\n",
              stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel);
            break;
          }
        }
      if (i == m)
        printf("未找到该学生信息!\n");
      break;
    }
  }
  else if (num == 2)
  {
    char stunum[20];
    printf("请输入要查找的学号:");
    scanf("%s", &str);
    for (i = 0; i < m; i++)
      if (strcmp(stu[i].stuNo, str) == 0)
      {
        strcpy(stunum, stu[i].stuNo);
      }
    if (i == m)
      printf("未找到该学生信息!\n");
    FILE* fp2;
    int m2 = 0;
    if ((fp2 = fopen("B.txt", "rb")) == NULL)
    {
      printf("无法打开\n"); 
      return;
    }
    while (!feof(fp))  
      if (fread(&stu2[m2], LEN2, 1, fp2) == 1) 
        m2++;
    fclose(fp);
    if (m2 == 0) 
    {
      printf("无信息记录!\n");
      return; 
    }
    for (i = 0; i < m; i++)
      if (strcmp(stunum,stu2[i].stuNo)==0)
      {
        printf("找到了,是否显示?(y/n)");
        scanf("%s", ch);
        if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
        {
          printf("课程名称\t实得学分\t\n");
          printf("%-8s-8f%",stu2[i].courseName, stu2[i].finalCreHour);
          break;
        }
      }
    if (i == m) 
      printf("无法找到该学生!\n");
  }
  else
    printf("输入格式错误,请重新输入\n");
}
enum option  //枚举结构 增加代码可读性
{
  exit,
  add,
  search,
  delInfo,
  delGrade,
  showinfor,
  showgrade,
  order,
};
int main()
{
  int input =1; //模块选择变量
  menu();
  do
  {
    printf("请选择:-->");
    scanf("%d", &input);
    switch (input)
    {
    case add:
      Add();
      break;
    case search:
      Search();
      break;
    case delInfo:
      DelInfo();
      break;
    case delGrade:
      DelGrade();
      break;
    case showinfor:
      showInfor();
      break;
    case showgrade:
      showGrade();
      break;
    case order:
      Order();
      break;
    case exit:
      break;
    default:
      printf("输入格式错误");
    }
  } while (input);
  return 0;
}

image.gif

实验报告源码流程图下载链接

链接:https://pan.baidu.com/s/1CyxfN4hxRw6KDftwmeXO8w?pwd=1234 

提取码:1234

相关文章
|
9月前
|
数据库 C语言
C语言加链表实现学生信息管理系统
用C语言加链表的知识实现简单的学生信息管理系统。(可以自己完善添加数据库,文件流等操作)
62 0
|
8月前
|
C语言
学生信息管理系统(C语言结构体数组版)
学生信息管理系统(C语言结构体数组版)
|
10月前
|
C语言
c语言链表文件操作实现学生信息管理系统
c语言链表文件操作实现学生信息管理系统
|
10月前
|
C语言
C语言实现通讯录(类似学生信息管理系统)
C语言实现通讯录(类似学生信息管理系统)
192 0
C语言实现通讯录(类似学生信息管理系统)
|
11月前
|
存储 SQL 关系型数据库
C语言实验小项目实例源码大全订票信息管理系统贪吃蛇图书商品管理网络通信等
C语言实验小项目实例源码大全订票信息管理系统贪吃蛇图书商品管理网络通信等
83 0
|
存储 C语言
c语言实现学生信息管理系统
c语言实现学生信息管理系统
179 0
c语言实现学生信息管理系统
|
C语言
C语言学生信息管理系统链表实现
C语言学生信息管理系统链表实现
142 0
C语言学生信息管理系统链表实现
(C语言代码分享):车辆信息管理系统源代码来了。
(C语言代码分享):车辆信息管理系统源代码来了。
|
C语言 索引
C语言实现一个Window控制台带彩色,且可以用方向键选择并确认的菜单式列表(二) ---学生信息管理系统
http://blog.csdn.net/morixinguan/article/details/77485367 上节,我们写了一个简单的列表框架,是关于学生信息管理系统的,这节,我们来把它尽量的完善一下。
1324 0
|
C语言 索引 Windows
C语言实现一个列表式的学生信息管理系统(完善)
http://blog.csdn.net/morixinguan/article/details/77489633        上节,我们实现了学生信息管理系统的大多数功能,但还有两个功能没有实现,就是学生信息修改还有学生信息删除了。
1348 0