2016/12/15

C++ 筆記


宣告
建構子
const
unsigned
static_cast
條件運算子
陣列、二維陣列
輸出格式化控制函式與參數
5/10? 5%10?



重點一:C++宣告變數一定要指定初始值0,否則會有不可預期的值。
int ageForStudent = 0;
double scoreForStudent = 0.0;
char levelForStudent = 'A';
寫法二:
int ageForStudent(0);
double scoreForStudent(0.0);
char levelForStudent('A');



建構子:直接指定變數初始值為0
int ageForStudent = int();
double scoreForStudent = double();
char levelForStudent = char();



const:固定變數的值,以後不能隨意更改
const int maxNum = 10;
maxNum = 20;//這樣就會錯誤



unsigned:修飾字,加上後,變無號整數變數
unsigned int i ;



static_cast:強制轉型關鍵字,可將變數型態轉型。
int num = 0;
double number = 3.14;
num = static_cast<int>(number); //把number轉乘int型態
cout << num;
顯示結果為3

邊轉邊算
int number = 10;
cout << static_cast<double>(number) / 3;

舊寫法
int number = 10;
cout << (double) number/ 3;


if括號內true false的條件判定:
#include
using namespace std;
int main() {
    int n =133;
    if(n/100){
        cout<<"YOYO";
    }
    else{
        cout<<"YIYI";
    }
    return 0;
}
此例會印出YOYO,因133/100不等於0,會判定為true,執行if敘述
現在設n=13,13/100等於0,會判定為false,因此執行else敘述,會印出YIYI

不用if else也可條件判斷:條件運算子

int score = 0;
cout << "輸入學生分數:";
cin >> score;
cout << "該生是否及格?" << (score >= 60 ? 'Y' : 'N') << endl;
return 0;



陣列宣告初始值
int irr[10] = {0};
double darr[10] = {0.0};
char carr[10] = {'\0'};
bool barr[10] = {false};
'\0'表示空白字元

也可給前面幾個元素初始值
int iarr[5] = {0, 1};
double darr[5] = {0.0, 0.1};
char carr[5] = {'A', 'B'};
bool barr[5] = {false, true};
沒有指定的它會自動填預設值

也可不宣告元素長度
int iarr[] = {1, 2, 3};
double darr[] = {0.4, 3.2, 1.0, 4.2};
char carr[] = {'A', 'B'};
它會依據你填多少個數,自動設定陣列大小


如何得知該陣列多大(有多少元素)?可利用sizeof()運算子
int iarr[] = {1, 2, 3, 4, 5, 6};
cout << "Array長度:"
<< (sizeof(iarr) / sizeof(iarr[0]))
<< endl;
sizeof()會回傳該變數佔用多少記憶體大小,
首先iarr是個int型態陣列,一個int佔4bytes,裡面有6個所以是24bytes,sizeof()回傳24,
再除上隨便一個陣列的元素,任一元素都佔4bytes,所以24/4=6,該陣列有6個元素

陣列不能互相指定,也不能互指
int arr1[5];
int arr2[5];
arr1 = arr2; // 錯誤!
if(arr1 == arr2) {} // 錯誤!

只能複製過去
const int length = 5;
int arr1[length];
int arr2[length];
...
for(int i = 0; i < length; i++) {
arr1[i] = arr2[i];
}
要比對兩陣列值是否相同,只能一個一個比對

二維陣列
int iarr[5][10];
第一個[]表列Row(橫的)
第二個[]表行Column(直的)
#include <iostream> 
using namespace std; 
int main() { 
    const int row = 5;
    const int column = 10;
    int iarr[row][column]; 

    for(int i = 0; i < row; i++) 
        for(int j = 0; j < column; j++) 
            iarr[i][j] = (i+1) * (j+1); 

    for(int i = 0; i < row; i++) { 
        for(int j = 0; j < column; j++) 
            cout << iarr[i][j] << "\t"; 
        cout << endl; 
    }
    return 0; 
}
直接指定值
int iarr[2][3] = {{1, 2, 3}, 
                  {4, 5, 6}};

輸出格式化控制函式與參數範例:
setw(n):保留N個字元的寬度
setfill(ch):內容長度不足保留寬度時,要填補的字元
right:靠右對齊
left:靠左對齊
setprecision(n):設小數點到第N位
fixed:小數位數不足時補0
oct:8進位表示
dec:10進位表示
hex:16進位表示
showpos:強制顯示正負符號
noshowpos:負數則顯示負號,正數不顯示正好
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
    int a=123;
    double pi=3.14159,x=-1.83;
    
    cout<<"["<<setw(8)<<a<<"]"<<endl;//setw只有一次效果
    cout<<"["<<a<<"]"<<endl;//setw第二次沒有
    
    cout<<"["<<setw(8)<<setfill('0')<<a<<"]"<<endl;
    cout<<"["<<setw(8)<<a<<"]"<<setfill(' ')<<endl;
    
    cout<<"["<<setw(8)<<left<<a<<"]"<<endl;
    cout<<"["<<setw(8)<<right<<a<<"]"<<endl;
    
    cout<<"["<<pi<<","<<x<<"]"<<endl;
    cout<<"["<<setprecision(4)<<pi<<","<<x<<"]:若無fixed,則小數點也算在內"<<endl;
    cout<<"["<<setprecision(4)<<fixed<<pi<<","<<x<<"]:若有fixed,則取小數到第4位,小數位數不足則補0"<<endl;
    
    cout<<"["<<oct<<a<<"]"<<endl;
    cout<<"["<<hex<<a<<"]"<<endl;
    cout<<"["<<dec<<a<<"]"<<endl;
    
    cout<<"["<<showpos<<a<<","<<x<<"]"<<endl;
    cout<<"["<<noshowpos<<a<<","<<x<<"]"<<endl;
    return 0;
}
輸出結果:
[     123]
[123]
[00000123]
[00000123]
[123     ]
[     123]
[3.14159,-1.83]
[3.142,-1.83]:若無fixed,則小數點也算在內
[3.1416,-1.8300]:若有fixed,則取小數到第4位,小數位數不足則補0
[173]
[7b]
[123]
[+123,-1.8300]
[123,-1.8300]

5/10會印出0
5%10會印出5
簡單說,前面比後面小,相除時,印出0
取餘數時,印出自己,也就是5
參考資料01

沒有留言:

張貼留言