指標
pointer
指標是什麼?
指標變數:儲存變數的記憶體位置(指標)的變數
指標是什麼?
指標變數是什麼?
指標變數宣告
指標變數宣告
&:取得變數的位址
指標變數的使用
*:取得指標變數指向的變數內容
(間接取值)
&:取得變數的位址
指標變數的應用
副程式的a, b交換了,但主程式中的沒有換
指標變數的應用
副程式的參數使用指標變數,得到主程式中變數a, b的位址
使用*(間接取值)來改變主程式中的a, b
傳值呼叫 VS 傳址呼叫
傳值呼叫
傳址呼叫
只把a, b的內容(值)傳(複製)給副程式
把a, b的位址傳給副程式
副程式只把複製來的內容交換
沒有交換原來主程式中的a, b
把複製來的a, b的內容放在副程式的a, b
把傳來的a, b的位址放在指標變數內
用*從指標變數內的位址
找到主程式中的a, b做交換
相當於做到回傳多個數值
陣列參數
不用加 &
成功在副程式給陣列指定內容(賦值)
不用加 *,也沒有陣列大小
陣列大小需另外再傳一個參數
k161: 分數相加
輸入說明:
輸入四個正整數 a1、a2、b1、b2,代表兩個分數 a1/a2、b1/b2 的分子與分母。
輸出說明:
請你計算出它們的和,將之以帶分數的形式,如 c+d/e 的格式印出這個結果( c、d、e 都是整數),其中 c 為整數部分,而 d/e 必須化成最簡分數(不必考慮 d 為 0 的情況)。
輸入範例1:
輸入1:
1 2 1 3
輸出1:
0+5/6
輸入範例2:
輸入2:
2 3 5 6
輸出2:
1+1/2
k161: 分數相加
void add(int a1, int a2, int b1, int b2, int *c1, int *c2){
int gcd_c;
*c1 = a1 * b2 + a2 * b1;
*c2 = a2 * b2;
gcd_c = gcd(*c1, *c2);
*c1 = *c1 / gcd_c;
*c2 = *c2 / gcd_c;
}
k212: 月刊期數(二)
本期102年8月是第145期
輸入說明:
輸入一個正整數 N ( 1<=N<=145 ) 代表月刊的期數。
輸出說明:
請印出這本月刊發行的年和月,中間請空一格。
輸入範例1:
輸入1:
145
輸出1:
102 8
輸入範例2:
輸入2:
135
輸出2:
101 10
k212: 月刊期數(二)
int MonthNum(int year, int month){
return year * 12 + month;
}
int NumtoYearMonth(int num, int *year, int *month){
*year = num / 12;
*month = num % 12;
}
void VoltoYearMonth(int vol, int *year, int *month){
…
}
k235: 叫我第二名
輸入說明:
先輸入一個正整數 N (3<=N<=10) ,代表該班有 N 位同學,接下來有 N 個 0~100 的整數,代表這 N 位同學的成績(未按照成績高低排序)。
輸出說明:
請你找出第二高分的成績,也就是小亮亮的分數,然後把它印出來(不用考慮分數重覆的問題)。
輸入範例1:
輸入1:
3 10 20 30
輸出1:
20
輸入範例2:
輸入2:
5 60 80 70 90 50
輸出2:
80
k235: 叫我第二名
int FindMaxIndex(int score[], int n){
…
}
int main(){
int n, score[10];
cin >> n;
for(int i=0;i<n;i++){
cin >> score[i];
}
score[FindMaxIndex(score, n)] = 0;
cout << score[FindMaxIndex(score, n)];
return 0;
}