☆ C/C++中使用結構體陣列->排序(姓名+學號+分數)
使用單鏈表進行排序見上一篇文章,這兩篇文章相輔相承;
傳送門:點我即達(。・ω・。)
****************************************************************************************************************************************
★首先附上一系列執行結果截圖:
1:學生資訊的初始化
2:排序功能列表
——使用了system("cls") 和 gotoxy() 等函式;
3:排序介面-姓名
4:排序介面-學號
5:排序介面-分數
*檔案會被寫到同級目錄下的這四個檔案中,下面程式碼中也可以分析得出。
★原始碼:
★ 由於程式碼基於某些要求進行編寫,可能有些複雜,但是基本原理仍然未變,只是多了些表示方法;
// 學生排序(函式作為引數傳入).cpp : 定義控制檯應用程式的入口點。 // 需要使用檔案進行輸出 // 要求函式結構void student_sort(STUDENT *pStu, int n, int(*pFunc)(STUDENT &, STUDENT &)); #include <string.h> #include <iostream> //檔案的操作 #include <fstream> //呼叫Sleep()/system()函式 #include <windows.h> using namespace std; typedef struct stu { char name[20]; int id; float score; }STUDENT; STUDENT * Init_Stu( int number) { ofstream out("學生資訊.txt"); out << "姓名 學號 分數\n"; STUDENT *pStu = (STUDENT *)malloc(sizeof(STUDENT) * number); //開闢number個空間 cout << "Please Enter the stu'infomation: " << endl; cout << "姓名 學號 分數" << endl;; for (int i = 0; i < number; i++) { cin >> (pStu + i)->name; cin >> (pStu + i)->id; cin >> (pStu + i)->score; } cout << "\n開始寫入檔案" << endl; for (int i = 0; i < number; i++) { out << (pStu + i)->name << " "; out << (pStu + i)->id << " "; out << (pStu + i)->score << "\n"; } out.close(); cout << "……" << endl; Sleep(1000); cout << "……" << endl; Sleep(1000); cout << "檔案成功寫入!" << endl; cout << "檔名為“Student_by_name.txt”" << endl << endl; system("pause"); return pStu; } int pFunc_name(STUDENT *x, STUDENT *y) { if (strcmp(x->name, y->name) < 0) { return 0; } else { return 1; } } int pFunc_id(STUDENT *x, STUDENT *y) { if (x->id > y->id) { return 1; } else { return 0; } } int pFunc_score(STUDENT *x, STUDENT *y) { if (x->score > y->score) { return 1; } else { return 0; } } void gotoxy(short x, short y) //自定義游標定位 { COORD pos = {x,y}; HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOut, pos); } void student_sort_name(STUDENT *pStu, int n, int (*pFunc)(STUDENT *x, STUDENT *y)) { STUDENT *p; p = pStu; STUDENT *temp; temp = (STUDENT*)malloc(sizeof(STUDENT)); int k,j; //迴圈使用 for (int i = 1; i < n; i++) { p = pStu; for (j = n - 1, k = 0; j >= i; j--,k++) { if (pFunc_name((p+k), (p + k+1))) { strcpy(temp->name, (p + k)->name); strcpy((p + k)->name, (p + k+1)->name); strcpy((p + k + 1)->name,temp->name); p = pStu; temp->id = (p + k)->id; (p + k)->id = (p + k + 1)->id; (p + k + 1)->id = temp->id; p = pStu; temp->score = (p + k)->score; (p + k)->score = (p + k + 1)->score; (p + k + 1)->score = temp->score; } } } cout << "是否要將排序結果寫入檔案?(檔名為“Student_by_name.txt”)" << endl; for (int i = 0; i < n; i++) { cout << (pStu + i)->name << " "; cout << (pStu + i)->id << " "; cout << (pStu + i)->score << "\n"; } cout << "是否要將排序結果寫入檔案?(檔名為“Student_by_sno.txt”)" << endl; if (getchar() == 'y') { ofstream out("Student_by_name.txt"); cout << "\n開始寫入檔案" << endl; for (int i = 0; i < n; i++) { out << (pStu + i)->name << " "; out << (pStu + i)->id << " "; out << (pStu + i)->score << "\n"; } out.close(); cout << "……" << endl; Sleep(1000); cout << "……" << endl; Sleep(1000); cout << "檔案成功寫入!" << endl << endl; } else { cout << "感謝使用,Bye~" << endl; } } void student_sort_id(STUDENT *pStu, int n, int(*pFunc)(STUDENT *x, STUDENT *y)) { STUDENT *p; p = pStu; STUDENT *temp; temp = (STUDENT*)malloc(sizeof(STUDENT)); int k, j; //迴圈使用 for (int i = 1; i < n; i++) { p = pStu; for (j = n - 1, k = 0; j >= i; j--, k++) { if (pFunc_id((p + k), (p + k + 1))) { strcpy(temp->name, (p + k)->name); strcpy((p + k)->name, (p + k + 1)->name); strcpy((p + k + 1)->name, temp->name); p = pStu; temp->id = (p + k)->id; (p + k)->id = (p + k + 1)->id; (p + k + 1)->id = temp->id; p = pStu; temp->score = (p + k)->score; (p + k)->score = (p + k + 1)->score; (p + k + 1)->score = temp->score; } } } for (int i = 0; i < n; i++) { cout << (pStu + i)->name << " "; cout << (pStu + i)->id << " "; cout << (pStu + i)->score << "\n"; } cout << "是否要將排序結果寫入檔案?(檔名為“Student_by_sno.txt”)" << endl; if (getchar() == 'y') { ofstream out ("Student_by_sno.txt"); cout << "\n開始寫入檔案" << endl; for (int i = 0; i < n; i++) { out << (pStu + i)->name << " "; out << (pStu + i)->id << " "; out << (pStu + i)->score << "\n"; } out.close(); cout << "……" << endl; Sleep(1000); cout << "……" << endl; Sleep(1000); cout << "檔案成功寫入!" << endl << endl; } else { cout << "感謝使用,Bye~" << endl; } } void student_sort_score(STUDENT *pStu, int n, int(*pFunc)(STUDENT *x, STUDENT *y)) { STUDENT *p; p = pStu; STUDENT *temp; temp = (STUDENT*)malloc(sizeof(STUDENT)); int k, j; //迴圈使用 for (int i = 1; i < n; i++) { p = pStu; for (j = n - 1, k = 0; j >= i; j--, k++) { if (pFunc_score((p + k), (p + k + 1))) { strcpy(temp->name, (p + k)->name); strcpy((p + k)->name, (p + k + 1)->name); strcpy((p + k + 1)->name, temp->name); p = pStu; temp->id = (p + k)->id; (p + k)->id = (p + k + 1)->id; (p + k + 1)->id = temp->id; p = pStu; temp->score = (p + k)->score; (p + k)->score = (p + k + 1)->score; (p + k + 1)->score = temp->score; } } } cout << "是否要將排序結果寫入檔案?(檔名為“Student_by_score.txt”)" << endl; for (int i = 0; i < n; i++) { cout << (pStu + i)->name << " "; cout << (pStu + i)->id << " "; cout << (pStu + i)->score << "\n"; } cout << "是否要將排序結果寫入檔案?(檔名為“Student_by_sno.txt”)" << endl; if (getchar() == 'y') { ofstream out("Student_by_score.txt"); cout << "\n開始寫入檔案" << endl; for (int i = 0; i < n; i++) { out << (pStu + i)->name << " "; out << (pStu + i)->id << " "; out << (pStu + i)->score << "\n"; } out.close(); cout << "……" << endl; Sleep(1000); cout << "……" << endl; Sleep(1000); cout << "檔案成功寫入!" << endl << endl; } else { cout << "感謝使用,Bye~" << endl; } } void run(STUDENT *pStu,int number) { system("title 學生資訊排序"); gotoxy(35, 2); cout << "★功能列表★"; gotoxy(30, 3); cout << "1: 按照學生姓名排序"; gotoxy(30, 4); cout << "2:按照學生學號排序"; gotoxy(30, 5); cout << "3:按照學生分數排序"; gotoxy(0, 12); int choice = 0; cout << "★請輸入您要執行的功能:"; cin >> choice; getchar(); //吸收回車 switch (choice) { case 1: student_sort_name(pStu, number, pFunc_name); break; case 2: student_sort_id(pStu, number, pFunc_id); break; case 3: student_sort_score(pStu, number, pFunc_score); break; default: cout << "選擇失敗,感謝使用,再見!" << endl << endl; } } int main() { cout << "***學生資訊的初始化***" << endl; STUDENT * pStu; int number; cout << "How many people? " << endl; cin >> number; pStu = Init_Stu(number); system("cls"); run(pStu,number); return 0; }
*附加:
其實上面的執行結果排序的那幾張圖片還是有一些問題的,細心觀察就會發現,好好我及時發現了這些問題,並在程式碼中進行了相應的修改。
問題來源:
交換的只是結構體中指定的兩個資料,而不能保證在該結構體的其他資料一併交換,故我在每一段交換的程式碼中將其他資料也一併進行了交換。
(執行結果圖片並未做修改~)
☆僅僅記錄日常編寫程式碼 與 疑問(`・ω・´)
****************************************************************************************************************************************
最快的腳步不是跨越,而是繼續,最慢的步伐不是小步,而是徘徊。
****************************************************************************************************************************************