C语言课程设计题目
- 题目一:职工信息管理系统设计
- 题目二:图书信息管理系统设计
- 题目三:图书管理系统设计
- 题目四:实验设备管理系统设计
- 题目五:西文下拉菜单的设计
- 题目六:学生信息管理系统设计
- 题目七:学生成绩管理系统设计
- 题目八:学生选修课程系统设计
- 题目九:学生成绩记录簿设计
- 题目十:学生籍贯信息记录簿设计
- 题目十一:学生通讯录管理系统设计
- 题目十二:职工工作量统计系统设计
- 题目十三:销售管理系统设计
- 题目十四:成绩管理系统设计
- 题目十五:通信录管理系统设计
- 题目十六:学生管理系统设计
- 题目十七:单项选择题标准化考试系统设计
- 题目十八:设计一个简单计算器
- 题目十九:编写一万年历系统
- 题目二十:模拟时钟转动程序
- 题目二十一:完整的学生成绩管理系统
- 题目二十二:数字加一游戏
- 题目二十三:基于C++聊天机器人
- 题目二十四:基于C++的音乐小天才
- 题目一代码
- 题目二代码
序号 | 系统设计题目 | 链接 |
---|---|---|
1 | 职工信息管理系统设计 | 链接 |
2 | 图书信息管理系统设计 | 链接 |
3 | 图书管理系统设计 | 链接 |
4 | 实验设备管理系统设计 | 链接 |
5 | 西文下拉菜单的设计 | 链接 |
6 | 学生信息管理系统设计 | 链接 |
7 | 学生成绩管理系统设计 | 链接 |
8 | 学生选修课程系统设计 | 课程管理系统 |
9 | 学生成绩记录簿设计 | 链接 |
10 | 学生籍贯信息记录簿设计 | 链接 |
11 | 学生通讯录管理系统设计 | 链接 |
12 | 职工工作量统计系统设计 | 链接 |
13 | 销售管理系统设计 | 链接 |
14 | 成绩管理系统设计 | 链接 |
15 | 通信录管理系统设计 | 链接 |
16 | 学生管理系统设计 | 链接 |
17 | 单项选择题标准化考试系统设计 | 链接 |
18 | 设计一个简单计算器 | 链接 |
19 | 编写一万年历系统 | 链接 |
20 | 模拟时钟转动程序 | 链接 |
21 | 完整的学生成绩管理系统 | 链接 |
22 | 数字加一游戏 | 链接 |
23 | 聊天机器人 | 链接 |
24 | 音乐小天才 | 链接 |
一、设计要求与设计报告
设计要求
- 任意选定以下一个题目完成
- 模块化程序设计,建立项目工程
- 锯齿型(缩进)程序书写格式
- 必须上机调试通过
设计报告格式
- 设计任务和要求
- 总体设计(程序设计组成框图、流程图)
- 详细设计(模块功能说明(如函数功能、入口及出口参数说明,函数调用关系描述等)
- 调试与测试:调试方法,测试结果的分析与讨论,测试过程中遇到的主要问题及采取的解决措施
- 源程序工程包和执行结果:清单中应有足够的注释(另行打包)
二、检查要求
- 每个人必须有程序运行结果
- 每个人必须交《C语言课程设计报告》和设计程序工程包
- 课程设计任务必须由个人独立完成,禁止相互抄袭,如有发现,严肃处理
三、打分标准
- 根据平时上机考勤;注重平时上机成绩,教师要不定期检查学生进度,学生不得以自己有私人电脑为借口而不来上机(30%)
- 根据程序运行结果(50%),学生能熟练地演示自己的项目,对自己的程序面对教师提问并能熟练地解释清楚。
- 根据《C语言课程设计报告》要求完成项目报告(20%)。
- 以上三项缺一不可。由于课程设计各题目的难度不一,所以成绩的评定将根据各人完成题目的难度和完成情况的不同,分别评定成绩,如未能完成任何题目,则以不及格计算。
四、提交时间
课程设计任务完成时间为 18周 结束,届时上交课程设计报告和程序。学习委员于 18周前收齐报告纸质版、项目包和报告电子版各一份,按时提交。
五、选题要求
选择每个题目不能超过 3人,每人要独立完成,不能互相抄袭。
题目列表
题目一:职工信息管理系统设计
职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不重复)。
设计职工信息管理系统,功能包括:
- 系统以菜单方式工作。
- 职工信息录入功能(职工信息用文件保存)--输入。
- 职工信息浏览功能--输出。
- 职工信息查询功能--算法。
- 按学历查询等。
- 按职工号查询等。
- 职工信息删除、修改功能(可选项)。
题目二:图书信息管理系统设计
图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。
设计图书信息管理系统,功能包括:
- 系统以菜单方式工作。
- 图书信息录入功能(图书信息用文件保存)--输入。
- 图书信息浏览功能--输出。
- 图书信息查询功能--算法。
查询方式- 按书名查询。
- 按作者名查询。
- 图书信息的删除与修改(可选项)。
题目三:图书管理系统设计
图书管理信息包括:图书名称、图书编号、单价、作者、存在状态、借书人姓名、性别、学号等。
主要功能:
- 新进图书基本信息的输入。
- 图书基本信息的查询。
- 对撤销图书信息的删除。
- 为借书人办理注册。
- 办理借书手续。
- 办理还书手续
要求: 使用二进制文件方式存储数据,系统以菜单方式工作。
题目四:实验设备管理系统设计
实验设备信息包括:设备编号,设备种类(如:微机、打印机、扫描仪等等),设备名称,设备价格,设备购入日期,是否报废,报废日期等。
主要功能:
- 能够完成对设备的录入和修改。
- 对设备进行分类统计。
- 设备的破损耗费和遗损处理。
- 设备的查询。
要求: 采用二进制文件方式存储数据,系统以菜单方式工作。
题目五:西文下拉菜单的设计
主要功能:
- 完成一个类似 DevC++集成系统下拉菜单的设计。
- 不要求实现各子菜单的功能。
要求: 可以通过光标键的移动来选择不同的菜单项,被选择的菜单项反相显示,当选定某个菜单项后,按回车键可以实现一个简单的动作。
题目六:学生信息管理系统设计
学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。设计学生信息管理系统,功能包括:
- 系统以菜单方式工作。
- 学生信息录入功能(学生信息用文件保存)--输入。
- 学生信息浏览功能--输出。
- 学生信息查询功能--算法。
查询方式- 按学号查询
- 按姓名查询
- 学生信息的删除与修改(可选项)。
题目七:学生成绩管理系统设计
学生成绩信息包括:学期,学号,班别,姓名,四门课程成绩(语文、数学、英语和计算机)等。
主要功能:
- 能按学期、按班级完成对学生成绩的录入、修改。
- 能按班级统计学生的成绩,求学生的总分及平均分。
- 能查询学生成绩,不及格科目及学生名单。
- 能按班级输出学生的成绩单。
要求: 使用二进制文件方式存储数据,系统以菜单方式工作。
题目八:学生选修课程系统设计
假定有 n门课程,每门课程有:课程编号,课程名称,课程性质(公共课、必修课、选修课),总学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。设计选修课程系统,功能包括:
- 系统以菜单方式工作。
- 课程信息录入功能(课程信息用文件保存)--输入。
- 课程信息浏览功能--输出。
- 课程信息查询功能--算法。
查询方式- 按学分查询。
- 按课程性质查询。
- 学生选修课程(可选项)。
题目九:学生成绩记录簿设计
编制一个C语言成绩记录簿,每个学生信息包括:学号、姓名、C语言成绩。具体功能:
- 创建信息链表并以磁盘文件保存。
- 读取磁盘文件并显示输出所有学生的成绩。
- 按学号或姓名查询成绩。
- 添加成绩记录。
- 修改指定姓名或学号的学生的成绩并可存盘。
- 显示输出60分以下、60~79、80~89、90分以上各分数段的学生信息(可选项)。
题目十:学生籍贯信息记录簿设计
编制一个学生籍贯信息记录簿,每个学生信息包括:学号、姓名、籍贯。具体功能:
- 创建信息链表并以磁盘文件保存。
- 读取磁盘文件并显示输出所有学生的籍贯信息。
- 按学号或姓名查询其籍贯。
- 按籍贯查询并输出该籍贯的所有学生。
- 能添加、删除和修改学生的籍贯信息(可选项)。
题目十一:学生通讯录管理系统设计
设计一个学生通信录,学生通迅录数据信息构成内容可自行设计(如:姓名、家庭地址、邮政编码、电话号码等等),通信录数据类型定义为结构体类型。
主要功能:
- 能建立、修改和增删学生通讯录。
- 能够按多种方式进行查询。
要求: 界面友好,易于操作,采用二进制文件存储数据。
题目十二:职工工作量统计系统设计
编写一个程序,该程序输入职工工号和完成的产品数量,程序允许同一职工有多次输入,由程序对其完成的产品数量实现累计。程序按完成数量对他们排序,并确定他们的名次。按完成的产品数量由多到少的顺序,输出名次、同一名次的职工人数及他们的工号(工号由小到大顺序输出)。要求程序用有序链表存储数据信息。
题目十三:销售管理系统设计
某公司有四个销售员(编号:1~4),负责销售五种产品(编号:1~5)。每个销售员都将当天出售的每种产品各写一张便条交上来。每张便条包含内容:(1)销售员的代号;(2)产品的代号;(3)这种产品的当天的销售额。每位销售员每天上缴1张便条。
设计便条管理系统,功能包括:
- 系统以菜单方式工作。
- 便条信息录入功能(便条信息用文件保存)--输入。
- 收集到了上个月的所有便条后,读取销售情况。
- (1)计算每个人每种产品的销售额。
- (2)按销售额对销售员进行排序,输出排序结果(销售员代号)。
- (3)统计每种产品的总销售额,对这些产品按从高到底的顺序,输出排序结果(需输出产品的代号和销售额)(可选项)。
题目十四:成绩管理系统设计
现有学生成绩信息,内容如下
姓名 | 学号 | 语文 | 数学 | 英语 |
---|---|---|---|---|
张明明 | 01 | 67 | 78 | 82 |
李成友 | 02 | 78 | 91 | 88 |
张辉灿 | 03 | 68 | 82 | 56 |
王露 | 04 | 56 | 45 | 77 |
陈东明 | 05 | 67 | 38 | 47 |
… |
用C/C++编写一系统,实现学生信息管理,软件的入口界面应包括如下几个方面:
(一)功能要求:
- 信息维护:
- 要求:学生信息数据要以文件的形式保存,能实现学生信息数据的维护。此模块包括子模块有:增加学生信息、删除学生信息、修改学生信息
- 信息查询:
- 要求:查询时可实现按姓名查询、按学号查询
- 成绩统计:
- 要求:A输入任意的一个课程名(如数学)和一个分数段(如60–70),统计出在此分数段的学生情况。
(二)其它要求:
- 只能使用 C/C++语言,源程序要有适当的注释,使程序容易阅读
- 至少采用文本菜单界面(如果能采用图形菜单界面更好)
- 学生可自动增加新功能模块(视情况可另外加分)
- 写出课程设计报告,具体要求见相关说明文档
题目十五:通信录管理系统设计
用C/C++设计出模拟手机通信录管理系统,实现对手机中的通信录进行管理。
(一)功能要求
- 查看功能:选择此功能时,列出下列3类选择。
- A办公类
- B个人类
- C商务类
当选中某类时,显示出此类所有数据中的姓名和电话号码
- 增加功能:能录入新数据(一个结点包括:姓名、电话号码、分类(可选项有:A 办公类 B 个人类 C 商务类)、电子邮件)。例如
杨春 | 13589664454 | 商务类 | [email protected] |
---|
当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通信录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。
- 拔号功能:能显示出通信录中所有人的姓名,当选中某个姓名时,屏幕上模拟打字机的效果依次显示出此人的电话号码中的各个数字,并伴随相应的拔号声音。
- 修改功能:选中某个人的姓名时,可对此人的相应数据进行修改
- 删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。
(二)其它要求:
- 只能使用 C/C++语言,源程序要有适当的注释,使程序容易阅读
- 至少采用文本菜单界面(如果能采用图形菜单界面更好)
- 建议使用结构和链表等数据结构
- 学生可自动增加新功能模块(视情况可另外加分)
- 写出课程设计报告,具体要求见相关说明文档
题目十六:学生管理系统设计
使用提供的数据,设计一个学籍管理系统,实现基本功能。
学生基本信息文件(A.TXT)内容:A.TXT 文件不需要编程录入数据,可用文本编辑工具直接生成。
学号 | 姓名 | 性别 | 宿舍号码 | 电话号码 |
---|---|---|---|---|
01 | 张成成 | 男 | 501 | 87732111 |
02 | 李成华 | 女 | 101 | 87723112 |
03 | 王成凤 | 女 | 101 | 87723112 |
04 | 张明明 | 男 | 502 | 87734333 |
05 | 陈东 | 男 | 501 | 87732111 |
06 | 李果 | 男 | 502 | 87734333 |
07 | 张园园 | 女 | 102 | 87756122 |
… |
学生成绩基本信息文件(B.TXT)内容:
学号 | 课程编号 | 课程名称 | 学分 | 平时成绩 | 实验成绩 | 卷面成绩 | 综合成绩 | 实得学分 |
---|---|---|---|---|---|---|---|---|
01 | A01 | 大学物理 | 3 | 66 | 78 | 82 | ||
02 | B03 | 高等数学 | 4 | 78 | -1 | 90 | ||
01 | B03 | 高等数学 | 4 | 45 | -1 | 88 | ||
02 | C01 | VF | 3 | 65 | 76 | 66 | ||
… |
(一)功能要求及说明:
- 数据录入功能:
对B.TXT进行数据录入,录入学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩,综合成绩和实得学分由程序根据条件自动计算。
- (1)综合成绩计算规则:
- 如果实验成绩为-1,表示无实验,则:综合成绩 = 平时成绩 * 30% + 卷面成绩 * 70%
- 如果实验成绩不为-1,则:综合成绩 = 平时成绩 * 15% + 实验成绩 * 15% + 卷面成绩 * 70%
- (2)实得学分的计算:采用等级学分制。
- 综合成在90-100之间,实得学分 = 学分 * 100%
- 综合成在80-90之间,实得学分 = 学分 * 80%
- 综合成在70-80之间,实得学分 = 学分 * 75%
- 综合成在60-70之间,实得学分 = 学分 * 60%
- 综合成在60以下,实得学分 = 学分 * 0%
- 查询功能:分为学生基本情况查询和成绩查询。
- A:学生基本情况查询:
A1----输入一个学号或姓名(可实现选择),查出此生的基本信息并显示输出。
A2—输入一个宿舍号码,可查询出本室所有的学生的基本信息并显示输出。 - B:成绩查询:
B1:输入一个学号时,查询出此生的所有课程情况,格式如下:
学 号:xx | 姓 名:xxxxx | ||
---|---|---|---|
课程编号:xxx | 课程名称:xxxxx | 综合成绩:xxxx | 实得学分: xx |
课程编号:xxx | 课程名称:xxxxx | 综合成绩:xxxx | 实得学分: xx |
课程编号:xxx | 课程名称:xxxxx | 综合成绩:xxxx | 实得学分: xx |
…… | |||
共修:xx 科,实得总学分为: xxx |
-
删除功能:
在A.TXT中删除一个学生时,B.TXT中该生所有信息也应自动删除。 -
排序功能:
按综合成绩或实得学分升序或降序排序并显示数据。
(二)其它要求:
1.只能使用 C/C++语言,源程序要有适当的注释,使程序容易阅读。
2.至少采用文本菜单界面(如果能采用图形菜单界面更好)。
3.学生可自动增加新功能模块(视情况可另外加分)。
4.写出课程设计报告,具体要求见相关说明文档。
题目十七:单项选择题标准化考试系统设计
功能要求:
- 使用文件保存试题库,每个试题包括题干、4个备选答案、标准答案。
- 实现试题录入功能,随时增加试题至试题库。
- 实现试题抽取功能,随机抽取N道题进行考试,N由键盘输入。
- 实现答题功能,用户输入答案。
- 实现自动判卷功能,根据用户答案与标准答案对比给出成绩。
其它要求:
- 使用C/C++语言,源程序应有适当注释。
- 至少采用文本菜单界面。
- 学生可自行增加新功能模块。
- 编写课程设计报告。
题目十八:设计一个简单计算器
要求: 功能上尽量模拟Windows操作系统中的计算器,界面设计不做强制要求。
题目十九:编写一万年历系统
要求: 模仿现实中的挂历,显示当前月的每一天及星期几,当系统日期变为下一个月时,自动翻页到下一个月。
题目二十:模拟时钟转动程序
要求: 能模拟机械钟表行走,同时准确显示日期和时间,屏幕上显示一个动态时钟,按下任意键时程序退出。
题目二十一:完整的学生成绩管理系统
(1)系统功能:
- 建立数据库文件数据结构,输入学生成绩数据,并以文件方式存盘。
- 对已建立文件进行修改,包括:增加课程、修改课程名、追加记录。
- 根据某一门课程成绩进行排序。
- 显示数据库文件信息。
(2)模块层次及功能:
系统的模块级功能如图,可以自行增加其他功能。
题目二十二:数字加一游戏
游戏功能:
数字加 1 是一款玩法非常简单的益智小游戏,在一个 5×5 的表格中,随机产生不大于 6 的数字。只要点击某一个数字让它加 1,并与相邻的二个以上的数字相同,这些数字就会合成 1 个加 1 的数字。
游戏规则:
游戏开始时,在一个 5*5 的表格中随机填入 1-6 的数字,初始表格中不能有3 个及以上相同数字的连通块,每个格子的颜色由格子填充的数字决定。 当鼠标点击表格中某数字时其值自动加一;然后判断与该数字相连是否存在数字连通块,若存在就消弭使当前位置数字加 1,连通块中的其它数字变为空缺。空缺由上方的数字自动下落填补,上方掉落后的空缺随机填充 1-6 的数字。重复进行检查新的连通块,销弥、掉落、填补等过程,直到不能产生消弭。点击一次,步数就减一,消弭一次步数加一。用完步数游戏完毕。动画显示消弭和掉落过程。
游戏要求:
- 系统提供5次机会,每次点击消耗一次,每次合成增加一次,但总数不超过5次。
- 记录每次游戏的得分,每合成一次,积分增加相应的分数,最后记录总得分。每次合成的分数为:三个数及以上合成新数得 1 点,四个数合成新数得 2 点,五个数合成新数得 3点,以此类推,每次合成的得分为当前数字乘以点数。比如若有 3 个 3 合成为 4,则本次合成得分为 3×1=3 分,若有 3 个 4 合成为 5,则得分为 3×2=6 分。
题目二十三:基于C++聊天机器人
系统功能:
- 通过调用 Windows 系统自带的语音识别功能,随时识别用户通过麦克风说的每一句话并与语音数据库中的预存数据相比较,如果匹配,则回应相应的对话。语音数据库中的预存数据要自建,并逐步丰富。
- 朗诵诗词或讲故事。
题目二十四:基于C++的音乐小天才
系统功能:
- 通过Windows系统的声音函数,播放音乐。
- 自建音乐文件,播放歌曲。
- 利用键盘上的键,弹奏歌曲,自定义 1234567(中音),QWERTYU(低音),ASDFGHJ(高音)。
- 在屏幕上绘制音乐键盘,鼠标点击发出声音。
题目一代码
employeeManagement.h
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义最大职工数量
#define MAX_EMPLOYEES 100
//定义职工结构体
typedef struct {
int id; // 职工号
char name[50]; // 姓名
char gender[50]; // 性别
int age; // 年龄
char education[50]; // 学历
double salary; // 工资
char address[100]; // 地址
char phone[20]; // 电话
}Employee;
// 显示菜单
void showMenu();
// 主菜单函数
void menu(Employee* employees, int* count);
// 打印单个职工信息
void printEmployee(Employee emp);
// 检查职工号是否唯一
int isIdUnique(Employee* employees, int count, int id);
// 添加职工信息
void addEmployee(Employee* employees, int* count);
// 显示所有职工信息
void displayEmployee(Employee* employees, int count);
// 按学历查询职工信息
void searchByEducation(Employee* employees, int count);
// 按职工号查询职工信息
void searchById(Employee* employees, int count);
// 删除职工信息
void deleteEmployee(Employee* employees, int* count);
// 修改职工信息
void modifyEmployee(Employee* employees, int count);
// 保存职工信息到文件
void saveToFile(Employee* employees, int count);
// 加载职工信息
void loadFromFile(Employee* employees, int* count);
employeeManage.c
#include"employeeManagement.h"
// 显示菜单
void showMenu() {
printf("\n");
printf("+--------------------------+\n");
printf("| 职工信息管理系统 |\n");
printf("+--------------------------+\n");
printf("| 1. 录入职工信息 |\n");
printf("| 2. 浏览职工信息 |\n");
printf("| 3. 按学历查询职工信息 |\n");
printf("| 4. 按职工号查询职工信息 |\n");
printf("| 5. 删除职工信息 |\n");
printf("| 6. 修改职工信息 |\n");
printf("| 7. 保存并退出 |\n");
printf("+-------------------------+\n");
printf("请选择操作: ");
}
// 主菜单函数
void menu(Employee* employees, int* count) {
int choice;
while (1) {
showMenu();
scanf("%d", &choice);
switch (choice) {
case 1:
//printf("录入职工信息\n");
addEmployee(employees, count);
break;
case 2:
//printf("浏览职工信息\n");
displayEmployee(employees, *count);
break;
case 3:
//printf("按学历查询职工信息\n");
searchByEducation(employees, *count);
break;
case 4:
//printf("按职工号查询职工信息\n");
searchById(employees, *count);
break;
case 5:
//printf("删除职工信息\n");
deleteEmployee(employees, count);
break;
case 6:
//printf("修改职工信息\n");
modifyEmployee(employees, *count);
break;
case 7:
//printf("退出\n");
saveToFile(employees, *count);
return;
default:
printf("无效的选择,请重新输入。\n");
}
}
}
// 打印单个职工信息
void printEmployee(Employee emp) {
printf("职工号: %d\n", emp.id);
printf("姓名: %s\n", emp.name);
printf("性别: %s\n", emp.gender);
printf("年龄: %d\n", emp.age);
printf("学历: %s\n", emp.education);
printf("工资: %.2f\n", emp.salary);
printf("地址: %s\n", emp.address);
printf("电话: %s\n", emp.phone);
printf("\n");
}
// 检查职工号是否唯一
int isIdUnique(Employee* employees, int count, int id) {
for (int i = 0; i < count; i++) {
if (employees[i].id == id) {
return 0; //职工号不唯一
}
}
return 1;//职工号唯一
}
// 添加职工信息
void addEmployee(Employee* employees, int* count) {
if (*count >= MAX_EMPLOYEES) {
printf("已达到最大容量,无法添加更多职工。\n");
return;
}
Employee* emp = &employees[*count];
int id;
printf("请输入职工号: ");
scanf("%d", &id);
if (!isIdUnique(employees, *count, id)) {
printf("职工号已存在,请重新输入。\n");
return;
}
emp->id = id;
printf("请输入姓名: ");
scanf("%s", emp->name);
printf("请输入性别: ");
scanf("%s", emp->gender);
printf("请输入年龄: ");
scanf("%d", &emp->age);
printf("请输入学历: ");
scanf("%s", emp->education);
printf("请输入工资: ");
scanf("%lf", &emp->salary);
printf("请输入地址: ");
scanf("%s", emp->address);
printf("请输入电话: ");
scanf("%s", emp->phone);
(*count)++;
printf("职工 %s 信息录入成功\n", emp->name);
}
// 显示所有职工信息
void displayEmployee(Employee* employees, int count) {
for (int i = 0; i < count; i++) {
printEmployee(employees[i]);
}
}
// 按学历查询职工信息
void searchByEducation(Employee* employees, int count) {
char education[50];
printf("请输入学历进行查询:");
scanf("%s", education);
int found = 0;
for (int i = 0; i < count; i++) {
if (strcmp(employees[i].education, education) == 0) {
printEmployee(employees[i]);
found = 1;
}
}
if (!found) {
printf("没有找到符合条件的职工。\n");
}
}
// 按职工号查询职工信息
void searchById(Employee* employees, int count) {
int id;
printf("请输入职工号进行查询: ");
scanf("%d", &id);
for (int i = 0; i < count; i++) {
if (employees[i].id == id) {
printEmployee(employees[i]);
return;
}
}
printf("没有找到该职工号的职工信息。\n");
}
// 删除职工信息
void deleteEmployee(Employee* employees, int* count) {
int id;
printf("请输入要删除的职工号: ");
scanf("%d", &id);
for (int i = 0; i < *count; i++) {
if (employees[i].id == id) {
//将要删除的职工信息后移
for (int j = i; j < *count - 1; j++) {
employees[j] = employees[j + 1];
}
(*count)--;//总数减一
printf("职工号 %d 的信息已经删除。\n", id);
return;
}
}
printf("没有找到该职工号的职工信息,无法删除。\n");
}
// 修改职工信息
void modifyEmployee(Employee* employees, int count) {
int id;
printf("请输入要修改的职工号:");
scanf("%d", &id);
for (int i = 0; i < count; i++) {
if (employees[i].id == id) {
// 提示用户输入新的信息
printf("请输入新的姓名: ");
scanf("%s", employees[i].name);
printf("请输入新的性别: ");
scanf("%s", employees[i].gender);
printf("请输入新的年龄: ");
scanf("%d", &employees[i].age);
printf("请输入新的学历: ");
scanf("%s", employees[i].education);
printf("请输入新的工资: ");
scanf("%lf", &employees[i].salary);
printf("请输入新的地址: ");
scanf("%s", employees[i].address);
printf("请输入新的电话: ");
scanf("%s", employees[i].phone);
printf("职工号 %d 的信息已修改。\n", id);
return;
}
}
printf("没有找到该职工号的职工信息,无法修改。\n");
}
// 保存职工信息到文件
void saveToFile(Employee* employees, int count) {
FILE* file = fopen("employees.txt", "w");
if (file == NULL) {
printf("无法打开文件。\n");
return;
}
for (int i = 0; i < count; i++) {
Employee* emp = &employees[i];
fprintf(file, "%d %s %s %d %s %.2f %s %s\n",
emp->id, emp->name, emp->gender, emp->age,
emp->education, emp->salary, emp->address, emp->phone);
}
fclose(file);
printf("职工信息保存成功。\n");
}
// 加载职工信息
void loadFromFile(Employee* employees, int* count) {
FILE* file = fopen("employees.txt", "r");
if (file == NULL) {
printf("无法打开文件。\n");
return;
}
*count = 0;
while (*count < MAX_EMPLOYEES && fscanf(file, "%d %s %s %d %s %lf %s %s",
&employees[*count].id,
employees[*count].name,
employees[*count].gender,
&employees[*count].age,
employees[*count].education,
&employees[*count].salary,
employees[*count].address,
employees[*count].phone) == 8) {
(*count)++;
}
fclose(file);
printf("从文件加载了 %d 条记录。\n", *count);
}
test.c
#include"employeeManagement.h"
int main() {
Employee employees[MAX_EMPLOYEES];
int count = 0;
loadFromFile(employees, &count);
menu(employees, &count);
return 0;
}
调试验证
录入信息,并浏览
验证职工号唯一
保存职工信息,加载职工信息
按职工号进行查询
根据id删除职工
修改职工信息
题目二代码
bookManagement.h
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_BOOKS 100 // 最大图书数量
#define FILE_NAME "books.txt" // 文件名
// 定义图书结构体
typedef struct {
int loginNo; // 登录号
char title[100]; // 书名
char author[100]; // 作者名
char category[50]; // 分类号
char publisher[100]; // 出版单位
char publicationDate[20]; // 出版时间
double price; // 价格
} Book;
// 函数声明
void showMenu();
void menu(Book* books, int* count);
void printBook(Book book);
void addBook(Book* books, int* count);
void displayBooks(Book* books, int count);
void searchByTitle(Book* books, int count);
void searchByAuthor(Book* books, int count);
void deleteByTitle(Book* books, int* count);
void deleteByAuthor(Book* books, int* count);
void deleteByLoginNo(Book* books, int* count);
void modifyByLoginNoAndTitle(Book* books, int count);
void saveToFile(Book* books, int count);
void loadFromFile(Book* books, int* count);
bookManagement.c
#include"bookManagement.h"
void showMenu() {
printf("\n");
printf("+----------------------------------+\n");
printf("| 图书信息管理系统 |\n");
printf("+----------------------------------+\n");
printf("| 1. 录入图书信息 |\n");
printf("| 2. 浏览图书信息 |\n");
printf("| 3. 按书名查询图书信息 |\n");
printf("| 4. 按作者名查询图书信息 |\n");
printf("| 5. 按登录号删除图书信息 |\n");
printf("| 6. 按书名删除图书信息 |\n");
printf("| 7. 按作者名删除图书信息 |\n");
printf("| 8. 按登录号修改图书信息 |\n");
printf("| 9. 保存并退出 |\n");
printf("+----------------------------------+ \n");
printf("请选择操作: ");
}
void menu(Book* books, int* count) {
int choice;
loadFromFile(books, count); // 初始化时从文件加载图书信息
while (1) {
showMenu();
scanf("%d", &choice);
switch (choice) {
case 1:
addBook(books, count); // 添加图书信息
break;
case 2:
displayBooks(books, *count); // 显示所有图书信息
break;
case 3:
searchByTitle(books, *count); // 按书名查询图书信息
break;
case 4:
searchByAuthor(books, *count); // 按作者名查询图书信息
break;
case 5:
deleteByLoginNo(books, count); // 按登录号删除图书信息
break;
case 6:
deleteByTitle(books, count); // 按书名删除图书信息
break;
case 7:
deleteByAuthor(books, count); // 按作者名删除图书信息
break;
case 8:
modifyByLoginNoAndTitle(books, *count); // 按登录号书名修改图书信息
break;
case 9:
saveToFile(books, *count); // 保存图书信息并退出
return;
default:
printf("无效的选择,请重新输入。\n");
}
}
}
void printBook(Book book) {
printf("登录号: %d\n", book.loginNo);
printf("书名: %s\n", book.title);
printf("作者名: %s\n", book.author);
printf("分类号: %s\n", book.category);
printf("出版单位: %s\n", book.publisher);
printf("出版时间: %s\n", book.publicationDate);
printf("价格: %.2f\n", book.price);
printf("\n");
}
void addBook(Book* books, int* count) {
if (*count >= MAX_BOOKS) {
printf("已达到最大容量,无法添加更多图书。\n");
return;
}
Book* book = &books[*count];
printf("请输入登录号: ");
scanf("%d", &book->loginNo);
printf("请输入书名: ");
scanf("%s", book->title);
printf("请输入作者名: ");
scanf("%s", book->author);
printf("请输入分类号: ");
scanf("%s", book->category);
printf("请输入出版单位: ");
scanf("%s", book->publisher);
printf("请输入出版时间: ");
scanf("%s", book->publicationDate);
printf("请输入价格: ");
scanf("%lf", &book->price);
(*count)++;
printf("图书信息录入成功\n");
}
void displayBooks(Book* books, int count) {
for (int i = 0; i < count; i++) {
printBook(books[i]);
}
}
void searchByTitle(Book* books, int count) {
char title[100];
printf("请输入书名进行查询: ");
scanf("%s", title);
int found = 0;
for (int i = 0; i < count; i++) {
if (strcmp(books[i].title, title) == 0) {
printBook(books[i]);
found = 1;
}
}
if (!found) {
printf("没有找到符合条件的图书。\n");
}
}
void searchByAuthor(Book* books, int count) {
char author[100];
printf("请输入作者名进行查询: ");
scanf("%s", author);
int found = 0;
for (int i = 0; i < count; i++) {
if (strcmp(books[i].author, author) == 0) {
printBook(books[i]);
found = 1;
}
}
if (!found) {
printf("没有找到符合条件的图书。\n");
}
}
void deleteByTitle(Book* books, int* count) {
char title[100];
printf("请输入要删除的书名: ");
scanf("%s", title);
int deleted = 0;
for (int i = 0; i < *count; i++) {
if (strcmp(books[i].title, title) == 0) {
for (int j = i; j < *count - 1; j++) {
books[j] = books[j + 1];
}
(*count)--;
printf("书名 %s 的图书信息已经删除。\n", title);
deleted = 1;
break;
}
}
if (!deleted) {
printf("没有找到符合条件的图书信息。\n");
}
}
void deleteByAuthor(Book* books, int* count) {
char author[100];
printf("请输入要删除的作者名: ");
scanf("%s", author);
int deleted = 0;
int newCount = 0;
Book tempBooks[MAX_BOOKS];
for (int i = 0; i < *count; i++) {
if (strcmp(books[i].author, author) != 0) {
tempBooks[newCount++] = books[i];
}
else {
printf("作者名 %s 的图书信息已经删除。\n", author);
deleted = 1;
}
}
if (!deleted) {
printf("没有找到符合条件的图书信息。\n");
}
// 更新书籍数组
for (int i = 0; i < newCount; i++) {
books[i] = tempBooks[i];
}
*count = newCount;
}
void deleteByLoginNo(Book* books, int* count) {
int loginNo;
printf("请输入要删除的登录号: ");
scanf("%d", &loginNo);
int newCount = 0;
int deleted = 0;
// 创建一个临时数组来存储未被删除的图书信息
Book tempBooks[MAX_BOOKS];
for (int i = 0; i < *count; i++) {
if (books[i].loginNo != loginNo) {
tempBooks[newCount++] = books[i];
}
else {
deleted = 1;
}
}
// 将未被删除的图书信息复制回原数组
for (int i = 0; i < newCount; i++) {
books[i] = tempBooks[i];
}
*count = newCount;
if (deleted) {
printf("登录号 %d 的所有图书信息已经删除。\n", loginNo);
}
else {
printf("没有找到符合条件的图书信息。\n");
}
}
void modifyByLoginNoAndTitle(Book* books, int count) {
int loginNo;
printf("请输入要修改的登录号: ");
scanf("%d", &loginNo);
int found = 0;
for (int i = 0; i < count; i++) {
if (books[i].loginNo == loginNo) {
printf("当前信息:\n");
printBook(books[i]);
char confirm;
printf("确认修改此图书信息吗?(y/n): ");
scanf(" %c", &confirm);
if (confirm == 'y' || confirm == 'Y') {
char title[100];
printf("请输入要修改的书名: ");
scanf("%s", title);
int modified = 0;
for (int j = 0; j < count; j++) {
if (books[j].loginNo == loginNo && strcmp(books[j].title, title) == 0) {
printf("请输入新的书名: ");
scanf("%s", books[j].title);
printf("请输入新的作者名: ");
scanf("%s", books[j].author);
printf("请输入新的分类号: ");
scanf("%s", books[j].category);
printf("请输入新的出版单位: ");
scanf("%s", books[j].publisher);
printf("请输入新的出版时间: ");
scanf("%s", books[j].publicationDate);
printf("请输入新的价格: ");
scanf("%lf", &books[j].price);
printf("图书信息已更新。\n");
modified = 1;
}
}
if (!modified) {
printf("没有找到指定书名的图书信息。\n");
}
found = 1;
break;
}
else {
printf("取消修改。\n");
break;
}
}
}
if (!found) {
printf("没有找到指定登录号的图书信息。\n");
}
}
void saveToFile(Book* books, int count) {
FILE* fp = fopen(FILE_NAME, "w");
if (fp == NULL) {
printf("无法打开文件 '%s' 进行写入。\n", FILE_NAME);
return;
}
for (int i = 0; i < count; i++) {
fprintf(fp, "%d,%s,%s,%s,%s,%s,%.2f\n",
books[i].loginNo,
books[i].title,
books[i].author,
books[i].category,
books[i].publisher,
books[i].publicationDate,
books[i].price);
}
fclose(fp);
printf("图书信息保存成功。\n");
}
void loadFromFile(Book* books, int* count) {
FILE* fp = fopen(FILE_NAME, "r");
if (fp == NULL) {
printf("文件 '%s' 不存在,创建新文件。\n", FILE_NAME);
fp = fopen(FILE_NAME, "w");
fclose(fp);
return;
}
*count = 0;
while (fscanf(fp, "%d,%[^,],%[^,],%[^,],%[^,],%[^,],%lf",
&books[*count].loginNo,
books[*count].title,
books[*count].author,
books[*count].category,
books[*count].publisher,
books[*count].publicationDate,
&books[*count].price) != EOF) {
(*count)++;
}
fclose(fp);
printf("图书信息加载成功。\n");
}
test.c
#include"bookManagement.h"
int main() {
Book books[MAX_BOOKS];
int count = 0;
menu(books, &count);
return 0;
}
终端测试截图
添加图书
按下9 保存退出后,再次启动,按下2,浏览,没有问题
继续添加图书
199,西游记,吴承恩,I242.4,浙江古籍出版社,2010,35.00
199,鲁迅全集,鲁迅,略,略,略,900.00
199,呐喊,鲁迅,略,略,略,56.00
199,三国演义,罗贯中,略,略,略,79.00
89,红楼梦,曹雪芹,略,略,略,89.00
89,水浒传,施耐庵,略,略,略,99.00
19,测试,测试,测试,测试,测试,55.00
19,测试,测试,测试,测试,测试,35.00
根据书名查询图书
根据作者查询图书
一次性删除所有该登录号信息
199,西游记,吴承恩,I242.4,浙江古籍出版社,2010,35.00
199,鲁迅全集,鲁迅,略,略,略,900.00
199,呐喊,鲁迅,略,略,略,56.00
199,三国演义,罗贯中,略,略,略,79.00
89,红楼梦,曹雪芹,略,略,略,89.00
89,水浒传,施耐庵,略,略,略,99.00
没有登录号19的图书
删除图书
删除作者的图书
修改登录号下的图书