第七週任務一之類中靜態數據成員及成員函數(改進篇)

改進之後的源程序:

//下面寫出靜態成員的初始化及各成員函數的定義
/* (程序頭部註釋開始)
* 程序的版權和版本聲明部分
* Copyright (c) 2011, 煙臺大學計算機學院學生 
* All rights reserved.
* 文件名稱: Time類                          
* 作    者: 114-3 張宗佳                            
* 完成日期: 2012 年 4  月 2 日
* 版 本 號: vc.5    

* 對任務及求解方法的描述部分
* 輸入描述:
* 問題描述:含有靜態數據成員和成員函數的Time類:類中所有的對象共有的數據
* 程序輸出:根據is_24和from0,輸出適合形式-20:23:5/8:23:5 pm/08:23:05 pm
* 程序頭部的註釋結束
*/
#include<iostream>

#include<iomanip>

using namespace std;

class Time
{
public:
	
	Time(int = 0, int = 0, int = 0);
	
	void show_time( ); //根據is_24和from0,輸出適合形式-20:23:5/8:23:5 pm/08:23:05 pm
	
	void add_seconds(int); //增加n秒鐘
	
	void add_minutes(int); //增加n分鐘  
	
	void add_hours(int); //增加n小時  
	
	static void change24();  //改變靜態成員is_24,在12和24時制之間轉換
	
	static void changefrom0();   //改變靜態成員from0,切換是否前導0
	
private:
	
	static bool is_24; //爲true時,24小時制,如20:23:5;爲flase,12小時制,顯示爲8:23:5 pm 
	
	static bool from0; //爲true時,前導0,8:23:5顯示爲08:23:05
	
	int hour;
	
	int minute;
	
	int sec;
};
//下面寫出靜態成員的初始化及各成員函數的定義
Time::Time(int h,int m,int s):hour(h),minute(m),sec(s){}

bool Time::is_24 = true;//在定義靜態數據成員的時候前面要有類型名,然後是"類名::靜態數據成員名 = 初值"

bool Time::from0 = false;

//根據is_24和from0,輸出適合形式-20:23:5/8:23:5 pm/08:23:05 pm
void Time::show_time( )
{
	if(is_24 == true)
	{
		if(from0 == false)
		{
			cout << hour << ":" << minute << ":" << sec << endl;
		}
		else
		{
			cout << setfill('0') << setw(2) << hour  << ":" << setfill('0') << setw(2) << minute << ":" << setfill('0') << setw(2) << sec << endl;
		}
	}
	else 
	{
		if(from0 == true)
		{
			if(hour > 12)
			{
				cout << setfill('0') << setw(2) << hour % 12  << ":" << setfill('0') << setw(2) << minute << ":" << setfill('0') << setw(2) << sec << "pm" << endl;
			}
			else 
			{
				cout << setfill('0') << setw(2) << hour % 12 << ":" << setfill('0') << setw(2) << minute << ":" << setfill('0') << setw(2) << sec << "am" << endl;
			}
		}
		else
		{
			if(hour > 12)
			{
				cout << hour % 12 << ":" << minute << ":" << sec << "pm" << endl;
			}
			else
			{
				cout << hour % 12 << ":" << minute << ":" << sec << "am" << endl;
			}
		}
	}
}
//增加n秒鐘
void Time::add_seconds(int s)
{
	sec += s;
	
	if(sec > 60)
	{
		minute = (sec - 60) % 60;
		
		sec = 0;
	}
}
//增加n分鐘
void Time::add_minutes(int m)  
{
	minute += m;
	
	if(minute > 60)
	{
		hour = (minute - 60) % 60;
		
		minute = 0;
	}
}
//增加n小時
void Time::add_hours(int h)
{
	hour += h;
	
	if(hour > 24)
	{
		hour = (hour - 24) % 24;
	}
}
//改變靜態成員is_24,在12和24時制之間轉換
void Time::change24()
{
	is_24 = false;
}
//改變靜態成員from0,切換是否前導0
//靜態成員函數是爲了能處理靜態數據成員的,不指向某一對象,是類的一部分,無法對非靜態成員進行默認訪問,
//所以這裏不能用到hour,minute和sec
void Time::changefrom0() 
{
	from0 = true;
}

int main( )   
{
	Time t1(23,14,25),t2(8,45,6); 
	
	cout << "24時制, 不前導0:" << endl;
	
	cout << "t1是:";
	
	t1.show_time();
	
	cout << "t2是:";
	
	t2.show_time();
	
	t1.add_hours(10);
	
	t2.add_hours(10);
	
	Time::changefrom0(); //注意此處調用靜態成員
	
	cout << "10小時後, 切換是否前導0:" << endl;
	
	cout << "t1是:";
	
	t1.show_time();
	
	cout<< "t2是:";
	
	t2.show_time();
	
	t1.change24();
	
	cout << "換一種制式:" << endl;
	
	cout << "t1是:";
	
	t1.show_time();
	
	cout << "t2是:";
	
	t2.show_time();
	
	system("pause");
	
	return 0;
}


實驗結果:

經驗積累:

1.在使用setfill()控制符時,括弧裏的填充符要用單引號‘’括起來,'0'是用於在長度爲2的時間格式前導0的

2.在show_time成員函數中,要判斷is_24和from0是truth 還是false,來判斷是24時制還是12時制,要不要前導0

3.靜態成員函數無法訪問普通的數據成員,只能訪問靜態數據成員,所以在定義靜態成員函數時不能有普通的數據成員

4.要注意定義靜態成員函數的格式:類型名 類名::靜態數據成員名 = 初值

經驗積累:

經過改進,程序終於不再那麼冗長了...,用到了輸入輸出流的控制符,搞定了前導0的使用

源程序:

/* (程序頭部註釋開始)
* 程序的版權和版本聲明部分
* Copyright (c) 2011, 煙臺大學計算機學院學生 
* All rights reserved.
* 文件名稱: Time類                          
* 作    者: 114-3 張宗佳                            
* 完成日期: 2012 年 4  月 1 日
* 版 本 號: vc.4      

* 對任務及求解方法的描述部分
* 輸入描述:
* 問題描述:含有靜態數據成員和成員函數的Time類:類中所有的對象共有的數據
* 程序輸出:根據is_24和from0,輸出適合形式-20:23:5/8:23:5 pm/08:23:05 pm
* 程序頭部的註釋結束
*/
#include<iostream>

using namespace std;

class Time
{
public:
	
	Time(int = 0, int = 0, int = 0);
	
	void show_time( ); //根據is_24和from0,輸出適合形式-20:23:5/8:23:5 pm/08:23:05 pm
	
	void add_seconds(int); //增加n秒鐘
	
	void add_minutes(int); //增加n分鐘  
	
	void add_hours(int); //增加n小時  
	
	static void change24();  //改變靜態成員is_24,在12和24時制之間轉換
	
	static void changefrom0();   //改變靜態成員from0,切換是否前導0
	
private:
	
	static bool is_24; //爲true時,24小時制,如20:23:5;爲flase,12小時制,顯示爲8:23:5 pm 
	
	static bool from0; //爲true時,前導0,8:23:5顯示爲08:23:05
	
	int hour;
	
	int minute;
	
	int sec;
};
//下面寫出靜態成員的初始化及各成員函數的定義
Time::Time(int h,int m,int s):hour(h),minute(m),sec(s){}

bool Time::is_24 = true;//在定義靜態數據成員的時候前面要有類型名,然後是"類名::靜態數據成員名 = 初值"

bool Time::from0 = false;

//根據is_24和from0,輸出適合形式-20:23:5/8:23:5 pm/08:23:05 pm
void Time::show_time( )
{
	if(is_24 == true)
	{
		if(from0 == false)
		{
			cout << hour << ":" << minute << ":" << sec << endl;
		}
		else
		{
			if(hour < 10)
			{
				cout << "0" << hour << ":";
			}
			else
			{
				cout << hour << ":";
			}
			if(minute < 10)
			{
				cout << "0" << minute << ":";
			}
			else 
			{
				cout << minute << ":";
			}
			if(sec < 10)
			{
				cout << "0" << sec;
			}
			else 
			{
				cout << sec;
			}
		}
	}
	else 
	{
		int h;
		
		h = hour;
		
		if(h > 12)
		{
			h = h % 12;
			
			if(from0 == false)
			{
				cout << h << ":" << minute << ":" << sec << '\t' << "pm" << endl;
			}
			else
			{
				if(h < 10)
				{
					cout << "0" << h << ":";
				}
				else
				{
					cout << h << ":";
				}
				if(minute < 10)
				{
					cout << "0" << minute << ":";
				}
				else 
				{
					cout << minute << ":";
				}
				if(sec < 10)
				{
					cout << "0" << sec << '\t' << "pm";
				}
				else 
				{
					cout << sec << '\t' << "pm";
				}
			}
		}
		else
		{
			h = h % 12;
			
			if(from0 == false)
			{
				cout << h << ":" << minute << ":" << sec << '\t' << "am" << endl;
			}
			else
			{
				if(h < 10)
				{
					cout << "0" << h << ":";
				}
				else
				{
					cout << h << ":";
				}
				if(minute < 10)
				{
					cout << "0" << minute << ":";
				}
				else 
				{
					cout << minute << ":";
				}
				if(sec < 10)
				{
					cout << "0" << sec << '\t' << "am";
				}
				else 
				{
					cout << sec << '\t' << "am";
				}
			}
		}
		
	}
	cout << endl;
}
//增加n秒鐘
void Time::add_seconds(int s)
{
	sec += s;
	
	if(sec > 60)
	{
		minute = (sec - 60) % 60;
		
		sec = 0;
	}
}
//增加n分鐘
void Time::add_minutes(int m)  
{
	minute += m;
	
	if(minute > 60)
	{
		hour = (minute - 60) % 60;
		
		minute = 0;
	}
}
//增加n小時
void Time::add_hours(int h)
{
	hour += h;
	
	if(hour > 24)
	{
		hour = (hour - 24) % 24;
	}
}
//改變靜態成員is_24,在12和24時制之間轉換
void Time::change24()
{
	is_24 = false;
}
//改變靜態成員from0,切換是否前導0
//靜態成員函數是爲了能處理靜態數據成員的,不指向某一對象,是類的一部分,無法對非靜態成員進行默認訪問,
//所以這裏不能用到hour,minute和sec
void Time::changefrom0() 
{
	from0 = true;
}

int main( )   
{
	Time t1(23,14,25),t2(8,45,6); 
	
	cout << "24時制, 不前導0:" << endl;
	
	cout << "t1是:";
	
	t1.show_time();
	
	cout << "t2是:";
	
	t2.show_time();
	
	t1.add_hours(10);
	
	t2.add_hours(10);
	
	Time::changefrom0(); //注意此處調用靜態成員
	
	cout << "10小時後, 切換是否前導0:" << endl;
	
	cout << "t1是:";
	
	t1.show_time();
	
	cout<< "t2是:";
	
	t2.show_time();
	
	t1.change24();
	
	cout << "換一種制式:" << endl;
	
	cout << "t1是:";
	
	t1.show_time();
	
	cout << "t2是:";
	
	t2.show_time();
	
	system("pause");
	
	return 0;
}


實驗結果:

經驗積累都寫到註釋裏了,在這裏就不寫了

上機感言:

終於在週末發了一次博文,雖然挺順利,不過好像把show_time成員函數編複雜了,在研究研究...



發佈了79 篇原創文章 · 獲贊 9 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章