按此前往C++完整教學目錄

 

 

在上一篇:輸出排版中提到,排版時要在每一個cout物件之前設定cout.width()

若嫌這樣太過麻煩,可利用setw(n)函式來設定n個預留的空白字元,而使用前要在標頭檔加上#include <iomanip>

使用方法例如:

cout<<setw(5)<<"aaa"<<setw(5)<<"bbb"<<"ccc";

顯示結果為  aaa  bbbcc

(2)對於大量排版輸出,上述方法還是很麻煩,且容易寫錯。此時,建議使用自定函式來解決,如:

void my_out(int n,string s1,string s2,string s3,string s4,string s5,string s6)

{cout.setf(ios_base::left,ios_base::adjustfield);

cout.width(n);cout<<s1;

cout.width(n);cout<<s2;

cout.width(n);cout<<s3;

cout.width(n);cout<<s4;

cout.width(n);cout<<s5;

cout.width(n);cout<<s6;

cout<<endl;

cout.setf(ios_base::right,ios_base::adjustfield);}

int main()  //主程式在此

{

my_out(6,"name","age","level","hp","mp","score");

my_out(6,"weiwei","18","1","50","20","95");

my_out(6,"nunu","20","1","60","12","92");

}

執行後的即可顯示排版結果。

 

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

按此前往C++完整教學目錄

 

 

輸出的排版:

(1)利用cout.width(n);,可以預留n的空格的版面空間,使得下一次使用cout<<的輸出對象在此n格版面空間向右對齊。若n小於輸出對象所佔的版面空間,則不執行排版。又,一個英文字母或數字佔一個版面空間,一個中文字佔兩個版面空間。程式碼例如:

string a="111";

string b="222";

cout<<a;  //顯示111

cout.width(5);  //在顯示111後,預留5個版面空間。

cout<<b;    //222在預留的版面空間中向右對齊。現在整個螢幕顯示111  222

若要使預留的版面空間以特定字元顯示而非空白字元,則可以利用成員函式fill(特定字元),如:

cout.fill(‘*’);  //設要顯示的特定字元為 *

string a="111";

string b="222";

cout<<a; 

cout.width(5); 

cout<<b;  //整個螢幕顯示111**222

註:cout.width();只會影響在此行程式碼後的第一個cout<<輸出,若想要讓其他cout<<輸出也有此排版功能,則在其之前也要加上cout.width();

(2)利用換行字元’\t’

程式碼例如:

cout<<"aa\t"<<"bbb"<<endl;

cout<<"aaaaaa\t"<<"bbb"<<endl;

cout<<"aaaaaaaa\t"<<"bbb"<<endl;

顯示如下:

aa      bbb

aaaaaa  bbb

aaaaaaaa        bbb

也就是說,任何字串在加了\t之後,會被放在一個8個空格寬度」的預留空間,若字串寬度為n個空格寬度,且n<8,則會在此字串之後顯示8-n個空格。若n>8*k(k=1,2,3,4,5……),則在此字串之後顯示8*(k+1)-n個空格。

 

 

上一篇:檔案讀寫 控制參數

下一篇:檔案管理 輸出排版(2)

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

按此前往C++完整教學目錄

 

 

 要設定輸入/輸出的格式,可以使用C++提供的「I/O控制參數(或稱 I/O旗幟參數)」與setf()函式。

C++先說明I/O控制參數,I/O控制參數是定義在ios_base類別底下的整數常數,呼叫時需要在其名稱前面加上ios_base::。各種I/O控制參數的名稱和功用如下:

旗幟(flag)參數名稱

旗幟參數群組

功能

Ios_base::left

Ios_base::

adjustfield

輸出資料靠左對齊

Ios_base::right

輸出資料靠右對齊

Ios_base::internal

輸出資料正負號靠左對齊,數字靠右對齊

Ios_base::dec

Ios_base::

basefield

數據以十進位輸出(系統預設為成立)

Ios_base::hex

數據以十六進位輸出

Ios_base::oct

數據以八進位輸出

Ios_base::fixed

Ios_base::

floatfield

數據以小數點方式輸出

Ios_base::scientific

數據以科學記號方式輸出

Ios_base::showpoint

 

顯示浮點數的小數點與末位的0

Ios_base::showbase

 

八進位數字,數字之前加一個0

十六進位數字,數字之前加上0x

Ios_base::showpos

 

若數據為正數,在其之前加一個+

Ios_base::uppercase

 

十六進位數字與科學記號的字母,用大寫

Ios_base::skipws

 

輸入時,空白字元當作終止字元(系統預設為成立)

同一個旗幟參數群組中的旗幟參數,是不能同時設定為成立的。以下是利用I/O物件成員函式setf(旗幟參數)來設定旗幟參數為成立:

(1) 若要設定的旗幟參數有其所屬的旗幟參數群組,那麼:

setf(旗幟參數 , 旗幟參數群組);  //設定該旗幟參數為成立,

如:

cout.setf(ios_base::hex,ios_base::basefield);

cout<<62234<<endl;  //顯示 f31a

cin.setf(ios_base::hex,ios_base::basefield);

cin>>a; cout<<a;  //若輸入為12e3,則顯示12e3

(2) 若要設定的旗幟參數並沒有所屬的旗幟參數群組,那麼:

setf(旗幟參數 );  //設定該旗幟參數為成立,

如:

cout.setf(ios_base::showpoint);

cout<<2.334<<endl;  //顯示2.33400

(3) 當旗幟參數設定為成立後,會一直持續。也就是說,接下來的I/O物件的輸入/輸出格式都會以旗幟參數為準。若使用者不想要再以此種格式輸入/輸出,則可將旗幟參數重設或消除。

若旗幟參數有其所屬的旗幟參數群組,則需使用setf(旗幟參數 , 旗幟參數群組);來重設旗幟參數,若沒有其所屬的旗幟參數群組,則使用unsetf(旗幟參數);使旗幟參數恢復為不成立的狀態,如:

cout.setf(ios_base::hex,ios_base::basefield);

cout<<62234<<endl;  //顯示 f31a

cout.setf(ios_base::dec,ios_base::basefield);

cout<<62234<<endl;  //顯示 62234

又如:

cout.setf(ios_base::showpoint);

cout<<2.334<<endl;  //顯示2.33400

cout.unsetf(ios_base::showpoint);

cout<<2.334<<endl;  //顯示2.334

 

 

上一篇:檔案讀寫(IO) 簡介

下一篇:檔案管理 輸出排版

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

按此前往C++完整教學目錄

 

 

簡介:C++中,輸出和輸入(簡稱”I/O”)的資料是一串有著先後次序的資料串流data stream),

越先執行輸入或輸出命令的資料就越先被處理。輸入或輸出的資料來源可以是鍵盤或螢幕,以及檔案、字串。

C++使用相關的類別物件來處理I/O,以下是這些相關類別的類別架構class hierarchy)圖:

image

箭頭表示類別的繼承關係,AàB表示A類別繼承B類別。

ios_base類別和ios類別定義輸入物件與輸出物件的共同特性。

istream負責定義輸入類別,ostring負責定義輸出類別。

cinistream類別的一個物件,coutostream類別的一個物件。

ifstream/ofstream負責定義檔案資料的輸入/輸出。

istringstream/ostringstream負責定義字串資料的輸入/輸出。

iostream 同時掌管輸入與輸出。

  欲輸入或輸出的資料若原為二進位碼,則會被C++轉換為字元資料,這即是所謂的高階I/O (high-level I/O)(相對的,所謂的低階I/O (low-level I/O)是指輸入輸出的資料保持為二進位碼)。而之後再轉換成相對應的資料型態(stringboolint等等)C++將這些資料存放在輸入輸出物件(例如coutcin)緩衝區(buffer)中,使其有序的集合起來,待收到指令(譬如程式碼的執行或者輸入enter鍵)後再執行輸入或輸出的動作。

1. 檢查輸入與輸出的狀態,利用I/O物件的成員函式:good()fail()good()I/O物件成功輸入/輸出時回傳true,否則回傳falsefail()I/O物件輸入/輸出失敗時回傳true,否則回傳false

int a,b;

cout<<"請輸入a:";cin>>a;  //第一次輸入

if(cin.fail()){cout<<"輸入錯誤!";} 

else if(cin.good()){

cout<<a<<endl;

//第一次顯示(輸出)

cin.clear();

cout<<"請輸入b:";cin>>b;  //第二次輸入

if(cin.fail()){cout<<"輸入錯誤!";}

else if(cin.good()){

cout<<b<<endl;

//第二次顯示(輸出)

註一:由於所要輸入的型式是整數,若第一次輸入為10,則第一次輸出為10。又若第二次輸入為15,則第二次輸出為15

註二:若第一次輸入為aa,則第一次輸出為輸入錯誤!。此時若沒有cin.clear();這一行,C++會自動判定接下來的cin輸入也都是錯誤。

註三:使用C++進行輸入時,輸入的內容若有空白字元(空格)cin…等等的輸入類別物件會把空白字元當作終止字元(terminator),也就是執行輸入的指令。若第一次輸入為:1  100,則a=1,第二次輸入也不必使用者輸入了,b=100C++把空白字元分隔開的1100當作兩次的輸入了。

 

 

上一篇:類別(class) 嵌入

下一篇:檔案讀寫 控制參數

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

按此前往C++完整教學目錄

 

 

類別物件的嵌入(embedding)

所謂嵌入,事實上指的是將一類別A物件嵌入類別B內,使之成為類別B類別成員

比如我們將「人(person)」當作一個類別,「衣服(cloth)」當成一個類別,人擁有衣服,故將cloth嵌入person

範例如下:

class cloth //建立一cloth類別

{        

public:

string color;

cloth(){}         

cloth(string color_,int price_){

color=color_; price=price_;}

private:

int price;

};

 

class person  //建立一person類別

{       

public:

person(string name_,int age_)

{

name=name_;age_=age;

is_wear_jacket=false;

is_wear_shirt=false;

}

void wear_jacket (cloth cloth1)

{ jacket =cloth1;is_wear_jacket =true;}

void wear_shirt(cloth cloth1)

{shirt=cloth1;is_wear_shirt=true;}

void take_off_jacket ()

{is_wear_jacket =false;}

void take_off_shirt()

{is_wear_shirt=false;}

void get_wearing_condition()

{

if(is_wear_shirt && is_wear_jacket)

{cout<< name <<" wear "<<shirt.color<<" shirt and"<< jacket.color<<" jacket!"<<endl;

}

else if (is_wear_jacket)

{cout<<name<<" wear "<< jacket.color<<" jacket and no shirt!"<<endl;}

else if (is_wear_shirt)

{cout<<name<<" wear "<<shirt.color<<" shirt and no jacket!"<<endl;}}

 

cloth jacket;   //嵌入一cloth類別物件,名叫jacket

cloth shirt;        //嵌入一cloth類別物件,名叫shirt

private:

string name;

int age;

bool is_wear_jacket;

bool is_wear_shirt;    

};

 

// 主程式在此

person person1("weiwei",18);

cloth cloth1("blue",600);

person1.wear_shirt(cloth1);

person1.get_wearing_condition();  //顯示weiwei wear blue shirt and no jacket!

 

 

上一篇:類別(class) 抽象類別

下一篇:檔案讀寫(io) 簡介

文章標籤

埃伯 發表在 痞客邦 留言(2) 人氣()