第一篇:C++课程实践报告试题及答案
任务一 一、实践任务 1.试建立一个类 PP,求出下列多项式的前 n 项的值。
n x P n x xP nx x Pnn/))()1()()1 2((1)(2 n 1 -
110nnn 二、详细设计 1、类的描述与定义(1)私有数据成员 int n:前若干项的项数。
double
x:存放 x 的值。
double *p:根据 n 的大小动态申请存放 P n(x)前 n 项的数组空间。
(2)公有成员函数 PP(int num,double x1):构造函数,初始化数据成员 n 和 x,使 p 指向动态申请的数组空间。
~PP():析构函数,释放 p 指向的动态内存空间。
double fun(int n1,double x):递归函数,用于求多项式)(x P n 的第 n1 项。注意:将递归公式中的 n 用作函数参数。本函数供 process 函数调用。
void process():完成求前 n 项的工作,并将它们存放到 p 指向的动态数组中。
void show():输出 n 和 x,并将前 n 项以每行 4 个数的形式输出到屏幕上。
2、主要函数设计
在主函数中完成对该类的测试。先输入 num 和 x1,并定义一个 PP 类的对象 items,用 num 和 x1 初始化 items 的成员 n 和 x,调用 items 的成员函数,求出并输出多项式前 num 项的值。
三、源程序清单 #include
int n;
double x;
double*p;public:
PP(int num,double x1)
{
n=num;
x=x1;
p=new double[n];
}
~PP()
{
if(p)delete []p;
}
double fun(int n1,double x);
void process();
void show();};double PP::fun(int n1,double x){
if(n1==0)return 1;
else if(n1==1)return x;
else if(n1>1)return((2*n1-1)*x*fun(n1-1,x)-(n1-1)*fun(n1-2,x))/n1;} void PP::process(){
for(int i=0;i { p[i]=fun(i,x); } } void PP::show(){ cout<<“n=”< for(int i=0;i { cout< if((i+1)%4==0)cout< } } void main(){ int num; double x1; cout<<“请输入 num 和 x1:”; cin>>num>>x1; PP items(num,x1); items.process(); items.show();} 任务二 一、实践任务 2.试建立一个类 SP,求k k k kn k n f ....3 2 1),(,另有辅助函数 power(m,n)用于求nm。 二、详细设计 1、类的描述与定义(1)私有数据成员 int n,k:存放公式中 n 和 k 的值;(2)公有成员函数 SP(int n1,int k1):构造函数,初始化成员数据 n 和 k。 int power(int m, int n):求 m n。 int fun():求公式的累加和。 void show():输出求得的结果。 2、主要函数设计 在主程序中定义对象 s,对该类进行测试。 三、源程序清单 #include private: int n,k;public: SP(int n1,int k1) { n=n1; k=k1; } int power(int m,int n); int fun(); void show();};int SP::power(int m,int n){ int s=1; for(int i=0;i { s*=m; } return s;} int SP::fun(){ int s=0; for(int i=1;i<=n;i++) { s+=power(i,k); } return s;} void SP::show(){ cout<<“f(”< int n1,k1; cout<<“请输入 n1,k1:”; cin>>n1>>k1; SP s(n1,k1); s.fun(); s.show();} 任务三 一、实践任务 3.建立一个类 MOVE,不进行排序,将数组中小于平均值的元素放到数组的左边,大于平均值的元素放到数组的右边。 二、详细设计 1、类的描述与定义(1)私有数据成员 float array[20]:一维整型数组。 int n:数组中元素的个数。 (2)公有成员函数 MOVE(float b[],int m):构造函数,初始化成员数据。 void average():输出平均值,并将数组中的元素按要求重新放置。 void print():输出一维数组。 2、主要函数设计 在主程序中用数据{1.3,6.2,3,9.1,4.8,7.4,5.6,9.2,2.3}对该类进行测试。 三、源程序清单 #include float array[20]; int n;public: MOVE(float b[],int m) { for(int i=0;i { array[i]=b[i]; } n=m; } void average(); void print(); ~MOVE() {};};void MOVE::average(){ float ave=0; int i,j; for(i=0;i { ave+=array[i]; } ave/=n; cout< float turn[20]; j=0; for(i=0;i { if(array[i]<=ave) { turn[j]=array[i]; j++; } } j=0; for(i=0;i { if(array[i]>ave) { turn[n-1-j]=array[i]; j++; } } for(i=0;i { array[i]=turn[i]; } } void MOVE::print(){ for(int i=0;i cout< float b1[]={1.3,6.2,3,9.1,4.8,7.4,5.6,9.2,2.3}; int num; num=sizeof(b1)/sizeof(float); MOVE s(b1,num); s.average(); s.print();} 任务四 一、实践任务 4.建立一个类 MOVE,将数组中最大元素的值与最小元素的值互换。 二、详细设计 1、类的描述与定义(1)私有数据成员 int *array:一维整型数组。 int n:数组中元素的个数。 (2)公有成员函数 MOVE(int b[],int m):构造函数,初始化成员数据。 void exchange():输出平均值,并将数组中的元素按要求重新放置。 void print():输出一维数组。 ~MOVE():析构函数。 2、主要函数设计 在主程序中用数据{21,65,43,87,12,84,44,97,32,55}对该类进行测试。 三、源程序清单 #include int *array; int n;public: MOVE(int b[],int m) { array=new int[m]; n=m; for(int i=0;i { array[i]=b[i]; } } void exchange(); void print(); ~MOVE() { if(array)delete array; } };void MOVE::exchange() { float ave=0; for(int i=0;i { ave+=array[i]; } ave/=n; cout<<“平均值为”< int max,min; max=min=array[0]; int m; for(i=0,m=0;i { if(array[i]>=max)m=i,max=array[i]; } int l; for(i=0,l=0;i { if(array[i] } i=array[m],array[m]=array[l],array[l]=i; } void MOVE::print() { for(int i=0;i cout< { int text[]={21,65,43,87,12,84,44,97,32,55}; int num; num=sizeof(text)/sizeof(int); MOVE s(text,num); s.print(); cout< s.exchange(); s.print();} 任务五 一、实践任务 定义一个类 Palindrome,实现绝对回文数。设计一个算法实现对任意整型数字判断是否为绝对回文数。所谓绝对回文数,是指十进制数和二进制数均对称的数。 二、详细设计 1、类的描述与定义(1)私有数据成员 int n:整型数字。 int y: 标记是否为回文数。 (2)公有成员函数 Palindrome(int x):构造函数,根据 x 参数初始化数据成员 n,y 初始化为 0。 void huiwen():判断数 n 是否为绝对回文数。 void show():若该数为回文数,则在屏幕显示。 2、主要函数设计 在主程序中定义 int a,由键盘输入数字。定义一个 Palindrome 类对象 p,用 a 初始化 p,完成对该类的测试。 三、源程序清单 #include int n; int y;public: Palindrome(int x) { n=x; y=0; } void huiwen(); void show();};void Palindrome::huiwen(){ int i=0,j=0; int m; m=n; while(m) { m/=10; i++; } m=n; while(m) { m/=2; j++; } int*s10=new int[i]; int*s2=new int[j]; m=n; for(int k=0;k { s10[i-1-k]=m%10; m/=10; } m=n; for(k=0;k { s2[j-1-k]=m%2; m/=2; } int num10=0; for(k=0;k { if(s10[i-1-k]==s10[k])num10++; else break; } int num2=0; for(k=0;k { if(s2[j-1-k]==s2[k])num2++; else break; } if(num10==(i/2)&&num2==(j/2))y=1; } void Palindrome::show(){ int i=0,j=0; int m; m=n; while(m) { m/=10; i++; } m=n; while(m) { m/=2; j++; } int*s10=new int[i+1]; int*s2=new int[j+1]; m=n; for(int k=0;k { s10[i-1-k]=m%10; m/=10; } m=n; for(k=0;k { s2[j-1-k]=m%2; m/=2; } if(y) { cout<<“该数为绝对回文数!:”< cout<<“十进制表示为:”; for(k=0;k cout< cout<<“二进制表示为:”; for(k=0;k cout< } else { cout<<“该数不是绝对回文数!:”< cout<<“十进制表示为:”; for(k=0;k cout< cout<<“二进制表示为:”; for(k=0;k cout< } cout< int a; cout<<“请输入一个数字:”; cin>>a; Palindrome p(a); p.huiwen(); p.show();} 任务六 一、实践任务 6.定义一个字符串类 String,实现判断该字符串是否为回文字符串。所谓回文字符串,是 指该字符串左右对称。例如字符串“123321”是回文字符串。 二、详细设计 1、类的描述与定义(1)私有数据成员 char *str; int y:标记是否为回文字符串。 (2)公有成员函数 String(char *s):构造函数,用给定的参数 s 初始化数据成员 str。y 初始化为 0。 void huiwen():判断 str 所指向的字符串是否为回文字符串。 void show():在屏幕上显示字符串。 2、主要函数设计 在主程序中定义字符串 char s[]=”ababcedbaba”作为原始字符串。定义一个 String 类对象 test,用 s 初始化 test,完成对该类的测试。 三、源程序清单 #include char*str; int y;public: String(char*s) { int n=strlen(s); str=new char[n+1]; strcpy(str,s); y=0; } void huiwen(); void show(); ~String() { if(str)delete []str;} };void String::huiwen(){ int n,judge=0; n=strlen(str); for(int i=0;i<(n/2);i++) { if(str[i]==str[n-1-i])judge++; } if(judge==i)y=1;} void String::show()//输出; { if(y==1)cout<<“y=1,¸该字符串是回文数”< else cout<<“y=0,该字符串不是回文数”< char s[]=“ababcedbaba”; String test(s); test.huiwen(); test.show();} 任务七 一、实践任务 7.建立一个类 PHALANX,生成并显示一个折叠方阵。折叠方阵如下图所示。折叠方阵的生成过程为:起始数置于方阵的左上角,然后从起始数开始递增,依次折叠构成方阵。 二、详细设计 1、类的描述与定义(1)私有数据成员 1 … 1 1 4 9 16 int(*p)[20]:指向按照折叠规律存放方阵的二维整型数组。 int startnum:折叠方阵的起始数。 int n:存放方针的层数。 (2)公有成员函数 PHALANX(int s, int m):构造函数,初始化成员数据。 void process():生成起始数为 startnum 的 n 行方阵。 void print():输出折叠方阵。 ~ PHALANX():析构函数。 2、主要函数设计 在主程序中对该类进行测试。 三、源程序清单 #include int(*p)[20]; int startnum; int n; public: phalanx(int s[20][20],int m) { startnum=1; p=s; n=m; } void process() { p[0][0]=startnum; for(int i=0;i for(int j=0;j {if(i>j){p[i][j]=1+i*i+i+i-j;} else{p[i][j]=1+j*j+i;}} } void print() { for(int i=0;i { for(int j=0;j } } ~ phalanx(){ } }; void main() { int m; int s[20][20]; cout<<“请输入折叠层数:”; cin>>m; cout<<“n”; phalanx pp(s,m); pp.process(); pp.print(); } 中南大学 本科生课程设计(实践)任务书、设计报告 (C++程序设计) 题 目 学生姓名 指导教师 C++程序设计实践 * * 孙 岱 学 院 地球科学与信息物理学院 专业班级 信息物理工程类1106班 学生学号 01451106** 计算机基础教学实验中心 2012年 7 月 日 C++程序设计实践报告书 C++是一种使用非常广泛的电脑程式设计语言,在当今网络如此发达的时代能够运用C++语言进行编程显得尤为重要。它是一种静态资料类型检查的,支援多范型的通用程式设计语言。C++支援程序化程式设计、资料抽象化、面向对象程式设计、泛型程式设计、基于原则设计等多种程式设计风格。在系统学习完《C++程序设计基础》课程后,我们在老师的指导下进行了这次C++程序设计实践,主要以visual C++6.0为编译环境,重点使用了visual C++ MFC编程实现实践所要求的功能。 【任务描述】 这次实践采用了上机实践与老师集体辅导结合的方式,以完成辅导老师下发的《C++语言课程设计任务书》中指定任务与要求为目的,要求我们在已学过的《C++程序设计基础》所掌握的一些C++语言的结构和函数的基础上,以全新的角度去感知和运用C++语言进行一些具有相关目的和功能的程序设计和编译。在这次实践中,我们统一以visual C++ 6.0为编译系统,使用visual C++ MFC编程来达到和完成辅导老师给的《C++语言课程设计任务书》中给出的题目,其中部分题目以基本对话框为应用程序的框架,另一部分则设计为单文档界面(SDI)应用程序。这些程序都具有不同的设计目的和应用功能,运用了常用的基本控件,如静态文本框、命令按钮、编辑框、复选框、列表框、组合框、滚动条等。 本次实践可分为三部分: 一、基于对话框的Windows应用程序: 这部分以知识要点掌握与编程实例主辅结合的方式,让我们基本掌握了基于对话框的应用程序的创建过程,建立基于对话框的 MFC 应用程序框架,放置控件并设置控件属性,以及为控件连接变量(即为控件命名),添加并且编写消息处理函数。在这部分实践中,我按照任务书中要求按照任务书所给的实例,基本掌握了基于对话框的 MFC 应用程序中各常用的基本控件的使用。在完成对MFC编程的初步了解后,我们按《C++语言课程设计任务书》所给出的题目和要求完成了相关基于对话框的 MFC 应用程序的编译。实践完成了以下任务和要求: 1.编写一个如图所示的应用程序。若单击“复制”按钮,则把上面的编辑框中的内容复制到下面的编辑框中;若单击“结束”按钮,则退出程序的运行。 2.输入一元二次方程 ax2 +bx+c=0 的系数 a、b、c,计算并输出两个根 x1、x2。 3.编写一个能对列表框进行项目添加、修改和删除操作的应用程序。 4.设计如图所示的对话框。若选定了“日期”或“时间”复选框,则在对应的只读编辑框中显示系统当前日期或时间。 5.设计如图所示的对话框。单击“确定”按钮后,在列表框中显示选择的信息。 二、文档/视图结构应用程序: 文档/视图结构的思想是将数据的管理与显示分离,其中文档用于管理应用程序的数据,而视图是用户界面,用于显示、打印文档中的数据,并管理与用户的交互。在这部分实践过程中,通过对任务书中介绍的几种SDI结构的典型应用程序来了解其结构及设计方法,学习和实践了典型应用包括:利用画笔、画刷等工具及位图处理的方法实现文字和图形的输出。利用定时器控件制作动画程序。对鼠标和键盘进行编程的基本方法。文件、字体、颜色等几种通用对话框的使用方法及自定义对话框的设计、调用方法。菜单的设计方法。 通过课程实践,以及与同学之间的讨论,我们完成了这一阶段的任务要求: 6.编写一个程序,绘制如图所示的-2π~2π 之间的 sin 曲线。 7.设计一个如图所示的画图程序。要求按下鼠标右键画圆,按住鼠标左键移动画线。(图略) 8.用定时器控制蝴蝶在窗口中飞舞,如图所示。(图略) 9.设计一个如图所示的应用程序。若用户单击左键,则弹出输入成绩对话框,选择 OK 后平均成绩和总分在窗口的客户区输出。(图略) 10.设计如图所示的菜单,并编写相应用的消息处理函数。(图略) 三、完成综合题的程序设计: 将实践过程中选择3~5题(或类似的题),做成一个综合程序,要求通过菜单调用各部分功能。可自行组织和发挥,使其安排合适。 【系统设计思想】 首先建立一个单文档结构的应用程序作为综合程序的主程序,通过对菜单的设计完成与所需调用的各个对话框功能相适应的编辑。利用对话框类资源创建自己的对话框,然后建立成与实践中3~5题相对应的对话框,并分别按要求进行相关功能的实现。然后建立对话框类CMyDlg,在调用的地方建立对话框类对象CMyDlg dlg;然后dlg.DoModal();从而实现主程序对各个对话框的调用。在主程序的单文档界面的菜单中,可以对所需功能进行选择,然后调用出不同的对话框实现所系的功能,达到设计程序通过菜单调用各部分功能的目的。 【系统功能】 设计的综合程序以一个文档类的程序界面为依托,实现其余各个部分功能的调用。对书目管理、时间显示以及教师综合信息管理者三部分进行了整合,达到了对各个部分功能之间的调用。在主界面中,我们可以对所需功能进行选择,从而到达不同的对话框界面进行不同功能的交互。当我们在菜单中选择“书目管理”时,程序自动弹出书目管理对话框,然后我们能对列表框进行项目添加、修改和删除操作等。而我们如果在主界面的菜单中选择“时间显示”,则系统会跳至另一个对话框界面,这个界面可以对当前的时间进行显示,在对话框中若选择了“日期”或者“时间”复选框,则在对应的只读编辑框中显示系统当前的日期或时间,从而实现了对系统当前时间信息的捕获。如果我们在最初的主界面菜单选择了“教师综合信息管理”,则在弹出的对话框中我们可以实现对教师姓名、性别、爱好、工龄以及职称进行选择。 【设计过程】 首先打开VC++ 6.0编译系统,因为我设计的综合程序以一个文档类的程序界面为依托,实现其余各个部分功能的调用。对书目管理、时间显示以及教师综合信息管理者三部分进行了整合,从而达到了对各个部分功能之间的调用。所以创建过程如下: 按照任务书要求设定工程名为“xw1106_0145110626“,利用 AppWizard 创建一个 SDI 应用程序框架。 在工作区中选定“ ResourceView ”,展开 Menu,双击其中的 IDR_MAINFRAME,可以看到由 AppWizard 生成的标准菜单。首先删除原有菜单项,然后添加自己所需要的菜单,添加方式为:双击空白菜单框,弹出“ Menu Item Properties ”,输入菜单项的标题(名称)。若菜单项有一个子菜单(单击会弹出了一子菜单),则选定“弹出”,否则不要选定“弹出”;要输入一条分割线,则选定“分隔符”。我将菜单栏设定为三项,分别为“菜单”、“小工具”以及“QQ”,其中菜单包含三个子选项分别为“方程求解/时间显示/书目管理”,小工具包含“复制/字符游戏”,而“QQ”则是通过进程方式实现对外部软件QQ的调用。 利用“CDialog dlg;dlg.DoModal();”来实现各个子菜单项所对应的对话框的调用,而QQ的调用是个人加进去的(不是任务要求),利用了进程方式调用外部exe程序:STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si,sizeof(si));si.cb = sizeof(si);ZeroMemory(&pi,sizeof(pi));if(!CreateProcess(NULL, ”G:Program FilesTencentQQBinQQ.exe “,NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi)){ MessageBox(”出错 “, ”提示 ",MB_OK|MB_ICONINFORMATION);} WaitForSingleObject(pi.hProcess,INFINITE);CloseHandle(pi.hProcess);CloseHandle(pi.hThread);【运行情况】 编译链接后程序运行正常,能实现通过菜单项调出相应的对话框的目的,以一个文档类的程序界面为依托,实现其余各个部分功能的调用。对书目管理、时间显示以及教师综合信息管理者三部分进行了整合,达到了对各个部分功能之间的调用。其中点击QQ也能很快的弹出QQ登陆界面。在主程序的单文档界面的菜单中,可以对所需功能进行选择,然后调用出不同的对话框实现所系的功能,达到设计程序通过菜单调用各部分功能的目的。 【心得体会】 在为期不到两周的课程设计中,我体会颇多,学到很多东西。我懂得了如何用 MFC编写可视化界面的应用程序,我加强了对C++的认识,复习了自己以前的知识,自己的逻辑思考能力也提高不少。从而对Microsoft Visual C++ 6.0又有了更深入的认识!在这次课程设计中,我还懂得了程序开发的一些比较重要的步骤,总之,通过这次课程设计,我收获颇丰,相信会为自己以后的学习和工作带来很大的好处。最重要的还是激发了我编程的兴趣和热情,让我从理论变成了能做一些小型程序,让我对编程更加热爱了。整体地评价这次课程设计,我认为收获很大,正如上面所说的那样,通过课程设计,既复习了以前的旧知识,又学到了一些新的知识;设计增强了我们用所学知识去解决具体问题的能力,进一步培养了我们独立思考问题和解决问题的能力。特别是学会了在Visual C++ 集成开发环境中如何调试程序的方法。当然,老师的悉心指导和同学的帮助也是不可忽视的,在此感谢本次课程设计中所有辅导老师对我的关心和帮助,诚心诚意感谢老师对我的鼓励与教导,是老师在我迷茫的时候给了我些许提示,激发了我编程的灵感;还有,我在此也十分感谢本次课程设计中同学们对我的帮助,尽管本次不是团队合作,但是他们也给了我不少的提示和帮助,我们相互沟通、共同进步。 【参考文献】 [1] 杨长兴、刘卫国.《C++程序设计》.中国铁道出版社 [2] 刘卫国、杨长兴.《C++程序设计实践教程》.中国铁道出版社 #include using namespace std; class Bus_infor { int No; static int Bus_No;char start[20];char end[20];int Bus_order; int all_tickted;int tickted;int Hour_start,Minute_start,Hour_end,Minute_end;int Hour;int Minute; public: Bus_infor *next;Bus_infor();~Bus_infor();int Get_no();int Get_all_tickted();int Get_tickted();int Get_bus_order(); char *Get_start();char *Get_end();void addr(); void Order_tickt(int n);void Unorder_tickt(int n);void GetTime_start();void GetTime_end();void ShowTime();void GetTime();void Show_infor(); void input(){ cout<<“ttt按提示输入:”< cout<<“tt输入车次: ”; cin>>Bus_order; cout<<“请输入车的额定载量: ”; cin>>all_tickted; GetTime_start(); GetTime_end(); addr(); char a; cout<<“是否清空售票(y/n)?”< cin>>a; if(a=='y')tickted=0;} void input(ifstream & is) { is>>Bus_order>>start>>end>>all_tickted>>tickted>>Hour_start>>Minute_start>>Hour_end>>Minute_end; is.get(); } void output(){cout<<“客车基本信息如下:”< <<“ 发车时间:”< <<“ 起点站:”< <<“ 终点站:”< <<“行车时间”< <<“额定载量”< void output(ofstream & os) { os< < < < < < < < < < }; int Bus_infor::Bus_No=1; void Bus_infor::GetTime_start(){ int NewH=0,NewM=0;cout<<“请输入发车时间:”< void Bus_infor::GetTime_end(){ int NewH=0,NewM=0;cout<<“请输入行车时间:”< void Bus_infor::GetTime(){ if(Minute_end>=Minute_start){Minute=(Minute_end-Minute_start);Hour=(Hour_end-Hour_start);} else {Minute=(Minute_end-Minute_start+60);Hour=(Hour_end-Hour_start-1);} } void Bus_infor::ShowTime(){ cout< cout< tickted=0;} Bus_infor::~Bus_infor(){ Bus_No--;} void Bus_infor::addr(){ cout<<“请输入起点站与终点站:”< cin>>a;cin>>b;strcpy(start,a);strcpy(end,b);} char *Bus_infor::Get_start(){ return start;} char *Bus_infor::Get_end(){ return end;} int Bus_infor::Get_no(){ return No;} int Bus_infor::Get_all_tickted(){ return all_tickted;} int Bus_infor::Get_tickted(){ return tickted;} int Bus_infor::Get_bus_order(){ return Bus_order;} void Bus_infor::Order_tickt(int n){ tickted=tickted+n;} void Bus_infor::Unorder_tickt(int n){ tickted=tickted-n;}; class Bus_link{ public: Bus_link(){head=new Bus_infor;head->next=NULL;key=0;} void input();void mend();void del();int find(Bus_infor **p,int num,char *pn); int find1(Bus_infor **p,int num,char *pn); void found();void show(); void Order(); void Unorder(); void save(); void begin(); void clear(); char mainmenu(); int getkey(){ return key;} void setkey(int k){ key=k;} private: Bus_infor *head; int key;}; void Bus_link::input(){ Bus_infor *p,*p2=NULL;p=head; int n;while(p->next) p=p->next;while(n){ p2=new Bus_infor; p2->input(); p->next=p2; p2->next=NULL; p=p->next; Bus_link::setkey(1); cout<<“ttt按1继续,按0返回 : ”; cin>>n;} } void Bus_link::Order(){ Bus_infor *p;cout<<“确定购票(y/n)?”< int num; cout<<“ttt输入车次号: ”; cin>>num; if(!find1(&p,num,“^”)) { cout<<“tt找不到你要定票的车辆的内容!”< return; } cout<<“输入要定的票数 ”; int n;cin>>n; p=p->next; if((p->Get_tickted()+n)<=p->Get_all_tickted()) {p->Order_tickt(n); cout<<“谢谢使用”< else cout<<“对不起,没有足够的票数。”< } else if(X=='n')cout<<“谢谢使用”< void Bus_link::Unorder(){ Bus_infor *p;cout<<“确定退票(y/n)?”< int num; cout<<“ttt输入车次号: ”; cin>>num; if(!find1(&p,num,“^”)) { cout<<“tt找不到你要定票的车辆的内容!”< return; } cout<<“输入要退的票数 ”; int n;cin>>n; p=p->next; if((p->Get_tickted()-n)>=0) p->Unorder_tickt(n); else cout<<“对不起,数据出错!。”< } else if(X=='n')cout<<“谢谢使用”< void Bus_link::found(){ Bus_infor *p;int num=-1,n=9;char name[20]=“^”;do { cout<<“tt1:按车次查找,2:按终点站查找: ”; cin>>n;}while(n<1||n>2);if(n==1){ cout<<“ttt输入车次: ”; cin>>num;} if(n==2){ cout<<“ttt输入终点站: ”; cin>>name;} if(!find(&p,num,name)){ cout<<“tt找不到你要查找的内容!”< return;} } int Bus_link::find(Bus_infor **p1,int num,char *pn){ Bus_infor *p; p=head; int t=0; while(p->next){ (*p1)=p; if((p->next)->Get_bus_order()==num||!strcmp((p->next)->Get_end(),pn)) { (p->next)->output(); t=1; break; } p=p->next;} return t;} int Bus_link::find1(Bus_infor **p1,int num,char *pn){ Bus_infor *p;p=head;int t=0;while(p->next){ (*p1)=p; if((p->next)->Get_bus_order()==num||!strcmp((p->next)->Get_end(),pn)) {return 1;} p=p->next;} return 0;} void Bus_link::del(){ Bus_infor *p,*p2;int num;cout<<“ttt输入车次号: ”;cin>>num; if(!find(&p,num,“^”)){ cout<<“tt找不到你要删除的内容!”< return;} p2=p->next;p->next=p2->next;delete p2;Bus_link::setkey(1);} void Bus_link::show(){ Bus_infor *p;p=head;while(p->next){ (p->next)->output(); p=p->next;} } void Bus_link::mend(){ Bus_infor *p;int num=-1;char name[20]=“^”; cout<<“ttt输入车次号: ”;cin>>num; if(!find1(&p,num,name)){ cout<<“tt找不到你要修改的内容!”< return;}(p->next)->output();(p->next)->input();Bus_link::setkey(1);} void Bus_link::save(){ Bus_infor *p;p=head;ofstream os(“bus.txt”,ios::out);if(Bus_link::getkey()==1){ while(p->next) { (p->next)->output(os); p=p->next; } } cout<<“ttt文件已保存!”< Bus_infor *p,*p2;p=head;clear();long t;ifstream is(“bus.txt”,ios::in); if(!is){ ofstream os(“bus.txt”,ios::out); os.close(); return;} int num=-1;while(1){ num=-1; t=is.tellg(); is>>num; is.seekg(t); if(num<0) { is.close(); return; } p2=new Bus_infor; p2->input(is); p->next=p2; p2->next=NULL; p=p->next;} } void Bus_link::clear(){ Bus_infor *p,*p2;p=head->next;while(p){ p2=p; p=p->next; delete p2;} } char Bus_link::mainmenu(){ char n[6];cout<<“nn ---欢迎使用车票管理系统---”< 制作人 刘强 ”< <<“ 物理学院 ”< <<“ ”< <<“ 1.录入车票信息 2.浏览车票信息 <<” 3.查询车票信息 4.删除车票信息 <<“ 5.修改车票信息 6.定购车票信息 <<” 7.退还车票信息 8.保存车票信息 <<“ 0: 退出系统 <<”--------------------------“< <<”--------------------------“< <<” 请选择功能按钮: “;cin>>n;return n[0];} int main(){ Bus_link pp;int k=1;char n;pp.begin(); while(k==1){ n=pp.mainmenu(); switch(n) { case '1':pp.input();break; case '2':pp.show();break; case '3':pp.found();break; ”< case '4':pp.del();break; case '5':pp.mend();break; case '6':pp.Order();break; case '7':pp.Unorder();break; case '8':pp.save();break; case '0': if(pp.getkey()==1) { cout<<“ttt是否保存? 1 : 保存 0:不保存 : ”; cin>>k; if(k==1) pp.save(); } pp.clear(); k=0; break; } } return 0;} 心得体会 在这几周的面向对象的课程设计中,通过完成本次任务,我所收获到的东西颇丰。 利用设计这次学生信息管理的机会,使我熟练地掌握了上学期所学的C++面向对象程序编程,也更加深入理解了学生信息管理的操作原理和了解了文件的用法及其作用,为日后如何熟练使用文件打下坚实的基础。此外,本次算法的实现采用了C和C++语言面向对象编程,使我对基类的构建,派生类的使用等等各类c的知识,有更深层次的认识。 在这次课程设计中,我还懂得了程序开发的一些比较重要的步骤,如总体分析,程序模块设计等。相信通过此次课程设计会为我以后的学习和工作带来很大的好处。最重要的还是激发我对编程的兴趣和热情,让我从一个只懂理论变成了做一些小程序,让我们对编程更加热爱。 最重要的是,在这次的编程中我们不断地从源程序中寻找错误,修改错误,通过不断地更新程序提升对编程的理解。虽然现有的编程还不完美,但是执着认识到了追求完美的信念,相信在下一次的面向对面编程的过程中能将程序推向所能的极致。 通过在这次编程中和队友的携手合作,为以后的合作打下不错的默契,培养相互的信心,提高集体的凝聚力。总而言之,这次的课程设计是比较成功的。程序设计最重要的是要敢于创新,而不应该止步于旧知识的应用,唯有不安于现状,才能有更大的发展空间。 中南大学 本科生课程设计(实践)设计报告(程序设计基础)题目 MFC课程设计 学生学号 学生姓名 指导教师 学院 专业班级 计算机基础教学实验中心 2015年 06月 14 日 一、引言 MFC(Microsoft Foundation Class Library, 微软基础类库)是微软基Windows平台下的C++类库集合。MFC包含了所有与系统相关的类,其中封装了大多数的API(Application Program Interface)函数,提供了应用程序框架和开发应用程序的工具,如应用程序向导、类向导、可视化资源设计等高效工具,用消息映射处理消息响应,大大简化了Windows应用程序的开发工作,使程序员可以从繁重的编程工作中解脱出来,提高了工作效率。 程序设计实践旨在课堂学习的基础上帮助学生掌握C++应用系统的开发方法和技巧。在系统学习完《C++程序设计》这门课程后,通过实践对几个小型C++应用程序实例设计与实现过程分析,帮助学生利用C++开发应用系统的一般方法和步骤,掌握MFC的基本知识。 这次实践采用学生上机与老师集体辅导的方式,以完成老师下发的《C++语言课程设计任务书》为要求和目的,运用课堂上学习的C++基础知识,采用Visual C++ MFC编程系统,以全新的角度和感知去认识C++语言在编程方面的优越性。在实践过程中,基于对话框的MFC应用程序,达到了解基本控件,如静态文本框、命令按钮、编辑框、列表框、组合框等的使用的目的。还有理解Windows应用程序采用“消息传递、事件驱动”的运行机制。本次实践的任务主要分为两个部分: 使用Visual C++ MFC编程实现以下功能: 输入一元二次方程ax2+bx+c=0 的系数a、b、c,计算并输出两个根x1、x2.编写一个能对列表框进行项目添加、修改和删除操作的应用程序。编写一个程序,绘制-2π~2π之间的sin曲线。用定时器控制蝴蝶在窗口中飞舞。等共10道。 将第一部分中选择3~5题,做一个综合程序,要求有登陆界面和调用各部分的功能。总体设计 本次实践的主要目的就是了解和掌握运用MFC编程的一般思想和具体的操作步骤。实践主要是基于MFC的多文档对话框和单文档视图,通过实践完成第一大部分的任务之后,还要完成第二部分的综合题目。第二部分的任务由学生自主发挥,自主找资料,询问同学和老师。第一部分的任务比较简单,具体的就不再描述。关于第二部分,我做了一个基于对文档对话框。首页为一个登陆页面,需要输入用户名和密码才能登陆,登陆后的页面是把第一大部分的几个题目连接起来。达到预览的目的。 三、详细设计 实践前首先要认识AppWizard的工作环境。其项目工作区一共有三个选项卡分别为“ResourceView”“ClassView”“FileView”,中间是对话框设计界面,右边是控件工具栏。实践过程中,我们是先完成第一大部分的任务。虽然在第一次上机实践前,我仔细地阅读了老师给我们下发的资料,并且结合《C++程序设计实践教程》了解相关知识,但是在实践时结果不理想。主要是对创建对话框程序的步骤没有掌握。在经过几次尝试失败后,总结其一般步骤为:(1)建立基于对话框的MFC应用程序框架;(2)放置控件;(3)设置控件属性;(4)为控件连接变量,即为控件命名;(5)添加并且编写消息处理函数。 基于对话框的MFC程序设计,对各种控件的了解和使用显得特别重要。这里就不一一详细介绍它们的功能。控件控制栏一个有26个控件图标,每一个图标都可以看做一个对象,消息便是通过函数对它们进行操作。每一个控件都有两个重要而且必不可少的基本属性:ID和标题。ID便是该控件的标识,某些函数需要通过ID对控件进行操作。了解一定相关知识后,对课程实践有了很大的帮助。其中“输入一元二次方程ax2+bx+c=0 的系数a、b、c,计算并输出两个根x1、x2”这个题目比较复杂,而且与C++连续很紧密。其中的有这样的语句m_x1=(-b+sqrt(b*b-4*a*c))/(2*a);m_x2=(-b-sqrt(b*b-4*a*c))/(2*a),这就是我们在课堂上学习的C++基本语句,在实践过程中考验学生的灵活运用能力。完成这个题目的关键是把每个编辑框(控件)连接好变量和选的数据类型,接下来的就是编写消息处理函数。这道题很全面地体现了MFC的“消息传递、事件驱动”的思想,在操作步骤方面也在很多地方得到了实践。 MFC编程除了基于多文本对话框以外,还有很重要的一部分是基于单文档界面的应用程序,如Windows自带的Notepad程序。在本次实践的第一大部分的后5个小题就是基于单文档的。那么首先要对其有一定的了解:文档/视图结构的思想是将数据的管理与显示分离,其中文档用于管理应用程序的数据,而视图是用户界面,用于显示、打印文档中的数据,并管理与用户的交互。SDI具有文档/视图结构的应用程序框架,该框架包括应用程序类、窗口框架类、文档类和视图类,编程的任务是在文档类和视图类中添加适当的代码。其中文档类中一个重要的成员函数是OnNewDocument(),用户在此添加代码完成对数据的初始化;而视图类中最重要的成员函数是OnDraw(),通过在该函数中添加代码实现窗口内容的输出。本次实践是对单文档的典型实例,包括: • 利用画笔、画刷等工具及位图处理的方法实现文字和图形的输出。• 利用定时器控件制作动画程序。• 对鼠标和键盘进行编程的基本方法。 • 文件、字体、颜色等几种通用对话框的使用方法及自定义对话框的设计、调用方法。• 菜单的设计方法。 虽然进行充分的准备,实践中还是遇到了很多的困难和问题。在完成题目“用定时器控制蝴蝶在窗口中飞舞”时,主要的问题就是在插入蝴蝶图片的,尝试了几次都没有编译成功。最终再询问同学后,才知道是要把GIF格式的图片分割成一帧一帧,然后才能插入。最后用定时器控制,达到动态的效果。在完成了第一大部分的任务后,第二部分的综合题是一个不小的挑战对我来说。要靠自己去网上或者图书馆查找资料。在经过一番准备后,最终决定做一个相对简单的基于多文档对话框的登陆界面,把几个原来的程序文件连接起来。但是在这个过程中,完全要靠自己一步一步去探索,当然也遇到了各种各样的困难和挑战。关键是在连接各部分对话框,经过不断的实验,不断的调试程序,总结的操作步骤如下:(1)创建工程,MFC Application(exe),工程命名按要求命名;(2)工程建立后有如图对话框,将途中的静态文本框和按钮都删掉,留下空白,再使用静态文本,编辑框,按钮和静态图片重新排版,并进行命名。注意静态图框应该第一个布置,不然运行时图片会将其他控件覆盖;(3)右击密码对应的编辑框,选择属性,选样式中的密码;(4)在Dialog上右击选择插入DIG,重复插入4个,依次作为菜单,题目1,题目2和题目3的对话框,并对其分别创建类,以菜单对话框为例,改一下表头为“菜单”,在对话框空白处双击,点OK创建类,并对其命名(假如命名为MyMenu);(5)回到登录界面的对话框,双击登录控件,出现如图按钮,点击OK,在顶端添加#include”MyMenu.h”,并OnButton1下添加以下代码CString c_user,c_password;m_user.GetWindowText(c_user);m_password.GetWindowText(c_password);if(c_user.IsEmpty()||c_password.IsEmpty()){ MessageBox(“用户名或密码不能为空”,“用户登录信息”); return;} if(c_user==“123”&&c_password==“123”){ CMyMenu dlg; dlg.DoModal();//这两段代码是用于调用菜单对话框 } else { MessageBox(“用户名或密码不正确”,“提示”,MB_ICONINFORMATION); return;对对话框添加背景图片。在如下图文件上右击,选择引入,然后导入已准备好的bmp格式的图片,然后选择登录界面的静态图框右击,进行如图操作,这样图片就加入了,它会改掉按钮和编辑框,这没关系,运行后会显示出来的;(7)通过以上操作,已经做好了登录界面和实现和登录界面与菜单对话框的连接,现在进行菜单对话框的编辑。将原有的按钮删除,自己加入按钮并命名;(8)双击题目1,点OK,在代码页的顶端加入如图代码,并在OnButton1下加入以下代码 CT1 dlg;dlg.DoModal();其他的按相同操作。 四、设计总结 为期为两周的课程实践中,我体会颇多,学到的东西也很多。我懂得了如何运用MFC编写可视化界面的应用程序,加强了对C++的认识,复习了以前的知识,自己的逻辑思考能力,解决问题的能力也提高了不少。从而对Microsoft Visual C++有了更加深刻的认识和体会!在这次课程设计实践过程中我还懂得了一些程序开发的重要步骤,总之,在这次课程设计实践中,我收获颇丰。 对于对任务的完成情况,第一部分主要按老师的步骤完成。第二部分,由学生自主选题,自主设计完成。总的来说,我个人对自己的完成情况感觉良好。当然,老师的悉心指导和同学的帮助是不能忽视的,在此感谢所有在本次课程设计实践过程中对我细心指导的老师和不断鼓励和帮助我的同学们。 总之,此次课程实践是对学生动手动脑的一次很好的锻炼,为学生的今后发展奠定基础。第二篇:C++实践报告
第三篇:c++课程实践火车票管理系统
第四篇:c++课程心得体会
第五篇:中南大学(C++实践报告)