建北電資聯合暑訓 暑支暑資誰最電  C++

甚麼是C++

  • 編譯形語言
  • 競賽常用語言

Javascript

直譯式語言/動態語言

直接轉譯執行

次慢

網頁

Python

 

直譯式語言/動態語言

直接轉譯執行

最慢

AI

C++

 

編譯語言

預先編譯

最快

競賽程式

 

小複習

編輯程式碼?

文字編輯器

高度自定義

都要自己安裝

輕量化

IDE

 

整合是開發環境

安裝方便

吃效能

兩種工具

  • IDE
  • 電腦卡
  • ≠Visual Studio Code
  • 大專案

Visual Studio

  • IDE
  • 程式卡
  • 純線上
  • 免安裝
  • 手機 平板 可用

replit

  • 文字編輯器
  • 滑鼠再見
  • 快 更快
  • 要自己安裝編譯器
  • 不好學

Vim

  • 文字編輯器
  • 超多擴充工具
  • 最多人使用
  • 要自己安裝編譯器

Visual Studio Code

線上評測系統!

Online Judge

# PRESENTING CODE

What is OJ?

線上評測系統

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

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

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

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

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

# PRESENTING CODE

常見OJ

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

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

一一、一二學長前年把他復活的,題目還有點少,等待我們的努力QAQ

# PRESENTING CODE

OJ答案結果

AC(accepted) 你通過了

WA(wrong answer) 你錯了

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

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

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

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

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

Hello C++

#include<bits/stdc++.h> 
using namespace std;
int main(){
  cout<<"Hello 暑訓!\n";
}
# 你第一次寫程式

Hello 暑訓!

顯然看不懂

執行結果

程式碼

#include<bits/stdc++.h> 
using namespace std;
int main(){
  cout<<"Hello 暑訓!\n";
}
# 你第一次寫程式

Hello 暑訓!

引入函式庫

#include<標頭檔>

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

使用命名空間

使用命名空間

標準函式庫

主要函式

程式起始處

運行完結束

輸出

cout<<"要輸出的東西";

\n 換行

記得加 ;

 

動手做看看

變數

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

變數

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

資料型態

常見資料型態

資料型態 用途 記憶體大小
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 字串 可變
  • 與變數意義相關

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

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

  • 大小寫意義不同

  • 不可使用保留字

變數命名

保留字

  • 給編譯器特殊判定用
  • 不可作為變數名稱
  • 講義上有清單

變數宣告

資料型態 變數名稱;
資料型態 變數名稱=初始值;
資料型態 變數名稱, 另一個變數名稱;
int a;
int b=7;
int c=5,d=3,e,f,g;
  • 一串變數
  • 一串站存資料的空間

陣列

0 1 2 3 4 5 6

陣列宣告

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

陣列取值

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

從0開始

輸入

  • cin>>已經宣告的變數;
  • 空白 換行 代表結束
  • 其他方法

輸入

getline(cin,sting_name);
cin.getline(w,20);

輸入

#include<bits/stdc++.h>
using namespace std;
int main(){
    string str1,str2;
    cin>>str1>>str2;
    cout<<str1<<"\n";
    cout<<str2<<"\n";
}

執行結果

程式碼

輸入

]輸出

運算子

# = 賦值運算子

= 賦值運算子

  • 和數學意義不同
  • a=3 讓 a 變為 3
#include<bits/stdc++.h>
using namespace std;
int main(){
	int a=7,b=-807;
  	a=b;
  	cout<<a;
}
# PRESENTING CODE

小仕紳手

猜輸出結果

# + - * / % () 運算子

+ - * / % () 運算子

  • 先乘除後加減
  • % 算餘數
  • 整數/整數 無條件捨去
  • ()內最先算

動手做看看

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a=7,b=199,c=11;
    cout<<a*(b+a)%c<<"\n";
}
# PRESENTING CODE

小仕紳手

猜輸出結果

# ++ -- 運算子

++ -- 運算子

  • ++ 增加1
  • -- 減少1
  • ++a 先加
  • a++ 後加
#include<bits/stdc++.h>
using namespace std;
int main(){
	int a=1558;
    cout<<a++<<"\n";
    cout<<a<<"\n";
}
# PRESENTING CODE

小仕紳手

猜輸出結果

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

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

a+=b;

a=a+b;

就是懶

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

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

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

&& || ! 邏輯運算子

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

條件

  • 邏輯

條件

# if 用法

邏輯 if 用法

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

用法1

if(條件) 執行的東西;

用法2

工程師很懶

小提示: 等等講到的 else if else for while 都可以這樣歐

前面條件不成立(否則)

這個的條件成立

  • 前面必須是 if 或 else if

else if 否則如果?

# else if 用法

else if 用法

if(條件a){
	執行的東西a;
}
else if(條件b){
	執行的東西b;
}
else if(條件c){
	執行的東西c;
}

條件a

條件b

條件c

結束

  • 前面條件不成立(否則)
  • 前面必須是 if 或 else if

else 否則

# else if 用法

else if 用法

if(條件a){
	執行的東西a;
}
else if(條件b){
	執行的東西b;
}
else if(條件c){
	執行的東西c;
}
else{
	執行的東西d;
}

條件a

條件b

條件c

結束

動手做看看

迴圈

# 爛寫法

爛寫法

工程師很懶

cout<<"Hello World!\n";
cout<<"Hello World!\n";
cout<<"Hello World!\n";
cout<<"Hello World!\n";
cout<<"Hello World!\n";
cout<<"Hello World!\n";
cout<<"Hello World!\n";
cout<<"Hello World!\n";
for(int i=0;i<8;i++) cout<<"Hello World!\n";
  • 重複執行
  • 重複執行
  • 重複執行

迴圈

# for 用法

for 用法

for(史前初始化;判斷條件;迴圈結束後){
	執行的東東;
}
# 爛寫法

爛寫法

cout<<"Hello World!\n";
cout<<"Hello World!\n";
cout<<"Hello World!\n";
cout<<"Hello World!\n";
cout<<"Hello World!\n";
cout<<"Hello World!\n";
cout<<"Hello World!\n";
cout<<"Hello World!\n";
for(int i=0;i<8;i++) cout<<"Hello World!\n";
#include<bits/stdc++.h>
using namespace std;
int main(){
    for(int s=0;s<5;s++){
    	cout<<s<<"\n";
    }
}
# PRESENTING CODE

小仕紳手

猜輸出結果

#include<bits/stdc++.h>
using namespace std;
int main(){
    for(int s=0;s<5;s++){
    	//dosomething
    }
}
# PRESENTING CODE

常見用法

猜輸出結果

# while 用法

while 用法

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

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

和if的差別

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

# while 用法

while 飯粒

#include <bits/stdc++.h>
using namespace std;

int main(){
    int a = 12;
    while (a < 23) {
        cout << a << " ";
        a = a + 3;
    }
    cout << endl <<  "after while: a=" << a << endl;
    return 0;
}
12 15 18 21
after while: a=24
# 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之後

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

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

動手做看看

# PRESENTING CODE

小小賽

Code

By 建中店自計算機研習社學術長807⁸⁰⁷