C++基礎語法

內容:IDE、OJ、輸入輸出、

變數、運算子、if/else

佛倫斯

IDE

整合開發環境

Integrated Development Environment

  • Visual Studio
  • Eclipse

OJ

Online Judge

  • Zerojudge
  • Codeforces

註冊Zerojudge

語法

註解

註解內容不影響程式運作

#include <iostream>
using namespace std;

int main() {
    // 這是單行註解
    /*
    	這
            是
                多
            行
        註
            解
    */
}

單行註解:// 註解內容

多行註解:/* 註解內容 */

#include <iostream>
using namespace std;

int main() {
    // 張旭
}

變數

  • int 整數 \(-2^{31}\)~\(2^{31}-1\approx2\times10^9\)
  • double 雙精度浮點數(有小數點)
  • char 字元
  • string 字串
  • bool 布林值(true/false)
  • long long int \(-2^{63}\)~\(2^{63}-1 \approx 9\times10^{18}\)
  • unsigned long long int \(0\)~\(2^{64}-1\approx1.8\times10^{19}\)

宣告變數

// 變數類型 變數名稱 = 值;
// 也可以不要先預設它的值

#include <iostream>
using namespace std;

int main() {
    int a = 2; // a的值是2
    double b; // b還沒有給值
    string s, t = "changhsu";
    // 宣告多個變數用,隔開
    char changhsu = 'C';
}
#include <iostream>
using namespace std;

int main() {
    int N = 47;
    double d = 0.973321230;
    char c = 'F';
    string s = "forence";
    bool b = false;
    long long int X = 23034381;
    unsigned long long int Y = 886901351808;
}

輸入輸出

輸入:cin >> a;

輸出:cout << a;

*其中a是一變數

#include <iostream>
using namespace std;

int main() {
    // 輸出
    string a = "changhsu";
    cout << a;
    // 輸出:changhsu
    
    // 輸入
    string b; // 先宣告變數
    cin >> b; // 輸入一字串
    cout << b; // 把剛剛輸入的字串輸出
}
//輸入多個變數
int a, b, c;
cin >> a >> b >> c;
// 輸入時用空白SPACE隔開三個變數

//輸出多個變數
cout << a << ' ' << b
    << ' ' << c << '\n';

運算子

int a = 3, b = 4;
cout << a+b << '\n'; // 輸出:7
cout << a-b << '\n'; // 輸出:-1
cout << a*b << '\n'; // 輸出:12
cout << a/b << '\n'; // 輸出:0
// 3÷4 = 0...3
// 整數除整數,輸出也只會輸出商
cout << b%a << '\n'; // 輸出:1
// 4÷3 = 1...1
// "b%a"表b除a的餘數
int a = 3, b = 4;
a += b; // 等同a = a+b;
// a現在是7
cout << a+b << '\n'; // 輸出:11
// 還有-=, *=, /=, %=

優先順序

 

a*b   a/b   a%b

a+b   a-b

判斷條件用

  • ==:等於
  • !=:不等於
  • >:大於
  • <:小於
  • >=:大於等於
  • <=:小於等於
  • !:否定
  • &&:和
  • ||:或

詳細如何使用在「if/else」那邊再說明

if/else

/*
    if (條件式A) {
    	條件A成立時執行的敘述1
    }
    else if (條件式B) {
        條件B成立時執行的敘述2
        *** 執行敘述2表示條件A必不成立
    }
    else {
        條件A、B都不成立時執行的敘述3
    }
*/

剛剛講的這些運算子可以放在條件式裡當判斷條件

  • ==:等於
  • !=:不等於
  • >:大於
  • <:小於
  • >=:大於等於
  • <=:小於等於
  • !:否定
  • &&:和
  • ||:或

優先順序


!   →   *  /  %    →   +  -    →

>  <  >=  <=    →   ==  !=    →

&&   →   ||

int a = 10, b = 20;
if (a == b) {
    cout << "changhsu\n";
    // a不等於b,不會執行這裡
    // '\n'是一字元,表示換行
}
else if (a == b*2) {
    cout << "lemon\n";
    // b*2是40,而10不等於40,故不會執行這裡
}
else {
    cout << "ckeisc_42nd\n";
}

// 輸出:ckeisc_42nd

布林值也可以放在條件式裡面

bool x = true;
if (x) {
    // x是true,會執行這裡
    cout << "abcde";
}
else {
    // 上面的條件成立,不會執行這裡
    cout << "vwxyz";
}

// 輸出:abcde
int x = 2, y = 1;
if (x > y)	cout << 'A';
if (x != y)	cout << 'B';
if (!(x <= 33))	cout << 'C';
// 跟數學一樣,括號括起來的先做
// x <= 33是true,括起來加否定變false
// 條件式是false,不執行
if (x == y*2)	cout << '\n';
// '\n'是換行
if ((x+y)*2 > 0)	cout << 'D';
/*
輸出:
AB
D
*/
int x = 2, y = 1;
if ((x > y) && (x == (2*y))){
    cout << "roy ";
    // x>y成立(2>1)且x==2*y成立(2==1*2)
    // 執行
}
// x>y成立(2>1),
if (!(x-y == 1) || x > (y-2)) {
    cout << x+y << '\n';
    /* x-y是1,!(x-y==1)是錯的,
    但x>(y-2)是對的(2>(1-2)),所以會執行 */
}

// 輸出:roy 3
// else if 可以很多個

int b = 3;
if (b == 1)
    cout << "yeedrag";
else if (b == 2)
    cout << "changhsu";
else if (b == 3)
    cout << "lemon";
else if (b == 4)
    cout << "forence";
else if (b == 5)
    cout << "FN";
else if (b == 6)
    cout << "roy";

// 輸出:lemon

大括號裡面只有一句可以省略大括號

初學者建議先不要省略大括號

int forence = 91;
int yeedrag = 3;
if (forence < yeedrag)
    cout << "roy";
    cout << "changhsu";
    
/*
上面等同於
int forence = 91;
int yeedrag = 3;
if (forence < yeedrag) {
    cout << "roy";
}
cout << "changhsu";
*/

// 輸出:changhsu

題目

int p = 1, q = 2;
if (p == q) {
    cout << p << ' ' << q << ' ';
}
else {
    q = 3;
}

正確的輸出為:

(A) 1 3        (B) 1 2        (C) p q        (D) 不輸出

第1題

正解:(D)

int p = 1, q = 2;
if (p == q) {
    cout << p << ' ' << q << ' ';
}
else {
    q = 3;
}

正確的輸出為:

(A) 1 3        (B) 1 2        (C) p q        (D) 不輸出

第1題

int p = 1;
if (p != 1) {
    p = 2;
    if (p != 2) {
    	p = 3;
    }
    else {
        p = 4;
    }
}
else {
    cout << "4";
}
cout << p;

第2題

正確的輸出為:

(A) 1

(B) 2

(C) 41

(D) 43

int p = 1;
if (p != 1) {
    p = 2;
    if (p != 2) {
    	p = 3;
    }
    else {
        p = 4;
    }
}
else {
    cout << "4";
}
cout << p;

第2題

正確的輸出為:

(A) 1

(B) 2

(C) 41

(D) 43

正解:(C)

int p = 225, q = 20, r = 5;
cout << p+q%r << ", ";
cout << (q-p)*r << ", ";
cout << (p/q)+p;

請選出正確的輸出:

(A) 225, -1025, 236

(B) 0, -1025, 236.25

(C) 229, 1025, 236.25

(D) 225, -1025, 237

      

第3題

int p = 225, q = 20, r = 5;
cout << p+q%r << ", ";
cout << (q-p)*r << ", ";
cout << (p/q)+p;

請選出正確的輸出:

(A) 225, -1025, 236

(B) 0, -1025, 236.25

(C) 229, 1025, 236.25

(D) 225, -1025, 237

      

第3題

正解:(A)

bool r = false;
if (!r) {
    r = true;
    if (!r)
    	r = true;
    else
    	r = false;
}
else
    r = true;
if (r)
    cout << "true\n";
else
    cout << "false\n";

第4題

請問輸出為何?

(A) true

(B) false

bool r = false;
if (!r) {
    r = true;
    if (!r)
    	r = true;
    else
    	r = false;
}
else
    r = true;
if (r)
    cout << "true\n";
else
    cout << "false\n";

第4題

正解:(B)

請問輸出為何?

(A) true

(B) false

double x = 1.35, y = 25.0;
if (y*x > 34.8 || x < y)
    cout << "yeedrag\n";
else if (y == 25 && x <= 2.277)
    cout << "lemon\n";

第5題

請問輸出為何?

(A) yeedrag                       (C) lemon

 

(B) yeedrag                       (D) 不輸出

      lemon

double x = 1.35, y = 25.0;
if (y*x > 34.8 || x < y)
    cout << "yeedrag\n";
else if (y == 25 && x <= 2.277)
    cout << "lemon\n";

第5題

請問輸出為何?

(A) yeedrag                       (C) lemon

 

(B) yeedrag                       (D) 不輸出

      lemon

正解:(A)

實作

題目

  • ZJ a799:正值國
  • ZJ a003:兩光法師占卜術
  • ZJ d050:妳那裡現在幾點了?
  • ZJ a410:解方程

ZJ a799:正值國

輸入只有一行,包含一個整數N。若N是負的要去負號再輸出。輸出也是一個整數。

範例輸入:-5

範例輸出:5

-5是負數,依題目要去負號。所以輸出5。

ZJ a003:兩光法師占卜術

輸入一個日期,然後依照下面的公式:

M=月、D=日、S=(M*2+D)%3

得到S的值,再依照S的值從0到2分別給與「普通」、「吉」、「大吉」三種不同的運勢

輸入資料共一行,包含兩個整數,分別為月份及日期。輸出「普通」、「吉」、「大吉」

範例輸出:

普通

範例輸入:

1 1

(1*2+1)%3 = 3%3 = 0

ZJ d050:妳那裡現在幾點了?

輸入僅有一行,其中含有一個整數h(\(0\leq h\leq 23\)),代表台灣時間現在幾點(24小時制)。輸出美國山區時間(24小時制)。台灣的時間比美國山區時間快15小時(不考慮日光節約時間)。

 

*這題可以不要用到if/else

範例輸入:21

範例輸出:6

21-15 = 6

ZJ a410:解方程

\begin{cases} ax+by=c\\ dx+ey=f \end{cases}

輸入:a, b, c, d, e, f六整數

解二元一次聯立方程式

如果有解,那麼第1行先輸出「x=」,再輸出x的值,第2行先輸出「y=」,再輸出y的值,均保留2位小數,請參照範例輸出
如果無解,輸出「No answer」

如果有無限多組解,輸出「Too many」

範例輸入:1 1 2 1 -1 0

範例輸出:x=1.00

     y=1.00

\begin{cases} x+y=2\\ x-y=0 \end{cases} \ \ \ \ \ \ \ \ \ \ \ \ \begin{cases} x=1\\ y=1 \end{cases}

\begin{cases} ax+by=c\\ dx+ey=f \end{cases}

a, b, c, d, e, f代入

如何輸出兩位小數?

#include <iostream>
#include <iomanip>
// 注意這裡要include

int main() {
    int a = 6987;
    cout << fixed << setprecision(2) << a << '\n';
}

// 輸出:6987.00

解答

ZJ a799:正值國

#include <iostream>
using namespace std;

int main() {
    int N;	cin >> N;
    if (N < 0)
        N = (-1)*N;
    cout << N << '\n';
}

ZJ a003:兩光法師占卜術

#include <iostream>
using namespace std;

int main() {
    int M, D;
    cin >> M >> D;
    int S = (M*2+D)%3;
    if (S == 0)
	cout << "普通\n";
    else if (S == 1)
	cout << "吉\n";
    else
	cout << "大吉\n";
}

ZJ d050:妳那裡現在幾點了?

#include <iostream>
using namespace std;

int main() {
    int a;
    cin >> a;
    cout << (a+24-15)%24 << '\n';
}

ZJ a410:解方程

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    double a, b, c, d, e, f;
    /* ax+by=c
       dx+ey=f */
    cin >> a >> b >> c >> d >> e >> f;
    // a:d = b:e時可能無解或無限多組解
    if (a*e == b*d) {
	if (a*f == c*d) {
	    // a:d = b:e = c:f
	    // 無限多組解
	    cout << "Too many\n";
	}
	else {
	    // a:d = b:e ≠ c:f
	    // 無解
	    cout << "No answer\n";
	}
    }
    else {
        double x, y;
        if (d != 0) {
	    if (a == 0) {
		/* by=c 
		   dx+ey=f */
		y = c/b;
		x = (f-e*c/b)/d;
	    }
	    else {
		// dx+ey=f 整條式子乘上(a/d)
		double D = a;
		double E = e*a/d;
		double F = f*a/d;
		/* ax+by=c 
		   ax+Ey=F */
		// (b-E)y = c-F
		y = (c-F)/(b-E);
		// y代入1式
		// x = (c-by)/a
		x = (c-b*y)/a;
            }
	}
        else {
	    /* ax+by=c
	       ey=f */
	    y = f/e;
	    x = (c-b*f/e)/a;
        }
        cout << "x=" << fixed << setprecision(2) 
	    << x << "\ny=" << fixed 
	    << setprecision(2) << y << '\n';
    }
}

克拉瑪公式

\Delta = \left | \begin{array}{cccc} a_1 & b_1 \\ a_2 & b_2 \end{array}\right | = a_1b_2 - a_2b_1
\Delta_x = \left | \begin{array}{cccc} c_1 & b_1 \\ c_2 & b_2 \end{array}\right | = c_1b_2 - c_2b_1
\Delta_y = \left | \begin{array}{cccc} a_1 & c_1 \\ a_2 & c_2 \end{array}\right | = a_1c_2 - a_2c_1
\begin{cases} a_1x+b_1y=c_1\\ a_2x+b_2y=c_2 \end{cases}
\begin {cases} x = \frac{\Delta_x}{\Delta} \\ y = \frac{\Delta_y}{\Delta} \end {cases}

方程組的解

\Delta \neq 0

:方程組有解

\Delta =\Delta_x = \Delta_y=0

:方程組有無限多組解

\Delta = 0

:方程組無解

\Delta_y \neq 0

\Delta_x \neq 0

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    double a, b, c, d, e, f;
    cin >> a >> b >> c >> d >> e >> f;
    /* ax+by = c
       dx+ey = f */
    double del = a*e - b*d; // Δ
    double delx = c*e - b*f; // Δx
    double dely = a*f - c*d; // Δy
    // Δ=0時可能無解或無限多組解
    // a:d = b:e 交叉相乘
    // ae = bd,移向就得到Δ = ae-bd
    if (del == 0) {
        if (dely == 0)
            cout << "Too many\n";
        // 若Δy=0表示af-cd=0,整理得a:d = c:f
        // a:d = b:e = c:f,有無限多組解
        else
            cout << "No answer\n";
        // a:d = b:e ≠ c:f,無解
    }
    else {
        double x = delx/del; // x = Δx/Δ
        double y = dely/del; // y = Δy/Δ
        cout << "x=" << fixed 
            << setprecision(2) << x
            << "\ny=" << fixed 
            << setprecision(2) << y << '\n';
    }
}

ZJ a410:解方程-另解(克拉瑪公式)

C++1

By princetonbxxxh