面向对象程序设计,实验一 C++函数程序设计
實驗目的及要求:
1.理解并掌握類的定義,實例化的方法。
2.了解類的構造函數和析構函數.
3.學習類成員訪問控制的應用。
4.了解類的常數據成員和常函數成員。
5.了解類的靜態數據成員和靜態成員函數。
6.理解友元函數和友元類;并掌握友元函數的使用。
7.理解構造函數與解析函數的含義及特點。
8.掌握構造函數的幾種類型。
9.掌握構造函數和析構函數的執行順序。
實驗環境:
操作系統:
開發環境:
實驗內容:
一、指出程序的錯誤。
#include
using namespace std;
class CTest{
public:
const int y2;
CTest (int i1,int i2):y1(i1),y2(i2)
{ y1=10;
x=y1;
}
int readme() const;
//…
private:
int x;
const int y1;
};
int CTest::readme() const
{ int i;
i=x;
x++;
return x;
}
int main()
{ CTest c(2,8);
int i=c.y2;
c.y2=i;
i=c.y1;
return 0;
}
2.指出下面程序中的錯誤,并說明原因。
#include
using namespace std;
class CTest{
public:
CTest ()
{ x=20;
}
void use_friend();
private:
int x;
friend void friend_f(CTest fri);
};
void friend_f(CTest fri)
{ fri.x=55;
}
void CTest::use_friend()
{ CTest fri;
this->friend_f(fri);
::friend_f(fri);
}
int main()
{ CTest fri,fri1;
fri.friend_f(fri);
friend_f(fri1);
return 0;
}
3.指出下面程序中的錯誤,并說明原因。
#include
using namespace std;
class CTest{
public:
CTest ()
{ x=20;
}
void use_this();
private:
int x;
};
void CTest::use_this()
{ CTest y,*pointer;
this=&y;
*this.x=10;
pointer=this;
pointer=&y;
}
int main()
{ CTest y;
this->x=235;
return 0;
}
二、編程題
1.構建一個類book,其中含有兩個私有數據成員qu(數量)和price(價格), 建立一個有5個元素的數組對象,將qu初始化為1~5,將price 初始化為qu的10倍。顯示每個對象的qu*price。
2.定義一個MyString類,實現兩個字符串相加。要求定義類的數據成員為字符指針,實現深拷貝函數。
要求:不能使用,可以使用
已知測試函數如下:
int main()
{
MyString str1(“Hello”);
MyString str2(" World!");
str1.MyStrcat(str2);
str1.display(); //輸出Hello World!
return 0;
}
3.創建一個名為Temperature 的類,它包含下面的成員:
① 用來保存溫度的temp 數據成員;
② 用來保存用戶輸入的全部溫度值的totTemp 靜態數據成員,以及用來計數的count靜態數據成員;
③ 一個包含來自用戶輸入的溫度值(temp)并且累加totTemp 的成員函數setTemp,把temp 加入totTemp 的當前值;
④ 一個計算和返回每周平均溫度的靜態成員函數Average()。
已知main( ) 函數如下。其功能為創建Temperature 類的對象數組,調用類成員函數從鍵盤獲得一周的溫度,然后計算并且顯示平均溫度。
已知測試函數為:
int main()
{ Temperature t[10];
double temp;
int i;
for(i=0;i<7;i++)
{ cout<<“輸入第”<<i+1<<“天的溫度:”<<endl;
cin>>temp;
t[i].setTemp(temp);
}
cout<<“七天的平均溫度為:”<<Temperature::Average()<<endl;
return 0;
}
4.編寫一個有關股票的程序,其中有兩個類:一個是深圳類shen_stock,另一個是上海類shang_stock。類中有三項私有數據成員:普通股票個數general、ST股票個數st和PT股票個數pt,每一個類分別有自己的友元函數來計算并顯示深圳或上海的股票總數(三項的和)。兩個類還共用一個count(),用來計算深圳和上海總共有多少股票并輸出。
要求使用多文件編程。
已知測試程序如下:
int main()
{ shang_stock shanghai(1600,20,10); // 建立對象
// 表示上海有1600支普通股票,20支ST股票, 10支PT股票
shen_stock shenzhen(1500,15,8); // 建立對象
// 表示深圳有1500支普通股票,15支ST股票,8支PT股票
shang_count(shanghai); // 計算上海的股票總數
shen_count(shenzhen); // 計算深圳的股票總數
count(shanghai,shenzhen); // 計算上海和深圳的股票總數
return 0;
}
調試過程及實驗結果:
1、輸出結果:10
20
本題考查的是引用,k開始為0,執行f(k)后,k變為0+10=10,所以第一個結果輸出為10。因為m是引用,所以m和k是同一內存變量,所以m變為20,k的輸出也是20.
2、
先對數組a初始化,然后以時間作為標準隨機賦值,然后輸出隨機賦值之后的數。調用maxmin函數,找尋最大值和最小值。在maxmin函數中,用for循環進行數組中各個元素的比較,從而找出最大值和最小值。
3、
在主函數定義字符串型變量s,然后用getline獲得字符串,getline的優點在于可以獲取空格,然后執行函數tongji,在函數中,用字符串s定義為引用,作為形參,字符串可以直接用[ ]來訪問,然后根據字母,數字,空格,和其他字符在ASCII中的位置,來統計個數。
4、
重載函數指的是函數的參數類型不同或者參數類型順序不同,在這里是參數的類型不同,分別為int 和double,兩次調用Max函數,傳入不同的參數就調用了對應的函數,編譯器會根據傳入的實參與幾個重載函數主義匹配。
5、
與第4題相比,增加了函數模板和模板函數,但主題思路還是相同,但字符串在比較時,比較的是ASCII碼,ASCII對應的數字大,這個字符串就大。函數模板提供了重用程序源代碼的有效方法。
調試過程及實驗結果:
(詳細記錄在調試過程中出現的問題及解決方法。記錄實驗執行的結果,可以截圖)
一、改錯題
1、
將文件中的const去掉,并將x和y1改為公有,因為私有屬性只能訪問數據,不能改寫。然后加上cout<<i<<endl;就可以輸出i的值。這個題目主要考了類的屬性private,和public的作用,還有const修飾符的作用,即:在定義常對象時必須賦值,常對象是不能改變的量等知識。
2、
友元函數不屬于任何類,不是成員函數,只是為了讓含有友元函數的類的成員能被這個友元函數訪問。所以,從編譯角度來說,只需要將函數user_friend()和main()中的限制符號(就是實例名)去掉,去掉this->friend_f(fri);中的this,因為有元函數可以直接訪問private屬性,并去掉主函數中的fri.friend_f(fri);中的fri. 因為友元函數不屬于任何類,不能用類來訪問。本題目主要考察了有元函數的使用和友元函數的作用。
3、 this=&y; *this.x=10; 這兩句錯誤,第一句不能對this直接賦值。第二句應改為this->x=10; 還有main函數中的this->=235錯誤,this的引用不能在外部函數中。這個題目主要考察了this的用法。
二、編程題
1、
在主函數中,首先建立有5個元素的數組對象,然后分別代入類中。在類中,定義公有屬性的運算過程,qu和price定義為私有,這樣只能從類內訪問qu和price,然后定義show()為輸出函數。重點在于建立五個元素的數組對象,并分別賦值1~5.
2、
這個題較為復雜,首先不能用,只能用,所以在整個賦值過程中我們使用的是字符串數組。首先要聲明所需的連接函數和輸出函數,在連接函數中,需要擴充字符串的長度,也要考慮結尾字符的長度,所以要+1,通過數組的遍歷,實現在str1后面接上str2,最后將接好的值賦給str1,再輸出。難點在于指針的使用,還有對字符串數組長度的控制,再就是對new動態申請內存空間的應用。
3、
首先,分別在類中聲明各個函數,setTemp用于累加,Average函數用來求每周溫度的平均值,然后在加上題目要求的主函數,來計算7天的平均溫度。題目的關鍵在于各個成員函數的定義和配合,還要注意靜態成員Average和count的使用,既考察了成員函數,又考察了靜態成員。
4、
首先,先編寫主函數的源程序,再編寫上海股票和深圳股票的源程序,在主函數的程序里,調用外部程序深圳股票、上海股票即可完成計算。題目主要考察了多文件編程的方法,還有友元函數的使用。(因為不太會建立多個文件之間的聯系,還沒能通過編譯,只是把程序和主要思路寫了出來)
總結:
(對實驗結果進行分析,問題回答,實驗心得體會,字數150字以上)
1、這一題一定要用引用,注意引用必須初始化,而且引用在初始化時只能綁定左值,不能綁定常量值。要注意引用的使用方法和要求,要熟知引用的定義。
2、我認為第二題重點在于二維數組的使用,找尋最大值和最小值本身這個算法并不復雜。我認為這個題目中對于我的難點是隨機賦值,因為這個函數不常用,所以在這方面花費的時間比較多。要注意C++函數庫中有max和min函數,所以在定義變量名的時候,要注意不能定義這兩個名字。
3、題目的關鍵在于用getline,輸入函數有很多種,我認為getline是最合適的,因為它可以接收空格,還有一個重點是字符串可以直接用[ ]來訪問,增加了很大的便利性,最后就是ASCII中字母,數字,空格,等的順序要記住。
4、本題重新鞏固了重載函數的知識點,并沒有過難的地方,重點在于如何定義重載函數。
5、函數模板的實現,提供了重用程序源代碼的有效方法。模板實現了代碼的復用,是一種很有效的工具。也要清楚函數模板是模板;模板函數是函數這個區別
附錄:
1、
#include
using namespace std;
int &f(int &i)
{ i+=10;
return i;
}
int main()
{ int k=0;
int &m=f(k);
cout<<k<<endl;
m=20;
cout<<k<<endl;
return 0;
}
2、
#include
#include<time.h>
#include<stdlib.h>
#define random(x)(rand()%x)//生成0到x內的一個隨機數 ,然后將這個值賦給random(x)
using namespace std;
void maxmin(int (*a)[4],int &Max,int &Min)//尋找最大值,最小值的函數
{
Max=a[0][0];//進行數組初始化為0
Min=a[0][0];
for(int i=0;i<5;i++)
{
for(int j=0;j<4;j++)
{
if(a[i][j]>Max)
{
Max=a[i][j]; //求最大值的過程
}
else if(a[i][j]<Min)
{
Min=a[i][j]; //求最小值的過程
}
}
}
}
int main()
{
int a[5][4]={0};
srand((int)time(0));//以當前時間對應的int值為隨機序列起點
for(int i=0;i<5;i++)
{
for(int j=0;j<4;j++)
{
a[i][j]=random(100);//使用隨機函數獲得賦值
cout<<a[i][j]<<endl;//輸出賦值后數組的值
}
}
int Max=0,Min=0;
maxmin(a,Max,Min);
cout<<“Max=”<<Max<<endl;//輸出最大值
cout<<“Min=”<<Min<<endl;//輸出最小值
return 0;
}
3、
#include
#include
using namespace std;
void tongji(string &s)//定義一個統計函數,以字符串作為引用,作為形參
{
int zimu=0,kongge=0,shuzi=0,qita=0,i; //字母,數字,空格,其他字符的個數初始化為0
for(i=0; s[i]!=’\0’; i++) //定義for循環函數,用來ASCII查找
{
if(s[i]==32)
kongge++; //在ASCII中,32是空格
else if((s[i]>=48)&&(s[i]<=57))
shuzi++; //在ASCII中,48到57是數字
else if(((s[i]>=97)&&(s[i]<=122))||((s[i]>=65)&&(s[i]<=90)))
zimu++; //在ASCII中,65到90為大寫字母AZ,97到122為小寫字母az
else
qita++;
} //剩下的在ASCII中為其他字符
cout<<“空格:”<<kongge<<"\n"<<“數字:”<<shuzi<<"\n"<<“字母:”<<zimu<<"\n"<<“其他字符:”<<qita<<endl;
}
int main()
{
string s; //定義字符串s
cout<<“請輸入:”<<endl;
getline(cin,s); //從鍵盤中輸入字符串s
tongji(s); //調用函數
return 0;
}
4、
#include
using namespace std;
double Max(double x,double y) //double類型的重載函數
{
if(x>y) //如果a>b,返回a,否則返回b
return x;
else
return y;
}
int Max(int x,int y) //int類型的重載函數
{
if(x>y) // 如果a>b,返回a,否則返回b
return x;
else
return y;
}
int main()
{
int a=6,b=8; //定義a為6,b為8作為例子
cout<<Max(a,b)<<endl;
double c=2.2,d=6.5; //定義c為2.2,b為6.5作為例子
cout<<Max(c,d)<<endl;
return 0;
}
5、
#include
#include
using namespace std;
template //定義函數模板
T Max(T & x,T & y)
{
if(x<y)
return y;
else
return x;
}
int main()
{
int a=6,b=8; //定義a為6,b為8作為例子
cout<<Max(a,b)<<endl;
double c=2.2,d=6.5; //定義c為2.2,b為6.5作為例子
cout<<Max(c,d)<<endl;
string s1=“123ab”;
string s2=“ab123”; //定義s1 s2作為例子
cout<<Max(s1,s2)<<endl;
return 0;
}
總結
以上是生活随笔為你收集整理的面向对象程序设计,实验一 C++函数程序设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字IC设计工程师笔试面试经典100题-
- 下一篇: 【Arduino实验09 外部中断触发报