2016/12/21

C++ 指標

前言:
只要是c++有關於指標的都會記錄在這裡,不定期新增內容。

10035 - Primary Arithmetic

這是我自己的寫法,沒想到竟然寫得出來,盡管彈性不好,但自己動手寫一次思考一下很重要。
#include <iostream> 
using namespace std;
int PTT(int d,int array[]){
    for(int i=0;i<=3;i++){
        array[i]=d%10;
        d=d/10;
    }
}
int main() {
    int arr[5]={};
    int brr[5]={};
    int r=0,m=0;//r為第一個數,m為第二個數
    while(cin>>r>>m){
        if(r==0 && m==0) break;
        int carryok[10]={0};
        int count=0;
        PTT(r,arr);
        PTT(m,brr);
        for(int i=0;i<4;i++){//判斷進位的迴圈
            if(arr[i]+brr[i]+carryok[i]>= 10){
                carryok[i+1]++;
                count++;
            }
        }
        /*if(arr[0]+brr[0] >= 10){//個位數
            carryok++;
            count++;
        }
        if(arr[1]+brr[1]+carryok>=10){//十位數
            carryok_2++;
            count++;
        }
        if(arr[2]+brr[2]+carryok_2>=10){//百位數
            carryok_3++;
            count++;
        }
        if(arr[3]+brr[3]+carryok_3>=10){//千位數
            carryok_4++;
            count++;
        }*/
        switch(count){
            case 0:
                cout<<"No carry operation."<<endl;
                break;
            case 1:
                cout<<count<<" carry operation."<<endl;
                break;
            case 2:
                cout<<count<<" carry operations."<<endl;
                break;
            case 3:
                cout<<count<<" carry operations."<<endl;
                break;
        }
    }
}

再來看看書上的寫法:
#include <iostream>
using namespace std;
int divide(int n,int arr[],int &cnt){
    for(cnt=0;n!=0;cnt++){
        arr[cnt]=n%10;
        n=n/10;
    }
}
int main() {
    int a,b;
    while(cin>>a>>b && (a!=0 || b!=0)){
        int lenA=0,lenB=0;
        int arrA[11]={0},arrB[11]={0};
        int sum[12]={0};
        divide(a,arrA,lenA);
        divide(b,arrB,lenB);
        int lenM=max(lenA,lenB);
        int ans=0;
        for(int i=0;i<lenM;i++){
            sum[i]=sum[i]+(arrA[i]+arrB[i]);
            if(sum[i]>=10){
                sum[i]=sum[i]-10;
                sum[i+1]++;
                ans++;
            }
        }
        if(ans==0){
            cout<<"No carry operation."<<endl;
        }
        else if(ans==1){
            cout<<"1 carry operation."<<endl;
        }
        else cout<<ans<<" carry operation."<<endl;
    }
}
這樣寫法很彈性。
值得學習的地方有....
第11行while:把判斷0 0的狀況寫在這一行。

第3~8行與15、16行的函式寫法:另外寫個函式把值存入陣列做處理,注意該函式for迴圈中的n!=0,也可這樣寫,和第三個參數int &cnt,這是用來存這個值有幾個位數用的,假設值為4889,第6行每除一次少一個位數,直到這個位數除到變0為止,所以會做4次,而&cnt參考至lenA的記憶體位址,等於最後lenA的值也是4。

第17行:max()函數會取最大的值。

第19~26行:其實第22行可以省略,這行只是把相加的值存入陣列而已,但題目只需判斷進位次數。這迴圈就是判斷相加的進位次數,可看到第19行 i<lenM,試問,我們要怎麼知道我們判斷進位次數的for迴圈要做幾次?還是直接給它設一個固定且夠的值就好?所以我們需要知道兩數裡面位數最多的數是誰,並且有幾位數,第17行及divide函式cnt就是在做這件事。

2016/12/16

C++ 像陣列的Vector


  • Vector可代替陣列,也可當加強版陣列
  • 可用陣列形式操作Vector
  • 使用前,加入表頭檔#include <vector>
  • 使用前先設定好長度、型態  vector<int> ivector(10);//表型態為int,長度為10
  • 可用size()看自己長度
  • 可用empty()看是否空

2016/12/15

C++ 筆記


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