基于顺序表的学生成绩管理系统

简介: 基于顺序表的学生成绩管理系统

目的

针对学生信息(学号,姓名,性别,英语、数学、数据结构成绩、简介)进行

操作(添加、删除、修改、查找个人、查找全部)信息


效果呈现


①学生数据添加

②查看学生数据

③修改和查看

③删除及查看


代码的具体实现


一.在测试文件(StuScoreTest.c)框架构建

1.先基于顺序表的初始化学生管理系统

2.主函数学生管理系统利用在do...while...语句中包含switch...case..语句实现学生数据的增删查改操作的框架

3.再基于顺序表的销毁学生管理系统

学生管理系统框架代码实现

int main()
{
  int op = -1;
  Stu con;
  //初始化学生管理系统
  STUCS(&con);
  do 
  {
    menu();
    printf("请选择你的操作:");
    scanf("%d", &op);
    switch (op)
    {
    case 1:
      //添加学生数据
      stuscoreadd(&con);
      break;
    case 2:
      //删除学生数据
      stuscoredel(&con);
      break; 
    case 3:
      //修改学生数据
      stuscoremodify(&con);
      break;
    case 4:
      //查找学生数据
      stuscorefind(&con);
      break;
    case 5:
      //查看完整学生数据
      stuscoreshow(&con);
      break;
    case 0:
      printf("成功退出系统\n");
      break;
    default:
      printf("选择错误,请重新选择\n");
    }
 
  } while (op != 0);
  //销毁学生管理系统
  STUdestroy(&con);
  return 0;
}

二.在头文件(StuScore.h)定义学生管理系统的相关函数

1.创建(学生相关数据类型)结构体和顺序表的前置声明

#pragma once
 
#define MAX_NAME 100
 
//(学生相关数据类型)结构体
typedef struct stuscore
{
  int id;//学号
  char name[MAX_NAME];//姓名
  char sex[5];//性别
  float EngScore;//英语
  float MathScore;//数学
  float DatastrScore;//数据结构
  char StudentProfile[1000];
}Stu;
 
//顺序表的前置声明
struct shunxu;
 
typedef struct shunxu stu;

2.定义学生管理系统的初始化和销毁,增添查改函数

//学生管理系统的初始化和销毁
void STUCS(stu* pcon);
void STUdestroy(stu* pcon);
 
//添加,删除,修改,查找,查找全部
void stuscoreadd(stu* pcon);
void stuscoredel(stu* pcon); 
void stuscoremodify(stu* pcon);
void stuscorefind(stu* pcon);
void stuscoreshow(stu* pcon);

三.在文件(StuScore.c)具体实现学生数据的增删查改

1.学生管理系统的初始化和销毁(调用顺序表中的初始化和销毁)

调用代码

//初始化
void CS(SX* ps)
{
  //具体arr,size,nowsize具体的值不知道是多少,所以初始化为NULL,0
  ps->arr = NULL;
  ps->size = ps->nowsize = 0;
}
 
//销毁
void SXdestroy(SX* ps)
{
  //保证指针有效
  assert(ps);
  if (ps->arr)
  {
    free(ps->arr);
  }
  ps->arr = NULL;
  ps->size = ps->nowsize = 0;
}

学生管理系统的初始化和销毁代码具体实现

//学生管理系统的初始化和销毁
void STUCS(stu* pcon)
{
  CS(pcon);
}
 
void STUdestroy(stu* pcon)
{
  SXdestroy(pcon);
}

学生增删查找的具体实现

2.学生数据的添加

①输入学生数据保存在结构体变量

②使用.访问结构体成员输入学生的数据(学号,姓名,性别,英语、数学、数据结构成绩、简介)

③基于顺序表的尾插将学生数据保存在学生管理系统里去

调用顺序表的尾部插入数据

//顺序表的尾插
void CHARUback(SX* ps, datatype x)
{
  //方式一:断言 -- 暴力方式 --会报错且知道具体错误位置
  assert(ps);
  //方式二:断言 -- 温柔方式--会报错,不知道具体错误位置
  /*if (ps == NULL)
  {
    return;
  }*/
 
  //空间不够,扩容
  publicKUOR(ps);
  //空间足够,直接插入
  /*第一种写法*/
  //ps->arr[ps->size] = x;
  //ps->size++;
  /*第二种写法*/
  ps->arr[ps->size++] = x;
 
}
学生数据添加代码具体实现
//添加学生数据
void stuscoreadd(stu* pcon)
{
  Stu stu;
  printf("请输入学生学号:\n");
  scanf("%d", &stu.id); 
  printf("请输入学生姓名:\n");
  scanf("%s", stu.name);
  printf("请输入学生性别:\n");
  scanf("%s", stu.sex);
  printf("请输入学生英语成绩:\n");
  scanf("%f", &stu.EngScore);
  printf("请输入学生数学成绩:\n");
  scanf("%f", &stu.MathScore);
  printf("请输入学生数据结构成绩:\n");
  scanf("%f", &stu.DatastrScore);
  printf("请输入学生个人简介:\n");
  scanf("%s", stu.StudentProfile);
 
  //保存到学生管理系统:尾插
  CHARUback(pcon, stu);
}

3.利用学生姓名寻找学生相关数据,若找到返回下标,找不到,返回-1

使用strcmp进行字符串之间的比较进而实现学生姓名的查找

利用学生姓名寻找学生相关数据代码具体实现
//寻找学生名字,找到返回下标,没找到,返回-1
int findname(stu* pcon, char name[])
{
  for (int i = 0; i < pcon->size; i++)
  {
    if (strcmp(pcon->arr[i].name, name) == 0) 
    {
      return i;//找到了
    }
  }
  return -1;
}

4.学生数据删除

①利用寻找学生姓名删除该生的相关数据

若找到该生姓名,调用顺序表的删除进而删除该生的相关数据

若找不到该生姓名,直接返回

②调用顺序表的删除进而删除学生的相关数据

调用代码

//删除指定位置数据
void SXpointdestroy(SX* ps, int pos)
{
  //判断ps是否为有效指针
  assert(ps);
  //断言,保证下标pos>=0且pos小于顺序表空间大小size
  assert(pos >= 0 && pos < ps->size);
 
  for (int i = pos; i < ps->size - 1; i++)
  {
    ps->arr[i] = ps->arr[i + 1];
  }
  ps->size--;
}
学生数据删除具体实现
//学生数据删除
void stuscoredel(stu* pcon)
{
  printf("请输入要删除的学生姓名:");
  char name [MAX_NAME];
  scanf("%s", name);
 
  int findIndex = findname(pcon, name);
  if (findIndex < 0)
  {
    printf("要删除的学生不存在!\n");
    return;
  }
  SXpointdestroy(pcon, findIndex);
  printf("该生相关数据删除成功!!!\n");
}

5.修改学生数据

利用寻找学生姓名修改该生的相关数据

若找到该生姓名,利用指针修改该生的相关数据

若找不到该生姓名,直接返回

修改学生数据的具体实现
//学生数据的修改
void stuscoremodify(stu* pcon)
{
  char name[MAX_NAME];
  printf("请输入要修改的学生姓名:");
  scanf("%s", name);
 
  int findIndex = findname(pcon, name);
  if (findIndex < 0)
  {
    printf("要找的该生相关数据不存在!\n");
    return;
  }
  printf("请输入要修改的学生学号:\n");
  scanf("%d", &pcon->arr[findIndex].id);
  printf("请输入要修改的学生姓名:\n");
  scanf("%s", pcon->arr[findIndex].name);
  printf("请输入要修改的学生性别:\n");
  scanf("%s", pcon->arr[findIndex].sex);
  printf("请输入要修改的学生英语成绩:\n");
  scanf("%f", &pcon->arr[findIndex].EngScore);
  printf("请输入要修改的学生数学成绩:\n");
  scanf("%f", &pcon->arr[findIndex].MathScore);
  printf("请输入要修改的学生数据结构成绩:\n");
  scanf("%f", &pcon->arr[findIndex].DatastrScore);
  printf("请输入要修改的学生个人简介:\n");
  scanf("%s", pcon->arr[findIndex].StudentProfile);
  printf("修改学生相关数据成功!!!\n");
}

6.学生数据的完整查看

使用for循环指针访问结构体成员输出全部学生的相关数据

学生数据的完整查看具体实现
//学生完整数据查看
void stuscoreshow(stu* pcon)
{
  for (int i = 0; i < pcon->size; i++)
  {
    printf("学生学号:%d\n",pcon->arr[i].id);
    printf("学生姓名:%s\n", pcon->arr[i].name);
    printf("学生性别:%s\n", pcon->arr[i].sex);
    printf("学生英语成绩:%.2f\n", pcon->arr[i].EngScore);
    printf("学生数学成绩:%.2f\n", pcon->arr[i].MathScore);
    printf("学生数据结构成绩:%.2f\n", pcon->arr[i].DatastrScore);
    printf("学生个人简介:%s\n", pcon->arr[i].StudentProfile);
  }
}

7.一个学生相关数据的查看

利用寻找学生姓名打印该生的相关数据

若找到该生姓名,利用指针打印该生的相关数据

若找不到该生姓名,直接返回

一个学生相关数据的查看具体实现
//学生相关数据查看
void stuscorefind(stu* pcon)
{
  char name[MAX_NAME];
  printf("请输入要查找的学生姓名:\n");
  scanf("%s", name);
  int findIndex = findname(pcon, name);
  if (findIndex < 0)
  {
    printf("查找到学生相关数据不存在!!!\n");
    return;
  }
 
  //找到了,打印学生相关数据
    printf("学生学号:%d\n", pcon->arr[findIndex].id);
    printf("学生姓名:%s\n", pcon->arr[findIndex].name);
    printf("学生性别:%s\n", pcon->arr[findIndex].sex);
    printf("学生英语成绩:%.2f\n", pcon->arr[findIndex].EngScore);
    printf("学生数学成绩:%.2f\n", pcon->arr[findIndex].MathScore);
    printf("学生数据结构成绩:%.2f\n", pcon->arr[findIndex].DatastrScore);
    printf("学生个人简介:%s\n", pcon->arr[findIndex].StudentProfile);
}
目录
相关文章
|
SQL Oracle Java
Java 生态圈中的嵌入式数据库,哪家强?(上)
嵌入式数据库一个很陌生的词汇,以前只是听说,但是没有真正使用过,今天小编和大家一起来揭开它的面纱。
1307 0
Java 生态圈中的嵌入式数据库,哪家强?(上)
|
算法 C++
【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】 目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现二叉排序树的基本算法。 相关知识 为了完成本关任务,你需要掌握:二叉树的创建、查找和删除算法。具体如下: (1)由关键字序列(4,9,0,1,8,6,3,5,2,7)创建一棵二叉排序树bt并以括号表示法输出。 (2)判断bt是否为一棵二叉排序树。 (3)采用递归方法查找关键字为6的结点,并输出其查找路径。 (4)分别删除bt中关键
478 11
【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
|
12月前
|
人工智能 JSON API
Kimi K2,开源万亿参数大模型
Kimi K2是由月之暗面推出的全球首个开源万亿参数MoE模型,具备强大的工具调用、复杂推理与自主决策能力。该模型可通过MaaS平台快速调用,无需编码,最快5分钟即可部署,体验成本低至0元。通过Cherry Studio客户端,用户可便捷配置API密钥并调用模型,同时支持MCP功能,实现网页内容抓取等扩展能力。操作简单、功能强大,适合企业与开发者高效应用。
|
机器学习/深度学习 人工智能 搜索推荐
《探秘AI驱动的个性化推荐系统:精准触达用户的科技密码》
在这个信息爆炸的时代,AI驱动的个性化推荐系统应运而生,通过数据收集与处理、构建用户画像、核心算法(协同过滤与基于内容的推荐)及深度学习技术,精准洞察用户需求。它广泛应用于电商、视频平台等领域,提升用户体验和商业效益。尽管面临数据稀疏性、隐私保护等挑战,未来将更加精准、实时并注重用户隐私。
2185 1
《探秘AI驱动的个性化推荐系统:精准触达用户的科技密码》
|
人工智能 自然语言处理 测试技术
WebWalker:阿里巴巴推出评估LLMs在网页浏览任务中性能的基准工具
WebWalker是阿里巴巴开发的用于评估大型语言模型在网页浏览任务中性能的工具,支持多智能体框架和垂直探索策略,提供WebWalkerQA数据集进行性能测试。
872 1
WebWalker:阿里巴巴推出评估LLMs在网页浏览任务中性能的基准工具
|
算法
重磅!2025年中科院预警期刊名单正式发布!
中国科学院文献情报中心发布的《国际期刊预警名单》旨在防范学术不端与不当出版行为,保护科研生态良性发展。2025年版本聚焦两大问题:学术不端(如引用操纵、论文工厂)和不利于中国学术成果国际化传播的行为(如中国作者占比过高或APC费用不合理)。预警名单动态调整,发布时点从年底改为年初,便于科研人员及时调整投稿策略。被列入预警名单的期刊可能影响职称评审及科研经费认可,建议优先选择中科院分区表推荐期刊,警惕“快速代发”陷阱,并关注期刊官网声明。未来科研生态将更注重规范化与原创性,推动高质量学术发表。维护健康的学术环境对提升中国科研全球影响力至关重要。
2549 0
|
存储 IDE 开发工具
ModelScope魔搭25年1月版本发布月报
随着2025年帷幕的缓缓拉开,ModelScope团队怀着新年新气象的美好期许,为广大开发者带来了1月份的重磅更新。
805 13
|
机器学习/深度学习 人工智能 自然语言处理
FullStack Bench:字节豆包联合M-A-P社区开源的全新代码评估基准
FullStack Bench是由字节跳动豆包大模型团队与M-A-P社区联合推出的全新代码评估基准,专注于全栈编程和多语言编程能力评估。该基准覆盖超过11种真实编程场景,包含3374个问题,涉及16种编程语言,旨在更有效地衡量大模型在现实世界中的代码开发能力。
746 5
FullStack Bench:字节豆包联合M-A-P社区开源的全新代码评估基准
|
Java Android开发
Android 对adb命令的拦截
Android 对adb命令的拦截
477 2
|
开发者 C# UED
如何轻松将WinUI控件引入Web应用?Uno Platform实战攻略——从环境搭建到性能优化,一探究竟!
【8月更文挑战第31天】Uno Platform 通过支持 WebAssembly,将 WinUI 控件无缝带入 Web,为多平台开发提供了新途径。本文介绍如何在 Web 中使用 WinUI 控件,包括环境搭建、控件使用、性能优化、样式调整及测试调优,助力开发者打造高质量跨平台应用。
457 0