Try   HackMD

C/C++從入門到精通

程式入門須知

初學常犯der錯誤
Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

  • 常忘記在敘述行尾端打上分號(;)

cout << “hi”

  • 在不應該出現分號的地方多打

If(a = b);

  • 大小寫沒區分

C/C++語言規定大小寫字母是不同字元

  • 拼錯字

像是將char打成chr,如果錯誤訊息像是( ‘ )刮起來‘ chr ‘ was not declared in this score 字樣

  • 括弧未配成對

有左括弧,就一定有右括弧(只要是括弧就一定是成對)

  • 引號未成對

無論雙引號(用於字串)或單引號(用於字元)都要成對出現

  • 不該出現的空白符號

像是namespace 打成name space 原本為連在一起的就不該隨意分開

cin輸入

cin 物件可輸入文數字至指定的變數

  • 可輸入字元至變數a
char a; cin>>a; cout<<"a"<<a<<endl;
  • 可輸入整數至變數b
int b; cin>>b; cout<<"b="<<b<<endl;
  • 可輸入字串至變數c
char c[5]; cin>>c; cout<<"c="<<c<<endl;

cin 範例程式

#include<iostream>
using namespace std;
int main(){
    char a; //只輸出輸入的第一個字元EX:輸入106輸出1
    cin>>a;
    cout<<"a="<<a<<endl;
    int b;//只輸出整數若為0.2只輸出0
    cin>>b;
    cout<<"b="<<b<<endl;
    char c[5];//可輸出多個字元EX:輸入106輸出106
    cin>>c;
    cout<<"c="<<c<<endl;
   //下面這幾段也是同樣意思,可連續輸入3個變數EX:a 1 300 輸出a=a b=1 c=300 和前面一樣都可用連續輸入讓他輸出
   cin>>a>>b>>c;
   cout<<"a="<<a<<endl;

   cout<<"b="<<b<<endl;
   cout<<"c="<<c<<endl;  
   return 0;
}

cout 輸出

cout可輸出指定任何文數字與變數內容,且不用管變數的資料型態

int a=5; cout<<a; //輸出5
或是
int a=5;
cout<<"a="<<a;
//其中第一個用雙引號表示字串內容,以字串方式輸出,第二個a,則是變數,將會輸出對應變數的內容也是輸出5

cout 範例程式1

#include<iostream> using namespace std; int main(){ cout << "Good" <<endl; int a =5; cout << "a=" <<a<<endl; return 0; }

若要進行輸出資料的欄位寬度、符點小數位數、輸出靠左或靠右

使用cout物件所提供的width、setf等屬性

width屬性可設定輸出資料的欄位寬度,預設向右靠齊

int a1=1 ,a2=10 ,a3=100 ,a4=1000 ,a5=10000; cout.width(5);cout<<a1<<endl; cout.width(5);cout<<a2<<endl; cout.width(5);cout<<a3<<endl; cout.width(5);cout<<a4<<endl; cout.width(5);cout<<a5<<endl;

輸出結果會是
1
10
100
1000
10000

cout.width(5)
在每個輸出前都要設定,有效期只有一次

cout.width(5) cout<< a1 <<endl; cout<< a2 <<endl; //只對a1有效

範例程式2

#include<iostream> using namespace std; int main(){ int a1=100,a2=100; cout.width(5); cout << a1 <<endl; cout << a2; return 0; }
​​​​輸出會是
​​​​    100
​​​​  100
​​​​只會影響到第一個的輸出位置(預設靠右)

setf可輸出資料的小數點位數,資料靠左或靠右

  • cout.setf(ios::fixed,ios::floatfield);

ios>>命名空間名稱__"::">>範圍運算子__ floatfield >>表示浮點數欄位

  • cout.precision(2);
precision(2)>>浮點數精準度(小數後取兩位)
  • cout.setf(ios::right,ios::adjustfield)

設定靠左(left)或靠右(right),adjustfield >>自動調整欄位

cout 範例程式3

   #include<iostream>
   using namespace std;
   int main(){
     float b1=3.14159;
     cout.setf(ios::fixed,ios::floatfield);
     cout.precision(2);
     cout.setf(ios::right,ios::adjustfield);
     cout.width(8);
     cout<<b1<<endl;
     cout.width(8);
     cout<<b1*20<<endl;
     cout.width(8);
     cout<<b1*200<<endl;
 }
​​​​輸出結果
​​​​  3.14
​​​​ 62.83
​​​​628.32

printf 輸出

C語言採用printf()與scanf()作為輸出入函式

printf()可輸出結果,期中括號內需放置一對大括號("")達成將欲輸出的資料當作引數傳給printf()函式

printf("a"); printf("aa");

輸出結果為 aaa

要跳列的話,需使用到跳脫字元 \n

通常使用換行符\n,在其他情況下則使用控制符endl。一個差別是,endl確保程序將立即顯示在屏幕上;而使用“\n”不能提供這樣的保證,這意味著在有些系統中,有時可能在您輸入信息後才會出現提示。

printf("a\n"); printf("a\na");

輸出結果
a
a
a

printf 範例程式1

#include <iostream> using namespace std; int main() { printf("a\n"); printf("a\nb\n"); return 0; }
​​​​結果就是  
​​​​a
​​​​a
​​​​b 

如果是變數的輸出,則必須在引數敘述中加一個列印格式控制輸出格式

printf 範例程式2

#include<iostream>
using namespace std;
int main(){
	int a=3;
	int b=5;
	printf("a=%d\nb=%d",a,b);
// a,b會依序對應 
// %d>>整數 %ld>>長整數 %f>>浮點數  %c>>字元 %s>>字串(字元陣列)
 
    return 0;
}
​​​​結果是 
​​​​a=3
​​​​b=5 

scanf 輸入

scanf()可輸入資料,跟printf同樣方式,兩者都需用到列印格式控制輸出入資料

輸入字元
char a;
scanf("%c,&a"); 
//%c>>字元 &a>>指定到a,&是取址符號用來取得欲放置輸入資料的變數位置

scanf 範例程式1

#include <iostream> using namespace std; int main() { char a; printf("press any char: "); scanf("%c", &a); printf("char is %c",a); return 0; }
​​​​ 輸出結果>> 
​ press any char: 1
​​​​ char is 1

C語言的字串是由字元陣列組成

在輸入字串時,必須利用字元陣列完成輸入

scanf 範例程式2

#include<iostream> #include<stdio.h> using namespace std; int main(){ char c[6]; //一維陣列中有6個元素 printf("enter a string: "); scanf("%s", &c); //%s>>字元陣列 printf("enter is %s", c); return 0; }

此程式輸入是什麼輸出就是什麼

scanf 範例程式3

#include <iostream> #include <stdio.h> using namespace std; int main(){ int a; long b; float c; printf("enter an int: "); scanf("%d", &a); printf("enter an long int: "); scanf("%ld", &b); printf("enter an float: "); scanf("%f", &c); printf("\n your enter.... \n"); printf("int a =%d \n", a); printf("long int b =%ld \n", b); printf("float c =%f", c); return 0; }

如果設int >>10,long int>>1.11

則float會直接將長整數的0.11拿過來

​​​​輸出結果
​​enter an int: 10
​​enter an long int: 1.11
​​enter an float:
​​your enter.....
​​int a =10
​​long int b=1
​​float c=0.110000

string 字串

C因為要精簡編譯器,SO沒有string型態,所有字串處理都要使用字元陣列

C++新增string型態

在使用前都要包含cstring巨集

string 範例程式

#include<iostream> #include<cstring> using namespace std; int main(){ string a; cin >> a; cout << "a=" <<a; }
兩個程式比對一下輸出結果na~~
#include<iostream> #include<cstring> using namespace std; int main(){ string b; getline(cin,b); cout << a<<endl; cout << "b=" <<b ; return 0; } //若要輸入含空白字串,則要使用getline()函式
​​​​若輸入HI HO
​​​​輸出結果
​​​​a = HI
​​​​b = HI HO

跳脫字元(Escape Sequence)

字元中的單引號(')、雙引號(")及反斜線()均有定義功能

若一定要使用這些字元,使用前須加反斜線()跳脫定義功能


字元 跳脫字元序列
單引號 \ '
雙引號 \ "
反斜線 \ \

範例程式

#include<iostream> #include<string> using namespace std; int main(){ string a= "HI" ; cout << "a=" <<a<<endl; string b= "\"HI\"" ; cout <<"b=" <<b<<endl; return 0; }
​​​​輸出結果
​​​​a=HI
​​​​b="HI"

資料分類與型態

下面整理C/C++語言數值資料型態,unsigned表示無號整數、即非負整數

數值資料型態 占用記憶體大小 代表的數值範圍
short 16 -32768 ~ +32767
int 16 -32768 ~ +32767
long 32 -2147483648 ~ +2147483647
unsigned short 16 0 ~ 65535
unsigned int 16 0 ~ 65535
unsigned long 32 0 ~ 4294967295
float 32 大約3.4E-38 ~ 3.4E+38(負數亦同)
double 64 大約1.7E-308 ~ 1.7E+308(負數亦同)
long double 80 大約3.4E-4932 ~ 3.4E+4932(負數亦同)

資料分類

int(Integerts整數常數)的三種進位方式

  • 十進位(Decimal)
  • 十六進位(Hexadecimal),以OX、Ox開頭
  • 八進位(Octal),以O開頭
  • OxA、OXB等類的均為16進制
  • 11、12等等的一般書寫數字方式為10進位
  • O72則為8進位

可使用signed(有號)、unsigned(無號)的short、int、long等的六種型態儲存整數

整數預設型態是16bits的int型態


float(Floating-poing literals浮點常數)

數字中含有小數點或指數的稱為浮點數
以指數為例E、e表示10的次方
例如0.0023、2.3E-3、2.3e-3都是表示相同的浮點數或是2.3E+2>>230
浮點數可使用標準書寫>>24.101、1.123
科學符號>>2.3E+1、2.01e-4

可以使用float、double、long double三種型態儲存浮點數常數

double是浮點數預設值,若要使用float,則應該要在數值後加上F、f

  • 例如: double = 1.414,float = 1.414f

而要用long double應在數值後加L、l

  • 例如: long double = 1.414L

char(character literals字元常數),使用單引號(')圍住的!!單一字元!!

例如'A'、'a'等

C/C++使用bits的ASCII,可表示256個字元包含大小寫英文字母、數字、標點符號、其他特殊符號
char型態是8位元長


String(字串)

字串以雙引號" "圍住

例如:"HI"、"你好"

因C沒有字串型態,所以字串的使用要用字元陣列而C++新增string使用前要新增#include<cstring>

Boolean(布林值)

使用1代表True、0代表False

布林型態是bool

變數宣告

變數的功能是用來輸入、處理、儲存外界資料

變數在使用前要事先宣告才能用

若變數未宣告的結果,編譯器便無法回應使用者在拼字上的錯誤,造成除錯的困難

hi = hi +1;
上式若事先宣告hi
int hi;
沒宣告則編譯器遇到hi時,便會出現 hi 未宣告的錯誤訊息
變數宣告的優點是可配置恰當的記憶體而提高資料的處理效率[color=#901f7561]


C/C++變數宣告語法如下

​​​​資料型態 變數名稱 [=初值];
  • int a; 宣告變數 a 為int型態
  • char b,c; 宣告變數b,c為char型態
    變數宣告亦可連同初值一同設定
  • float e=1.1f; 宣告變數 e 為float型態
  • char r='n'; 宣告變數 r為 char型態,初值為n

這段程式宣告bool型態

#include<iostream> using namespace std; int main(){ bool g,v; g = 4>2; // 1 >> True cout <<g<<endl; v = 4<3; // 0 >>False cout <<v<<endl; cout << sizeof(v); //記憶體大小 return 0; }
​​​​輸出結果
​​​​1
​​​​0
​​​​1

C沒有字串型態要使用字串則要使用指標或字元陣列

下列程式使用指標處理字串

#include<iostream> using namespace std; int main(){ char *a="abcd"; char *t; t="qwer"; cout<<a<<endl;//abcd cout<<t<<endl;//qwer a ="ok"; cout << a<<endl; a=t;//qwer cout <<a; }
​​​​輸出結果
​​​​abcd
​​​​qwer
​​​​ok
​​​​qwer

C++新增string型態
可宣告變數b為字串型態

#include<iostream> #include<string> using namespace std; int main(){ string b; b ="QAQ"; cout <<b; return 0; }
​​​​輸出結果
​​​​QAQ

範例程式

#include<iostream> #include<string> using namespace std; int main(){ int hi=0; hi = hi + 1 ; cout <<hi<<endl; char *K; char *N; K ="OH"; N ="YA"; string S; S = "HAHAHA"; cout << K<<endl; cout << N<<endl; cout << S; return 0; }
​​​​  輸出結果
​​​​  1
​​​​  OH
​​​​  YA
​​​​  HAHAHA

下面的程式碼出了許多錯誤,嘗試排錯先,再看答案
Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

#include<iostream> using namespace std; int main(){ int hihi123; int _a; int %as; int sum! ; int Age#3; int a c; int c + 3; int Score; score =4; int if; return 0; }

找到錯誤了嗎?
Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

下面是排錯後der程式

int main(){ int hihi123; int _a; int as;//不能由符號開頭 int sum;//不可有! int Age3;//不可有# int a,c;//不可空白 int c; //不得含有加號 int Score; Score =4; //大小寫錯誤 int hi; //if是保留字 return 0; }

常數符號的宣告

常數符號需要記憶體儲存位置,與變數不同的是常數在整個程式中都不會也不會改變其值

程式設計有兩種表示常數的方式

文字式(Literal):直接以15或3.14表示某一常數[color=#a01d7961]

常數符號式(Symbolic):因有些數字在程式中會不斷重複出現,為了增加程式可讀性及減少程式鍵入麻煩,此時可以用有意義的符號代替這就是常數符號宣告[color=#509f7349]

C語言常數定義語法

#define 常數名稱 常數值

C++則新增了const宣告常數

const 型態 常數名稱=常數值;

範例程式

#include<iostream> #define PIE 3.14 //常數符號通常用大寫表示 const double PI=100; using namespace std; int main(){ double a,b; a=3*3*PIE; //3*3*3.14 b=5*5*PI; // 5*5*100 cout<<a<<endl<<b; return 0; }
​​​​輸出結果
​​​​28.26
​​​​2500

變數常數有效範圍

在一個大型程式中,一個程式是由一或數個函式組合而成 為了防止變數互相干擾,才有變數的有效範圍

變數有效範圍如下>>

任一變數的宣告,若無特殊聲明,均屬於區域變數,有效範圍僅止於該變數所在程式區塊

例如:
宣告在敘述區塊,則它的有效範圍僅止於該敘述區塊,別的敘述區塊是無法取得該區域變數的值

若宣告於函式中,則它的有效範圍僅止於該函式,其他函式均無法取得該區域變數的值

EX:
全域的a有效範圍是main()、aa()、bb()等全部函式
b、c的有效範圍則是main()、aa()中c、d有效範圍是aa(),但此c與main()中的c只是同名,他們各自占有不同記憶體,且其值不會互相干擾

其次,bb()中的a是全域a,與main共用a,在bb()內的改變會傳回main();for敘述區塊內又宣告a,則此a僅在for內有效不會改變全域的a
但若在for敘述區塊中未宣告a,而誤用a,則a會改變全域的a;if敘述區塊也宣告a,則a僅在if內有效,不改變全域a

感覺看懂嘞對ㄅ 再來看程式碼吧!

範例程式1

#include<iostream> using namespace std; //int double PI=3.14;//全域常數 int a;//全域a int main(){ void aa(); void bb(); int b,c; a=10;//全域a c=5;//main內c aa(); cout<<"2.main的c="<<c<<endl; bb(); cout<<"3.全域a="<<a<<endl; for(int a=2;a<=3;a++) cout<<"4.for內的a="<<a<<endl; cout<<"5.for內的a="<<a<<endl; for(a=2;a<=3;a++)//誤用 cout<<"6.for內的a="<<a<<endl; cout<<"7.for內的a="<<a<<endl; if(c>2){ int a; a=1; cout<<"8.if內a="<<a<<endl; } cout<<"9.for內的a="<<a<<endl; return 0; } void aa() { int c,d; c=3;//aa內的C cout<<"1.aa內的c="<<c<<endl; } void bb() { a=8;//全域a }
​​​​輸出結果
​​​​1.aa der c=3
​​​​2.main der c=5
​​​​3.global variable a=8
​​​​4.for der a=2
​​​​4.for der a=3
​​​​5.for der a=8
​​​​6.for der a=2
​​​​6.for der a=3
​​​​7.for der a=4
​​​​8.if der a=1
​​​​9.for der Ba=4

範例程式2

#include<iostream> using namespace std; int a=1; void aa(){ cout<<"1.a="<<a<<endl;//1 int a=2; cout<<"2.a="<<a<<endl;//2 } void bb(){ cout<<"4.a="<<a<<endl;//1 a=3; } int main(){ aa(); cout<<"3.a="<<a<<endl;//1 bb(); cout<<"5.a="<<a<<endl;//3 return 0; }
​​​​輸出結果
​​​​1.a=1
​​​​2.a=2
​​​​3.a=1
​​​​4.a=1
​​​​5.a=3

變數資料型態轉換

每個變數宣告後,即有屬於自己的型態,往後此變數均只能給相同型態變數儲存 若執行階段指定給不同型態的變數儲存,則稱此為型態轉換

C/C++語言中型態轉換又可分為

隱含轉換(Implicit Conversion)與強制轉換(Explicit Conversion)

隱含轉換

將值域小的型態轉為值域大的型態,稱為自動轉換或轉型(Convert)
此種轉換系統可以自動處理並確保資料不會流失

將short轉為long,因後者的值域比前者大,所以可順利轉換

下列敘述可將型態為long的變數a指派給型態long的變數b,且原值不會改變

short a=23;
long b;
b=a;
cout<<b;
結果是23

強制轉換

將值域大的轉為值域小的型態,稱為強制轉換或稱鑄型(Cast),語法如下

變數1 = (變數1的型態) 變數2;

以下敘述可將型態是int的c變數指派給型態是short的d變數

int c=23;
short d;
d=(short) c;
cout<<d;
結果是23

強制轉換的風險大,可能導致資料流失或溢位

以下是將float型態強制轉換為short型態,將造成小數部分流失

float e=3.4f;
short f;
f=(short) e;
cout<<f;
結果是3

以下敘述將long型態的g變數轉為short,將造成溢位

long g=32769;
short h;
h=(short) g;
cout << h;
輸出為-32767[color=#b494]

範例程式

#include<iostream> using namespace std; int main(){ short a=10; long b; b=a; cout<<b<<endl; char b1='a'; cout<<b1<<endl; short b2; b2=(short) b1; cout<<b2<<endl; int c=20; short d; d=(short) c; cout<<d<<endl; float e=3.4f; short f; f=(short) e; cout<<f<<endl; long g=32769; short h; h=(short) g; cout<<h<<endl; return 0; }
​​​​輸出結果
​​​​10
​​​​a
​​​​97
​​​​20
​​​​3
​​​​-32767

運算子

所謂運算子(Operator),指的是可以對運算元(Operand)執行特定功能的特殊符號

運算子一般分為五大類:
指派(Assignment)運算子
算數(Arithmetic)運算子
邏輯 (Logical) 運算子
關係(Relational)運算子
位元 (Bitwise) 運算子

每種運算子又可再細分為

  • 一元(Unary)運算子>>只需要一個運算元就可操作
  • 二元(Binary)運算子>>需要兩個運算才可操作

優先順序決定同一式子擁有多個運算子時,每個運算子進行運算的優先順序

結合率決定同一敘述中,相鄰的運算子有相同優先順序的運算子執行順序

指派運算子(Assignment Operator)

指派運算子的符號為(=),其作用為將運算符號右邊運算式的值指派給運算符號左邊的運算元

EX:

int sum=0,a=3,b=5;
sum=a+b;//將a+b指派給sum

上述與數學的等號是不同的,所以不要懷疑為何0=8
其次是不能將常數放在指派運算子的左邊

EX:

8=x;//不合法敘述
x=8//合法敘述

算數運算子(Arithmetic Operator)

算術運算子用來執行一般數學運算

包含

  • 正負數 (+/-)
  • 加 (+)
  • 減 (-)
  • 乘 (*)
  • 除 (/)
  • 取餘數 (%)
  • 遞增 (++)
  • 遞減 ()
運算子 定義 優先順序 結合率
++/ 遞增/遞減 1 由左而右
+/- 正負號,一元運算子 2 由右而左
* 乘法運算 4 由左而右
/ 除法運算(商的型態同被除數) 4 由左而右
% 求餘數(Modulus) 4 由左而右
+/- 加法/減法運算 5 由左而右

範例程式

#include<iostream> using namespace std; int main(){ int x=5,y=4; float z=5; cout<<"1="<<x+z<<endl; //5+5 cout<<"2="<<x-z<<endl; //5-5 cout<<"3="<<x*z<<endl; //5*5 cout<<"4="<<y/z<<endl; //4/5取商 //這裡的z是浮點數 cout<<"5="<<x/y<<endl; //5/4取商 //若不是浮點數不會輸出小數後位數 cout<<"6="<<x%y<<endl; //5/4取餘數 cout<<"7="<<-x+y/z<<endl; //-5+4/5 cout<<"8="<<x-y%y*z<<endl; //5-4%4*5 return 0; }

輸出結果
1=10
2=0
3=25
4=0.8
5=1
6=1
7=-4.2
8=5

需要注意C/C++語言的算術運算子只有以上那些,若需要運算沒有運算子則需要運用到數學函式

例如C++沒有次方運算子(^)與開根號
要算次方的話要使用到pow()函式

a=pow(3,2);//include<math.h>或<cmath>

要算根號的話要使用到sqrt()函式

x=sqrt(9)//include<math.h>或<cmath>

遞增(++)及遞減(- -)

這兩個運算子又分為前置與後置

前置是在運算子之前

EX:

a=1;
++a;
cout<<a<<endl;//2

後置是運算子在運算元後

不論 ++a,a++都是將值加1放回a,但是兩個執行結果還是有差異的
EX:

a=1;
b=++a;//先執行a=a+1;在執行b=a; 輸出 a=2 b=2

a=1;
b=a++;先執行b=a;在執行a=a+1; 輸出 a=2 b=1

其a值均會加1,但b值會有差異,前置b值會得到+1的結果,後者能得到原a值

範例程式

#include<iostream> using namespace std; int main(){ int a=1; int b,d,r,e; b=++a;//a=1+1=2=b d=++a;//此時a是2,a=2+1=d e=a++;//a還是2,e=a=2,2+1=3=a r=a++;//a現在是3,r=a=3,3+1=4=a cout<<b<<endl; cout<<d<<endl; cout<<e<<endl; cout<<r<<endl; return 0; }
​​​​輸出結果
​​​​2
​​​​3
​​​​3
​​​​4

關係運算子(Relational Operator)或稱比較運算子(Comparison Operator)

用於資料之間的大小比較的結果可得到int型別的1(True)或0(False)
EX:

if(a==b);//比較ab是否相等

運算子 定義 優先順序 結合率
< 小於 6 由左而右
> 大於 6 由左而右
<= 小於等於 6 由左而右
>= 大於等於 6 由左而右
== 等於 7 由左而右
!= 不等於 7 由左而右

範例程式

#include<iostream> using namespace std; int main(){ int a,b,c; a=7>3; cout<<a<<endl;//T a=3>=7; cout<<a<<endl;//F b=7; c=3; a=b==c; cout<<a<<endl;//F b=7; c=3;a=b!=c; cout<<a<<endl;//T return 0; }

輸出結果
1
0
0
1

邏輯運算子(Logical Operator)

當同一個運算式要同時存在兩個以上比較運算子,每兩個比較運算子之間必須使用邏輯運算子連結

運算子 定義 優先順序 結合率
! 一元邏輯補數運算(NOT) 2 由右而左
& 完全評估的AND運算 8 由左而右
^ 完全評估的XOR運算 8 由左而右
| 完全評估的OR運算 8 由左而右
&& 快捷的AND運算 9 由左而右
|| 快捷的OR運算 9 由左而右

範例程式

#include<iostream> using namespace std; int main(){ int a,b,x,y; x=5; y=4; a=x>y & y==3; //T & F = F cout<<a<<endl; b=x>3 || y<5; cout<<b<<endl; //T | T = T return 0; }

輸出結果
0
1


完全評估系列的運算子一定會把兩個關係運算子拿來運算

相反地

快捷系列的運算子會先算出第一個關係運算子的值

如果這個值已經可以決定出整個運算式的結果
快捷系統的運算子就不會對第二個關係運算子進行運算
EX:

boolean1=(3>7)&(5>2);
boolean2=(3>7)&&(5>2);//比boolean1更快完成運算

範例實作

1.若有一數學式,判斷x是否滿足1<x<=6,請轉換C/C++敘述
2.若有一數學式,同時判斷4個變數是否滿足(a1/a2)=(b1/b2),請轉換C/C ++敘述
3.(a1/a2)=(b1/b2)!=(c1/c2)又如何表示
(記得要自己打過程式,題目沒有標準答案der)


//第1題 #include<iostream> using namespace std; int main(){ int x; cin>>x; x=x>1 & x<=6; cout<<x<<endl; return 0; }
//第二題 #include<iostream> using namespace std; int main(){ int a1,a2,b1,b2; int A; cin >> a1; cin >> a2; cin >> b1; cin >> b2; A=(a1/a2) == (b1/b2); cout<<A; }
//第3題 #include<iostream> using namespace std; int main(){ int a1,a2,b1,b2,c1,c2; cin >> a1; cin >> a2; cin >> b1; cin >> b2; cin >> c1; cin >> c2; if((a1/a2)==(b1/b2)!=(c1/c2)){ cout<<"T"; } else{ cout<<"F"; } return 0; }

複合指派運算子

結合指派與算術、關係、邏輯運算子

這是C/C++特有的運算子

EX:

sum=sum+5;
又等於
sum+=5;

運算子 定義 優先順序 結合率
= 指派設定內容 11 由右而左
+= 相加後再設定內容 11 由右而左
-= 相減後再設定內容 11 由右而左
* 相乘後再設定內容 11 由右而左
/= 相除後再設定內容 11 由右而左
&= AND運算後再設定內容 11 由右而左
|= OR運算後再設定內容 11 由右而左
^= XOR運算後再設定內容 11 由右而左

位元操作運算子(Bitwise Operator)

位元(Bitwise)操作運算子是將所運算的整數,先轉為二進制,在逐位元進行運算
可分為

位移(shift)運算子與布林運算子
位移運算子是逐位元向左或是向右移
布林運算子則可以逐位元進行布林運算[color=#a347]

運算子 定義 優先順序 結合率
~ 對各位元進行補數運算 2 由右而左
<< 考慮正負位元的向左位元 5 由左而右
>> 考慮正負位元的向右位元 5 由左而右
& 位元AND運算 2 由左而右
| 位元OR運算 8 由左而右
^ 位元XOR運算 8 由左而右
<<= 向左位移之後再指派內容 11 由左而右
>>= 向右位移之後再指派內容 11 由左而右

數位邏輯幫大家整理一下

​​​​ 0 >>True
​​​​ 1 >>Falst

​​​​ AND  >>遇 0 則 0
​​​​ NAND >>遇 0 則 1
​​​​ OR   >>遇 1 則 1
​​​​ NOR  >>遇 1 則 0
​​​​ XOR  >>相同為 0 不同為 1 
​​​​ NXOR >>相同為 1 不同為 0

#include<iostream> using namespace std; int main(){ int i,j,k; i=1; //0000 0001 i=~i;//1111 1110取2補數 cout<<"1="<<i<<endl;//-2(10進制) i=6; //i=00000110 i=i<<2;//i=00011000 cout<<"2="<<i<<endl; i=i>>3; cout<<"3="<<i<<endl;//i=00000011 i=3; //i=00000011 j=2; //j=00000010 k=i & j;//k=00000010//遇0則0 cout<<"4="<<k<<endl; k=i | j;//k=00000011//遇1則1 cout<<"5="<<k<<endl; k=i ^ j;//k=00000001//相同為0不同為1 cout<<"6="<<k<<endl; return 0; }
​​​​輸出結果
​​​​1=-2
​​​​2=24
​​​​3=3
​​​​4=2
​​​​5=3
​​​​6=1

運算子的優先順序

同一敘述若同時有多個運算子,此時需定義運算子的優先順序

x=a+bc;
由以上各運算子的「優先順序」可知,乘號(
)的優先順序是第4而加號(+)則是第5

x=(a+(b*c));//和上述結果相同

同理

x=a>b & b>z;

同義

x=(a>b) & (b>z);

下面式子左右結果是相同的

x=x+++2; x=(x++)+2;
x=x+y*2+z++; x=((x+(y*2))+(z++));
z=x>2 & y>3; z=((x>2)&(y>3));

範例程式

#include<iostream> using namespace std; int main(){ int a,b,c; int x,y,z; x=2; x=x+++2; cout<<"X1="<<x<<endl; x=1;y=3;z=5; x=x+y*2+z++;//1+3*2+5=12,x=12=Z++ cout<<"X2="<<x<<endl; x=1;y=4; z=x>2 & y>3; cout<<z<<endl; return 0; }

運算子的結合律

當同一敘述,相鄰的運算子擁有相同優先順序的運算子,此時即需定運算子是左結合或右結合

x=z-b-c;

同是減號(-),優先順序相同,此時就要靠定義結合律,減法結合律是由左至右

x=((a-b)-c);

x=y=z=2;

指派運算子的結合律由左至右,上式同義於

(x=(y=(z=2)));

#include<iostream> using namespace std; int main(){ int a,b,c; int x,y,z; a=2; b=3; c=4; x=a-b-c; cout<<x<<endl; x=y=z=2; cout<<"x="<<x<<endl; cout<<"y="<<y<<endl; cout<<"z="<<z<<endl; return 0; }
​​​​輸出結果
​​​​-5
​​​​x=2
​​​​y=2
​​​​z=2

運算式

任何一個可求得一個值的式子,稱為一個運算式(Expression) 例如5+3會回傳一個數值,所以5+3是一個運算式
這些運算式通常放在cout<<運算式,一般而言可以放在等號右邊的東西,都可以稱為運算式


敘述(Statement)

凡是控制執行的順序、對運算式取值或不做任何事均可稱為敘述

所有的敘述都要以分號(;)作結束,例如

sum=sum+1;

於C/C++語言中,若前一個敘述未以分號結束,則錯誤訊息通常會出現在下一個敘述的開頭


敘述區塊(Block Statement)或複合敘述(Compound Statement)

在任何可以放上單一敘述的地方,你都可以放上敘述區塊,一個複合敘述是由兩個大括號組合而成
但大括號後不可再加分號

{
t=a;
a=b;
b=t;
}


註解(Comments)

適當的程式註解才能增加程式可讀性

/*我是註解*/
//我是註解

上式/*符號以後的字串視為註解,編譯程式不予處理,直到遇到*/為止

還有同一列中,雙斜線(//)後面也視為註解,編譯器均不予處理

x=x+3; /* x值加3 */
sum=sum+y; //將y值加至sum[color=#b499]

前者因為可超過兩列,較適合編寫較長的註解

後者僅能寫在同一列


縮排與空行

除了適當的註解,程式設計應善用縮排與空行,才可以使程式讓人易於閱讀 因為有了縮排,程式才有了層次感,其次,空行則可使段落更加明顯

程式架構介紹

C/C++程式架構如下:

大致分為四大區塊,分別是

  • 函式引用區
  • 宣告區(類別、函式、全域變數宣告區)
  • 主程式區
  • 類別、函式實作區
編號 標題 程式
函式引用區(引入所需標頭檔) #include <iostream>、#include<math.h>
命名空間、類別、函式、全域變數宣告區 using namespace std;
int add(int a,int b);
int c;
主程式區main() int main(){
c=add(6,2);
cout<<c;
return 0;
}
類別、函式實作區 int add(int a,int b){
int c;
c=a+b;
return ( c );
}

範例程式

#include <iostream> #include<math.h>//函式引用區 using namespace std;//命名空間、類別、函式、全域變數宣告區 int add(int a,int b);//函式宣告 int c; int main(){ //主程式區 c=add(6,4); //6+4 cout<<c; //10 return 0; } int add(int a,int b){//類別或函式實作區 int c; c=a+b; return (c); }

但是函式、類別實作區若與主程式區調換,則函式與類別不用宣告

#include <iostream> #include<math.h>//函式引用區 using namespace std;//命名空間、類別、函式、全域變數宣告區 int add(int a,int b);//函式宣告 int c; int add(int a,int b){//類別或函式實作區 //a,b不可省略 int c; c=a+b; return (c); } int main(){ //主程式區 c=add(6,4); //6+4 cout<<c; //10 return 0; }
​​​​兩種寫法輸出都是10

實例應用

記得要自己想過寫過呦

第一題

試寫一程式,可輸入長方形的長與寬,並計算周長與面積

長方形面積公式>>長乘寬
長方形周長公式>>2(長加寬)

#include<iostream> using namespace std; int main(){ int a,b,c,d; cout<<"Input length and width:"; cin >>a>>b;//a為長、b為寬 c = 2*(a+b); //周長 d = a*b;//面積 cout<<"c="<<c<<endl; cout<<"d="<<d<<endl; return 0; }

第二題

輸入長方體長寬高計算表面積與體積

長方體表面積=(長x寬+寬x高+高x長)x2
長方體的體積公式=長×寬×高

#include<iostream> using namespace std; int main(){ int a,b,c;//長:a 寬:b 高:c int x,y; cout<<"Input length, width and height"; cin>>a>>b>>c; x=(a*b+b*c+c*a)*2;//面積 y=a*b*c;//體積 cout<<"rectangular Volume="<<y<<endl; cout<<"rectangular area="<<x; return 0; }

第三題

試寫一程式,滿足以下條件
1.可以輸入兩個座標
2.計算兩點座標距離
3.輸出此兩點距離

#include<iostream> #include<math.h> using namespace std; int main(){ int x1,x2,y1,y2; double d;//距離 cout<<"input x1,x2,y1,y2"<<endl; cin>>x1>>x2>>y1>>y2; d=sqrt(pow((x1-x2),2)+pow((y1-y2),2)); //pow是次方 sqrt是開根號 cout<<"The distance of the two points is:"<<d<<endl; return 0; }

第四題

試寫一程式,可輸入三角形三邊長a、b、c求面積

#include<iostream> #include<math.h> using namespace std; int main(){ int a,b,c; double d,e; cout<<"Input triangle "<<endl; cin>>a>>b>>c; d=(a+b+c)/2; e=sqrt(d*(d-a)*(d-b)*(d-c)); cout<<"The triangle area is:"<<e<<endl; return 0; }

這裡補充一下演算法則
兩個數要交換,就如同兩杯水要交換
假設你有兩個杯子的水(分別為糖水a、鹽水b),交換其內容,方法如下

1.先找來空杯子t
2.將a杯子的水倒入t杯子
t=a;
3.將b杯子的水倒入a杯子
a=b;
4.將t杯子倒入b杯子,而完成兩杯子的交換
b=t;

其次,若未先找來空杯子t,而直接將b杯子的水往a杯子倒,再將a杯子的水往b杯子倒

a=b;
b=a;

則執行a=b時,如果這時a杯中糖水已經沒了,此時在執行b=a,會出現錯誤結果

第五題

試寫一程式,滿足以下條件
1.可以輸入兩個數字
2.交換此兩個數字
3.輸出交換的結果

#include<iostream>
using namespace std;
int main(){
  int a,b,z;
  //cout<<"Input 2 digit:"<<endl;
  //cin>>a>>b;  //試比較兩種輸入輸出
  printf("input a:");
  scanf("%d",&a);// %d是整數 &取得a變數位址
  printf("input b:");
  scanf("%d",&b);

  z=a;
  a=b;
  b=z;

//cout<<"Exchange import numerical a,b aftermath:<<endl<<"a="<<a<<endl<<"b="<<b<<endl;
  printf("after swap a=%d b=%d",a,b);
  return 0;
}

第六題

試寫一程式,可以輸入三個數,並將1交給2、2交給3、3交給1並輸出三個數的結果


#include<iostream>
using namespace std;
int main(){
    int a,b,c; //a>>1,b>>2,c>>3
    cout<<"input 3 numberal:"<<endl;
    cin>>a>>b>>c;
    b=a;
    c=b;
    a=c;
    printf("Exchange import numerical a,b,c aftermath: a=%d b=%d c=%d ",a,b,c);
    return 0;    
}
//輸出結果有接力棒的fu

第七題

假設某次考試成績如下55、66、77、88、99

1.試寫一程式輸入以上資料
2.輸入以上資料
3.計算總和
4.輸出總和與平均[color=#f568]

#include<iostream> using namespace std; int main(){ int a,b,c,d,e; double x,y; a=55; b=66; c=77; d=88; e=99; //cout<<"input 5 achievement"<<endl;//如果是手動輸入成績的話 //cin>>a>>b>>c>>d>>e; x=a+b+c+d+e; y=x/5; cout<<"sum = "<<x<<endl; cout<<"averagely = "<<y; return 0; }

補充一下

如果遇到大量需要輸入的資料千萬不要這樣一個一個慢慢輸入呦
想知道如何撰寫這樣的程式,會在迴圈與陣列的章節說到

第八題

兩點式,兩點可決定一直線(ax+by+c=0)
試寫一程式,可輸入兩個二為座標,並求出此直線方程式

例如:輸入(2,1)、(4、6)則直線方程式為5x-2y-8=0

#include<iostream>
#include<math.h>
using namespace std;
int main(){int x1,y1,x2,y2;int a,b,c,x,y;
​   cout<<"input x1,y1"<<endl;
​   cin>>x1>>y1;
​   cout<<"input x2,y2"<<endl;
​   cin>>x2>>y2;
​   x=x2-x1;
​   y=y2-y1;
​   a=y;
​   b=-x;
​   c=-y*x1+x*y1;
​   cout<<a<<"x+"<<b<<"y+"<<c<<"=0";return 0;
}

應用複習

1.試寫一程式,可輸入一個一元二次方程式,求解(設本例假設方程式有二解)

◎用公式法解一元二次方程式 ax^2 + bx + c = 0 的步驟如下:
(一) 找出二次項係數 a,一次項係數 b,常數項 c。
(二) 算出 b^2-4ac 的值。
(三) 若 b^2-4ac > 0,則 x =−𝑏±√𝑏^2−4𝑎𝑐/2𝑎
若 b^2-4ac = 0,則 x =−𝑏/2𝑎(重根) 。
若 b^2-4ac < 0,則 x 無解。(在國中階段無解)

範例輸出2x^2-7x+3=0,x1=3,x2=0.5

#include<iostream> #include<math.h> using namespace std; int main(){ double a,b,c,d; double x1,x2,com; cout<<"input abc "<<endl; cin>>a>>b>>c; // 0==(pow((a*x1),2))+(b*x2)+c; if (b*b-4*a*c>0){ d=sqrt(b*b-4*a*c); x1=(-b+d)/(2*a); x2=(-b-d)/(2*a); } if (b*b-4*a*c==0){ // d2=sqrt(b*b-4*a*c); x1=-b/(2*a); x2=-b/(2*a); } cout<<"x1="<<x1<<endl; cout<<"x2="<<x2; }

2.試寫一程式,可以輸入一個二元一次方程式,求其解(本例假設方程式洽有一解)
提示:使用克拉瑪公式

#include<iostream> #include<math.h> using namespace std; int main(){ double a1,a2,b1,b2,c1,c2,d; double x,y; cout<<"input a1_b1_c1_a2_b2_c2"<<endl; cin>>a1>>b1>>c1>>a2>>b2>>c2; // c1=((a1*x)+(b1*y)); // c2=((a2*x)+(b2*y)); d=((a1*b2)-a2*b1); x=((c1*b2)-c2*b1)/d; y=((a1*c2)-a2*c1)/d; cout<<"x="<<x<<endl; cout<<"y="<<y<<endl; }

3.試寫一程式,可以輸入一個三元一次方程式,並求其解(本例假設所輸入的方程式洽有一解)

#include<iostream>
//#include<cmath>
using namespace std;
int main(){
    double a1,a2,a3,b1,b2,b3,c1,c2,c3;
    double d1,d2,d3,e,x,y,z;
    cout<<"input a1_b1_c1_d1_a2_b2_c2_d2_a3_b3_c3_d3"<<endl;
    cin>>a1>>b1>>c1>>d1>>a2>>b2>>c2>>d2>>a3>>b3>>c3>>d3;
    e=((a1*b2*c3)+(a2*b3*c1)+(a3*b1*c2)-(a3*b2*c1)-(b3*c2*a1)-(c3*b1*a2));
    z=((a1*b2*d3)+(b1*d2*a3)+(d1*b3*a2)-(d1*b2*a3)-(d2*b3*a1)-(d3*b1*a2))/e;
    x=((d1*b2*c3)+(b1*c2*d3)+(c1*b3*d2)-(c1*b2*d3)-(c2*b3*d1)-(c3*d2*b1))/e;
    y=((a1*d2*c3)+(d1*c2*a3)+(c1*d3*a2)-(c1*d2*a3)-(c2*d3*a1)-(c3*d1*a2))/e;
    cout<<"x="<<x<<endl;
    cout<<"y="<<y<<endl;
    cout<<"z="<<z;

}

4.計算自由落體的距離與時間關係,公式為d=v0t+gt^2/2

#include<iostream> #include<cmath> using namespace std; int main(){ double v0,t,g,d; cout<<"input v0,t,g"<<endl; cin>>v0>>t>>g; d=v0*t+(g*t*t)/2; cout<<"d="<<d; return 0; }

5.請分別輸入1個0到9的整數,並將它合併為1個整數
例如:輸入1、2、3、4則輸出1234

#include<iostream> using namespace std; int main(){ int i; cin>>i; cout<<"your input is:"<<i<<endl; }