实验4 静态成员
- 格式:doc
- 大小:39.00 KB
- 文档页数:4
攀枝花学院实验报告实验课程: Visual C#,NET程序设计实验项目: 上机实验 4 实验日期:2015年5月5日系:数学与计算机学院班级: 2013级计算机科学与技术姓名: 何静学号: 201310801009 同组人: 指导教师:罗明刚成绩:实验目的:1.区别静态类与非静态类,掌握静态字段,静态方法和静态构造函数的定义方法.2.理解类的继承性与多态性,掌握其应用方法.3.理解抽象类,接口的概念,掌握抽象类与接口的定义及使用方法.4.理解分部类和命名空间的概念,掌握分部类和命名空间的使用方法.实验仪器设备,药品,器材:Microsoft visual studio 2010实验原理:1.熟悉visual 2010的基本操作方法.1.认真阅读本章相关内容,尤其是案例.2.实验前进行程序设计,完成源程序的编写任务.3.反复操作,直到不需要参考教材,能熟练操作为止.实验步骤:见下页1.设计一个windows应用程序:设计一个Windows应用程序,在该程序中首先构造一个学生基本类,再分别构造小学生、中学生、大学生等派生类,当输入相关数据,点击不同的按钮(小学生、中学生、大学生)将分别创建不同的学生对象,并输入当前的学生总人数,该学生的姓名学生类型和平均成绩。
要求如下:(1) 每个学生都有的字段为:姓名、年龄(2) 小学生的字段还有语文、数学,用来表示这两科的成绩(3) 中学生在此基础上多了英语成绩。
(4) 大学生只有必修课和选修课两项成绩。
(5) 学生类具有方法来统计自己的总成绩并输出。
(6) 通过静态成员自动记录学生总人数。
(7) 成员初始化能过构造函数完成。
实验源代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace_13{public partial class Form1 : Form{public Form1(){InitializeComponent();}public abstract class Student{protected string name;protected int age;public static int number;public Student(string name, int age){=name;this.age=age;number++;}public string Name { get { return name; } }public abstract double Average();}public class Pupil : Student{protected double math;protected double chinese;public Pupil(string name, int age, double chinese, double math): base(name, age){this.chinese=chinese;this.math=math;}public override double Average(){return (chinese+math) /2;}}public class Zhongxue : Student{protected double math;protected double chinese;protected double english;public Zhongxue(string name, int age, double chinese, double math, double english): base(name, age){this.chinese=chinese;this.math=math;this.english=english;}public override double Average(){return (chinese+math+english) /3;}}public class Daxue : Student{protected double bixiu;protected double xuanxiu;public Daxue(string name, int age, double bixiu, double xuanxiu): base(name, age){this.bixiu=bixiu;this.xuanxiu=xuanxiu;}public override double Average(){return (bixiu+xuanxiu) /2;}}private void button1_Click(object sender, EventArgs e){string a=Convert.ToString(textName.Text);int b=Convert.ToInt32(textAge.Text);double c=Convert.ToDouble(textChinese.Text);double d=Convert.ToDouble(textMath.Text);Pupil p=new Pupil(a, b, c, d);lblshow.Text="总人数:"+Student.number+"姓名:"+ +",小学生平均成绩为:"+p.Average();}private void button2_Click_1(object sender, EventArgs e){string a=Convert.ToString(textName.Text);int b=Convert.ToInt32(textAge.Text);double c=Convert.ToDouble(textChinese.Text);double d=Convert.ToDouble(textMath.Text);double f=Convert.ToDouble(textEnglish.Text);Zhongxue z=new Zhongxue(a, b, c, d, f);lblshow.Text="总人数:"+Student.number+"姓名:"+ +",中学生平均成绩为:"+z.Average();}private void button3_Click_1(object sender, EventArgs e){string a=Convert.ToString(textName.Text);int b=Convert.ToInt32(textAge.Text);double c=Convert.ToDouble(textChinese.Text);double d=Convert.ToDouble(textMath.Text);Daxue f=new Daxue(a, b, c, d);lblshow.Text="总人数:"+Student.number+"姓名:"+ +",大学生平均成绩为:"+ f.Average();}}}实验截图:2.完善银行账户管理系统,增加一个VIP账户的管理。
实验四静态成员与友元【实验目的】1.掌握友元函数的定义、使用方法以及特点。
2.握静态成员函数和静态数据成员的功能。
【实验内容】1.调试下列程序,写出输出结果,并分析输出结果。
#include "iostream.h"class My{public:My(int aa){A=aa;B-=aa;}static void fun(My m);private:int A;static int B;};void My::fun(My m){cout<<"A="<<m.A<<endl;cout<<"B="<<B<<endl;}int My::B=100;int main(){My P(6),Q(8);My::fun(P);Q.fun(Q);return 0;}分析:2.设计一个含有静态成员、静态成员函数的程序,分析程序结果,理解静态成员(函数)与类和对象的关系。
参考程序:#include<iostream.h>class A{friend class B;//友元类的声明public:void Set(int i){x=i;}friend int add(A & f1);// 友元函数的声明void Display(){cout<<"x="<<x<<",y="<<y<<endl;}private:int x;static int y;};int add(A & f1){return f1.x+1;}class B{public:B(int i,int j);void Display();private:A a;//A类的对象a作为类B的私有成员};int A::y=1;//静态成员必须先赋初值B::B(int i,int j){a.x=i;A::y=j;}void B::Display(){cout<<"x="<<a.x<<",y="<<A::y<<endl; }void main(){A b;b.Set(5);//友元函数的调用cout<<add(b)<<endl;b.Display();B c(6,9);//a.x=6,X::y=9;c.Display();b.Display();}问题:(1)分析友元函数add()的定义、调用与成员函数的区别。
实验4 含有类的静态成员与类的友元的C++程序设计专业:计算机科学与技术班级:10计本1班学号:姓名:实验地点:B102实验时间:2011/11/1 指导教师:李佐勇一、实验目的1.理解类的静态成员解决共享问题的机制;2.掌握类的静态数据成员与静态函数成员的实现方法;3.理解利用友元关系实现数据共享的机制,掌握类的友元函数以及友元类的实现方法;4.学习多文件结构在C++程序中的使用。
二、实验环境一台PC机,Windows XP操作系统,Visual C++ 6.0开发环境。
三、实验内容1.设计一个解决王婆卖瓜问题的程序。
王婆卖瓜,每卖一个瓜,需记录该瓜的重量,还要记录所卖出的总重量和总个数,同时还允许退瓜。
设计一个具有静态数据、函数成员的watermelon类。
实现提示:西瓜类有3个数据成员:重量weight、总重量total_weight以及总个数total_number。
因为不论西瓜是否卖出,总重量total_weight和总个数total_number这两个数据总是要保留的,且这两个数据与单个的西瓜无关联,因此这两个数据要申明为静态数据成员。
成员函数:卖瓜用构造函数模拟,退瓜用析构函数模拟,瓜重用disp成员函数给出屏幕提示。
为了用不与特定对象相联系的静态成员函数来访问静态数据,还需要定义一个显示总重量和总个数的静态成员函数total_disp。
2.设计一个程序,其中有3个类,即CBank、BBank和GBank,分别为中国银行类、工商银行类和农业银行类。
每个类都包含一个私有数据balance,用于存放储户在该行的存款数,另有一个友元函数total用于计算储户在这3家银行中的总存款数。
3. 设计一个程序,其中有2个类,Point类为点类,包含2个私有数据x和y,表示点的坐标,line类为直线类,包含3个私有数据a、b和c,表示直线方程ax+by+c=0。
另有一个友元函数dist,用于计算一个点到直线的距离。
3.2 实验与实践任务3.2.1 实验名称静态成员和友元3.2.2 实验目的1.掌握静态成员的定义和使用。
2.掌握友元的定义和使用。
3.2.3 实验要求1.调试程序要记录调试过程中出现的问题及解决办法;2.编写程序要规范、正确,上机调试过程和结果要有记录,并注意调试程序集成环境的掌握及应用,不断积累编程及调试经验;3.在编写程序时,要按照多文件结构来组织程序。
4.做完实验后给出本实验的实验报告,实验报告的内容包括实验目的、实验内容和结果分析。
3.2.4 实验内容【P1】商店销售某一商品,商店每天公布统一的折扣(discount)。
同时允许销售人员在销售是灵活掌握售价(price),在此基础上,对一次购10件以上者,还可以享受9.8折优惠。
现在已知当天3名销售员的销售情况为:销售员货号(num)销货件数(quantity)销货单价(price)101 5 23.5102 12 24.56103 100 21.5请编程序,计算出当日此商品的总销售款sum,以及每件商品的平均售价。
要求用静态数据成员和静态成员函数【P2】创建一个SavingsAccount类:用static(静态)数据成员包含每个存款人的annualInterestRate(年利率)。
类的每个成员包含一个private数据成员savingsBalance,表示当前存款额。
提供一个calculateMonthlyInterest 成员函数,计算月利息,用savingsBalance乘以annualInterestRate除以12取得,并将当月月息加入savingsBalance。
提供一个静态成员函数modifyInterestRate,将静态annualInterestRate设置为新值。
实例化两个不同的SavingsAccount对象saver1和saver2,余额分别为$2 000.00和$3 000.00 将annualInterestRate设置为3%,计算每个存款人的月息并打印出新的结果。
面向对象程序设计实验指导书(适用:电子信息11级)彭召意陶立新编写计算机与通信学院2014.9目录实验一 C++基础的应用 (1)实验二类和对象的应用 (3)实验三类的构造函数、析构函数的应用 (4)实验四友员和运算符重载 (5)实验五类的继承与派生 (6)实验六类的多态性与虚函数 (7)附录:各实验的程序代码 (8)实验一 C++基础的应用(实验课时:2 实验性质:设计)实验名称: C++基础的应用实验目的: (1)进一步学习VC++6.0开发环境及程序调试方法。
(2)练习C++函数的定义及使用;(3)练习C++数组的定义及使用;(4)练习C++指针的定义及使用;(5)练习C++结构体的定义及使用;(6)练习多文件的程序的编译和运行方法;实验设备:(1)硬件:个人微机(配置不低于:CPU为P4,主频1.6G,内存256MB,硬盘40GB);(2)软件:操作系统为WindowsXP(或2000、server2003等),工具软件为Visual C++6.0。
实验内容: (1)熟悉Visual C++6.0编译系统的常用功能,特别是debug调试功能;(2)编程1:编写一个程序c1.cpp,用来求2个或3个整数的最大数。
要求:用重载函数的方法来求最大数;函数原型:int max( int a, int b) 和int max( int a, int b,int c)。
(3)编程2:编写一个程序c2.cpp,求:a!+ b! + c!的值。
要求:使用递归函数。
主程序和函数分开到两个源程序文件中,分别进行编译后,再运行;(4)编程3:有一个3*4的矩阵,要求编程求出其中值最大的那个元素的值,以及其所在的行号和列号;(5)编程4:建立一个动态链表并进行输出和删除管理。
链表的每个节点为学生信息,包括:学号,姓名,性别,下一学生信息的指针。
程序的工作:(a)建立三个学生信息的节点,然后顺序输出该三个学生信息;(b)删除中间的节点,再顺序输出学生信息。
实验4 多文件结构及静态成员和对象数组的使用一、实验目的1、掌握自定义头文件的方法;2、学会建立和调试多文件程序;3、了解静态成员的使用;4、掌握对象数组的使用。
二、实验内容1、编写一个函数,求数列运算中从n个不同的数中取r个数的所有选择的个数。
要求:(1)将main()函数放在一个文件中;(2)将另外两个函数fn(int n) ,Cnr(int n, int r)放在另一个文件中;(3)将函数原型说明放在一个头文件中;(4)建立一个项目,将这三个文件加到你的项目中,编译连接使你的程序正常运行。
2、设计一个Employee类,并在Employee类中增加一个静态数据成员来设置本公司员工编号基数,新增加的员工编号将在创建对象的同时自动在基数上增加。
另外,将Employee 类的声明部分和实现部分分成两个文件来实现。
编程实现之。
3、设计一个点类point,该类具有两个实数坐标。
希望主程序使用这个类完成下述功能:(l)主程序为类point申请10个连续存储空间。
(2)要求调用一个函数Set()从键盘输入10个对象的属性,并顺序存入申请的内存中。
(3)要求调用一个函数Display()显示10个对象的值。
(4)要求调用一个函数Lenth(),计算将这些点连成一条折线时,这条折线的长度。
(5)程序结束时,删除申请的内存。
(6)演示析构对象(动态对象或堆对象)的执行顺序。
设计这个类和各个函数并验证运算结果的正确性。
三.实验源代码1.//以下是cnr.h#ifndef cnr_h#define cnr_hint cnr(int ,int );#endif//以下是cnr.cpp#include "cnr.h";int cnr(int n,int r){if(n==r)return 1;else if(r==1)return n;else return cnr(n-1,r)+cnr(n-1,r-1); }//以下是main.cpp#include<iostream.h>#include"cnr.h";void main(){int n,r;cout<<"Please input n,r:"<<endl;cin>>n>>r;cout<<"C(n,r)为"<<cnr(n,r)<<endl; }2.//以下是employee.h#ifndef employee_h#define employee_hclass employee{public:employee(int,char *,char,int);~employee();void setemployee(int,char*,char,int);void print();private:static int basenum;int num;char * name;char sex;int wage;};#endif//以下是employee.cpp#include "employee.h"#include<iostream.h>#include<string.h>#include<assert.h>int employee::basenum=10;employee::employee(int nu,char * na,char s,int w){name=new char[strlen(na)+1];assert(name!=0);strcpy(name,na);num=nu+basenum;sex=s;wage=w;}employee::~employee(){delete [] name;}void employee::setemployee(int nu,char *na,char s,int w){delete [] name;name=new char[strlen(na)+1];assert(name!=0);strcpy(name,na);num=nu+basenum;sex=s;wage=w;}void employee::print(){cout<<"num:"<<num<<'\t'<<"name:"<<name<<endl<<"sex:"<<sex<<'\t'<<"wage:"<<wage<<endl;}//以下是main.cpp#include<iostream.h>#include"employee.h";void main(){employee num1(2,"oo",'q',5000),num2(3,"rr",'q',10000);cout<<"num1:"<<endl;num1.print();cout<<"num2:"<<endl;num2.print();num1.setemployee(2,"pp",'a',1000);cout<<"(after set) num1:"<<endl;num1.print();}3.//以下是point.h#ifndef point_h#define point_hclass point{public:point(int=0,int=0);~point();void set();void display();double length(const point &);private:int x;int y;};#endif//以下是point.cpp#include<iostream.h>#include<math.h>#include"point.h"point::point(int a,int b){x=a,y=b;cout<<"构造了点("<<x<<','<<y<<')'<<'\t'; }point::~point(){cout<<"析构了点("<<x<<','<<y<<')'<<'\t'; }void point::set(){int a,b;cout<<"Please input x and y"<<endl;cin>>a>>b;x=a,y=b;}void point::display(){cout<<'('<<x<<','<<y<<')'<<'\t';}double point::length(const point &a){return sqrt((a.x-x)*(a.x-x)+(a.y-y)*(a.y-y)); }//以下是main.cpp#include<iostream.h>#include<assert.h>#include"point.h"#define N 10void main(){int i;double length1=0;point *a;a=new point[N];assert(a!=0);for(i=0;i<N;i++)a[i].set();for(i=0;i<N;i++)a[i].display();for(i=0;i<N-1;i++)length1+=a[i].length(a[i+1]);cout<<"这些点所构成的折线长度为"<<length1<<endl;delete [] a;}四.实验感想这次试验对我来说真的比较难,实在是不太会,在参考了同学的程序N次之后,终于明白了建立工程的重要性,了解到各个部分之间是如何联系起来的。
南昌航空大学实验报告2011年11月9号课程名称:面向对象程序设计B 实验名称:静态成员与友元班级:姓名:同组人:无指导教师评定: 签名:一、实验目的(1)学习静态成员的使用,理解静态成员的特殊用途。
(2)学习友元函数及友元类,领会友元类的作用。
二、实验内容应用VC++6.0的编辑环境构造一个类Stack,设计一个整数链表类,实现栈操作。
类中需有记录结点个数的数据成员(静态成员),要有判空操作。
编制应用程序,取100次随机数(<1000),如果取到的随机数比前一个随机数大的话,入栈,然后逐个取出(即出栈过程)求其和。
用堆分配方法逐个产生满足条件(递增有序)的结点,插入栈中,每当出栈时,要及时将结点删除,求和工作放在类定义外(友元)。
注意:栈中最多会有100个元素,最少会有一个元素,这是由条件(递增有序)决定的。
三、概要设计要实现的功能:构造一个类Stack、设计一个整数链表类,实现栈操作、取100次随机数(<1000),如果取到的随机数比前一个随机数大的话,入栈,然后逐个取出(即出栈过程)求其和。
函数原型为:struct SNode{int data;SNode *next;};class Stack{public:Stack();~Stack();void Push(int e);//insert a data into stackint Pop();//delete a data from stackfriend int GetSum(Stack &);//get sum of stack,friend function//friend class getsum;// get sum of stack,friend class,you can try it using friend classstatic int num;//static numberprivate:SNode *head;};四、详细设计定义类Stack的函数:Stack::Stack(){Head=new SNode;Head->next=NULL;}设计一整数链表类,实现取100次随机数(<1000),如果取到的随机数比前一个随机数大的话,入栈,然后逐个取出的栈操作的函数:void Stack::Push(int e){SNode *p,*q;if(!(p=new SNode))exit(0);p->data=e;q=Head;while(q->next)q=q->next;q->next=p;p->next=NULL;num++;}int Stack::Empty(){return !num;}int Stack::Pop(){int e;if(Empty()){cout<<"The Stack is empty!"<<endl; exit(0);}SNode *p,*q;p=Head;q=p;while(p->next){q=p->next;if(!q->next)break;p=p->next;}p->next=NULL;e=q->data;delete q;num--;return e;}int Stack::GetTop(){int e;if(Empty()){cout<<"The Stack is empty!"<<endl; exit(0);}SNode *p;p=Head;while(p->next){p=p->next;}e=p->data;return e;}求和的函数为:int GetSum(Stack &a){int sum=0,m,tmp;m=a.num;cout<<endl<<"Pop Stack List is:"<<endl;for(int i=0;i<m;i++){tmp=a.Pop();cout<<" "<<tmp;sum+=tmp;}cout<<endl;return sum;}五、程序调试在函数调试的过程中,出现了以下错误提示信息:1、“Stack::Empty”: 函数调用缺少参数列表;请使用“&Stack::Empty”创建指向成员的指针原因为将语句if(Empty())中的括号()漏掉了。
实验5一、实验目的1、学习使用类的静态成员。
2、学习在程序中动态创建对象和对象数组。
3、学习并掌握使用this指针的方法。
4、掌握组合类的设计方法。
5、学习并掌握模板类的设计方法。
二、实验任务1、在实验4中设计了一个表示学生的Student类,在此要求对该类做如下扩充:a、向Student类中添加一个静态数据成员来存储一个班级所有学生的总人数。
b、设计相应的静态成员函数用来修改和读取这个静态数据成员。
c、向Student类中添加一个数据成员,用来存放一个学生选修的所有课程的平均值。
d、为Student类添加一个成员函数,用来比较两个学生的平均成绩,并返回平均成绩较高的对象。
e、编写程序,在主函数中根据需要(由键盘输入学生的人数)创建一个Student类的对象数组,存放一个班的学生信息。
从键盘输入每个学生的相关信息,然后按平均成绩从大到小的顺序对该数组进行排序。
2、创建类Cpu和Ram分别代表电脑的中央处理器和内存,然后创建表示电脑主机的类Computer,其中包含Cpu类和Ram类的对象类型的数据成员代表该电脑的中央处理器和主存储器。
要求为各个类设计默认的构造函数和带参数的构造函数。
3、队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
一个队列中的所有元素必须属于相同的类型,最先插入队列的元素最先被删除,而最后插入队列的元素最后被删除。
要求设计一个模板类Queue表示队列。
使用该模板类可以生成存储任意类型元素的队列类。
编写程序分别生成一个整数队列、一个浮点数队列和一个存储Student类对象的队列,并使用这3个队列存储相应类型的元素。
三、实验步骤1、创建VC++控制台应用程序exp5_1,在其中设计Student类,具体要求见实验4。
2、扩充Student类的功能,以下是具体说明:◆在类中添加一个静态的整型数据成员stunum,用来存放班级中所有学生的人数;◆在类中添加静态成员函数getstunum和setstunum用来读取和修改数据成员stunum;◆在类中添加浮点型数据成员average,用来存放一个学生全部课程成绩的平均值;◆给Student类添加一个成员函数comparescores,用来比较两个学生对象的平均成绩并返回平均值较高的对象,函数comparescores的原型如下:Student &comparescores(Student &stu);3、在程序的main函数中首先从键盘输入班级学生的人数,然后动态创建一个Student类的对象数组保存学生信息。
实验4 友元静态成员
1 指出程序运行的结果,并分析原因。
#include<iostream.h>
class Sample
{
int a,b;
static int c;
public:
Sample()
{
a=b=0;
c++;
}
void show()
{
cout<<"a="<<a<<','<<"b="<<b<<','<<"c="<<c<<endl;
}
};
int Sample::c=1;
void main()
{
Sample a1,a2;
a1.show();
a2.show();
}
运行结果:
a=0,b=0,c=3
a=0,b=0,c=3
2. 编写一个名为score的类,用于统计一个班的学生成绩。
其中使用一个静态成员数据tals来存储总分及一个静态成员函数re_tals()返回该总分。
并编写相应的测试程序。
省略号部分由自己编写程序。
程序编写如下:
#include<iostream.h>
class score
{
int mark[10];
public:
static int tals;
static int num;
void set()
{ int i;
{
cin>>mark[i];
num++;
……. //计算总分
}
cout<<"The scores of the class are following: "<<endl;
for(i=0;i<10;i++)
{cout<<mark[i]<<' ';}
cout<<'\n';
}
int get_num(void)
{return num;}
static int re_tals()
{ ……}
};
………….. //静态数据成员的初始化
void main()
{
score t;
cout<<"Please input the scores of the class:"<<endl;
t.set();
cout<<"The number of the scores is: "<<t.get_num()<<endl;
cout<<"The total score of the class is: "<<t.re_tals()<<endl; }
//
#include<iostream.h>
class score
{
int mark[10];
public:
static int tals;
static int num;
void set()
{ int i;
for(i=0;i<10;i++)
{
cin>>mark[i];
num++;
tals=tals+mark[i]; //计算总分
}
cout<<"The scores of the class are following: "<<endl;
{cout<<mark[i]<<' ';}
cout<<'\n';
}
int get_num(void)
{return num;}
static int re_tals()
{return tals;}
};
int score::tals=0; //静态数据成员的初始化
int score::num=0;
void main()
{
score t;
cout<<"Please input the scores of the class:"<<endl;
t.set();
cout<<"The number of the scores is: "<<t.get_num()<<endl;
cout<<"The total score of the class is: "<<t.re_tals()<<endl; }
#include<iostream.h>
class score
{
int mark[100];
public:
static int tals;
static int num;
void set()
{
int i;
cout<<"若输入完成请输0结束"<<endl;
for(i=0;i<100;i++)
{
cin>>mark[i];
num++;
tals=tals+mark[i];//计算总分
if(mark[i]==0)
break;
}
cout<<"The scores of the class are following: "<<endl;
for(int k=0;k<i;k++)
{
cout<<"学号:"<<k+1<<' ';
cout<<"分数:"<<mark[k]<<' ';
cout<<endl;}
cout<<'\n';
}
int get_num(void)
{return (num-1);}
static int re_tals()
{return tals;}
};
int score::tals=0; //静态数据成员的初始化
int score::num=0;
void main()
{
score t;
cout<<"Please input the scores of the class:"<<endl;
t.set();
cout<<"The number of the scores is: "<<t.get_num()<<endl;
cout<<"The total score of the class is: "<<t.re_tals()<<endl; }。