课程实验报告
课程名称:面向对象程序设计
实验名称:面向过程的整型栈编程
院 系:计算机科学与技术
专业班级: CS1201
学 号: U201214819
姓 名: 魏茹珺
指导教师: 马光志
2015 年 1 月 5 日
一、需求分析
1. 题目要求
整型栈是一种先进后出的存储结构,对其进行的操作通常栈括判断栈是否为空、向栈顶添加一个整型元素、出栈等。整型栈类型及其操作函数采用非面向对象的纯C语言定义,请将完成上述操作的所有函数采用纯C语言编程,然后写一个main函数对栈的所有操作函数进行测试。
struct STACK{
int *elems; //申请内存用于存放栈的元素
int max; //栈能存放的最大元素个数
int pos; //栈实际已有元素个数,栈空时pos=0;
};
void initSTACK(STACK *const p, int m); //初始化p指向的栈:最多m个元素
void initSTACK(STACK *const p, const STACK&s); //用栈s初始化p指向的栈
int howMany (const STACK *const p); //返回p指向的栈的实际元素个数pos
STACK *const push(STACK *const p, int e); //将e入栈,并返回p
STACK *const pop(STACK *const p, int &e); //出栈到e,并返回p
STACK *const assign(STACK*const p, const STACK&s); //赋s给p指的栈,并返回p
void print(const STACK*const p); //打印p指向的栈
void destroySTACK(STACK*const p); //销毁p指向的栈
2. 需求分析
本实验需要实现栈的功能的操作,如元素的进栈,连续进栈,出栈和连续出栈,所以需要设计两个栈,在完成初始化后直接在程序里给定栈内元素。
二、系统设计
1. 概要设计
首先需要完成实现个功能的函数,然后在主函数里给定一个栈,通过调用各个功能函数来判断功能的实现与否。
2. 详细设计
初始化栈需要为栈内的元素动态分配一个空间,然后将结构体内的当前元素初始化为0;
实现入栈则需要将入栈元素e放入栈内,将当前元素pos加一;
实现出栈操作则需将栈顶的元素赋给一个变量然后将当前元素pos减一;
实现栈的赋给即需要将s1栈内的元素依次赋给s2栈的,当前元素也需一致;
三、软件开发
在codeblocks下,用C++编译
四、软件测试
所得截图如下:
第一行:将1压入s1栈;
第二行:将2压入s1栈;
第三行:将3,4连续压入栈;
第四行:实现上述操作后s1栈内的元素个数;
第五行:将s1栈的一个元素出栈后s1栈的值;
第六行:将s1栈赋给s2栈后,s2栈的值;
第七行:将s2栈连续出栈两个元素后,s2栈的值;
五、特点与不足
1. 技术特点
成功完成实验要求,没有错误。
2. 不足和改进的建议
不足之处在于不能按需求输入,如果需要改变栈值则只能通过修改程序才能实现
六、过程和体会
1. 遇到的主要问题和解决方法
想的太多了,总是把程序想的很复杂,还想通过写界面实现对应模块功能,后来仔细看了报告书,将界面删除,只留下功能实现的部分。
2. 课程设计的体会
通过这次的实验,我体会到了,不能一味地光写程序而是要看清实验要求,不要将问题复杂化,自己给自己找麻烦。看清题意,完成就好。
七、源码和说明
1. 文件清单及其功能说明
执行文件: shiyan1.exe
源码: shiyan1.cpp
2. 用户使用说明书
程序要在支持C++编程的开发软件中运行
3. 源代码
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
struct STACK{
int *elems; //申请内存用于存放栈的元素
int max; //栈能存放的最大元素个数
int pos; //栈实际已有元素个数,栈空时pos=0;
};
void initSTACK( STACK *const p, int m)//初始化p指向的栈:最多m个元素
{
p->elems=(int *)malloc(m*sizeof(int));
if(!p->elems) return;
p->pos=0;
p->max=m;
}
void initSTACK(STACK *const p, const STACK&s)//用栈s初始化p指向的栈
{
p->elems=(int *)malloc((s.max)*sizeof(int));
int i;
for(i=0;i<s.max;i++)
{
p->elems[i]=s.elems[i];
p->pos=i;
}
}
int howMany (const STACK *const p) //返回p指向的栈的实际元素个数pos
{
return p->pos;
}
STACK *const push(STACK *const p, int e) //将e入栈,并返回p
{
if(p->pos<p->max)
{
p->elems[p->pos]=e;
p->pos=p->pos+1;
}
return p;
}
STACK *const pop(STACK *const p, int &e) //出栈到e,并返回p
{
e=p->elems[p->pos-1];
p->pos=p->pos-1;
return p;
}
STACK *const assign(STACK *const p, const STACK&s) //赋s给p指的栈,并返回p
{
p->elems=(int *)malloc(s.max*sizeof(int));
int k;
for(k=0;k<s.max;k++)
{
p->elems[k]=s.elems[k];
}
p->pos=s.pos;
return p;
}
void print(const STACK*const p) //打印p指向的栈
{
int k;
for(k=0;k<p->pos;k++)
{
printf("%d",p->elems[k]);
}
printf("\n");
}
void destroySTACK(STACK*const p) //销毁p指向的栈
{
p->pos=0;
}
int main()
{
STACK s1,s2;
int m=10;
int x,y,z,e;
initSTACK(&s1,m);
e=1;
push(&s1,e) ;
printf("入栈到那个元素:%d\n",e);
e=2;
push(&s1,e);
printf("入栈到那个元素:%d\n",e);
push(push(&s1,3),4);
printf("s1:");
print(&s1);
printf("栈现在的容量:%d\n",howMany(&s1));
pop(&s1,x);
printf("s1:");
print(&s1);
assign(&s2,s1);
printf("s2:");
print(&s2);
pop(pop(&s2,y),z);
printf("s2:");
print(&s2);
destroySTACK(&s2);
destroySTACK(&s1);
}
第二篇:面向对象程序设计实验报告-实验一
北京理工大学珠海学院实验报告
ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY
班级:13级计算机3班 学号:130201031037 姓名:郑永雄 指导教师:谭忠兵
实验题目:类和对象 实验时间:20##-04-09 成绩:
一、实验内容
程序1.声明一个日期类,日期的属性有年、月和日。方法有构造函数、析构函数、日期的显示。要求使用构造函数的重载,分别定义无参构造函数(使年月日的值分别为20##、1、1)和有参构造函数,并编写程序测试日期类。
程序2.创建一个Employee类,该类中有字符数组,表示姓名、街道地址、邮政编码。其功能有修改姓名、显示输出数据。要求函数放在类定义中,构造函数初始化每个成员,显示信息函数要求把对象中的完整信息打印出来。
程序3.建立类cylinder,cylinder的构造函数被传递了两个double值,分别表示圆柱体的半径和高度。用类cylinder计算圆柱的体积,并存储在一个double变量中。在类cylinder中包含一个成员函数vol,用来显示每个cylinder对象的体积。
程序4.定义一个复数类,要求定义构造函数和析构函数,并能够为用户提供复数的加法和减法运算。编写程序测试复数类。
程序5.定义一个矩形类。矩形的属性是左上角的顶点、长和宽,方法有构造函数、析构函数、显示、移动等。编写程序测试矩形类。
二、问题分析(类的数据成员、成员函数等的确定,对象的创建等)
程序1:首先声明一个日期类date,日期的属性(数据成员)有年year、月month和日day。成员函数是构造函数date、析构函数、日期的显示show()。在主函数中使用构造函数的重载,分别定义无参构造函数(使年月日的值分别为20##、1、1)和有参构造函数,并调用输出成员函数显示结果。
程序:2:首先创建一个Employee类,该类中有数据成员字符数组,表示姓名name、街道地址stree、邮政编码num。成员函数有修改姓名setname、显示输出数据show。在主函数中用构造函数初始化每个成员,调用显示信息函数把对象中的完整信息打印出来。
程序3:首先定义类cylinder,cylinder的构造函数被传递了两个double值,分别表示圆柱体的半径r和高度h。用类cylinder计算圆柱的体积,并存储在一个double变量v中。在类cylinder中包含一个成员函数vol,用来显示每个cylinder对象的体积。
程序:4:首先定义一个复数类complex,并定义构造函数和析构函数,设置成员函数set()为用户提供复数的加法和减法运算。并用输出函数print输出结果。
程序:5:定义一个矩形类。矩形的数据成员是左上角的顶点(x,y)、长long和宽wide,并定义构造函数、析构函数、还有成员函数print显示、move移动等。
三、程序实现(完整程序)
第一题:
#include<iostream>
using namespace std;
class Date
{
private:
int year,month,day;
public:
Date()
{
year=2013;
month=1;
day=1;
}
Date(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
~Date()
{
cout<<"析构函数"<<endl;
}
void show()
{
cout<<"显示日期"<<year<<"."<<month<<"."<<day<<endl;
}
};
int main()
{
Date a;
a.show();
Date b(2014,4,10);
b.show();
getchar();
getchar();
return 0;
}
第二题
#include<iostream>
#include<cmath>
using namespace std;
class Employee{
private:
char *name,*stree;
int post;
public:
Employee(char *x,char *y,int z)
{
strcpy(name,x);
strcpy(stree,y);
post=z;
}
void setname(char *a)
{
strcpy(name,a);
}
void Print_employee()
{
cout<<name[10]<<" "<<stree[50]<<" "<<post<<endl;
}
};
int main()
{
Employee m("ben","zhbit",519000);
char *b;
cin>>b;
m.setname(b);
m.Print_employee();
return 0;
}
第三题:
#include<iostream>
#include<cmath>
using namespace std;
class cylinder
{
private:
double radius,high;
public:
cylinder(double h,double r)
{
radius=r;
high=h;
}
double jisuan()
{
double v,pi=3.14159262;
v=pi*radius*radius*high;
return v;
}
void vol(double m)
{
cout<<"体积="<<m<<endl;
}
};
int main()
{
cylinder m(2,2);
double n;
n=m.jisuan();
m.vol(n);
getchar();
getchar();
return 0;
}
第四题:
#include<iostream>
#include<cmath>
using namespace std;
class Complex
{
private:
double real,imag;
public:
Complex(double r,double i)
{
real=r;
imag=i;
}
~Complex()
{
cout<<"析构函数"<<endl;
}
void jisuan(double x,double y)
{
real=real+x;
imag=imag+y;
}
void show()
{
cout<<"复数:"<<real<<"+"<<imag<<"i"<<endl;
}
};
int main()
{
Complex m(5,7);
m.jisuan(2,2);
m.show();
getchar();
getchar();
return 0;
}
第五题:
#include<iostream>
#include<cmath>
using namespace std;
class Rectangle
{
private:
double x,y,lond,wide;
public:
Rectangle(double a,double b,double c,double d)
{
x=a;
y=b;
lond=c;
wide=d;
}
~Rectangle()
{
cout<<"析构函数"<<endl;
}
void jisuan(double a,double b)
{
x=a+x;
y=b+y;
}
void show()
{
cout<<"左上角坐标"<<"("<<x<<","<<y<<")"<<endl;
cout<<"右上角坐标"<<"("<<x+lond<<","<<y<<")"<<endl;
cout<<"左下角坐标"<<"("<<x<<","<<y+wide<<")"<<endl;
cout<<"右下角坐标"<<"("<<x+lond<<","<<y+wide<<")"<<endl;
}
};
int main()
{
Rectangle n(0,4,5,3);
cout<<"显示矩形:"<<endl;
n.show();
cout<<"移动矩形"<<endl;
n.jisuan(2,2);
n.show();
getchar();
getchar();
return 0;
}
四、调试与运行
程序1:
程序2:
程序3:
程序4:
程序5:
五、实验总结:
1、学到了构造函数的构建,还有析构函数,成员函数等。通过对象调用成员函数实现某些功能。还有学会了运用string函数,简化了程序。
2、遇到了什么问题,如何解决的。
在运用new分配空间时,发现自己对字符串的知识忘记了很多。后来发现后面学习的string类很好用,可以简化程序。总的来说第一次试验都比较简单,做的比较顺利。
3、实验中需要特别注意什么,有哪些细节和技巧。
做实验前要熟悉试验运用的知识,写程序前最好先构思好再写。构造函数要注意没有返回类型的,可以有形参,而析构函数是没有参数的。