2023/10/25
主講:ShiYu
課程結束 填完回饋表單之後
可以找總務交社費 300$
我們會給你收據
今天沒帶的可以下次上課 11/8 再交
等等會發意願單傳下去
有在名單上的人可以勾選要不要擔任
請正宗老師、現任幹部及前三名得獎者
等等點名時間來找總務訂飲料
社課結束後會給大家帶回教室喝
社團課中寫程式使用的軟體
可用網頁瀏覽與編輯
也可以即時存檔在雲端
回去也可以開來看今天寫的程式
使用你常用的 Gmail 創建一個 Replit 帳號
點擊這顆按鈕 ↓
有大量題庫 適合程式新手
社團使用網站中的課程功能
讓大家加入課程
查看我們每次社團課整理的題單
使用自己常用的 Gmail 帳號即可
學校太爛直接把學生的帳號註冊鎖起來了😡
註冊的時候記得選學校:
臺南州立臺南農業學校
登入畫面:
✅我是機器人
鼠標停在個人名字上方
按下 參加課程
輸入課程代碼:
在喊在
趁現在註冊 Replit、Zero Judge
ZJ 課程代碼
C++ 基礎語法
節次 | 課程內容 |
---|---|
\(1\) | 社團整體介紹|了解社團運作|小遊戲 |
\(2\) | 註冊帳號|基本架構|輸入輸出|變數使用|算術運算子|程式題實作 |
\(3\) | 條件判斷式|邏輯、比較運算子|變數型態 |
\(4\) | 迴圈|陣列|字串 |
\(5\) | 巢狀迴圈|二維陣列 |
\(6\) | 期末練習賽|社團聚餐🍕|題目講解 |
基礎資料結構與入門演算法
節次 | 課程內容 |
---|---|
\(7\) | 複雜度分析(空間&時間)|暴力法與窮舉法 |
\(8\) | 基礎資料結構(向量|堆疊|佇列) |
\(9\) | 函式|遞迴 |
\(10\) | 排序法(氣泡|選擇|插入|快速) |
\(11\) | 二分搜尋法 |
\(12\) | 期末練習賽|社團聚餐🍕|題目講解 |
會根據社員的學習狀況調整或刪減課程內容
每節社課上完都會更新
有社課講義 學習資源 題單
以及其他各種上課提到的連結
請社員們多多運用
每次社課的前一天晚上
我們都會在 Discord 的
發布社課通知提醒大家社課的注意事項
有些要帶的東西或要做的事情
其他頻道可以自己選擇要不要看
但社團公告的頻道一定要看
每節社課結束後的晚上我們幹部
都會開課後檢討會議
希望透過每次社課的回饋表單與課後檢討會議
能了解社員的想法、建議以及上課感受
讓我們能夠即時的調整並改進
提供良好的課程內容給大家
有相關的資料都會附上文章連結
給大家回家自己打開來看
有興趣的人可以花點時間研究
必學語法:課程大部分時間都會教必學語法 有基礎的人可能會覺得無聊
延伸知識:課堂的最後講解延伸知識 能聽懂算很厲害
課外知識:在延伸知識中又有更難一點的知識給已經有基礎的人了解
其他人聽不懂也沒關係 不會影響很大
一個程式的骨架
之後 每一份程式
都從它開始
#include <iostream> using namespace std; int main() { return 0; }
#include <iostream> // 導入標頭檔,裡面包含輸出功能(cout) using namespace std; // 使用標準命名空間,簡化接下來的程式碼 int main() { // 主程式,在程式中會先被執行 // 這裡放你寫的程式碼 return 0; // 回傳 0 代表程式結束 }
在程式碼中 // 代表註解的意思
// 後的文字(同一行)不會被電腦執行
所以很適合用來跟別人解釋這一行在幹嘛
如果要解釋很多行 可以用 /* */ 把註解包起來
詳細介紹基本架構請至 延伸知識
#include <iostream> using namespace std; int main() { return 0; }
程式中可以用 iostream 中的 cout (吸奧)函式
在終端機輸出你想說的話
#include <iostream> using namespace std; int main() { cout << "Welcome to\nNFIRC 1st."; return 0; }
Welcome to
NFIRC 1st.
#include <iostream> using namespace std; int main() { cout << "Welcome to\nNFIRC 1st."; return 0; }
在第 5 行中
運用 cout 輸出 Welcome to NFIRC 1st. 字串
有些人學過 C++ 會用 endl (end line) 來換行
但在競程中 通常都用 \n 來換行
原因請至 延伸知識
只要用 << 就可以串接多個東西
#include <iostream> using namespace std; int main(){ cout << "Welcome to\nNFIRC " << 1 << "st.\n"; return 0; }
執行結果
Welcome to
NFIRC 1st.
輸出盡量用英文 避免使用中文
原因是會產生預料之外的問題
例如亂碼或許功蓋問題
許功蓋問題請至 延伸知識
學會了 C++ 基本架構和 cout 輸出後
請所有人到 ZeroJudge 課程中的
NFIRC 第一節社課必做題與練習題
完成 1 d483. hello, world
體驗 AC 的感覺
Ctrl + C 複製
Ctrl + V 貼上
寫完程式碼要上傳(submit) OJ 時
使用競程小技巧可以更快速複製程式碼
Ctrl + A 全選
Ctrl + C 複製
「 Ctrl + AC,每題都 AC 」
#include <iostream> using namespace std; int main(){ cout << "hello, world\n"; return 0; }
當你想在終端機輸入東西給電腦時
可以用 cin (吸硬) 函式
輸入就是輸出的
相反
cout <<
cin >>
在學輸入之前 我們要先來學如何使用變數 變數
一個可以裝特定東西的 容器
儲存任何程式需要 記住 的東西
今天只簡單介紹 整數 與 字串 型別
第三次社課會詳細介紹型別種類、用途與範圍
使用變數之前一定要先宣告
宣告方法:型別 變數名稱
int number;
string name;
給變數存入值的行為
我們稱為 賦值 ,= 為 賦值運算子
int number = 12;
string name = "ShiYu";
並不是 number 與 12 相等的意思
而是把 12 指派給 number 這個變數
宣告時同時賦值的行為
我們稱為 初始化
int number = 12; string name = "ShiYu";
第 1 行中
第 2 行中
string name;
因為我們要輸入我們的名字進去這個變數中
所以宣告時可以先不用賦值給這個變數
但要記得 變數還沒賦值時 不能讀取這個變數的值
因為未初始化的變數 值是未定義的
這時候讀取會產生 未定義行為(Undefined behavior)
有興趣的人可以課後點 此篇連結 研究
宣告變數後就可以使用 cin >> 把輸入的值存入變數
string name; cin >> name;
cin 也可以用 >> 串接來一次輸入多個變數
string name1,name2; int age; cin >> name1 >> name2 >> age;
在第 1 行中也同時宣告多個 字串型別的變數
同型別才能同時宣告 不同型別請分開宣告
學完了基本架構、變數、輸入、輸出
現在把它結合起來組成完整的程式
結合基本架構、變數、輸入輸出的程式碼
#include <iostream> using namespace std; int main() { string name1,name2; int age; cin >> name1 >> name2 >> age; cout << "name1 = " << name1 << "\nname2 = " << name2 << "\n\nage = " << age << "\n"; return 0; }
第 8 行 cout 部分為了避免太長 換行對齊較易讀
ShiYu Yudong 16
name1 = ShiYu
name2 = Yudong
age = 16
使用 <bits/stdc++.h> 萬用標頭檔
此標頭檔裡導入了以下常用的標頭檔
#include <iostream> #include <algorithm> #include <bitset> #include <complex> #include <deque> #include <exception> #include <fstream> #include <functional> #include <iomanip> #include <ios> #include <iosfwd> #include <istream> #include <iterator> #include <limits> #include <list> #include <locale> #include <map> #include <memory> #include <new> #include <numeric> #include <ostream> #include <queue> #include <set> #include <sstream> #include <stack> #include <stdexcept> #include <streambuf> #include <string> #include <typeinfo> #include <utility> #include <valarray> #include <vector>
裡面包含一開始基本架構中寫的 iostream 標頭檔
和其他常用資料結構函式庫
意味著我們不用每次要使用什麼函式
都去查那個函式的標頭檔
只要導入 萬用標頭檔 就夠了
下次實作時第一行可以用
#include <bits/stdc++.h>
請背起來 不然去考 APCS 會花很多時間打標頭檔
請所有人到 ZeroJudge
完成 2 a001. 哈囉
再獲得一個 AC 吧!
#include <bits/stdc++.h> using namespace std; int main() { string s; cin >> s; cout << "hello, " << s << "\n"; return 0; }
#include <bits/stdc++.h> using namespace std int main() { string s cin >> s cout << "hello, " << s << "\n" return 0 }
❌ | ✅ |
---|---|
incloud | include |
namesapce | namespace |
mian | main |
hollow | hello |
count | cout |
retrun | return |
#include <bits/stdc++.h> using namespace std; int main() { // 這裡沒宣告 s ,電腦不知道下一行的 s 是什麼 cin >> s; cout << "hello, " << s << "\n"; return 0; }
❌ | ✅ |
---|---|
cin << | cin >> |
cout >> | cout << |
串接方向相反會導致
CE (Compile Error) 編譯錯誤
#include (bits/stdc++.h) using namespace std; int main < string s; cin >> s; cout << "hello, " << s << "\n"; return 0; >
❌ | ✅ |
---|---|
#include (bits/stdc++.h) | #include <bits/stdc++.h> |
int main | int main( ) |
程式沒寫錯 但沒縮排沒空格閱讀起來較困難
#include<iostream> using namespace std; int main(){ int a,b,c; cin>>a>>b>>c; cout<<a+b+c<<"\n"; return 0;}
適時的空格與縮排有助於閱讀與除錯
#include <iostream> using namespace std; int main() { int a,b,c; cin >> a >> b >> c; cout << a + b + c << "\n"; return 0; }
加減乘除
+ - * /
在 C++ 裡,四則運算大多就跟平常一樣
也遵從著先乘除後加減、括號先算的運算規則
#include <bits/stdc++.h>
using namespace std;
int main() {
int a = 7, b = 4;
cout << "a + b = " << a + b << "\n";
cout << "a - b = " << a - b << "\n";
cout << "a * b = " << a * b << "\n";
return 0;
}
a + b = 11
a - b = 3
a * b = 28
練習題:ZJ a002,d049,d063
回家練習時點擊此連結若出現錯誤
請先登入你創好且已加入我們社團課程的帳號
就能看到題目囉
#include <bits/stdc++.h>
using namespace std;
int main() {
int a = 7, b = 4;
cout << "a / b = " << a / b << "\n";
return 0;
}
a / b = 1
記住:整數int的除法只取整數部分
小數點後面都省略
這留到下一次上課再介紹另一個變數型別
浮點數(float,double)
在數學中 除以零是一個沒有定義的值
在程式中也是 執行時會出現
RE (Runtime Error):程式碼停止運行
運算符 %可以求餘數
此為模運算 唸作 MOD
請不要唸 趴
程式碼
#include <bits/stdc++.h> using namespace std; int main() { int a = 12, b = 5; cout << "a % b = " << a % b << "\n"; return 0; }
執行結果
a % b = 2
練習題:ZJ d827
求餘數也可以用在很多地方
例如:判斷奇偶數、判斷是否為某數的倍數
下一次上課講到判斷式的時候會教
運算之後把結果賦值給變數
a = a + b;
a = a - b;
a = a * b;
a = a / b;
可以不用賦值+運算
直接用賦值運算子就能解決
可以使用賦值運算子簡化程式碼
未
使用賦值運算子a = a + b; a = a - b; a = a * b; a = a / b;
a += b; a -= b; a *= b; a /= b;
i = i + 1;
i = i - 1;
可以簡化成
i += 1;
i -= 1;
又可以簡化成
i++;
i--;
第三種用法只限於 \(\pm1\)
關於前置與後置 請至延伸知識 有時間才會講
#include <iostream> // 導入標頭檔,裡面包含輸出函式(cout)
using namespace std; // 使用標準命名空間,簡化接下來的程式碼
#include <iostream> int main() { int x, y; std::cin >> x >> y; std::cout << "x = " << x << "\ny = " << y << "\n"; return 0; }
#include <iostream> using namespace std; int main() { int x, y; cin >> x >> y; cout << "x = " << x << "\ny = " << y << "\n"; return 0; }
C++ 執行程式時會先跑主函式
也可以在主函式裡呼叫其他自訂函式
之後的社課會教到
#include <iostream> using namespace std; int functionA() { } int main() { functionA(); return 0; }
想把負數轉成正數輸出時
可以用 abs
函式 (absolute value 縮寫)
cout << abs(-12) << "\n";
12
練習題:ZJ a799
想深入了解更多關於基本架構的解說
可回家點開這篇來參考:
C++ 骨幹的解說 by 南一中資研社師 SA
在競程中,建議用 cout << "\n"; 來輸出換行
endl 用在 cout 輸出換行時
它會比單純的 \n 做更多細節處理
平常使用是更安全,但在競程反而會拖慢效率
拖慢效率的主因是 endl 自帶 flush
有興趣的人可以課後點這篇的前半段來看更深入的內容
落差與常識的補完 by SA
給有興趣的人去了解這篇
C++ 的輸出入 cin / cout 和 scanf / printf 誰比較快?
上課主要以 cin >> / cout << 為主
如果你的程式上傳到 OJ 莫名其妙的出現 TLE
可以使用下面兩行來關閉 cin/cout 與
scanf()/printf() 之間的同步,導致其無法並用
大幅提升 cin / cout 的效能
ios::sync_with_stdio(0);
cin.tie(0);
上學期的課程幾乎都不會用到這個技巧
下學期在上演算法的時候才會出現用到的情況
C++ 輸入規則:
一個空格或換行 為一個輸入
1 23 456 78 9
876 54 3 21
共有 9 個輸入
#include <iostream> using namespace std; int main() { string a, b; getline(cin,a); getline(cin,b); cout << "a = [" << a << "]\nb = [" << b << "]\n"; return 0; }
1 23 456 78 9
876 54 3 21
a = [1 23 456 78 9]
b = [876 54 3 21]
因為一行為一個輸入
所以總共有兩個輸入
C++ | Python | 輸入規則 |
---|---|---|
cin >> | ? | 以空白 |
getline(cin,a) | input() | 以整行 |
nums = list(map(int,input().split()))
nums = [int(i) for i in input().split()]
由於涉及編碼(Big5、utf-8)相關知識
所以課堂不細講 當作課外補充給有興趣的人去了解
許功蓋問題
南附資研第二次社課結束
感謝各位願意耐心聽完這次的社團課程
請社員們花一點時間填寫回饋表單
讓我們知道你們的想法及建議 謝謝大家