第一篇:VC课程设计报告--教学事务管理系统
C++ 课 程 设 计 实 验 报 告
学号
姓名
院系专业 能源与环境工程 热能与动力工程
一、课题名称
《教学事务管理系统》
二、问题陈述
使用面向对象设计的系统分析和设计,设计出适当的数据结构,编写一个信息管理程序,程序的功能是管理学生基本信息,要求具有添加,删除,查询,排序的功能,并具有一定的查询功能。
三、设计目标和设计任务
新学期开学时新学生需要注册,登记注册信息。注册信息包括每个已注册学生的班级代号、学号、姓名、注册的学期等。
每个学期开始,学生可以选课,登记选课信息。选课信息包括已注册的每个学生所选的课程,选课仅限该生注册的学期。
每个学期考试完毕,需要成绩登记。每个学生所选课程的考核成绩,以及此成绩的类型。
所输入学生的信息如果有误,可以修改。对于退学、转学的学生,删除有关资料,对转入的学生,可以增加其各项信息。
学生信息包括:学号、班级、院系、姓名、性别、联系电话、家庭住址等。课程信息包括:课程代号、课程名、开课学期、学分、课时。
成绩信息包括:姓名、学号、班级、课程代号、成绩、类别(初修、补考、重修)。可提供的查询功能:
根据某些信息(班级、性别、专业)查询学生名单; 某门课程的选修者名单(含学号、成绩、成绩类型); 某个学生某个课程某学期的成绩单; 某个班级某个课程各个学生的成绩单; 某个课程选修者中不及格学生的名单;
某个课程的各项信息(课程代号、学分、课时、开课学期);
四、解题算法思想
程序包括11个对话框,主对话框上四个按钮,分别调用“注册信息”、“选课信息”、“成绩录入”及“信息管理和查询”四个子对话框。
其中,在“注册信息”对话框内可以选择学生的注册学期,点击“确定”按钮后,弹出“学生信息”对话框,此对话框与后面将会提到的“信息管理与查询”对话框的子对话框之一,“学生信息”相同,二者可相互共享。在该对话框中点击“增加”按钮,将调用“成员对话框”,用以实现学生的注册。信息填写完整后点击“确定”,并可依次返回至主对话框。
接着,点击“选课信息登记”,弹出选课信息对话框,在相应输入框或下拉菜单中输入信息后,点击所要选的课程(可多选),然后点“确定”,程序可以自行判断信息输入是否合理(选课学生是否已经注册或是否已选择同样的课程),如果有误,则通过消息框提示,并可以再次输入信息;如果信息合理,则提示选课成功。
点击“返回”回到主对话框,可通过“学生成绩录入”按钮调用“成绩录入”对话框,在此对话框中,可在输入框或下拉菜单中填写相关信息,程序同样可以自行判断信息输入的合理性(输入的学生是否已注册或是否已选择相应课程),如果输入有误,则弹出消息框提示,可以再次输入信息;如果信息合理,则成绩录入成功,新的成绩信息会在下方的List Control控件中显示。也可以直接点击下方List中的原有信息,程序会自动将该信息中的学生学号及相应课程代码填写入上方控件,方便成绩的录入。所有成绩录入完成后,点击“完成并保存”按钮,保存已录入的信息,同时自动返回至主对话框。
如需要查询相应信息,可点击“信息管理与查询入口”,调用“信息管理与查询”对话框。在这个对话框中,包含三个主要功能按钮,“学生信息”,“课程信息”和“成绩信息”,分别用以提供相应的查询功能。
点击“学生信息”,进入“学生信息”对话框。在这里可以实现学生信息的查询及管理功能。在上方控件中填写或选择相应信息后,便可以在下方的List Control控件中查看到所要的学生信息,同时选中相应条目后,可以通过右方的“删除”、“增加”和“修改”按钮,实现数据的管理。而通过下方“载入”和“保存”按钮,可以载入及保存现有数据,当然也可以载入进之前保存的文件,从而实现相同学生,不同学期的信息查询。
返回至“信息管理与查询”对话框后,点击“课程信息”按钮,在弹出的“课程信息”对话框中,可以查看所有的课程的基本信息,并可以通过“增加课程”按钮,调用“增加课程”对话框,填写新课程信息,从而增加新的课程;在“课程信息”中的控件中选择某门课程后,也可以通过“查看课程”按钮调用“查看课程”对话框,查看到选修该课程的学生名单,包括学号,成绩等信息,勾选上方控件后可以查看不及格学生的名单。
依次返回至“信息管理与查询对话框”,点击“成绩信息”后,进入“成绩信息”对话框。在这个对话框中可以在下方的List Control看到所有学生的成绩单,通过上方的Edit控件输入各个相应的筛选条件,便可以在下方看到所有符合条件的学生的成绩单。
依次返回至主对话框,点击“◎”退出程序。
五、数据结构描述
程序数据通过两个节点类、两个链表类来存储。分别如下:
{ public:
CString m_CourseNum;//存储课程代码 CString m_CourseName;//存储课程名 CString m_CourseTerm;//存放课程开课学期 CString m_CoursePoint;//存放课程学分 CString m_CourseTime;//存放课程课时数 int m_CourseScore;//存放学生课程成绩 CString m_CourseType;//存放学生成绩类型 Course *next;Course()//默认构造函数 class Course
{
} Course(CString CourseNum,CString CourseName,CString CourseTerm,CString m_CourseNum=“";m_CourseName=”“;m_CourseTerm=”“;m_CoursePoint=”“;m_CourseTime=”“;m_CourseScore=0;m_CourseType=”";next=NULL;CoursePoint,CString CourseTime);};
class CourseList { public:
Course * head;CourseList();void DeleteNode(Course *p);//用来删除存放指定课程的链表 void SaveToFile(const char *name);//将课程信息保存至文件 void LoadFromFile(const char *name);//从文件中导入课程信息 void ReleaseList();//释放链表
void AddNode(CString CourseNum,CString CourseName,CString CourseTerm,CString CoursePoint,CString CourseTime);//向链表中添加节点
};
class CStudent Course* FindNode(CString CourseNum);//根据课程代码查找节点 { public:
CString m_StudentNo;//存放学号 CString m_Class;//存放班级 CString m_Name;//存放学生姓名 CString m_Sex;//存放学生性别 CString m_Dept;//存放专业
CString m_PhoneNo;//存放学生电话号码 CString m_Address;//存放学生家庭住址 CString m_Term;//存放学生注册学期 CStudent *next;Course m_Course[20];//用来存放学生选的各项课程 int s;//存放学生所选课程的数量 CStudent();CStudent(CString CourseNum,CString StudentNum,int Score,CString ScoreType);CStudent(CString StudentNo,CString Class,CString Name,CString Sex,CString Dept,CString PhoneNo,CString Address);};class CStudentList { public:
CStudent * head;//头指针 int n;//节点数量 CStudentList();void DeleteNode(CStudent *p);//从链表中删除指定节点 void SaveToFile(const char *name);//将链表内容存入文件 void LoadFromFile(const char *name);//从文件载入链表内容 void ReleaseList();//释放链表 void AddNode(CString StudentNo,CString Class,CString Name,CString Sex,CString Dept,CString PhoneNo,CString Address);//向学生链表中添加节点 void AddScoreNode(CString CourseNum,CString StudentNum,int Score,CString ScoreType);//向链表中加入成绩信息 void AddCourseNode(CString StudentNo,CString CourseName, CString CourseNum,CString CourseTerm CString CoursePoint, CString CourseTime);//向链表中加入对应课程信息
};
另外,定义了全局变量:
CStudentList m_List;//用来保存学生的各项数据
CString Term;//用来存放学生的注册学期,用来将注册的学期信息加入链表(开始时,AddNode函数中忘记加入m_Term变量了)
CString Num;//为了在查看课程信息时,对话框里的内容能够方便的传入子对话框中 CStudent* FindNode(CString StuNo);//根据学号查找节点
六、测试数据
以下为程序初步运行后保存至文件中的内容:
2009-***091许亚军男 能源与环境学院 ***M9
110100首修高等数学5.0
2009-201048课时111100首修
2009-201048课时大学物理3.0 2009-201048课时112100首修C++2.0 111100首修大学物理3.0 男
2009-201048课时
2009-***091周帆能源与环境学院110M9
111100首修大学物理3.0 2009-201048课时11299首修C++2.0 2009-201048课时
2009-***091雒志强男
2009-201048课时能源与环境学院10086M9
112100首修C++2.0 2009-***091杨宗冰男
能源与环境学院119M9
112100首修C++2.0 2009-201048课时2009-***091XX女建筑学院XXXXXX
11055补考高等数学5.0 2009-201048课时1110重修大学物理3.0 2009-201048课时112100首修2009-201048课时 C++2.0
七、运行情况分析
输入数据测试后,生成包含以上内容的文件。整个过程顺利,程序可以正确运行,未出现重大错误,各项功能也都可以实现。可将生成的文件另外保存,从而录入新的数据(如其他学期的学生信息),而在查询时,可以根据需要查询的不同学期的信息来载入不同的文件。
八、设计小结
在程序设计过程中遇到了不少问题,很多都是因为之前的想法没有完全照顾到全局,使得后来要大幅度的修改代码,或者用较为复杂的代码来弥补。所以,较大的程序设计,最重要的就是一定要有大局观,在设计初期就要将自己的目标、思路理清,最好做下记录,而且做每一步的同时也必须想到后面的很多步,否则到后来很可能会因为之前的缺陷而做不下去,或者不得不放弃某些功能。另外,对于程序编写本身,我发现需要注意的部分是文件的保存及载入,这部分的每一个代码都需要仔细斟酌,否则很可能出现在编译时没问题,而运行时出错的状况。而一旦出现这种情况,就必须通过恰当的方法寻找出问题所在,如注释某些最近写的代码、利用消息框弹出某些变量的值,从而判断其与设想是否相符等方法,而不能盲目的查看所有代码,慢慢找或者索性手足无措了。
九、心得体会
这是我第一次尝试做比较大的程序,所以从中学到的还是很多的。首先,我发现我对程序设计还是很感兴趣的,很喜欢去钻研;其次,在设计及编程的过程中,通过发现问题、解决问题,我自己总结出来了不少方法,也发现了编写时所必须注意和避免的错误,可以让以后少走弯路。这些都是对于程序设计本身,此中的心得当然有很多,我也无法一一列举出来,而最重要的是我从其中学到了一些程序设计之外的东西。我深切的体会到了全局思想的重要性,无论干什么,基本上都得有这种思想,每走一步都必须想到以后的路,必须想到这一步是为什么而走的,为什么目标而服务的。只有这样,才能慢慢的稳健的走向自己的目标,不会在某一点上突然发现自己走不下去了,发现之前的某一步将自己带上的崎岖的路,而不得不往回走去弥补之前的过错或者干脆拐上另一条不明方向的道路。另外,前进的过程中,当遇到问题时,必须通过恰当的方法去发现起源,然后解决,而不要盲目的去寻找或者毫无对策了,必要的时候也得求助他人。而在一步步解决问题的过程中,也必须学会自己总结,以避免以后再次遇上相同错误时再走弯路。
总之,这次的课程设计给了我很大帮助,如果有机会,我便会选择向这方面去深入发展。
参考资料
1、《C++课程设计》
2、《C++程序设计》 提交日期 2010-9-16 星期四
朱金付 何铁军 朱萍 郑雪清 徐冬梅 编著
朱金付 主编
第二篇:VC课程设计报告
编号:
河北工业大学计算机软件技术基础(VC)2007年课程设计报告
学院 班级 姓名 __ 学号 ____ 成绩 __ ____
一、题目:查找满足特定条件的三位数(27)
二、设计思路
1、总体设计 1)分析程序的功能
2)系统总体结构:设计程序的组成模块,简述各模块功能。
2、各功能模块的设计:说明各功能模块的实现方法
3、设计中的主要困难及解决方案
在这部分论述设计中遇到的主要困难及解决方案。1)如何将输出1~9不重复数字 2)困难2
4、你所设计的程序最终完成的功能 1)说明你编制的程序能完成的功能 2)准备的测试数据及运行结果
三、程序清单
如果是使用一个文件完成的程序,只需列出程序代码。
如果是使用多文件完成的程序,首先说明程序中的代码存放在哪些文件中,说明文件名(例如:本程序包含first.cpp、second.cpp、third.cpp和all.h四个文件);然后依次给出每个文件名及该文件清单,例如:
1、first.cpp文件清单
2、second.cpp文件清单
3、third.cpp文件清单
第1页/共2 页
编号:
4、all.h文件清单
(说明:程序清单中一定要有注释。将程序中自己编写的代码列在此处,系统自动生成的代码就不要列出了。程序清单部分的行间距设为1行即可。)
四、对该设计题目有何更完善的方案
1、对自己完成程序进行自我评价。
2、对课题提出更完善的方案
五、收获及心得体会
1、通过本次课程设计,自己在哪些方面的能力有所提高。
2、收获和心得体会。
日期: 2007年
月
日
(说明:本模板只提供参考,每个同学根据自己课题的特点,可减少或增加某方面的论述)
第2页/共2 页
第三篇:VC课程设计教学和任务
VC++ 课程设计指导书
江苏科技大学南徐学院电子信息系
2011年9月
《计算机程序设计(vc++)课程设计》课程设计指导书
一. 课程设计教学和任务
《计算机程序设计(vc++)课程设计》是实践性教学环节,是学生必修的一门计算机实践课程。
本课程设计的目的是通过综合性程序设计训练,使学生进一步巩固对计算机程序设计语言(vc++)基本语法,基本算法的理解,加深对面向对象程序设计的理解与应用,并使学生养成模块化,结构化程序设计的良好风格,以及一定的程序组织能力,掌握基本程序设计的方法和技巧,为学习后续课程和实际编程打下良好的基础。
本课程设计的重点要求学生掌握基本程序设计理念和方法,培养学生基本程序设计的应用和开发能力。二. 课程设计要求与内容
1.本课程设计要求
(1)学生必须完成本指导书中所有的小综合设计题,并且完成大综合设计题中的任意一题(具体题目由任课教师指定)。要求:对主要变量及函数要加注释,以说明其功能。
(2)每个学生必须完成课程设计报告一篇。(报告格式见附录)2.课程设计的内容
本课程设计内容包括两个部分:小综合设计题和大综合设计题。
====================================== 附:课程设计报告格式一、二、课程设计目的 课程设计内容
1、小综合题
2、大综合题
三、课程设计体会及建议
小综合设计题
1.二维数组的操作运算
定义一个n×n的二维数组a,将该二维数组中周边元素的值全部置为2,其他元素全部置为0。
例如: 当n为8时生成并输出的矩阵为:
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0 定义类MAT,具体要求如下:
(1)私有数据成员
int n;二维数组的阶数
int *p;将二维数组以一维数组方式存储,p是起始指针。
(2)公有成员函数
MAT(int n1);初始化n,并动态申请数组空间,令p指向该空间。
void create();给数组赋值。
void print();按矩阵方式输出二维数组。
~ MAT();析构函数,释放动态数组空间。
(3)在主函数中完成对该类的测试。键盘输入二维数组的阶数n(如8或6),定义一个MAT类的对象m,用n初始化m,按要求生成并输出数组的值。
2.链表
建立一条无序链表,结点名为node,用一个函数实现将这条链表构成一条新的逆序链表,即将链表头当链表尾,链表尾当链表头。输出这两条链表上各个节点的值。
3.字符串处理
将字符串中指定的英语单词(字母子串)进行单数变复数的处理,单词之间用非字母分隔。为了简化编程,将单词的单数变复数的规则是:直接在单词后加s。例如单词student的复数为students。例如,有下列字符串:
We are student, you are student, too.指定单词student,将字符串中所有的student修改为students。处理后的字符串为:
We are students, you are students, too.试建立一个类Modistr,完成以上工作。具体要求如下:
(1)私有数据成员
char *str;存放指定的字符串;
(2)公有成员函数
Modistr(char *s);构造函数,动态申请字符串空间,用s所指向的串初
始化str;
void print();输出字符串str;
void modify(char *wordp);将wordp所指向的单词转换为复数。
~Modistr();析构函数
(3)在主函数中完成对该类的测试。定义类Modistr的对象mys,用字符串“We are student, you are student, too.”初始化mys,调用函数modify(char *)完成将单词“student”单数变复数的处理。
输出变换前和变换后的字符串。
提示:判断一个字符ch是否为字母,可用系统库函数isalpha(ch)。该函数的功能是:若ch是字母,返回真,否则返回假。使用该函数必须包含头文件ctype.h。
4.素数问题
建立一个类PRIME,求指定范围内的所有素数(质数)。具体要求如下:
(1)私有数据成员
int data[200];依次存放指定范围内的所有素数。
int min,max;存放待求素数的数值范围的下限和上限。
int num;存放min与max之间的素数个数。
(2)公有成员函数
构造函数PRIME(int n1, int n2);用n1和n2初始化待求素数的范围 min、max及num(值为0)。
void process();求指定范围内的所有素数,把它们存放在数组data中。求素数的算法必须是:首先将min与max之间的所有奇数依次放入数组data中,然后依次判断data中的每一个元素是否为素数。
若不是素数,则将其值赋为0。最后,数组data中不为0的元素均为素数。将不为0的元素值集中连续存放到数组的前面,同时统计素数个数。
void print();输出求出的所有素数,同时输出素数个数。
(3)在主程序中对该类进行测试。
定义一个PRIME类的对象test,并用待求素数范围min =10, max=200初始化test。通过test调用成员函数求出10至200之间的所有素数,并输出结果。[提示] 素数的定义是“只能被1和它本身整除的正整数”,素数也称为质数。
5.信号系统问题
定义一个类为形状,由它公有派生出正方体、球体和圆柱体。利用虚函数的多态性形式完成计算正方体、球体和圆柱体的体积。具体要求如下:(1)基类: shape 保护数据成员:double a,b;
公有构造函数:shape(double,double); 公有纯虚函数:double volume();(2)派生类
正方体、球体和圆柱体的类名分别为cube,sphere,cylinder, 各派生类均需要定义公有的构造函数以及求体积的虚函数double volume()。(3)派生类为球体时,a为半径,b为0。
派生类为正方体时,a表示边长,b为0。
派生类为圆柱体时,a为圆柱体的边长,b为圆柱体的高。
(4)设计一个完整的程序,分别计算正方体、球体和圆柱体的体积并输出结果。
测试数据如下:
形状类指针变量:p、球体对象:C(0.8)、正方体对象:S(3.2)和圆柱体类对象:R(4.1,5)。用指针p分别指向派生类对象。
输出结果为:
球体的体积是2.14357
正方体的体积是32.768
长方体的体积是263.917 提示:球体的体积公式=4/3*π*半径*半径*半径(其中π取常数3.14)
正方体的体积=棱长×棱长×棱长
圆柱的体积=底面积×高
6.求两个日期之间相差的天数。
设计一个日期类Date,包括日期的年份、月份和日号,编写一个友元函数,求两个日期之间相差的天数。具体要求如下:(1)私有数据成员
int year, month, day;
(2)公有成员函数
Date(int y,int m,int d);//构造函数,初始化日期。void disp();//输出日期。
friend int count day(Date &d,int);// 使用二维数组存放各月天数,第一行对应非闰年,第二行对应闰年。
friend int leap(int year);
//判断是否闰年,是返回1,否则返回0。friend int subs(Date &d1,Date &d2);
//求两个日期之间相差的天数。
(3)在主函数中完成对该类测试,定义两个对象d1(2000,1,1)和d2(2002,10,1),调用subs函数。程序正确的运行结果是: 2000.1.1与2002.10.1之间有1002天
7.身份证。
已知旧身份证号码共15位,其中第7~12位是以2位年份+2位月份+两位日期组成,而新身份证号码共18位,其中第7~14位是以4位年份+2位月份+两位日期组成。试定义一个类ID,根据居民的出生日期检查其身份证号是否正确。
具体要求如下: 1)私有成员:
char s[19] : 存放身份证号。
int yy, mm, dd : 分别存放居民出生日期的年(4位)、月(10~12月两位,其余1 位)、日(两位)。
2)公有成员:
ID(char str[]):构造函数。
int val(char *p): 将数字字符串p转换为相应的十进制数,如“123”转换为数值123,“08”转换为数值8;
int fun(): 根据出生日期检验身份证号是否正确,如果正确,函数值为1,否则为0。
必须使用如下算法:先分别取出身份证中的表示年份、月份、日期的子字符串,然后利用上述int val(char *p)函数转换为数值,再与出生日期的相应成员数据比较。
void print(): 输出所有成员数据。
3)在主函数中输入两个身份证号(一个18位:***910,另一个15位***),分别用这两个身份证号生成类ID的对象,在主函数中通过成员函数fun确定身份证号是否正确并输出相应的信息(身份证号、出生日期、检验结果)。
8.9×9乘法口诀表。
定义一个类MUL,生成如下的9×9乘法口诀表,要求口诀表存储在动态数组中,并输出到屏幕上。运行结果如下: 1 2 3 4
5
6
7
8
9
具体要求如下:(1)私有数据成员
nt(*a)[9];a是一个行指针变量,其指向的数组空间是动态生成的,用于存放口诀表。口诀表存放在二维数组的左下三角形中。
(2)公有成员函数
MUL();构造函数,动态生成数组空间。void process();生成乘法口诀表。void print();输出乘法口诀表。
~MUL();析构函数,释放动态数组空间。
(3)在主函数中完成对该类的测试。定义一个MUL类的对象a,通过a调用成员函数求出并输出乘法口诀表。
9.字符串分类。
输入一个字符串,串内有数字和非数字字符。
例如:
ABC2345
345rrf678
jfkld945
将其中连续的数字作为一个整数,依次存放到另一个整型数组b中。如对于上面的输入,将2345存放到b[0]、345放入b[1]………
统计出字符串中的整数个数,并输出这些整数。要求:
(1)在主函数中完成输入和输出工作。
(2)设计一个函数,把指向字符串的指针和指向整数的指针作为函数的参数,并完成从字符串中依次提取出整数的工作。
10.数组元素排序
将含有12个元素的数组作如下处理:先将所有数据按其在数组中的次序分成4等分,然后以每一组数据为单位按其平均值从小到大排序。例如,原数组为:{5,6,7,1,2,3,7,8,9,2,3,5 }处理后的数组为:{1,2,3,2,3,5,5,6,7,7,8,9}试定义一个类DATA完成上述功能,具体要求如下:
(1)私有数据成员int a[12], b[12];数组a用以存放原始数据,数组b用以存放处理后的数据。
(2)公有成员函数DATA(int x[], int n);构造函数。用参数x初始化a,将b的所有元素初始化为0,n为数组x的元素个数。
void convert(int x[4][3]);将a中的数据进行分组,并转换为二维数组x,其中每一组依次为数组x的一行。
void sort();按每组的平均值实现分段排序,并将排序后的数据存放到数据成员b中。
算法要求:利用函数convert()将a转换为二维数组,再求二维数组每一行的平均值,然后根据该平均值从小到大对该二维数组进行行排序,并将结果按题意转换为一维数组存放到b中。
void print();输出a和b的所有元素。
(3)在主函数中利用给定的数组生成类DATA的对象test,并对该类进行测试。假设给定数组为{5, 6, 7, 1, 2, 3, 7, 8, 9, 2, 3, 5}。输入/输出示例:
处理前的数组:5 6 7 1 2 3 7 8 9 2 3 5
处理后的数组:1 2 3 2 3 5 5 6 7 7 8 9
大综合设计题
设计题目一:学生学籍成绩管理系统
每个学生的信息包括:姓名、学号、性别、和学生的成绩信息 如:英语、数学、程序设计及体育成绩等各门课的成绩,要求程序能自动增加一门或是几门课的成绩,同时可以删除课程。
从键盘输入数据,然后,完成如下处理:
1.对学生姓名或学号进行查询,显示其信息,求出其总成绩、平均成绩、平均基点,并且显不在全班的学成绩排名。2.对所有学生,按班级计算平均。
设计题目二:通讯录管理系统
1.系统概要
该系统的功能是实现通讯录管理。2.基本功能要求
(1)输入姓名、单位、电话号码(2)显示上述内容(3)按姓名查找后显示(4)删除有关记录(5)增加记录
(6)保存修改后的文件(7)显示修改后的文件
3.各功能模块的程序流程图。(学生完成)4.完整的源程序代码。(学生设计完成)
设计题目三:小型特殊计算器
1.系统概要
本程序的功能是实现一个特殊的计算器,可以实现复数、有理数、矩阵和集合的特殊计算。程序可以实现复数、有理数的加、减、乘、除,可以实现矩阵的加法、减法和乘法运算,也可以实现集合的求交集、并集、子集的运算。注:可任选两种运算。
2.基本功能要求
(1)功能选择可以用菜单来实现 例如:请选择您的计算内容: 1.复数计算 2.有理数计算 3.矩阵计算 4.集合计算 0.退出
用户通过输入不同的数字进入不同的菜单。次级菜单主要显示本程序的功能,主要的功能有加法、减法、乘法和除法以及集合的求交集、求并集、求子集。(2)运行时给出明确的提示信息。
比如,输入一个什么类型的数据。根据用户的输入计算输出结果。由于数据类型比较多,可以一次输入第一个复数的实部,第一个复数的虚部,再输入第二个复数的实部、虚部。矩阵运算需要先输入矩阵的行数和列数,然后依次输出矩阵的第一行第一列的元素、第一行第二列的元素等等,依次类推。有理数运算需要一次输入有理数的分子、分母。集合运算需要输入集合的元素个数,然后依次输入集合中的每一个元素。
3.各功能模块的程序流程图。(学生完成)4.完整的源程序代码。(学生设计完成)
设计题目四:选修课小系统
1.系统概要
通过这一款选修课小系统,学生可以登入学生端进行选课及其他的操作,管理者通过登入管理端可以进行对选修课系统的数据的管理和维护。在学生端主要设置了3个基本功能:学生选课、学生情况、选课情况等;在管理端主要设置了9个基本功能:增加/删除学生、增加/删除课程、更改学分、填写成绩、学生情况、选课情况、保存数据等。这些功能基本上能满足选课的基本要求。此程序可以初步体现课程设计的目标。2.基本功能要求
用VC++编写一个界面美观流畅学生选课系统。学生有名字,学生最多可学五门课程,学生实际学的门数,可以给定学生的名字,可以得到学生的名字,可以得到学生给定课程的成绩,可以得到学生所学课程的平均成绩,可以给学生增加一门课(同时在该课程中增加一个学生)。课程最多有30个学生,课程有实际学生
数,课程有实际学生名单,课程有学分数,课程有每个学生成绩,课程可以得到学分数,课程可以设置学分数,课程可以得到班平均成绩,课程可以得到某个学生成绩。
3.各功能模块的程序流程图。(学生完成)4.完整的源程序代码。(学生设计完成)
设计题目五:学生成绩管理系统
系统上采用VC++为开发环境,这个编译器功能完善,使用方便。课程设计《学生成绩管理系统》,它的主要功能是对学生的成绩进行修改和管理。
系统功能要求:(1)界面
************************************ 学生成绩管理系统
************************************ ************************************ ** 1--输入数据 ** ** 2-查询成绩 ** ** 3--修改成绩 ** ** 4--输出所有学生成绩 ** ** 5--统计及格和优秀人数 ** ** 6--退出系统 ** *************************************(2)功能
程序的主要功能是输入学生姓名、成绩,学号自动生成,并可以对学生的成绩按学号和姓名进行查询。该系统具有存贮学生数据,按学号、姓名查询,按需要修改学生成绩,列出学生成绩和统计功能。
第四篇:VC课程设计教学和任务12131
VC++ 课程设计指导书
江苏科技大学南徐学院电子信息系
2012年6月
《计算机程序设计(vc++)课程设计》课程设计指导书
一. 课程设计教学和任务
《计算机程序设计(vc++)课程设计》是实践性教学环节,是学生必修的一门计算机实践课程。
本课程设计的目的是通过综合性程序设计训练,使学生进一步巩固对计算机程序设计语言(vc++)基本语法,基本算法的理解,加深对面向对象程序设计的理解与应用,并使学生养成模块化,结构化程序设计的良好风格,以及一定的程序组织能力,掌握基本程序设计的方法和技巧,为学习后续课程和实际编程打下良好的基础。
本课程设计的重点要求学生掌握基本程序设计理念和方法,培养学生基本程序设计的应用和开发能力。二. 课程设计要求与内容
1.本课程设计要求
(1)学生必须完成本指导书中所有的小综合设计题,并且完成大综合设计题中的任意一题(具体题目由任课教师指定)。要求:对主要变量及函数要加注释,以说明其功能。
(2)每个学生必须完成课程设计报告一篇。(报告格式见附录)2.课程设计的内容
本课程设计内容包括两个部分:小综合设计题和大综合设计题。
====================================== 附:课程设计报告格式一、二、课程设计目的 课程设计内容
1、小综合题
2、大综合题
三、课程设计体会及建议
小综合设计题
1.二维数组元素旋转
以下程序将N×N阶矩阵向左旋转90°,得到一个新的N×N阶矩阵。例如:原矩阵为:
向左旋转90°后的矩阵为:2.找回文数
判断一个字符串是否文回文,是指正向拼写和反向拼写都一样的字符串。例如,“madam”是回文。假定字符串中只出现字母,且不区分字母的大小写,即“A”和“a”被视为同一字母,其余类似。如“Madam”是回文。而“Sir”不是回文。函数plain(char*s)判断一个字符串是回文时,若是回文,函数返回1,否则,返回0.在主函数中,当判断一个字符串是回文时,输出Yes,否则输出No。
3.二维数组的操作运算
定义一个N×N的二维数组a,将该二维数组中周边元素的值全部置为2,其他元素全部置为0。例如,当n为8时生成并输出的矩阵为
定义类MAT,具体要求如下:(1)私有数据成员。
●int n:二维数组的行数(列数)。
●int *p:将二维数组以一维数组方式存储,p是起始指针。(2)共有成员函数。
●MAT(int n1):初始化n,并动态申请数组空间。令p指向该空间。
●void create():给数组赋值。
●void print():按矩阵方式输出二维数组。●~MAT():析构函数,释放动态数组空间。
(3)在主函数中完成对该类的测试。从键盘输入二维数组的行数(列数)n(如8或6)。定义一个MAT类的对象m,用n初始化m,按要求生成并输出数组元素的值。
4.删除序列中相同的数
定义一个字符串类STR,从左到右对字符串中每个字符删除其后所有相同的字符,只留下第一次出现的那一个。例如,若字符串为“cocoon”,删除重复出现的字符后,其结果是字符串“con”。
具体要求如下:(1)私有数据成员。
●char *s1:指向原字符串,存放字符串的空间需动态分配。
●char *s2:指向结果字符串,存放字符串的空间需动态分配。(2)公有成员函数
●STR(char *str:构造函数,用str初始化s1,动态分配s1和s2指向的空间。
●void delsame():删除重复出现的字符。
●void show():输出原字符串和结果字符串。
●~STR():析构函数,释放动态分配的存储空间。
在主函数中定义一个STR类的对象test,用字符串“cocoon”初始化test,通过test调用成员函数完成删除工作,输出删除前后的两个字符串。
5.求任意数降序数
对任意一个各位数字不完全相同的四位数(如4133),将各位上的数字从小到大排列得到一个升序数(1334),再将各位上的数字从小到大排列得到一个降序数(4331)。用大数(降序数)减去小数(升序数)得到一个新的四位数(2997=4331-1334)。若相减后不足四位,则高位上补零,称此过程为一次变换。将新的四位数按上述方法再变换一次,又得到一个四位数。有断言,经过多次变换,最后一定会得到一个固定的数6174。以下程序试图验证这个断言。
6.求两个日期之间相差的天数。
设计一个日期类Date,包括日期的年份、月份和日号,编写一个友元函数,求两个日期之间相差的天数。具体要求如下:(1)私有数据成员 int year, month, day;
//构造函数,初始化日期。(2)公有成员函数 Date(int y,int m,int d);void disp();//输出日期。
friend int count_day(Date &d,int);// 使用二维数组存放各月天数,第一行对应非闰年,第二行对应闰年。
friend int leap(int year);
//判断是否闰年,是返回1,否则返回0。
friend int subs(Date &d1,Date &d2);
//求两个日期之间相差的天数。(3)在主函数中完成对该类测试,定义两个对象d1(2000,1,1)和d2(2002,10,1),调用subs函数。程序正确的运行结果是: 2000.1.1与2002.10.1之间有1002天
7.实现点对象之间的各种运算。
设计一个点类Point,Point类提供了6个运算符重载函数(参加程序中的代码和注释),以实现相应的运算。具体要求如下:(1)私有数据成员 int x,y;
// x,y分别表示横坐标和纵坐标。Point();//构造函数,初始化x,y的值为0。Point(int i,int j);
// //置x、y坐标。
Point(Point &);//利用完成拷贝的构造函数,给x、y赋值。~Point(){};
//析构函数,无操作。int getx();
//取x坐标。int gety();
//取y坐标。void disp();//输出x、y的值。void offset(int,int);// 提供对点的偏移。
void offset(Point);// 重载,偏移量用Point类对象表示。bool operator==(Point);// 运算符重载,判断两个对象是否相同。bool operator!=(Point);// 运算符重载,判断两个对象是否不相同。void operator+=(Point);// 运算符重载,将两个点对象相加。void operator-=(Point);// 运算符重载,将两个点对象相减。
Point operator+(Point);// 运算符重 载,相加并将结果放在左操作数中。Point operator-(Point);// 运算符重载,相减并将结果放在左操作数中。(3)编写一个程序测试该类,测试数据及要求如下:
点类:p1(2,3),p2(3,4),p3(p2)完成的运算有:
以p3为主要测试对象,首先输出p3坐标值,置p3偏移量(10,10),p2==p3;p2!=p3;p3+=p1;p3-=p2;p3=p1+p3;p3=p1-p2;每完成一次运算,要将结果进行输出。程序正确执行的结果如下:
1:(3,4)2:(13,14)3:0(2)公有成员函数
4:1 5:(15,17)6:(12,13)7:(14,16)8:(11,12)8.定义一个描述学生通讯录的类,并进行测试。
定义一个描述学生通讯录的类COMMU,数据成员包括:姓名、学校、电话号码和邮编;成员函数包括:输出各个数据成员的值,分别设置和获取各个数据成员的值。
分析:由于姓名、学校和电话号码的数据长度是可变的,可使用动态的数据结构。邮编的长度是固定的,可定义一个字符数组来存放邮编。将数据成员均定义为私有的。用一个成员函数输出所有的成员数据,用四个成员函数分别设置姓名、单位、电话号码和邮编,再用四个成员函数分别获取姓名、单位、电话号码和邮编。主函数完成简单的测试工作。具体要求如下:(1)私有数据成员
char *pName;//
char *pSchool;
char *pNum;
char
Box[10];(2)公有成员函数
void Print(void);
//输出数据成员
//释放数据成员占用的void Init(char *,char *,char *,char *);
//完成初始化
void FreeSpace(void);空间
void SetName(char *name);void SetScool(char *unit);void SetNum(char *num);void SetBox(char *mailnum);char *GetName(void);char *GetScool(void);char *GetNum(void);char *GetBox(void);
//置姓名
//学校名称 //置电话号码 //置邮编 //取姓名 //取学校 //取电话号码 //取邮编
//单位 //电话号码 //邮编
(3)在主函数中完成对该类测试,定义两个对象c1和c2,分别两个对象的成员进行初始化、值设置并输出测试结果。
9.打印日历。
根据所输入的年份打印该年的日历。主要功能函数如下: void printmonth(int);//打印每个月的日历
void printhead(int);
//打印日历每个月的头,并将打印位置移到该月第一天的星期几处
int firstday(int);
//计算第一天是星期几 int daysofmonth(int);//该月有多少天 int isleap(int);
//判断是否是闰年
需定义两个全局变量year和weekday,分别存放年份 和 每个月的第一天是星期几
10.集合的操作
定义一个求两个集合的交集的类DataSet。并在主函数中用两个字符串进行测试。具体要求如下:
1)私有数据成员:
char *p1, *p2;指向存放两个原始数据集合的指针。
char *p;指向复制出来的两个集合的交集数据的指针。
2)公有成员函数:
DataSet(char a[ ], char b[ ]): 构造函数,提供原始数组,同时也要根据两个数组中较大的一个初始化指针p所指向的内存。
void fun(): 功能函数,求交集。要求交集中无重复字符。
void print(): 输出函数,输出原始数据及结果。
~DataSet(): 析构函数,实现必要的功能。
大综合设计题
设计题目一:学生成绩管理系统
1.系统概要
该系统完成学生信息的输入,插入,删除一个学生信息,修改,查找学生信息,计算学生的总分,并能按学生的总分排序。
2.基本功能要求
(1)按顺序输入若干个学生信息
(2)插入一个学生信息(先输入插入位置,再输入学生信息)(3)删除一个学生信息(先删除插入位置,再删除学生信息)(4)修改已知学号的学生信息(按学号来找)(5)查找已知学号的学生信息(按姓名来找)(6)统计一个学生的总分成绩(7)按总分从高到低输出学生成绩表(8)显示所有学生的信息(9)退出。
3.各功能模块的程序流程图。(学生完成)
4.完整的源程序代码。(学生设计完成)
设计题目二:通讯录管理系统
1.系统概要
该系统的功能是实现通讯录管理。
2.基本功能要求
(1)输入姓名、单位、电话号码(2)显示上述内容(3)按姓名查找后显示(4)删除有关记录(5)增加记录(6)保存修改后的文件
(7)显示修改后的文件
3.各功能模块的程序流程图。(学生完成)
4.完整的源程序代码。(学生设计完成)
设计题目三:小型特殊计算器
1.系统概要
本程序的功能是实现一个特殊的计算器,可以实现复数、有理数、矩阵和集合的特殊计算。程序可以实现复数、有理数的加、减、乘、除,可以实现矩阵的加法、减法和乘法运算,也可以实现集合的求交集、并集、子集的运算。注:可任选两种运算。
2.基本功能要求
(1)功能选择可以用菜单来实现 例如:请选择您的计算内容:
1.复数计算 2.有理数计算 3.矩阵计算 4.集合计算 0.退出
用户通过输入不同的数字进入不同的菜单。次级菜单主要显示本程序的功能,主要的功能有加法、减法、乘法和除法以及集合的求交集、求并集、求子集。(2)运行时给出明确的提示信息。
比如,输入一个什么类型的数据。根据用户的输入计算输出结果。由于数据类型比较多,可以一次输入第一个复数的实部,第一个复数的虚部,再输入第二个复数的实部、虚部。矩阵运算需要先输入矩阵的行数和列数,然后依次输出矩阵的第一行第一列的元素、第一行第二列的元素等等,依次类推。有理数运算需要一次输入有理数的分子、分母。集合运算需要输入集合的元素个数,然后依次输入集合中的每一个元素。
3.各功能模块的程序流程图。(学生完成)
4.完整的源程序代码。(学生设计完成)
第五篇:C语言课程设计报告-学生成绩管理系统(vc)
一、实践的目的和要求
加深对《C语言》课程所学知识的理解,进一步巩固C语言语法规则。学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备解决综合性实际问题的能力。
二、实践内容
在熟练掌握C语言的基本知识:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的使用)等。进一步掌握各种函数的应用,包括时间函数、绘图函数,以及文件的读写操作等。
三、实践任务 1.欢迎画面
2.学生成绩管理系统(自己设计界面)3.异或加密与解密
(1)文件加密
(2)文件解密 说明:将某一已知文件的内容以字符形式读出,与密钥(用户从键盘输入)的对应字符进行异或操作即可,解密同样如此。如:设原文为ab1234,密钥为56,则有 ab1234 565656
按二进制进行异或操作即可得到密文(乱码)。4.移位加密与解密(1)文件加密(2)文件解密
说明:将某一已知文件的内容(限于英文字母)以字符形式读出,根据密钥k(用户从键盘输入)将对应字符进行移位操作即可,解密时移动方向相反。
如:设原文为abcdef,密钥为5,则有
abcdef 每个字母按字母表向后移动位(注:z后接a)fghijkl 可得到密文(乱码)。5.辅助运算(1)整数N模m的乘法逆t
要求:输入整数N和m,求出t,若t不存在,给出信息。提示:这三个数满足:N*t%m=1,使用穷举法。
例如:当N为11,m为26时,由于(11×19)%26=1,所以11模26的乘法逆为19。(2)统计字母个数
要求:输入一段英文字母,统计各个字母的个数,并按个数从大到小排序输出。
提示:字母大小写等价。输出格式为:字母:个数。(3)OTP加密
要求:输入同等长度的原文x和密钥k(英文字母),根据公式 c=(x+k)%26 得到密文,并输出。
提示:将26个字母按0~25编号,将原文字母和对应位置的密钥字母的编号按上述公式进行计算后得到一个新的字母。
四、设计流程图
流程图另附!
五、相关程序 1 欢迎画面
#include
initgraph(&gd,&gm,“c: urboc2”);Copy();DrawSnow();getch();closegraph();}
void Copy(){
setcolor(0);
setfillstyle(SOLID_FILL,15);fillellipse(200,200,4,4);size=imagesize(196,196,204,204);save1=malloc(size);save2=malloc(size);
getimage(196,196,204,204,save1);getimage(96,96,104,104,save2);}
void Pr(){
int s[15]={0,100,150,200,150,200,250,150,250,300,250,150,100,250,350};setcolor(change/10);settextstyle(0,0,4);
outtextxy(150,200,“Welcome!!”);sound(s[change/10]);}void DrawSnow(){int i;int sx[62];randomize();for(i=0;i<62;i++)sx[i]=(i+2)*10;cleardevice();while(!kbhit()){ Pr();
if(snownum!=100){
snow[snownum].speed=2+random(5);i=random(62);
snow[snownum].x=sx[i];
snow[snownum].y=10-random(100);} for(i=0;i putimage(snow[i].x,snow[i].y,save2,COPY_PUT);Pr(); if(snownum!=100)snownum++;/*delay(300);*/ setfillstyle(SOLID_FILL,15);for(i=0;i snow[i].y+=snow[i].speed; putimage(snow[i].x,snow[i].y,save1,COPY_PUT);if(snow[i].y>500) snow[i].y=10-random(200);} change++;if(change==140)change=10;} nosound();} 2学生成绩管理系统(自己设计界面)#define N 1 struct student {char num[10];char name[10];int score[4];float ave;}stu[N];main() {int i,j,max,maxi,sum;float average;for(i=0;i {printf(“Please input scores of student %d :n”,i+1);printf(“NO.:”); scanf(“%s”,stu[i].num);printf(“name:”); scanf(“%s”,stu[i].name);for(j=0;j<3;j++) {printf(“score %d :”,j+1);scanf(“%d”,&stu[i].score[j]);} } average=0;max=0;maxi=0;for(i=0;i for(j=0;j<3;j++)sum+=stu[i].score[j];stu[i].ave=sum/3.0;average+=stu[i].ave;if(sum>max){max=sum;maxi=i;} } average/=N; printf(“ NO.name score1 score2 score3 averagen”);for(i=0;i {printf(“%5s”,stu[i].num); printf(“%10s”,stu[i].name);for(j=0;j<3;j++) printf(“%9d”,stu[i].score[j]);printf(“%8.2fn”,stu[i].ave);} printf(“average=%6.2fn”,average); printf(“The highest score is : %s,score total :%dn”,stu[maxi].name,max);getch();} 3.异或加密与解密 #include void jiami(char *in,char *pwd,char *out);void main(int argc,char *argv[]){ char in[30];char out[30];char pwd[8];if(argc!=4){ printf(“Input file name:n”);gets(in); printf(“Please enter password:n”);gets(pwd); printf(“Output file name:n”);gets(out); jiami(in,pwd,out);} else { strcpy(in,argv[1]);strcpy(pwd,argv[2]);strcpy(out,argv[3]);jiami(in,pwd,out);} } void jiami(char *in,char *pwd,char *out_file){ FILE *fp1,*fp2;register char ch;int j=0;int k=0; fp1=fopen(in,“rb”);if(fp1==NULL){ printf(“Cannot open in-file!n”);exit(1);} fp2=fopen(out_file,“wb”);if(fp2==NULL){ printf(“Cannot open or create output-file!n”);exit(1);} while(pwd[++k]);ch=fgetc(fp1);while(!feof(fp1)){ fputc(ch^pwd[j>=k?j=0:j++],fp2);ch=fgetc(fp1);} fclose(fp1);fclose(fp2);} 4.移位加密与解密 #include“stdio.h” main(){ int choice=0,k;FILE *fp1,*fp2; char c,filename1[30],filename2[30]; printf(“Please input two deferent filename:”);scanf(“%s%s”,filename1,filename2);printf(“Please input the password :n”);scanf(“%d”,&k); if((fp1=fopen(filename1,“r”))==NULL) printf(“nERROR!CAN NOT OPEN THE FILEn”);else{ fp2=fopen(filename2,“w”); printf(“nChoose:(1-jiami 2-jiemi)”);scanf(“%d”, &choice);switch(choice){ case 1: do{ c=getc(fp1); if(((c>='a')&&(c<='z'-k))||((c>='A')&&(c<='Z'-k)))putc(c+k,fp2); else if(((c>'z'-k)&&(c<='z'))||((c>'Z'-k)&&(c<='Z')))putc(c-(26-k),fp2);else putc(c,fp2);}while(c!=EOF);break;case 2: do{ c=getc(fp1); if(((c>='a'+k)&&(c<='z'))||((c>='A'+k)&&(c<='Z')))putc(c-k,fp2); else if(((c>='a')&&(c<'a'+k))||((c>='A')&&(c<'A'+k)))putc(c+(26-k),fp2);else putc(c,fp2);}while(c!=EOF);break; default: printf(“nYou have choose a wrong number!Please choose again!”);} } fclose(fp1);fclose(fp2);} 5.辅助运算 (1)整数N模m的乘法逆t main(){ unsigned n,m,t=1;int c; printf(“Please enter the number:n”);scanf(“%d,%d”,&n,&m);while(t<65535){ c=n*t%m;if(c==1||c==0)break;t++;} if(t==65535||c==0) printf(“Nicheng number is not exited!n”);if(c==1) printf(“T is : %dn”,t);getch();} (2)统计字母个数 #include “string.h” main(){ int i,j,t; char a[80],b[26];int c[26];char e; printf(“Please enter the letters:n”);gets(a); for(i=0;i<26;i++)b[i]='A'+i;for(i=0;i<26;i++)c[i]=0; for(j=0;j<80;j++){for(i=0;i<26;i++){ if(a[j]==b[i]||a[j]==b[i]+32)c[i]++;} if(a[j]==' ')break;} for(j=0;j<=25;j++){for(i=0;i<=25;i++){if(c[i]>c[i+1]){ t=c[i];c[i]=c[i+1];c[i+1]=t;e=b[i];b[i]=b[i+1];b[i+1]=e;} } } for(i=25;i>=0;i--){if(c[i]!=0) printf(“The %c letter number is %d n”,b[i],c[i]);} getch();} (3)OTP加密 #include “stdio.h” main() {char a[80],b[80],c[80];int i; printf(“Please enter the x :n”);gets(a); printf(“Please enter the k :n”);gets(b); for(i=0;i<80;i++)c[i]=(a[i]+b[i])%26;printf(“The result is :n”);for(i=0;i<80&&c[i]!=' ';i++)printf(“%c”,c[i]);getch();} 六 心得体会 通过此次C语言程序设计实践,本人实在是获益不浅!C语言是上个学期开的课程,所以这个学期并没怎么看过,当要开始设计的时候,还真不知从哪下手!结果,第一次的上机,我只坐了一个下午,什么也没干!回去以后,我想,这样不行,这样下去还得了!我就重新学了一遍我们上个学期的教材,发觉自已有许多都遗忘了!特别是有文件的操作,几乎是一遍空白!温习过后,开始做题!那个欢迎动画是在”C语言之家”找到的,自已改了一下,但并没做多大的改动!之后做出来的第一个程序是”统计字母个数”,因为上个学做过类似的!接着是”乘法逆”,这个我觉得比较简单!再接着是”OTP”加密!而那个学生成绩管理系统是参考了上机手册后做出来的!最后,花了最多时间的是”异或加密与解密”和”移位加解密”,几乎花了我百分之九十的时间,而且还是在一些在其他大学读计科专业的同学的帮助下和在上网查看了大量的资料之后才做出来!最后,想说两句,这次设计,让我重新掌握了C语言,而且还得到了用C语言解决实际问题的宝贵经验!七 参考文献 <