Try   HackMD

第一階段回顧

04.21 鄭余玄

小提醒

  • 下週是階段考,不能來的要先請假
  • 已經公佈去年練習題

第一階段回顧

  • 資料存取 - 變數宣告與使用、陣列
  • 邏輯運算 - if-else
  • 流程控制 - while, for-loop, break, continue
  • 字串 - cstring
  • 函數 - 呼叫函數、撰寫函數、參數傳遞
  • 遞迴

程式進入點 - main

int main() {
  // Do something ...
  return 0;
}

資料相關


談談變數

  • 變數,可以想像是一個有大小限制的箱子
    • 可以放整數、字元等進去箱子
  • 型態,則是箱子的標籤
    • 可以箱子有整數、字元大小的性質
  • 命名,就是如何稱呼這個箱子

宣告變數

int           a    = 2;
long long int b    = 2147453648;
double        c    = 3.14;
char          d    = 'Z';
char          e[]  = "Hello";
char          f[7] = "Sprout";

談談 cout

  • cout,重點是 out,是 output 的意思
  • 因為是 out,所以開口要向外,記得是 cout <<
  • 它會把放在 << 後的東西塞到 stdout 中
    • 就是那個小黑框

std::cout

#include <iostream>
using namespace std;

int main() {
  cout << "Hello, sprout" << endl;
  cout << 1 + 3 << endl;
  cout << "1 + 3" << endl;
  return 0;
}

std::cout

#include <iostream>
using namespace std;

int main() {
  int zero = 0;
  double pi = 3.14;
  char hello[] = "Hello, sprout";
  cout << zero << endl;
  cout << pi << endl;
  cout << hello << endl;
  return 0;
}

using namespace std

#include <iostream>
// using namespace std;

int main() {
  int zero = 0;
  double pi = 3.14;
  char hello[] = "Hello, sprout";
  std::cout << zero << std::endl;
  std::cout << pi << std::endl;
  std::cout << hello << std::endl;
  return 0;
}

using namespace std

#include <iostream>
using std::cout;
using std::endl;

int main() {
  int zero = 0;
  double pi = 3.14;
  char hello[] = "Hello, sprout";
  cout << zero << endl;
  cout << pi << endl;
  cout << hello << endl;
  return 0;
}

談談 cin

  • cin,重點是 in,是 input 的意思
  • 因為是 in,所以開口要向內,記得是 cin >>
  • 它會從 stdin(鍵盤輸入)抓東西塞到 >> 後的東西

std::cin

int length;
char name[100];
std::cin >> length >> name;

邏輯運算相關


談談判斷式

  • 一個 = 叫做 assign,絕對不是拿來判斷的
  • == 這個才叫等於,請認明兩個等號
  • != 這個是不等於,前面是半形驚嘆號
  • 10 >= b >= 0 會 GG,多可條件要用 && || 串起來

比較條件

if (a >= 0 && a < 100) {
  // do something
} else if (b != 0) {
  // do something
} else {
  // do something
}

流程控制相關


談談 while

  • while(條件式發生時) { 做事 }
  • do { 做事 } while(條件式發生時);
  • 條件如果寫爛,BOOM!!無窮迴圈
    • 使用 while (1) {} 要小心

使用方法

while (a > 0) {
  // do something
}
while (1) {
  if (a > 0) break;
  // do something
}
do {
  // do something
} while (a > 0);

談談 for

  • for (初始化; 條件判斷; 迭代步驟) { 做事 }
  • 忘記初始化。BOOM!
  • 條件判斷錯誤。BOOM!!
  • 迭代錯誤。BOOM!!!
  • 要寫 for (;;) {} 一定要知道在做什麼

使用方法

int a[200][200], b[200][200];
int n = 100, m = 10;
for (int i = 0; i < n; ++i) {
  for (int j = 0; j < m; ++j) {
    b[i][j] = a[j][i];
  }
}

小心變數

int a[200][200], b[200][200];
int n = 100, m = 10;
for (int i = 0; i < n; ++i) {
  for (int j = 0; j < m; ++i) { // GG
    b[i][j] = a[j][i];
  }
}

談談 break

  • 跳出現在的 loop
  • 不只不做 break 後的東西,更是離開 loop scope
  • 但是一次只能跳出一層

談談 continue

  • 不做 continue 後的是,回到 loop 開頭
  • 沒有離開 loop scope

談談 cstring

  • char str[1000];
  • 寫題目的時候,大小請開好開滿
  • 不要忘記字串最後由 \0 結尾

cstring 相關函數

  • 比較請用 strcmp
  • 串接請用 strcat
  • 複製請用 strcpy

談談函數

  • 型態 函數名稱(參數) { 做事 }
int sprout_v1() { return 1 + 1; }
void run() { // do something }
int f(double);

int main() {
  double x = 1.6;
  int y = f(x);
}

int f(double z) {
  int x = z / 2;
  if (x / 2 == 0) return x;
  return 3 * z + 1;
}

談談 OJ


談談 OJ

  • 注意行內空格
  • 注意行尾是否換行(例如最後一筆)
  • 輸入結束條件
  • 只通過範例輸入輸出,但你的程式可能不一定是正確

常見錯誤訊息

免則聲明(?:以下列出是可能解決方向,仍有很高可能是其他錯誤方式

  • Wrong Answer:答案錯了,也可能是格式有錯
  • Compile Error:編譯錯誤,可能是語法錯誤
    • 回頭檢查分號、大中小括號、變數宣告等等

常見錯誤訊息

  • Time Limit Exceeded:程式跑太久
    • 進入無窮迴圈?有結束等待輸入?
    • 要更有效率的寫法?
  • Runtime Error:程式跑一跑壞了
    • 陣列存取到外面?存取到不存在的物件?

GLHF