实验三 数组与指针实验

这篇文章展示了C++中使用数组、指针以及动态内存分配来操作对象的实例。通过类创建对象数组,初始化并访问成员函数,以及通过指针操作对象。此外,还提供了简单的银行账户管理系统和学生数据管理的示例,涉及存款、取款、查询余额及计算平均分的功能。
摘要由CSDN通过智能技术生成

【实验目的】

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.

答:数组和字面值不能使用引用。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挚爱宁静

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值