在抖音发现有一个大一新生求期末作业,顺手做了一下(C语言 学生考勤)

 

 这三个要求很简单

但是这个考核,要求课程结束后,自动完成考核要求有点模糊

#include <stdio.h>
#include <string.h>
#define MAX_STUDENTS 10
#define MAX_CLASSES 4
#define MAX_NAME_LENGTH 50typedef struct {char name[MAX_NAME_LENGTH];char gender[10];int studentID;int classID; // 班级IDint attendance; // 出勤次数
} Student;Student classes[MAX_CLASSES][MAX_STUDENTS];void loadStudents() {FILE *file = fopen("C:\\Users\\32761\\Desktop\\students.txt", "r");if (file == NULL) {// 如果文件不存在,创建一个空文件file = fopen("C:\\Users\\32761\\Desktop\\students.txt", "w");if (file == NULL) {perror("无法创建文件");return;}fclose(file);printf("文件不存在,已创建空文件。\n");return;}for (int i = 0; i < MAX_CLASSES; i++) {for (int j = 0; j < MAX_STUDENTS; j++) {// 使用宽度限定符防止缓冲区溢出if (fscanf(file, "%49s %9s %d %d %d", classes[i][j].name, classes[i][j].gender, &classes[i][j].studentID, &classes[i][j].classID, &classes[i][j].attendance) != 5) {// 遇到读取错误或文件结束,停止读取break;}}// 如果内层循环因为读取错误而跳出,则也应跳出外层循环if (feof(file)) {break;}}fclose(file);
}void saveStudents() {FILE *file = fopen("C:\\Users\\32761\\Desktop\\students.txt", "w");if (file == NULL) {perror("无法打开或创建文件");return;}for (int i = 0; i < MAX_CLASSES; i++) {for (int j = 0; j < MAX_STUDENTS; j++) {if (classes[i][j].studentID != 0) {fprintf(file, "%s %s %d %d %d\n", classes[i][j].name, classes[i][j].gender, classes[i][j].studentID, classes[i][j].classID, classes[i][j].attendance);}}}fclose(file);
}void addStudent() {int classID;printf("请输入班级ID(1-4):");scanf("%d", &classID);getchar(); // 清除输入缓冲区中的换行符if (classID < 1 || classID > MAX_CLASSES) {printf("无效的班级ID。\n");return;}for (int j = 0; j < MAX_STUDENTS; j++) {if (classes[classID - 1][j].studentID == 0) {printf("请输入学生姓名、性别、学号:");scanf("%s %s %d", classes[classID - 1][j].name, classes[classID - 1][j].gender, &classes[classID - 1][j].studentID);getchar(); // 清除输入缓冲区中的换行符classes[classID - 1][j].classID = classID;classes[classID - 1][j].attendance = 0;printf("学生添加成功!\n");saveStudents(); // 保存到文件return;}}printf("班级已满,无法添加更多学生。\n");
}void deleteStudentByID(int studentID) {for (int i = 0; i < MAX_CLASSES; i++) {for (int j = 0; j < MAX_STUDENTS; j++) {if (classes[i][j].studentID == studentID) {classes[i][j].studentID = 0; // 将学号设为0表示删除printf("学生删除成功!\n");saveStudents(); // 保存到文件return;}}}printf("未找到该学号的学生。\n");
}void modifyStudentByID(int studentID) {for (int i = 0; i < MAX_CLASSES; i++) {for (int j = 0; j < MAX_STUDENTS; j++) {if (classes[i][j].studentID == studentID) {printf("请输入新的学生姓名、性别、学号、班级ID:");scanf("%s %s %d %d", classes[i][j].name, classes[i][j].gender, &classes[i][j].studentID, &classes[i][j].classID);getchar(); // 清除输入缓冲区中的换行符printf("学生信息修改成功!\n");saveStudents(); // 保存到文件return;}}}printf("未找到该学号的学生。\n");
}void queryStudentByID(int studentID) {for (int i = 0; i < MAX_CLASSES; i++) {for (int j = 0; j < MAX_STUDENTS; j++) {if (classes[i][j].studentID == studentID) {printf("姓名: %s, 性别: %s, 学号: %d, 班级ID: %d, 出勤次数: %d\n",classes[i][j].name,classes[i][j].gender,classes[i][j].studentID,classes[i][j].classID,classes[i][j].attendance);return;}}}printf("未找到该学号的学生。\n");
}void recordAttendanceByID(int studentID) {for (int i = 0; i < MAX_CLASSES; i++) {for (int j = 0; j < MAX_STUDENTS; j++) {if (classes[i][j].studentID == studentID) {classes[i][j].attendance++;printf("考勤记录成功!\n");saveStudents(); // 保存到文件return;}}}printf("未找到该学号的学生。\n");
}void calculateScores() {FILE *file = fopen("C:\\Users\\32761\\Desktop\\scores.txt", "a");if (file == NULL) {printf("无法打开文件。\n");return;}for (int i = 0; i < MAX_CLASSES; i++) {for (int j = 0; j < MAX_STUDENTS; j++) {if (classes[i][j].studentID != 0) { // 只计算已存在的学生int score = classes[i][j].attendance * 10;printf("%s 的考核分数为:%d\n", classes[i][j].name, score);fprintf(file, "%s 的考核分数为:%d\n", classes[i][j].name, score);}}}fclose(file);
}void menu() {printf("学生考勤系统\n");printf("1. 添加学生\n");printf("2. 删除学生(通过学号)\n");printf("3. 修改学生信息(通过学号)\n");printf("4. 查询学生信息(通过学号)\n");printf("5. 记录考勤(通过学号)\n");printf("6. 查看考核分数\n");printf("7. 退出\n");
}int main() {loadStudents();int choice, studentID;while (1) {menu();printf("请选择操作:");scanf("%d", &choice);getchar(); // 清除输入缓冲区中的换行符switch (choice) {case 1:addStudent();break;case 2:printf("请输入学生学号:");scanf("%d", &studentID);getchar(); // 清除输入缓冲区中的换行符deleteStudentByID(studentID);break;case 3:printf("请输入学生学号:");scanf("%d", &studentID);getchar(); // 清除输入缓冲区中的换行符modifyStudentByID(studentID);break;case 4:printf("请输入学生学号:");scanf("%d", &studentID);getchar(); // 清除输入缓冲区中的换行符queryStudentByID(studentID);break;case 5:printf("请输入学生学号:");scanf("%d", &studentID);getchar(); // 清除输入缓冲区中的换行符recordAttendanceByID(studentID);break;case 6:calculateScores();break;case 7:saveStudents();printf("退出系统。\n");return 0;default:printf("无效的选择,请重试。\n");}}
}

  

 

 

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

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

相关文章

Python编程快速上手:让繁琐工作自动化(第2版)PDF免费下载

Python编程从入门到实践姊妹篇,零基础自学Python教程书籍,提供配套同步教学视频、在线编程环境!针对Python3.X版本更新适读人群 :本书适合任何想要通过Python学习编程的读者,尤其适合缺乏编程基础的初学者。通过阅读本书,读者将能利用非常强大的编程语言和工具,并且体会…

几页画作

时长由于自己过于菜而痛不欲生而产生画画灵感……时光花火,水月星辰

学业之船航海记录——软工篇

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13315这个作业的目标 软工课程总结学号 102201118引言 上回说道,我的学业之船已在大学的海洋上行驶了一半的航程,这期间也遇到一些危…

这是篇博客

博客:软件工程实践课程回顾与总结 一、学期回顾 1.1 回顾你对于软件工程课程的想象 在学期开始之前,我对软件工程课程的期望在于提升编程能力。我想通过这门课程,能够深入了解软件开发流程中的实际操作,能够自主或协作实现开发出软件产品。 我原以为软件工程会是一个手把手…

苦尽甘来

一、学期回顾 1.1 回顾对于软件工程课程的想象 软件工程(实践者的研究方法)是一门研究如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,并运用计算机科学理论和技术以及工程管理原则和方法,按预算和进度要求开发和维护满足用户要求的软件产品的学科‌。‌在…

【杂谈】Kafka的日志段为什么不用内存映射?

什么是内存映射(Memory-Mapped File)? 内存映射(mmap)是一种将文件内容映射到内存中的技术,应用程序可以像操作内存一样对文件内容进行读写,而不需要显式地进行磁盘 I/O 操作。修改的内容会自动由操作系统同步到磁盘。 内存映射需要读取磁盘文件吗? 需要。毕竟,内存中…

【WEB安全】利用shuji还原webpack打包源码

一、前言二、webpack简介三、怎么确定是webpack打包站点呢四、shuji(周氏)配置4.1 安装nodejs环境4.2 安装shuji工具4.3 .js.map文件存放位置4.4 运行shuji 反编译.js.map文件获取源码4.5 代码审计五、实战记录免责声明 本公众号所分享内容仅用于网络安全技术讨论,切勿用于违…

万兴PDF专家绿色便携版

点击上方蓝字关注我 前言 万兴PDF一款非常实用的国产软件,它就像是一个超级工具箱,里面装满了处理PDF文件的各种工具。你可以用它来新建PDF、修改PDF里的内容、把PDF转成其他格式,还能给PDF签名、压缩大小、合并多个PDF,甚至比较两个PDF文件的不同。 这款软件的中文版设计得…

2024 第一届Solar应急响应

Tw0队伍 writeup 一、简介 欢迎有更好的解题思路一起交流学习。最好能来点写自动化一把梭工具的代码思路,哈哈哈! 二、 解题情况三、CTF题 签到题目描述: 本题作为签到题,请给出邮服发件顺序。 Received: from mail.da4s8gag.com ([140.143.207.229]) by newxmmxszc6-1.qq.co…

Python深度学习(第2版)PDF免费下载

流行深度学习框架Keras之父执笔,涵盖Transformer架构等进展,文字生,简单方式解释复杂概念,不用一个数学公式,利用直觉自然入门深度学习适读人群 :想要学习深度学习的学生、职业开发者。 流行深度学习框架Keras之父执笔,涵盖Transformer架构等进展,文字生,简单方式解释…

尝试 vmware 16.0.0 过虚拟化 过xf虚拟机检测

前言最新想在vmware虚拟机上玩xf,网上找了不少教程,于是打算自己尝试下。 如果可以修改成功的话,其价值嘛不可估量。 环境 vmware版本是16.0.0,已安装VMware Tools vmware版本是16.1.2,已安装VMware Tools 虚拟镜像cn_windows_7_professional_with_sp1_vl_build_x64_dvd_u…

【OpenGL ES】GLSL基础语法

1 前言 ​ 本文将介绍 GLSL 中数据类型、数组、结构体、宏、运算符、向量运算、矩阵运算、函数、流程控制、精度限定符、变量限定符(in、out、inout)、函数参数限定符等内容,另外提供了一个 include 工具,方便多文件管理 glsl 代码,实现代码的精简、复用。 ​ Unity…