###### tags: `school` # 🌈專二C語言 :::danger **C語言筆記(方便的函式、容器) :** https://hackmd.io/ypk7-J5tRTCi746YzR8WMQ ::: ## 三數比大小 (2020/09/28) ```cpp= #include <stdio.h> int main(void) { printf("Enter two integers,and I will tell you\n"); printf("the relationships they satisfy: \n"); int num1; int num2; int num3; scanf_s("%d %d %d", &num1, &num2, &num3); if (num1 >= num2 and num1 > num3) { printf("\n%d is greatest\n", num1); } if (num2 >= num3 and num2 > num1) { printf("\n%d is greatest\n", num2); } if (num3 >= num1 and num3 > num2) { printf("\n%d is greatest\n", num3); } if (num3 == num1 and num3 == num2) { printf("\n%d,%d,%d is equal\n", num1, num2, num3); } } ``` ## 算出平均分數(2020/09/28) ```cpp= #include <stdio.h> int main(void) { int a; float sum = 0; int i = 0; do { printf("輸入分數(負數停止輸入):\n"); scanf_s("%d", &a); if (a < 0) break; sum += a; i++; } while (1); printf("平均分數為:%f", sum / i); } ``` ## 請輸入Z值(2020/10/12) ```cpp= #include <iostream> #include <stdio.h> #include <math.h> int main() { printf("請輸入Z值:"); int Z; scanf_s("%d", &Z); double x; double y; double a=1; double b=3; double c=0; double positive=0; double negetive=0; if (Z==0) { printf("Error"); } else if (Z==1) { printf("pi=4.000000"); } else if (Z % 2 != 0 ) { for (x = 1; x <= (Z + 1) / 2; x++) { positive += (4 /a ); a += 4; } for (y = 1; y <= (Z - 1) / 2; y++) { negetive += (4 / b); b += 4; } c = positive - negetive; printf("pi=%f", c); } else { for (x = 1; x <= Z / 2; x++) { positive += (4 / a); a += 4; } for (y = 1; y <= Z / 2; y++) { negetive += (4 / b); b += 4; } c = positive - negetive; printf("pi=%f", c); } } ``` ## 本金利率本利和(2020/10/12) ```cpp= #include<iostream> #include<map> using namespace std; int main() { printf("輸入本金:"); double principal; scanf("%lf", &principal); printf("輸入利率(小數):"); double rate; scanf("%lf", &rate); printf("輸入目標:"); double goal; scanf("%lf", &goal); int year = 1; double total; for(total=principal;total<goal;) { total *= (1 + rate); printf("目前本利和:%lf\n",total); } } ``` ## 固定月額本利和(2020/10/19) ```cpp= #include <iostream> #include <stdio.h> int main() { printf("請輸入本金:"); double principal; scanf_s("%lf", &principal); printf("請輸入年利率(浮點數):"); double rate; scanf_s("%lf", &rate); double rate1 = rate / 12; printf("請輸入固定月額:"); double money; scanf_s("%lf", &money); printf("請輸入存款目標:"); double goal; scanf_s("%lf", &goal); double total; for (total = principal; total < goal;) { total=(total+money)* (1 + rate1); printf("本月複利本合為%lf\n", total); } } ``` ## 成績等第(2020/10/19) ```cpp= using namespace std; int main() { unsigned int acount = 0; unsigned int bcount = 0; unsigned int ccount = 0; unsigned int dcount = 0; unsigned int fcount = 0; printf("請輸入成績(負數停止輸入):\n"); int grade,leveal; while (true){ scanf("%d", &grade); if(grade<0) break; leveal = grade / 10; switch(leveal) { case 10: case 9: ++acount; break; case 8: ++bcount; break; case 7: ++ccount; break; case 6: ++dcount; break; case 5: case 4: case 3: case 2: case 1: case 0: ++fcount; break; default: printf("%d", "Incorrect letter grade entered.\n"); printf("Enter a new grade.\n"); break; } } printf("Totals for each letter grade are:\n"); printf("A:%u\n", acount); printf("B:%u\n", bcount); printf("C:%u\n", ccount); printf("D:%u\n", dcount); printf("F:%u\n", fcount); } ``` ## 輸入分數在全班的第 %d 名(2020/12/07) ```c= #include <iostream> #define SIZE 20 int scoCounter[101]; //計數器(計算成績出現次數) void bubbleSort(unsigned int a[], unsigned int b[]); void average(unsigned int av[]); int middle(int a, int b); int binarySearch(unsigned int sc[], int searchScore, int low, int high); int main() { //學號 unsigned int num[SIZE] = { 12,13,14,15,16,17,19,21,22,23, 24,26,27,28,29,31,32,33,36,37 }; //成績 unsigned int sco[SIZE] = { 66,67,66,70,73,74,75,75,62,32,44, 46,27,12,80,63,66,90,11,66 }; //平均 average(sco); puts(""); //氣泡排序 bubbleSort(sco,num); //二元搜尋法 int score; printf("輸入分數:"); scanf_s("%d", &score); int result=binarySearch(sco,score,0,SIZE-1); if (result != -1) { printf("學號:%d 分數:%d 在全班的第 %d 名\n",num[result] ,score, SIZE-result); } else { printf("找不到分數:%d\n", score); } } void average(unsigned int av[]) { float scoreSum = 0; for (int i = 0; i <= SIZE - 1; i++) { scoreSum += av[i]; } printf("學生總平均為%.2f\n", scoreSum / SIZE); } void bubbleSort(unsigned int a[], unsigned int b[]) { for (unsigned int pass = 1; pass < SIZE; ++pass) { for (int j = 0; j < SIZE - 1; ++j) { if (a[j] > a[j + 1]) { unsigned int scoHold = a[j]; a[j] = a[j + 1]; a[j + 1] = scoHold; unsigned int numHold = b[j]; b[j] = b[j + 1]; b[j + 1] = numHold; } } } printf("STUDENT SCORE\n"); for (int i = 0; i <= SIZE - 1; i++) { printf("%6u%13u\n", b[i], a[i]); } } int middle(int a, int b) { int m = (a + b) / 2; return m; } int binarySearch(unsigned int sc[], int searchScore, int low, int high) { while (low <= high) { int m = middle(low, high); //取得中位數 if (searchScore==sc[m]) { return m; } else if (searchScore < sc[m]) { high = m - 1; } else { low = m + 1; } } return -1; } // 執行程式: Ctrl + F5 或 [偵錯] > [啟動但不偵錯] 功能表 // 偵錯程式: F5 或 [偵錯] > [啟動偵錯] 功能表 // 開始使用的提示: // 1. 使用 [方案總管] 視窗,新增/管理檔案 // 2. 使用 [Team Explorer] 視窗,連線到原始檔控制 // 3. 使用 [輸出] 視窗,參閱組建輸出與其他訊息 // 4. 使用 [錯誤清單] 視窗,檢視錯誤 // 5. 前往 [專案] > [新增項目],建立新的程式碼檔案,或是前往 [專案] > [新增現有項目],將現有程式碼檔案新增至專案 // 6. 之後要再次開啟此專案時,請前往 [檔案] > [開啟] > [專案],然後選取 .sln 檔案 ``` ## 輸入想找的學號(成績表排列、中位數)(2020/12/07) ```c= // ConsoleApplication1.cpp : 此檔案包含 'main' 函式。程式會於該處開始執行及結束執行。 // #include <iostream> void bouble(int b[],int a[]); int binary(int b[], int key, int low, int high); int runk2(int b[], int key, int low, int high);//排名 void printArray(int a[]); #define SIZE 20 int main() { int n; int a[SIZE] = { 66,67,66,70,73,74,75,75,62,32, 44,46,27,12,80,63,66,90,11,66 };//分數2 int b[SIZE] = { 12,13,14,15,16,17,19,21,22,23, 24,26,27,28,29,31,32,33,36,37 };//學號2 int grade[SIZE] = { 66,67,66,70,73,74,75,75,62,32, 44,46,27,12,80,63,66,90,11,66 };//分數 int stu[SIZE] = { 12,13,14,15,16,17,19,21,22,23, 24,26,27,28,29,31,32,33,36,37 };//學號 //氣泡排序 bouble(b,a); //總分 int total = 0; for (int j = 0; j < SIZE; ++j) { total += a[j]; } printf("\n總共:%d人。\n總分為:%d分。\n平均:%.4f。\n中位數:%d。\n", SIZE, total, (double)total / SIZE, a[SIZE / 2]); //輸入學號 printf("輸入想找的學號:"); scanf_s("%d", &n); int ans = binary(stu, n, 0, 19);//學號 分數 int num = runk2(b, n, 0, 19);//排名 if (ans != -1) { printf("成績表:\n學號:%d。總分:%d。名次:%d。",stu[ans],grade[ans],20-num); } else { printf("沒找到。"); } } void bouble(int b[],int a[]) { for (int pass = 1; pass < SIZE; ++pass) { for (int j = 0; j < SIZE - 1; ++j) { if (a[j] > a[j + 1]) { int hold; hold = a[j]; a[j] = a[j + 1]; a[j + 1] = hold; int holdstu; holdstu = b[j]; b[j] = b[j + 1]; b[j + 1] = holdstu; } } } printf("學號(排列後:)"); printArray(b); printf("\n分數(排列後:)"); printArray(a); } int binary(int stu[], int key, int low, int high) //二元 { while (low <= high) { int middle = (low + high) / 2; if (key == stu[middle]) { return middle; } else if (key < stu[middle]) { high = middle - 1; } else { low = middle + 1; } } return -1; } int runk2(int b[], int key, int low, int high) //線性排列 { for (int i = low; i <= high; i++) { if (key == b[i]) { return i; } } } void printArray(int a[]) //陣列輸出 { for (int j = 0; j < SIZE; ++j) { if (j % 20 == 0) { puts(""); } printf("%2u ", a[j]); } } // 執行程式: Ctrl + F5 或 [偵錯] > [啟動但不偵錯] 功能表 // 偵錯程式: F5 或 [偵錯] > [啟動偵錯] 功能表 // 開始使用的提示: // 1. 使用 [方案總管] 視窗,新增/管理檔案 // 2. 使用 [Team Explorer] 視窗,連線到原始檔控制 // 3. 使用 [輸出] 視窗,參閱組建輸出與其他訊息 // 4. 使用 [錯誤清單] 視窗,檢視錯誤 // 5. 前往 [專案] > [新增項目],建立新的程式碼檔案,或是前往 [專案] > [新增現有項目],將現有程式碼檔案新增至專案 // 6. 之後要再次開啟此專案時,請前往 [檔案] > [開啟] > [專案],然後選取 .sln 檔案 ``` ## 成績表單......(2020/12/14) ```c= // 1214.cpp : 此檔案包含 'main' 函式。程式會於該處開始執行及結束執行。 // #include <iostream> #include<stdio.h> #define STUDENTS 10 #define EXAMS 4 double average(int set0fGrades[], int tests); void printArray(int grades[][EXAMS], int pupils, int tests); double mun(int set0fGrades[], int tests); int min(int grades[][EXAMS], int pupils, int tests); int max(int grades[][EXAMS], int pupils, int tests); int main(void) { int studentGrades[STUDENTS][EXAMS] = { {93,68}, {86,94}, {76,65}, {68,54}, {95,64}, {77,75}, {96,98}, {35,99}, {83,74}, {55,84} }; puts("The array is:"); for (int student = 0; student < STUDENTS; ++student) { //總分 studentGrades[student][2] = mun(studentGrades[student], 2); //平均 studentGrades[student][3] = average(studentGrades[student], 2); } //表單 printArray(studentGrades, STUDENTS, EXAMS); //最大最小平均值 printf("\n\nLOWEST grade:%d\nHIGGEST grade:%d\n", min(studentGrades, STUDENTS, 3), max(studentGrades, STUDENTS, 3)); } //副程式↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ //總分 double mun(int set0fGrades[], int tests) { int total = 0; for (int i = 0; i < 2; ++i) { total += set0fGrades[i]; } return total; } //平均值 double average(int set0fGrades[], int tests) { int total = 0; for (int i = 0; i < 2; ++i) { total += set0fGrades[i]; } return (double)total / tests; } //最小值 int min(int grades[][EXAMS], int pupils, int tests) { int low = 100; for (int i = 0; i < pupils; i++) { for (int j = 3; j <= tests; j++) { if (grades[i][j] < low) { low = grades[i][j]; } } } return low; } //最大值 int max(int grades[][EXAMS], int pupils, int tests) { int high = 0; for (int i = 0; i < pupils; i++) { for (int j = 3; j <= tests; j++) { if (grades[i][j] > high) { high = grades[i][j]; } } } return high; } //輸出表單 void printArray(int grades[][EXAMS], int pupils, int tests) { printf("%s", " [數學] [計概] [總分] [平均]"); for (int i = 0; i < pupils; ++i) { printf("\nstudentGrades[%u]", i); for (int j = 0; j < tests; ++j) { printf("%5d ", grades[i][j]); } } } // 執行程式: Ctrl + F5 或 [偵錯] > [啟動但不偵錯] 功能表 // 偵錯程式: F5 或 [偵錯] > [啟動偵錯] 功能表 // 開始使用的提示: // 1. 使用 [方案總管] 視窗,新增/管理檔案 // 2. 使用 [Team Explorer] 視窗,連線到原始檔控制 // 3. 使用 [輸出] 視窗,參閱組建輸出與其他訊息 // 4. 使用 [錯誤清單] 視窗,檢視錯誤 // 5. 前往 [專案] > [新增項目],建立新的程式碼檔案,或是前往 [專案] > [新增現有項目],將現有程式碼檔案新增至專案 // 6. 之後要再次開啟此專案時,請前往 [檔案] > [開啟] > [專案],然後選取 .sln 檔案 ``` ## 成績表單2(2020/12/28) ```c= // 1228.cpp : 此檔案包含 'main' 函式。程式會於該處開始執行及結束執行。 // #include <iostream> #include<stdio.h> #define SIZE 10 #define EXAM 4 void bubbleSort(char name[][20], int studentGrade[][EXAM]); void printArr(char name[][20],int studentGrade[][EXAM], bool isBeforeSort); void average(int studentGrade[][EXAM]); int mid(int studentGrade[][EXAM]); int search(int studentGrade[][EXAM], int key); void swap(int* element1Ptr, int* element2Ptr); void copy1(char* const s1, const char* const s2); void copy2(char* s1, const char* s2); int main() { const char *stu_name[SIZE] = {"Danny","Marry","Jimmy","Peter","Sue","John","Hearts","Diamans","Clubs","Spades"}; char stu1_name[10][20]; int studentGrade[SIZE][EXAM] = { {1,74,55,0},{2,56,88,0}, {3,84,11,0}, {4,88,52,0}, {5,100,100,0}, {6,0,0,0}, {7,51,81,0}, {8,74,14,0}, {9,77,55,0}, {10,97,68,0} }; int searchScore; for (int i = 0; i < SIZE; i++) copy1(stu1_name[i], stu_name[i]); printArr(stu1_name, studentGrade, true); average(studentGrade); bubbleSort(stu1_name,studentGrade); printArr(stu1_name,studentGrade, false); printf("\n\n請輸入平均成績:"); scanf_s("%d", &searchScore); int idx = search(studentGrade, searchScore); if (idx == -1) printf("\n Not Found"); else printf("學號:%d\n平均成績:%d\n名次:%d\n", studentGrade[idx][0], studentGrade[idx][3], SIZE - idx); } //中間值 int mid(int studentGrade[][EXAM]) { return studentGrade[SIZE / 2][3]; } //平均 void average(int studentGrade[][EXAM]) { for (int i = 0; i < SIZE; i++) { studentGrade[i][3] = (studentGrade[i][1] + studentGrade[i][2]) / 2; } } //搜索 int search(int studentGrade[][EXAM], int key) { int low = 0; int high = SIZE; int mid = (low + high) / 2; while (low <= high) { if (studentGrade[mid][3] == key) { return mid; } else if (studentGrade[mid][3] > key) { high = mid - 1; } else if (studentGrade[mid][3] < key) { low = mid + 1; } mid = (low + high) / 2; } return -1; } //氣泡排序 void bubbleSort(char name[][20], int studentGrade[][EXAM]) { char* temp; for (int pass = 1; pass < SIZE; ++pass) { for (int i = 0; i < SIZE - 1; ++i) { if (studentGrade[i][3] > studentGrade[i + 1][3]) { for (int j = 0; j < EXAM; j++) swap(&studentGrade[i][j], &studentGrade[i + 1][j]); temp = name[i]; copy1(temp, name[i + 1]); copy1(name[i], name[i + 1]); copy1(name[i], temp); } } } } //印出 void printArr(char name[][20], int studentGrade[][EXAM], bool isBeforeSort) { if (isBeforeSort) puts("\n排序前成績:\n"); else puts("\n排序後成績:\n"); printf("學號 "); for (int i = 0; i < SIZE; ++i) { printf("%4d ", studentGrade[i][0]); printf("%4s", name[i]); } puts("\n"); for (int j = 1; j < EXAM; j++) { if (!isBeforeSort || j != EXAM - 1) { if (j != EXAM - 1) printf("\n成績 "); else printf("平均 "); for (int i = 0; i < SIZE; ++i) { printf("%10d ", studentGrade[i][j]); } if (j == EXAM - 2) { puts(""); puts(""); } } } if (!isBeforeSort) { puts(""); printf("名次 "); for (int j = 0; j < SIZE; j++) { printf(" %7d ", SIZE - j); } puts(""); printf("\n\n中位數: %d\n", mid(studentGrade)); printf("最大平均: %d\n", studentGrade[SIZE - 1][3]); printf("最小平均: %d\n", studentGrade[0][3]); } } void swap(int* element1Ptr, int* element2Ptr) { int hold = *element1Ptr; *element1Ptr = *element2Ptr; *element2Ptr = hold; } void copy1(char* const s1, const char* const s2) { for (int i = 0; (s1[i] = s2[i]) != '\0'; ++i); } void copy2(char* s1, const char* s2) { for (; (*s1 = *s2) != '\0'; ++s1, ++s2); } // 執行程式: Ctrl + F5 或 [偵錯] > [啟動但不偵錯] 功能表 // 偵錯程式: F5 或 [偵錯] > [啟動偵錯] 功能表 // 開始使用的提示: // 1. 使用 [方案總管] 視窗,新增/管理檔案 // 2. 使用 [Team Explorer] 視窗,連線到原始檔控制 // 3. 使用 [輸出] 視窗,參閱組建輸出與其他訊息 // 4. 使用 [錯誤清單] 視窗,檢視錯誤 // 5. 前往 [專案] > [新增項目],建立新的程式碼檔案,或是前往 [專案] > [新增現有項目],將現有程式碼檔案新增至專案 // 6. 之後要再次開啟此專案時,請前往 [檔案] > [開啟] > [專案],然後選取 .sln 檔案 ``` ## 第一題 輸入學生成績 算平均 依遞增遞減排序(2021/3/8) ![](https://i.imgur.com/cO9Mfao.png) ```c++= #include <iostream > #include<stdio.h> #define SIZE 10 #define EXAM 4 void bubbleSort(char name[][20], int studentGrade[][EXAM], int(*compare)(int a, int b)); void printArr(char name[][20], int studentGrade[][EXAM], bool isBeforeSort); void average(int studentGrade[][EXAM]); void swap(int* element1Ptr, int* element2Ptr); void copy1(char* s1, const char* s2); //字串拷貝 int ascending(int a, int b); int descending(int a, int b); int main() { const char* stu_name[SIZE] = { "Danny","Mary","Jimmy","Peter","Sue","John","Hearts", "Diamonds","Clubs","Spades" }; char stu1_name[10][20]; int studentGrade[SIZE][EXAM] = { {1,74,55,0},{2,56,88,0}, {3,84,11,0}, {4,88,52,0}, {5,100,100,0}, {6,0,0,0}, {7,51,81,0}, {8,74,14,0}, {9,77,55,0}, {10,97,68,0} }; int searchScore; for (int i = 0; i < SIZE; i++) copy1(stu1_name[i], stu_name[i]); printArr(stu1_name, studentGrade, true); printf("\n"); average(studentGrade); printf("%s", "遞增順序排序\n"); bubbleSort(stu1_name, studentGrade, ascending); printArr(stu1_name, studentGrade, false); printf("\n"); printf("%s", "遞減順序排序\n"); bubbleSort(stu1_name, studentGrade, descending); printArr(stu1_name, studentGrade, false); } void copy1(char* s1, const char* s2) { for (; ((*s1 = *s2) != '\0'); ++s1, ++s2); } void average(int studentGrade[][EXAM]) { for (int i = 0; i < SIZE; i++) { studentGrade[i][3] = (studentGrade[i][1] + studentGrade[i][2]) / 2; } } void bubbleSort(char name[][20], int studentGrade[][EXAM], int(*compare)(int a, int b)) { char temp[20]; for (int pass = 1; pass < SIZE; ++pass) { for (int i = 0; i < SIZE - 1; ++i) { if ((*compare)(studentGrade[i][3], studentGrade[i + 1][3])) { for (int j = 0; j < EXAM; j++) swap(&studentGrade[i][j], &studentGrade[i + 1][j]); copy1(temp, name[i]); copy1(name[i], name[i + 1]); copy1(name[i + 1], temp); } } } } void printArr(char name[][20], int studentGrade[][EXAM], bool isBeforeSort) { if (isBeforeSort) { puts("\n排序前成績:\n"); printf("學號 姓名 國文 數學 \n"); for (int i = 0; i < SIZE; ++i) printf("%4d %8s %6d %6d \n", studentGrade[i][0], name[i], studentGrade[i][1], studentGrade[i][2]); } else { puts("\n排序後成績:\n"); printf("學號 姓名 國文 數學 平均 名次\n"); for (int i = 0; i < SIZE; ++i) printf("%4d %8s %6d %6d %6d %4d\n", studentGrade[i][0], name[i], studentGrade[i][1], studentGrade[i][2], studentGrade[i][3], i + 1); puts("\n"); puts(""); } } void swap(int* element1Ptr, int* element2Ptr) { int hold = *element1Ptr; *element1Ptr = *element2Ptr; *element2Ptr = hold; } int ascending(int a, int b) //確定元素是否按升序/順序排序不正常 { return b < a; // 如果b小於a則應該交換 } int descending(int a, int b) //確定元素是否按升序/順序排序不正常 { return b > a; //如果b大於a則應該交換 } ``` ## 第二題 算出有幾個 大寫 小寫 數字 (2021/3/8) ```c++= // 第二題.cpp : 此檔案包含 'main' 函式。程式會於該處開始執行及結束執行。 // #include <iostream> #include<stdio.h> #include<ctype.h> int upper(char *str); int lower(char*str); int num(char* str); int main(void) { int(*f[3])(char*) = { upper, lower, num }; char str[] = "abcDEFG000"; for (int c = 0; c <= 2; c++) { (*f[c])(str); } } int upper(char* str) { int size = strlen(str); //函式會回傳字串的長度,其中的"字串"是必要項目,即為要計算長度的 String。 int count = 0; for (int c = 0; c <= size; c++) { if (isupper(str[c])) { count++; } } printf("大寫有:%d個\n", count); return 0; } int lower(char* str) { int size = strlen(str); int count = 0; for (int c = 0; c <= size; c++) { if (islower(str[c])) { count++; } } printf("小寫有:%d個\n", count); return 0; } int num(char* str) { int size = strlen(str); int count = 0; for (int c = 0; c <= size; c++) { if (isdigit(str[c])) { count++; } } printf("數字:%d個\n", count); return 0; } /////////////////////// ``` ## 給兩個字串s1,s2找出重複出現次數並列印 (2021/3/15) ```c++= #include<stdio.h> #include<string.h> int main(void) { char s1[100] = ""; //長度限制 printf("輸入字串"); scanf_s("%s", s1, 100); printf("輸入要搜尋的字串"); char s2[100] = " "; scanf_s("%s", s2, 100); int c = 0; for (int i = 0; i < strlen(s1) - strlen(s2) + 1; i++) //+1往後找 { if(strncmp(s2,s1+i,strlen(s2)) == 0) { c++; } } printf("共 %d次",c); } ``` ## 印出字串中的浮點數(2021/3/15) ```c++= #include<stdlib.h> #include<stdio.h> #include<string.h> int main() { char s1[20] = "3.14 bubu 3.1415926"; const char* string = s1; char* stringPtr; double d = strtod(string, &stringPtr); printf("double value %.5f and the string \"%s\"\n", d, stringPtr); } ``` ## 學生成績改為結構陣列且大到小排序(需有排序 報表列副程式)(2021/3/15) ```c++= #include <iostream> #include<stdio.h> #define SIZE 10 #define EXAM 4 typedef struct student { char name[20]; int math; int computer; double average; }; typedef struct card Card; void bubbleSort(char name[][20], int studentGrade[][EXAM], int(*compare)(int a, int b)); void printArr(char name[][20], int studentGrade[][EXAM], bool isBeforeSort); void average(int studentGrade[][EXAM]); void swap(int* element1Ptr, int* element2Ptr); void copy1(char* s1, const char* s2); //字串拷貝 int ascending(int a, int b); int main() { Card deck[SIZE]; const char* stu_name[SIZE] = { "Danny","Mary","Jimmy","Peter","Sue","John","Hearts", "Diamonds","Clubs","Spades" }; char stu1_name[10][20]; int studentGrade[SIZE][EXAM] = { {1,74,55,0},{2,56,88,0}, {3,84,11,0}, {4,88,52,0}, {5,100,100,0}, {6,0,0,0}, {7,51,81,0}, {8,74,14,0}, {9,77,55,0}, {10,97,68,0} }; int searchScore; for (int i = 0; i < SIZE; i++) copy1(stu1_name[i], stu_name[i]); printArr(stu1_name, studentGrade, true); printf("\n"); average(studentGrade); printf("%s", "遞增順序排序\n"); bubbleSort(stu1_name, studentGrade, ascending); printArr(stu1_name, studentGrade, false); printf("\n"); } void copy1(char* s1, const char* s2) { for (; ((*s1 = *s2) != '\0'); ++s1, ++s2); } void average(int studentGrade[][EXAM]) { for (int i = 0; i < SIZE; i++) { studentGrade[i][3] = (studentGrade[i][1] + studentGrade[i][2]) / 2; } } void bubbleSort(char name[][20], int studentGrade[][EXAM], int(*compare)(int a, int b)) { char temp[20]; for (int pass = 1; pass < SIZE; ++pass) { for (int i = 0; i < SIZE - 1; ++i) { if ((*compare)(studentGrade[i][3], studentGrade[i + 1][3])) { for (int j = 0; j < EXAM; j++) swap(&studentGrade[i][j], &studentGrade[i + 1][j]); copy1(temp, name[i]); copy1(name[i], name[i + 1]); copy1(name[i + 1], temp); } } } } void printArr(char name[][20], int studentGrade[][EXAM], bool isBeforeSort) { if (isBeforeSort) { puts("\n排序前成績:\n"); printf("學號 姓名 國文 數學 \n"); for (int i = 0; i < SIZE; ++i) printf("%4d %8s %6d %6d \n", studentGrade[i][0], name[i], studentGrade[i][1], studentGrade[i][2]); } else { puts("\n排序後成績:\n"); printf("學號 姓名 國文 數學 平均 名次\n"); for (int i = 0; i < SIZE; ++i) printf("%4d %8s %6d %6d %6d %4d\n", studentGrade[i][0], name[i], studentGrade[i][1], studentGrade[i][2], studentGrade[i][3], i + 1); puts("\n"); puts(""); } } void swap(int* element1Ptr, int* element2Ptr) { int hold = *element1Ptr; *element1Ptr = *element2Ptr; *element2Ptr = hold; } int ascending(int a, int b) //確定元素是否按升序/順序排序不正常 { return b < a; // 如果b小於a則應該交換 } ``` ## 第一題 OR XOR AND (2021/3/29) ```c++= // ConsoleApplication1.cpp : 此檔案包含 'main' 函式。程式會於該處開始執行及結束執行。 // #include <stdio.h> void displayBits(unsigned int value); // prototype int main(void) { unsigned int x; unsigned int y; printf("%s", "Enter a nonnegative int: "); scanf_s("%u", &x); printf("%s", "Enter a nonnegative int: "); scanf_s("%u", &y); displayBits(x); displayBits(y); puts("and"); displayBits(x&y); puts("or"); displayBits(x | y); puts("xor"); displayBits(x ^ y); } void displayBits(unsigned int value) { unsigned int displayMask = 1 << 31; for (unsigned int c = 1; c <= 32; ++c) { putchar(value & displayMask ? '1' : '0'); value <<= 1; if (c % 8 == 0) { putchar(' '); } } putchar('\n'); } ``` ## 第二題 &數字換成二進位後 左移右移(2021/3/29) ```c++= #include<string.h> #include<stdio.h> void dis1(unsigned int value); void dis2(unsigned int value,unsigned int a,unsigned int b ); int main(void) { unsigned int x; printf("input number"); scanf_s("%d", &x); int a; printf("1 left 2 right"); scanf_s("%d", &a); int b; printf("how many step to move"); scanf_s("%d", &b); dis1(x); dis2(x, a, b); } void dis1(unsigned int value) { unsigned int displayMask = 1 << 31; printf("(原)%u", value); unsigned int c; for (c = 1; c <= 32; c++) { putchar(value & displayMask ? '1' : '0'); value <<= 1; if (c % 8 == 1) { putchar(' '); } } putchar('\n'); } void dis2(unsigned int value, unsigned int a, unsigned int b) { unsigned int displayMask = 1 << 31; printf("(後)%u", value); if (a == 1) { value = value << b; } else if (a == 2) { value = value >> b; } else { printf("error"); } unsigned int c; for (c = 1; c <= 32; c++) { putchar(value & displayMask ? '1' : '0'); value <<= 1; if (c % 8 == 1) { putchar(' '); } } putchar('\n'); } ``` ## 第三題(2021/3/29) ```c++= #include<stdio.h> #include <stdio.h> struct clientData { unsigned int StuNum; // 4 bytes char Name[20]; // 20 bytes float average; // 4 byte float , 8 bytes double }; void CreateBlankFile(void); void KeyInData(void); void OutputFile(void); int main(void) { FILE* cfPtr; errno_t err; // fopen_s int SelectFunction; // Open for read (will fail if file "crt_fopen_s.c" does not exist) printf("Select funtion (1:create blank file,2:Key in data, 3:Print file data, 0: Exit Program\n"); scanf_s("%d", &SelectFunction); printf("\n"); while (SelectFunction != 0) { if (SelectFunction == 1) CreateBlankFile(); if (SelectFunction == 2) KeyInData(); if (SelectFunction == 3) OutputFile(); printf("Select funtion (1:create blank file,2:Key in data, 3:Print file data, 0: Exit Program\n"); scanf_s("%d", &SelectFunction); printf("\n"); } } void CreateBlankFile(void) { FILE* cfPtr; errno_t err; // fopen_s if ((err = fopen_s(&cfPtr, "accounts.dat", "wb")) != 0) puts("File could not be opened."); else { struct clientData blankClient = { 0,"" , 0.0 }; for (unsigned int i = 1; i <= 100; ++i) { fwrite(&blankClient, sizeof(struct clientData), 1, cfPtr); //將一個為原組為計的區塊資料寫到檔案中 } fclose(cfPtr); } } void KeyInData(void) { FILE* cfPtr; errno_t err; // fopen_s if ((err = fopen_s(&cfPtr, "accounts.dat", "rb+")) != 0) { puts("File could not be opened."); } else { struct clientData client = { 0,"",0.0 }; printf("Enter student number (1 to 100, 0 to end input:)"); scanf_s("%d", &client.StuNum); while (client.StuNum != 0) { // printf("%s", "Enter lastname ,firstname,balance:"); printf("%s", "Enter Name: "); scanf_s("%s", client.Name, 20); printf("\n"); printf("%s", "Enter average: "); scanf_s("%f", &client.average); printf("\n"); fseek(cfPtr, (client.StuNum - 1) * sizeof(struct clientData), SEEK_SET); fwrite(&client, sizeof(struct clientData), 1, cfPtr); printf("%s", "Enter student number: "); scanf_s("%d", &client.StuNum); } fclose(cfPtr); } } void OutputFile(void) { FILE* cfPtr; errno_t err; if ((err = fopen_s(&cfPtr, "accounts.dat", "rb")) != 0) { puts("File could not be opened."); } else { printf("Student Number Name Average \n"); } while (!feof(cfPtr)) { struct clientData client = { 0,"",0.0 }; int result = fread(&client, sizeof(struct clientData), 1, cfPtr); if (result != 0) { printf("%10d%18s%15.3f\n", client.StuNum, client.Name, client.average); } } fclose(cfPtr); } ``` ## 2021年4月12號 共一題 ```c++= #include <stdio.h> #include <stdlib.h> // self-referential structure struct listNode { int data; struct listNode* nextPtr; // pointer to next node }; typedef struct mystu { int StuNum; int math; int computer; }student; typedef struct listNode ListNode; //; synonym for struct listNode typedef ListNode* ListNodePtr; // synonym for ListNode* // prototypes void insert(ListNodePtr* sPtr, int value); void printList(ListNodePtr currentPtr); int main(void) { ListNodePtr startPtr = NULL; // initially there are no nodes student mystu = { 0,0,0 }; // printf("%s", "? "); // unsigned int choice; // user's choice // scanf("%u", &choice); for (int i = 0; i < 5; i = i + 1) { printf("第%d個:\n", i + 1); printf("%s", "輸入學生學號"); scanf_s("\n%d", &mystu.StuNum); insert(&startPtr, mystu.StuNum); printf("%s", "輸入數學成績"); scanf_s("\n%d", &mystu.math); insert(&startPtr, mystu.math); printf("%s", "輸入計概成績"); scanf_s("\n%d", &mystu.computer); insert(&startPtr, mystu.computer); } printList(startPtr); puts("End of run."); } void insert(ListNodePtr* sPtr, int value) { ListNodePtr newPtr = (ListNodePtr)malloc(sizeof(ListNode)); if (newPtr != NULL) { // is space available newPtr->data = value; // place value in node newPtr->nextPtr = NULL; // node does not link to another node ListNodePtr previousPtr = NULL; ListNodePtr currentPtr = *sPtr; // loop to find the correct location in the list while (currentPtr != NULL && value > currentPtr->data) { previousPtr = currentPtr; // walk to ... currentPtr = currentPtr->nextPtr; // ... next node } // insert new node at beginning of list if (previousPtr == NULL) { newPtr->nextPtr = *sPtr; *sPtr = newPtr; } else { // insert new node between previousPtr and currentPtr previousPtr->nextPtr = newPtr; newPtr->nextPtr = currentPtr; } } else { printf("%d not inserted. No memory available.\n", value); } } // print the list void printList(ListNodePtr currentPtr) { // if list is empty puts("The list is:"); // while not the end of the list while (currentPtr != NULL) { printf("%d --> ", currentPtr->data); currentPtr = currentPtr->nextPtr; } puts("NULL\n"); } ``` ## 2021年4月26號 第九週 共一題 ```c++= #include <stdio.h> #include <stdlib.h> // self-referential structure struct listNode { int data; int math; int computer; struct listNode* nextPtr; // pointer to next node }; typedef struct listNode ListNode; //; synonym for struct listNode typedef ListNode* ListNodePtr; // synonym for ListNode* // prototypes void insert(ListNodePtr* sPtr, int value,int math,int computer); int datadelete(ListNodePtr* sPtr, int value); void printList(ListNodePtr currentPtr); int isEmpty(ListNodePtr sPtr); int main(void) { ListNodePtr startPtr = NULL; int item; int i, math, computer; for (int i = 0; i < 5; i = i + 1) { printf("第%d個:\n", i + 1); printf("%s", "輸入學生學號"); scanf_s("\n%d", &item); printf("%s", "輸入數學成績"); scanf_s("\n%d", &math); printf("%s", "輸入計概成績"); scanf_s("\n%d", &computer); insert(&startPtr, item,math, computer); } if (!isEmpty(startPtr)) { printf("%s", "Enter character to be deleted: "); scanf_s("\n%d", &item); if (datadelete(&startPtr, item)) { printf("%d deleted.\n", item); printList(startPtr); } else { printf("%d not found.\n\n", item); } } } void insert(ListNodePtr* sPtr, int value, int math, int computer) { ListNodePtr newPtr = (ListNodePtr)malloc(sizeof(listNode)); // create node if (newPtr != NULL) { // is space available newPtr->data = value; newPtr->math = math; newPtr->computer = computer;// place value in node newPtr->nextPtr = NULL; // node does not link to another node ListNodePtr previousPtr = NULL; ListNodePtr currentPtr = *sPtr; // loop to find the correct location in the list while (currentPtr != NULL && value > currentPtr->data) { previousPtr = currentPtr; // walk to ... currentPtr = currentPtr->nextPtr; // ... next node } // insert new node at beginning of list if (previousPtr == NULL) { newPtr->nextPtr = *sPtr; *sPtr = newPtr; } else { // insert new node between previousPtr and currentPtr previousPtr->nextPtr = newPtr; newPtr->nextPtr = currentPtr; } } else { printf("%c not inserted. No memory available.\n", value); } } int datadelete(ListNodePtr* sPtr, int value) { // delete first node if a match is found if (value == (*sPtr)->data) { ListNodePtr tempPtr = *sPtr; // hold onto node being removed *sPtr = (*sPtr)->nextPtr; // de-thread the node free(tempPtr); // free the de-threaded node return value; } else { ListNodePtr previousPtr = *sPtr; ListNodePtr currentPtr = (*sPtr)->nextPtr; // loop to find the correct location in the list while (currentPtr != NULL && currentPtr->data != value) { previousPtr = currentPtr; // walk to ... currentPtr = currentPtr->nextPtr; // ... next node } // delete node at currentPtr if (currentPtr != NULL) { ListNodePtr tempPtr = currentPtr; previousPtr->nextPtr = currentPtr->nextPtr; free(tempPtr); return value; } } return '\0'; } int isEmpty(ListNodePtr sPtr) { return sPtr == NULL; } // print the list void printList(ListNodePtr currentPtr) { // if list is empty puts("The list is:"); // while not the end of the list while (currentPtr != NULL) { printf("%d %d %d --> ", currentPtr->data,currentPtr->math,currentPtr->computer); currentPtr = currentPtr->nextPtr; } puts("NULL\n"); } //---------------------------------------------------------------------- // 0426.cpp : 此檔案包含 'main' 函式。程式會於該處開始執行及結束執行。 // #include <iostream> #include <stdlib.h> #include <stdio.h> struct stuData { unsigned int StuNum; int math, computer; struct stuData* nextPtr; }; typedef struct stuData StuData; typedef StuData* StuDataPtr; // prototypes void insert(StuDataPtr* sPtr, int value, int math, int computer); void printList(StuDataPtr currentPtr); int delete1(StuDataPtr* sPtr, int value); int main(void) { StuDataPtr startPtr = NULL; // initially there are no nodes int item; // char entered by user int i, math, computer; for (i = 0; i < 5; i++) { printf("%s", "Enter a ID: "); scanf_s("\n%d", &item); printf("%s", "Enter a math: "); scanf_s("\n%d", &math); printf("%s", "Enter a computer: "); scanf_s("\n%d", &computer); insert(&startPtr, item, math, computer); } printList(startPtr); printf("%s", "請輸入要刪除的學號 "); int a; scanf_s("%d", &a); if (delete1(&startPtr,a)) { printList(startPtr); } else { printf("%s", "無此學號"); } } // insert a new value into the list in sorted order void insert(StuDataPtr* sPtr, int value, int math, int computer) { StuDataPtr newPtr = (StuDataPtr)malloc(sizeof(StuData)); // create node if (newPtr != NULL) { // is space available newPtr->StuNum = value; newPtr->math = math; newPtr->computer = computer;// place value in node newPtr->nextPtr = NULL; // node does not link to another node StuDataPtr previousPtr = NULL; StuDataPtr currentPtr = *sPtr; // loop to find the correct location in the list while (currentPtr != NULL && value > currentPtr->StuNum) { previousPtr = currentPtr; // walk to ... currentPtr = currentPtr->nextPtr; // ... next node } // insert new node at beginning of list if (previousPtr == NULL) { newPtr->nextPtr = *sPtr; *sPtr = newPtr; } else { // insert new node between previousPtr and currentPtr previousPtr->nextPtr = newPtr; newPtr->nextPtr = currentPtr; } } else { printf("%c not inserted. No memory available.\n", value); } } // print the list int delete1(StuDataPtr* sPtr, int value) { // delete first node if a match is found if (value == (*sPtr)->StuNum) { StuDataPtr tempPtr = *sPtr; // hold onto node being removed *sPtr = (*sPtr)->nextPtr; // de-thread the node free(tempPtr); // free the de-threaded node return value; } else { StuDataPtr previousPtr = *sPtr; StuDataPtr currentPtr = (*sPtr)->nextPtr; // loop to find the correct location in the list while (currentPtr != NULL && currentPtr->StuNum != value) { previousPtr = currentPtr; // walk to ... currentPtr = currentPtr->nextPtr; // ... next node } // delete node at currentPtr if (currentPtr != NULL) { StuDataPtr tempPtr = currentPtr; previousPtr->nextPtr = currentPtr->nextPtr; free(tempPtr); return value; } } return '\0'; } void printList(StuDataPtr currentPtr) { // if list is empty if (currentPtr == NULL) { puts("List is empty.\n"); } else { puts("The list is:"); // while not the end of the list while (currentPtr != NULL) { printf("%d %d %d --> ", currentPtr->StuNum, currentPtr->math, currentPtr->computer); currentPtr = currentPtr->nextPtr; } puts("NULL\n"); } } // 執行程式: Ctrl + F5 或 [偵錯] > [啟動但不偵錯] 功能表 // 偵錯程式: F5 或 [偵錯] > [啟動偵錯] 功能表 // 開始使用的提示: // 1. 使用 [方案總管] 視窗,新增/管理檔案 // 2. 使用 [Team Explorer] 視窗,連線到原始檔控制 // 3. 使用 [輸出] 視窗,參閱組建輸出與其他訊息 // 4. 使用 [錯誤清單] 視窗,檢視錯誤 // 5. 前往 [專案] > [新增項目],建立新的程式碼檔案,或是前往 [專案] > [新增現有項目],將現有程式碼檔案新增至專案 // 6. 之後要再次開啟此專案時,請前往 [檔案] > [開啟] > [專案],然後選取 .sln 檔案 ``` ## 2021年5月3號 第十週 共一題 算正方體 長方體 圓柱體 體積 ```c++= // ConsoleApplication2.cpp : 此檔案包含 'main' 函式。程式會於該處開始執行及結束執行。 // #include <iostream> using namespace std; void squareByReference(int&); float cylinder(int&, int&); float volum( int&, int& ,int&); int main() { cout << "輸入邊長算正方體體積:"; int x; cin >> x; squareByReference(x); cout << "正方體體積: " << x << endl; cout << "\n"; int y = 0, radius = 0; cout << "輸入高算圓柱體體積:"; cin >> y; cout << "輸入半徑算圓柱體體積:"; cin >> radius; cout << "圓柱體體積:\n " << cylinder(y,radius)<< endl; cout << "\n"; cout << "輸入長邊算長方體體積:"; int a; cin >> a; cout << "輸入短邊算長方體體積:"; int b; cin >> b; cout << "輸入高算長方體體積:"; int c; cin >> c; cout << "長方體體積: " << volum(a,b,c) << endl; } void squareByReference(int& numberRef) { numberRef = numberRef* numberRef* numberRef; } float cylinder(int &height, int&radius) { return (float)height * 3.1415926 * radius * radius; } float volum(int& height, int& width, int& high) { return (float)height * width * high; } ## 2021年5月16號 第十三週 共一題 ```c++= // 多載的square函式.cpp : 此檔案包含 'main' 函式。程式會於該處開始執行及結束執行。 // #include <iostream> using namespace std; int volume(int& x) { return x = x * x * x; } float volume(int& a, int& b) { return (float)b * 3.1415926 * a * a; } float volume(int& a, int& b, int& c) { return (float)a * b * c; } int main() { int int1, int2, int3; cout << "輸入1個數算正方體體積\n輸入2個數算圓柱體體積\n輸入3個數算長方體體積\n "; cin >> int1; cout << "ans=" << volume(int1) << endl; cin >> int1 >> int2; cout << "ans=" << volume(int1, int2) << endl; cin >> int1 >> int2 >> int3; cout << "ans=" << volume(int1, int2, int3) << endl; } ``` ## 2021年5月24、31、6/7號 共三題 24 : https://terabox.com/s/1M796HsXVsf1UDsZf_KqQCw 31 : https://terabox.com/s/1T5ITQ5MT4_GWobvDAJ8ZYQ 07 : https://terabox.com/s/1R6d13z1HQWJQDFDoZf7o1g ## GradeBook輸入寵物名、年齡,判斷 link : https://replit.com/@LIANGcode/GradeBookShu-Ru-Chong-Wu-Ming-Nian-Ling-Pan-Duan#petset.cpp **main.cpp** ```C++= #include "pet.h" #include <iostream> using namespace std; int main() { string nameofPet; int ageofPet; string y; cout << "\n請輸入寵物名 : " << endl; getline(cin, nameofPet); GradeBook gradeBook1(nameofPet); cout << "請輸入寵物年齡:\n " << endl; cin >> ageofPet; GradeBook gradeBook2(ageofPet); cout << "\n輸入Y為印出列表:"; cin >> y; if (y != "Y") { cout << "取消\n"; } else { cout << "寵物名 :" << gradeBook1.getName() << "\n寵物年齡 " << gradeBook2.getAge() << endl; } } ``` **petset.cpp** ```c++= #include <iostream> #include "pet.h" using namespace std; GradeBook::GradeBook(string name) :Name(name) {} GradeBook::GradeBook(int age) :Age(age) {} void GradeBook::set(string name) { Name = name; } void GradeBook::set2(int age) { Age = age; } string GradeBook::getName()const { if (Name != " ") { return Name; } else { return("!!!請輸入姓名資料!!!"); } } int GradeBook::getAge() const { if (Age > 0 && Age <= 20) { return Age; } else { puts("!!!請輸入年齡範圍為1-20!!!"); } } ``` ## 06/07轉民國(上課) code link : https://replit.com/@LIANGcode/0607Zhuan-Min-Guo-Shang-Ke#main.cpp ## 17.6 西元轉民國(例外處理) code link : https://replit.com/@LIANGcode/176-Xi-Yuan-Zhuan-Min-Guo-Li-Wai-Chu-Li#main.cpp ## Date object destructor code link :https://replit.com/@LIANGcode/Date-object-destructor#main.cpp ## Date 期末考(輸入西元日期轉民國,解構子,加月份判斷) code link :https://replit.com/@LIANGcode/Date-Qi-Mo-Kao#main.cpp ## 期末考2 code link :https://replit.com/@LIANGcode/Qi-Mo-Kao-2#main.cpp