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;
}


以下是一个简单的C语言学生成绩管理系统的实现,包括添加学生信息、删除学生信息、修改学生信息学生信息显示所有学生信息等功能。具体实现如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STUDENT_NUM 100 // 最大学生数 // 学生结构体 typedef struct { char name[20]; // 姓名 int id; // 学号 float score; // 成绩 } Student; // 学生数组 Student students[MAX_STUDENT_NUM]; int studentNum = 0; // 学生数 // 添加学生信息 void addStudent() { if (studentNum >= MAX_STUDENT_NUM) { printf("学生数已达到最大值,无法添加新学生!\n"); return; } printf("请输入学生姓名:"); scanf("%s", students[studentNum].name); printf("请输入学生学号:"); scanf("%d", &students[studentNum].id); printf("请输入学生成绩:"); scanf("%f", &students[studentNum].score); studentNum++; printf("添加成功!\n"); } // 删除学生信息 void deleteStudent() { int id; printf("请输入要删除的学生学号:"); scanf("%d", &id); int index = -1; for (int i = 0; i < studentNum; i++) { if (students[i].id == id) { index = i; break; } } if (index == -1) { printf("未找到该学生!\n"); return; } for (int i = index; i < studentNum - 1; i++) { students[i] = students[i + 1]; } studentNum--; printf("删除成功!\n"); } // 修改学生信息 void modifyStudent() { int id; printf("请输入要修改的学生学号:"); scanf("%d", &id); int index = -1; for (int i = 0; i < studentNum; i++) { if (students[i].id == id) { index = i; break; } } if (index == -1) { printf("未找到该学生!\n"); return; } printf("请输入学生姓名:"); scanf("%s", students[index].name); printf("请输入学生学号:"); scanf("%d", &students[index].id); printf("请输入学生成绩:"); scanf("%f", &students[index].score); printf("修改成功!\n"); } // 学生信息 void queryStudent() { int id; printf("请输入要询的学生学号:"); scanf("%d", &id); int index = -1; for (int i = 0; i < studentNum; i++) { if (students[i].id == id) { index = i; break; } } if (index == -1) { printf("未找到该学生!\n"); return; } printf("姓名:%s,学号:%d,成绩:%.2f\n", students[index].name, students[index].id, students[index].score); } // 显示所有学生信息 void showAllStudents() { printf("姓名\t学号\t成绩\n"); for (int i = 0; i < studentNum; i++) { printf("%s\t%d\t%.2f\n", students[i].name, students[i].id, students[i].score); } } int main() { int choice; while (1) { printf("请选择操作:\n"); printf("1.添加学生信息\n"); printf("2.删除学生信息\n"); printf("3.修改学生信息\n"); printf("4.学生信息\n"); printf("5.显示所有学生信息\n"); printf("6.退出程序\n"); scanf("%d", &choice); switch (choice) { case 1: addStudent(); break; case 2: deleteStudent(); break; case 3: modifyStudent(); break; case 4: queryStudent(); break; case 5: showAllStudents(); break; case 6: exit(0); default: printf("无效的选择!\n"); break; } } return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值