当前位置: 首页 > article >正文

大一C语言课设:手把手教你用链表和文件操作实现网吧计费系统(附完整源码)

从零构建C语言网吧计费系统链表与文件操作的实战指南刚接触C语言课程设计时许多同学都会陷入知道语法却不知如何应用的困境。网吧计费系统这个经典课题恰好能让我们把课本上的结构体、指针、文件操作等知识点串联起来形成一个完整的应用。不同于单纯实现功能本文将带你从工程角度思考如何设计数据结构如何处理异常情况如何确保数据持久化这些才是课程设计真正要考察的核心能力。1. 系统架构设计与核心数据结构1.1 为什么选择链表存储在网吧计费场景中会员卡数量会动态变化——新卡注册、旧卡注销都是常态。相比数组链表这种动态数据结构能更灵活地管理内存。我们定义的核心结构体包含三个层次// 会员卡基础信息 struct Card { char cardNo[11]; // 卡号 char password[8]; // 密码 int status; // 0-未上机 1-上机中 2-已注销 float balance; // 余额 time_t registerTime;// 开卡时间 // ...其他字段 }; // 上机记录节点 struct OnlineNode { char cardNo[11]; time_t startTime; struct OnlineNode* next; }; // 全局链表头指针 struct Card* cardList NULL; struct OnlineNode* onlineList NULL;关键设计要点使用time_t类型存储时间戳便于后续计算时长密码字段限制8字符符合常见安全规范状态机设计status字段明确业务逻辑边界1.2 文件存储方案设计数据持久化是系统可靠性的关键。我们采用文本文件存储便于调试# cards.txt 存储格式 卡号\t密码\t状态\t余额\t注册时间戳\n 10001\t123456\t0\t50.0\t1654321000 10002\tabcdef\t1\t30.5\t1654321200 # online_records.txt 存储格式 卡号\t上机时间戳\n 10002\t1654321500注意文本文件虽然可读性好但在正式项目中建议考虑二进制存储校验机制防止数据篡改。2. 核心功能实现详解2.1 会员卡管理模块注册新卡的完整流程输入卡号和密码需校验格式检查卡号是否已存在初始化卡信息写入内存链表同步到文件void registerCard() { struct Card newCard; printf(输入卡号(10位数字): ); scanf(%10s, newCard.cardNo); // 卡号查重 if(findCard(cardList, newCard.cardNo) ! NULL) { printf(卡号已存在\n); return; } // 密码输入与校验 printf(输入密码(6-8位): ); scanf(%8s, newCard.password); // 初始化其他字段 newCard.status 0; newCard.registerTime time(NULL); printf(输入初始金额: ); scanf(%f, newCard.balance); // 插入链表 insertCard(cardList, newCard); // 文件存储 saveToFile(cards.txt, cardList); }常见陷阱未对用户输入做长度检查可能导致缓冲区溢出文件写入时未处理IO错误内存分配后未检查malloc返回值2.2 上机下机计时逻辑时间计算是计费系统的核心需要特别注意// 上机操作 void startSession(char* cardNo) { time_t now time(NULL); struct OnlineNode* node (struct OnlineNode*)malloc(sizeof(struct OnlineNode)); strcpy(node-cardNo, cardNo); node-startTime now; node-next onlineList; onlineList node; // 更新卡状态 struct Card* card findCard(cardList, cardNo); card-status 1; } // 下机计费计算 float endSession(char* cardNo) { struct OnlineNode* node findOnlineNode(cardNo); if(node NULL) return -1; time_t now time(NULL); float duration difftime(now, node-startTime); // 秒数 float cost duration * PRICE_PER_SECOND; // 更新卡余额 struct Card* card findCard(cardList, cardNo); card-balance - cost; card-status 0; // 从在线链表移除 removeOnlineNode(cardNo); return cost; }关键点使用difftime()计算时间差比直接相减更可靠可避免平台兼容性问题。3. 异常处理与调试技巧3.1 内存管理黄金法则链表操作中最容易发生内存泄漏必须遵循每个malloc()必须对应一个free()修改链表指针时保持操作的原子性使用valgrind工具定期检查内存问题典型错误示例// 错误的删除节点方式 void deleteCard(char* cardNo) { struct Card* prev NULL; struct Card* curr cardList; while(curr ! NULL) { if(strcmp(curr-cardNo, cardNo) 0) { if(prev NULL) { cardList curr-next; // 可能丢失链表 } else { prev-next curr-next; } // 忘记free(curr)! return; } prev curr; curr curr-next; } }3.2 文件操作防错处理文件IO是另一个故障高发点建议采用防御式编程void saveToFile(const char* filename, struct Card* list) { FILE* fp fopen(filename, w); if(fp NULL) { perror(文件打开失败); return; } struct Card* curr list; while(curr ! NULL) { if(fprintf(fp, %s\t%s\t%d\t%.2f\t%ld\n, curr-cardNo, curr-password, curr-status, curr-balance, curr-registerTime) 0) { perror(写入失败); break; } curr curr-next; } if(fclose(fp) ! 0) { perror(文件关闭异常); } }4. 功能扩展与优化方向4.1 多线程安全改造基础版本是单线程的实际网吧场景需要并发控制#include pthread.h pthread_mutex_t card_mutex PTHREAD_MUTEX_INITIALIZER; void threadSafeRegister() { pthread_mutex_lock(card_mutex); // 临界区操作 registerCard(); pthread_mutex_unlock(card_mutex); }4.2 数据统计分析功能增加营业统计功能展示如何从文件数据生成报表void generateDailyReport(time_t date) { int activeCards 0; float totalIncome 0.0; // 解析下机记录文件 FILE* fp fopen(sessions.txt, r); if(fp) { char line[256]; while(fgets(line, sizeof(line), fp)) { char cardNo[11]; time_t start, end; sscanf(line, %10s\t%ld\t%ld, cardNo, start, end); // 检查是否在查询日期 if(isSameDay(start, date)) { float cost difftime(end, start) * PRICE_PER_SECOND; totalIncome cost; activeCards; } } fclose(fp); } printf(日期: %s\n, formatTime(date)); printf(活跃卡数: %d\n, activeCards); printf(总收入: %.2f元\n, totalIncome); }4.3 可视化界面集成虽然C语言不是UI开发的首选但可以简单集成NCurses库#include ncurses.h void showCardInfo(struct Card* card) { initscr(); printw( 会员卡信息 \n); printw(卡号: %s\n, card-cardNo); printw(余额: %.2f元\n, card-balance); printw(状态: %s\n, card-status 0 ? 未上机 : card-status 1 ? 上机中 : 已注销); refresh(); getch(); endscr(); }在开发过程中我深刻体会到良好的数据结构设计比编码更重要。初期我曾因没有合理规划结构体字段导致后期频繁修改代码。另一个教训是文件操作一定要立即检查返回值否则数据丢失时很难定位问题。建议在测试时故意制造错误如磁盘写保护验证系统的健壮性。

相关文章:

大一C语言课设:手把手教你用链表和文件操作实现网吧计费系统(附完整源码)

从零构建C语言网吧计费系统:链表与文件操作的实战指南 刚接触C语言课程设计时,许多同学都会陷入"知道语法却不知如何应用"的困境。网吧计费系统这个经典课题,恰好能让我们把课本上的结构体、指针、文件操作等知识点串联起来&#x…...

如何用 JavaScript 实现 Kubernetes 资源伸缩:自动扩缩容实战

如何用 JavaScript 实现 Kubernetes 资源伸缩:自动扩缩容实战 【免费下载链接】javascript JavaScript client 项目地址: https://gitcode.com/gh_mirrors/javascri/javascript Kubernetes 作为容器编排平台的佼佼者,其资源伸缩能力是保障应用稳定…...

TUIOS磁带录制与自动化:终极指南——如何轻松录制和重放终端工作流程

TUIOS磁带录制与自动化:终极指南——如何轻松录制和重放终端工作流程 【免费下载链接】tuios Terminal UI OS (Terminal Multiplexer) 项目地址: https://gitcode.com/gh_mirrors/tu/tuios TUIOS(Terminal UI OS)是一款强大的终端复用…...

嵌入式C语言与轻量大模型适配终极 checklist:12项硬性约束、5类编译器特异性陷阱、1次烧录即生效方案

第一章:嵌入式C语言与轻量级大模型适配如何实现快速接入在资源受限的嵌入式设备(如 Cortex-M4/M7、RISC-V MCU)上运行大语言模型,关键在于将模型推理能力以最小开销融入 C 语言生态。这并非简单移植 Python 推理框架,而…...

WeDLM-7B-Base精彩案例分享:从‘春天来了’到百字散文的完整生成过程

WeDLM-7B-Base精彩案例分享:从"春天来了"到百字散文的完整生成过程 1. 模型简介 WeDLM-7B-Base是一款基于扩散机制(Diffusion)的高性能基座语言模型,拥有70亿参数。它采用创新的并行解码技术,在标准因果注…...

Wooey任务调度与监控:实时跟踪Python脚本执行状态

Wooey任务调度与监控:实时跟踪Python脚本执行状态 【免费下载链接】Wooey A Django app that creates automatic web UIs for Python scripts. 项目地址: https://gitcode.com/gh_mirrors/wo/Wooey Wooey是一个基于Django的应用程序,能够为Python…...

Phi-3.5-mini-instruct作品分享:多轮长对话中角色一致性保持效果实测

Phi-3.5-mini-instruct作品分享:多轮长对话中角色一致性保持效果实测 1. 引言:为什么关注角色一致性 在当今AI对话系统中,角色一致性(Character Consistency)是衡量模型智能水平的重要指标。想象一下,当你…...

崩坏星穹铁道自动化助手:三月七小助手完全指南

崩坏星穹铁道自动化助手:三月七小助手完全指南 【免费下载链接】March7thAssistant 崩坏:星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 你是否厌倦了每天重复的清体力、领奖励、做日常&#xff1…...

如何用Mithril.js快速集成GPS与地图服务:完整指南

如何用Mithril.js快速集成GPS与地图服务:完整指南 【免费下载链接】mithril.js A JavaScript Framework for Building Brilliant Applications 项目地址: https://gitcode.com/gh_mirrors/mi/mithril.js Mithril.js是一款轻量级JavaScript框架,专…...

JS Search 部署策略:从开发到生产环境的完整配置方案

JS Search 部署策略:从开发到生产环境的完整配置方案 【免费下载链接】js-search JS Search is an efficient, client-side search library for JavaScript and JSON objects 项目地址: https://gitcode.com/gh_mirrors/js/js-search JS Search 是一款高效的…...

Flux2-Klein-9B-True-V2快速部署:单卡RTX 4090 D运行FP8Mixed模型

Flux2-Klein-9B-True-V2快速部署:单卡RTX 4090 D运行FP8Mixed模型 1. 项目概述 Flux2-Klein-9B-True-V2是基于官方FLUX.2 [klein] 9B改进的文生图/图生图模型,专为图像生成和编辑任务优化。这个版本特别针对RTX 4090 D显卡进行了性能优化,采…...

终极指南:Vagas社区生态如何与其他技术招聘平台协同发展

终极指南:Vagas社区生态如何与其他技术招聘平台协同发展 【免费下载链接】vagas :microscope: Espao para divulgao de vagas para front-enders. 项目地址: https://gitcode.com/gh_mirrors/va/vagas Vagas是一个专注于前端开发者的招聘信息分享平台&#x…...

终极指南:3步免费解锁网易云音乐NCM加密,快速转换通用MP3格式

终极指南:3步免费解锁网易云音乐NCM加密,快速转换通用MP3格式 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否下载了心爱的网易云音乐,却发现在其他播放器上无法聆听?&#x1f3…...

MediaPipe TouchDesigner插件完整方案:快速解决摄像头输入与性能优化

MediaPipe TouchDesigner插件完整方案:快速解决摄像头输入与性能优化 【免费下载链接】mediapipe-touchdesigner GPU Accelerated MediaPipe Plugin for TouchDesigner 项目地址: https://gitcode.com/gh_mirrors/me/mediapipe-touchdesigner MediaPipe Touc…...

如何用cheatsheets-ai实现GPU加速:CUDA使用终极指南

如何用cheatsheets-ai实现GPU加速:CUDA使用终极指南 【免费下载链接】cheatsheets-ai Essential Cheat Sheets for deep learning and machine learning researchers https://medium.com/kailashahirwar/essential-cheat-sheets-for-machine-learning-and-deep-lear…...

3MF格式转换难题?Blender3mfFormat插件5步解决你的3D打印烦恼

3MF格式转换难题?Blender3mfFormat插件5步解决你的3D打印烦恼 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 还在为Blender与3D打印机之间的格式兼容性头疼吗…...

华硕笔记本性能优化终极指南:用G-Helper告别卡顿,释放全部潜能![特殊字符]

华硕笔记本性能优化终极指南:用G-Helper告别卡顿,释放全部潜能!🔥 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB li…...

OnLogic CL260工业级无风扇迷你主机解析与应用

1. OnLogic CL260工业级无风扇迷你主机深度解析在工业自动化和边缘计算领域,设备需要满足严苛的环境要求,同时保持稳定可靠的性能。OnLogic CL260就是这样一款专为工业场景设计的无风扇迷你主机,搭载Intel Twin Lake系列处理器,集…...

DLSS Swapper终极指南:免费工具轻松管理游戏DLSS版本,提升性能体验!

DLSS Swapper终极指南:免费工具轻松管理游戏DLSS版本,提升性能体验! 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你想在游戏中获得更好的DLSS性能吗?DLSS Swapper是一…...

Google chrome拦截某些下载内容

现在越来越多的单位和个人都开始使用Google chrome了,本人也觉得chrome浏览器很好用,页面加载速度极快,能快速呈现网页内容,提升浏览效率。扩展程序丰富,涵盖办公、学习、娱乐、开发等众多领域,可满足各种个…...

智慧树刷课插件终极指南:5分钟实现自动化学习,效率提升200%

智慧树刷课插件终极指南:5分钟实现自动化学习,效率提升200% 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线…...

第53篇:AI在金融风控中的实战——反欺诈、信用评分与自动化决策(项目实战)

文章目录项目背景技术选型架构设计核心实现1. 图神经网络(GNN)反欺诈实战2. 信用评分模型与自动化决策踩坑记录效果对比项目背景 在金融行业摸爬滚打多年,我见过太多因为风控模型“翻车”而导致的惨痛教训。一次,我们上线了一个新…...

6、通过husky规范commit提交信息

团队项目中可以从你的commit记录看到你的动作信息,规范提交必须按照如下格式(避免有人出现这样的提交 git commit -m “update”) feat:新功能(featuer) fix: 修补bug docs: 文档(do…...

第52篇:AI内容营销全攻略——从爆款文案到个性化推荐,引爆流量与转化(操作教程)

文章目录前言环境准备:搭建你的AI营销工具箱分步操作:四步构建AI内容营销闭环第一步:用AI批量生成爆款内容草稿第二步:数据驱动的标题与内容优化第三步:构建用户画像与内容标签体系第四步:实现简易个性化内…...

Transformer实战(28)——使用 LoRA 高效微调 FLAN-T5

Transformer实战(28)——使用 LoRA 高效微调 FLAN-T5 0. 前言 1. LoRA 2. SNLI 数据集 3. 使用 LoRA 高效微调 FLAN-T5 3.1 指令格式 3.2 模型选择 4. 使用 QLoRA 进行微调 小结 系列链接 0. 前言 我们已经学习了参数高效微调 (Parameter Efficient Fine-Tuning, PEFT) 的基…...

如何高效限制ACE-Guard进程资源占用:sguard_limit完整使用指南

如何高效限制ACE-Guard进程资源占用:sguard_limit完整使用指南 【免费下载链接】sguard_limit 限制ACE-Guard Client EXE占用系统资源,支持各种腾讯游戏 项目地址: https://gitcode.com/gh_mirrors/sg/sguard_limit 想要在玩腾讯游戏时获得更流畅…...

Transformer实战(31)——解释Transformer模型决策

Transformer实战(31)——解释Transformer模型决策 0. 前言 1. 解释模型决策 2. 使用 LIME 解释 Transformer 模型决策 3. 使用 SHAP 解释 Transformer 模型决策 小结 系列链接 0. 前言 随着大语言模型 (Large Language Model, LLM) 的广泛应用,模型输出的准确性与可解释性之…...

WebPlotDigitizer完整指南:3步从任何图表图像中提取精准数据

WebPlotDigitizer完整指南:3步从任何图表图像中提取精准数据 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/we/WebPlotDigitizer 还在为无法从论…...

Transformer实战(27)——参数高效微调(Parameter Efficient Fine-Tuning,PEFT)

Transformer实战(27)——参数高效微调(Parameter Efficient Fine-Tuning,PEFT) 0. 前言 1. 参数高效微调 2. 参数高效微调方法分类 2.1 加性方法 2.2 选择性方法 2.3 低秩微调 3. 实现参数高效微调 小结 系列链接 0. 前言 微调已经成为人工智能领域中一种流行的建模范式,…...

2026工程基建与零基础跑通篇:YOLO26自定义数据加载器(DataLoader)重写:突破IO瓶颈的生产级方案

写在前面:当GPU不再是最慢的一环 做深度学习的人都知道一句老话:“GPU太慢了,等新卡。”但当你在2026年真正投身生产级YOLO项目时,你会发现一个令人崩溃的事实——GPU根本不是瓶颈,硬盘和Python才是。 记不记得那个场景:你花了大价钱组了一台8卡A100服务器,打开nvidia…...