C++-2

=C-1

一維陣列

宣告陣列

int arrs[6] = {0, 1, 2, 3, 4, 5};
//直接賦值
int arrw[6];
//陣列型別 陣列名稱[陣列大小] (未賦值)
const int MAXN = 1e6+7;
int arr[MAXN];//開陣列時推薦使用常數

儲存方式

初始化方式

int arr0[100];//宣告一大小為100的陣列(0~99)

fill(arr0, arr0+100, 0);

int arr1[100] = {0};//最簡單的初始化方式,但只能用在一維陣列

int arr2[100];

for(int i = 0; i < n; i++){
  arr2[i] = 0;
}//用for跑一次迴圈初始化

fill(陣列頭, 陣列尾, 值)

 

迴圈就是跑過一次陣列賦值為零

賦值

int arr[100];
memset(arr, 0, 100);//要記得初始化喔

for(int i = 0; i < 100; i++){
  arr[i] = i;
}

輸入輸出

int arr[100];
memset(arr, 0, 100);//要記得初始化喔

for(int i = 0; i < 100; i++){
  std::cin >> arr[i];
  std::cout << arr[i];
}

多維陣列

宣告+初始化

多維陣列的初始化直接用for跑過一次比較簡單,所以這裡用for

int arr[100][100];

for(int i = 0; i < 100; i++){

  for(int j = 0; j < 100; j++){
  
    arr[i][j] = 0;
  
  }

}

其實跟一維陣列沒什麼兩樣

int arr[100][100];
for(int i = 0; i < 100; i++){
    for(int j = 0; j < 100; j++){
          arr[i][j] = i*10+j;
    }
}
for(int i = 0; i < 100; i++){
    for(int j = 0; j < 100; j++){
        std::cout << arr[i][j] << "\n";
    }
}

題曰們

字串

開始之前的溫馨小提醒

要記得#include <string>

不然有些東西不能用

基本的概念

跟前面提到的陣列有很多概念是很像的

但大小不固定、可伸縮

還有成分(?是char(字元)

宣告一個字串

std::string str0 = "宣告一個字串,然後直接填入";
std::string str1;//宣告一個空白的字串

字串的輸入輸出

std::string str0, str1, str2;
std::cin >> str0 >> str1;//普通的輸入,會以空格切開輸入
getline(std::cin, str2);//會直接讀入整行輸入
std::cout << str0 << str1 << str2;

取用字串特定位置的字元

std::string str = "abcdefg";
std::cout << str[0];//a

取得字串長度

有.length() 或是.size()可以用

基本上沒什麼不一樣的

std::string s = "這一行剛好是九個字";
std::cout << s.length() << s.size() << "\n";

小提醒

其實.size()取出來的會是size_t

而這個看起來很奇怪的東西

會被定義成unsigned int

(如果上一堂有認真上的話應該會知道這是甚麼

所以要記得賦值成int再做運算

把字串連接起來

用+把兩個字串做連接,

就像一般的變數也可以使用到+=

std::string s0 = "前面的字串", s1 ="後面的";
std::string s1 = s0 + s1;
std::cout << s1;
std::string s0 = "還是前面的", s1 ="依舊是後面的";
std::string s1 += s0;
std::cout << s1;

字串有很多可以用的函式

除了可以取得字串長度的.length()、.size(),

還有尋找特定字串的.find(),

刪除指定範圍字串的.erase()、插入字串的.insert()

 

小補充:跳脫字元

定義:用來脫離原字元

在\加上某些字元可以有特殊的作用

(ex:"\n"可以換行、"\"輸出雙引號"、"\\"輸出反斜線)

std::cout << "Hello\n" << "World\n";//會先輸出Hello再換行然後輸出World然後換行
std::cout << "\\讚啦/\n";//\讚啦/

題目

函式

基本的架構

int function_m(int a, int b){
    if(a>=b) return a;
    else return b;
}
/*return type(欲回傳的變數類別) 函式名稱(參數1, 參數2...){
    想做的事
    return 想回傳的東西(某些情況沒有);
}*/

但其實比大小有更帥(?的寫法

int function_m(int a,int b){
    return a > b ? a : b;
}

三元運算子 ?

條件式 ? 成立時的回傳值 : 不成立時的回傳值

Return type(想回傳的變數型別)

經過一連串的處理後想得到的東西類型

(平常看到的變數的型別都可以,

但一次只能回傳一個)

e.g. 比大小較大的數值(int)、

是否為閏年(bool)、

解密後的字串(string)

int function_m(int a,int b){
    return a > b ? a : b;
}

參數parameters

函式過程中會用到的變數

ex:用來比大小的數字、

判斷式是否為閏年的年份、

解密前的字串

Type function_name(type name)
{
	//code
}
int f(int a,string b){/*code*/}//Accepted
int g(int a,b){/*code*/} //Compile Error
int h(int a,int b){/*code*/} //Accepted

可以傳入多種型別

不同於一般語法

同樣型別不得合併宣告

傳入陣列

int a[11]; //一維陣列

int f(int x[11]) //有沒有項數都一樣
int g(int x[])
int h(int *x)

int b[12][13]; //二維陣列

int h(int y[][])
int i(int *y[])
int j(int **y) //Compile Error

陣列([ ])就是一種指標(*)

但在多維傳入時只能有一個*

(指標在下一堂演算法 要來ㄛ)

不確定變數型態

#include <iostream>
using namespace std;
void print(string n){cout<<n<<'\n';}
void print(double n){cout<<n<<'\n';}
void print(int n){cout<<n<<'\n';}
void print(){cout<<'\n';}
void print(int x[],int size)
{
  for(int n=0;n<size-1;n++)cout<<x[n]<<' ';
  cout<<x[size-1]<<'\n';
}
int main()
{
  print("說"); //說
  print(90); //90
  print(1.20); //1.20
  int a[3]={5,2,0};
  print(a,3); //5 2 0
  print(); //換行
}

同一個函式可以有多種參數傳入方式

void是啥?

int function_m(int a,int b){
    return a > b ? a : b;
}

Return

功能:

 

結束函式運行

 

回傳想要的結果

void

可以不return的return type

(也可以寫return;)

範例:直接修改加密字串

#include <iostream>
#include<string>

void fs(std::string s){
    for (int i = 0; i < s.length(); i++) {
        if(s[i] >= 'a' && s[i] <= 'c'){
        s[i] = s[i] + 23;
    }
    else{
        s[i] = (s[i] - 3);
    }
  }
  std::cout << s << "\n";
  return;
}
int main() {
    std::string s;
    std::cin >> s;
    fs(s);
}

常用函式

函式名 函式用途 #include
__gcd(a, b) a, b的最大公因數 <cmath>
lcm(a, b) a, b的最小公倍數 <cmath>
swap(a, b) 交換a和b的值
max(a, b) a, b中較大的那個 <algorithm>
min(a, b) a, b中較小的那個 <algorithm>
abs(a) a的絕對值
sqrt() a開根號 <cmath>

每個函式都有相對要#include的函式庫

可以一個一個include

也可以直接用萬用標頭檔<bits/stdc++.h>

函式題單

如果你想不開去報資訊之芽C語法班

他會逼你用函式寫不用函式的題目

NEOJ 225 3n+1問題  怎麼利用函式運算

NEOJ 641 走自己的路 題序很懶但

NEOJ 2024 無聊的小明 用函式模擬排列組合?