C语言学生奖学金管理系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《C语言课程设计》报告
C Program Experiment Designing
一、C语言课程设计目的及要求
目的:
根据课堂讲授内容,学生做相应的自主练习,消化课堂所讲解的内容;通过调
试典型例题或习题积累调试C程序的经验;通过完成辅导教材中的编程题,逐
渐培养学生的编程能力、用计算机解决实际问题的能力。

要求:
1.熟悉Turbo C 的编程环境、主要菜单功能。

2.通过上机验证运算符、表达式、运算规则、函数使用。

3.熟练使用C语言的典型语句编写简单程序。

4.调试典型例题或习题。

5.提高上机编程能力
二、实验类型
设计类型
三、实验学时
40学时
四、实验设备
微型计算机、WINDOWS98以上版本的操作系统、Turbo C2.0 软件一套
五、C语言课程参考教材:
1. C语言程序设计清华大学出版社马靖善主编
2 谭浩强.C语言程序设计(第三版).北京:高等教育出版社,2002
课程设计(报告)任务书
任务及要求:
1.设计(研究)内容和要求
研究内容:学院系学生奖学金管理系统
任务和要求:
(1).学习C语言基础知识,掌握C语言编程和程序调试的基本技能。

(2).对指导教师下达的题目进行系统分析。

(3).根据分析结果完成系统设计。

(4).编程:在计算机上实现题目的代码实现。

(5).完成对该系统的测试和调试。

(6).提交课程设计报告。

(7).指标:
要求完成课程设计报告3千字以上(约二、三十页).
完成若干综合性程序设计题目,每个综合设计题目的语句行数的和在300行语句以上.
2.原始依据
了解C语言的基础知识,有一定的语言编程基础,能够熟练运用C语言进行程序设计。

通过用C语言完成的题目,提高用C语言解决实际问题的能力。

3.参考文献
[1] 黄明等. C语言程序设计辅导教材.大连理工大学出版社,2006
[2] 马靖善等.C语言程序设计.清华大学出版社,2005
[3] 谭浩强.C语言程序设计(第二版).北京:高等教育出版社,2002
指导教师签字:
2007年7月1日
目录
C语言课程设计报告................................................................................... 错误!未定义书签。

1 闰年判断 .......................................................................................... 错误!未定义书签。

1.1 功能说明........................................................................ 错误!未定义书签。

1.2 设计说明........................................................................ 错误!未定义书签。

1.3 程序运行截图 ............................................................. 错误!未定义书签。

2 闰年判断 .......................................................................................... 错误!未定义书签。

2.1 功能说明........................................................................ 错误!未定义书签。

2.2 设计说明........................................................................ 错误!未定义书签。

2.3 程序运行截图 ............................................................. 错误!未定义书签。

附录参考程序 .................................................................................... 错误!未定义书签。

题目一:学院系学生奖学金管理系统
编写一个程序,使其完成如下功能:根据所编成果,能够输入某一院系若干学生本学期末所获得的奖学金,并对以上内容进行适当的编辑和管理,以便以后进行查询和修改。

1.基本功能介绍:
1.1 C语言知识点运用简介
本程序设计时,根据题目中所要求的功能,主要将设计思路定格在对C语言链表的应用上。

这也是本程序关键所在。

首先,我们要将受奖学生的有关信息输入该系统并以表格的形式直观的展现在屏幕上,因此便涉及到C语言中链表的知识:链表的定义,链表是一种常见的重要的数据结构。

它是动态地进行存储分配的一种结构。

它可以根据需要开辟内存单元。

链表有一个“头指针”变量,以head表示,它存放一个地址。

该地址指向一个元素。

链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。

因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

链表的基本操作是建立、遍历、插入、删除和查找。

这也是本程序代码关键部分的功能。

建立和遍历链表的过程实际上就是输入和输出链表的过程,只有建立一个链表,才能对其进行操作。

其次,本管理系统的问世还包括了有关if …else处理单分支结构以及switch…case处理多分支结构语句;while、for循环语句;各种C语言库函数的引用,例如I/0操作函数"stdio.h"、ROM基本输入输出函数"bios.h"、屏幕操作函数"conio.h"以及动态地址分配函数"alloc.h"等等和函数嵌套调用与递归调用,函数指针和返回指针的函数;数据结构typedef struct的定义运用;一维数组的定义及赋值运算;一维数组的指针和数组元素的指针法引用等等,通过对这些知识点的运用不仅使得本程序结构严谨,操作得当准确,而且丰富了C中命令执行的灵活性和可实现性。

也使得我牢固了所学知识。

1.2奖学金管理系统的基本功能介绍
(1)按回车键进入管理系统界面,显示可供使用人员选择使用的菜单,各工作条一目了然。

(2)对系统进行格式化,即对应菜单中第一项“init list”,将系统中原来的内容清空,释放内存,进行新内容的处理。

(3)插入记录(Insert record to list),即输入新的受奖学生的信息,包括学号,姓名,基本奖学金数额。

(4)保存记录(Save data to the file),将方才输入的若干学生信息保存入档,以便以后进行编辑和查阅。

(5)计算应发奖学金(Calc the scholarship),考虑到学生在本学期课外活动和比赛获奖及加分所追加的额外奖金的情况,只设立单一奖金项目显得局限,因此,我另外设立了加款项,进而将基本奖学金延伸为应发奖学金和实发奖学金两项。

通过基本奖金额与加款额相加得到实发奖金。

(6)显示单条记录(Display record by step),如果想顺序挨个查阅全部学生信息,根据表格下对应的4项输入某一数字,系统会自动提取首位,下一位,或最后一位学生的有关信息。

(7)显示所有记录(List all),直接进入对应的菜单项可以获得所有受奖学生的信息。

(8)查阅单个学生信息(Search record on name),将所查的学生名字输入,再按回车即可得到所需信息。

(9)按所授金额升序排序实发奖金(Sort on sfjj),直接进入该项,系统自动将输入的若干学生信息排列。

结果可从第二项中看到。

(10)计算所需票面数(Computer ticket NO),所有信息输入结束后,可以直接利用菜单第十一项得到总共支出的各面值票面张数。

2.测试及运行效果
2.1基本输出函数printf()
gotoxy(25,15); /*移动光标*/
printf("press any key enter menu......\n");/*压任意键进入主菜单*/
gotoxy(22,14);
printf("welcome to scholarship consult program\n");
gotoxy(28,18);
printf("Red Army 2007 in China");
运行结果如图
(2.1-1)
2.2界面边框设置gotoxy( ,) putch()
(1)在设计菜单时主要采用坐标定位函数gotoxy( ,)以及输出调用函数putch()配合得到(如图2.2-1),以下是部分关键代码:
gotoxy(10,22);putch(0xc0); /*输出左上角边框┗*/
for(i=1;i<60;i++)
putch(0xc4); /*输出下边框水平线*/
putch(0xd9); /*输出右下角边框┛*/
window(11,3,69,21); /* 制作显示菜单的窗口,大小根据菜单条数设计*/
clrscr(); /*清屏*/
for(i=0;i<18;i++)
{
gotoxy(10,i+1);
cprintf("%s",f[i]); /*输出菜单项数组*/
}
(2)对菜单所列项的选择上主要采用了while()循环,利用定义的变量key!=13为条件查询是否压下了一个键或返回下一个在键盘压下的键以及对所压的键进行判断,从而
按照使用者的意图上下移动光标(如图所示2.2-1),关键代码:
if(key==72) i=i==1?14:i-1; /*如压向上光标键↑,i减1,如已到第一行再上移,则到最后一行*/
if(key==80)i=i==14?1:i+1; /*如压向下光标键↓,i加1,如已到最后一行再下移,则到第一行*/
gotoxy(10,i+1); /*光标移动i的下一项*/
textbackground(LIGHTRED); /*将背景颜色设为浅红*/
cprintf("%s",f[i]); /*输出菜单项*/
c=i-1; /*给代表菜单选项的整数赋值*/
(2.2-1)
2.3创建双链表
先来了解一下有关双链表的内容:双向链表其实是单链表的改进。

当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。

这是由单链表结点的结构所限制的。

因为单链表每个结点只有一个存储直接后继结点地址的链域,如定义一个既有存储直接后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点结构,这就是双向链表。

在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点地址,一般称之为右链域;一个存储直接前驱结点地址,一般称之为左链域。

在c语言中双向链表结点类型可以定义为:
typedef struct node
{
int data; /*数据域*/
struct node *llink,*rlink; /*链域,*llink是左链域指针,*rlink是右链域指针*/
}JD;
当然,也可以把一个双向链表构建成一个双向循环链表。

双向链表与单向链表一样,也有三种基本运算:查找、插入和删除。

2.3.1插入操作:
status listinsert_dul(dulinklist &l,int i elemtype e) {
if (! (p=getelemp_dul (l,i))) return error;
if (!(s=(dulinklist) malloc (sizeof (dul node)))) return error;
s->data=e;
s->next=p->prior;
s->next=p;
p->prior->next=s;
p->priot=s;
return ok;
} 在本程序中,设计插入记录的功能时就是以上述知识点为基础,运行结果如图2.3-1
(2.3-1)
2.3.2删除操作
status listdelete_dul (dulinklist &l,int i,elemtype &e) {
if (!(p=getelemp_dul(l,i))) return error;
e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
return ok;
}
下面给出双向链表中插入删除一个结点的函数。

操作过程见下图:
(2.3-2)
本系统删除记录的功能中关键部分同上所述,运行结果如图2.3-3
(2.3-3)
2.3.3查找操作
设置带关键字的排序二叉树链表,可以二分法查找。

如果是仅仅是线性双链表或单链表,可以使用各种语言中的集合,将每个节点给关键字保存到集合中。

如果链表是双链表,且是排序后的顺序连接,可以采用二分法查找;如果链表是双链表,且知道要查的内容在当前节点的前面或后面,可以每次移动节点保留为当前节点,按当前节点相对顺序查(在文字编辑器中常常使用此方法).单链表查找很笨,只有顺序查。

除上面情况以外,只有顺序查找的份了。

由于在本系统中查找的信息量较小,所以我没有太多考虑其工作的效率问题,仅采用了顺序移动查找的方法,即移动指针从头指针开始做比较判断,如果没找到,指针后移继续查找;如果指针为空,说明没有找到,进而显示没找到信息;如果查找成功,调用输出函数输出指针p所指记录。

以下是部分关键代码:
scanf("%s",s); /*输入要查找人的姓名*/
p=First; /*移动指针从头指针开始*/
while(strcmp(p->name,s)&&p!=NULL) /*做比较判断*/
p=p->next; /*没找到,指针后移继续查找*/
if(p==NULL) /*指针为空,说明没有找到*/
printf("\nlist NO %s SCHOLARSHIP\n",s); /*显示没找到信息*/
else
{ printf("\n\n"); /*换行*/
print(p); /*查找成功,调用输出函数输出指针p所指记录}
结果见图2.3-4
(2.3-4)
2.4排序void sort()
在设计排序时,主要思路得益于C语言中起泡法排序以及选择性排序,又考虑到系统本身涉及到数组的引用以及变量的赋值和变量对应值的交换,所以利用指针解决,同时选用选择性排序。

过程简介如下:首先定义一个临时指针并且将第一个指针对应的值赋予暂当最小值,然后顺序将其与其后指针指向的值比较如有更小者则将临时指针转指向该指针,接着重复上述过程,即临时指针总对应记录中最小值对应的指针,该次循环完成后将最小值放于首位,指针下标加1接着进行下一次循环,直到所有循环结束,运行结果见图2.4-1和2.4-2。

(2.4-1)
该图是进行显示全部信息(List all)操作时的运行结果,下图是进行排序(Sort on sfjj)后的显示结果,读者对比观察:
(2.4-2)
2.5计算票面张数
设计“计算票面张数”操作是基于方便管理层对支出金额的妥善处理和记录准确,也算是本系统的一个创新点,主要思路是用票面金额去除剩余金额得到的除数就是对应该票面的张数,计算所得余数作为下一个票面张数剩余额,运行结果见图2.5-1
(2.5-1)
注:以上所有截图均是同一次奖学金记录管理时的数据,读者可以联系上下,自行观察验证。

相关文档
最新文档