C小项目 —— 学生信息管理系统

C小项目 —— 学生信息管理系统

实现功能:
1. 录入学生信息
2. 显示所有学生信息
3. 按学号查询学生信息
4. 按姓名查询学生信息(支持模糊查询)
5. 按年龄查询学生信息
6. 修改学生信息
7. 删除学生信息
8. 保存学生信息到文件
9. 从文件载入学生信息
10. 退出系统
        使用链表的方式,实现细节很简单,就是链表的一些基本操作(创建,删除结点,增加结点,查找结点等);还有很多地方是可以拓展的(比如使用排序按学号顺序打印,或者按分数高低打印等); 使用的是codeblock编译器。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned char  uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int   uint32_t;

#define STUDENT_NUMBER  20    // 学号最长20
#define STUDENT_NAME    20    // 姓名最长20
#define STUDENT_SUBJECT 3     // 假设只有三科
#define FILENAME_SIZE   100   // 待保存的文件路径

typedef struct student
{
  char num[STUDENT_NUMBER];       /* 学号 */
  char name[STUDENT_NAME];        /* 姓名 */
  char sex;                       /* 性别,'1'->男, '0'->女 */
  uint8_t age;                    /* 年龄 */
  uint8_t score[STUDENT_SUBJECT]; /* 三科的成绩 */
  uint16_t sum;                   /* 总成绩 */
  struct student *next;
} student_t;

student_t *head = NULL;
static uint32_t count = 1; // 系统中学生个数

void menu()
{
  printf("\n=========学生信息管理系统========\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("10. 退出系统\n");
}

// 录入学生信息:初始化链表和加入链表的过程
void create(void)
{
  int i, flag = 0;
  char tmp[10];
  student_t *point, *q;
  while(1)
  {
    if(1 != count)
    {
      printf("是否继续录入(y/n):");
      gets(tmp);
      if(strlen(tmp) > 10)
      {
        break;
      }
      if(strcmp(tmp, "n") == 0)
      {
        break;
      }
    }

    point = (student_t *)malloc(sizeof(student_t));
    printf("\n====请输入第%d个学生信息====\n", count);
    printf("学号:");
    gets(point->num);
    q = head;
    while(NULL != q)
    {
      if(atoi(q->num) == atoi(point->num))
      {
        flag = 1;
        printf("学号输入重复或者不合格,请重新输入...\n");
        break;
      }
      q = q->next;
    }
    if(1 == flag)
    {
      continue;
    }
    printf("姓名:");
    gets(point->name);
    printf("性别,('1'->男, '0'->女):");
    point->sex = getchar();
    getchar();
    printf("年龄:");
    gets(tmp);
    point->age = atoi(tmp);
    printf("三门课程的成绩:\n");
    point->sum = 0;
    for(i = 0; i < STUDENT_SUBJECT; ++i)
    {
      printf("第%d个成绩:", i + 1);
      gets(tmp);
      point->score[i] = atoi(tmp);
      point->sum += point->score[i];
    }
    printf("总成绩:%d\n", point->sum);
    point->next = head; // 核心代码就这两句
    head = point;
    count++;
  }
  printf("信息录入完毕,按任意键继续……");
  getch();
}

// 显示所有学生的信息:遍历链表打印输出的过程
void display_all(void)
{
  student_t *point = head;

  printf("学号\t姓名\t性别\t年龄\t三门课程的成绩\t\t总成绩\n");

  while(NULL != point)
  {
    if(0 == point->age)
    {
      point = point->next;
      continue;
    }
    printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", point->num, point->name, point->sex == '1' ? "男" : "女", point->age, *(point->score), *(point->score + 1), *(point->score + 2), point->sum);
    point = point->next;
  }
  printf("信息显示完毕,按任意键继续……");
  getch();
}

// 通过学号查找:唯一性
void search_on_number(void)
{
  student_t *point = head;
  char tmp[STUDENT_NUMBER];
  uint8_t flag = 0;
  printf("请输入学号:");
  gets(tmp);
  printf("学号\t姓名\t性别\t年龄\t三门课程的成绩\t\t总成绩\n");

  while(NULL != point)
  {
    if(strcmp(tmp, point->num) == 0)
    {
      flag = 1;
      printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", point->num, point->name, point->sex == '1' ? "男" : "女", point->age, *(point->score), *(point->score + 1), *(point->score + 2), point->sum);
    }
    point = point->next;
  }
  if(0 == flag)
  {
    printf("\n未找到学号是%s的学生,按任意键继续……", tmp);
  }
  else
  {
    printf("\n显示完毕,按任意键继续……");
  }
  getch();
}

// 通过名字查找:不唯一
void search_on_name(void)
{
  student_t *point = head;
  char tmp[STUDENT_NAME];
  uint8_t flag = 0;

  printf("请输入姓名:");
  gets(tmp);
  printf("学号\t姓名\t性别\t年龄\t三门课程的成绩\t\t总成绩\n");

  while(NULL != point)
  {
    if(strstr(point->name, tmp))
    {
      flag = 1;
      printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", point->num, point->name, point->sex == '1' ? "男" : "女", point->age, *(point->score), *(point->score + 1), *(point->score + 2), point->sum);
    }
    point = point->next;
  }

  if(0 == flag)
  {
    printf("\n未找到学号是%s的学生,按任意键继续……", tmp);
  }
  else
  {
    printf("\n显示完毕,按任意键继续……");
  }
  getch();
}

// 通过年龄查找:不唯一
void search_on_age(void)
{
  student_t *point = head;
  char tmp[30];
  uint8_t flag = 0;

  printf("请输入年龄:");
  gets(tmp);
  printf("学号\t姓名\t性别\t年龄\t三门课程的成绩\t\t总成绩\n");

  while(NULL != point)
  {
    if(atoi(tmp) == point->age)
    {
      flag = 1;
      printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", point->num, point->name, point->sex == '1' ? "男" : "女", point->age, *(point->score), *(point->score + 1), *(point->score + 2), point->sum);
    }
    point = point->next;
  }

  if(flag == 0)
  {
    printf("\n未找到年龄是%s的学生,按任意键继续……", tmp);
  }
  else
  {
    printf("\n显示完毕,按任意键继续……");
  }
  getch();
}

// 修改指定学号的学生信息
void modify(void)
{
  student_t *point = head;
  char tmp[STUDENT_NUMBER];
  uint8_t flag = 0, j;
  char a;

  printf("请输入学号:"); // 学号是唯一的
  gets(tmp);

  while(point != NULL)
  {
    if(strcmp(tmp, point->num) == 0)
    {
      flag = 1;
      printf("学号\t姓名\t性别\t年龄\t三门课程的成绩\t\t总成绩\n");
      printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", point->num, point->name, point->sex == '1' ? "男" : "女", point->age, *(point->score), *(point->score + 1), *(point->score + 2), point->sum);
      printf("\n====请输入新信息====\n");
      // 学号唯一不做修改,别的都可以修改
      printf("姓名:");
      gets(tmp);
      if(strcmp(tmp, "") != 0)
      {
        strcpy(point->name, tmp);
      }
      printf("性别,'1'->男, '0'->女:");
      a = getchar();
      if('\n' != a)
      {
        point->sex = a;
      }
      else
      {
        point->sex = '1'; // 默认男生
      }
      printf("年龄:");
      gets(tmp);
      if(strcmp(tmp, "") != 0)
      {
        point->age = atoi(tmp);
      }
      else
      {
        point->age = 20; // 默认就20岁了
      }
      printf("三门课程的成绩:\n");
      point->sum = 0;
      for(j = 0; j < STUDENT_SUBJECT; ++j)
      {
        printf("第%d科成绩:", j + 1);
        gets(tmp);
        if(strcmp(tmp, "") != 0)
        {
          point->score[j] = atoi(tmp);
        }
        point->sum += point->score[j];
      }
      printf("总成绩:%d\n", point->sum);
    }
    point = point->next;
  }
  if(0 == flag)
  {
    printf("\n未找到%s!按任意键继续……", tmp);
  }
  else
  {
    printf("\n修改完毕,按任意键继续……");
  }
  getch();
}

// 删除指定学生的信息:删除某个链表结点
void delete(void)
{
  student_t *point = head, *back;
  char tmp[STUDENT_NUMBER];
  uint8_t flag = 0, j;
  char a;

  printf("请输入学号:"); // 学号是唯一的
  gets(tmp);

  while(1)
  {
    if(NULL == point->next)
    {
      break;
    }
    if(atoi(tmp) == atoi(point->num))
    {
      flag = 1;
      head = point->next;
      free(point);
      count--;
      break;
    }
    back = point;
    point = point->next;
    if(atoi(tmp) == atoi(point->num))
    {
      flag = 1;
      back->next = point->next;
      free(point);
      count--;
      break;
    }
  }

  if(0 == flag)
  {
    printf("\n未找到%s!按任意键继续……", tmp);
  }
  else
  {
    printf("\n修改完毕,按任意键继续……");
  }
  getch();
}

// 保存到指定路径
void save(void)
{
  FILE *fp;
  student_t *point = head;
  char filename[FILENAME_SIZE] = {"d://qq.dat"};
  printf("请输入文件名如%s:", filename);
  gets(filename);

  while(strcmp(filename , "") == 0)
  {
    printf("文件名不能为空,请重新输入:");
    gets(filename);
  }
  if((fp = fopen(filename, "wb")) == NULL)
  {
    printf("文件打开失败!\n按任意键继续……");
    getch();
    return;
  }
  printf("正在保存信息,请耐心等待……\n");
  count = 0;
  while(NULL != point)
  {
    count++;
    fwrite(point, sizeof(student_t), 1, fp);
    point = point->next;
  }
  fclose(fp);
  printf("信息保存成功,按任意键继续……");
  getch();
}

// 从指定文件读取学生的信息到链表
void load(void)
{
  FILE *fp;
  student_t *point, *q;
  char filename[FILENAME_SIZE] = {"d://qq.dat"};
  printf("请输入文件名如%s:", filename);
  gets(filename);

  while(strcmp(filename , "") == 0)
  {
    printf("文件名不能为空,请重新输入:");
    gets(filename);
  }
  if((fp = fopen(filename, "rb")) == NULL)
  {
    printf("文件打开失败!\n按任意键继续……");
    getch();
    return;
  }

  printf("正在从文件载入信息,请耐心等待……\n");
  point = (student_t *)malloc(sizeof(student_t));
  head = point;
  count = 0;

  while(!feof(fp))
  {
    count++;
    fread(point, sizeof(struct student), 1, fp);
    point->next = (student_t *)malloc(sizeof(student_t));
    q = point;
    point = point->next;
  }
  q->next = NULL;
  fclose(fp);
  printf("学生信息载入成功,按任意键继续……");
  getch();
}

// 退出系统
void quit(void)
{
  char c;
  printf("你真的要退出系统吗?(Y/N)");

  c = getchar();
  if('Y' == c || 'y' == c)
  {
    printf("系统退出成功...\n");
    exit(0);
  }
}

int main(void)
{
  uint8_t value;
  char choice[3];

  while(1)
  {
    system("cls");
    menu();
    do
    {
      printf("请输入功能键:");
      gets(choice);
      value = atoi(choice);
    }
    while((value > 12) || (value < 0));
    switch(value)
    {
    case 1:
      create();
      break;
    case 2:
      display_all();
      break;
    case 3:
      search_on_number();
      break;
    case 4:
      search_on_name();
      break;
    case 5:
      search_on_age();
      break;
    case 6:
      modify();
      break;
    case 7:
      delete();
      break;
    case 8:
      save();
      break;
    case 9:
      load();
      break;
    case 10:
      quit();
      break;
    default:
      break;
    }
  }

  return 0;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值