C&C++ 基礎教學

C&C++

  1. 程式基本架構&輸入與輸出
  2. 判斷&運算
  3. 迴圈&陣列
  4. 函式&排序演算法

Teacher:D.J
(P.S 內容請不要外洩,謝謝!!)

1.程式基本架構&輸入與輸出

下面為C的範例程式:

 

第一行中的 #include是增加功能的意思,C語言在沒有#include的狀況下只能進行計算、判斷、重複執行,<stdio.h>是輸入及輸出的功能這種檔我們稱為標頭檔

int main()後大括號內是你寫程式主要的地方,每句程式的結束不是分號就是大括號,第9行可加可不加,代表程式結束。

C裡所有變數都需要宣告,先告訴程式你要用這個變數,而在C語言裡數字有分很多種型態

宣告方式 範圍 大小 (單位:位元組)
int –2,147,483,648 ~ 2,147,48,647 4
float 3.4E +/- 38 (7 位數) 4
long long int –9,223,372,036,854,775,808 ~9,223,372,036,854,775,807 8
double 1.7E +/- 308 (15 位數) 8
char 一個字 1

第5&7行的printf代表顯示文字也就是輸出,第6行的scanf則是輸入,雙引號內是寫輸入或輸出的文字,%d稱為”引數”,會將逗號後的變數值代入,

若有多個則依順序代入,例如假設a=4,b=2,c=5,printf(“a=%d b=%d c=%d”,a,b,c); 會輸出 a=4 b=2 c=5

不同的型態會用到不同的引數,在此提供上列型態的引數

int float long long int double char
%d %f %lld %lf %c

%c前建議加一個空格避免出錯, 這是運用scanf輸入格式特性像是scanf(“%d:%d”,&a,&b);輸入5:14時a會等於5 ,b等於14

至於scanf的變數為什麼要加上&及如何輸入不只一個字在迴圈&陣列時會講到,目前只要記都要加上就好了

跳脫字元是指一些打不太出來的字,像是換行之類的字元

印出 \\ tab \t
印出’ \’ Backspace \b
印出” \” 印出? \?
換行 \n 換頁 \f

關於格式化輸出可以試試看”%5d”,”%50d”,”%.2f”
下面為同一程式C++的寫法:

 

C++中的#include<iostream>幾乎等於C的<stdio.h>,但是為了避免每次都要寫std::cout這類的東西,所以加上了using namespace std;把std::自動加上

cout及cin是輸出及輸入,<<及>>為資料方向,cout及cin不需要使用引數,方便許多,但也相對的,如果printf要1秒則cout需要大約兩秒的時間

⊗練習: Zerojudge[d483] Green Judge[a001][a002][a003]

2.判斷&運算

下面為C的範例程式:

 

下面為C++的範例程式:

 

因為C++與C的寫法除了上個章節講的不同以外其他大至一樣,不一樣的會再註記,所以以後除非有一定需要使用到C++,除此之外不會再提供C++的範例程式

在上面的範例程式(C)中第6行的動作依次是將 n除以2、n乘以2、n加1000、n減1000算完後再把值給n,結果還是一樣

在此提供程式裡的算術運算子(也就是運算符號)

加法 a+b 乘法 a*b
減法 a-b 除法 a/b
取餘數(mod) a%b

為了方便也有直接將直接給值的

加1 a++ 減一 a–
加n a += n 減n a -= n
乘n a *= n 除n a /= n

if後的小括弧裡是條件句,符合才會執行大括弧內的程式,當大括弧內的程式只有一行時可以省略大括弧直接空一格後結尾加分號

else是往上找最近的if如果那個條件不符合則執行else內的內容

在此提供程式裡的比較運算子,一次只能用一個運算子例如 (0<x<1)是錯的 (0<x && x<1)才是對的

小於 < 小於等於 <=
大於 > 等於 ==
大於等於 >= 不等於 !=
and (連結兩個比較) && or (連結兩個比較) ||

⊗練習: Zerojudge[d066][d065][d064][d483][d827][a053] Green Judge[a004~a020]

3.迴圈&陣列

以下為範例程式:

上面程式的功能是將所有輸入的數字減一後倒著輸出

a[10]就是一個長度為10的陣列,陣列很像一個表格,a[10]則是一維的,但如果是c[5][5]則是5×5的二維表格

假設我們在範例程式輸入1 5 43 54 351 35 43 21 87 46陣列則會長成下列的模樣

第幾格(方括號內的數字) 0 1 2 3 4 5 6 7 8 9
1 5 43 54 351 35 43 21 87 46

whileif很像但是while是重複大括弧裡的程式直到小括弧裡的條件不符合為止

for的用法是for(初始值; 條件; 改變),

同常我們在for裡習慣變數習慣使用 i ,當i用過時就換 j 以此類推…

在C++裡可以在小括弧內宣告 i 變成for(int i=10;i>0;i),C裡則是要先宣告

←For流程圖May

在迴圈裡可以加continue;break;,前這代表直接跳過以下的程式直接進入下一個迴圈,後者則是代表跳過此迴圈

字元陣列是當需要輸入不只一個字時用的,範例: 1. scanf(“%s”,a); 2.gets(a);

scanf跟gets的差別在於scanf碰到空格就會停,但是gets不會

⊗練習: Zerojudge[a001][a007][a005][a147][a015] Green Judge[a021~a050]

4.函式&排序演算法

以下為範例程式:

在這個範例程式裡intvoid後面接小括號及大括號的就是函式

在第3行內int的陣列是全域變數也就是所有函式都可以存取的

在第61行main裡的int則是區域變數,只有main可以存取區域變數在每個函式裡都可以用相同的名稱宣告,但是值還是不會影響

int main裡呼叫函式(函式名稱加小括號)後,程式就會往上找函式,並執行函式內的程式

小括號內的是要傳送給函式的值

函式的開頭只要是型態就好,代表回傳值的型態,void則是沒有回傳值

在這裡你可以很明顯的看到函式若要傳送多個值就要寫變數形態多次,因為形態可能不一樣

排序演算法(sort)是指將陣列內的內容有規律的排序,常見的排序法除了暴力破解法選擇排序法氣泡排序法插入排序法之外還有快速排序法但現在先不教,因為需要先學會二分搜尋法
暴力破解法 – 每個數字試一次,看看陣列裡有沒有
選擇排序法 – 找未排序數列裡最小的,並將數字與應到位置交換,重複n次
8 6 4 2 5
2 6 4 8 5
2 4 6 8 5
2 4 5 6 8
氣泡排序法 – 從後到前,一次比較兩個元素,將前後兩的數字比較後依大小交換位置,重複n次
8 6 4 2 5
2 8 6 4 5
2 4 8 6 5
2 4 5 8 6
2 4 5 6 8
插入排序法 – 從前到後,將數字與之前的數字比較並放入適合的位置,需大量的移動陣列
8 6 4 2 5
6 8 4 2 5
4 6 8 2 5
2 4 6 8 5
2 4 5 6 8

最後在這裡提供一些比較常用的標頭檔(如果你忘了可以看程式基本架構&輸入與輸出)及函式
<stdlib.h>

abs(任意數字形態) – 求絕對值
atoi(字元陣列)- 將字元陣列轉為整數
exit(0) – 結束程式
system(字元陣列)- 執行系統指令
<string.h>
strcpy(字串1,字串2) – 將字串2複製到字串1
strcmp(字串1,字串2) – 比較字串1及字串2,若1大於2回傳>0,若一樣回傳0,若1小於2回傳<0
strlen(字串) – 計算字串長度
<math.h>
sqrt(任意數字形態) – 求平方根
cbrt(任意數字形態) – 求立方根
pow(任意數字形態1,任意數字形態2) – 求次方數字1個數字2次方
log10(任意數字形態) – 求以10為底的對數
<ctype.h>
toupper(單一字元) – 將小寫字母轉換成大寫
tolower(單一字元) – 將大寫字母轉換成小寫