项目概况
项目一
1.项目名称:
歌手打分系统
2.功能描述
(1)生成字符界面的主菜单
图-1生成系统主菜单界面
(2)通过输入菜单项的序号启动相应子菜单模块的功能
①启动歌手初始数据处理功能
图-2歌手初始数据处理子菜单画面
初始数据处理模块能实现如下功能:
能够根据输入的歌手人数创建链表
可以提示用户输入歌手的数据,运行效果见图-3。
把输入的数据保存到指定文件singerOriginal.dat,运行效果见图-4。
把输入的歌手数据按格式输出到屏幕,运行效果见图-5。
返回到系统主菜单,运行效果见图-6。
图-3歌手初始数据输入画面
图-4歌手初始数据输出到文件画面
图-5歌手初始数据输出到屏幕画面
图-6返回系统主菜单画面
②启动歌手初始数据维护功能
图-7歌手初始数据维护子菜单画面
初始数据维护模块能实现如下功能:
能够把文件中歌手的初始数据读入系统,运行效果见图-8。
图-8从文件读入歌手初始数据画面
可以显示读入歌手的数据,运行效果见图-9。
图-9显示从文件中读入的歌手初始数据画面
把按输入编号修改歌手的成绩数据,运行效果见图-10。
图-10修改歌手数据画面
把修改后的歌手数据重新保存到文件,运行效果见图-11。
图-11保存修改后的歌手数据画面
返回到系统主菜单,运行效果见图-12。
图-12返回系统主菜单画面
③启动歌手原始数据汇总及排序功能
图-13歌手初始数据汇总子菜单画面
歌手原始数据汇总及排序模块包含的功能如下:
按去掉一个最高分和一个最低分的原则求每位歌手的平均分,运行效果见图-14。
图-14歌手初始数据汇总画面
显示汇总后的数据,运行效果见图-15。
图-15显示歌手汇总数据画面
把汇总后的数据输出到singerFinal.dat文件,运行效果见图-16。
图-16把歌手汇总数据输出到文件画面
按歌手总评分降序排列,运行效果见图-17。
图-17按歌手总评分降序排序画面
显示排列的结果,运行效果见图-18。
图-18按歌手总评分降序排序画面
把排列的结果保存到文件finalResult.txt,运行效果见图-19。
图-19把排序结果写到文件画面
返回系统主菜单,运行效果见图-20。
图-20返回系统主菜单画面
3.数据类型描述
//定义结构体类型来创建链表
typedef struct singer
{
int id; //歌手编号
char name[20]; //歌手姓名
float score[9]; //评委打分
float averScore; //总评成绩(平均分)
struct singer *next;
}SINGER;
//定义结构体数据类型用来对歌手数据进行排序
typedef struct result
{
int id; //歌手编号
char name[20]; //歌手姓名
float averScore; //歌手成绩
}RESULT; RESULT rs[MAX]; //全局数组,用于存储排序数据
int personN; //全局变量,用于存储歌手人数
4.模块划分与功能描述
(1)系统功能模块图
图-21歌手评分系统功能模块结构图
图-22歌手评分系统函数调用关系图
(2)函数及功能描述
表-1各函数功能信息描述
模块编号 |
模块名称 |
函数原型 |
功能描述 |
1 |
void |
void main(void); |
程序主控模块,系统功能导入和退出控制 |
2 |
menu |
void menu(void); |
生成系统主菜单,通过输入选项调用子菜单功能模块 |
3 |
subMenu1 |
void subMenu1(void); |
生成处理歌手初始数据子菜单,通过输入选项调用子菜单功能模块 |
4 |
subMenu2 |
void subMenu2(void); |
生成歌手数据维护子菜单,通过输入选项调用子菜单功能模块 |
5 |
subMenu3 |
void subMenu3(void); |
生成歌手数据汇总子菜单,通过输入选项调用子菜单功能模块 |
6 |
creatLink |
SINGER *creatLink(int n); |
创建含n个节点的单链表,返回头地址 |
7 |
inputData |
void inputData(SINGER *h); |
向以h为头的单链表中输入歌手的数据 |
8 |
writeOriginal |
void writeData(SINGER *h,int mode); |
把以h为头的单链表中歌手的数据按mode输出到指定文件? mode=1:输出的是原始数据;mode=2:输出求平均分后的数据 |
9 |
outputData |
void outputData(SINGER *h, int mode); |
把以h为头的单链表中歌手的数据按mode输出到屏幕mode=1:输出的是原始数据;mode=2:输出求平均分后的数据 |
10 |
accessData |
void accessData(SINGER *h); |
把以h为头的单链表中歌手的数据按去掉一个最高分和一个最低分求平均分处理 |
11 |
sortData |
void sortData(SINGER *h); |
把以h为头的单链表中歌手的数据先复制编号、姓名、平均分到数组rs[],然后按平均分降序排列 |
12 |
readData |
void readData(SINGER *h); |
从文件singerOriginal.dat中读取数据,存到h指向的单链表 |
13 |
search |
SINGER *search(SINGER *h,int id); |
查找编号为id的歌手信息,返回结点地址 |
14 |
modifyData |
void modifyData(SINGER *h); |
输入编号,修改该歌手的打分(重新输入) |
15 |
writeResult |
void writeResult(RESULT *r); |
把排序后的数据(rs[])写到指定文件 |
16 |
outputResult |
void outputResult(RESULT *r); |
把排序后的数据(rs[])输出到屏幕 |
(3)各函数的流程图
图-23 main函数流程图
图-24 menu函数流程图
图-25 subMenu1函数流程图
图-26 subMenu2函数流程图
图-27 subMenu3函数流程图
图-28 creatLink函数流程图
图-29 inputData函数流程图
图-30 writeOriginal函数流程图
图-31 outputData函数流程图
图-32 accessData函数流程图
图-33 sortData函数流程图
图-34 readData函数流程图
图-35 search函数流程图
图-36 modifyData函数流程图
图-37 writeResult函数流程图
图-38 outputResult函数流程图
项目二
1.项目名称:
十佳运动员评选系统
2.项目概述
某市体委与电视台联合举办十佳运动员有奖评选活动:
(1)体委组织有关人士提出了候选运动员名单,运动员信息情况如表2-1所示:
表2-1候选运动员名单
运动员编号 |
运动员姓名 |
运动员编号 |
运动员姓名 |
01 |
小明 |
… |
… |
02 |
小翔 |
20 |
小丹 |
运动员编号是两位数字。候选人的信息已经保存在文本文件sporter.txt中。
(2)电视台在网上设立了投票站供市民投票,选票的格式如表2-2所示:
表2-2选票格式
选票编号 |
0000001 |
投票人姓名 |
马琳 |
投票人地址 |
中山区解放路33号 |
所选运动员编号 |
01 |
05 |
06 |
10 |
11 |
13 |
16 |
17 |
18 |
20 |
|
|
|
|
|
|
|
|
|
|
|
选票编号是7位数字。市民投票的数据已经保存在文本文件vote.txt中。
(3)系统主要功能
①统计功能
统计并确定十佳运动员
统计各个候选人的得票数,并根据得票数排定每次,选出十佳运动员。统计结果要求存储到文本文件sporter10.txt中。
统计并确定10名幸运者
根据命中率情况,选出10名获奖的投票者,并排定名次。
命中率=命中分+次序分。
命中分:选中十佳中的一个得10分,选中n个得n×10分。
次序分:选票中的第一个运动员与十佳中的第一名相符(简称选中第一名)得9分,选中第二名得8分,…,选中第十名得0分。
统计结果要求存储到文本文件voter10.txt中。
②核对功能
可以对选票进行浏览和查询。
(4)要求
①为用户操作提供选择菜单,菜单的样式如下所示:
*************************************************
*-------------------系统主菜单------------------*
*************************************************
*-------1.统计功能-----------------------------*
*-------2.核对选票-----------------------------*
*-------3.退出系统-----------------------------*
*************************************************
请输入选项号(1-3):[ ]
*************************************************
*-------------------核对选票模块----------------*
*************************************************
*-------1.浏览选票-----------------------------*
*-------2.查询选票-----------------------------*
*-------3.返回主菜单---------------------------*
*************************************************
请输入选项号(1-3):[ ]
②主函数是控制部分,应尽量简单。
3.系统运行示例
(1)启动系统主菜单模块
图3-1系统主菜单
(2)启动统计功能子模块
统计功能子模块实现的功能如下:
显示所有运动员的数据,运行效果见图3-2。
统计十佳运动员数据。
把十佳运动员数据输出到文件sporter10.txt。
把十佳运动员数据显示到屏幕,运行效果见图3-3。
图3-2显示运动员数据画面
图3-3显示十佳运动员数据画面
统计每位投票者的得分,评出十位幸运投票者。
把每位投票者的得分数据写入到文件hit.txt。
把十位幸运投票者的数据写到文件voter10.txt。
把十位幸运投票者的数据显示到屏幕,运行效果见图3-4。
图3-4显示十位幸运投票者画面
(3)启动核对选票功能子模块
核对选票功能子模块的运行效果见图3-5,该模块实现的功能如下:
显示所有选票的数据,运行效果见图3-6。
图3-5核对选票子菜单
图3-6浏览选票运行画面
根据票号,查询选票信息,运行效果见图3-7。
图3-7查询选票运行画面
4.数据类型描述
#define N 20 //宏定义-候选运动员最大数
#define M 50 //宏定义-选票最大数 extern int sptNum; //外部全局变量——存储实际候选人数
extern int votNum; //外部全局变量——存储实际选票数 //运动员数据定义
struct sporter
{
int num; /*运动员编号*/
char name[20]; /*运动员姓名*/
int voteNum; /*运动员的得票数*/
}spt[N]; //选票数据定义
struct vote
{
char id[8]; /*选票编号*/
char name[20]; /*投票者姓名*/
char address[20]; /*投票者地址*/
int v[10]; /*投票者投出的十佳运动员编号*/
int orderScore; /*投票者所得次序分*/
int hitScore; /*投票者所得命中分*/
int totalScore; /*投票者所得总分*/
}vot[M];
5.模块划分与功能描述
(1)系统功能模块图
图5-1一级功能模块图
图5-2二级功能模块图
图5-3三级功能模块图
图5-4函数间调用关系图
(2)函数及功能描述
表5-1函数与功能描述
源文件 |
包含的函数 |
函数原型 |
功能描述> |
流程图 |
main.c |
main |
void main(void) |
主导引程序,调用systemMenu()函数,实现全部功能 |
见页-2 |
common.c |
systemMenu |
void systemMenu(void) |
生成系统主菜单,供用户选择,并具有简单纠错能力 |
见页-2 |
subMenu |
void subMenu(void) |
生成核对选票子菜单,供用户选择,并具有简单纠错能力 |
见页-3 |
rollBack |
void rollBack(void) |
在核对选票中,每次操作结束后提供选项以控制返回主菜单 |
见页-3 |
browseVote.c |
browseVote |
void browseVotes(void) |
读选票文件,显示选票,调用rollBack函数控制返回上级菜单 |
见页-4 |
printVoteN |
void printVoteN(int n) |
把n张选票的信息输出到屏幕 |
见页-4 |
searchVote.c |
searchVote |
void searchVote(void) |
输入选票号,查询该选票是否存在,并显示相关信息 |
见页-5 |
readFiles.c |
loadSporter |
int loadSporter() |
加载运动员数据文件,获得运动员人数 |
见页-6 |
printSptN |
void printSptN(int n) |
输出运动员数据 |
见页-7 |
loadVote |
int loadVote(void) |
加载选票数据文件,获得选票数 |
见页-8 |
calTenSporters.c |
statisticVote |
void statisticVote(int n) |
对n张选票进行统计,得出每个2候选人的得票数 |
见页-9 |
orderByVote |
void orderByVote(int m) |
根据得票数对运动员数据进行排序 |
见页-10 |
saveSpt10 |
int saveSpt10(void) |
把10佳运动员数据保存到文件 |
见页-11 |
printSpt10 |
void printSpt10(void) |
显示10佳运动员数据 |
见页-12 |
calTenVoter.c |
statisticHit |
int statisticHit(int n) |
统计n张选票的命中情况得分,并把得分写到文件hit.txt |
见页-13 |
sortVote |
void sortVote(int m) |
对m张选票按得分进行降序排列 |
见页-14 |
printVot10 |
void printVot10(void) |
显示10位幸运投票者数据 |
见页-15 |
saveVot10 |
int saveVot10(void) |
把10位幸运投票者的数据保存到文件 |
见页-15 |
(3)各主要函数的流程图
图5-5 main函数流程图
图5-6 systemMenu函数流程图
图5-7subMenu函数流程图
图5-8 roolBack函数流程图
图5-9 searchVote函数流程图
图5-10 loadSporter函数流程图
图5-11 printSptN函数流程图
图5-12 LoadVote函数流程图
图5-12 staticVote函数流程图
图5-13 orderByVote函数流程图
图5-14 saveSpt10函数流程图
图5-15 printSpt10函数流程图
图5-16 stasticHit函数流程图
图5-17 sortVote函数流程图
图5-18 saveVote10函数流程图
图5-19 printVote10函数流程图