【那啥 完結撒花】tas平臺“例子”中的模板整理(上)
阿新 • • 發佈:2020-12-09
技術標籤:cpp大一上題解
完結,撒花 以後的和平時作業就沒啥關係了
我 不 想 寫 實 驗 報 告. . . . . .
整理(看一眼)老師tas平臺上模板
#include <iostream> using namespace std; int fibonacci(int a){ if(a<3) return 1; else return fibonacci(a-1) + fibonacci(a-2); } int main(){ cout<<"請輸入一個正整數:"<<endl; int m, result; cin>>m; result = fibonacci(m); cout<<"結果:"<<result<<endl; }
遞迴版斐波那契,意思很直接明瞭。遞迴的核心是理解程式碼意思,不要糾結每一層進去一次次怎麼執行。
展示傳指標和引用到函式的寫法。
#include <iostream> using namespace std; int sum(int a, int b){ int result = a + b; return result; } void swap(int &a, int &b){ int temp; temp = a; a = b; b = temp; } void increment(int *a, int *b){ ++*a; ++*b; } int main(){ cout<<"請輸入兩個整數:"<<endl; int m, n, sumR; int &refm = m; int &refn = n; cin>>m>>n; sumR = sum(m, n); cout<<"求和的結果:"<<sumR<<endl; cout<<"交換前的輸出:"<<m<<":" <<n<<endl; swap(refm, refn); cout<<"交換後的輸出:"<<m<<":" <<n<<endl; increment(&m, &n); cout<<"增加後的輸出:"<<m<<":" <<n<<endl; }
快排還沒講,跳過。
氣泡排序和二分
#include <iostream> #include <cstdlib> #include <ctime> #define Len 10 using namespace std; void sort(int s[]){//氣泡排序 for (int i=0; i<Len-1; i++) { for (int j=0; j<Len-i-1 ; j++) if (s[j]>s[j+1]) { int temp; temp = s[j]; s[j] = s[j+1]; s[j+1] = temp; } } } int binary_search(int data[], int target){ int start = 0, end = Len-1, mid; while(!(start>end)){ //通過迴圈語句實現折半查詢 mid = (start + end) / 2; if(target>data[mid]) start = mid + 1; else if(target<data[mid]) end = mid - 1; else return mid; } return (-1); } int binary_search2(int data[], int start, int end, int target){//遞迴實現折半查詢 int mid; mid = (start + end) / 2; if(target>data[mid]){ start = mid + 1; if(start>end) return (-1); binary_search2(data, start, end, target); } else if(target<data[mid]){ end = mid - 1; if(start>end) return (-1); binary_search2(data, start, end, target); } else return mid; } int main(){ int a[Len]; srand(time(NULL)); //設定隨機數的種子值 for(int i=0; i<Len; i++){ a[i] = rand()%100+1; //生成Len個1~100之間的隨機數 cout<<"a["<<i<<"]="<<a[i]<<" "; //輸出排序之前的陣列 } cout<<endl; sort(a); cout<<"Sorted:"<<endl; for(int k=0; k<Len; k++){ //輸出排序之後的陣列 cout<<"a["<<k<<"]="<<a[k]<<" "; } cout<<"請輸入需要查詢的數:"; int m, result; cin>>m; cout<<"遞迴折半查詢"<<endl; result = binary_search2(a, 0, Len-1, m); if(result==-1) cout<<"陣列中不存在這個數!"<<endl; else cout<<"查詢結果是:a["<<result<<"]="<<a[result]<<endl; cout<<"非遞迴折半查詢"<<endl; result = binary_search(a, m); if(result==-1) cout<<"陣列中不存在這個數!"<<endl; else cout<<"查詢結果是:a["<<result<<"]="<<a[result]<<endl; }
二分給了迴圈和遞迴兩種寫法,迴圈就行了。
標準的二分板子。
int start = 0, end = Len-1, mid;
while(start <= end){
mid = (start + end) / 2;
if(target>data[mid])
start = mid + 1;
else if(target<data[mid])
end = mid - 1;
else return mid;
}
return (-1);
結構體氣泡排序(非連結串列)+檔案讀寫,冒排上面有了,檔案讀寫考不了,跳過。
標準模板庫,不考沒學,跳過。
引數傳值的三種方式,跟前面指標和引用一個東西。
二維陣列傳參
#include <iostream>
using namespace std;
void show(int a[][2], int n){
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cout<<a[i][j];
}
cout<<endl;
}
}
void show1(int (*p)[2], int n){
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cout<<*(*(p+i)+j);
}
cout<<endl;
}
}
void show2(int *p[2], int n){
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cout<<*(p[i]+j);
}
cout<<endl;
}
}
void show3(int **r, int n){
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cout<<*(*(r+i)+j);
}
cout<<endl;
}
}
int main(){
int a[2][2] = {{1,2},{3,4}};
int (*p)[2] = a;
int *q[2];
int **pt;
q[0] = a[0];
q[1] = a[1];
pt = q;
show(a,2);
show1(p,2);
show2(q,2);
show3(pt,2);
}
二維陣列記憶體在空間裡是連續的,所以知道一個頭指標以後就可以為所欲為呼叫了。
因為陣列首地址本身就是一個指標,所以需要定義一個指向指標的指標來實現陣列在函式與主函式之間的傳遞,這就是之前在淺拷貝那裡提到的小坑,現在填了哈。
陣列首地址又可以理解為一個長度未知(是未知不是可變)的陣列,所以傳參的時候傳首地址就可以理解為傳進去了你想要的整個陣列。
面向過程壓縮包裡就這些,剩下的是面向物件。
紅酒完了,切了勃拉姆斯的鋼琴四重奏吧,放首別的來洗了杯子倒朗姆——
“I torture you
Take my hand through the flames
I torture you
I'm a slave to your games
I'm just a sucker for pain”
學數分學數分,別的明天考完再更。祝明天商英好運,cheers