演算法小社課之零

By 做簡報做到凌晨02:37的 佑佑

可是我們還在C++語法欸

這樣算演算法嗎

講師介紹

807

大學術長

超強電神

殭屍介紹

失蹤世宗

這張真的很像殭屍

強電神

講師介紹

這我佑佑

啊我不是比耶那個欸那個是准哥

強墊神

今天要教什麼

  • 介紹演算法
  • 程式編輯器
  • 編譯器
  • online judge
  • c++基本架構
  • 變數
  • 陣列
  • 輸入
  • 運算子
  • 條件
  • 迴圈
  • 排版
  • 題單

我覺得這裡好空喔所以放個創「世」紀

演算法?

要幹嘛?

什麼是演算法

  • 演算法是計算機科學非常重要的基礎科目。簡單來說,演算法就是用電腦算數學的學問(古代人用算盤算、現代人用電腦算),可以說是數學科目。
  • 想要解決現實生活當中的各種問題,計算機科學家就把現實問題對應到數學問題,然後設計公式、把公式寫成程式,讓電腦執行程式計算答案 ── 這些公式就叫做演算法了。
  • 儘管這裡用了「公式」這個字眼來形容演算法,然而並不是各位印象中的數學公式。由於電腦能夠執行繁複的計算,所以公式可以設計成好幾十行、好幾百行,甚至用到很多數學理論。

競程 aka 競賽程式

用程式打競賽

解決各種問題 包括:

  • 排序與查詢
  • 貪心
  • 動態規劃 分治
  • 圖論
  • 數論
  • 資料結構
  • 還有很多很多很多很多很多很多講師不會的

打競程可以幹嘛

  • 做學習歷程
  • 考APCS?
    • 很多大學資工都有APCS組 ex: 台清交
    • APCS成績不差(44 or 43)就能透過這個申請大學
  • 有大學讀?
    • 可以保送?

競程打怪路線圖

校內能競建中9月北一6月

北市賽11月(一二等獎10人進全國賽)

全國賽 12月(一二等獎10人進選訓)

選訓一階3月(前半保送資工)

選訓二階4月

IOI 7月(金銀保送任意科系 好遠)

1, 6, 10月APCS or 1月海選

3月TOI初選

支線任務 團體賽讚 可以靠學長帶
YTP 團體賽 好吃 好賺 有專題競賽 很多錢
ISSC 團體賽 學長說不推
NPSC 團體賽 獎品讚 建中條款(每校晉級3組)

APIO

10人

10人

10人

12人

4人

20人

編輯程式碼?

文字編輯器

高度自定義

都要自己安裝

輕量化

IDE

 

整合式開發環境

安裝方便

吃效能

兩種工具

文字編輯器

IDE

 

兩種工具

編譯器

  • 我們看得懂的東西 → 電腦看得懂的東西
  • 高階語言 →→ 低階語言(執行檔)

  • 直譯器

什麼是編譯器

  • 基本上只有文字編輯器需要額外裝這個,IDE會直接幫你裝好

如何安裝編譯器

線上評測系統!

Online Judge

# Online Judge

OJ具體是什麼

線上評測系統

一個讓你練習程式設計與演算法的地方

會在後端有個伺服器執行你上傳的程式

對於特定的題目會有特定的輸入與輸出

如果你的程式輸入後的輸出與標準一樣

就會得到AC的結果la欸我字數都一樣欸

上面這段十七言絕句出自我們的世宗喔

# Online Judge

常見的OJ

  • zerojudge:台灣最大,題目有點參差不齊,個人不常用
  • TIOJ:建中資訊社維護的,都是難題
  • codeforce:世界最大oj,常常有比賽,但都在台灣時間半夜
  • Atcoder:第二大oj,在日本,比賽時間比較適合台灣人
  • cses:很多演算法裸題可以練習 我推的oj
  • neoj:資訊之芽的oj 基本上不存在所謂檢索功能

建北電資OJ
https://iscoj.fg.tp.edu.tw/

# Online Judge

OJ答案結果

AC(accepted) 你通過了

WA(wrong answer) 你錯了

MLE(memory limit exceed) 你花了太多記憶體

TLE(time limit exceed) 你花了太多時間

CE(compile error) 你的程式編譯失敗

RE(runtime error) 你戳到不能戳的記憶體

SYSTEM ERROR 你爛了 就這樣 去問出題者

示範時間

C++程式的基本架構

#include<iostream> 

using namespace std;

int main(){

  cout<<"Hello World!\n";
  
}
# 你第一次寫程式

引入函式庫

#include<標頭檔>

萬用標頭檔: bits/stdc++.h

#include<iostream> 

using namespace std;

int main(){

  cout<<"Hello World!\n";
  
}
# 你第一次寫程式

使用命名空間

標準函式庫(standard)

#include<iostream> 

using namespace std;

int main(){

  cout<<"Hello World!\n";
  
}
# 你第一次寫程式

主函式

函式是什麼之後再說

總之他是程式

開始跟結束的地方

#include<iostream> 

using namespace std;

int main(){

  cout<<"Hello World!\n";
  
}
# 你第一次寫程式

輸出

輸出 Hello World! 後

換行

#include<iostream> 

using namespace std;

int main(){

  cout<<"Hello World!\n";
  
}
# 你第一次寫程式

跳脫字元

\n代表換行

n換成不同東西有不同效果

#include<iostream> 

using namespace std;

int main(){

  cout<<"Hello World!"<<endl;
  
}
# 你第一次寫程式

endl換行

啊就,也是換行

'\n' 和 endl 的差別

  • 比endl快
  • 競程用

'\n'

endl

  • 清空緩衝區
  • 專案用
# CHAPTER 2

變數

Variable

  • 資料暫存
  • 不是未知數
  • 資料型態、變數名稱

變數

# 變數 variable
  • 變數的類別
  • 管理運算方式、記憶體分配

資料型態

# 資料型態

常見資料型態

資料型態 用途 記憶體大小
int 整數-2³¹~2³¹-1(約2*10⁹~-2*10⁹) 4 bytes
long long 更大的整數 -2⁶³~2⁶³-1(約9*10¹⁸~-9*10¹⁸) 8 bytes
float 浮點數 (可以有小數點的數字) 4 bytes
double 更精確浮點數 (可以有小數點的數字) 8bytes
char 字元 1 byte
string 字串 可變
# 資料型態
  • 與變數意義相關

  • 只能用大小寫字母、數字、_$

  • 數字不可作為變數名稱的開頭

  • 大小寫意義不同

  • 不可使用保留字

變數命名

# 變數 variable

保留字

  • 給編譯器特殊判定用
  • 不可作為變數名稱
# 保留字

保留字

  • 建電大社課同款圖片
# 保留字

變數宣告

資料型態 變數名稱;
資料型態 變數名稱=初始值;
資料型態 變數名稱, 另一個變數名稱;
int a;
int b=7;
int c=5,d=3,e,f,g;
# 變數 variable

飯粒扣

#include<iostream> 

using namespace std;

int main(){

    string name;
    int score;
    cin >> name >> num;
    cout << "HelloWorld\n";
    cout << "I'm " << name << '\n';
    cout << "My test score is " << num << '\n';
    cout << "._.";
  
}
# 變數 variable

飯粒輸出

# 變數 variable

陣列

Array

  • 一串變數
  • 一串暫存資料的空間

陣列

0 1 2 3 4 5 6

0-base喔各位

# 陣列 array

陣列宣告

資料型態 變數名稱[陣列長度];
資料型態 變數名稱[]={初始值1,初始值2,初始值3};
資料型態 變數名稱[陣列長度], 另一個變數名稱[陣列長度];
int a[5];
int b[]={3,7,9,2};
int c[]={5};
# 陣列 array

陣列取值

#include<bits/stdc++.h>
using namespace std;
int main(){
    int arr[]={1,5,8,3,4,5,7};
    cout<<arr[0]<<" "<<arr[6]<<"\n";
}
# 陣列 array

陣列取值

# 陣列 array

陣列改值

#include<bits/stdc++.h>
using namespace std;
int main(){
    int arr[]={1,5,8,3,4,5,7};
    cout << arr[0] <<'\n';
    arr[0] = 2;
    cout << arr[0] <<'\n';
}
# 陣列 array

陣列改值

# 陣列 array

輸入

cin

  • cin>>已經宣告的變數;
  • 讀到空白 換行 代表結束

輸入

# 輸入 cin
  • cin>>已經宣告的變數;
  • 讀到空白 換行 代表結束

輸入

#include<bits/stdc++.h>
using namespace std;
int main(){
    string a;
    cin >> a;
    cout << a;
}
# 輸入 cin
  • 那如果我想讀整行怎麼辦

輸入

#include<bits/stdc++.h>
using namespace std;
int main(){
    string a;
    getline(cin,a);
    cout << a;
}

getline(cin,變數)

# 輸入 cin

運算子

# = 賦值運算子

= 賦值運算子

  • 和數學意義不同

所以a=3

代表把3存進 a 裡

也就是讓 a 變為3

不是把 3 變成 a

# + - * / % () 運算子

+ - * / % () 運算子

  • 先乘除後加減
  • % (mod) 算餘數 ex: 11%3=2
  • 整數/整數 無條件捨去 ex: 11%3=3
  • ()內最先算
# ++ -- 運算子

++ -- 運算子

  • ++ 增加1
  • -- 減少1
  • ++a 先加
  • a++ 後加
# += -= *= /= %= 運算子

+= -= *= /= %= 運算子

a += b;
a = a + b;
就是懶

# == != >= <= > < 關係運算子

== != >= <= > < 關係運算子

  • != 是 ≠
  • == 兩邊相同時 成立(true)
  • 不同時 不成立(false)
# == != >= <= > < 關係運算子

&& || ! 邏輯運算子

  • && 邏輯且
  • || 邏輯或
  • ! 反邏輯(加在左側)

條件

if - else 之類的東東

  • 邏輯
  • 很多邏輯
  • 更多邏輯

條件

if 如果

if(條件){
    執行的東西一; //條件成立(true)時執行
    執行的東西二;
}
# if-else 用法

前面條件不成立(否則)

這個的條件成立

  • 前面必須是 if 或 else if

else if 否則如果

# if-else 用法

else if

if(條件1){
    執行的東西一;
}
else if(條件2){
    執行的東西二;
}
# if-else 用法

更多else if

if(條件1){
    執行的東西一;
}
else if(條件2){
    執行的東西二;
}
else if(條件3){
    執行的東西三;
}
.
.
.
# if-else 用法
  • 前面條件不成立(否則)
  • 前面必須是 if 或 else if

else 否則

# if-else 用法
# if-else 用法

else

if(條件1){
    執行的東西一;
}
else if(條件2){
    執行的東西二;
}
else if(條件3){
    執行的東西三;
}
else{
    執行的東西四; //不符合上述所有條件時執行 
}
# if-else 用法

範例扣

#include<iostream> 

using namespace std;

int main(){
  int score;
  cin >> score;
  if(score >= 90){
    cout << "get A\n";
  }
  else if(score >= 80){
    cout << "get B\n";
  }
  else if(score >= 70){
    cout << "get C\n";
  }
  else{
    cout << "我懶得打那麼多了._.\n";
  }
  
}
# if-else 用法

範例輸出

  • 用來比較數值或字元

switch-case

# switch-case 用法
# switch-case 用法

switch-case

switch(變數名稱或運算式) {
    case 符合數字或字元:
        陳述句一;
        break;
    case 符合數字或字元:
        陳述句二;
        break;
    default:
        陳述三;
        break;
}

範例扣

#include<iostream> 

using namespace std;

int main(){
  int score;
  cin >> score;
  switch(score/10) {
    case 9:
      cout << "get A\n";
      break;
    case 8:
      cout << "get B\n";
      break;
    case 7:
      cout << "get C\n";
      break;
    default:
      cout << "我懶得打那麼多了._.\n";
      break;
}
  
}
# switch-case 用法

範例輸出

# switch-case 用法

一個小問題

#include<iostream> 
using namespace std;

int main(){
  int a;
  cin >> a;
  
  switch(a) {
    case 9:
      a++;
    case 10:
      cout << "欸嘿\n";
      break;
  }
}

這段程式碼會輸出什麼?

# switch-case 用法

一個小答案

# switch-case 用法

迴圈

Loop

  • 做事
  • 重複的做事
  • 保持在某種情況下重複做事

迴圈

# for 迴圈

for 迴圈

for(事前初始化;判斷條件;一次迴圈後結束執行){
	執行的東東;
}

事前初始化 →

符合判斷條件 → 執行的東東 → 迴圈結束執行 →

符合判斷條件 → 執行的東東 → 迴圈結束執行 → ... → 不符合判斷條件 → 跳出迴圈

#include<iostream>
using namespace std;
int main(){
    for(int s=0;s<5;s++){
    	cout<<s<<"\n";
    }
}

範例扣

# for 迴圈

範例輸出

# for 迴圈
# while 用法

while 用法

while(每次做之前判斷){
    要做的事;
}

當表示式為true,不斷重複執行

和if的差別

while 內會一直重複,if 只會執行一次

# while 用法

while 飯粒

#include <iostream>
using namespace std;

int main(){
    int a = 1;
    while (a < 6) {
        cout << a << " ";
        a++;
    }
}
# while 用法

無窮迴圈!

while(true){
    //do something
}

在這個情況下 程式永遠不會結束(?

最後會無限的執行直到程式崩潰

for(;;){
    //do something
}
# while 用法

break;

while(true){
    //do something
    if(something){
        break;
    }
}

判到something為真時,

就會成功跳出迴圈la

# while 用法

continue;

while(true){
    //do something 1
    if(判斷式){
        continue;
    }
    //do something 2
}

做完something 1之後

若判斷式為true,便會跳過something 2

直接進行下一次迴圈( for迴圈也能用喔 )

排版

Coding Style

  • 增加程式可讀性
  • 讓程式更好看
  • 讓自己看得懂自己在寫什麼
  • 避免被學長罵

排版

  • 不毒瘤的縮排,通常 2 / 4 個空白
  • 好的變數命名
  • 有順序有意義的定義函式和變數
  • 分段
  • 適當的一些註解
  • 大括號不換行
  • 小括號和大括號中間空格
  • 多層括號中間空格為佳
  • 正常的表達方式
  • 正常的思維方式

一份好的扣要有什麼

# 排版 coding style

題單

Problem list

iscoj

當然因為 iscoj 是我們的 oj

所以這上面的每一題都希望你們可以上去試試看

# 題單 Problem list

Tioj

# 題單 Problem list

zerojudge

# 題單 Problem list

感謝聆聽

下捷克在劍

欸不是這串真的是自動選字出來就長這神奇樣

Made with Slides.com