您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页软件课程设计报告

软件课程设计报告

来源:筏尚旅游网
软件课程设计

号:( )字 号

《软件课程设计》报告

班 级: 信科09-1班 姓 名: 谢正明 学 号: 08093518 指导老师: 张艳群 中国矿业大学计算机科学与技术学院

二〇一 一 年 一 月

1

软件课程设计

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

软件课程设计任务书

专业年级: 信科09-1班 学生姓名: 谢正明

任务下达日期: 2010年 11月1日

课程设计日期:2010年 11月1日至2011年1月2日

课程设计题目:

类别 面向过程 面向对象 图形界面 数据结构

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

题目序号 1、2、3、4、5、6、7 第二题、第四题 1、2、3、4、6、10 第一题、第二题 1、2 第一题、第二题 1、2、3、4、7、9 第一题、第二题 成绩 2

软件课程设计

软件课程设计实验报告

(1)需求分析

以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?明确规定: ·输入的形式和输出、值的范围 ·输出的形式

·程序所能达到的功能

·测试的数据:包括正确的输入和错误的输入及其相应的输出结果 (2)概要设计

说明程序中用到的所有抽象数据类型的定义,主程序的流程以及各程序模块之间的层次(调用)关系。

(3)详细设计与编码

实现概要设计中定义的数据类型和操作。要求源程序中加有适当注释,以增加程序的可读性,关键算法部分画出程序流程图。 (4)调试分析

内容包括:

· 调试过程中遇到的问题并且是如何解决的以及对设计实现的回顾讨论和分析; · 经验和体会等。

(5)用户使用说明

说明用户如何使用你编写的程序,详细列出每一步的操作步骤。

(6)测试分析

设计测试用例,分析测试结果。要求测试用例应该完整和严谨,且其测试设计应分散于需求分析、软件设计等各个过程。

(7)设计体会

主要介绍课程设计过程的收获、遇到问题及解决问题过程的思考、程序调试能力的思考。 (8)源程序及报告电子版上传服务器,报告打印一份(统一封面、目录、格式等)交指导老师。

3

软件课程设计

一、面向过程

第二题:

1. 题目:

编程序,从键盘输入正整数n,求出n与其反序数之和并输出。例如,输入2038,输出应为 2038+8302=10340。

2. 需求分析:

设计一个程序可以实现求其与其反序数之和。 根据题目要求,规定如下: 测试数据: 【输入数据】:2038 【输出数据】:2038+8302=10340 【输入数据】:2011 【输出数据】:2011+1102=3113

3.设计概要:

(1)定义长整形变量a、i、b,其中a为用户输入值,,i用于存储输入值,b用

于存储反序数,定义整形变量x用于中间变量;

(2)求反序数并存储于b中; (3)输出i+b的值。 (4)主程序流程:

第一步:让用户输入一个整数a,并存于i中;

第二步:进入while循环计算其反序数; 第三步:求输出i’+’b=i+b的值。

4.详细设计与编码

(1) 流程图:

用户输入a,并存储于i中

进入while循环 4

软件课程设计

a==0 a!=0

判断条件 输出i+b

输出结果

(2) 源程序

#include using namespace std; int main() {

long int a,b=0,i,x; cin>>a; i=a;

while(1) {

x=a%10; b=b*10+x; a=a/10;

if(a==0) break; }

cout<5.用户使用说明;

第一步:打开程序;

第二步:输入要求的数; 第三步:得出结果;

6.测试分析

第一步:输入2038

5

软件课程设计

第二步:输入2011

分析:经过输入多次不同数据测试,都取得了预期结果,这说明了程序的正确性。

7.设计体会

通过此次试验加深了对while循环的使用方法,以及合理利用中间变量来

实现程序设计。多次运用取余、求整的方法实现倒序。

第四题:

1. 题目:

编程序,输入正整数m,它代表一个人民币钱数(元数)。求取这样一个方案,使用最少张数的人民币纸币,凑成上述的钱数m,并输出求取结果。

注意,现在共有7种元以上面值的人民币纸币,分别为:100,50,20,10,5,2,1。

2.需求分析:

要使钱币数量最少,那么大面额钱币的数目要尽可能的多。 根据实验要求,规定如下: 测试数据

【输入数据】3 【输出结果】

6

软件课程设计

用100元5张 用50元0张 用20元2张 用10元0张 用5元0张 用2元1张 用1元1张

【输入数据】1082 【输出结果】 用100元10张 用50元1张 用20元1张 用10元1张 用5元0张 用2元1张 用1元0张

3.设计概要

(1)定义整形数组变量a[7]={0,0,0,0,0,0,0}用于存储各面值钱币张数,数

组变量b[7]={100,50,20,10,5,2,1}用于存储现行7种元以上面值的人民币纸币;

(2)在for循环运用整除法来判断各面值钱币张数并存储于数组a[]; (3)用for循环输出数字a[]中的钱币张数

4.详细设计与编码

(1)流程图 定义存储数组

输入钱数Y 进入for循环 求出个面值钱币张数 i!=7

i==7 进入for循环 输出钱币张数 i!=7 i==7 结束

7

软件课程设计

(2)源程序

#include using namespace std; int main() {

int Y,i,a[]={0,0,0,0,0,0,0},b[]={100,50,20,10,5,2,1}; cin>>Y;

for(i=0;i<7;i++) {

a[i]=Y/b[i]; Y=Y%b[i]; }

for(i=0;i<7;i++) {

cout<<\"用\"<return 0;}

5.用户使用说明

(1)打开程序

(2)输入数据(即输入钱币总数)

(3)得到数据(即得到使用最少张数的人民币纸币的方案)

7.测试分析

输入数据:3

输入数据:1082

8

软件课程设计

分析:经过输入多次不同数据测试,都取得了预期结果,这说明了程序的正确性。

8.试验体会

经过此次试验进一步加深了对for循环和求整的除法的使用。通过分析问题,找到解决方案,并用程序实现,使自己更加了解程序设计的一般步骤和方法。

二、面向对象

第一题:

1. 题目:

自定义一个示意性的复数类型complex,其中含有若干个成员函数,使用该类可以完成复数的加法以及对复数的输出。请完成类定义,并编制主函数,说明complex类对象,对定义的各成员函数进行调用。

class complex{ double real;

double imag;

//复数实部

//复数虚部

public: complex(); //无参构造函数 complex(double r, double i); //2参构造函数 complex addCom(complex c2); //调用者对象与对象c2相加,返回complex类对象

void outCom ();

//输出调用者对象的有关数据(各分量)

};

进一步,在类中添加对复数进行其他基本运算(如,复数减、乘、除、取模等)的相应成员函数,并通过主函数处的调用来验证各函数的使用正确性。

2. 需求分析

9

软件课程设计

本题目要求编写类成员函数,来完成复数的加法以及对复数的输出。完成类定义,并编

制主函数,说明complex类对象,对定义的各成员函数进行调用。

根据实验要求输入一组测试数据,规定如下:

【输入数据】采用构造函数带值,无输入(1+2i、3+4)。 【输出】 + 4+6i

模长:7.2111 - 2+2i

模长:2.82843 *

-5+10i

模长:11.1803 /

0.44+0.08i

模长:0.447214

3.设计概要

(1)完成类的各成员函数的设计编写;

(2)编写主函数,首先由用户设定构造函数参数;

(3)然后主函数调用默认的构造函数、有参数的构造函数,再进行一系列的调用类的成员函数,完成+-*/并实现输出与求模运。

4.详细设计与编码

(1)流程图

(2)源程序:

主函数 调用一系列的构造函数 完成+运算求模并输出 完成-运算求模并输出 完成*运算求模并输出 完成/运算求模并输出 结束

10

软件课程设计

#include #include

using namespace std; class complex{

double real; //复数实部

double imag; //复数虚部 public:

complex(); //无参构造函数 complex(double r, double i); //2参构造函数

complex addCom(complex c2); //调用者对象与对象c2相加,返回complex类对象

complex jianCom(complex c2); complex chengCom(complex c2); complex chuCom(complex c2); void mochang();

void outCom (); //输出调用者对象的有关数据(各分量) };

complex::complex() {

real=0;imag=0; }

complex::complex(double r, double i) {

real=r;imag=i; }

complex complex::addCom(complex c2) {

complex x;

x.real=c2.real+real; x.imag=c2.imag+imag; return x;}

complex complex::jianCom(complex c2) {

complex x;

x.real=c2.real-real; x.imag=c2.imag-imag; return x;}

complex complex::chengCom(complex c2) {

complex x;

11

软件课程设计

x.real=c2.real*real-imag*c2.imag; x.imag=real*c2.imag+c2.real*imag; return x; }

complex complex::chuCom(complex c2) {

complex x;c2.imag=-c2.imag;

x.real=(c2.real*real-imag*c2.imag)/(c2.imag*c2.imag+c2.real*c2.real);

x.imag=(real*c2.imag+c2.real*imag)/(c2.imag*c2.imag+c2.real*c2.real);

return x; }

void complex::mochang() { double x;

x=sqrt(imag*imag+real*real); cout<<\"模长:\"<void complex::outCom () {

cout<int main() {

complex a(1,2),b(3,4); complex d,e,f,g; cout<<\"+\"<cout<<\"-\"<cout<<\"*\"<cout<<\"/\"<12

软件课程设计

5.调试分析

编写此程序时类的数据元素以及部分成员函数已给出,编写程序较为简单主要就是编写函数体以及主函数。

在编写过程中也遇到了一些困难,求模长时对cmath头文件不熟悉,导致开方时不知道用那一个函数。以后要对常用的函数名已经头文件加以熟悉。

6.用户使用说明

【第一步】打开源程序 【第二步】检查运行结果

7.测试分析

输出结果:

分析:输出结果与预设值完全一致,证实了程序的正确性!

8.实验体会

通过此题的编写加深了对类的了解以及对类成员函数的调用,对cmath中包含函数的数序。

第二题:

1.题目:

自定义一个简单的日期类DateType,它具有数据成员y、m、d,用来表示当前日期的年、月、日。而后设计该类欲实现(完成)的功能,进而设计出相应的类成

13

软件课程设计

员函数。

例如,下面给出的\"雏形\"可用来实现对天的增加,比较两个日期是否相等,以及对日期的输出等操作。

请完成各类成员函数,并编制主函数,说明DateType类对象,对定义的各成员函数进行调用,以验证它们的正确性。

class DateType { //自定义的日期类DateType

int y,m,d; //数据成员,表示当前日期的年、月、日 public:

DateType(int y0=1, int m0=1, int d0=1);

//构造函数,设定年、月、日;并设置参数默认值 void incrementDay(); //增加1天 bool equal(DateType dt2); //判断二日期是否相等

void printDate(); //屏幕输出日期对象的有关数据(年、月、日) };

注意,当对日期增加1天后,也会涉及所谓的\"进位\"问题:首先算出本\"日\"所在的月份具有的天数N,

若加1之后的\"日\"数值超过所在的月份具有的天数N时,\"进位\"到月,而月份若超过12时还要\"进位\"到年。

2.需求分析

设计出相应的类成员函数完成

1. 构造函数,设定年、月、日;并设置参数默认值; 2. 增加1天;

3. 判断二日期是否相等;

4. 屏幕输出日期对象的有关数据(年、月、日)。

当对日期增加1天后,也会涉及所谓的\"进位\"问题:首先算出本\"日\"所在的月份具有的天数N,

若加1之后的\"日\"数值超过所在的月份具有的天数N时,\"进位\"到月,而月份若超过12时还要\"进位\"到年。

根据实验要求输入一组测试数据,规定如下: 【输入数据】无

数据采用程序中默认的函数;

dt1year:1990 month:1 day:1 dt2year:1990 month:1 day:1 dt3year:1991 month:1 day:1 【输出】

dt1year:1990 month:1 day:1 dt2year:1990 month:1 day:1 dt3year:1991 month:1 day:1 dt1与dt2日期相等!!! 日期不相等!!!

dt1与dt3增加后的输出:year:1990 month:1 day:2

3.设计概要

14

软件课程设计

(4)完成类的各成员函数的编码;

(5)编写主函数,首先由用户输入一组日期;

(6)然后主函数调用默认的构造函数,再进行一系列的调用类的成员函数;

3. 详细设计与编码

(1)流程图

主函数 调用一系列的构造函数 为dt1,dt2,dt3赋值 输出dt1,dt2,dt3 的年月日 调用一系列的输出函数 调用日期比较函数比较dt1与dt2、dt1与dt3

(2)源程序:

# include using namespace std;

class DateType { //自定义的日期类DateType

int y,m,d; //数据成员,表示当前日期的年、月、日 public:

DateType(int y0=1, int m0=1, int d0=1);

//构造函数,设定年、月、日;并设置参数默认值 void incrementDay(); //增加1天 bool equal(DateType dt2); //判断二日期是否相等

void printDate(); //屏幕输出日期对象的有关数据(年、月、日) };

DateType::DateType(int y0, int m0, int d0) {

y=y0; m=m0; d=d0; }

void DateType::incrementDay()

15

软件课程设计

{

int yue[12]={31,28,31,30,31,30,31,31,30,31,30,31}; if(!(y%400)||!(y%4)&&y%100) yue[2]=29; else yue[2]=28;

if(++d>yue[m-1]) {m++;d=1;} if(m>12) {y++;m=1;} }

bool DateType::equal(DateType dt2) {

if(y==dt2.y && m==dt2.m && d==dt2.d) {

cout<<\"日期相等!!!\"<cout<<\"日期不相等!!!\"<void DateType::printDate() {

cout<<\"year:\"<int main() {

DateType dt1(1990,1,1) ,dt2(1990,1,1),dt3(1991,1,1); cout<<\"dt1\";

dt1.printDate(); cout<<\"dt2\";

dt2.printDate(); cout<<\"dt3\";

dt3.printDate();

cout<<\"dt1与dt2\"; dt1.equal(dt2); dt1.equal(dt3); cout<<\"dt1与dt3\"; dt1.incrementDay();

cout<<\"增加后的输出:\"; dt1.printDate();

16

软件课程设计

return 0; }

5.调试分析

用数组将每一个月的天数存储起来的,方便算法设计,整体上没有出现什么较大的问题。在主函数设计上尽量考虑到将函数都调用到。

6.用户使用说明

【第一步】打开源程序 【第二步】观察实验结果

7.测试分析

输出结果:

分析:输出结果与预设值完全一致,证实了程序的正确性!

8.实验体会

这个题目让我对年月日的进制的算法有了更深入的了解,而且学会了如何给形参设置默认的参数。还有就是在函数与数据设置上要注意有一定选择性

三、可视化编程

第一题:计算器的基本设计

1.题目

1. 用你熟悉的一种可视化编程语言实现如下图所示的计算器。该计算器需要实现基础的数

算,如加,减,乘,除。

17

软件课程设计

2.需求分析

设计一个简单的计算器可以进行简单的数算,比如加减乘除。利用C++中的MFC来编写实现。输出形式要与题目中给的样板相同或类似。

输入数据和输出数据均以double型数据表示 测试数据: 【输入数据】9-15 【输出结果】-6 【输入数据】2.4*0.2 【输出结果】0.48 【输入数据】4.8/3 【输出结果】1.6

3.概要设计

(1) 设置如图说是的按钮;

(2) 点击每一个按钮,起一个函数名,进入Dlg.cpp中编写相应的函数体; (3) 设置一些全局变量:double型m1、m2、m3、m4分别再加减乘除函数体的

编写时使用;int型变量m、n、I,m取1、2、3、4时分别表示加减乘除的使用,n==1时则代表着小数点的使用,I则表示输入的时小数点后的第

几位;

(4) 编写等号的函数,根据m的不同取值选取不同的操作。

4.详细设计与编码

(1)根据概要设计中描述的进行编码: 数符的编码流程图:

18

数符的函数体

if判断语句 软件课程设计

等号的编码流程图: if判断语句 等号的函数 n=1 执行小数点的处理语句 n=0 执行整数的处理语句 判断m的值 m=1 执行加法操作语句

(1) 源程序:

///////////////计算器张明涛Dlg.cpp///////////////////////

// 计算器张明涛Dlg.cpp : implementation file //

#include \"stdafx.h\"

#include \"计算器张明涛.h\" #include \"计算器张明涛Dlg.h\" #include

double m1,m2,m3,m4; int i=1,m=0,n=0; #ifdef _DEBUG

#define new DEBUG_NEW #undef THIS_FILE

static char THIS_FILE[] = __FILE__; #endif

///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About

class CAboutDlg : public CDialog {

public:

CAboutDlg();

19

m=2 执行减法操作语句 m=3 m=4 执行乘法操作语句 执行除法操作语句 软件课程设计

// Dialog Data //{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA

// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL

// Implementation protected:

//{{AFX_MSG(CAboutDlg) //}}AFX_MSG

DECLARE_MESSAGE_MAP() };

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) {

//{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT }

void CAboutDlg::DoDataExchange(CDataExchange* pDX) {

CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP }

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////////////// // CMyDlg dialog

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/) : CDialog(CMyDlg::IDD, pParent) {

20

软件课程设计

//{{AFX_DATA_INIT(CMyDlg) m_t = 0.0; //}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CMyDlg::DoDataExchange(CDataExchange* pDX) {

CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDlg) DDX_Text(pDX, IDC_EDIT1, m_t); //}}AFX_DATA_MAP }

BEGIN_MESSAGE_MAP(CMyDlg, CDialog) //{{AFX_MSG_MAP(CMyDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT()

ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_1, On1) ON_BN_CLICKED(IDC_2, On2)

ON_BN_CLICKED(IDC_cheng, Oncheng) ON_BN_CLICKED(IDC_deng, Ondeng)

ON_BN_CLICKED(IDC_3, On3)

ON_BN_CLICKED(IDC_4, On4) ON_BN_CLICKED(IDC_5, On5) ON_BN_CLICKED(IDC_6, On6) ON_BN_CLICKED(IDC_7, On7) ON_BN_CLICKED(IDC_8, On8) ON_BN_CLICKED(IDC_9, On9) ON_BN_CLICKED(IDC_0, On0) ON_BN_CLICKED(IDC_dian, Ondian) ON_BN_CLICKED(IDC_jian, Onjian) ON_BN_CLICKED(IDC_jia, Onjia) ON_BN_CLICKED(IDC_chu, Onchu) ON_BN_CLICKED(IDC_qingchu, Onqingchu) //ON_EN_SETFOCUS(IDC_EDIT1, OnSetfocusEdit1) //}}AFX_MSG_MAP END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////////////// // CMyDlg message handlers

21

软件课程设计

BOOL CMyDlg::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 < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) {

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } }

// Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control }

void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam) {

if ((nID & 0xFFF0) == IDM_ABOUTBOX) {

CAboutDlg dlgAbout; dlgAbout.DoModal(); } else {

CDialog::OnSysCommand(nID, lParam); } }

22

软件课程设计

// 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 CMyDlg::OnPaint() {

if (IsIconic()) {

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle

int 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 icon

dc.DrawIcon(x, y, m_hIcon); }

else

{

CDialog::OnPaint(); } }

// The system calls this to obtain the cursor to display while the user drags // the minimized window.

HCURSOR CMyDlg::OnQueryDragIcon() {

return (HCURSOR) m_hIcon; }

void CMyDlg::On1() {

// TODO: Add your control notification handler code here UpdateData(TRUE);

if (n==1) { m_t=m_t+1*pow(10,-i);i++ ;

23

软件课程设计

}

else m_t=m_t*10+1; UpdateData(FALSE); }

void CMyDlg::On2() {

// TODO: Add your control notification handler code here UpdateData(TRUE); if (n==1) { m_t=m_t+2*pow(10,-i);i++ ;

} else

m_t=m_t*10+2; UpdateData(FALSE); }

void CMyDlg::On3() {

// TODO: Add your control notification handler code here UpdateData(TRUE);

if (n==1) { m_t=m_t+3*pow(10,-i);i++ ; } else

m_t=m_t*10+3; UpdateData(FALSE); }

void CMyDlg::On4()

{

// TODO: Add your control notification handler code here UpdateData(TRUE); if (n==1) { m_t=m_t+4*pow(10,-i);i++ ;

}

24

软件课程设计

else

m_t=m_t*10+4; UpdateData(FALSE); }

void CMyDlg::On5() {

// TODO: Add your control notification handler code here UpdateData(TRUE); if (n==1) { m_t=m_t+5*pow(10,-i);i++ ;

} else

m_t=m_t*10+5; UpdateData(FALSE); }

void CMyDlg::On6() {

// TODO: Add your control notification handler code here UpdateData(TRUE); if (n==1) { m_t=m_t+6*pow(10,-i);i++ ; } else

m_t=m_t*10+6; UpdateData(FALSE); }

void CMyDlg::On7()

{

// TODO: Add your control notification handler code here UpdateData(TRUE); if (n==1) { m_t=m_t+7*pow(10,-i);i++ ;

} else

m_t=m_t*10+7;

UpdateData(FALSE); }

25

软件课程设计

void CMyDlg::On8()

{

// TODO: Add your control notification handler code here UpdateData(TRUE); if (n==1) { m_t=m_t+8*pow(10,-i);i++ ;

} else

m_t=m_t*10+8;

UpdateData(FALSE); }

void CMyDlg::On9()

{

// TODO: Add your control notification handler code here UpdateData(TRUE); if (n==1) { m_t=m_t+9*pow(10,-i);i++ ; }

else m_t=m_t*10+9; UpdateData(FALSE); }

void CMyDlg::On0()

{

// TODO: Add your control notification handler code here UpdateData(TRUE); if (n==1) { m_t=m_t+0*pow(10,-i);i++ ; }

else m_t=m_t*10+0; UpdateData(FALSE); }

void CMyDlg::Ondian() {

// TODO: Add your control notification handler code here UpdateData(TRUE); n=1;

26

软件课程设计

UpdateData(FALSE); }

void CMyDlg::Onjian() {

// TODO: Add your control notification handler code here UpdateData(TRUE); m2=m_t; m_t=0; m=2; i=1; n=0;

UpdateData(FALSE); }

void CMyDlg::Onjia()

{

// TODO: Add your control notification handler code here UpdateData(TRUE); m1=m_t;

m_t=0;

m=1; i=1; n=0;

UpdateData(FALSE);

}

void CMyDlg::Oncheng()

{

// TODO: Add your control notification handler code here UpdateData(TRUE); m3=m_t; m_t=0; m=3; i=1;

n=0;

UpdateData(FALSE); }

void CMyDlg::Ondeng() {

// TODO: Add your control notification handler code here UpdateData(TRUE); if (m==1)

27

软件课程设计

m_t=m1+m_t;

else if (m==2) m_t=m2-m_t; else if (m==3) m_t=m3*m_t;

else if (m==4) { }

if(m_t==0) MessageBox(\"除数不能为零!\"); else

m_t=m4/m_t;

else

m_t=0; i=1; n=0;

UpdateData(FALSE); }

void CMyDlg::Onchu()

{

// TODO: Add your control notification handler code here UpdateData(TRUE); m4=m_t; m_t=0; m=4;

i=1; n=0;

UpdateData(FALSE); }

void CMyDlg::Onqingchu() {

// TODO: Add your control notification handler code here UpdateData(TRUE); m_t=0; i=1; n=0;

UpdateData(FALSE); }

5.调试分析

在试验过程中遇到的困难较多,主要是因为以前从为接触过MFC,这次完全是从头开始

28

软件课程设计

学起,在编写程序主要遇到两个大问题。

第一个是整个程序编码是没有错的,可以通过编译,但错误是在运算过程中只要是两个小数进行运算则结果就是0。编码检查了好多遍均未发现语法错误,找同学来看也没有找到错误起源,最后有同学建议小数点的使用判断出使用另外一个变量(刚开始这个变量和判断加减乘除的变量为同一个变量,取不同值代表不同的操作)全部替换后,程序过让变得正常啦!错误可能是处在变量相同经过多次赋值后改变了原来的数值。

第二个是在修改第一个的过程呢个中出现的,在修改时一不小心把一段自动生成的代码给删除了,当时却没有注意到,导致编译通不过,最后花费了好大的经历才找到删除的地方,把代码补上。

通过实验意识到,在使用变量时要避免重复使用一个变量,以取不同的值来代表不同的操作,这样很容易是数据值混乱而出错。在编程时要谨慎,不能随意的删除代码!!

6.用户使用说明

【step1】打开程序

【step2】选择清除键进行清零 【step 3】输入要计算的数据

7.测试分析

输入数据:9-15 结果为:

输入数据:2.4*0.2 输出结果为:

输入数据:4.8/3 输出结果为:

29

软件课程设计

分析:根据输出结果与预设值得比较,可以看出此计算器的输出结果完全正确!但唯一的不足是不能连续输入算式,例如3+5+8;只能再输入3+5之后按一下=才能继续进行运算。

8.设计体会

通过此次实验受益颇多。首先,从对MFC的不知到运用,虽然只掌握了很少的一部分,但毕竟有所收获;其次,当编写出来时心情无比畅快,也使自己增加了信心,意识到再难的程序设计,只要肯努力认真学习就能学会!为以后更好的学习奠定了基础!

第一题:

1.题目

用链表和数组两种方式分别实现栈的出栈、入栈、取栈顶元素、判空、查找等操作。 1-1 数组

四.数据结构

2.需求分析

用数组来实现栈的一系列操作,包括栈的出栈、入栈、取栈顶元素、判空、查找等操作。 定义栈中数据为整型,程序中所用到的数据全为整型。打开程序后用户可根据提示选择不同的操作包括以上提到的所有操作!

测试数据: 【输入数据】 5 1 1

30

软件课程设计

1 2 1 3 4 2 2 2 4 5

【输出数据】

请输入您要建立的栈的大小: 5

1.进栈 2.出栈

3.查看栈顶值 4.判断是否为空栈 5.退出

请选择操作:1 请输入进栈值: 1

请选择操作:1 请输入进栈值: 2

请选择操作:1 请输入进栈值: 3

请选择操作:4 此栈已经不为空!!! 请选择操作:2 3出栈

请选择操作:2 2出栈

请选择操作:2 1出栈

请选择操作:4 此栈已经为空!!! 请选择操作:5 Exit!!

3.概要设计

(1) 用class的类来表示栈的数据结构,它的私有成员变量包括用于指向存储数据的指针

变量base、用于表示最大存储空间的整型的变量stacksize,表示头结点指针变量top。

(2) 编写要公有成员函数函数:建空栈SqStack()、进栈Push(int e)、删除S的栈顶元素

31

软件课程设计

Pop(int &e)、判空PanduanStack()、返回栈顶元素GetTop(int &e)

(3) 编写主函数int main(),先定义类成员SqStack Stack,然后初始化栈,再设一个整型

变量不同值代表不同的操作,由用户来选择操作,用if语句来实现;为了能达到循环操作的目的,则用while(m!=5);循环来包括所有的操作。

4.详细设计与编码

(1) 流程图 x=1 进栈 x=2 出栈 x=3 查看栈顶值 x=4 x=5 判断是否为空栈 退出

主函数 调用析构 建空栈Stack 初始化栈表 用户输入x的值 系统判断x的值 Push(int e) Pop(x) GetTop(y) PanduanStack( ) break (2) 源程序

#include using namespace std;

const STACK_INIT_SIZE=100;//存储空间初始分配量 const STACKINCREMENT=10;//存储空间分配增量 class SqStack { private:

int *base;//在构造之前和销毁之后,base的值为NULL int *top;//栈顶指针

int stacksize;//当前已分配的存储空间,以元素为单位 public:

SqStack(); void GetTop(int &e); void Push(int e); void Pop(int &e); void PanduanStack(); void InitStack();

32

软件课程设计

int getsize(); };

SqStack::SqStack(){ //构造一个空栈S

base=new int[STACK_INIT_SIZE];//(int *)malloc(STACK_INIT_SIZE*sizeof(int)); if(!base)

exit(0);//存储分配失败 top= base;

stacksize=STACK_INIT_SIZE; //cout<<\"初始化完毕\"<void SqStack::GetTop(int &e){

//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR if( top== base)

{ cout<<\"此栈为空!!!\"<e=*( top-1);

cout<// cout<<\"取值结束\"<void SqStack::Push(int e){

//插入元素e为新的栈顶元素

if(top-base>stacksize){//栈满,追加存储空间

base=(int*)realloc(base,(stacksize+STACKINCREMENT)*sizeof(int)); if(!base)

{ cout<<\"新分配空间失败!!!\"<}

top = base + stacksize;

stacksize += STACKINCREMENT; }

* top++=e;

// cout<<\"插入元素成功\"<void SqStack::Pop(int &e){

//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if( base== top)

{ cout<<\"此栈为空栈,无法删除!!!\"<33

软件课程设计

e=*--top;

// cout<<\"删除成功!!!\"<void SqStack::PanduanStack(){ //把S置为空栈

if(base==top)

cout<<\"此栈已经为空!!!\"<void SqStack::InitStack()

{ int n;

cout<<\"请输入您要建立的栈的大小:\"<>n; stacksize=n; }

int SqStack::getsize() {return stacksize;}

void main() {

SqStack Stack; int m,x,y,z,a=0,i=0; Stack.InitStack();

do{

if(a++==0) cout <<\"1.进栈 \\n2.出栈 \\n3.查看栈顶值 \\n4.判断是否为空栈\"<cout<<\"请选择操作:\"; cin>>m; switch(m) {

case 1:

cout<<\"请输入进栈值:\"<>z;

if(i==Stack.getsize()) { cout<<\"Sorry!!!\"<exit(0);

}

Stack.Push(z); i++;

\\n5.退出34

软件课程设计

break;

case 2: Stack.Pop(x);

cout<case 3:

cout<<\"栈顶值为:\"<Stack.PanduanStack( );

break;

case 5:

cout<<\"Exit!!\"<break; default:

cout<<\"输入错误!此程序将退出!\"<5.调试分析 6.用户使用说明

【第一步】打开程序

【第二步】输入要建立栈的大小

【第三步】根据系统提示进行相关操作

【第四步】1.输入栈中元素2.3.4查看结果。

7.测试分析

【输入数据】 3 1 2 1 4 1 5 2 2 4 2

35

软件课程设计

5

【输出结果】

分析:输出结果与预想值完全相同,表明了程序的正确性!而且出栈、取栈顶元素、判空、

插入、退出,各个操作均可完成,达到了程序设计的要求。

8.实验体会

通过此次实验对栈的数组存储结构及基本操作有了更加深刻得了解,运用C++中类的思想将数据结构完美的与类相结合,对数据结构有了更深入的认识。在程序编写过程中通过改错、调试,明白了自身的不足以及对细节问题忽视,通过亲身操作对这些错误有了更加深刻的记忆,为以后避免类似的错误奠定了基础。

第二题

1.题目

假设有一个循环链表的长度大于1,且表中既无头结点也无头指针。

已知p为指向链表中某结点的指针,试编写算法在链表中删除结点p 的前趋结点。

2.需求分析

设计一个循环链表,没有头结点也无头指针,然后就可以任意删除一个结点的前驱结点。此程序能删除指定元素的前驱结点。循环链表中的元素全部都是整数,这里用到类class node,私有成员数据域包括date、node型的next指针,通过循环一圈若使结点的next指针指向指定结点即可。

依据题目要求输入测试数据: 【输入数据】无.

预设11个元素的链表,指定元素指向的是5其前驱指向元素指向的是4。 【输出结果】 初始化完成

36

软件课程设计

删除元素为4 已删除

Press any key to continue

3.概要设计

【第一步】建一个类class node,他包括私有成员数据域、node型的next指针。 【第二步】编写公有成员函数:建空循环链表void chushihua()、删除结点函

数void del(node *p)。

【第三步】编写主函数定义对象实现对各个函数的调用。来完成题目所要求的结

果。

4.详细设计与编码

(1)流程图 主函数 调用初始化链表的chushihua() 调用void del(node *p)找到元素,并删除

结束

(2)源程序

#include using namespace std; class node{

int date; node *next; public:

void chushihua(); void del(node *p); };

node *a;

void node::chushihua()

{//生成一个表长为11的链表; node *p,*head; p=head=new node; p->date=0;

for(int i=1;i<10;i++) {

37

软件课程设计

p->next=new node;

if(i==5) a=p;//a指向的元素是5其前驱指向元素指向的是4; p->date=i; p=p->next; }

p->date=10; p->next=head;

cout<<\"初始化完成\"<void node::del(node *p)

{ node *pp=p; //已知结点pp; while(p->next!=pp)

p=p->next;//已知结点 前驱的前驱 cout<<\"删除元素为\"<date; p->next=pp; p=p->next; delete(p);

cout<<\"\\n已删除\"<int main() {

node MM;

MM.chushihua(); MM.del(a); return 0; }

5.调试分析

在编程过程中我首选C++类来实现数据结构,首先是在删除函数时,开始我选择的是用循环一圈找到next==this的方法来判断,但没能找到前驱节点的指针,后来选用的是next->next==this来判断,既可以找到前驱结点又可以找到其指针,使程序顺利完成。设计中还存在一些缺陷,用户不能自行输入,只能观察结果。

总的来说此次试验收获颇丰,对循环链表的操作有了更加深刻得了解。

6.用户使用说明

【第一步】打开程序

【第二步】初始化循环链表(自动)

【第三步】找到指定元素5的前驱结点并将其删除。

7.测试分析

【输入数据】 无

38

软件课程设计

预设11个元素的链表,指定元素指向的是第五个其值为5,其前驱指向元素指向的是4。

【输出结果】

分析:实验结果与我预想值完全一样,简单明了的表明了程序的正确性。

8.试验体会

本程序其实设计起来不难,思路较简单,同时有了这学期数据结构课程的学习的基础上,再加上老师的相关指导和帮助,设计对于我们来说已不算太难,但在实际的操作过程中,还是觉得被相关问题困扰着,应该是此类设计做的还远远不够吧,所以,加强我们的上机实践能、、 力是很必要的。

五.课程试验体会

通过一学期的学习,对于软件设计有了较为深入的了解,认识了MFC,也学会了其简单的编程。在此次课程中,通过对题目的完成,对程序设计的面向过程,面向对象,可视化,以及数据结构在程序设计的重要作用有了更深入的了解。学会了利用C++来完成自己想要完成的工作任务。这样我很高兴,在可能中程序的调试和老师的指导,让我的编程能力有了进一步的提升。其实这堂课最大的收获是我能够真正的坐下来平心静气的对电脑编程了,这是我认为我将来作为程序员的第一步。未来的路还很长,我们需要更多的锻炼。

39

软件课程设计

软件课程设计指导教师评阅书

指导教师评语

(①基础理论及基本技能的掌握;②解决实际问题的能力;③研究内容的理论依据和技术方法;④取得的主要成果及创新点;⑤工作态度及工作量;⑥总体评价及建议成绩;⑦存在问题等):

成 绩:

指导教师签字: 年 月 日

40

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务