C语言编写学生成绩管理系统-要求有增删改查(C语言基础题-8道)

文章目录

  • 1-5题
  • 题目
    • 例题8(难度★ ★ ★ ★ ☆)
  • 答案
    • 例题8
      • 答案1
        • 解析
      • 答案2
        • 解析

1-5题

C语言基础例题1-3题-指针篇
C语言基础例题4-5题-二维数组篇
C语言基础例题6-7题-结构体篇

题目

例题8(难度★ ★ ★ ★ ☆)

编写一个学生成绩管理系统,实现以下功能:

  1. 添加学生信息:从键盘输入学生的姓名和成绩,将学生信息添加到系统中。
  2. 删除学生信息:从键盘输入要删除的学生姓名,若学生存在则将其从系统中删除。
  3. 查找学生信息:从键盘输入要查询的学生姓名,若学生存在则显示学生姓名和成绩,否则提示查无此人。
  4. 修改学生成绩:从键盘输入要修改成绩的学生姓名和新的成绩,若学生存在则将其成绩修改为新的成绩。
  5. 显示所有学生信息:显示系统中所有学生的姓名和成绩。
  6. 退出程序:结束学生成绩管理系统。

运行结果如下所示:
在这里插入图片描述

答案

例题8

答案1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定义学生信息结构体
typedef struct
{char name[20];int score;
} Student;// 定义链表节点结构体
typedef struct Node
{Student data;struct Node *next;
} Node;// 在链表末尾添加新节点(学生信息)
void addStudent(Node *head)
{Node *p = head;while (p->next != NULL){p = p->next;}Node *newNode = (Node *)malloc(sizeof(Node));printf("请输入学生姓名:");scanf("%s", newNode->data.name);printf("请输入成绩:");scanf("%d", &(newNode->data.score));newNode->next = NULL;p->next = newNode;printf("添加成功!\n");
}// 根据学生姓名删除节点
void deleteStudent(Node *head)
{char name[20];printf("请输入要删除的学生姓名:");scanf("%s", name);Node *p = head->next;Node *prev = head;while (p != NULL){if (strcmp(p->data.name, name) == 0){ // 学生姓名匹配,删除节点prev->next = p->next;free(p);printf("删除成功!\n");return;}prev = p;p = p->next;}printf("查无此人!\n");
}// 根据学生姓名查找学生信息
void findStudent(Node *head)
{char name[20];printf("请输入要查询的学生姓名:");scanf("%s", name);Node *p = head->next;while (p != NULL){if (strcmp(p->data.name, name) == 0){ // 学生姓名匹配,显示学生信息printf("姓名:%s\t成绩:%d\n", p->data.name, p->data.score);return;}p = p->next;}printf("查无此人!\n");
}// 根据学生姓名修改学生成绩
void modifyScore(Node *head)
{char name[20];int newScore;printf("请输入要修改成绩的学生姓名:");scanf("%s", name);printf("请输入新的成绩:");scanf("%d", &newScore);Node *p = head->next;while (p != NULL){if (strcmp(p->data.name, name) == 0){ // 学生姓名匹配,修改成绩p->data.score = newScore;printf("修改成功!\n");return;}p = p->next;}printf("查无此人!\n");
}// 显示所有学生信息
void displayStudents(Node *head)
{Node *p = head->next;while (p != NULL){printf("姓名:%s\t成绩:%d\n", p->data.name, p->data.score);p = p->next;}
}int main()
{Node *head = (Node *)malloc(sizeof(Node));head->next = NULL;int option;do{printf("【菜单】\n");printf("1. 添加学生信息\n");printf("2. 删除学生信息\n");printf("3. 查找学生信息\n");printf("4. 修改学生成绩\n");printf("5. 显示所有学生信息\n");printf("6. 退出程序\n");printf("\n请选择菜单选项:");scanf("%d", &option);switch (option){case 1:addStudent(head);break;case 2:deleteStudent(head);break;case 3:findStudent(head);break;case 4:modifyScore(head);break;case 5:displayStudents(head);break;case 6:printf("程序结束!\n");break;default:printf("错误!没有此选项!\n");break;}} while (option != 6);// 释放链表内存Node *p = head;while (p != NULL){Node *temp = p->next;free(p);p = temp;}return 0;
}
解析

struct _StudentItem:定义了学生信息的结构体。它包含一个char数组name用于存储学生姓名,一个int变量score用于存储成绩。

struct Node:定义了链表节点的结构体。它包含了一个Student类型的数据成员data用于存储学生信息,以及一个指向下一个节点的指针next。

addStudent:在链表末尾添加新节点(学生信息)。该函数首先遍历链表,找到最后一个节点,然后创建一个新节点,要求用户输入学生的姓名和成绩,并将新节点添加到链表末尾。

deleteStudent:根据学生姓名删除节点。该函数要求用户输入要删除的学生姓名,然后从链表头开始遍历每个节点,寻找匹配的学生姓名。如果找到匹配的节点,则删除该节点,并释放内存。如果没有找到匹配的节点,输出"查无此人!"。

findStudent:根据学生姓名查找学生信息。该函数要求用户输入要查询的学生姓名,然后从链表头开始遍历每个节点,寻找匹配的学生姓名。如果找到匹配的节点,则输出该学生的姓名和成绩。如果没有找到匹配的节点,输出"查无此人!"。

modifyScore:根据学生姓名修改学生成绩。该函数要求用户输入要修改成绩的学生姓名和新的成绩,然后从链表头开始遍历每个节点,寻找匹配的学生姓名。如果找到匹配的节点,则修改该节点的成绩为新的成绩。如果没有找到匹配的节点,输出"查无此人!"。

displayStudents:显示所有学生信息。该函数从链表头开始遍历每个节点,并输出每个节点的学生姓名和成绩。

在主函数里,我们首先创建了一个链表头指针head,然后使用一个菜单循环,等待用户输入菜单选项。根据用户的选择,调用相应的函数执行相应的功能。直到用户选择退出程序为止。最后,释放了链表的内存。

答案2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生信息结构体
typedef struct _StudentItem
{char name[9];float grade;
} StudentItem;
// 定义链表节点结构体
typedef struct _StudentNode
{StudentItem item;struct _StudentNode *next;
} StudentNode;
// 在链表开头添加新节点(学生信息)
void AddStudent(StudentNode **student);
// 根据学生姓名删除节点
void DeleteStudent(StudentNode **student, char *name);
// 根据学生姓名修改学生成绩
void ModifyGrades(StudentNode *student, float grade);
// 显示所有学生信息
void displayStudents(StudentNode **student);
// 根据学生姓名查找学生信息
StudentNode *FindStudent(StudentNode **student, char *name);
// 释放链表内存
void FreeNode(StudentNode **student);int main(void)
{StudentNode *student = NULL, *target;int selection;char name[9];float grade;printf("【菜单】\n1.添加学生信息\n2.删除学生信息\n3.查找学生信息\n4.修改学生成绩\n5.显示所有学生信息\n6.退出程序\n");while (scanf("%d", &selection) == 1 && selection != 6){switch (selection){case 1:AddStudent(&student);break;case 2:printf("请输入要删除的学生名:");scanf("%s", name);DeleteStudent(&student, name);break;case 3:printf("请输入要查询的学生名:");scanf("%s", name);target = FindStudent(&student, name);if (target == NULL)printf("查无此人!\n");elseprintf("姓名:%s\t成绩:%f\n", target->item.name, target->item.grade);break;case 4:printf("请输入要修改成绩的学生名:");scanf("%s", name);target = FindStudent(&student, name);if (target == NULL)printf("查无此人!\n");else{printf("请输入新的成绩:");scanf("%f", &grade);ModifyGrades(target, grade);puts("修改成功");}break;case 5:displayStudents(&student);break;default:printf("错误!没有此选项!\n");break;}printf("继续输入选项:\n");}FreeNode(&student);getchar();getchar();return 0;
}
void AddStudent(StudentNode **student)
{StudentNode *temp = (StudentNode *)malloc(sizeof(StudentNode));printf("请输入学生姓名:");scanf("%s", temp->item.name);printf("请输入成绩:");scanf("%f", &temp->item.grade);temp->next = *student;*student = temp;
}
void DeleteStudent(StudentNode **student, char *name)
{StudentNode *target = *student, *prev;// 学生姓名匹配,删除节点if (target != NULL && !strcmp(target->item.name, name)){*student = target->next;}else{prev = target;target = target->next;while (target != NULL){// 学生姓名匹配,删除节点if (!strcmp(target->item.name, name)){prev->next = target->next;break;}prev = target;target = target->next;}}if (target != NULL){free(target);printf("删除成功!\n");}else{printf("删除失败!\n");}
}
void ModifyGrades(StudentNode *student, float grade)
{student->item.grade = grade;
}
StudentNode *FindStudent(StudentNode **student, char *name)
{StudentNode *p = *student;while (p != NULL){// 学生姓名匹配,返回学生节点if (!strcmp(p->item.name, name))break;p = p->next;}return p;
}
void displayStudents(StudentNode **student)
{const StudentNode *p = *student;if (*student == NULL){printf("没有学生数据\n");}else{while (p != NULL){printf("姓名:%s\t成绩%f\n", p->item.name, p->item.grade);p = p->next;}}
}
void FreeNode(StudentNode **student)
{StudentNode *target=*student,*next;while(target!=NULL){next=target->next;free(target);target=next;}
}
解析

我们使用链表来存储学生的信息,也就是姓名和成绩。根据题目要求需要实现添加学生、删除学生、查找学生、修改学生的成绩、显示所有学生的信息,退出的功能。

首先,我们定义了两个结构体:StudentItem 和 StudentNode。StudentItem 用来存储学生的姓名和成绩,而 StudentNode 用来表示链表中的节点,它包含一个 StudentItem 类型的变量和一个指向下一个节点的指针。

然后,我们实现一些函数来完成不同的操作。AddStudent 函数用于在链表开头添加一个新的学生节点;DeleteStudent 函数用于根据学生的姓名来删除对应的节点;ModifyGrades 函数根据学生的姓名来修改他们的成绩;displayStudents 函数显示所有学生的信息;FindStudent 函数根据学生的姓名来查找他们的信息;最后,FreeNode 函数用来释放链表的内存。

在主函数中,我们通过一个循环来让用户选择要执行的操作。根据用户的输入,我们会调用相应的函数来处理操作。比如,如果用户选择添加学生,我们会创建一个新的节点,然后获取学生的姓名和成绩,最后将其添加到链表的开头。

如果要删除学生,我们先根据学生的姓名找到对应的节点,然后将其从链表中删除并释放其内存。修改学生的成绩,先根据学生的姓名找到对应的节点,然后更改他的成绩。显示所有学生的信息,就遍历链表并打印每个学生的姓名和成绩。

在程序结束时,记得释放链表的内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/132330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二、Hadoop分布式系统基础架构

1、分布式 分布式体系中&#xff0c;会存在众多服务器&#xff0c;会造成混乱等情况。那如何让众多服务器一起工作&#xff0c;高效且不出现问题呢&#xff1f; 2、调度 &#xff08;1&#xff09;架构 在大数据体系中&#xff0c;分布式的调度主要有2类架构模式&#xff1a…

使用Selenium Grid远程执行测试

我们将在同一台工作电脑上&#xff0c;分别启动主控&#xff08;Hub&#xff09;和节点&#xff08;Node&#xff09;2个Selenium Grid服务&#xff0c;IP地址均使用环回地址127.0.0.1&#xff0c;端口分别为4444和5555。开始以下操作前&#xff0c;请确认你的机器上已经安装、…

【MySQL基本功系列】第一篇 先熟悉MySQL的运行逻辑

​ 我将推出一系列关于MySQL的博客文章&#xff0c;涵盖了从入门到深入底层的原理。这些文章将包括MySQL的运行逻辑、InnoDB存储引擎、SQL优化、undo log、bin log等多个方面的知识。希望这些文章能为你提供宝贵的信息和洞见&#xff0c;并帮助你更好地理解和应用MySQL。同时&a…

打造高效运营底座,极智嘉一体化软件系统彰显科技威能

在仓储成本和物流需求日益增加的今天&#xff0c;创新且高效的物流机器人解决方案能够显著提升物流运营效率&#xff0c;降低物流成本&#xff0c;实现智能化、精益化、一体化的物流管理。全球仓储机器人引领者极智嘉(Geek)以「一套系统&#xff0c;天生全能」为准则&#xff0…

阿里巴巴1688商品详情 API 接口示例

1688.item_get 公共参数 请求地址: https://o0b.cn/anzexi 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_…

Windows ObjectType Hook 之 ParseProcedure

1、背景 Object Type Hook 是基于 Object Type的一种深入的 Hook&#xff0c;比起常用的 SSDT Hook 更为深入。 有关 Object Type 的分析见文章 《Windows驱动开发学习记录-ObjectType Hook之ObjectType结构相关分析》。 这里进行的 Hook 为 其中之一的 ParseProcedure。文章实…

7.spark sql编程

概述 spark 版本为 3.2.4&#xff0c;注意 RDD 转 DataFrame 的代码出现的问题及解决方案 本文目标如下&#xff1a; RDD ,Datasets,DataFrames 之间的区别入门 SparkSession创建 DataFramesDataFrame 操作编程方式运行 sql 查询创建 DatasetsDataFrames 与 RDDs 互相转换 使用…

创建基于多任务的并发服务器

有几个请求服务的客户端&#xff0c;我们就创建几个子进程。 这个过程有以下三个阶段&#xff1a; 这里父进程传递的套接字文件描述符&#xff0c;实际上不需要传递&#xff0c;因为子进程会复制父进程拥有的所有资源。 #include <stdio.h> #include <stdlib.h>…

如何再kali中下载iwebsec靶场

这个靶场有三种搭建方法&#xff1a; 第一种是在线靶场&#xff1a;http://www.iwebsec.com:81/ 第二种是虚拟机版本的&#xff0c;直接下载到本地搭建 官网地址下载&#xff1a;http://www.iwebsec.com/ 而第三种就是利用docker搭建这个靶场&#xff0c;我这里是用kali进行…

window10 定时任务

window10 定时任务 1、背景2、目标3、思路4、实操4.1、设置定时任务4.2、配置策略4.3、验证 1、背景 项目上由于业务调试需要&#xff0c;开具了一台window10系统&#xff0c;此台window10为项目组公共使用&#xff0c;为防止误操作分配了不通的账号&#xff0c;日常使用各自账…

学习视频剪辑:巧妙运用中画、底画,制作画中画,提升视频效果

随着数字媒体的普及&#xff0c;视频剪辑已经成为一项重要的技能。在视频剪辑过程中&#xff0c;制作画中画可以显著提升视频效果、信息传达和吸引力。本文讲解云炫AI智剪如何巧妙运用中画、底画批量制作画中画来提升视频剪辑水平&#xff0c;提高剪辑效率。 操作1、先执行云…

​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?

在当今汽车行业中&#xff0c;随着消费者偏好的多样化和年轻化&#xff0c;汽车制造商们正面临着前所未有的挑战与机遇。在2023年上海车展上&#xff0c;起亚汽车公司正式发布了全新紧凑级SUV——赛图斯。这款车型不仅标志着起亚对年轻消费市场的深入洞察&#xff0c;也展现了公…

Springboot+vue的导师双选管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的导师双选管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的导师双选管理系统&#xff0c;采用M&#xff08;model&a…

软件测试需不需要懂代码?

无论是刚入测试行业的萌新&#xff0c;还是已经在测试行业闯荡了两三年的小司机们&#xff0c;都会琢磨一个问题&#xff1a;如果要持续发展下去&#xff0c;我要不要懂代码&#xff1f; 在软件测试初级阶段&#xff0c;不需要编程能力。但是任何一个职业&#xff0c;都会追求…

微服务之Nacos注册管理

文章目录 一、Nacos安装步骤1.安装地址2.安装版本3.目录说明4.端口配置5.启动 二、Nacos服务注册1.Nacos依赖2.客户端修改配置文件3.启动效果图4.总结 三、Nacos服务集群属性1.服务跨集群调用问题2.服务集群属性3.总结 四、Nacos根据集群负载均衡1.修改配置文件2.设置集群服务类…

一题都看不懂,大厂的面试是真的变态......

最近我的一个读者朋友去了字节面试&#xff0c;来给我发信息吐槽&#xff0c;说字节的面试太困难了&#xff0c;像他这种三年经验的测试员&#xff0c;在技术面&#xff0c;居然一题都答不上来&#xff0c;这要多高的水平才能有资格去面试字节的测试岗位。 确实&#xff0c;字…

浅析应急疏散照明设计在高层建筑中的应用

【摘要】作为工程设计人员&#xff0c;对高层建筑的应急照明设计应有足够的认识和重视&#xff0c;以保证在出现失火事件时&#xff0c;可以有效地引导建筑内的人员安全逃离、正确疏散&#xff0c;这是建筑设计的*大价值所在。在设计应急照明时&#xff0c;应根据当地的情况选择…

【操作系统】2009年408真题第 46 题

文章目录 题目描述1&#xff09;依次访问上述三个虚地址&#xff0c;各需多少时间&#xff1f;给出计算过程2&#xff09;基于上述访问序列&#xff0c;虚地址1565H的物理地址是多少&#xff1f;请说明理由 原题 & 官方题解 题目描述 46&#xff08;8分&#xff09;请求分…

LiveMeida视频接入网关

一、产品简介 视频接入网关主要部署在视频存储节点或视频汇聚节点&#xff0c;面向不同用户&#xff0c;主要用于对接不同厂家、不同型号的摄像机设备&#xff0c;获取摄像机视频后&#xff0c;以统一标准的视频格式和传输协议&#xff0c;将视频推送至上层联网/应用平台。可…

CS5523设计资料|替代LT9711方案|MIPI转LVDS方案|CS5523规格书

ASL CS5523是MIPI DSI输入、DP/e DP输出转换芯片。MIPI DSI最多支持4个通道&#xff0c;每个通道的最大运行速度为1.5Gps。对于DP 1.2输出&#xff0c;它由4个数据通道组成&#xff0c;支持1.62Gbps和2.7Gbps的链路速率。支持1.62Gbps和2.7Gbps的链路速率。它支持2560的最高分辨…