【升级版学生信息管理系统&员工工资信息管理系统】+文件操作+更多细节(下)

简介: 【升级版学生信息管理系统&员工工资信息管理系统】+文件操作+更多细节(下)

9. 修改员工信息

1.同上

2.修改if else if和go to 语句

主:

    case 4:
      printf("********修改工资信息.********\n");
      ModifySeqList(&ST);
      CountSeqList(&ST);
      break;

分:

void ModifySeqList(SeqList* ps)
{
  char name[20] = { 0 };
  printf("请输入您要修改的员工信息的员工姓名:>");
  scanf("%s", name);
  int pos = FindByName(ps, name);
  if (pos == -1)
  {
    printf("当前系统中不存在名字为%s的员工.\n", name);
    return;
  }
  char choice[20] = { 0 };
rechoice:
  printf("请输入你要修改的信息项目名称");
  printf("(提示:您可选择输入员工工号,基本工资,奖金,扣款,税款):>");
  scanf("%s", choice);
  printf("请输入修改后的该信息项目值:>");
  if (strcmp(choice, "员工工号") == 0)
  {
    scanf("%s", ps->emp[pos].id);
  }
  else if (strcmp(choice, "基本工资") == 0)
  {
    scanf("%lf", &(ps->emp[pos].InitWages));
  }
  else if (strcmp(choice, "奖金") == 0)
  {
    scanf("%lf", &(ps->emp[pos].bonus));
  }
  else if (strcmp(choice, "扣款") == 0)
  {
    scanf("%lf", &(ps->emp[pos].deduct));
  }
  else if (strcmp(choice, "税款") == 0)
  {
    scanf("%lf", &(ps->emp[pos].taxes));
  }
  else
  {
    printf("请在提示中给出的选项中做出选择!\n");
    goto rechoice;
  }
  printf("修改成功.\n");
}

10. 按照工资排序

1.快速排序的原理

主:

    case 5:
      printf("********按照工资排序.(从高到低)********\n");
      QsortByFinaWages(&ST,0,ST.size);
      PrintSeqList(&ST);
      break;

分:

void QsortByFinaWages(SeqList* ps, int begin, int end)
{
  if (begin >= end)
  {
    return;
  }
  int keyi = begin;
  int left = begin, right = end;
  while (left < right)
  {
    while (left < right && ps->emp[right].FinaWages <= ps->emp[keyi].FinaWages)
    {
      right--;
    }
    while (left < right && ps->emp[left].FinaWages >= ps->emp[keyi].FinaWages)
    {
      left++;
    }
    Swap(&(ps->emp[left]), &(ps->emp[right]));
  }
  int meeti = left;
  Swap(&(ps->emp[keyi]), &(ps->emp[meeti]));
  QsortByFinaWages(ps, begin, meeti - 1);
  QsortByFinaWages(ps, meeti+1, end);
}

11.按照工号排序

1.直接插入排序

2.希尔排序的原理

主:

    case 6:
      printf("********按照工号排序.(从小到大)********\n");
      ShellSortById(&ST);
      PrintSeqList(&ST);
      break;

分:

void ShellSortById(SeqList* ps)
{
  int gap = ps->size;
  while (gap > 1)
  {
    gap = (gap / 3 + 1);
    for (int i = 0; i < ps->size - gap; i++)
    {
      int end = i;
      Employee temp = ps->emp[i + gap];
      while (end >= 0)
      {
        if (strcmp(ps->emp[end].id , temp.id)>0)
        {
          ps->emp[end + gap] = ps->emp[end];
          end -= gap;
        }
        else
        {
          break;
        }
      }
      ps->emp[end + gap] = temp;
    }
  }
}

12. 计算工资信息

数学计算

主:

    case 7:
      printf("********计算员工工资********\n");
      CountSeqList(&ST);
      printf("计算成功.\n");

分:

void CountSeqList(SeqList* ps)
{
  for (int i = 0; i < ps->size; i++)
  {
    ps->emp[i].NextWages = ps->emp[i].InitWages + ps->emp[i].bonus - ps->emp[i].deduct;
    ps->emp[i].FinaWages = ps->emp[i].NextWages - ps->emp[i].taxes;
  }
}

13.打印工资信息

格式控制

主:

    case 8:
      printf("********打印工资信息********\n");
      PrintSeqList(&ST);
      break;

分:

void PrintSeqList(SeqList* ps)
{
  printf("%-20s %-20s %-10s %-10s %-10s %-10s %-10s %-10s\n", "员工姓名", "员工工号", "基本工资", "奖金", "扣款", "应发工资","税款","实发工资");
  for (int i = 0; i < ps->size; i++)
  {
    printf("%-20s %-20s %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf\n",\
      ps->emp[i].name,ps->emp[i].id, ps->emp[i].InitWages, ps->emp[i].bonus, ps->emp[i].deduct,ps->emp[i].NextWages,ps->emp[i].taxes,ps->emp[i].FinaWages);
  }
}

14. 统计员工总数

1.    case 9:
2.      printf("********统计员工人数********\n");
3.      printf("当前系统人数:%d\n", ST.size);

15.default语句

1.    default:
2.      printf("********输入错误,请重新输入********\n");
3.      break;

16.源代码

//Employee.c
#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
typedef struct Employee
{
  char name[20];
  char id[20];
  double InitWages;
  double bonus;
  double deduct;
  double NextWages;
  double taxes;
  double FinaWages;
}Employee;
typedef struct SeqList
{
  Employee* emp;
  int size;
  int capacity;
}SeqList;
void CheckCapacity(SeqList* ps)
{
  if (ps->size == ps->capacity)
  {
    int newcapacity = 2 * ps->capacity;
    Employee* temp = (Employee*)realloc(ps->emp,sizeof(Employee) * newcapacity);
    if (temp==NULL)
    {
      perror("CheckCapacity::realloc");
      return;
    }
    ps->emp = temp;
    ps->capacity = newcapacity;
    printf("扩容成功\n");
  }
}
void LoadSeqList(SeqList* ps)
{
  FILE* pf = fopen("D:\\桌面\\test.txt", "rb");
  if (pf == NULL)
  {
    perror("LoadSeqList::fopen");
    return;
  }
  Employee temp = { 0 };
  while (fread(&temp, sizeof(Employee), 1, pf))
  {
    CheckCapacity(ps);
    ps->emp[ps->size] = temp;
    ps->size++;
  }
  fclose(pf);
  pf = NULL;
}
void InitSeqList(SeqList* ps)
{
  ps->emp = (Employee*)malloc(sizeof(Employee) * 4);
  if (ps->emp == NULL)
  {
    perror("InitSeqList::malloc");
    return;
  }
  ps->size = 0;
  ps->capacity = 4;
  LoadSeqList(ps);
}
//菜单函数
void Meau(void)
{
  printf("--------------------------------\n");
  printf("---  欢迎来到员工工资管理系统 ---\n");
  printf("--------------------------------\n");
  printf("----     0.退出程序         ----\n");
  printf("----     1.增加工资信息     ----\n");
  printf("----     2.删除工资信息     ----\n");
  printf("----     3.按名字查工资     ----\n");
  printf("----     4.修改工资信息     ----\n");
  printf("----     5.按照工资排序     ----\n");
  printf("----     6.按照工号排序     ----\n");
  printf("----     7.计算员工工资     ----\n");
  printf("----     8.打印工资信息     ----\n");
  printf("----     9.统计员工人数     ----\n");
  printf("-------------------------------\n");
}
void SaveSeqList(SeqList* ps)
{
  FILE* pf = fopen("D:\\桌面\\test.txt", "wb");
  if (pf == NULL)
  {
    perror("LoadSeqList::fopen");
    return;
  }
  for (int i = 0; i < ps->size; i++)
  {
    fwrite(ps->emp + i, sizeof(Employee), 1, pf);
  }
  fclose(pf);
  pf = NULL;
}
void InitEmployee(Employee* ps, int i)
{
  printf("请输入第%d位待插入的员工工资信息:\n",i);
  printf("请输入员工姓名:>");
  scanf("%s", ps->name);
  printf("请输入员工工号:>");
  scanf("%s", ps->id);
  printf("请输入员工的基本工资:>");
  scanf("%lf", &(ps->InitWages));
  printf("请输入员工的奖金:>");
  scanf("%lf", &(ps->bonus));
  printf("请输入员工的扣款:>");
  scanf("%lf", &(ps->deduct));
  printf("请输入员工的税款:>");
  scanf("%lf", &(ps->taxes));
}
void AddSeqList(SeqList* ps, Employee temp)
{
  CheckCapacity(ps);
  ps->emp[ps->size] = temp;
  ps->size++;
  printf("增加成功.\n");
}
int FindByName(SeqList* ps,char* name)
{
  for (int i = 0; i < ps->size; i++)
  {
    if (strcmp(name, ps->emp[i].name) == 0)
    {
      return i;
    }
  }
  return -1;
}
void DelSeqList(SeqList* ps)
{
  if (ps->size == 0)
  {
    printf("当前员工总数为0,无法删除.\n");
  }
  char name[20] = { 0 };
  printf("请输入您要删除的员工信息的员工姓名:>");
  scanf("%s", name);
  int pos = FindByName(ps,name);
  if (pos == -1)
  {
    printf("当前系统中不存在名字为%s的员工.\n", name);
    return;
  }
  else
  {
    int begin = pos + 1;
    while (begin < ps->size)
    {
      ps->emp[begin -1] = ps->emp[begin];
      begin++;
    }
    ps->size--;
  }
  printf("删除成功.\n");
}
void SearByName(SeqList* ps)
{
  char name[20] = { 0 };
  printf("请输入您要查询的员工信息的员工姓名:>");
  scanf("%s", name);
  int pos = FindByName(ps, name);
  if (pos == -1)
  {
    printf("当前系统中不存在名字为%s的员工.\n", name);
    return;
  }
  else
  {
    printf("%-20s %-20s %-10s %-10s %-10s %-10s %-10s %-10s\n", "员工姓名", "员工工号", "基本工资", "奖金", "扣款", "应发工资", "税款", "实发工资");
    printf("%-20s %-20s %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf\n", \
      ps->emp[pos].name, ps->emp[pos].id, ps->emp[pos].InitWages, ps->emp[pos].bonus, ps->emp[pos].deduct, ps->emp[pos].NextWages, ps->emp[pos].taxes, ps->emp[pos].FinaWages);
  }
}
void ModifySeqList(SeqList* ps)
{
  char name[20] = { 0 };
  printf("请输入您要修改的员工信息的员工姓名:>");
  scanf("%s", name);
  int pos = FindByName(ps, name);
  if (pos == -1)
  {
    printf("当前系统中不存在名字为%s的员工.\n", name);
    return;
  }
  char choice[20] = { 0 };
rechoice:
  printf("请输入你要修改的信息项目名称");
  printf("(提示:您可选择输入员工工号,基本工资,奖金,扣款,税款):>");
  scanf("%s", choice);
  printf("请输入修改后的该信息项目值:>");
  if (strcmp(choice, "员工工号") == 0)
  {
    scanf("%s", ps->emp[pos].id);
  }
  else if (strcmp(choice, "基本工资") == 0)
  {
    scanf("%lf", &(ps->emp[pos].InitWages));
  }
  else if (strcmp(choice, "奖金") == 0)
  {
    scanf("%lf", &(ps->emp[pos].bonus));
  }
  else if (strcmp(choice, "扣款") == 0)
  {
    scanf("%lf", &(ps->emp[pos].deduct));
  }
  else if (strcmp(choice, "税款") == 0)
  {
    scanf("%lf", &(ps->emp[pos].taxes));
  }
  else
  {
    printf("请在提示中给出的选项中做出选择!\n");
    goto rechoice;
  }
  printf("修改成功.\n");
}
void Swap(Employee* a, Employee* b)
{
  Employee temp = *a;
  *a = *b;
  *b = temp;
}
void QsortByFinaWages(SeqList* ps, int begin, int end)
{
  if (begin >= end)
  {
    return;
  }
  int keyi = begin;
  int left = begin, right = end;
  while (left < right)
  {
    while (left < right && ps->emp[right].FinaWages <= ps->emp[keyi].FinaWages)
    {
      right--;
    }
    while (left < right && ps->emp[left].FinaWages >= ps->emp[keyi].FinaWages)
    {
      left++;
    }
    Swap(&(ps->emp[left]), &(ps->emp[right]));
  }
  int meeti = left;
  Swap(&(ps->emp[keyi]), &(ps->emp[meeti]));
  QsortByFinaWages(ps, begin, meeti - 1);
  QsortByFinaWages(ps, meeti+1, end);
}
void ShellSortById(SeqList* ps)
{
  int gap = ps->size;
  while (gap > 1)
  {
    gap = (gap / 3 + 1);
    for (int i = 0; i < ps->size - gap; i++)
    {
      int end = i;
      Employee temp = ps->emp[i + gap];
      while (end >= 0)
      {
        if (strcmp(ps->emp[end].id , temp.id)>0)
        {
          ps->emp[end + gap] = ps->emp[end];
          end -= gap;
        }
        else
        {
          break;
        }
      }
      ps->emp[end + gap] = temp;
    }
  }
}
void CountSeqList(SeqList* ps)
{
  for (int i = 0; i < ps->size; i++)
  {
    ps->emp[i].NextWages = ps->emp[i].InitWages + ps->emp[i].bonus - ps->emp[i].deduct;
    ps->emp[i].FinaWages = ps->emp[i].NextWages - ps->emp[i].taxes;
  }
}
void PrintSeqList(SeqList* ps)
{
  printf("%-20s %-20s %-10s %-10s %-10s %-10s %-10s %-10s\n", "员工姓名", "员工工号", "基本工资", "奖金", "扣款", "应发工资","税款","实发工资");
  for (int i = 0; i < ps->size; i++)
  {
    printf("%-20s %-20s %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-10.2lf\n",\
      ps->emp[i].name,ps->emp[i].id, ps->emp[i].InitWages, ps->emp[i].bonus, ps->emp[i].deduct,ps->emp[i].NextWages,ps->emp[i].taxes,ps->emp[i].FinaWages);
  }
}
int main()
{
  int input = 0;
  SeqList ST;
  InitSeqList(&ST);
  do//先执行一次
  {
    Meau();
    printf("请输入您的选择(提示:请在0-9之间选择):>");
    scanf("%d", &input);
    switch (input)
    {
    case 0:
      printf("欢迎您的使用,即将退出程序.\n");
      SaveSeqList(&ST);
      break;
    case 1:
      printf("********增加工资信息.********\n");
      int nums = 0;
      printf("请输入您要增加的员工信息的员工数量:>");
      scanf("%d", &nums);
      Employee temp = { 0 };
      for (int i = 1; i <= nums; i++)
      {
        InitEmployee(&temp,i);
        AddSeqList(&ST,temp);
      }
      CountSeqList(&ST);
      break;
    case 2:
      printf("********删除工资信息.********\n");
      DelSeqList(&ST);
      break;
    case 3:
      printf("********查询工资信息.********\n");
      SearByName(&ST);
      break;
    case 4:
      printf("********修改工资信息.********\n");
      ModifySeqList(&ST);
      CountSeqList(&ST);
      break;
    case 5:
      printf("********按照工资排序.(从高到低)********\n");
      QsortByFinaWages(&ST,0,ST.size);
      PrintSeqList(&ST);
      break;
    case 6:
      printf("********按照工号排序.(从小到大)********\n");
      ShellSortById(&ST);
      PrintSeqList(&ST);
      break;
    case 7:
      printf("********计算员工工资********\n");
      CountSeqList(&ST);
      printf("计算成功.\n");
      break; 
    case 8:
      printf("********打印工资信息********\n");
      PrintSeqList(&ST);
      break;
    case 9:
      printf("********统计员工人数********\n");
      printf("当前系统人数:%d\n", ST.size);
    default:
      printf("********输入错误,请重新输入********\n");
      break;
    }
  } while (input);
}

17.效果预览图


ff0ea51c2b7646099ce035cc449d6f41.jpg

类似的,下面为学生信息管理系统

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Student
{
  char name[20];
  char id[20];
  float ChiScore;
  float MatScore;
  float EngScore;
  float SumScore;
}Student;
typedef struct SeqList
{
  Student* stu;
  int size;
  int capacity;
}SeqList;
void meau1(void)
{
  printf("--------------------------------\n");
  printf("--- 欢迎使用学生信息管理系统 ---\n");
  printf("--------------------------------\n");
  printf("----     0.退出程序         ----\n");
  printf("----     1.录入学生信息     ----\n");
  printf("----     2.删除学生信息     ----\n");
  printf("----     3.查询指定课程     ----\n");
  printf("----     4.查询指定学生     ----\n");
  printf("----     5.修改学生信息     ----\n");
  printf("----     6.按照学号排序     ----\n");
  printf("----     7.按照总分排序     ----\n");
  printf("----     8.统计学生总数     ----\n");
  printf("----     9.打印学生信息     ----\n");
  printf("--------------------------------\n");
}
//case -1 初始化: 初始化函数(3)
void CheckCapacity(SeqList* ps)
{
  if (ps->size == ps->capacity)
  {
    int newcapacity = 2 * ps->capacity;
    Student* temp = (Student*)realloc(ps->stu, sizeof(Student) * newcapacity);
    if (temp == NULL)
    {
      perror("CheckCapacity::realloc:>");
      return;
    }
    ps->capacity = newcapacity;
    ps->stu = temp;
    printf("扩容成功.\n");
  }
}
void LoadSeqList(SeqList* ps)
{
  FILE* pf = fopen("D:\\桌面\\test.txt", "rb");
  if (pf == NULL)
  {
    perror("LoadSeqList::fopen:>");
    return;
  }
  Student temp = { 0 };
  while (fread(&temp, sizeof(Student), 1, pf))
  {
    CheckCapacity(ps);
    ps->stu[ps->size] = temp;
    ps->size++;
  }
  fclose(pf);
  pf = NULL;
}
void InitSeqList(SeqList* ps)
{
  ps->stu = (Student*)malloc(sizeof(Student) * 4);
  if (ps->stu == NULL)
  {
    perror("InitSeqList::malloc:>");
    return;
  }
  ps->capacity = 4;
  ps->size = 0;
  LoadSeqList(ps);
}
//case 0 退出程序:保存数据到文件函数(1)
void SaveSeqList(SeqList* ps)
{
  FILE* pf = fopen("D:\\桌面\\test.txt", "wb");
  if (pf == NULL)
  {
    perror("LoadSeqList::fopen:>");
    return;
  }
  for (int i = 0; i < ps->size; i++)
  {
    fwrite(ps->stu + i, sizeof(Student), 1, pf);
    }
  fclose(pf);
  pf = NULL;
}
//case 1:录入学生信息 装配和插入函数(2)
void InitStudent(Student* ps,int i)
{
  printf("请输入第%d个待录入的学生信息:\n", i);
  printf("请输入学生的名字:>");
  scanf("%s", ps->name);
  printf("请输入学生的学号:>");
  scanf("%s", ps->id);
  printf("请输入学生的语文成绩(0-100):>");
  scanf("%f", &(ps->ChiScore));
  printf("请输入学生的数学成绩(0-100):>");
  scanf("%f", &(ps->MatScore));
  printf("请输入学生的英语成绩(0-100):>");
  scanf("%f", &(ps->EngScore));
  ps->SumScore = ps->ChiScore + ps->MatScore + ps->EngScore;
}
void AddSeqList(SeqList* ps,Student temp)
{
  CheckCapacity(ps);
  ps->stu[ps->size] = temp;
  ps->size++;
}
//case 2:删除学生信息  菜单函数,定位和删除函数(4) 
void meau2(void)
{
  printf("--  1.按照名字查找  --\n");
  printf("--  2.按照学号查找  --\n");
}
//找得到返回下标,找不到返回-1
int FindByName(SeqList* ps, const char* name)
{
  for (int i = 0; i < ps->size; i++)
  {
    if (strcmp(ps->stu[i].name, name) == 0)
    {
      return i;
    }
  }
  return -1;
}
int FindById(SeqList* ps, const char* id)
{
  for (int i = 0; i < ps->size; i++)
  {
    if (strcmp(ps->stu[i].id, id) == 0)
    {
      return i;
    }
  }
  return -1;
}
void DelSeqList(SeqList* ps)
{
  if (ps->size == 0)
  {
    printf("当前学生总数为0,无法删除.\n");
    return;
  }
  meau2();
  int choice1 = 0;
  rechoice1:
  printf("请根据您要按何种方式查找到要删除的学生,输入相应的编号:>");
  scanf("%d", &choice1);
  int pos = 0;
  if (choice1 == 1)
  {
    char name[20] = { 0 };
    printf("请输入您要删除学生的学生姓名:>");
    scanf("%s", name);
    pos = FindByName(ps, name);
  }
  else if (choice1 == 2)
  {
    char id[20] = { 0 };
    printf("请输入您要删除学生的学生学号:>");
    scanf("%s", id);
    pos = FindById(ps, id);
  }
  else
  {
    printf("选择错误,请重新选择(提示:请在1-2中选择).\n");
    goto rechoice1;
  }
  if (pos == -1)
  {
    printf("您现在要删除的学生不存在当前学生信息管理系统中,请重新选择.\n");
    goto rechoice1;
  }
  else
  {
    int begin = pos + 1;
    while (begin < ps->size)
    {
      ps->stu[begin - 1] = ps->stu[begin];
      begin++;
    }
    ps->size--;
    printf("删除成功.\n");
  }
}
//case 3: 查询指定课程 菜单函数,定位和杂碎函数(10)
void meau3(void)
{
  printf("--  1.语文  --\n");
  printf("--  2.数学  --\n");
  printf("--  3.英语  --\n");
}
void Swap(char* buff1, char* buff2,int width)
{
  while (width--)
  {
    char temp = *buff1;
    *buff1 = *buff2;
    *buff2 = temp;
    buff1++;
    buff2++;
  }
}
int cmp_struct_by_ChiScore(const void* e1, const void* e2)
{
  return ((Student*)e2)->ChiScore - ((Student*)e1)->ChiScore;
}
int cmp_struct_by_MatScore(const void* e1, const void* e2)
{
  return ((Student*)e2)->MatScore - ((Student*)e1)->MatScore;
}
int cmp_struct_by_EngScore(const void* e1, const void* e2)
{
  return ((Student*)e2)->EngScore - ((Student*)e1)->EngScore;
}
void BubbleSort(void* base, int size, int width, float (*cmp)(const void*, const void*))
{
  int flag = 0;
  for (int i = 0; i < size - 1; i++)
  {
    for (int j = 0; j < size-1- i; j++)
    {
      if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
      {
        Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
        flag = 1;
      }
    }
    if (flag == 0)
    {
      break;
    }
  }
}
void DisPlayByChiScore(SeqList* ps)
{
  printf("%-20s %-20s %-20s %-20s\n", "姓名", "学号", "语文成绩", "语文成绩排名");
  for (int i = 0; i < ps->size; i++)
  {
    printf("%-20s %-20s %-20.2f %-20d\n", ps->stu[i].name, ps->stu[i].id, ps->stu[i].ChiScore, i + 1);
  }
}
void DisPlayByMatScore(SeqList* ps)
{
  printf("%-20s %-20s %-20s %-20s\n", "姓名", "学号", "数学成绩", "数学成绩排名");
  for (int i = 0; i < ps->size; i++)
  {
    printf("%-20s %-20s %-20.2f %-20d\n", ps->stu[i].name, ps->stu[i].id, ps->stu[i].MatScore, i + 1);
  }
}
void DisPlayByEngScore(SeqList* ps)
{
  printf("%-20s %-20s %-20s %-20s\n", "姓名", "学号", "英语成绩", "英语成绩排名");
  for (int i = 0; i < ps->size; i++)
  {
    printf("%-20s %-20s %-20.2f %-20d\n", ps->stu[i].name, ps->stu[i].id, ps->stu[i].EngScore, i + 1);
  }
}
void SearByCourse(SeqList* ps)
{
  if (ps->size == 0)
  {
    printf("当前学生总数为0,无法修改.\n");
    return;
  }
  meau3();
  int choice2 = 0;
  rechoice2:
  printf("请根据您要查询课程的名称,选择相应的编号:>");
  scanf("%d", &choice2);
  float sum = 0.00;
  int count1 = 0, count2 = 0;
  printf("\t\t***********查询课程结果***********\n\n");
  if (choice2 == 1)
  {
    for (int i = 0; i < ps->size; i++)
    {
      sum += ps->stu[i].ChiScore;
      if (ps->stu[i].ChiScore < 60)
      {
        count1++;
      }
      else if (ps->stu[i].ChiScore < 90)
      {
        count2++;
      }
    }
    BubbleSort(ps->stu, ps->size, sizeof(Student), cmp_struct_by_ChiScore);
    DisPlayByChiScore(ps);
  }
  else if (choice2 == 2)
  {
    for (int i = 0; i < ps->size; i++)
    {
      sum += ps->stu[i].MatScore;
      if (ps->stu[i].MatScore < 60)
      {
        count1++;
      }
      else if (ps->stu[i].MatScore < 90)
      {
        count2++;
      }
    }
    BubbleSort(ps->stu, ps->size, sizeof(Student), cmp_struct_by_MatScore);
    DisPlayByMatScore(ps);
  }
  else if (choice2 == 3)
  {
    for (int i = 0; i < ps->size; i++)
    {
      sum += ps->stu[i].EngScore;
      if (ps->stu[i].EngScore < 60)
      {
        count1++;
      }
      else if (ps->stu[i].EngScore < 90)
      {
        count2++;
      }
    }
    BubbleSort(ps->stu, ps->size, sizeof(Student), cmp_struct_by_EngScore);
    DisPlayByEngScore(ps);
  }
  else
  {
    printf("选择错误,请重新选择(提示:请在1-3中选择).\n");
    goto rechoice2;
  }
  printf("\n\n% -20s % -20s % -20s % -20s % -20s\n", "不及格人数(0-60)", "及格人数(60-100)", "良好人数(60-90)", "优秀人数(90-100)","平均分");
  printf("%-20d %-20d %-20d %-20d %-20.2f\n", count1, ps->size - count1, count2, ps->size - count1 - count2, sum / ps->size);
}
//case 4:查询指定学生 
void SearByStudent(SeqList* ps)
{
  if (ps->size == 0)
  {
    printf("当前学生总数为0,无法查询.\n");
    return;
  }
  meau2();
  int choice3 = 0;
rechoice3:
  printf("请根据您要按何种方式查找学生,输入相应的编号:>");
  scanf("%d", &choice3);
  int pos = 0;
  if (choice3 == 1)
  {
    char name[20] = { 0 };
    printf("请输入您要查询学生的学生姓名:>");
    scanf("%s", name);
    pos = FindByName(ps, name);
  }
  else if (choice3 == 2)
  {
    char id[20] = { 0 };
    printf("请输入您要查询学生的学生学号:>");
    scanf("%s", id);
    pos = FindById(ps, id);
  }
  else
  {
    printf("选择错误,请重新选择(提示:请在1-2中选择).\n");
    goto rechoice3;
  }
  if (pos == -1)
  {
    printf("您现在要查询的学生不存在当前学生信息管理系统中,请重新选择.\n");
    goto rechoice3;
  }
  else
  {
    printf("\t\t***********查询学生结果***********\n");
    printf("%-20s %-20s %-20s %-20s %-20s %-20s %-20s\n","姓名","学号", "语文成绩", "数学成绩", "英语成绩", "总成绩", "总成绩排名");
    printf("%-20s %-20s %-20.2f %-20.2f %-20.2f %-20.2f %-20d\n", ps->stu[pos].name, ps->stu[pos].id, \
      ps->stu[pos].ChiScore, ps->stu[pos].MatScore, ps->stu[pos].EngScore, ps->stu[pos].SumScore, pos + 1);
  }
}
//case 5: 修改学生成绩 -菜单函数和修改函数 -先找到这个学生,再进行修改
void ModSeqList(SeqList* ps)
{
  if (ps->size == 0)
  {
    printf("当前学生总数为0,无法修改.\n");
    return;
  }
  meau2();
  int choice4 = 0;
  rechoice4:
  printf("请根据您要按何种方式查找到要修改的学生,输入相应的编号:>");
  scanf("%d", &choice4);
  int pos = 0;
  if (choice4 == 1)
  {
    char name[20] = { 0 };
    printf("请输入您要修改的学生信息的学生姓名:>");
    scanf("%s", name);
    pos = FindByName(ps, name);
  }
  else if (choice4 == 2)
  {
    char id[20] = { 0 };
    printf("请输入您要修改的学生信息的学生学号:>");
    scanf("%s", id);
    pos = FindById(ps, id);
  }
  else
  {
    printf("选择错误(提示:请在1-2中选择).\n");
    goto rechoice4;
  }
  if (pos == -1)
  {
    printf("您现在要查询的学生不存在当前学生信息管理系统中,请重新选择.\n");
    goto rechoice4;
  }
  else
  {
    meau3();
    int input = 0;
    again:
    printf("请根据您要修改的课程成绩的课程名称,选择相应的编号:>");
    scanf("%d", &input);
    printf("请输入修改后的值:>");
    if (input == 1)
    {
      scanf("%f", &(ps->stu[pos].ChiScore));
    }
    else if (input == 2)
    {
      scanf("%f", &(ps->stu[pos].EngScore));
    }
    else if (input == 3)
    {
      scanf("%f", &(ps->stu[pos].EngScore));
    }
    else
    {
      printf("选择错误,请重新选择 (提示:请在1-3中选择):>");
      goto again;
    }
    printf("修改成功.\n");
  }
}
//case 6: 按照学号排序 -排升序
void Swap2(Student* s1, Student* s2)
{
  Student temp = *s1;
  *s1 = *s2;
  *s2 = temp;
}
void QsortById(SeqList* ps, int begin, int end)
{
  if (begin >= end)
  {
    return;
  }
  int keyi = begin;
  int left = begin, right = end;
  while (left < right)
  {
    while (left < right && strcmp(ps->stu[right].id, ps->stu[keyi].id)>0)
    {
      right--;
    }
    while (left < right && strcmp(ps->stu[left].id, ps->stu[keyi].id) <= 0)
    {
      left++;
    }
    Swap2(&(ps->stu[left]), &(ps->stu[right]));
  }
  int meeti = left;
  Swap2(&(ps->stu[meeti]), &(ps->stu[keyi]));
  QsortById(ps, begin, meeti - 1);
  QsortById(ps, meeti + 1, end);
}
//case 7: 按照总成绩排序-排降序
void ShellSortBySumScore(SeqList* ps)
{
  int gap = ps->size;
  while (gap > 1)
  {
    gap = (gap / 3 + 1);
    for (int i = 0; i < ps->size - gap; i++)
    {
      int end = i;
      Student temp = ps->stu[end + gap];
      while (end >= 0)
      {
        if (temp.SumScore > ps->stu[end].SumScore)
        {
          ps->stu[end + gap] = ps->stu[end];
          end--;
        }
        else
        {
          break;
        }
      }
      ps->stu[end + gap] = temp;
    }
  }
}
//case 9: 打印学生信息
void PrintSeqList(SeqList* ps)
{
  if (ps->size == 0)
  {
    printf("当前学生总数为0,无法打印.\n");
    return;
  }
  printf("%-20s %-20s %-20s %-20s %-20s %-20s %-20s\n", "姓名", "学号", "语文成绩", "数学成绩", "英语成绩", "总成绩", "排名");
  for (int i = 0; i < ps->size; i++)
  {
    printf("%-20s %-20s %-20.2f %-20.2f %-20.2f %-20.2f %-20d\n", ps->stu[i].name, ps->stu[i].id, \
      ps->stu[i].ChiScore, ps->stu[i].MatScore, ps->stu[i].EngScore, ps->stu[i].SumScore, i+1);
  }
}
int main()
{
  SeqList ST;
  InitSeqList(&ST);
  int input = 0;
  do
  {
    meau1();
    printf("请输入您的选择(提示:只能在0-9之间做选择):>");
    scanf("%d", &input);
    switch (input)
    {
    case 0:
      printf("\t******感谢您的使用,即将退出程序******\n");
      SaveSeqList(&ST);
      break;
    case 1:
      printf("\t******录入学生信息******\n");
      int nums = 0;
      printf("请输入您要录入的学生个数:>");
      scanf("%d", &nums);
      Student temp = { 0 };
      for (int i = 1; i <= nums; i++)
      {
        InitStudent(&temp, i);
        AddSeqList(&ST, temp);
      }
      printf("录入成功.\n");
      break;
    case 2:
      printf("\t******删除学生信息******\n");
      DelSeqList(&ST);
      break;
    case 3:
      printf("\t******查询指定课程******\n");
      SearByCourse(&ST);
      break;
    case 4:
      printf("\t******查询指定学生******\n");
      SearByStudent(&ST);
      break;
    case 5:
      printf("\t******修改学生信息******\n");
      ModSeqList(&ST);
      break;
    case 6:
      printf("\t******按照学号排序 (由小到大)******\n");
      QsortById(&ST, 0, ST.size);
      PrintSeqList(&ST);
      break;
    case 7:
      printf("\t******按照总分排序 (由高到低)******\n");
      ShellSortBySumScore(&ST);
      PrintSeqList(&ST);
      break;
    case 8:
      printf("\t******统计学生总数******\n");
      printf("当前学生总数:%d\n", ST.size);
      break;
    case 9:
      printf("\t******打印学生信息******\n");
      PrintSeqList(&ST);
      break;
    default:
      printf("选择错误,请重新选择(提示:请在0-9中选择):>");
      break;
    }
  } while (input);
}
目录
相关文章
|
存储 API 索引
一个图书管理系统的综合小练习
一个图书管理系统的综合小练习
97 0
程序设计基础课程设计 —— 疫苗预约管理系统附录
程序设计基础课程设计 —— 疫苗预约管理系统附录
程序设计基础课程设计 —— 学生信息管理系统(下)
程序设计基础课程设计 —— 学生信息管理系统(下)
程序设计基础课程设计 —— 学生信息管理系统(上)
程序设计基础课程设计 —— 学生信息管理系统(上)
|
7月前
|
存储 编解码 测试技术
图书馆信息管理系统(项目需求和计划、项目设计)(下)
图书馆信息管理系统(项目需求和计划、项目设计)(下)
|
7月前
|
安全 测试技术 数据库
图书馆信息管理系统(项目需求和计划、项目设计)(上)
图书馆信息管理系统(项目需求和计划、项目设计)(上)
|
7月前
|
算法
程序设计基础课程设计 —— 疫苗预约管理系统
程序设计基础课程设计 —— 疫苗预约管理系统
|
7月前
|
小程序 JavaScript Java
宿舍|学生宿舍管理小程序|基于微信小程序的学生宿舍管理系统设计与实现(源码+数据库+文档)
宿舍|学生宿舍管理小程序|基于微信小程序的学生宿舍管理系统设计与实现(源码+数据库+文档)
114 0
|
7月前
|
JavaScript 小程序 Java
基于Java的大学生选修选课系统设计与实现(亮点:多角色、贴近现实的选课流程、好看的系统外观)
基于Java的大学生选修选课系统设计与实现(亮点:多角色、贴近现实的选课流程、好看的系统外观)
151 0