Presentation is loading. Please wait.

Presentation is loading. Please wait.

C/C++基礎程式設計班 程式撰寫與實例 講師:鄒尚軒, 8/8, 2013.

Similar presentations


Presentation on theme: "C/C++基礎程式設計班 程式撰寫與實例 講師:鄒尚軒, 8/8, 2013."— Presentation transcript:

1 C/C++基礎程式設計班 程式撰寫與實例 講師:鄒尚軒, 8/8, 2013

2 課程大綱 程式碼格式(Coding Style) 迴圈應用 陣列應用

3 程式碼格式(Coding Style) 程式碼的格式是撰寫程式最基本的元素 整齊有序的程式碼
讓自己看得懂,讓別人也看得懂 高可讀性(readability) 重要的是整齊的程式碼較容易抓出錯誤,也比較不 容易犯錯 俗話說:「人要衣裝,佛要金裝」,程式碼也要 請記得,如果未來會從事撰寫程式相關工作, 那閱讀你程式碼的人不只你一個

4 程式碼格式要點 區塊分明 縮排清楚

5 區塊分明-大 大區塊是指程式碼的基礎架構 下面範例是最基本的程式碼構成
#include <stdio.h> ->引入函式庫 int main() { >程式進入點 /* 變數宣告 */     /* 主要程式碼 */ return 0; >程式結束回傳0 }

6 區塊分明-中 一般來說,我們的程式會分成好幾個部分,各別處理一些事情, 如範例:
#include <stdio.h> #include <stdlib.h> #define STUDENT 3 int main() { int i; double sum = 0; int score[STUDENT]; // 分別讀入3個數值 for (i = 0; i < STUDENT; i++) { scanf("%d", &score[i]); } // 計算總和 for ( i = 0; i < STUDENT; i++) { sum+=score[i]; printf("average=%lf\n",sum/STUDENT); system("pause"); return 0; 這樣算兩個區塊, 區塊間可以空行或 註解分清楚各區塊 所負責的事情。

7 區塊分明-小 最小的區塊是指"{}"所構成的區域 { 和 } 對齊、對應
{ 或 } 所在的那行, 就不要有程式碼, 除非是 if {or for{ or while{ 這件事在程式超過螢幕 一頁之後就會顯得很重 要 for (...) { // 區塊1 // 區塊2 // 區塊3 } 很明顯的我們可以分出有三個不同的區塊 for (...) { }}} 這個如何?

8 縮排清楚 要點: 同一個區塊(同屬同一 對{}範圍)的程式碼, 縮排要一樣 縮排可用 tab 或是空 白,重點是每個距離 要一樣
#include<stdio.h> #include<stdlib.h> #define CLASS 2 #define STUDENT 2 #define SUBJECT 2 int main() { int i,j,k; int score[CLASS][STUDENT][SUBJECT]={20,30,40,50,60,70,80,90}; //分別輸出兩班各個數值 for(i=0;i<CLASS;i++){ printf("班級%d:\n",i+1); for(j=0;j<STUDENT;j++){ printf("學生%d:\n",j+1); for(k=0;k<SUBJECT;k++){ printf("第%d科:%d分\n",k+1,score[i][j][k]); } printf("\n"); system("pause"); return 0; 這是錯誤示範

9 課程大綱 程式碼格式(Coding Style) 迴圈應用 陣列應用

10 for 迴圈 用途:當程式需要來回重複執行某一段程式碼 時 語法: for通常用在已知重覆執行次數時。

11 while 迴圈 用途:當程式需要來回重複執行某一段程式碼時 語法: while通常用在未知重覆執行次數時。
把for中的進入迴圈前要做的事與每跑完一次迴圈會做 的事拿掉,就是while迴圈。 例如:for(; i < 40;) 等於 while(i<40)

12 範例一 讀取使用者輸入的整 數,直到使用者輸入 0結束,並算出平均。 #include <stdio.h>
#include <stdlib.h> int main() { int input, n; double sum; sum = 0; // 累計總和 n = 0; // 累計有多少數字 while (1) { scanf("%d", &input); if (input == 0) break; sum += input; n++; } printf("average: %lf\n", sum/n); system("pause"); return 0; 讀取使用者輸入的整 數,直到使用者輸入 0結束,並算出平均。

13 練習一 讀取使用者輸入的數字(假設不會大於一百萬), 直到使用者輸入0,輸出最小的數字 提示: 注意:第一次輸入的比較要注意
回憶昨天找最大分數的方法 每次輸入的時候都可以比較 注意:第一次輸入的比較要注意

14 如果你做完了… 使用者輸入n,印出第1~n項的費氏數列 費氏數列定義: f(1) = f(2) = 1
f(n) = f(n-1)+f(n-2), when n > 2

15 如果你覺得很無聊… 找出一個數列中,連續數字的最大和
使用者輸入一串連續整數,可為正負,直到輸 入零時結束,並輸出此串數列中,連續數字的 最大和,如果數字都小於0,最大和就為0 例如: ,最大和為 12 ,最大和為 1 ,最大和為 0

16 範例二 使用者輸入正奇數N, 計算等差數列 1+3+5+7+9+....N, 並輸出 1+3+5+...+N=多少
#include <stdio.h> #include <stdlib.h> int main() { int n, i, sum; scanf("%d", &n); sum = 0; // 累計總和 for (i = 1; i <= n; i+=2) { sum += i; if (i != 1) printf("+"); printf("%d", i); } printf("=%d\n", sum); system("pause"); return 0;

17 練習二 使用者輸入正整數N,計算階層 N! ,並輸出 1*2*3*...*N=多少 階層的定義: 注意:初始化!
如:3!=1*2*3=6 注意:初始化! 12! 就超過 int 範圍,所以不用擔心12!以後出現 奇怪的答案

18 練習三 雙重迴圈熱身題: 輸入 N 印出 N 列數字,第i列有i個數字,每列 間都是連續數字 輸入:5 輸出:

19 範例四 計算1~10000間的完 全數 完全數: 6有因數1, 2, 3, 6,除 去自己本身相加為自 己,1+2+3=6
#include <stdio.h> #include <stdlib.h> int main() { int n, i, j, sum; for (i = 1; i <= 10000; i++) { sum = 0; // 每計算一次都要重新歸零 // 只要算1~i-1,因為不包含本身 for (j = 1; j < i; j++) { if (i % j == 0) { // 整除代表j是因數 sum += j; } if (sum == i) printf("%d is perfect number.\n", i); system("pause"); return 0; 計算1~10000間的完 全數 完全數: 6有因數1, 2, 3, 6,除 去自己本身相加為自 己,1+2+3=6 28有因數1, 2, 4, 7, 14, 28,除去本身相 加, =28

20 練習四 使用者輸入正整數N,輸出N所有因數 現在你會找1~N之間的所有質數了嗎?

21 課程大綱 程式碼格式(Coding Style) 迴圈應用 陣列應用

22 一維陣列的宣告 用途:在記憶體中找出一塊連續的空間來存放 多個相同資料型態的內容 一維陣列宣告語法:資料型態 陣列名稱[長度]
int a[N]; N是一個不變的常數,不可為變數 位置由0~N-1,而不是1~N 位置: a a[0] a[1] a[2] a[N-1] N個欄位

23 一維陣列的宣告 宣告與初始化方式有很多種: 一旦宣告後,就無法再進行初始化! int a[10] = {0};
同上面的結果 int a[3] = {1}; 只有第一個會被設成1,後面都會初始化為0 int a[3] = {1, 2, 3, 4}; 編譯會過但程式會壞掉...... int a[]; compile error.... 一旦宣告後,就無法再進行初始化!

24 一維陣列的使用 在使用宣告好的陣列時,要使用一個陣列中的元素 可以表示成:陣列名稱[索引]。 範例:
「陣列名稱」則是用來表示一塊位置緊密相鄰的記憶體 空間的起始位址 「索引」的功能用來表示該陣列元素是在記憶體空間的 第幾號位置 範例: int a[3]; // 宣告陣列a有3個整數 a[0]=1; // 把a[0]設定為1 a[1]=2; // 把a[1]設定為2 a[2]=3; // 把a[2]設定為3 a[3]是不存在的,亂用會有恐怖的事情發生...

25 二維陣列的宣告 二維陣列宣告方式 資料型態 陣列名稱[長度1][長度2]; int a[M][N]; M、N 為整數常數,不可為變數
a[0][N-1] a[1][0] a[1][N-1] a[M-1][0] a[M-1][N-1] N個欄位 N個欄位 N個欄位 M*N個欄位

26 二維陣列的宣告 利用連續的記憶體空間我們可以: 製作行列的效果(矩陣) 模擬平面座標系(XY座標) 位置: a 第0列 第1列 第0行
第1行 第2行 y軸 a[0][0] (0, 0) a[0][1] (0, 1) a[0][2] (0, 2) a[1][0] (1, 0) a[1][1] (1, 1) a[1][2] (1, 2) x軸

27 二維陣列的宣告 宣告與初始化方式有很多種: 一旦宣告以後,就無法再進行初始化! int a[10] [10]= {0};
與一維不同,語法錯誤 int a[][3] = {1, 2, 3}; a只有1*3個位置(=a[1][3]),而三個各為1,2,3 int a[3][3] = {{1}}; 只有第一個會被設成1,後面都會初始化為0 一旦宣告以後,就無法再進行初始化!

28 範例五 使用者輸入N,假設 N最大為100,接下 來使用者輸入N個數 字,把這N個數字倒 著輸出來
#include <stdio.h> #include <stdlib.h> #define MAX 100 int main() { int i, n; int a[MAX] = {0}; scanf("%d", &n); // 讀入n // 讀進n個數字 for (i = 0; i < n; i++) scanf("%d", &a[i]); // 倒著印 for (i = n-1; i >= 0; i--) printf("%d ", a[i]); system("pause"); return 0; }

29 練習五 使用者輸入一個英文單字的長度N後,再輸入該 單字,並且倒著印出來 例如:
注意:抓取字元時,使用 scanf(" %c", ...); 有空白

30 範例六 情境:公館有三家青蛙撞奶,三家都只賣青蛙 撞奶和仙草撞奶 問題:讓使用者可以對各家的飲料評分,評分 後輸出結果

31 範例六 #include <stdio.h> #include <stdlib.h> #define SHOP 3
#define DRINK 2 int main() { int i, j; int score[SHOP][DRINK] = {0}; //讓使用者輸入評分 for (i = 0; i < SHOP; i++) { printf("店家%d:\n", i+1); for (j = 0; j < DRINK; j++) { printf("飲料%d幾分?", j+1); scanf("%d", &score[i][j]); } //輸出結果 printf("飲料%d:%2d分\n", j+1, score[i][j]); system("pause"); return 0;

32 練習六之一 延續範例六,把範例六改成輸出各店家飲料的 平均分數

33 練習六之二 延續範例六,把範例六改成輸出兩種飲料在所 有店家的平均分數

34 井字遊戲 1 2 3 4 5 6 7 8 9 兩名玩家依序分別輸入畫哪個格子,判斷哪個 玩家先獲勝,或是沒有人贏
例如:依序輸入 ,輸出玩家一獲勝 1 2 3 4 5 6 7 8 9

35 最後 記得交作業!明天晚上就是期限了! 作業輸入輸出請符合規定! 然後明天會出作業二! 有問題別害怕,快問吧!


Download ppt "C/C++基礎程式設計班 程式撰寫與實例 講師:鄒尚軒, 8/8, 2013."

Similar presentations


Ads by Google