1、 课程设计(论文) 编 号: 学 号: 201040420120 课 程 设 计 教 学 院 计算机 课程名称 高级语言程序设计Ⅱ 题 目 学生成绩管理系统 专 业 网络工程 班 级 1班 姓 名 曹彦 同组人员 唐舸轩、蔡敏、黄伴、程良康、张雄峰 指导教师 谢晋 2013 年 1 月 7 日 目 录 一 概述 2 1. 课程设计的目 2 2. 课程设计的要求 2
2、 二 总体方案设计 3 三 详细设计 4 3.1 程序功能描述 4 3.2 程序流程图 4 四 程序的调试与运行结果说明 5 4.1 程序源代码 5 4.2 调试并运行程序 18 五 课程设计总结 23 参考文献 24 一 概述 1. 课程设计的目的 1.理解和掌握该课程中的有关基本概念,程序设计思想和方法。 2.培养综合运用所学知识独立完成课题的能力。 3.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。 4.掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经
3、验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。 2. 课程设计的要求 1.界面友好,函数功能要划分好 2.总体设计应画一流程图 3.程序要加必要的注释 4.要提供程序测试方案 5.程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行 的程序是没有价值的。二 总体方案设计 使用面向对象的程序设计方法,程序的功能主要包括:对学生成绩信息的增、删、查、改等基本功能,并能够按照学号或姓名及成绩等进行排序和筛选,使用文件进行数据的存储和维护,能够按照班级或专业进行分类的管理。 程序中使用了双向链表保存数据的底层数据结构,实现起来很简单。C++推荐使用标准库,
4、这也是目前编程的方向,推荐此题目为本课程设计作为选做内容,可以根据实际教学情况决定,目的是使学生熟悉和了解C++的标准库。 本人负责部分: 1.删除一个学生的成绩记录:通过两个结点指针的使用来实现结点的删除,这两个指针分别是pNodepre,pNodeTal,其中pNodepre指针指向前一个结点,pNodeTal指针指向紧接的后一个结点,其中以pNodeTal指向的结点为基准进行比较,刚开始这两个结点分别指向第一个空结点和第一个实结点,若不满足姓名匹配,则两个指针同时向后移动一个单位,知道找到要删除的结点为止,当删除的结点是第一个实结点时,利用语句m_head->next = pNode
5、Tal->next实现,若是最后一个结点用pNodepre->next = NULL语句实现,否则用pNodepre->next = pNodeTal->next语句实现。 2.计算学生成绩总和:每输入一个同学的一科成绩时,程序将这科成绩自动加到totalmark中,直到第五科成绩。 三 详细设计 3.1 程序功能描述 该程序完成的功能如下: 输入学生信息,由addstudent()函数完成 在查找学生信息时按名字查找,由searchbyname()函数完成 将学生成绩信息保存到指定路径的文档中,由save()函数完成 根据学生总成绩按降序排序,,由sortbymark
6、)函数完成 根据学生姓名删除想要删除的学生信息,由Delete()函数完成 可根据姓名更改学生信息,由Change()函数完成 将文件信息保存到链表中,由readfiletolist()函数完成 添加学生信息,由addstudent()函数完成 从文件读取信息,由display()函数完成 10、显示学生信息,由show()函数完成 3.2 程序流程图 程序流程图如下: 保存学生信息在文件中并读取 可实现的功能 根据姓名查找学生信息 保存文件信息到链表中 根据姓名删除学生信息 计算总成绩并按此排序 输入学生信息 根据姓名修改学生信息
7、四 程序的调试与运行结果说明
4.1 程序源代码
完整的程序如下:
#include "stdafx.h"
#include "Student.h"
#include
8、t studentnode { markinfo mark[SUBJECT]; int totalmark; char name[10];//学生姓名 studentnode * next; }studentnode; class CStudent { public: CStudent(); virtual ~CStudent(); int addstudent(); int countmark(); int sortbymark(); int save(); int show(); int display(); int
9、 readfiletolist(); int searchbyname(); int Delete(); int Change(); private: studentnode *m_head; }; CStudent::CStudent() { m_head = new studentnode; m_head->next = NULL; } CStudent::~CStudent() { studentnode *pHead,*pTail; pHead=m_head->next; while(pHead) { pTai
10、l=pHead->next;
delete pHead;
pHead=pTail;
}
delete m_head;
}
//输入学生姓名,成绩等数据,并保存在链表中
int CStudent::addstudent()
{
studentnode *pStuNode;
int nCount;
char check;
system("cls");
cout<<"**********************"< 11、entnode;
cin.ignore();
cout<<"姓名:";
gets(pStuNode->name);
nCount=0;
pStuNode->totalmark=0;
do
{
cout<<"科目:";
gets(pStuNode->mark[nCount].subject);
cout<<"成绩(0--100):";
do
{
cin>>pStuNode->mark[nCount].score;
}while(pStuNode->mark[nCount].s 12、core > 100 || pStuNode->mark[nCount].score < 0);
pStuNode->totalmark=pStuNode->totalmark+pStuNode->mark[nCount].score;
getchar();
}while(SUBJECT != ++nCount);
//头插法
if(m_head->next==NULL)
{
m_head->next=pStuNode;
pStuNode->next=NULL;
}
else
{
pStuNo 13、de->next=m_head->next;
m_head->next=pStuNode;
}
cout<<"继续添加?y or n :";
check=getchar();
}while(check!='n' &&check!='N');
return 0;
}
//计算每位学生的总成绩
int CStudent::countmark()
{
studentnode *pStuNode=m_head->next;
if( pStuNode == NULL )
{
cout<<"没有学生,请重新输入"< 14、system("pause");
return 0;
}
else
{
cout<<"***************"< 15、tudent::sortbymark()
{
studentnode *pmove1=m_head->next;
studentnode *pmove2,*pmax,*ppre1,*ppre2,*pmaxpre,*ps=pmove1;
if(m_head->next==NULL)
{
cout<<"没有记录,请添加"< 16、pmove1,pmaxpre=ppre1,pmove1=pmove1->next,pmax=pmove1)
{
ppre2=pmove1;
pmove2=pmove1->next;
//排序 : pmaxpre指向最大值的前一个元素 pmax总是指向总成绩最大的元素 ppre2总是指向比较的第二个元素
//pmove1总是指向插入点的第一个元素 pmove2总是指向即将成为 第二个比较元素 的元素
for( ; NULL != pmove2; )
{
if(pmove2->totalmark > pmax->totalmark) 17、
{
pmaxpre=ppre2;
pmax=pmove2;
}
ppre2=pmove2;
pmove2=pmove2->next;
}
if(pmove1->next == pmax) //交换max和move1。
{
ppre1->next=pmax;
pmove1->next=pmax->next;
pmax->next=pmove1;
pmove1=pmax;
}
else
{
ps=pmove1->next;
pmove1->next 18、 = pmax->next;
pmax->next =ps;
pmaxpre->next = pmove1;
ppre1->next = pmax;
pmove1 = pmax;
}
}
cout<<"已经按照从大到小排序"< 19、<"请输入保存的地址"< 20、pNode=m_head->next;
while(pNode)
{
fprintf(fp,"%-8s",pNode->name);
nCount=0;
while(SUBJECT != nCount)
{
fprintf(fp,"%-6s %-7.1d",pNode->mark[nCount].subject,pNode->mark[nCount].score);
nCount++;
}
fprintf(fp,"\n");
pNode=pNode->next;
}
fclose(fp);
cout< 21、<"已经保存,请查阅"< 22、ame;
nCount = 1;
while(SUBJECT+1 != nCount)
{
cout<<"科目:"< 23、
{
ifstream fin;
char buf[100];
char str[25];
cout<<"请输入路径及文件名:"< 24、
return 0;
}
//从文件中读取数据,并保存在链表中
int CStudent::readfiletolist()
{
char str[25];
cout<<"请输入路径及文件名:"< 25、fscanf(fp,"%d",&nNum);
for(int i = 0; i 26、k[nCount].score;
nCount++;
}
if(NULL == m_head->next)
{
m_head->next=pNode;
pNode->next=NULL;
}
else
{
pNode->next=m_head->next;
m_head->next=pNode;
}
}
cout<<"信息已经保存在链表中"< 27、
{
if(m_head->next==NULL)
{
cout<<"没有学生,请添加或者从文件中读取"< 28、endl< 29、
return 0;
}
//删除学生
int CStudent::Delete()
{
if(m_head->next==NULL)
{
cout<<"没有学生,请添加或者从文件中读取"< 30、L != pNodeTal)
{
if(!strcmp(pNodeTal->name,szName))
{
if(pNodepre == m_head)
{
m_head->next = pNodeTal->next;
delete pNodeTal;
cout<<"删除成功!"< 31、delete pNodeTal;
cout<<"删除成功!"< 32、t<<"没有此学生,请添加或者从文件中读取"< 33、nt sorce;
while(NULL != pStuNode)
{
if(!strcmp(pStuNode->name,szName))
{
int nCount = 0;
nCount=0;
pStuNode->totalmark=0;
do
{
cout<<"科目:";
char szBuf[20];
cin>>szBuf;
strcpy(pStuNode->mark[nCount].subject,szBuf);
cout<<"成绩(0--100):";
34、 do
{
cin>>sorce;
pStuNode->mark[nCount].score = sorce;
}while(sorce > 100 || sorce < 0);
pStuNode->totalmark=pStuNode->totalmark+pStuNode->mark[nCount].score;
getchar();
}while(SUBJECT != ++nCount);
cout<<"修改成功!"< 35、 return 0;
}
pStuNode = pStuNode->next;
}
cout<<"没有此学生,请添加或者从文件中读取"< 36、 {
case 1:{stu.addstudent();break;}
case 2:{stu.countmark();break;}
case 3:{stu.sortbymark();break;}
case 4:{stu.save();break;}
case 5:{stu.show();break;}
case 6:{stu.display();break;}
case 7:{stu.readfiletolist();break;}
case 8:{stu.searchbyname();break;}
case 9: 37、{stu.Delete();break;}
case 10:{stu.Change();break;}
case 11:{flag=0;break;}
}
}
return 0;
}
int showmenu()
{
int choice;
char * menu[11]={
"1:输入学生成绩保存到链表\n",
"2:计算每位学生总成绩\n",
"3:按照总成绩大小对记录进行排序\n",
"4:输出所有学生成绩到一个文件中\n",
"5:显示新输入的学生信息\n",
"6:从文件中读取信息\n",
"7:将文件信息 38、保存在链表中\n",
"8:根据姓名查找学生记录\n",
"9:根据姓名删除学生记录\n",
"10:根据姓名修改学生记录\n",
"11:结束程序\n"
};
cout<<" "<<"*****************************************************"< 39、choice<11;choice++)
cout<<" "< 40、学生信息
显示学生信息
计算学生总成绩
按总成绩排序
读入文件中
从文件显示
将信息保存在链表中
按姓名查找学生成绩
删除学生信息
修改学生信息
删除学生信息
退出程序
五 课程设计总结
在这次的课程设计当中,我觉得我对C++这门课的理论知识有了更进一步的理解,加强了我们动手、思考和解决问题的能力。巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。通过实际编译系统的分析设计、编程调试,掌握 41、应用软件的分析方法和工程设计方法。通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。而且做课程设计同时也是对课本知识的巩固和加强,平时看课本时,有些问题就不是很能理解,做完课程设计,那些问题就迎刃而解了。而且还可以记住很多东西。认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准。所以这个期末测试之后的课程设计对我们的作用是非常大的。
这次的课程设计使我懂得了理论与实际相结合是很非常重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的 42、能力。在整个设计过程中,构思是很花费时间的。调试时经常会遇到这样那样的错误,有的是因为粗心造成的语法错误。当然,很多也时用错了方法,总是实现不了。同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。,我们类的分配不够详细,仅仅只自定义了一个学生类,我们本可以设计更完善的类分配与功能分配。其次,我们的接口讨论得也不够详细,我们应该做更详细的设计。最后,对于数据的存储我们只是选用了文件的形式,用文件进行存储更加的耗费事件与资源,我们还可以用数据库来代替。
通过本次课程设计,我学到了很多,明白编写程序是一个很严谨而需要恒心的东西。我们首先用的C++设计编程,遇 43、到了很多困难,初次运行达到了80余个错误,但是我们硬是一个一个改正,最终执行出来,但是由于才疏学浅在C++有一些函数没做出来,比如删除信息,大量移动数组,还有重载,但是我们查资料还是通过一点点的编写改正学到了很多东西,比如指针的运用,还有一些格式上的要求。后来,我们通过查阅很多资料用C语言实现了程序的大部分功能。
总之这次实验获得了很多知识,感觉很充实,也感觉做一个程序员真的很不易。
参考文献
[1] 谭浩强, C程序设计题解与上机指导(第二版),清华大学出版社,2000年9月。
[2] 陈维兴、林小茶,C++面向对象程序设计(第三版),清华大学出版社,2009年6月。
[3 44、] 严蔚敏、吴伟民,数据结构(C语言版),清华大学出版社,2010年7月。
高级语言程序设计Ⅱ课程设计成绩评定表
1、课程设计答辩或质疑记录
1)
2)
3)
2、答辩情况
a)未能完全理解题目,答辩情况较差 □ c)理解题目较清楚,问题回答基本正确 □
b)部分理解题目,答辩情况较差 □ d)理解题目透彻,问题回答流利 □
3、课程设计报告
a)内容: 不完整 □ 完整 □ 45、 详细 □
b)方案设计: 较 差 □ 合理 □ 非常合理 □
c)实现: 未实现 □ 部分实现 □ 全部实现 □
d)文档格式: 不规范 □ 基本规范 □ 规范 □
考勤成绩: ,
占总成绩比例10%
答辩成绩: ,
占总成绩比例30%
课程设计论文成绩: ,
占总成绩比例60%
课程设计总成绩:
4、课程设计评语
指导教师签字:
年 月 日
29
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818