檢視 課程:程式設計 的原始碼
←
課程:程式設計
前往:
導覽
,
搜尋
由於下列原因,您沒有權限進行 編輯此頁面 的動作:
您請求的操作只有這個群組的使用者能使用:
管理員
您可以檢視並複製此頁面的原始碼。
*成績冊 [http://sdrv.ms/1dUP536 夜資一甲] *學習單 [http://sdrv.ms/17ZVuG9 學習單] *101學年期中考學科卷含答案:[http://sdrv.ms/ZJDmMP A卷] [http://sdrv.ms/ZJDuMc B卷] *[http://sdrv.ms/W5lc99 課程投影片] *[http://192.192.246.204/programming 原課程網址(參考)] *[http://www.facebook.com/groups/197032730335781 程式設計課程臉書社團] =課程大綱= 電腦被廣泛地應用在各行各業,從科學、商業、個人、學習等都可看到各式各樣的程式(在行動裝置上的程式被稱作App),學習程式撰寫在於學習程式語言工具如何被用來解決各領域的問題,本章列出所有的問題,分析問題,並且告知可用何種程式語言元素來解決,透過連結來存取解決問題所需程式元素的說明,建立起該程式元素的應用技巧與知識。 ==課程簡介== 使學生熟悉結構化之程式語言並學習設計C++程式之過程以建立C++程式設計之能力。 ==教學目標== #熟悉結構化之程式語言 #學習設計程式之過程 #建立程式設計之能力 #培養學生操作電腦之能力 #利於學生獲得相關證照之取得 #增加學生對程式設計之興趣 #激發學生利用程式設計之能力輔助日後相關課程之學習 ==指定書目== 快速掌握C++程式設計, 文淵閣工作室編著, 文魁行銷股份有限公司, ISBN-13:978-986-620-612-2 。 ==參考書目/資料== 程式設計電腦輔助學習教材(上網學習) ==教學進度== 第 1 週 (02/19-02/24) 學期進度說明、評分方式,前學期課程回顧 第 2 週 (02/25-03/03) 變數型態及範圍 第 3 週 (03/04-03/10) 指標變數與傳址呼叫 第 4 週 (03/11-03/17) 遞迴 第 5 週 (03/18-03/24) 結構與同位-1 第 6 週 (03/25-03/31) 結構與同位-2 第 7 週 (04/01-04/07) 檔案輸入與輸出-1 [http://sdrv.ms/YTIw8u 指定作業] 第 8 週 (04/08-04/14) 檔案輸入與輸出-2 第 9 週 (04/15-04/21) 期中考試(筆試與上機考試) 第10週 (04/22-04/28) 檔案輸入與輸出-3 第11週 (04/29-05/05) 檔案輸入與輸出-4 第12週 (05/06-05/12) 應用程式設計-成績檔輸入、統計、報表、成績檔輸出 第13週 (05/13-05/19) 應用程式設計-成績檔輸入、統計、報表、成績檔輸出 第14週 (05/20-05/26) 物件導向程式設計基礎-類別與物件 第15週 (05/27-06/02) 物件導向程式設計基礎-類別與物件 第16週 (06/03-06/09) 物件導向程式設計基礎-繼承 第17週 (06/10-06/16) 物件導向程式設計基礎-多重繼承 第18週 (06/17-06/23) 期末考試(包括筆試與上機考試) ==評分方法== *平常成績 30% (到課率、作業、小考等) *期中考 30% *期末考 40% =程式問題解決中心 (Problem Solving Center)= ==基本與數學問題== ===二數比大小(易)=== 問題:二個數,要如何找出其中的大值與小值 做法:設max為大值,min為小值 <source lang='c'> //找大值 if (a > b) max = a; else max = b; //找小值 if (a > b) min = b; else min = a; </source> ===三數比大小(易)=== 問題:三個數,要如何找出其中的大值與小值 做法:設max為大值,min為小值,先將a指定給max與min… <source lang='c'> max = a; min = b; if (b > max) max = b; if (c > max) max = c; if (b < min) min = b; if (c < min) min = c; </source> ===三數由小到大印出(易)=== 做法:延續上題,設max為大值,min為小值,先將a指定給max與min…,取得max與min值後,中間值=三數相加-(max+min) 註:比較正規的做法是先將數字排序,再依序印出數值。 <source lang='c'> max = a; min = b; if (b > max) max = b; if (c > max) max = c; if (b < min) min = b; if (c < min) min = c; cout << "數值由小到大為 " << min << "," << (a+b+c) - (min+max) << "," << max << endl; </source> ===進位的轉換(中)=== 做法: 進位間的轉換用簡單的除法即可以得出(長除法),將要轉換的數值不斷地除以基底數,<br> 直到最後的商小於基底數,結果就是最後的商+最後的餘數+最後第二次的餘數+…+第一次的餘數,<br> 若是把除的過程中的餘數輸出,結果剛好是相反的,因此,我們將餘數先放到一個陣列中,<br> 整個除完後,最後的商放入陣列,再用一個迴圈將此陣列的值從右到左的方式印出。<br> <source lang='c'> #include <iostream> #include <fstream> using namespace std; void main(void){ char hex[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; int num; cout << "請輸入一數:" ; cin >> num; int base; cout << "請輸入進位數(2, 8, 16):" ; cin >> base; int r; int output[100]; int counter = 0; while (num >= base) { r = num % base; //取餘數 output[counter++] = r; num = num / base;//取商數 } output[counter] = num; while (counter >= 0) cout << hex[ output[counter--] ]; system("pause"); } </source> ===因數的判斷(易)=== 問題:求一數f是否為某數N的因數,也就是說,f是否能整除N。 做法:整除的判斷即檢查N被f除後,餘數是否為0。在C/C++中,求餘數的運算子為%。 程式範例解答 <source lang='c'> #include <iostream> using namespace std; void main(){ float f, N; cout<<"請輸入N(被除數)與f(除數)" cin>>f >> n; if(N%f == 0){ cout<< cout << f << "可整除" << N << endl; } system("pause"); } </source> ===閏年的判斷(易)=== 問題:公元年哪時候二月會閏月? 做法:判斷y是否被400整除,可以被4整除不被100整除。 程式範例解答 <source lang='c'> #include <iostream> using namespace std; void main(){ int year; cout<<"請輸入年份" cin>>year; if(year%=400==0)||(year%4==0&&year%100!=0){ cout<< "西元" << year << "年是閏年" << endl; } else{ cout<< "西元" << year << "年是閏年" << endl; } system("pause"); } </source> ===質數的判斷(中)=== 問題:一數N若為質數,N的因數僅有1與本身數N,也就是說若2~(N-1)中有N之因數(可整除N),那麼N即不是質數。 做法: 1.使用一個布林變數isPrime,初值為true(此布林變數表示N是否為質數,程式一開始先認定N為質數) (迴圈開始) 2.使用一迴圈敘述,使用迭代變數i,下限值為2,上限值為N-1,若i可整除N,設定isPrime為false,跳出迴圈 (迴圈結束) 3.判斷isPrime為true輸出N為"質數",否則,輸出輸出N為"不是質數"。 程式範例解答 <source lang='c' toolbar:false gutter:false> #include <iostream> using namespace std; void main(){ int N = 11; int i = 2; bool isPrime = true; while (i <= N-1 && isPrime){ if (N % i == 0) { isPrime = false; break; } i++; } if (isPrime){ cout << "是質數"; } else { cout << "不是質數"; } system("pause"); } </source> ===質因數(中+)=== 問題:印出一數N的質因數 做法: 判斷2~(N-1)是否為N的因數,並且是否為質數 程式範例解答 <source lang='c' toolbar:false gutter:false> #include <iostream> using namespace std; void main(void){ int n; cout<<"請輸入"; cin>>n; for(int i=2;i<= n-1;i++ ){ if(n%i==0){ bool Isprime=true; for(int j=2;j<=i-1&& Isprime;j++){ if(i%j==0){ Isprime=false; break; } } if (Isprime){ cout<<i<<endl; } } } system("pause"); } </source> ===求一數的次方(易/中)=== 問題:n的p次方 = 將n自乘p次。 迴圈解步驟: #宣告一浮點數 powerOfn = 1 #使用一個迴圈跑p次,powerOfn = powerOfn*n; (若p為負數,取其絕對值,也就是將p乘-1,可用stdlib裏的abs函式) #若p是負數,則powerOfn = 1/powerOfn; #印出powerOfn 遞迴解 ‧ 請看下面程式範例解答,追蹤一次。(請參考用遞迴做到迴圈效果的說明。) 程式範例解答 <source lang='c'> #include <cstdlib> #include <iostream> #include <stdlib.h> //為了使用abs取絕對值函式 using namespace std; float base_power(float b,int p){ if(p==0) return 1; else if (p>0) return base_power(b,p-1)*b; else return base_power(b,p+1)/b; } float bp(float b, int p){ float r=1.0; for (int i = 1; i <= abs(p); i++) r *= b; if (p < 0) r = 1/r; return r; } void main(int argc, char *argv[]){ int base,power,result; cout<<"請輸入base值"; cin>>base; cout<<"請輸入power值"; cin>>power; cout << base_power(base, power); system("PAUSE"); } </source> ===完全數(中)=== ===公因數(中)=== ===公倍數(中)=== ===費式級數(中)=== ===九九乘法表 - 一般迴圈解與遞迴解(中)=== <source lang='c'> #include <iostream> #include <iomanip> using namespace std; /* 注意:下面遞迴用法,若是先遞回後印,則為遞增,若是先印後遞回,則為遞減 */ void LoopJ1(int j, int i, int min){ if (j > min) LoopJ1(j-1, i, min); cout << i << "*" << j << "=" << setw(2) << i*j<< " "; } void LoopI1(int i, int min){ if (i > min) LoopI1(i-1, min); LoopJ1(9, i, min); cout << endl; } void LoopJ2(int j, int i, int min){ cout << i << "*" << j << "=" << setw(2) << i*j<< " "; if (j > min) LoopJ2(j-1, i, min); } void LoopI2(int i, int min){ LoopJ2(9, i, min); cout << endl; if (i > min) LoopI2(i-1, min); } void main(void){ cout << "迴圈遞增示範:"<< endl; for (int i = 1; i <= 9; i++){ for (int j=1; j <= 9; j++){ cout << i << "*" << j << "=" << setw(2) << i*j<< " "; } cout << endl; } cout << "遞迴遞增示範:"<< endl; LoopI1(9,1); cout << "迴圈遞減示範:"<< endl; for (int i = 9; i >= 1; i--){ for (int j=9; j >= 1; j--){ cout << i << "*" << j << "=" << setw(2) << i*j<< " "; } cout << endl; } cout << "遞迴遞減示範:"<< endl; LoopI2(9,1); system("pause"); } </source> *練習,將下列進位轉換程式以遞迴方式改寫迴圈敘述。 <source lang='c'> void main(void){ char hex[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; int num; cout << "請輸入一數:" ; cin >> num; int base; cout << "請輸入進位數(2, 8, 16):" ; cin >> base; int r; int output[100]; int counter = 0; while (num >= base) { r = num % base; //取餘數 output[counter++] = r; num = num / base;//取商數 } output[counter] = num; while (counter >= 0) cout << hex[ output[counter--] ]; system("pause"); } </source> ===魔方陣(中++)=== ===巴斯卡三角形(中++)=== <source lang='c'> void main(void){ int M[50][100] = {0}; int r,c; cout << "請輸入巴斯卡三角形的列數:"; cin >> r; c = 2*r - 1; M[0][c/2] = 1; for (int rl = 1; rl < r; rl++) { for (int cl = 0; cl < c; cl++) { M[rl][cl] = M[(rl-1+r)%r][(cl-1+c)%c] + M[(rl-1+r)%r][(cl+1)%c]; //元素的值為其左上角元素與右上角元素的和 } } //底下輸出陣列 for (int rl = 0; rl < r; rl++) { for (int cl = 0; cl < c; cl++) { if (M[rl][cl] == 0) cout << " " << " "; else cout << M[rl][cl] << " "; } cout << endl; } //以上輸出在超過2位數以上的時候,就無法對齊,請使用setw來固定輸出寬度(自己完成) system("pause"); } </source> ===河內塔(難)=== ==字串操作== ===長度計算=== ===尋找字元=== ===字串串接=== ===取子字串=== ===字串反轉=== <source lang='c'> #include <iostream> #include "stdio.h" using namespace std; int main() { char input[80]; cout << "Input a string: "; cin >> input; int strLength = 0; while (input[strLength++] != '\0') ; cout << "The reversed input string is : "; for (int i = strLength - 2; i >= 0; i--){ cout << input[i]; } cout << endl; } </source> ===字元出現次數統計=== ==資料分級== ===分數分級(易)=== 問題:將分數依 A:100~90 B:80~89 C:70~79 D:60~69 E:0~59 分等級<br> 做法有以下幾種:<br> 用if<br> 用switch<br> 用switch+除以10<br> 用除以10+陣列解(最漂亮,一行的程式就解決問題!)<br> 1. <source lang='c'> //score為分數變數,浮點數,grade為等級變數,字元 if (score <= 100 && score >= 90) grade = 'A'; if (score <= 89 && score >= 80) grade = 'B'; if (score <= 79 && score >= 70) grade = 'C'; if (score <= 69 && score >= 60) grade = 'D'; if (score <= 59) grade = 'E'; </source> 2. ===溫度=== ===風速=== ==資料排序== ===氣泡排序法=== ===插入排序法=== ==資料統計== ===成績總分=== ===成績報表=== ===銷售/生產統計=== ===銷售/生產報表=== ==商業應用== ===找零程式=== ===各式時刻表=== 題目一:弘光巴士發車時刻表 h、m:表開始發車的時與分 step:表發車間隔 *迴圈解法: <source lang='c'> #include <iostream> #include <iomanip> using namespace std; void main(){ int count=1, h=6, m=20, step=40; for(; h < 24; m+= step, count++){ if (m >= 60) { h ++; m -= 60; } cout << setw(2) << h << ":" << setw(2) << m << " "; if (count %4 ==0) cout << endl; } system("pause"); } </source> *遞回解法: <source lang='c'> #include <iostream> #include <iomanip> using namespace std; void loop(int count, int h, int m, int step){ cout << setw(2) << h << ":" << setw(2) << m << " "; if (count %4 ==0) cout << endl; m+=step; count++; if (m >= 60) { h ++; m -= 60; } if (h < 24) loop(count, h, m, step); } void main(){ int count=1, h=6, m=20, step=40; loop(count, h,m, step); cout << endl; system("pause"); } </source> ===月曆=== <source lang='c'> #include <iostream> #include "stdio.h" using namespace std; int calcWeekDay(int year, int month, int day){ //計算星期幾 int TempYear, TempMonth, i, j; if (month >= 3) { TempMonth = month - 2; TempYear = year; } else { TempMonth = month + 10; TempYear = year - 1; } j = TempYear + (int)(TempYear / 4) - (int)(TempYear / 100) + (int)(TempYear / 400) + (int)(2.6 * TempMonth - 0.2) + day; i = j - 7*(int)(j / 7) + 1; return i; } void printMonth(int year, int month){ int i = 0; int day = 1; //char* weekDayTitle[] = {"禮拜日", "禮拜一", "禮拜二", "禮拜三", "禮拜四", "禮拜五", "禮拜六"}; char* weekDayTitle[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; int monthDays[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (month == 2 && ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 !=0)))) { monthDays[2] = 29; } printf(" 西元 %d 年 %d 月\n", year, month); for (i = 0; i < 7; i++){ //印出 Sun Mon......... printf("%s ", weekDayTitle[i]); } printf("\n"); int weekDay = calcWeekDay(year, month, day); int nextLine = 0; nextLine = weekDay; for (i = 1; i < weekDay; i++){ printf(" "); } for (i = 1; i <= monthDays[month]; i++) { printf("%3d ", i); if (nextLine++ % 7 == 0) printf("\n"); } printf("\n"); } void main(void){ for (int month = 1; month <= 12; month++){ printMonth(2010, month); } } </source> ===檢查碼的計算與驗證-身份證為例=== <source lang='c'> #include <iostream> #include "stdio.h" #include "string.h" using namespace std; int main(void){ //A B C D E F G H I J K L M N O P Q R S T U V W X Y Z int letterNum[] = {10, 11, 12, 13, 14, 15, 16, 17, 34, 18, 19, 20, 21, 22, 35, 23, 24, 25, 26, 27, 28, 29, 32, 30, 31, 33}; char ID[80]; char* Message; cout << "Input an ID to check... "; cin >> ID; int ID_Length = strlen(ID); if (ID_Length != 10 || //身份證長度不是10的話… !((ID[0] >= 'a' && ID[9] <= 'z') || (ID[0] >= 'A' && ID[9] <= 'X')) || //第1個字元不是英文字母的話 !(ID[1] == '1' || ID[1] == '2')) //第2個字元不是1或2的話 { Message = "身份證輸入錯誤"; goto Exit; } for (int i = 2; i <= ID_Length - 1; i++){ if (ID[i] < '0' || ID[i] > '9'){ Message = "身份證輸入錯誤"; goto Exit; } } if (ID[0] >= 'a' && ID[0] <= 'z'){ ID[0] -= 32; } int checkIDNum = letterNum[ID[0]-'A']/10 + (letterNum[ID[0]-'A']%10 * 9); checkIDNum += (ID[1]-'0') * 8; for (int i = 7; i >= 1; i--){ checkIDNum += (ID[9-i]-'0') * i; } checkIDNum %= 10; if (checkIDNum == 0) checkIDNum = 0; else checkIDNum = 10 - checkIDNum; if (checkIDNum == (ID[9]-'0')) Message = "身份證字號正確"; else Message = "身份證字號錯誤"; Exit: cout << endl<< Message; } </source> ===成績報表=== =程式設計概念= ==電腦與程式== ==程式語言== ==程式執行環境== ==程式整合開發工具== =程式基礎= ==輸出入敘述== ==變數與資料型態== ==程式敘述與運算子== ==選擇與判斷敘述== ==重覆敘述== ==格式化輸出敘述== ==陣列== ==字元與字串== ==函式與公用函式(一)== =程式進階= ==函式-遞迴呼叫與公用函式(二)== ==指標與位址== ==指標與字串== ==字串的分割== <source> #include <iostream> using namespace std; //字串分割函式,不需要改,直接使用,使用方式請看主程式main char** str_split( char* str, char delim, int* numSplits ) { char** ret; int retLen; char* c; if ( ( str == NULL ) || ( delim == '\0' ) ) { /* Either of those will cause problems */ ret = NULL; retLen = -1; } else { retLen = 0; c = str; /* Pre-calculate number of elements */ do { if ( *c == delim ) { retLen++; } c++; } while ( *c != '\0' ); ret = (char **)malloc( ( retLen + 1 ) * sizeof( *ret ) ); ret[retLen] = NULL; c = str; retLen = 1; ret[0] = str; do { if ( *c == delim ) { ret[retLen++] = &c[1]; *c = '\0'; } c++; } while ( *c != '\0' ); } if ( numSplits != NULL ) { *numSplits = retLen; } return ret; } void main() { char* str = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC"; //要分割的字串 char* strCpy; //複製的字串指標 char** split; //分割出來的子字串陣列 int num; //分割出來的子字串數量 int i; strCpy = (char *)malloc( strlen( str ) * sizeof( *strCpy ) ); //配置記憶體空間,來複製str字串 strcpy( strCpy, str ); //複製字串str至strCpy split = str_split( strCpy, ',', &num ); //呼叫str_split函式,將strCpy字串以逗點分割,傳出分割好的子字串陣列 if ( split == NULL ) //如果字子字串陣列為空值(NULL) { cout << "字串分割傳回空值" ; } else { cout << num << "個結果:" << endl; for ( i = 0; i < num; i++ ) { cout << split[i] << endl; // 輸出每一個子字串陣列的字串 } } system("pause"); } </source> ==指標與二維陣列== {{template:程式設計:C++:檔案}} ==結構== =物件導向程式設計基礎= ==物件與類別== ==方法多載== ==繼承與覆寫== =程式觀念考題破解中心= {{程式觀念考題}}
此頁面使用了以下模板:
模板:程式觀念考題
(
檢視原始碼
)
模板:程式設計:C++:檔案
(
檢視原始碼
)
返回至
課程:程式設計
。
導覽選單
個人工具
登入
命名空間
頁面
討論
變體
檢視
閱讀
檢視原始碼
檢視歷史
更多
搜尋
導覽
首頁
基本資料
專案計劃
教授課程(本學期)
創意3D列印實務
程式設計
資料結構
WordPress
教授課程(所有)
資訊安全
科技英文
資料庫管理
管理專業英文
管理資訊系統
作業系統
專利與發明
程式設計
學生專題
網路概論
技術與學習
Delphi XE
3D印表機
SCJP考題
Arduino/pcDuino
Android
Linux/Unix
虛擬/雲端作業系統
網站功能
Wiki安裝設定筆記
隨機頁面
說明
工具
連結至此的頁面
相關變更
特殊頁面
頁面資訊