资源描述
软件课程设计报告班 级: 姓 名: 学 号: 指导老师: 中国矿业大学计算机科学与技术学院40 第一阶段 面向过程第二题:1. 题目: 编程序,从键盘输入正整数n,求出n与其反序数之和并输出。例如,输入2038,输出应为 2038+8302=10340。2.需求分析:设计一个程序可以实现求其与其反序数之和。根据题目要求,规定如下:测试数据:输入数据:2038输出数据:10340输入数据:1046输出数据:74473.设计概要: (1)定义正型变量a为用户输入值;(2)求a的反序数;(3)定义整型变量s并求和;(4)输出s的值;(5)主程序流程:Step1:让用户输入一个整数a;Step2:用do-while循环求其反序数;Step3:求和并输出;4详细设计与编码:(1) 流程图:用户输入a进入do-while循环Yes判断条件no输出反序数 输出结果s(2)源程序:#include#includeusing namespace std;int main()int a,b,c,t,s=0;couta;t=a;c=log(a)/log(10)+1; /求整数a的位数c=c-1;do /求a的反序数b=a%10;a=a/10;s+=b*pow(10,c);c-;while(a!=0);coutt的反序数为:sendl;s=s+t; /求a与其反序数之和coutt和其反序数之和为:sendl;return 0; 5用户使用说明:Step1:打开程序;Step2:输入要求的整数;Step3:得出结果6测试分析: 输入2038输入1046分析:经过多次输入测试试验后得到了预期值,说明程序的正确性。7.设计体会:通过实验体会了设计程序的方法与步骤,加深了对do-while循环使用方法的的了解。第四题:1.题目: 编程序,输入正整数m,它代表一个人民币钱数(元数)。求取这样一个方案,使用最少张数的人民币纸币,凑成上述的钱数m,并输出求取结果。注意,现在共有7种元以上面值的人民币纸币,分别为:100,50,20,10,5,2,1。2.需求分析:设计一个程序,可以实现输入一个人民币钱数输出使用最少的人民币纸币的张数。根据题目要求,规定如下:测试数据:输入数据:150输出数据:2输入数据:176输出数据:53.设计概要: (1)定义正型变量n为用户输入值;(2)定义数组a存放人民币纸币的不同面值;(3)定义整型变量s并求和;(4)输出s的值;(5)主程序流程:Step1:让用户输入一个钱数n;Step2:用for循环求和;Step3:输出s的值;4详细设计与编码:(1)流程图:用户输入n进入for循环Yes判断条件no输出结果s(2)源程序:#include using namespace std; int a8=0,100,50,20,10,5,2,1;/定义数组a存放7种不同人民币纸币的面值int main() int n,i,s=0; coutn; /输入要求的钱数afor (i=1;i=7;i+) /求使用最少的人民币纸币的张数s s+=n/ai; n%=ai; coutsendl; return 0; 5用户使用说明:Step1:打开程序;Step2:输入要求的钱数;Step3:得出结果6测试分析:输入数据:150输入数据:176分析:经过多次输入测试试验后得到了预期值,说明程序的正确性。7.设计体会:通过实验锻炼了编辑程序的思维过程,熟悉了for循环的使用方法。第二阶段 面向对象第一题:1.题目:自定义一个示意性的复数类型complex,其中含有若干个成员函数,使用该类可以完成复数的加法以及对复数的输出。请完成类定义,并编制主函数,说明complex类对象,对定义的各成员函数进行调用。进一步,在类中添加对复数进行其他基本运算(如,复数减、乘、除、取模等)的相应成员函数,并通过主函数处的调用来验证各函数的使用正确性。2.需求分析:设计一个程序,可以实现对复数进行加、减、乘、除、取模等基本运算。根据题目要求,规定如下:测试数据:输入数据:c1=(3,4i),c2=(5,-10i)输出数据:|c1|=5|c2|=11.1803c1+c2=(8,-6i)c1-c2=(-2,14i)c1*c2=(55,-10i)c1/c2=(-0.2,0.4i)3.设计概要: (1)定义一个complex类作为复数类型;(2)定义成员函数addCom(),minCom(),multCom(),diviCom(),outCom ()来分别实现加、减、乘、除、取模等基本运算以及复数的输出操作;(3)定义成员变量real和image作为复数的实部和虚部;(4)在主函数中通过complex类来定义对象并调用相关成员函数完成相应操作;(5)主程序流程:Step1:让用户输入一个钱数n;Step2:用for循环求和;Step3:输出s的值;4详细设计与编码:(1)流程图:定义complex类进入主函数定义对象并调用成员函数输出结果(2)源程序:#include #include using namespace std;class complexpublic: complex(); /无参构造函数 complex(double r, double i):real(r),image(i) /2参构造函数 complex addCom(complex &c2); /调用者对象与对象c2相加,返回complex类对象 complex minCom(complex &c3); /调用者对象与对象c2相减,返回complex类对象 complex multCom(complex &c4); /调用者对象与对象c2相乘,返回complex类对象 complex diviCom(complex &c5); /调用者对象与对象c2相除,返回complex类对象 double lenCom(); /对调用者对象进行取模运算,返回double类型 void outCom (); /输出调用者对象的有关数据(各分量) private: double real; /复数实部 double image; /复数虚部;complex:complex()real=0;image=0;complex complex:addCom(complex &c2)complex c;c.real=real+c2.real;c.image=image+c2.image;return c;complex complex:minCom(complex &c3)complex c;c.real=real-c3.real;c.image=image-c3.image;return c;complex complex:multCom(complex &c4)complex c;c.real=real*c4.real-image*c4.image;c.image=image*c4.real+real*c4.image;return c;complex complex:diviCom(complex &c5)complex c;c.real=(real*c5.real+image*c5.image)/(c5.real*c5.real+c5.image*c5.image);c.image=(image*c5.real-real*c5.image)/(c5.real*c5.real+c5.image*c5.image);return c;double complex:lenCom()double l;l=sqrt(real*real+image*image);return l;void complex:outCom () cout(real,imagei)endl;int main() complex c1(3,4),c2(5,-10),c3,c4,c5,c6;coutc1=;c1.outCom(); coutc2=;c2.outCom(); cout|c1|=c1.lenCom()endl; cout|c2|=c2.lenCom()endl; c3=c1.addCom(c2);c4=c1.minCom(c2);c5=c1.multCom(c2);c6=c1.diviCom(c2);coutc1+c2=;c3.outCom();coutc1-c2=;c4.outCom();coutc1*c2=;c5.outCom();coutc1/c2=;c6.outCom();return 0;5用户使用说明:Step1:打开程序;Step2:输入测试数据;Step3:得出结果6测试分析:输入数据:c1=(3,4i),c2=(5,-10i)分析:测试试验后得到了预期值,说明程序的正确性。7.设计体会:通过此题的编写加深了对面向对象中类的了解,熟练了类的构造过程以及对类成员函数的调用。第六题:1.题目:编写一个具有如下样式的类模板tmplt,用于实现所谓的反序输出问题,其中使用了类型参数T(使所处理的元素类型可变化)以及普通参数n(元素个数也可变化):template class tmplt T arrn; / n个T类型的数据存放于数组arr之中public: void dataIn(); /从键盘输入n个T类型数据放入arr数组中 void reverseOut(); /将arr数组中的数据按输入的相反顺序输出; 而后编制主函数,将类模板实例化为某个具体的类并说明类对象,之后通过对象调用其负责输入数据的成员函数,再通过对象调用另一成员函数按反序输出那些输入数据。2.需求分析:设计一个程序,可以实现将类模板实例化为某个具体的类并通过对象调用其负责输入数据的成员函数,再通过对象调用另一成员函数按反序输出那些输入数据。根据题目要求,规定如下:测试数据:输入数据:0 1 2 3 4 5 6 7 8 9输出数据:9 8 7 6 5 4 3 2 1 0输入数据:1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.0输出数据:1 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1输入数据:a b c d e f g h i j输出数据:j i h g f e d c b a3.设计概要: (1)定义一个类模板tmplt;(2)定义成员函数dataIn()和reverseOut()来实现n个T类型数据的输入与输出;(3)定义成员变量arr数组来存放 n个T类型的数据;(4)在主函数中通过tmplt类模板的实例化来调用相关成员函数完成相关操作;(5)主程序流程:Step1:输入十个数据;Step2: 在主函数中调用成员函数;Step3:输出十个数据的反序;4详细设计与编码:(1)流程图:定义complex类进入主函数输入数据并调用成员函数输出结果(2)源程序:#include using namespace std;template class tmplt public: void dataIn() /从键盘输入n个T类型数据放入arr数组中 for(int i=0;iarri; void reverseOut() /将arr数组中的数据按输入的相反顺序输出for(int i=n-1;i=0;i-)coutarri ;coutendl; private:numtype arrn; / n个T类型的数据存放于数组arr之中;int main()tmplttmp1;coutplease enter 10 int numbers:endl;tmp1.dataIn();coutthe opposite order of the 10 numbers is:endl;tmp1.reverseOut();tmplttmp2;coutplease enter 10 float numbers:endl;tmp2.dataIn();coutthe opposite order of the 10 numbers is:endl;tmp2.reverseOut();tmplttmp3;coutplease enter 10 char numbers:endl;tmp3.dataIn();coutthe opposite order of the 10 numbers is:endl;tmp3.reverseOut();return 0;5用户使用说明:Step1:打开程序;Step2:输入测试数据;Step3:得出结果6测试分析:输入数据:0 1 2 3 4 5 6 7 8 91.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.0a b c d e f g h i j分析:测试试验后得到了预期的结果,说明程序的正确性。7.设计体会:通过熟悉了对类模板的使用,进一步熟练了如何通过类模板的实例化来定义对象以及对类成员函数的调用等。第三阶段 可视化编程可视化实现面向过程中的第五题:1.题目:编程序,使 用户任意输入一个年份以及该年的1月1日是星期几,而后任意指定某一天(再输入该年的任意一个月份日期),由程序计算出这一天是星期几。注意,2月份闰年为29天,非闰年为28天;可被4整除而不可被100整除的年份、或者可被400整除的年份均为闰年。2.需求分析:设计一个程序,实现一个年份以及该年的1月1日是星期几,然后再输入该年的任意一个月份日期由程序计算出这一天是星期几。根据题目要求,规定如下:测试数据:输入数据:2011 星期六 2011/1/4输出数据:您要查询的日期是星期二输入数据:2011 星期六 2011/1/15输出数据:您要查询的日期是星期六3.设计概要:(1) 设计如下对话框:(2) 给相应编辑框分别关联变量为year1,string,year,month,day,str;(3) 给“查询”按钮添加函数OnSearch();(4) 在SEARDlg.cpp源文件中的void CSEARDlg:OnSearch()添加代码。4.详细设计与编码:(1)根据概要设计中描述的进行设计:在上图中一次添加编辑框和按钮并关联变量,完成后如下:在void CSEARDlg:OnSearch()中添加如下代码:int a13=0,31,28,31,30,31,30,31,31,30,31,30,31; int i,s=7,n; UpdateData(TRUE);if(string=星期一)n=1;if(string=星期二)n=2;if(string=星期三)n=3;if(string=星期四)n=4;if(string=星期五)n=5;if(string=星期六)n=6;if(string=星期日)n=7;if (year%4=0&year%100!=0)|year%400=0)a2=29; for(i=1;iLoadIcon(IDR_MAINFRAME);void CSEARDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CSEARDlg)DDX_Text(pDX, IDC_YEAR1, year1);DDX_Text(pDX, IDC_YEAR, year);DDX_Text(pDX, IDC_MONTH, month);DDV_MinMaxInt(pDX, month, 1, 12);DDX_Text(pDX, IDC_DAY, day);DDV_MinMaxInt(pDX, day, 1, 31);DDX_Text(pDX, IDC_RESULT, str);DDX_CBString(pDX, IDC_COMBO1, string);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CSEARDlg, CDialog)/AFX_MSG_MAP(CSEARDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_SEARCH, OnSearch)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CSEARDlg message handlersBOOL CSEARDlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization herereturn TRUE; / return TRUE unless you set the focus to a controlvoid CSEARDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);/ If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For MFC applications using the document/view model,/ this is automatically done for you by the framework.void CSEARDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CSEARDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CSEARDlg:OnSearch() / TODO: Add your control notification handler code here int a13=0,31,28,31,30,31,30,31,31,30,31,30,31; int i,s=7,n; UpdateData(TRUE);if(string=星期一)n=1;if(string=星期二)n=2;if(string=星期三)n=3;if(string=星期四)n=4;if(string=星期五)n=5;if(string=星期六)n=6;if(string=星期日)n=7;if (year%4=0&year%100!=0)|year%400=0)a2=29; for(i=1;imonth;i+) s+=ai; s+=day; s%=7; s+=n; s%=7;if(s=0|s=1)s+=6;else s=s-1; switch(s) case 1: str=您要查询的日期是星期一;UpdateData(FALSE); break;case 2: str=您要查询的日期是星期二; UpdateData(FALSE);break;case 3: str=您要查询的日期是星期三; UpdateData(FALSE);break;case 4: str=您要查询的日期是星期四; UpdateData(FALSE);break;case 5: str=您要查询的日期是星期五; UpdateData(FALSE);break;case 6: str=您要查询的日期是星期六;UpdateData(FALSE); break;case 7: str=您要查询的日期是星期日; UpdateData(FALSE);break;default:str=errorn;UpdateData(FALSE);break;5用户使用说明:Step1:打开程序;Step2:输入要查询的日期;Step3:得出结果6测试分析:输入数据:输出数据:输入数据:输出数据:分析:经过多次输入数据进行测试后得到了预期的结果,说明程序了程序是正确的。7.设计体会:此次实验设计步骤较多,设计过程中出想的问题也较多,实验中通过了多次的修改与调试后才得到了最终的预期结果。通过这次实验,收获很多,积累了经验;初步了解并学会了MFC的基础编程。第四阶段 数据结构第一题:1.题目:用链表和数组两种方式分别实现栈的出栈、入栈、取栈顶元素、判空、查找等操作。2.需求分析:用链表和数组两种方式来实现栈的一系列操作,包括栈的出栈、入栈、取栈顶元素、判空、查找等操作。定义栈中数据为整型,程序中所用到的数据全为整型。打开程序后用户可根据提示选择不同的操作包括以上提到的所有操作!测试数据:(1)链表实现:请输入您要建立的栈的大小:5请选择操作: 1,进栈 2,出栈 3,查看栈顶值 4,清空栈 5,退出1请输入进栈值:1 2 3 4 5插入元素成功!请选择操作: 1,进栈 2,出栈 3,查看栈顶值 4,清空栈 5,退出25出栈请选择操作: 1,进栈 2,出栈 3,查看栈顶值 4,清空栈 5,退出3栈顶值为:4请选择操作: 1,进栈 2,出栈 3,查看栈顶值 4,清空栈 5,退出4清空完毕!(2)数组实现:请输入您要建立的栈的大小:5请选择操作: 1,进栈 2,出栈 3,查看栈顶值 4,清空栈 5,退出1请输入进栈值:0 1 2 3 4插入元素成功!请选择操作: 1,进栈 2,出栈 3,查看栈顶值 4,清空栈 5,退出2删除成功!4出栈请选择操作: 1,进栈 2,出栈 3,查看栈顶值 4,清空栈 5,退出3栈顶值为:3取值结束!请选择操作: 1,进栈 2,出栈 3,查看栈顶值 4,清空栈 5,退出4清空完毕!3.设计概要: (1)链表实现:建一个结构体Stack来表示栈,它包括栈顶指针top和栈大小length,top是Slink类型的指针,Slink是指向LNode结构类型指针,包括一个数据域dada和一个指针域next; 数组实现:建一个结构体Stack来表示栈,包括base基址指针,top栈顶指针和存储空间大小stacksize三部分;(2)定义函数InitStack() ,Push() ,Pop(), GetTop()和 ClearStack()来分别实现构造空栈,插入栈顶元素,删除栈顶元素,取栈顶元素和清空栈等操作;(3)编写主函数int main(),先定义结构体变量stack,然后初始化栈,进入dowhile循环来调用相应函数完成所有的操作。4详细设计与编码:(1)流程图:构造栈主函数初始化栈建立栈的大小进入dowhile循环判断输入m的值m=1m=2m=3m=4m=5退出出栈清空栈取栈顶值进栈(2) 源程序:/栈的链式存储#include #include #include #include typedef struct LNodeLNode *next;int data;LNode,*SLink;typedef structSLink top; / 栈顶指针 int length; / 栈中元素个数Stack;void InitStack(Stack &S) /构造一个空栈S.top=NULL;/设栈顶指针的初值为空 S.length=0;/空栈中元素个数为/InitStackvoid Push(Stack &S,int &e)/在栈顶之上插入元素 e 为新的栈顶元素SLink p;p=new LNode;/建新的结点p-data=e;p-next=S.top;S.top=p; +S.length;/Pushvoid Pop(Stack &S,int &e)/若栈不空,则删除S的栈顶元素,用e返回其值if(!S.top)cout此栈为空栈!data;LNode *q = S.top; S.top=S.top-next;delete q; / 释放被删除的结点空间 -S.length; / 栈的长度减1 /Popvoid GetTop(Stack &S,int &e)/若栈不空,取栈顶元素,用e返回其值if(!S.top)cout此栈为空栈!data;couteendl;/GetTopvoid ClearStack(Stack &S)S.top=NULL;cout清空完毕!endl;/ClearStackint main()Stack stack;InitStack(stack);int m,n,x,y,z,i=0;cout请输入您要建立的栈的大小:n;stack.length=n; docout请选择操作:endl;cout 1,进栈 2,出栈 3,查看栈顶值 4,清空栈 5,退出m;switch(m)case 1:cout请输入进栈值:z;Push(stack,z);i+;while(i!=n);cout插入元素成功!endl;break;case 2:Pop(stack,x);coutx出栈endl;break;case 3:cout栈顶值为:;GetTop(stack,y);break;case 4:ClearStack(stack);break;case 5:coutExit!endl;break;default:cout输入错误!此程序将退出!endl;exit(0);/switchwhile(m!=5);return 0;/栈的顺序存储#include #include #include const STACK_INIT_SIZE=100;/存储空间初始分配量const STACKINCREMENT=10;/存储空间分配增量typedef structint *base; /在构造之前和销毁之后,base的值为NULLint *top; /栈顶指针int stacksize;/当前已分配的存储空间,以元素为单位SqStack;void InitStack(SqStack &S)/构造一个空栈SS.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int);/存储分配失败if(!S.base)exit(0);S.top=S.base;S.stacksize=STACK_INIT_SIZE;cout初始化完毕!endl;/InitStackvoid GetTop(SqStack S,int &e) /若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORif(S.top=S.base)cout此栈为空!endl;exit(0);e=*(S.top-1);couteendl;cout取值结束!S.stacksize)/栈满,追加存储空间S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int);if(!S.base)cout新分配空间失败!endl;exit(0);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;*S.top+=e;/Pushvoid Pop(SqStack &S,int &e) /若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif(S.base=S.top)cout此栈为空栈,无法删除!endl;exit(0);e=*-S.top;cout删除成功!endl;/Popvoid ClearStack(SqStack &S)/把S置为空栈S.top=S.base;cout清空完毕!endl;/ClearStackint main()SqStack Stack;int m,n,x,y,z,i=0;InitStack(Stack);cout请输入您要建立的栈的大小:n;Stack.stacksize=n;docout请选择操作:endl;cout 1,进栈 2,出栈 3,查看栈顶值 4,清空栈 5,退出m;switch(m)case 1:cout请输入进栈值:z;Push(Stack,z);i+;while(i!=n);cout插入元素成功!endl;break;case 2:Pop(Stack,x);coutx出栈endl;break;case 3:cout栈顶值为:;GetTop(Stack,y);break;case 4:ClearStack(Stack);break;case 5:coutExit!endl;break;default:cout输入错误!此程序将退出!endl;exit(0);/switchwhile(m!=5); return 0;5用户使用说明:Step1:打开程序;Step2:输入要建立的栈的大小;Step3:选择操作Step4:得出结果6测试分析:链式栈:输入数据:5 1 2 3 4 5 输出数据:数组栈:输入数据: 0 1 2 3 4 输出数据:分析:输入测试数据后得到的结果与预期结果相同,说明程序的正确性,基本完成了进栈、出栈、取栈顶元素、清空栈、退出等基本操作,达到了程序设计的要求。7.设计体会:通过实验熟悉了数据结构中栈的链式结构及顺序存储结构,对栈的基本操作有了深刻的了解,程序编写过程中通过不断调试,找出自身的不足和对细节问题的忽视,亲身操作对这些错误有了更加深刻的记忆,为以后避免类似的错误奠定了基础。第三题:1.题目:编程序,按如下方法求A矩阵的转置矩阵B:输入两个正整数m和n,而后通过使用指针配合new运算符生成一个m行n列的二维动态数组A以及另一个n行m列的二维动态数组B,之后为A输入数据(A矩阵数据),进而求出其转置矩阵B(数据放动态数组B中)并输出结果。2.需求分析:设计一个程序,可以实现求A矩阵的转置矩阵B。根据题目要求,规定如下:测试数据:输入数据:4(行) 5(列)0 1 2 3 45 6 7 8 90 1 2 3 45 6 7 8 9输出数据:0 5 0 51 6 1 62 7 2 73 8 3 84 9 4 93.设计概要: (1)定义动态数组A,B及行列数m,n;(2)设计for循环输入数组A中的元素;(3)设计for循环输出数组A中的元素;(4)设计for循环求数组A的转置矩阵B;(5)设计for循环输出数组B中的元素;4详细设计与编码:(1)流程图:进入main函数定义动态数组A,B输入数组A的行数m列数n进入for循环输入数组A 中的元素进入for循环输出数组A 中的元素进入for循环求A 的转置矩阵B进入for循环输出数组B 中的元素(2)源程序:#include#includeiom
展开阅读全文