Arvin Liu @ Sprout 2021
蛤?
我還是不會講迷宮 ☆(ゝω・)v
int x;
char c='a'; // c 等於數字 97
不會背順序,()就對了。
if ( a && b || c && d)
if ( (a && b) || (c && d))
這兩個等價。
不會i++和++i的性質就不要亂用。直接寫x += 1。
if 裡面的等於記得是兩個。
順序不用背啦...
int total_score = 5487;
int student_num = 100;
double average_score = total_score / student_num;
average_score = (double) total_score / student_num;
average_score = 1.0 * total_score / student_num;
if (A) {
// do B
}
if (A) {
// do B
} else {
// do C
}
一個分號表示一行
if (A)
if (B)
C();
else
D();
如果A{如果B做C否則做D}
if (x == 1) {
// do A
} else if (x == 2) {
// do B
} else if (x == 3) {
// do C
}
if (x == 1 && y ==2 || z == 3 && i == -1) {
} else{
// do A
}
if (!(x == 1 && y ==2 || z == 3 && i == -1)) {
// do A
}
邏輯上對,但不要這樣寫,很冗
用驚嘆號反轉結果 !
if (x == 1);
A();
// 不管怎麼樣都跑的到A,if沒有作用。
if (0 <= x <= 10) {
// do A
}
// 會變成 ((0 <= x) <= 10),
// (0 <= x) 只會是 0(False)或1(True),這都<=10。
// 所以這個if相當於一定會是True。
if (0 <= x && x <= 10) {
// do A
}
while (A) {
// do B
}
do {
// do B
} while (A);
for ( I ; A ; C ) {
// do B
}
while (x != 1) {
if (x % 2 == 0)
x /= 2;
else
x = x*3+1;
}
do {
x = rand();
} while (x % 7 == 0);
Loop
起始點
break;
Loop
起始點
直接出迴圈
Loop
起始點
Loop
起始點
放掉這次迴圈,
從起點再來
continue;
常用時機
遇到特殊狀況就放棄迴圈。
遇到特殊狀況就忽略迴圈的事情。
int ary[10][20]={0};
int ary[10][20][30]={0};
ary[0][2][5] = 10;
cin >> n;
for(int i=0 ;i<n; i++){
cin >> ary[i];
}
cin >> n;
for(int i=0 ;i<w; i++)
for(int j=0 ;j<h; j++)
for(int k=0 ;k<r; k++)
cin >> ary[i][j][k];
if (A == B){
// do something
}
A = {1, 2, 3};
int n;
cin >> n;
int ary[n];
稍微看一下剛剛的投影片吧!
沒有函式的版本。
char c = 'a';
// c 根據ASCII碼,為數字97。
char S[7] = {'K', 'o', 'r', 'o', 'n', 'e', '\0'};
char S[7] = "Korone";
int len = strlen(S);
strcpy(B, A);
strcat(B, A);
if(strcmp(A, B) == 0){
// A, B the same.
}
老實說我根本沒用過strcpy 和 strcat ... 有更多用途更廣的函式可以替代。
要
#include <cstring>
#include <string.h>
或
for(int i=0; i<strlen(S); i++){
// do something
}
int len = strlen(S);
for(int i=0; i<len; i++){
// do something
}
// name長度為1~10
char name[10 + 1]; // 記得加1多留給'\0'
cin >> name;
if (A == B){
// do something
}
int lenA = strlen(A);
bool is_same = lenA == strlen(B);
for(int i=0; i<lenA; i++)
if(A[i] != B[i])
is_same = false;
if(is_same){
// do something
}
if (strcmp(A, B)==0){
// do something
}
S[n] = '\0';
std::cin >> (S + n);
memset(S, c, sizeof(S));
reference: 軒爺的投影片
int f(int x, int y){
return (x+y) * (x+y) - x - y;
}
函數名稱
參數
等於甚麼?
用小括號包起來,
記得給型態
要給等於甚麼的型態
void meow(){
cout << " ^ ^ " << endl;
cout << "(=-w-=)----?" << endl;
cout << " \" \" \" \" " << endl;
}
bool is_out(int x, int y){
if(x < 0 || y < 0 || x >= n || y >= m)
return 0;
}
int[5] hello(){
int a[5] = {0};
return a;
}
bool is_out(int x, int y){
if(x < 0 || y < 0 || x >= n || y >= m)
return 0;
return 1;
}
int f1(){
return 1;
cout << "Watame wa warukunaiyone~";
}
void swap(int x, int y){
int tmp = x;
x = y;
y = tmp;
}
參數不是陣列,也沒有&, *之類的東西
int x = 2, y = 3;
swap(x, y);
cout << x << y;
// should be 32
void swap(int &x, int &y){
int tmp = x;
x = y;
y = tmp;
}
使用的
時候
只會改到函式複製的值,也就是
pass by value (只傳數值),
不會改到呼叫函式時的x, y
變數前面加 & 表示
pass by reference (傳本來的變數),這樣就可以改到原本的值
轉成函式的版本。
我不知道struct的中文該怎麼翻...
你可以直接點過去,
如果你想知道更多關於struct的語法。
struct coord {
int x;
int y;
coord () {
x = y = 0;
}
coord (int _x, int _y) {
x = _x;
y = _y;
}
int f () {
return x * y ;
}
};
int x;
int y;
return x*y;
struct coord {
int x;
int y;
coord () {
x = y = 0;
}
coord (int _x, int _y) {
x = _x;
y = _y;
}
int f () {
return x * y ;
}
};
coord c;
coord c();
coord c(2, 3);
cout << c.x;
cout << c.f();
struct coord {
int x, y;
coord (int x, int y) {
x = x, y = y;
}
};
struct coord {
int x, y;
coord (int _x, int _y) {
x = _x, y = _y;
}
};
struct coord {
int x, y;
coord (int x, int y) {
this -> x = x;
this -> y = y;
}
};
this -> 的用法 2!可能會教(?)
struct coord {
int x, y;
coord (int _x, int _y){
x = _x, y = _y;
}
};
struct crood {
int x, y;
coord (){x = y = 0;}
coord (int _x, int _y) {
x = _x, y = _y;
}
};
coord c;
宣告
使用
coord c;
struct coord {
int x, y;
};
coord c;
error: no matching function for call to ‘coord::coord()’
OK : 符合其中一個自己寫的建構子
OK : 使用預設建構子
來收尾吧!
讀題
寫code
Debug
想算法
讀這個題目在幹嘛?
想解答 - 程式要怎麼寫?
實作你
的想法
WA掉了:(
找錯誤
讀題
寫code
Debug
想算法
讀題
寫code
Debug
想算法
讀題
寫code
Debug
想算法
題目:
給n個數字,數字範圍在
之間。之後詢問Q次,每次詢問一個數字y,問y存不存在之前的n個數字之內。
一個最簡單但很慢解法:
用大小為n的陣列紀錄,每次詢問就用for看y在不在這個陣列裡面。
一個有趣,很快,但不可行的解法:
輸入x時讓n[x] = 1,
判斷時用n[y]決定有沒有出現過。
陣列無法開到 這麼大。
讀題
寫code
Debug
想算法
再難的題目都有基本分可以喇,
不會寫滿分就先喇再說,至少有分數。
讀題
寫code
Debug
想算法
讀題
寫code
Debug
想算法
讀題
寫code
Debug
想算法
題目:
給定 ,找出一個整數 ,在 之間
使得 最大
簡單的寫法:
for迴圈寫一寫。
比較困難的寫法:
所以答案會是
之一。
那範圍如果是
讀題
寫code
Debug
想算法
讀題
寫code
Debug
想算法
/*[*/#include<stdio.h>//
#include<stdlib.h>//]++++[->++[->+>++++<<]<][(c)2013]
#ifndef e//[o
#include<string.h>//]![misaka.c,size=3808,crc=d0ec3b36][
#define e 0x1//
typedef struct{int d,b,o,P;char*q,*p;}f;int p,q,d,b,_=0//|
#include __FILE__//]>>>[->+>++<<]<[-<<+>>>++<]>>+MISAKA*IMOUTO
#undef e//[->[-<<+<+<+>>>>]<<<<<++[->>+>>>+<<<<<]>+>+++>+++[>]]b
#define e(c)/**/if((_!=__LINE__?(_=__LINE__):0)){c;}//[20002,+[-.+]
,O,i=0,Q=sizeof(f);static f*P;static FILE*t;static const char*o[]={//
"\n\40\"8oCan\40not\40open %s\n\0aaFbfeccdeaEbgecbbcda6bcedd#e(bbed$bbd",
"a6bgcdbbccd#ead$c%bcdea7bccde*b$eebbdda9bsdbeccdbbecdcbbcceed#eaa&bae$cbe",
"e&cbdd$eldbdeedbbdede)bdcdea&bbde1bedbbcc&b#ccdee&bdcdea'bbcd)e'bad(bae&bccd",
"e&bbda1bdcdee$bbce#b$c&bdedcd%ecdca4bhcdeebbcd#e$b#ecdcc$bccda7bbcc#e#d%c*bbda",
">bad/bbda"};static int S(){return(o[p][q]);}static/**/int/**/Z=0 ;void/**/z(int//
l){if(/**/Z-l){Z=l;q++;if(p<b*5&&!S()){p+=b;q=0;}}}int main(int I, /**/char**l){//
d=sizeof(f*);if(1<(O=_)){b=((sizeof(o)/sizeof(char*))-1)/4;q=22; p= 0;while(p<b*5){
/*<*/if(Z-1){d=S()>96;i=S()-(d?96:32) ;q++;if(p<b*5&&!S()){p+=b; q= 0;}Z=1;}/*[[*/
while(i){_=o[0][S()-97];I=_-10?b:1; for( ;I--;)putchar(_ );if (! --i||d)z(~i );}
if(p==b*5&&O){p-=b;O--;}}return 0U; }if(! (P=( f*)calloc /*]*/ (Q ,I)))return 1;
{;}for(_=p=1;p<I;p++){e(q=1);while (q< p&& strcmp( l[p ] ,l[(q)]))++ q;
t=stdin;if(q<p){(void)memcpy/* " */ (&P [p],&P [q ] ,Q);continue ;}
if(strcmp(l[p],"-")){t=fopen(l [ p] ,"rb" ) ;if(!t ){{;} ;
printf(05+*o,l[p ]);return+1; {;} }}_=b= 1<<16 ;
*&O=5;do{if(!(P[p].q=realloc (P[p].q,(P[p].P += b)+1))){return 01;}O &=72 /
6/*][*/;P[p].o+=d=fread(P[p] .q +P[ p ]. o, 1,b,t) ;}//
while(d==b) ;P [p].q[ P[ p] .o ]= 012;d =0;
e(fclose(t ) );P [p] .p =P[ p] .q;if (O)
{for(;d<P[ p] .o ;d= q+ 1) {q= d;
while(q<P[ p].o&&P[ p].q[q]- 10 ){
q++;}b=q-d; _=P [p]. d ;
if(b>_){/*]b */
P[p].d=b;}{; }
#undef/*pqdz'.*/ e// ;
#define/*s8qdb]*/e/**/0 //
//<<.<<.----.>.<<.>++.++< .[>]
/*P[*/P[p].b++;continue;}}}t= stdout;
for (p=1;p<I;p++){/**/if(P[p].b>i ){i=P[p].b;}}
if (O){for(p=0;p<i;p++){q=0;/*[*/while(I >++q){_=P[q].p-P[q ].q;
b= 0;if(_<P[q ].o){while(012-*P[q].p) {putchar(*(P[q].p++));b++;}P[q]. p++;
} ;while (P[ q].d>b++)putchar(040);} putchar(10);}return 0;}p =1;
for(; p<I ;p++)fwrite(P[p] .q,P[ p].o,1,t);return 0 ;}//
#/*] ]<. [-]<[-]<[- ]<[ -]< [- ]<;*/elif e //b
|(1 << ( __LINE__ /* >> `*//45)) | 01U
# /* */ endif //
這份code可以讓多個文件並排輸出。
你可以複製上面的這份code編譯看看(?)
(要把文件存成.c 不能是.cpp)
雖然很可愛(?)
讀題
寫code
Debug
想算法
一個判斷奇偶不要這樣搞
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
for(int i=1; i<=n; i++)
for(int j=0; j<n+i+2; j++)
cout << (char)( (32*((j-n+i < 0) + !(j - n)) + (48 + i)* (j-n+i >= 0)* !!(j - n)) * !!(n+i+1-j) + 10*!(n+i+1-j) );
}
蛤?
893 - 數字塔 (是AC的。)
讀題
寫code
Debug
想算法
一個很靠北的範例
img ref: peipei
讀題
寫code
Debug
想算法
#include <iostream>
int main(){
// Initialization
int m, n, seat[10][10];
// Input
std::cin >> m >> n;
for (int i=0; i<m; i++)
for (int j=0; j<n; j++)
std::cin >> seat[i][j];
// Find called person
int called, x, y;
std::cin >> called;
for (int i=0; i<m; i++)
for (int j=0; j<n; j++)
if (seat[i][j] == called)
x = i, y = j;
// Find big cross
int now_ans = 0;
// Find row
for(int i=0; i<n; i++)
if(i != y && now_ans < seat[x][i])
now_ans = seat[x][i];
// Find column
for(int i=0; i<m; i++)
if(i != x && now_ans < seat[i][y])
now_ans = seat[i][y];
// print answer
std::cout << now_ans << std::endl;
return 0;
}
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at https://curl.se/docs/copyright.html.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of the Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the COPYING file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
***************************************************************************/
當你程式的Logo (圖是libcurl的原始碼)
987 - 大十字的範例
讀題
寫code
Debug
想算法
讀題
寫code
Debug
想算法
讀題
寫code
Debug
想算法
讀題
寫code
Debug
想算法
考慮非常奇怪的測資
(簡單上來說就是
反例構造)
怎麼盯著code冥想 ...
好像 ...
都找不到錯誤?
讀題
寫code
Debug
想算法
讀題
寫code
Debug
想算法
讀題
寫code
Debug
想算法
讀題
寫code
Debug
想算法
你確定你的解法真的不會TLE嗎?
評估方法: 參見 2!
第一堂課 - 時間複雜度
Debug
De不到🐛就算了,時間有限,
去試試看其他題怎麼樣?
我以前出的各式各樣可能很難的題目(?)
題目考的東西: 多維陣列 + 字串處理
解答: 投影片
題目考的東西: 看解題狀況好像有點難的字串處理