【实验目的】
1.学习使用数组数据对象。
2.掌握指针的使用方法。
3.学习通过动态内存分配实现动态数组的定义和使用,并体会指针在其中的作用。
4.掌握静态成员的使用方法。
5.练习通过Debug观察指针的内容及其所指对象的内容。
【实验内容】
1.运行下列程序,观察运行结果。
(1)#include<iostream.h>
class ArrayElem
{
int x;
public:
ArrayElem(inti){x=i;} //带参数的构造函数
intgetx(){return x;}
};
int main()
{
ArrayElemobs[4] ={-1,-2,-3,-4}; //创建对象数组并初始化
for(inti=0;i<4;i++)
cout<<"obs["<<i<<"].getx():"<<obs[i].getx()<<"\n";//访问数组元素的成员
return(0);
}
通过类创建对象数组并初始化,并把-1、-2、-3、-4分别赋值给数组的每个元素,通过构造函数把数组的元素赋给x,再调用类的成员函数getx返回值x并显示出来。
(2)#include<iostream.h>
class NumClass
{
int num;
public:
void set_num(intval){num=val;}
voidshow_num(){cout<<"The num is:"<<num<<"\n";}
};
int main()
{
NumClassob,*p; //声明一个对象和指向对象的指针
ob.set_num(10);ob.show_num(); //通过对象ob直接调用成员函数
p=&ob; //使对象指针p指向对象ob
p->set_num(20);p->show_num(); //通过指针调用成员函数
return(0);
}
通过对象ob调用成员函数set_num并把10赋值给num,然后通过成员函数show_num将num显示出来;
通过指针p指向对象op,然后通过指针p调用成员函数set_num并把20赋值给num,然后通过成员函数show_num将num显示出来;
(3)#include<iostream.h>
class NumClass
{
int num;
public:
voidset_num(int val){num=val;}
voidshow_num(){cout<<"The num is:"<<num<<"\n";}
};
int main()
{
NumClassob[2],*p; //声明一个对象数组和对象指针
ob[0].set_num(10);ob[1].set_num(20); //通过对象数组名和下标来访问
p=&ob[0]; //将对象数组的首元素地址赋给指针
p->show_num(); //通过指针显示数组元素
p++; p->show_num();
return(0);
}
通过对象数组名和下标来访问类的成员函数set_num,并把10和20分别赋值给对象数组ob【0】和ob【1】里的num;再通过指针指向对象ob【0】,通过指针来显示数组ob【0】的元素num;然后移动指针,显示数组ob【1】的元素num;
(4)#include<iostream.h>
class NumClass
{
int num;
public:
voidset_num(int val){num=val;}
voidshow_num(){cout<<"The num is:"<<num<<"\n";}
};
int main()
{
NumClass*p=new NumClass[2]; //动态创建一个对象数组
p[0].set_num(10);p[1].set_num(20); //通过指针访问数组元素的成员
p[0].show_num();p[1].show_num(); //通过指针显示数组元素
delete[] p; //删除整个对象数组
return(0);
}
创建动态对象数组p【】,再通过指针把10和20赋值给数组p【0】和p【1】里的元素num,并将其输出显示;最后可以将整个对象数组删除;
2.用对象数组实现一个简单的银行账户管理系统,完成多个用户的开户、存款、取款和查询余额等行为。
#include<iostream>
#include<string.h>
#include<stdlib.h> //system("cls")清屏函数和exit()用到此头文件
#include<conio.h> //getch()要用到此头文件
using namespacestd;
class Account
{
private:
char mName[10]; //银行账户的户名
long mSN; //本账户的帐号
float mBalance; //本账户当前的余额
public:
Account(); //无参构造函数
void deposit(); //往账户中存款
int withdraw(); //从账户中取款
void getBalance(); //查询余额
long getmSN()
{
return mSN;
} //取得客户的帐号
};
Account::Account()//无参构造函数,从键盘输入信息进行初始化
{
cout<<"请输入户名、账号、存款:"<<endl;
cout<<"户名:"<<endl;
cin>>mName;
cout<<"账号:"<<endl;
cin>>mSN;
cout<<"存款:"<<endl;
cin>>mBalance;
}
//往账户中存款,存款金额为amount
voidAccount::deposit()
{
floatamount;
cout<<"请输入存款金额"<<endl;
cin>>amount;
mBalance=amount+mBalance;
}
//从账户中取款,取款金额为amount
intAccount::withdraw()
{
float amount;
cout<<"请输入取款金额"<<endl;
cin>>amount;
int c;
c=amount>mBalance?0:1;
if(amount>mBalance)
{
mBalance=mBalance;
}
else
{
mBalance=mBalance-amount;
}
return(c);
}
//查询帐户当前余额
voidAccount::getBalance()
{
cout<<"账户余额为:"<<mBalance<<endl;
}
//菜单函数
void menu(void)
{
system("cls");
cout<<"_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*"<<endl;
cout<<"_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*"<<endl;
cout<<" 简单银行账户系统 "<<endl<<endl;
cout<<"1.存款"<<endl;
cout<<"2.取款"<<endl;
cout<<"3.查询余额"<<endl;
cout<<"4.退出"<<endl;
cout<<"_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*"<<endl;
cout<<"_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*"<<endl;
cout<<endl<<endl<<endl;
}
//主函数
int main()
{
int cho,n,r,i,flag=0;
long aNo;
cout<<"要开的账户数目为:"<<endl;
cin>>n;
Account *p; //定义对象指针
p=new Account[n]; //动态创建对象数组
while(1)
{
menu();
do
{
cout<<"请根据菜单进行操作选择:"<<endl;
cin>>cho;
// getch(); //清除键盘缓冲区内容,为下一次正确读入做准备。
}while(cho<1||cho>4);
switch(cho)
{
case 1://存款
cout<<"请输入帐号:";
cin>>aNo;
for(i=0;i<n;i++)
{
if((p+i)->getmSN()==aNo)
{
flag=1;
(p+i)->deposit();
(p+i)->getBalance();
break;
}
}
if(flag==0)
cout<<"对不起,输入帐号有错误!"<<endl;
getch();
break;
case 2://取款
cout<<"输入账号:";
cin>>aNo;
for(i=0;i<n;i++)
{
if((p+i)->getmSN()==aNo)
{
flag=1;
r=(p+i)->withdraw();
if(r==0)
{
cout<<"透支!"<<endl;
}
else
{
cout<<"取款成功!"<<endl;
}
break;
}
}
if(flag==0)
{
cout<<"账号错误!"<<endl;
}
getch();
break;
case 3://查询
cout<<"输入账号:";
cin>>aNo;
for(i=0;i<n;i++)
{
if((p+i)->getmSN()==aNo)
{
flag=1;
(p+i)->getBalance();
break;
}
}
if(flag==0)
{
cout<<"账号错误!"<<endl;
}
getch();
break;
case 4://退出
return 0;
}
}
delete[] p; //释放空间
return 0;
}
3.N个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分。设计一个学生类,包括学号、姓名和成绩数据成员外,还有两个静态变量sum和num,分别存放总分和人数,另有两个普通成员函数setdata()和disp(),分别用于给数据成员赋值和输出数据成员的值,另有一个静态成员函数avg(),它用于计算平均分。在main()函数中定义了一个对象数组用于存储输入的学生数据。
#include<iostream>
#include<iomanip>
#include<string.h> //strcpy()函数需要申明的头文件
using namespace std;
class student
{
public:
void setdata(intn,char na[],double d);//给数据成员赋值
void disp(); //输出数据成员的值
double staticavg();//静态成员函数avg()用于计算平均分
private:
int no; //学号
char name[10]; //姓名
double score; //成绩
double staticsum; //存放总分
int static num; //存放人数
};
double student::sum=0; //静态数据成员赋初值
int student::num=0;
void student::setdata(int n,char na[],double s)
{
no=n;
score=s;
strcpy(name,na);
sum+=s;
num++;
}
void student::disp()
{
cout<<setw(3)<<no<<setw(6)<<name<<setw(4)<<score<<endl;
}
double student::avg()
{
return sum/num;
}
int main()
{
int i,n,N;
double s;
char na[10];
cout<<"请输入存入学生的人数"<<endl;
cin>>N;
student st[N]; //定义一个对象数组,用于存储输入的学生数据
for(i=0;i<N;i++)
{
cout<<"请分别输入学号 姓名 成绩:"<<endl;
cin>>n>>na>>s;
st[i].setdata(n,na,s);
}
cout<<"输出学生信息"<<endl;
cout<<"学号 姓名 成绩"<<endl;
for(i=0;i<N;i++)
{
st[i].disp();
}
cout<<"平均分="<<st[N-1].avg()<<endl;
}
【思考题】
1.数组之间如何赋值?
2.引用和指针有何区别?
3.对那些类型的数据不能使用引用?
1.
答:通过for循环,新建str1、str2两个数组,通过
for(i=0;i<N;i++)
{
str2[i]=str1[i];
}
代码将str1数组赋值给str2数组,使用System,arraycopy创建src1,src2两个数组,使用System,arraycopy(src1,0,,src2,0,6);代码将src1数组赋值给src2数组,使用clone,新建arr1,arr2两个数组,通过arr2=(int[]),arr1.clone();代码将arr1数组赋值给arr2数组;
2.
答:引用必须被初始化,指针不需要;
引用初始化以后不能被改变,指针可以改变所指的对象;
不存在指向空值的引用,但是存在指向空值的指针;
3.
答:数组和字面值不能使用引用。