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 無聊的小明 用函式模擬排列組合?