又写了一个大一新生的期末作业

 

 

#include <stdio.h>
#include <string.h>
#include <math.h>// 定义学生结构体
struct Student {char id[20];        // 学号char className[20]; // 班级char name[20];      // 姓名int startHour;      // 上机开始时间(小时)int startMinute;    // 上机开始时间(分钟)int endHour;        // 下机时间(小时)int endMinute;      // 下机时间(分钟)int isOnline;       // 是否在线double cost;        // 费用
};// 全局变量
struct Student students[30];
int studentCount = 0;
const int MAX_STUDENTS = 30;// 函数声明
void inputStudent();
void calculateCost(int index);
void searchStudent();
void displayComputerStatus();
double calculateTimeDifference(int startH, int startM, int endH, int endM);
void showMenu();
void saveToFile();
void loadFromFile();
void saveStudentInfo(const char* filename);
void loadStudentInfo(const char* filename);
void saveComputerLog(const char* filename);
void loadComputerLog(const char* filename);
void initializeDefaultStudents();// 定义文件名常量
#define STUDENT_FILE "student_info.txt"
#define COMPUTER_LOG "computer_log.txt"int main() {loadFromFile(); // 程序启动时加载数据int choice;while (1) {showMenu();printf("请输入您的选择: ");scanf("%d", &choice);switch (choice) {case 1:inputStudent();saveToFile(); // 添加学生后保存break;case 2: {int index;printf("请输入要结算的学生序号(0-%d): ", studentCount-1);scanf("%d", &index);calculateCost(index);saveToFile(); // 计算费用后保存break;}case 3:searchStudent();break;case 4:displayComputerStatus();break;case 0:saveToFile(); // 退出前保存printf("程序已退出!\n");return 0;default:printf("无效选择,请重试!\n");}}return 0;
}void showMenu() {printf("\n====== 机房收费管理系统 ======\n");printf("1. 输入学生信息\n");printf("2. 计算上机费用\n");printf("3. 查询学生信息\n");printf("4. 显示机器使用情况\n");printf("0. 退出系统\n");printf("===========================\n");
}void inputStudent() {if (studentCount >= MAX_STUDENTS) {printf("已达到最大学生数量!\n");return;}printf("请输入学生信息:\n");printf("学号: ");scanf("%s", students[studentCount].id);printf("班级: ");scanf("%s", students[studentCount].className);printf("姓名: ");scanf("%s", students[studentCount].name);printf("上机时间(时 分): ");scanf("%d %d", &students[studentCount].startHour, &students[studentCount].startMinute);students[studentCount].isOnline = 1;students[studentCount].cost = 0;studentCount++;printf("学生信息录入成功!\n");
}void calculateCost(int index) {if (index < 0 || index >= studentCount) {printf("无效的学生序号!\n");return;}if (!students[index].isOnline) {printf("该学生已经下机!\n");return;}printf("请输入下机时间(时 分): ");scanf("%d %d", &students[index].endHour, &students[index].endMinute);double hours = calculateTimeDifference(students[index].startHour,students[index].startMinute,students[index].endHour,students[index].endMinute);students[index].cost = ceil(hours) * 1.0;students[index].isOnline = 0;printf("费用计算完成!\n");printf("学生: %s\n", students[index].name);printf("上机时间: %.2f小时\n", hours);printf("费用: %.2f元\n", students[index].cost);
}double calculateTimeDifference(int startH, int startM, int endH, int endM) {int totalMinutes = (endH * 60 + endM) - (startH * 60 + startM);return totalMinutes / 60.0;
}void searchStudent() {printf("\n查询方式:\n");printf("1. 按班级查询\n");printf("2. 按学号查询\n");printf("3. 按姓名查询\n");int choice;char searchTerm[20];printf("请选择查询方式: ");scanf("%d", &choice);printf("请输入查询关键字: ");scanf("%s", searchTerm);printf("\n查询结果:\n");printf("%-10s%-10s%-10s%-15s%-15s\n", "学号", "班级", "姓名", "状态", "上机时间");for (int i = 0; i < studentCount; i++) {int match = 0;switch (choice) {case 1:match = (strcmp(students[i].className, searchTerm) == 0);break;case 2:match = (strcmp(students[i].id, searchTerm) == 0);break;case 3:match = (strcmp(students[i].name, searchTerm) == 0);break;}if (match) {printf("%-10s%-10s%-10s%-15s%02d:%02d\n",students[i].id,students[i].className,students[i].name,students[i].isOnline ? "在线" : "已下机",students[i].startHour,students[i].startMinute);}}
}void displayComputerStatus() {int online = 0;int offline = 0;for (int i = 0; i < studentCount; i++) {if (students[i].isOnline) {online++;} else {offline++;}}printf("\n机器使用情况统计:\n");printf("总学生数:%d\n", studentCount);printf("当前在线:%d\n", online);printf("已经下机:%d\n", offline);printf("\n使用情况图示:\n");printf("在线学生: ");for (int i = 0; i < online; i++) {printf("█");}printf(" (%d)\n", online);printf("离线学生: ");for (int i = 0; i < offline; i++) {printf("█");}printf(" (%d)\n", offline);
}// 添加保存到文件的函数
void saveToFile() {// 保存学生基本信息saveStudentInfo(STUDENT_FILE);// 保存上机记录saveComputerLog(COMPUTER_LOG);
}// 添加从文件加载的函数
void loadFromFile() {FILE *fp = fopen(STUDENT_FILE, "r");if (fp == NULL) {printf("首次运行,初始化30名学生信息...\n");initializeDefaultStudents();saveToFile(); // 保存初始化的数据return;}fclose(fp);// 加载学生基本信息loadStudentInfo(STUDENT_FILE);// 加载上机记录loadComputerLog(COMPUTER_LOG);
}// 保存学生基本信息(文本格式)
void saveStudentInfo(const char* filename) {FILE *fp = fopen(filename, "w");if (fp == NULL) {printf("无法打开文件 %s!\n", filename);return;}fprintf(fp, "学生总数: %d\n", studentCount);fprintf(fp, "学号\t班级\t姓名\t状态\t费用\n");for (int i = 0; i < studentCount; i++) {fprintf(fp, "%s\t%s\t%s\t%s\t%.2f\n",students[i].id,students[i].className,students[i].name,students[i].isOnline ? "在线" : "离线",students[i].cost);}fclose(fp);printf("学生基本信息已保存到 %s\n", filename);
}// 加载学生基本信息(文本格式)
void loadStudentInfo(const char* filename) {FILE *fp = fopen(filename, "r");if (fp == NULL) {printf("未找到文件 %s,将创建新文件。\n", filename);return;}char line[256];// 跳过前两行(标题行)fgets(line, sizeof(line), fp);fgets(line, sizeof(line), fp);studentCount = 0;while (fscanf(fp, "%s\t%s\t%s\t%s\t%lf\n",students[studentCount].id,students[studentCount].className,students[studentCount].name,line, // 临时存储状态&students[studentCount].cost) == 5) {students[studentCount].isOnline = (strcmp(line, "在线") == 0);studentCount++;if (studentCount >= MAX_STUDENTS) break;}fclose(fp);printf("已从 %s 加载 %d 条学生记录\n", filename, studentCount);
}// 保存上机记录(文本格式)
void saveComputerLog(const char* filename) {FILE *fp = fopen(filename, "w");if (fp == NULL) {printf("无法打开文件 %s!\n", filename);return;}fprintf(fp, "上机记录\n");fprintf(fp, "学号\t开始时间\t结束时间\t费用\n");for (int i = 0; i < studentCount; i++) {fprintf(fp, "%s\t%02d:%02d\t", students[i].id,students[i].startHour,students[i].startMinute);if (!students[i].isOnline) {fprintf(fp, "%02d:%02d\t%.2f\n",students[i].endHour,students[i].endMinute,students[i].cost);} else {fprintf(fp, "在线中\t0.00\n");}}fclose(fp);printf("上机记录已保存到 %s\n", filename);
}// 加载上机记录(文本格式)
void loadComputerLog(const char* filename) {FILE *fp = fopen(filename, "r");if (fp == NULL) {printf("未找到文件 %s,将创建新文件。\n", filename);return;}char line[256];// 跳过前两行(标题行)fgets(line, sizeof(line), fp);fgets(line, sizeof(line), fp);for (int i = 0; i < studentCount; i++) {char status[20];fscanf(fp, "%*s\t%d:%d\t%s",&students[i].startHour,&students[i].startMinute,status);if (strcmp(status, "在线中") == 0) {students[i].isOnline = 1;fscanf(fp, "%*f\n");} else {students[i].isOnline = 0;fscanf(fp, "%d:%d\t%lf\n",&students[i].endHour,&students[i].endMinute,&students[i].cost);}}fclose(fp);printf("已从 %s 加载上机记录\n", filename);
}// 添加初始化学生信息的函数
void initializeDefaultStudents() {// 预设的班级列表const char* classes[] = {"计算机1班", "计算机2班", "软件1班", "软件2班", "网络1班"};studentCount = 30;  // 设置为30名学生for (int i = 0; i < studentCount; i++) {// 生成学号 (例如: 2024001, 2024002, ...)sprintf(students[i].id, "2024%03d", i + 1);// 分配班级 (循环使用预设的班级)strcpy(students[i].className, classes[i % 5]);// 生成姓名 (例如: 学生1, 学生2, ...)sprintf(students[i].name, "学生%d", i + 1);// 设置上机时间 (8:00 到 17:00 之间随机分配)students[i].startHour = 8 + (i % 10);  // 8:00 到 17:00students[i].startMinute = (i * 2) % 60; // 0到58的偶数分钟// 初始状态都设为在线students[i].isOnline = 1;students[i].cost = 0.0;}printf("已初始化30名学生信息。\n");// 显示初始化的学生信息printf("\n初始化的学生信息如下:\n");printf("%-10s%-15s%-10s%-15s\n", "学号", "班级", "姓名", "上机时间");printf("----------------------------------------\n");for (int i = 0; i < studentCount; i++) {printf("%-10s%-15s%-10s%02d:%02d\n",students[i].id,students[i].className,students[i].name,students[i].startHour,students[i].startMinute);}printf("----------------------------------------\n");
} 

  

 

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

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

相关文章

word中自带插入公式,实现换行和对齐

word自带公式输入很是难用,尤其是不能在公式内回车换行。网上有方法说用(shift+回车)方法,亲测不可用。通过多方查找资料,终于找到如何实现word自带公式的换行和对齐的解决方法。先看看最终效果。首先,我们需要观测到word公式输入的模式,在插入公式操作中,公式工具左上…

INFINI Console 指标采集优化

前言 在 Easysearch / Elasticsearch / Opensearch 管理系统中,对于不同集群不同指标数据进行采集是一个常规任务。但是采集过程中不仅会对采集系统 CPU 和访问性能造成不少压力,也会对 Easysearch / Elasticsearch / Opensearch 集群造成资源消耗,从而影响集群本身的健康运…

费心劳神但又收获满满——软件工程个人总结作业

学期回顾 回顾对于软件工程课程的想象 在学期初时刚上软件工程这门课程时,问我本以为它和以前的专业课一样,以理论为主,并不会占用自己很多时间。但之后这个想法就改变了,我发现软件工程这门课程理论与实践紧密结合,有着各种任务,每个任务背景几乎是之前没有了解过的,需要…

终于结束啦!

一、学期回顾 1.1 回顾你对于软件工程课程的想象 这学期的软工课程,我一开始既充满了期待,也充满了不安。期待是因为这门课程能够让我实在地编写代码并开发项目,而不安同样也来自于此。我的代码能力并不强,我很害怕在这门课的作业中做不出能够通过的东西。不过这些问题都在…

2024-2025-1 20241406刘书含 第十四周学习总结

一、教材学习内容 (一)第十四章模拟、图形学、游戏以及其他应用 《计算机科学概论》第十四章主要探讨了模拟、图形学、游戏以及其他应用。以下是该章节的总结: 模拟: 模拟是计算的一个重要领域,它涉及为复杂系统构建计算机模型,并用模型进行实验以观察结果。模型是对真实…

再战博客园美化(九)

被拉回来赶工了我圆角没了,不过更烦的是里面的forFlow没有背景难受。 圆角改下顺序就好了。好吧不行,用了第一个!important forFlow背景待我去小窝吸一下配色。我测,最丑的一集。但是里面不错。 再去看看两位佬怎么做的 emm,看懂了,有卡片不弄forFlow,里面才弄forFlow。改…

Samba远端共享文件夹映射到本地硬盘

背景: Samba用于将远端Linux服务器的共享文件夹映射到本地磁盘,方便在windows环境下访问,同时可以在Linux环境下编译运行。 操作步骤 Ubantu侧: 1.安装Samba软件包 sudo apt-get install samba samba-common2.修改Samba配置文件,配置共享信息 sudo vim /etc/samba/smb.con…

C++关键字

C++关键字 static 类和结构体外的static被static修饰后只在内部发生链接,其作用域只在其所在的文件中。类和结构体内的staticstruct Entity {static int x, y; 静态成员变量static void Print(){std::cout << x << "," << y << std::endl;}…

时序图

时序图(Sequence Diagram)是显示对象之间交互的图,这些对象是按时间顺序排列的。顺序图中显示的是参与交互的对象及其对象之间消息交互的顺序。时序图中包括的建模元素主要有:对象(Actor)、生命线(Lifeline)、控制焦点(Focus of control)、消息(Message)等等。 时序…

数据结构复习

背诵 线性表前驱:后继表长:空表:首元结点:头结点:头指针线性表的结构特点,除了第一个和最后一个元素外,每个节点都只有一个前驱和后继。线性表的存储方式:栈与队列顺序栈链栈链队列栈与队列存储数据栈的应用:循环列表判队空、队满条件,串串是一段有限长的字符序列,由…

java期末总结第二章

2.java编程基础 1.标识符与命名规范 标识符是给Java中的类、方法、变量、包命名的符号: 只能由字母、数字、下划线、美元符号组成,并且不能以数字开头。 Java标识符大小写敏感,长度无限制 标识符不可以是Java关键字和保留字 2.变量的定义和赋值 变量赋值语法如下: int a, b…

轻舟已撞大冰山

一、关于软工 1.1 想象和目标 在软工这门课正式开课之前,我早已听闻其威名。大二那年,看到学长学姐们为了软工课日日夜夜地开会,我心中对这门课的印象便牢牢地刻上了“麻烦”、“恐怖”、“费劲”这些字眼。甚至开始怀疑,一个学分的实践课,真的值得如此? 作为一个“只会考…