歌唱比赛评分系统设计(C语言完整版)

更新时间:2024-03-25 09:43:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《软件设计实践》

报告

学院:中北大学信息商务学院 专业:通信工程专业 题目:歌唱比赛评分系统

1305044142 王泽 学生姓名:1305044138 郭世杰

1305044149 贺鑫 完成时间:2016年1月18日 指导教师:鲁旭涛姚爱琴李沅

中北大学信息商务学院2013届课程设计说明书

目录

课程设计任务书 ............................ 3 1 需求分析...................................... 4 1.1 题目分析 .................................. 4 1.2 系统分析 .................................. 4 2 设计概要...................................... 5 3 程序设计及模块分工明细 ........................ 6 3.1 人员模块分工 .............................. 6 3.2 人员模块分工明细 .......................... 6 4 测试结果..................................... 34 4.1 调试与测试 ............................... 34 4.2 测试结果截图 ............................. 34 设计总结 ....................................... 41 致谢 ........................................... 42 参考文献 ....................................... 43 附录 ........................................... 44

2

中北大学信息商务学院2013届课程设计说明书

课程设计任务书

1 设计目的

C语言是通信工程专业一门重要的专业技术课程,它是一门实践性很强的课程。 软件设计实践课程是为配合c语言课程,对学生进行全面综合训练、与课堂教学、作业练习题、上机实验相辅的必不可少的一个教学环节。

利用所学的C语言知识及其编程方法:结构程序设计、数组、指针、结构体、文件操作等内容,通过布置具有一定难度的实际程序设计题目,要求学生独立完成所布置题目。在分析设计过程中,要求学生养成良好的编程习惯,学会分析解决简单的实际问题,学会C语言的实际调试技巧和方法,要求学生在教师的指导下逐步完成应用程序的设计

2 设计内容和要求

有十个选手参加歌唱比赛,十个裁判对每个选手的演唱进行打分,去掉一个最高分,去掉一个最低分,剩下分数的平均值作为每位选手最后的成绩。

要求:

(1)采用结构体定义每个选手的参赛编号,姓名以及十个裁判打出的分数; (2)从键盘输入每个选手的相关信息:参赛编号,姓名和十个得分; (3)计算每位选手的最后得分,并按分数由高到低排序;

(4)查询功能:输入参赛选手的编号或姓名,便可输出该选手的得分以及排名; 以上功能采用菜单操作方式,即从键盘输入1到3这三个数,分别完成以上(2)到(4)的功能。

3 设计工作任务及工作量的要求

? 每个组员完成自己的模块设计。 ? 完成一份设计说明书。 ? 有正确的运行结果及结果分析

3

中北大学信息商务学院2013届课程设计说明书

1 需求分析

1.1 题目分析

软件设计实践课程是为配合c语言课程,对学生进行全面综合训练、与课堂教学、作业练习题、上机实验相辅的必不可少的一个教学环节。

利用所学的C语言知识及其编程方法:结构程序设计、数组、指针、结构体、文件操作等内容,通过布置具有一定难度的实际程序设计题目,要求学生独立完成所布置题目。在分析设计过程中,要求学生养成良好的编程习惯,学会分析解决简单的实际问题,学会C语言的实际调试技巧和方法来解决实际问题。

1.2 系统分析

歌唱比赛评分系统包括:

? 菜单:系统以菜单方式工作,界面友好,易于操作。

? 录入:在每个输入前都有详细分类和提示,简单明了,根据提示输入参赛选手号数,

姓名,各个评委打分成绩。

? 查询:用户输入查询条件,系统规则地在界面显示查询结果,不光可以输入号数,

查询到该选手信息,每位评委打分;还可以选择排名查询,显示的数据全面。 ? 修改:在已有数据的基础上实现对每位选手的信息,以及评分的修改。

? 排名:利用冒泡程序对数组进行排序,删除一个最高与最低然后进行讲剩下的值平

均,得出选手最终得分,再根据分数高低排名。

? 储存:对于已经输入的数据,已文档的信息储存到电脑硬盘中,实现永久储存。

系统的程序设计环境:

本系统使用Visual C++ 作为程序开发工具。Visual C++是基于对象的快速应用程序开发工具,是当今最强大、最灵活的应用程序开发工具之一,具有良好的可视化应用程序开发环境和强大的可扩展数据库功能。利用Visual C++提供的可视化组件库进行编程,可以快速、高效地开发出基于Windows环境的各类应用程序。Visual C++语言的特点是面向对象设计的程序语言,Visual C++的基础编程语言是具有面向对象特性的语言,具有代码稳定、可读性好、编译速度快等优点,并将面向对象的概念移植到了C语言中,使这种基础语言有了新的发展空间。与其它编程软件相比,特别是在数据库和网络应用方面,Visual C++具有简便易用、灵活高效的特点。

4

中北大学信息商务学院2013届课程设计说明书

开发软件通常要经过修改源代码、编译、测试、再修改、再编译、再测试等操作,这些操作形成了一个开发循环,所以快速的编译器可以大大地降低开发周期。Visual C++正是建立在这种高效编译器的基础之上,是针对Windows的最快的高级语言代码编译器,因此生成的代码十分精练高效,使Visual C++程序的运行速度更快。这也是使用Visual C++作为程序设计开发语言的重要原因。

2 设计概要

总体设计目标:使用者可以利用本系统进行对选手信息以及评委评分的各项运算操作,如根据需求添加选信息,删除选手信息,对选手得分进行排名等。最后清晰完整的结果于屏幕中。方便了评分操作,不仅节省时间,而且提高准确性,可以达到事半功倍的效果。

总体设计策略:本系统采用的是自顶向下、层次化的模块结构。对高层模块,采用以事务为中心的设计策略,把一个大的模块逐步分解成较小的相对简单的模块。对低层模块,采用以变换为中心的设计策略。为了提高每个模块的内聚性、降低模块间的耦合性,将每个模块设计成具有单一功能的模块(即功能内聚),使模块间的联系完全是通过主模块的控制和调用来实现(即非直接耦合)。

结合上述分析该系统应包括以下模块:选手信息浏览,选手信息录入,选手信息保存,选手成绩查询,选手信息修改,选手信息删除。

选手数据:编号、姓名、成绩、平均成绩。

歌唱比赛评分系统选手信息浏览

选手信息录入选手信息保存5

选手成绩查询选手信息修改选手信息删除

图1.总体结构图

中北大学信息商务学院2013届课程设计说明书

3 程序设计及模块分工明细

3.1 人员模块分工

王泽:浏览选手数据browse();查询选手成绩search();查询选手信息print()。 郭世杰:菜单函数menu_select(); 修改函数update(); 保存函数save()。 贺鑫: 参赛选手信息录入creat();成绩排序rank();删除函数del(); 公共模块:color()、quit()、welcome()。

3.2 人员模块分工明细 ? 浏览选手数据browse()

分析:实际为链表的遍历,将头节点的指针给予临时节点p1,用while语句实现链表的遍历。

START 申明指针变量 IF(head == NULL && tail == NULL) 表头 当前信息记录为空 WHILEp1 !=空 输出选手信息 END

图2.浏览选手数据模块

/*---------------------- browse函数 -----------------------------*/

void browse() {

SONGER_MESSAGE *p1;

if(head == NULL && tail == NULL) {

printf(\当前信息记录为空--------\\n\);

6

中北大学信息商务学院2013届课程设计说明书

} else {

printf(\你要浏览的选手信息如下---------\\n\); printf(\); printf(\编号 | 姓名 \\n\); p1=head; while(p1 != NULL) {

printf(\);

printf(\,p1->num,p1->name); p1=p1->next; }

printf(\); } }

? 查询选手成绩search()

分析:提供详细成绩查询,排名查询的函数调用。其中各功能均采用菜单选择的方式。

START 定义变量c,并赋值 SWITCH (c) 输入1 跳转到详细成绩查询 Break 输入2 排名查询 Break END

图3.查询选手成绩

7

中北大学信息商务学院2013届课程设计说明书

/*--------------------------- search函数-------------------------------*/

void search() { int c;

printf(\请选择查询内容:\\n\);

printf(\选手详细成绩查询 2.选手排名查询\\n请输入您的选择:\); scanf(\,&c); switch(c) { case1: system(\); print(); break; case2: system(\); rank(); break; } }

8

中北大学信息商务学院2013届课程设计说明书

? 查询选手信息print()

分析:实际为输出链表中的某个某个节点,输出某个选手的编号与姓名较为好实现,输出10位评委成绩则用的for语句来实现。

START 输入要查找的选手编号 IF head == NULL && tail == NULL 当前记录为空 输出表头 WHILE(p1 != NULL) IF(p1->num == seeknum) 输出编号姓名 FOR(i=0; i

图4.查询选手信息模块

/*------------------------------------ print函数 -----------------------------------------*/

void print() {

SONGER_MESSAGE * p1=(SONGER_MESSAGE *)malloc(LEN);

9

中北大学信息商务学院2013届课程设计说明书

int check=0,i; long seeknum;

printf(\请输入要查找的选手编号:\); scanf(\,&seeknum);

if(head == NULL && tail == NULL ) {

printf(\对不起,当前记录为空!\\n\); } else {

p1=head;

printf(\你要找的选手的成绩如下---------\\n\);//在这里找到了要查找的选手成绩

printf(\--|--------\\n\);

printf(\编号 | 姓名 | 成绩| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 平均成绩\\n\);

printf(\--|--------\\n\); while(p1 != NULL) {

if(p1->num == seeknum) {

printf(\,p1->num,p1->name); printf(\); for(i=0; i

printf(\,p1->grades[i]); }

10

中北大学信息商务学院2013届课程设计说明书

printf(\,p1->ave); check=1; getchar(); return; } else {

p1=p1->next; } } }

if(head != NULL && check == 0) {

printf(\对不起,你查看的选手成绩不存在!\\n\); } getchar(); }

11

中北大学信息商务学院2013届课程设计说明书

? 菜单函数menu_select()

分析:菜单主函数要求设计比较简洁,只提供设输入,处理和输出部分的函数调用。其中各功能模块用菜单方式选择。

START 定义变量char s[100]; int c; WHILE(1) 利用atoi()函数将所接收的字符串转换成数值,提供给if语句判断 IF (c < 1 || c >7) 输入有误 Break SWITCH (c) 1 信息浏览 Break 2 信息录入 Break 3 信息保存 Break 4 成绩查询 Break 5 信息修改 Break 6 信息删除 Break 7 退出系统 Return Break Code default Break END

图5菜单模块

/*---------------- menu_select函数 ------------------------*/

void menu_select() {

char s[100]; int c;

gets(s); //不管用户输入的是数字键或是字母键使用gets都能将输入作为字符串接收

while(1) //限定用户输入的数值必须在1-7之间才有效,否则要求重新输入

12

中北大学信息商务学院2013届课程设计说明书

{

c = atoi(s); //利用atoi()函数将所接收的字符串转换成数值,提供给if语句判断

if(c <1 || c >7) {

printf(\您的输入有误,请重新输入:\); gets(s); } elsebreak; }

switch(c) { case1:

system(\); //清屏

browse(); //选手信息浏览break; case2: system(\);

creat(); //选手信息录入break; case3: system(\);

save(); //选手信息保存break; case4: system(\);

search(); //选手成绩查询 break;

13

中北大学信息商务学院2013届课程设计说明书

case5: system(\);

update(); //选手信息修改 break; case6: system(\);

del(); break; case7: system(\);

quit(); return; break; default: break; } getchar(); system(\); menu(); menu_select(); }

//选手信息删除 //退出系统

14

中北大学信息商务学院2013届课程设计说明书

? 修改函数update()

分析;实现选手信息的修改,核心内容为链表的遍历。找出要修改的选手,修改其个人信息。

START 输入要修改的选手编号: IF(head == NULL && tail == NULL) 当前信息记录为空 p1=head WHILE(p1 != NULL) IF(p1->num == updatenum) 修改信息 Return p1=p1->next; 指向下一个节点 IF(head != NULL && check == 0) 选手信息不存在 getchar(); NO END 图6.修改模块

/*------------------------ update函数 --------------------------*/

void update() {

SONGER_MESSAGE *p1;//=(SONGER_MESSAGE *)malloc(LEN); int check=0; //用来进行判断,是否找到了要修改的信息

15

中北大学信息商务学院2013届课程设计说明书

long updatenum;

printf(\请输入要修改的选手编号:\); scanf(\,&updatenum);//查找到要修改的选手 if(head == NULL && tail == NULL) {

printf(\当前信息记录为空--------\\n\); } else {

p1=head; while(p1 != NULL) {

if(p1->num == updatenum) {

printf(\你要修改的选手信息如下---------\\n\); printf(\); printf(\编号 | 姓名 \\n\); printf(\);

printf(\,p1->num,p1->name); printf(\);

printf(\请重新写入此选手信息:---------\\n\); check=1;//从新写入修改项目 printf(\修改选手编号为:\); scanf(\,&p1->num);

printf(\修改选手姓名为:\); scanf(\,p1->name); return; } else

16

中北大学信息商务学院2013届课程设计说明书

{

p1=p1->next; } } }

if(head != NULL && check == 0) {

printf(\对不起,你要修改的选手信息不存在!\\n\); } getchar(); }

17

中北大学信息商务学院2013届课程设计说明书

? 保存函数save()

分析:保存文件的流程。使用fopen()函数打开txt文件,“w”参数代表打开只写文

件,再利用fprintf()函数写入选手内容,最后用fclose()函数关闭文件。

START 打开一个文件,并写入格式数据 WHILE (p1 != NULL) 向文件写入“编号”, “姓名” 关闭文件 END 图7.保存模块

/*------------------------------- save函数 ------------------------------*/

void save()//将数据保存到文件 {

FILE *fp;

SONGER_MESSAGE *p1;//=(SONGER_MESSAGE *)malloc(LEN); p1=head;

fp=fopen(\参赛选手名单.txt\,\); fprintf(fp,\); fprintf(fp,\编号 | 姓名 \\n\); while(p1 != NULL) {

fprintf(fp,\);

fprintf(fp,\,p1->num,p1->name); p1=p1->next; }

fprintf(fp,\); fclose(fp);

printf(\文件已将保存到\\\参赛选手名单.txt\\\); }

18

中北大学信息商务学院2013届课程设计说明书

? 参赛选手信息录入creat()

分析:录入信息表现为创建链表节点并给节点的元素赋值,然后对评委的分数进行排序(链表的排序),排序选择冒泡排序法,最后去掉一个最高分去掉一个最低分。

START 定义变量int i,j; float t; char c='y'; WHILE (c == 'y' || c == 'Y') 录入选手信息:编号,姓名 FOR(i=0; igrades[j]>p1->grades[j+1]) 交换数的位置 去掉一个最高分,去掉一个这一低分,得出最后的平均分 IF (p1==NULL) 内存分配失败 IF (head == NULL && tail == NULL) 创建节点 选手信息录入成功 如果当前还有节点则插入到尾部 是否继续(Y/N) END 图7.参赛选手信息录入模块

19

中北大学信息商务学院2013届课程设计说明书

/*--------------- creat函数 -----------------------*/

void creat() { int i,j; float t; char c='y';

while(c == 'y' || c == 'Y') {

SONGER_MESSAGE *p1=(SONGER_MESSAGE *)malloc(LEN); printf(\请输入要录入的选手信息:\\n\); printf(\选手编号:\); scanf(\,&p1->num);

printf(\选手姓名:\); scanf(\,p1->name);

printf(\请输入10位评委点评成绩:\);

p1->ave = 0; for(i=0; i

scanf(\,&(p1->grades[i])); //runtime error p1->ave += p1->grades[i]; }

for(i=0; i

20

中北大学信息商务学院2013届课程设计说明书

for(j=0; j

if(p1->grades[j]>p1->grades[j+1]) {

t=p1->grades[j];

p1->grades[j]=p1->grades[j+1]; p1->grades[j+1]=t; }

p1->ave=(p1->ave-(p1->grades[0]+p1->grades[9]))/8;//去掉一个最高分,去掉一个这一低分,得出最后的平均分

p1->next=NULL;

if(p1==NULL) {

printf(\内存分配失败\\n\); n=n-1; }

if(head == NULL && tail == NULL) //当前没有结点,创建第一个结点 {

head=p1; head->next=NULL; tail=head;

printf(\选手信息录入成功------\\n\); }

else//如果当前还有节点则插入到尾部 {

tail->next=p1; tail=p1;

21

中北大学信息商务学院2013届课程设计说明书

tail->next=NULL;

printf(\选手信息录入成功------\\n\); }

printf(\是否继续(Y/N):\); getchar(); scanf(\,&c); } }

? 成绩排序rank()

分析:用冒泡排序的方法对平均成绩(链表)进行排序。

START 定义指针变量*p1,*p2,*endpt,*p; p1=head; IF (head == NULL && tail == NULL) 当前信息记录为空 为p1分配内存,p1->next = head; head = p1; FOR (endpt=NULL; endpt!=head; endpt=p) FOR (p=p1=head; p1->next->next!=endpt; p1=p1->next) IF (p1->next->ave < p1->next->next->ave) 两节点的顺序交换 把p1的信息去掉,head指向排序后的第一个节点 释放p1并将p1重新指向头指针 WHILE(p1 != NULL) 输出选手排名 加上表尾部 getchar(); END 图8.成绩排序模块

22

中北大学信息商务学院2013届课程设计说明书

/*------------------------------------ rank函数 -----------------------------------------*/

void rank() {

SONGER_MESSAGE *p1,*p2,*endpt,*p; // *endpt/*控制循环比较*/ *p/*临时指针变量*/ n=0; p1=head;

if(head == NULL && tail == NULL) {

printf(\当前信息记录为空--------\\n\); } else {

p1 = (SONGER_MESSAGE *)malloc(LEN);

p1->next = head; /*注意理解:我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。因为第一个节点没有前驱,我们不能交换地址。*/

head = p1; /*让head指向p1节点,排序完成后,我们再把p1节点释放掉*/

for(endpt=NULL; endpt!=head; endpt=p) /*结合第6点理解*/ {

for(p=p1=head; p1->next->next!=endpt; p1=p1->next) {

if(p1->next->ave < p1->next->next->ave) /*如果前面的节点键值比后面节点的键值小,则交换*/ {

p2 = p1->next->next; //1、排序后q节点指向p节点,在调整指向之前,我们要保存原p的指向节点地址,即:p2=p1->next->next

p1->next->next = p2->next; //2、顺着这一步一步往下推,排序后p1->next->next要指的是p2->next,所以p1->next->next=p2->next

p2->next = p1->next; //3、p2->next原是q发出来的指向,排序后q的指向要变为指向p的,而原来p1->next是指向p的,所以p2->next=p1->next

p1->next = p2; //4、p1->next原是指向p的,排序后图16中p1->next要指向q,原来p1->next->next(即p2)是指向q的,所以p1->next=p2

p = p1->next->next; //5、至此,完成了相邻两节点的顺序交换 }

} }

p1 = head; /*把p1的信息去掉*/

head = head->next; /*让head指向排序后的第一个节点*/ free(p1); /*释放p1*/

23

中北大学信息商务学院2013届课程设计说明书

printf(\选手成绩排名信息如下---------\\n\); printf(\); printf(\编号 | 姓名 |平均成绩| 名次 \\n\);

p1=head; while(p1 != NULL) {

printf(\);

printf(\,p1->num,p1->name,p1->ave,n+1); n++;

p1=p1->next; }

printf(\); }

getchar(); }

? 删除函数del()

分析:节点的删除较为繁琐。

第一种情况:数据在链表头部,并且只有一个结点。 第二种情况:数据在链表头部 ,头结点。 第三种情况:数据在链表中间,中间节点。 第四种情况:数据在链表尾部,尾部节点。

24

中北大学信息商务学院2013届课程设计说明书

START 定义变量,输入要删除的选手的编号&del_num IF(head == NULL && tail ==NULL) 信息记录为空,删除失败! WHILE(node != NULL) node=head;p1=head; IF (node->num == del_num) 输出要删除的选手信息 IF(node == head && head->next == NULL) 删除唯一的节点 删除头节点 IF(node ->next != NULL) 中间节点删除成功 删除尾节点 getchar(); Return IF(head != NULL && check == 0) 要删除的选手信息不存在! IFif(node->next == NULL) IF(node == head && head->next != NULL) p1=node; node= node->next; END 图9.删除模块

/*---------------------- del函数 --------------------------*/

void del()

25

中北大学信息商务学院2013届课程设计说明书

{

SONGER_MESSAGE *node;//=(SONGER_MESSAGE *)malloc(LEN); SONGER_MESSAGE *p1;

int check=0; //用来进行判断,是否找到了要删除的信息 long del_num;

printf(\请输入要删除的选手的编号:\); scanf(\,&del_num);

if(head == NULL && tail ==NULL) {

printf(\当前信息记录为空,删除失败!\\n\); } else {

node=head; p1=head; while(node != NULL) {

if(node->num == del_num) {

printf(\要删除的选手信息--------\\n\); printf(\); printf(\编号 | 姓名 \\n\); printf(\);

printf(\,node->num,node->name); //在这里找到了要删除的选手信息 printf(\);

check=1; //找到要删除的信息,赋为真 if(node == head && head->next == NULL) //是头结点,并且只有一个结点

26

中北大学信息商务学院2013届课程设计说明书

{

head=NULL; tail=head; free(node);

printf(\删除信息成功--------\\n\); //删除唯一的节点 }

elseif(node == head && head->next != NULL) //删除头节点 {

node=head; head=head->next; free(node);

printf(\删除信息成功--------\\n\); //头节点删除成功 n=n-1; }

elseif(node ->next != NULL) //删除中间节点 {

p1->next=node->next; free(node);

printf(\删除信息成功--------\\n\); //中间节点删除成功 n=n-1; }

elseif(node->next == NULL) //删除尾节点 {

p1->next=NULL; tail=p1; free(node);

printf(\删除信息成功--------\\n\); //尾节点删除成功 n=n-1; }

27

中北大学信息商务学院2013届课程设计说明书

getchar(); return; } else {

p1=node; node=node->next; } } }

if(head != NULL && check == 0) {

printf(\对不起,你要删除的选手信息不存在!\\n\); } getchar(); }

? 公共模块

? 颜色控制函数color()

分析:为了使程序看起来更美观,所以引入windows api来控制颜色函数,用来改变字体颜色。

/*--------------------------color函数 -----------------------------*/

void color(constunsignedshort color1) {

/*仅限改变0-15的颜色;如果在0-15那么实现他的颜色 因为如果超过15后面的改变的是文本背景色。*/ if(color1>=0&&color1<=15)

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color1); /*如果不在0-15的范围颜色,那么改为默认的颜色白色;*/

28

中北大学信息商务学院2013届课程设计说明书

else

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); /*颜色对应值:

0=黑色 8=灰色

1=蓝色 9=淡蓝色 2=绿色 10=淡绿色 0xa 3=湖蓝色 11=淡浅绿色 0xb 4=红色 12=淡红色 0xc 5=紫色 13=淡紫色 0xd 6=黄色 14=淡黄色 0xe 7=白色 15=亮白色 0xf */ }

? 退出函数quit()

分析:用来退出程序

/*---------------------- quit函数 ----------------------------*/

void quit() {

printf(\》感谢您使用歌唱比赛评分系统《==========\\n\\n\); }

? 目录函数menu()

分析;为程序入口提供显示,因篇幅有限,所以显示有错乱。

/*------------------------------------- menu函数 -----------------------------------------*/

29

中北大学信息商务学院2013届课程设计说明书

void menu() {

system(\); color(11);

printf(\\\n\);

printf(\t★☆★☆歌唱比赛评分系统☆★☆★ :r1hhhhhhhhhh1r: \\n\);

printf(\\\n\);

printf(\\\n\);

printf(\选手信息浏览 hS5555555555555555SSi iSh. \\n\);

printf(\\\n\);

printf(\\\n\);

printf(\选手信息录入 Sh555555555555SS5r ,1SS5555Si \\n\);

printf(\\\n\);

printf(\\\n\);

printf(\选手信息保存 :SS555SSS1; ,sSSS5555555SS; \\n\);

printf(\\\n\);

30

中北大学信息商务学院2013届课程设计说明书

printf(\s1. \\n\);

printf(\选手成绩查询 i533SSSSSSSSSSS5s, .1SS5i \\n\);

printf(\55SSh; \\n\);

printf(\5555SS1, \\n\); printf(\选手信息修

改 .sS3S555555555SSs. \\n\);

printf(\5555555SS5i \\n\);

printf(\SS5555555SSh: \\n\); printf(\选手信息删

除 :sSSS5555555SS1, \\n\);

printf(\ ,r5SS5555555SSr. \\n\);

printf(\ .ihSSS55555SS5; \\n\); printf(\退出系

统 :1SSS55555SSs\\n\);

printf(\ ,r5SS5555S5\\n\);

printf(\ :shhhhh: \\n\);

31

中北大学信息商务学院2013届课程设计说明书

color(15); }

? 欢迎模块welcome()

分析:一个系统需要一个美观欢迎界面,由于DOS窗口有限,所以用点阵字写出“welcome”并且在右下角增加当前时间显示。时间用的time.h库来实现。

/*--------------------------welcome函数 -----------------------------*/

int welcome() {

system(\); printf(\);

color(14);printf(\####### \\n\);

color(14);printf(\# \\n\);

color(11);printf(\# \\n\);

color(11);printf(\##### \\n\);

color(11);printf(\# \\n\);

color(13);printf(\# \\n\);

color(13);printf(\####### \\n\);

color(10);printf(\制作:电子信息工程系 通信工程1班 42王泽 38郭世杰 49贺鑫\\n\);color(15); time_t it;

it=time(NULL);

ptr=localtime(&it);

printf(\当前系统时间:M年d月d

日 %d:%d\\n\,ptr->tm_year+1900,ptr->tm_mon+1,ptr->tm_mday,ptr->tm_hour,ptr->tm_min,ptr->tm_sec);

printf(\按任意键进入主菜单\\n\); getch(); system(\);

32

中北大学信息商务学院2013届课程设计说明书

menu();

menu_select(); return0; }

? 主函数main()

分析;提供程序入口。

/*------------------------------------- main函数 -----------------------------------------*/

int main() {

welcome(); return0; }

? 库函数

#include #include #include #include #include #include #include

#define LEN sizeof(SONGER_MESSAGE) #define N 10

? 结构体

structtm *ptr; //用于welcome()显示时间的结构体

typedefstruct songer //定义选手信息链表结构 {

long num; //选手编号 char name[20]; //选手姓名 float grades[N]; //选手成绩 double ave; //平均成绩

struct songer * next; //链表的结点,next是指针变量,指向结构体变量指针域

} SONGER_MESSAGE; //等价于struct SONGER_MESSAGE

33

=>中北大学信息商务学院2013届课程设计说明书

SONGER_MESSAGE * head; //定义链表的头指针 SONGER_MESSAGE * tail; //定义链表的尾指针

int n=0; // n为全局变量,用于统计结点的个数

4 测试结果

4.1 调试与测试

第一,用一组简单的数据对程序进行调试,是否各函数有出错现象。然后用复杂数据对程序进行调试。直到确定程序对正常数据没有错误为止。

第二,当数据测试时,程序错误,要首先找到出错的函数,对函数中各个变量进行观察,有时变量很多,循环多重不要急,对各个数据的观察,对程序的调试有很大的帮助。你也可以先对几个变量熟悉后,在多重循环里,确定正确的数据,将其跳过调试,对有疑问的数据循环进行仔细观察。虽然这是比较省力气的活,但对复杂的数据错误并不是很有效,所以仔细观察每个数据的变化对调试的成功与否有决定性作用。

第三,测试时,根本的错误并不一定在运行错误的函数内,或许在前面的函数内已经奠定了这些错误数据的基础,需要反过头来,对所有的的函数进行一项项的调试!从程序运行的第一个函数开始调试。按照程序运行的步骤下去。一个个的确定函数的正确性,每确定一个函数,在以后的调试中可以减少对该函数的调试次数,或者直接跳到下一个函数。所谓的各个击破便是如此。对头文件中的各个函数的返回值和它所要传入的参变量及其功能更是需要注意。

第四,调试时,需要对错误缩小范围,从整个程序到指定函数,再到指定区域,再到指定行,在对程序缩小范围或对编译没通过的程序缩小错误范围时可以用\来进行调试,确定正常范围,缩小错误范围。

4.2 测试结果截图

34

中北大学信息商务学院2013届课程设计说明书

图10.欢迎界面

35

中北大学信息商务学院2013届课程设计说明书

图11.主菜单

图12.选手信息浏览

36

中北大学信息商务学院2013届课程设计说明书

图13选手信息录入

图14选手信息保存

37

中北大学信息商务学院2013届课程设计说明书

图15选手信息查询

图16 选手详细信息查询

38

中北大学信息商务学院2013届课程设计说明书

图17 选手排名查询

图18 选手信息修改

39

中北大学信息商务学院2013届课程设计说明书

图19 选手信息删除

图20 退出系统

40

中北大学信息商务学院2013届课程设计说明书

设计总结

通过以上各章节的介绍,已经完成了歌唱比赛评分系统设计系统的开发,歌唱比赛评分系统设计是一套实用性非常强的系统,可以应用到各种评分系统。

歌唱比赛评分系统设计不仅需要灵活的交互功能,还需要经常与数据库进行联系,要求具有操作简单和功能强大的数据库访问能力。界面尽量美观友好、多彩多姿,完全的图形化设计,操作者易于上手,同时多种媒体技术的集成利用,可以方便的完成用户乐于接受的各种界面设计。

本系统虽具备了基本的功能,但由于时间关系,还有很多功能待实现,在此基础上结合实际应用中所出现的问题,更智能化的排名系统,以及增加网络评分,观众评分等功能。

通过这次编程我深深的感受到对代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同人员之间的协作。

我们还要有模块化思维能力,模块化思维就是编程任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作。善于总结,也是学习能力的一种体现,每次完成一个编程任务,完成一段代码,都应当有目的的跟踪该程序的应用状况,随时总结,找到自己的不足,这样所编写的程序才能逐步提高。

41

中北大学信息商务学院2013届课程设计说明书

致 谢

在学习中,老师严谨的治学态度、丰富渊博的知识、精益求精的工作态度以及侮人不倦的师者风范是我终生学习的楷模,老师们的高深精湛的造诣与严谨求实的治学精神,将永远激励着我。在此,谨向老师们致以衷心的感谢和崇高的敬意!

另外,感谢校方给予我我们这样一次机会,能够独立地完成一个课程设计,并在这个过程当中,给予我们各种方便,使我们在这学期快要结束的时候,能够将学到的知识应用到实践中,增强了我们实践操作和动手应用能力,提高了独立思考的能力。

感谢所有任课老师和所有同学在这三年来给自己的指导和帮助,是他们教会了我专业知识,教会了我如何学习,教会了我如何做人。正是由于他们,我才能在各方面取得显著的进步,在此向他们表示我由衷的谢意。

在这次课程设计的撰写中,我得到了许多人的帮助。

首先我要感谢我的老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次设计的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把系统做得更加完善。在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。

其次,我要感谢帮助过我的同学,他们也为我解决了不少我不太明白的设计上的难题。 最后再一次感谢所有在设计中帮助过我的良师益友和同学

42

中北大学信息商务学院2013届课程设计说明书

参考文献

[1] 谭浩强. C程序设计. 北京:清华大学出版社,2007.91-310

[2]谭浩强.C程序设计题解与上机指导.北京:清华大学出版社,2005.130-155 [3] 张明慧. Visual C++开发图书管理系统.北京:北京师范大学,2005.32-40 [4]C编写组编.常用C语言用法速查手册.北京:龙门书局,1995.34-45 [5]张俐,杨莹 编著.C语言高级程序设计.北京:清华大学出版社,2006.67-78 [6] 魏海新,李燕主编. C语言程序设计实用教程.北京:机械工业出版社,2007.161-174

43

中北大学信息商务学院2013届课程设计说明书

附录

源代码:

#include #include #include #include #include #include #include

#define LEN sizeof(SONGER_MESSAGE) #define N 10

structtm *ptr; //用于welcome()显示时间的结构体

typedefstruct songer //定义选手信息链表结构 {

long num; //选手编号 char name[20]; //选手姓名 float grades[N]; //选手成绩 double ave; //平均成绩

struct songer * next; //链表的结点,next是指针变量,指向结构体变量} SONGER_MESSAGE; //等价于struct SONGER_MESSAGE

SONGER_MESSAGE * head; //定义链表的头指针 SONGER_MESSAGE * tail; //定义链表的尾指针

44

指针域 => 中北大学信息商务学院2013届课程设计说明书

int n=0; // n为全局变量,用于统计结点的个数

void creat(); //建立单向动态链表。此函数带回一个指向链表头的指针,用于参赛选手的录入

void del(); //用于删除结点,用于参赛选手的删除 void search(); //参赛选手成绩的查询 void print(); //用于输出链表

void rank(); //按个人平均成绩从高到低的顺序进行排序 void update(); //参赛选手的修改 void menu(); //操作系统菜单界面 void menu_select(); //菜单选择界面 void browse(); //选手信息浏览 void save(); //选手信息保存 void quit(); //退出系统界面

/*---------------------- browse函数 -----------------------------*/

void browse() {

SONGER_MESSAGE *p1;

if(head == NULL && tail == NULL) {

printf(\当前信息记录为空--------\\n\); } else {

printf(\你要浏览的选手信息如下---------\\n\); printf(\); printf(\编号 | 姓名 \\n\);

45

中北大学信息商务学院2013届课程设计说明书

p1=head; while(p1 != NULL) {

printf(\);

printf(\,p1->num,p1->name); p1=p1->next; }

printf(\); } }

/*--------------------------- search函数-------------------------------*/

void search() { int c;

printf(\请选择查询内容:\\n\);

printf(\选手详细成绩查询 2.选手排名查询\\n请输入您的选择:\); scanf(\,&c); switch(c) { case1: system(\); print(); break; case2: system(\); rank(); break;

46

中北大学信息商务学院2013届课程设计说明书

} }

/*------------------------------------ print函数 -----------------------------------------*/

void print() {

SONGER_MESSAGE * p1=(SONGER_MESSAGE *)malloc(LEN); int check=0,i; long seeknum;

printf(\请输入要查找的选手编号:\); scanf(\,&seeknum);

if(head == NULL && tail == NULL ) {

printf(\对不起,当前记录为空!\\n\); } else {

p1=head;

printf(\你要找的选手的成绩如下---------\\n\);//在这里找到了要查找的选手成绩

printf(\--|--------\\n\);

printf(\编号 | 姓名 | 成绩| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 平均成绩\\n\);

printf(\--|--------\\n\); while(p1 != NULL)

47

中北大学信息商务学院2013届课程设计说明书

{

if(p1->num == seeknum) {

printf(\,p1->num,p1->name); printf(\); for(i=0; i

printf(\,p1->grades[i]); }

printf(\,p1->ave); check=1; getchar(); return; } else {

p1=p1->next; } } }

if(head != NULL && check == 0) {

printf(\对不起,你查看的选手成绩不存在!\\n\); } getchar(); }

/*---------------- menu_select函数 ------------------------*/

48

中北大学信息商务学院2013届课程设计说明书

void menu_select() {

char s[100]; int c;

gets(s); //不管用户输入的是数字键或是字母键使用gets都能将输入作为字符串接收

while(1) //限定用户输入的数值必须在1-7之间才有效,否则要求重新输入 {

c = atoi(s); //利用atoi()函数将所接收的字符串转换成数值,提供给if语句判断

if(c <1 || c >7) {

printf(\您的输入有误,请重新输入:\); gets(s); } elsebreak; }

switch(c) { case1:

system(\); //清屏

browse(); //选手信息浏览 break; case2: system(\);

creat(); //选手信息录入 break;

49

中北大学信息商务学院2013届课程设计说明书

case3: system(\);

save(); //选手信息保存 break; case4: system(\);

search(); break; case5: system(\);

update(); break; case6: system(\);

del(); break; case7: system(\);

quit(); return; break; default: break; } getchar(); system(\); menu(); menu_select(); }

//选手成绩查询 //选手信息修改 //选手信息删除 //退出系统 50

本文来源:https://www.bwwdw.com/article/8o38.html

Top