<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了C語言實現新生入學登記系統的具體程式碼,供大家參考,具體內容如下
專案所用資料結構:連結串列
演演算法:對連結串列資料的增刪改查操作,氣泡排序
系統架構圖:
專案檔案結構:
(1)system.h
#ifndef SYSTEM_H_INCLUDED #define SYSTEM_H_INCLUDED //宏定義學生資訊的一種表示形式 #define STUDENT_DATA pMove->studentData.studentId,pMove->studentData.name,pMove->studentData.sex,pMove->studentData.age,pMove->studentData.className,pMove->studentData.major,pMove->studentData.tel,pMove->studentData.score #define STUDENT_RANKING stuRanking[j].studentId, stuRanking[j].name, stuRanking[j].className, stuRanking[j].score,stuRanking[j].ranking struct student { char studentId[15]; //學號 char name[10]; char sex[4]; int age; char className[20]; //班級 char major[20]; //專業 char tel[15]; int score; //入學成績 }; struct Node { struct student studentData; struct Node* next; }; struct studentRanking { char studentId[15]; char name[10]; char className[20]; int score; int ranking; }; extern struct Node* studentList; //連結串列的頭指標 #endif // SYSTEM_H_INCLUDED
(2)main.h
#ifndef MAIN_H_INCLUDED #define MAIN_H_INCLUDED #include "AddStudent.h" #include "BeginingAndEnding.h" #include "DeleteStudent.h" #include "ModifyStudent.h" #include "SearchStudent.h" #include "ShowStudent.h" #include "ShowStudentRanking.h" #include "MyList.h" #include "system.h" void showMenu(); #endif // MAIN_H_INCLUDED
(3)main.c
#include <stdio.h> #include <stdlib.h> #include <conio.h> //getc函數使用的標頭檔案 #include "main.h" //主函數 int main() { int selection; Int ret; Begining(); showMenu(); //展示介面 ret = scanf("%d", &selection); //讀入使用者輸入數位 getchar(); While(ret != 1) { printf(「輸入錯誤,請選擇(0-6):」); ret = scanf("%d", &selection); //讀入使用者輸入數位 } while (selection) { switch (selection) { case 1: AddStudent(); //錄入學生資訊 break; case 2: ShowStudent(); //瀏覽學生資訊 break; case 3: SearchStudent(); //查詢學生資訊 break; case 4: DeleteStudent(); //刪除學生資訊 break; case 5: ModifyStudent();//修改學生資訊 break; case 6: ShowRanking(); //顯示學生排名 break; default: printf("tt請輸入正確的數位!n"); } Ending(); //將連結串列資料寫入檔案 printf("|按任意鍵返回系統選單|"); getch(); //接收使用者輸入的任意字元 system("cls"); showMenu(); ret = scanf("%d", &selection); //提示使用者輸入數位 getchar(); While(ret != 1) { printf(「輸入錯誤,請選擇(0-6):」); ret = scanf("%d", &selection); //讀入使用者輸入數位 } } return 0; } void showMenu() { printf("nnnnn"); printf("t|--------------- 歡迎進入 ----------------|n"); printf("t| 新生入學登記系統 |n"); printf("t| 主選單 |n"); printf("t| 1. 錄入學生資訊 |n"); printf("t| 2. 瀏覽學生資訊 |n"); printf("t| 3. 查詢學生資訊 |n"); printf("t| 4. 刪除學生資訊 |n"); printf("t| 5. 修改學生資訊 |n"); printf("t| 6. 新生入學排名 |n"); printf("t| 0. 退出系統 |n"); printf("t|-----------------------------------------|n"); printf("n"); printf("tt請選擇(0-6):"); }
(4)BeginingAndEnding.h
#ifndef BEGININGANDENDING_H_INCLUDED #define BEGININGANDENDING_H_INCLUDED //關於啟動函數和結束函數 void Begining(); void Ending(); #endif // BEGININGANDENDING_H_INCLUDED
(5)BeginingAndEnding.c
#include <stdio.h> #include <conio.h> //getc函數使用的標頭檔案 #include "system.h" #include "AboutFiles.h" #include "BeginingAndEnding.h" #include "MyList.h" void Begining() { readInfoFromFile("studentList.txt"); } void Ending() { writeInfoToFile("studentList.txt"); }
(6)MyList.h
#ifndef MYLIST_H_INCLUDED #define MYLIST_H_INCLUDED //關於連結串列的函數宣告 //建立節點 struct Node* createNode(struct student data); //插入節點 void insertNodeByHead(struct student data); //指定位置刪除節點 void deleteAppointNode(char* studentId); //查詢功能 struct Node* searchInfoByData(char* studentId); //列印連結串列 void printList(); #endif // MYLIST_H_INCLUDED
(7)MyList.c
#include <stdio.h> #include <conio.h> //getc函數使用的標頭檔案 #include <windows.h> //Sleep函數使用的標頭檔案 #include <string.h>//strcmp函數使用的頭文 #include "system.h" #include "MyList.h" struct Node* studentList = NULL; //連結串列的頭指標 //建立節點 struct Node* createNode(struct student studentData) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); if(newNode != NULL) { newNode->studentData = studentData; newNode->next = NULL; } return newNode; } //插入節點 void insertNodeByHead(struct student data) { struct Node* newNode = createNode(data); //表頭法插入,每次插入都將資料插入到頭節點的下一個,先判斷頭節點是否為空,為空則新節點就是頭節點,不為空,則插入在頭節點的下一個位置 if(studentList == NULL) { studentList = newNode; } else//不改變頭節點 { newNode->next = studentList->next; studentList->next = newNode; } } //指定位置刪除節點(知道這個節點的前驅和後續,然後進行刪除) void deleteAppointNode( char* studentId) { //將連結串列頭部設為指定位置,先判斷頭節點是否為空,為空則連結串列沒有資料,無法刪除 //如果頭節點不為空,則設頭結點為指定位置,如果頭結點是所找的節點,則刪除,如果不是,設頭結點的下一個為指定節點,頭結點為指定節點的前驅節點,一直向下查詢 //指定位置 struct Node* posNode = studentList; //指定位置的前面 struct Node* posFrontNode = NULL; //查詢指定節點 if(posNode == NULL) { printf("資料為空無法刪除!n"); return; } else { //姓名是字串,不能直接比較, strcmp(), 相等返回值為0,相同返回值為負數或者正數 if(strcmp(posNode->studentData.studentId, studentId) ==0) { studentList = studentList->next; free(posNode); return; } else { posFrontNode = posNode; posNode = posNode->next; //posFrontNode = posNode; //!! while(strcmp(posNode->studentData.studentId, studentId)) { //繼續向下一個節點移動 posFrontNode = posNode; posNode = posFrontNode->next; if(posNode == NULL) //找到了連結串列尾部,沒有找到資料 { printf("未找到指定位置,無法刪除!"); return; } } //查到到對應資料後,進行刪除,將該節點架空,然後釋放該節點的儲存單元 posFrontNode->next = posNode->next; free(posNode); return; } } } //查詢功能 struct Node* searchInfoByData(char* studentId) { struct Node* pMove; pMove = studentList; if(pMove == NULL) //頭節點為空,連結串列為空 { //printf("學生連結串列為空!n"); return pMove; } else { // 查詢到或者查詢到連結串列最後,則結束迴圈,返回查詢結果,結果為空,有兩種可能,一種是連結串列中沒有資料,另一種是沒有查詢到 while(pMove != NULL) { if(strcmp(pMove->studentData.studentId, studentId)==0)//找見 { //printf("已查詢到!n"); return pMove; } else { pMove = pMove->next; } } //printf("未找到!n"); return pMove; } } //列印連結串列 void printList() { struct Node* pMove = studentList; //涉及到展示資料 //表頭 if(pMove == NULL) { printf("No student record! Please add.n"); return; } else { printf("t-------------------------------------------------------------------------------------n"); printf("t|%-10s |%-7s |%-4s |%-4s |%-12s |%-12s |%-12s |%-5s|n","學號","姓名","性別","年齡","班級","專業","電話","入學成績"); printf("t-------------------------------------------------------------------------------------n"); while(pMove) { printf("t|%-10s |%-7s |%-4s |%-4d |%-12s |%-12s |%-12s |%-8d|n", STUDENT_DATA); printf("t-------------------------------------------------------------------------------------n"); pMove = pMove->next; } } printf("n"); }
(8)AddStudent.h
#ifndef ADDSTUDENT_H_INCLUDED #define ADDSTUDENT_H_INCLUDED void AddStudent(); //錄入學生資訊 #endif // ADDSTUDENT_H_INCLUDED
(9)AddStudent.c
#include <stdio.h> #include <conio.h> //getc函數使用的標頭檔案 #include <windows.h> //Sleep函數使用的標頭檔案 #include <string.h>//strcmp函數使用的頭文 #include "AddStudent.h" #include "system.h" #include "MyList.h" //錄入學生資訊 void AddStudent() { struct student studentData; struct Node* isNull = NULL; //接收查詢的返回值 int iFlagExist; //保證不重複輸入 char cFlag; int ret; //用來接收scanf的返回值,判斷輸入資料是否正確 system("cls"); printf("===================================【錄入學生資訊】===============================n"); printf("n請選擇是否輸入學生資訊(y/n):"); cFlag = getchar(); getchar(); while(cFlag != 'n' && cFlag!='y') { printf("輸入有誤,請輸入‘y'或者‘n'!"); printf("n請選擇是否輸入學生資訊(y/n):"); cFlag = getchar(); getchar(); } if (cFlag == 'n') return; //迴圈輸入學生資訊可輸入一條也可多條輸入 while (cFlag == 'y') { printf("請輸入學生學號:"); do { iFlagExist = 0; gets(studentData.studentId); //對學生編號在連結串列中進行查詢,對查詢結果進行判斷,如果存在則重新輸入,不存在則繼續 isNull = searchInfoByData(studentData.studentId); if(isNull!= NULL) //可以查詢到 { printf("該學生已經存在請重新輸入!n"); printf("請輸入學生學號:"); iFlagExist = 1; } } while (iFlagExist == 1); //新增學生資訊 printf("請輸入學生姓名:"); ret = scanf("%s",studentData.name); while(ret!=1) { printf("輸入學生姓名有誤,請重新輸入!n"); printf("請輸入學生姓名:"); ret = scanf("%s",studentData.name); } getchar(); printf("請輸入學生性別(男-M,女-F):"); //這裡採用防禦式程式設計,如果不是M,F或者沒有輸入該項則重新輸入 while (gets(studentData.sex) != NULL) { if (strcmp(studentData.sex, "F")==0 || strcmp(studentData.sex, "M")==0) break; printf("錯誤,只能輸入'F'或者'M',請重新輸入n"); printf("請輸入學生性別(男-M,女-F):"); } printf("請輸入學生年齡(15-25):"); ret = scanf("%d", &studentData.age); while((ret != 1) || studentData.age<15 || studentData.age>25) { printf("輸入年齡錯誤,請重新輸入學生年齡(15-25):"); ret = scanf("%d", &studentData.age); } getchar(); printf("請輸入學生班級(eg: B電子191):"); gets(studentData.className); printf("請輸入學生專業:"); gets(studentData.major); printf("請輸入學生電話:"); gets(studentData.tel); printf("請輸入學生入學成績(200-750):"); ret = scanf("%d", &studentData.score); while((ret != 1) || studentData.score<200 || studentData.score>750) { printf("輸入成績資訊錯誤,請重新輸入學生入學成績(200-750):"); ret = scanf("%d", &studentData.score); } getchar(); insertNodeByHead(studentData); fflush(stdin); printf("繼續輸入資訊嗎(y/n):"); cFlag = getchar(); getchar(); while(cFlag != 'n' && cFlag!='y') { printf("輸入有誤,請輸入‘y'或者‘n'!"); printf("n請選擇是否輸入學生資訊(y/n):"); cFlag = getchar(); getchar(); } } printf("新增學生資訊執行完畢!n"); }
(10)ShowStudent.h
#ifndef SHOWSTUDENT_H_INCLUDED #define SHOWSTUDENT_H_INCLUDED void ShowStudent(); //查詢學生資訊 #endif // SHOWSTUDENT_H_INCLUDED
(11)ShowStudent.c
#include <stdio.h> #include <conio.h> //getc函數使用的標頭檔案 #include <windows.h> //Sleep函數使用的標頭檔案 #include <string.h>//strcmp函數使用的頭文 #include "ShowStudent.h" #include "system.h" #include "MyList.h" //瀏覽學生資訊 void ShowStudent() { system("cls"); printf("n"); printf("t====================================【瀏覽學生資訊】================================n"); printf("nn"); printList(); }
(12)SearchStudent.h
#ifndef SEARCHSTUDENT_H_INCLUDED #define SEARCHSTUDENT_H_INCLUDED void SearchStudent(); //查詢學生資訊 #endif // SEARCHSTUDENT_H_INCLUDED
(13)SearchStudent.c
#include <stdio.h> #include <conio.h> //getc函數使用的標頭檔案 #include <windows.h> //Sleep函數使用的標頭檔案 #include <string.h>//strcmp函數使用的頭文 #include "SearchStudent.h" #include "system.h" #include "MyList.h" //查詢學生資訊 void SearchStudent() { //查詢成功,則返回該學生資訊,查詢失敗則輸出提示資訊,可重新輸入,也可退出 struct student studentData; struct Node* pMove = NULL; //用來接收查詢返回的結果 char cFlag; //接收使用者的選擇 system("cls"); printf("n"); printf("t==================================【查詢學生資訊】==============================n"); printf("t是否進行學生查詢(y/n):"); cFlag = getchar(); getchar(); //接收確認鍵 while(cFlag != 'n' && cFlag!='y') { printf("輸入有誤,請輸入‘y'或者‘n'!"); printf("n請選擇是否查詢學生資訊(y/n):"); cFlag = getchar(); getchar(); } if (cFlag == 'n') return; while(cFlag == 'y') { printf("t請輸入需要查詢的學生的學號:"); //這裡通過學號進行查詢,學號是唯一的,姓名有重名現象 gets(studentData.studentId); pMove = searchInfoByData(studentData.studentId); if(pMove) //pMove 為真時,表示查詢到 { printf("t查詢成功,以下為該學生資訊:n"); printf("t-------------------------------------------------------------------------------------n"); printf("t|%-10s |%-7s |%-4s |%-4s |%-12s |%-12s |%-12s |%-5s|n","學號","姓名","性別","年齡","班級","專業","電話","入學成績"); printf("t-------------------------------------------------------------------------------------n"); printf("t|%-10s |%-7s |%-4s |%-4d |%-12s |%-12s |%-12s |%-8d|n", STUDENT_DATA); printf("t-------------------------------------------------------------------------------------n"); } else //pMove 為空時,未查詢到,這裡為空有兩種情況,一種為學生名單為空,一種是沒有查詢到 { printf("t查詢失敗,該學生不存在或學生列表為空!n"); printf("t是否重新查詢(y/n):"); cFlag = getchar(); getchar(); while(cFlag != 'n' && cFlag!='y') { printf("輸入有誤,請輸入‘y'或者‘n'!"); printf("n是否重新查詢學生資訊(y/n):"); cFlag = getchar(); getchar(); } } } printf("t學生資訊查詢結束!n"); }
(14)DeleteStudent.h
#ifndef DELETESTUDENT_H_INCLUDED #define DELETESTUDENT_H_INCLUDED void DeleteStudent(); //刪除學生資訊 #endif // DELETESTUDENT_H_INCLUDED
(15)DeleteStudent.c
#include <stdio.h> #include <conio.h> //getc函數使用的標頭檔案 #include <windows.h> //Sleep函數使用的標頭檔案 #include <string.h>//strcmp函數使用的頭文 #include "DeleteStudent.h" #include "system.h" #include "MyList.h" //刪除學生資訊 void DeleteStudent() { //先根據學號對該學生進行查詢,查詢到則刪除,沒有查詢到則輸出提示資訊 struct student studentData; struct Node* pMove = NULL; //用來接收查詢返回的結果 char cFlag; system("cls"); printf("n"); printf("t==================================【刪除學生資訊】==============================n"); printf("t請輸入需要刪除的學生的學號:"); gets(studentData.studentId); pMove = searchInfoByData(studentData.studentId); if(pMove) //該學生存在,進行刪除 { //先對學生資訊進行展示 printf("t-------------------------------------------------------------------------------------n"); printf("t|%-10s |%-7s |%-4s |%-4s |%-12s |%-12s |%-12s |%-5s|n","學號","姓名","性別","年齡","班級","專業","電話","入學成績"); printf("t-------------------------------------------------------------------------------------n"); printf("t|%-10s |%-7s |%-4s |%-4d |%-12s |%-12s |%-12s |%-8d|n", STUDENT_DATA); printf("t-------------------------------------------------------------------------------------n"); printf("t已查詢到該學生資訊,是否刪除?(y/n)"); cFlag = getchar(); getchar(); //吃掉緩衝區的空格 while(cFlag != 'n' && cFlag!='y') { printf("輸入有誤,請輸入‘y'或者‘n'!"); printf("n請選擇是否輸入學生資訊(y/n):"); cFlag = getchar(); getchar(); } if(cFlag == 'n') return; else if(cFlag == 'y') { deleteAppointNode(studentData.studentId); printf("t已刪除該學生資訊!n"); printf("t刪除操作執行結束!n"); } } else //找到了連結串列的末尾,或者連結串列為空 { printf("t該學生不存在!無法執行刪除操作n"); } }
(16)ModifyStudent.h
#ifndef MODIFYSTUDENT_H_INCLUDED #define MODIFYSTUDENT_H_INCLUDED #include "system.h" void ModifyStudent();//修改學生資訊 void ShowModifyMenu();//展示修改選項選單 void dealSelection(struct student studentData, int selection, struct Node *pMove); //處理使用者選擇的修改項 #endif // MODIFYSTUDENT_H_INCLUDED
(17)ModifyStudent.c
#include <stdio.h> #include <conio.h> //getc函數使用的標頭檔案 #include <windows.h> //Sleep函數使用的標頭檔案 #include <string.h>//strcmp函數使用的頭文 #include "ModifyStudent.h" #include "system.h" #include "MyList.h" //修改學生資訊 void ModifyStudent() { struct student studentData; struct Node* pMove = NULL; //對學生資訊查詢結果進行儲存 int selection; //儲存選擇資訊 char isContinue = 'n'; //是否繼續進行修改 system("cls"); printf("n"); printf("t==================================【修改學生資訊】==============================n"); printf("t請輸入需要修改資訊的學生的學號:"); gets(studentData.studentId); pMove = searchInfoByData(studentData.studentId); if(pMove == NULL) { printf("t該學生資訊不存在,無法進行資訊修改n"); return; } else //可修改多條學生資訊,也可以只修改一條學生資訊 { printf("t-------------------------------------------------------------------------------------n"); printf("t|%-10s |%-7s |%-4s |%-4s |%-12s |%-12s |%-12s |%-5s|n","學號","姓名","性別","年齡","班級","專業","電話","入學成績"); printf("t-------------------------------------------------------------------------------------n"); printf("t|%-10s |%-7s |%-4s |%-4d |%-12s |%-12s |%-12s |%-8d|n", STUDENT_DATA); printf("t-------------------------------------------------------------------------------------n"); printf("t是否進行學生資訊的修改?(y/n)"); scanf("%c", &isContinue); getchar(); while(isContinue != 'n' && isContinue !='y') { printf("t輸入有誤,請輸入‘y'或者‘n'!"); printf("t請選擇是否修改學生資訊(y/n):"); isContinue = getchar(); getchar(); } if(isContinue == 'n') return; else { while(isContinue == 'y') { //system('cls'); ShowModifyMenu(); //printf("t請選擇修改項: "); scanf("%d", &selection); getchar(); //對使用者的操作選擇進行處理 dealSelection(studentData,selection,pMove); fflush(stdin); printf("t是否繼續修改學生資訊(y/n)?"); isContinue = getchar(); getchar(); while(isContinue != 'n' && isContinue!='y') { printf("n輸入有誤,請輸入‘y'或者‘n'!"); printf("n請選擇是否繼續修改學生資訊(y/n):"); isContinue = getchar(); getchar(); } } printf("t學生資訊修改完畢!n"); } } } //學生資訊修改選單 void ShowModifyMenu() { printf("n"); //printf("t| 1.學號 |n"); printf("t| 1.姓名 |n"); printf("t| 2.性別 |n"); printf("t| 3.年齡 |n"); printf("t| 4.班級 |n"); printf("t| 5.專業 |n"); printf("t| 6.電話 |n"); printf("t| 7.入學成績 |n"); printf("n"); printf("請輸入所要修改的資訊(鍵入相應的數位:1-7):"); } //處理使用者選擇的修改項 void dealSelection(struct student studentData, int selection, struct Node* pMove) { int ret; //用來接收scanf的返回值 switch (selection) { case 1: printf("t請輸入輸入學生姓名:"); gets(studentData.name); strcpy(pMove->studentData.name, studentData.name); break; case 2: printf("t請輸入學生性別(男-M,女-F):"); while (gets(studentData.sex) != NULL) { if (strcmp(studentData.sex, "F") == 0 || strcmp(studentData.sex, "M") == 0) break; printf("t錯誤,只能輸入'F'或者'M',請重新輸入n"); printf("t請輸入學生性別(男-M,女-F):"); } strcpy(pMove->studentData.sex,studentData.sex); break; case 3: printf("t請輸入學生年齡(15-25):"); ret = scanf("%d", &studentData.age); while((ret != 1) || studentData.age<15 || studentData.age>25) { printf("t輸入年齡錯誤,請重新輸入學生年齡(15-25):"); ret = scanf("%d", &studentData.age); } pMove->studentData.age = studentData.age; break; case 4: printf("t請輸入學生班級(eg:B電子191):"); gets(studentData.className); strcpy(pMove->studentData.className, studentData.className); break; case 5: printf("t請輸入學生專業:"); gets(studentData.major); strcpy(pMove->studentData.major, studentData.major); break; case 6: printf("t請輸入學生電話:"); gets(studentData.tel); strcpy(pMove->studentData.tel, studentData.tel); break; case 7: printf("t請輸入學生入學成績(100-750):"); ret = scanf("%d", &studentData.score); while((ret != 1) || studentData.score<200 || studentData.score>750) { printf("t輸入成績資訊錯誤,請重新輸入學生入學成績(200-750):"); ret = scanf("%d", &studentData.score); } pMove->studentData.score = studentData.score; break; default: printf("tt請輸入正確的數位!"); break; } }
(18)ShowStudentRanking.h
#ifndef SHOWSTUDENTRANKING_H_INCLUDED #define SHOWSTUDENTRANKING_H_INCLUDED #include "system.h" void ShowRanking(); //顯示學生排名 void sortByScore(struct studentRanking * stuRanking, int length); void Ranking(struct studentRanking * stuRanking, int length); #endif // SHOWSTUDENTRANKING_H_INCLUDED
(19)ShowStudentRanking.c
#include <stdio.h> #include <conio.h> //getc函數使用的標頭檔案 #include <windows.h> //Sleep函數使用的標頭檔案 #include <string.h>//strcmp函數使用的頭文 #include "ShowStudentRanking.h" #include "system.h" void ShowRanking() { //*對連結串列中學生的成績進行排名,並顯示排名結果,排名結果括學號姓名班級專業入學成績排名 //*排名是struct studentRanking 的一個結構體成員,在得出排名後,再進行展示 //*1.對連結串列中所有學生的成員進行排序,排序結果儲存在student.ranking中 //重新定義一個結構體,儲存排名資訊並輸出 //定義一個結構體陣列 struct Node *pMove = NULL; struct studentRanking *stuRanking; int i, j; int length = 0; //用來儲存連結串列的長度 system("cls"); printf("n"); printf("t==================================【學生排名資訊】==============================n"); if(studentList == NULL) { printf("學生登記為空,無法進行成績排名n"); return; } else //學生連結串列頭指標不為空,代表學生連結串列中存有學生資訊 { pMove = studentList; //pMove指向連結串列的頭 //通過遍歷得到連結串列有多少個儲存單元 for(i=0; pMove != NULL; i++) { pMove = pMove->next; } length = i; printf("現有學生總人數為%dn", length); //動態陣列 stuRanking = (struct studentRanking *)malloc(length * sizeof(struct studentRanking)); if(stuRanking == NULL) return; //將需要輸出的學生資訊複製到結構體陣列當中 pMove = studentList; for(j=0; j<length; j++) { strcpy(stuRanking[j].studentId, pMove->studentData.studentId); strcpy(stuRanking[j].name , pMove->studentData.name); strcpy(stuRanking[j].className , pMove->studentData.className); stuRanking[j].score = pMove->studentData.score; pMove = pMove->next; } //複製完成後,根據成績對學生進行排序 sortByScore(stuRanking, length); //根據排序結果,為每名同學新增排名資訊 Ranking(stuRanking, length); //展示排名 printf("排名結果如下:n"); printf("t-------------------------------------------------------n"); printf("t|%-10s |%-7s |%-12s |%-5s |%-5s|n","學號","姓名","班級","入學成績","全級排名"); printf("t-------------------------------------------------------n"); for(j=0; j<length; j++) { printf("t|%-10s |%-7s |%-12s |%-8d |%-8d|n", STUDENT_RANKING); printf("t-------------------------------------------------------n"); } } printf("輸出排名資訊完畢!n"); system("pause"); } //通過成績對連結串列中的資料進行排序 void sortByScore(struct studentRanking *stuRanking, int length) { //進行氣泡排序,從大到小排序 int i, j; struct studentRanking temp; for(i=0; i<length-1; i++) { for(j=0; j<(length-i-1); j++) { if(stuRanking[j].score < stuRanking[j+1].score)//後一項比前一項大,則交換兩個儲存單元中的資料,一輪排序下來,最小項就位,在列表的最末尾 { temp = *(stuRanking+j); *(stuRanking+j) = *(stuRanking+j+1); *(stuRanking+j+1) =temp; } } } } void Ranking(struct studentRanking * stuRanking, int length) { int i; for(i=1; i<=length; i++) { stuRanking[i-1].ranking = i; } }
(20)AboutFiles.h
#ifndef ABOUTFILES_H_INCLUDED #define ABOUTFILES_H_INCLUDED //連結串列的讀取--檔案讀操作 void readInfoFromFile(char* fileName); //連結串列的儲存--檔案寫操作 void writeInfoToFile(char* fileName); #endif // ABOUTFILES_H_INCLUDED
(21)ShowStudentRanking.c
#include <stdio.h> #include <conio.h> //getc函數使用的標頭檔案 #include <windows.h> //Sleep函數使用的標頭檔案 #include <string.h>//strcmp函數使用的頭文 #include "system.h" #include "AboutFiles.h" #include "MyList.h" //連結串列的讀取--檔案讀操作 void readInfoFromFile(char* fileName) { //步驟:先將資訊讀到data裡面,再將資訊讀到檔案裡面 //1.開啟檔案 FILE *fp; struct student data; fp = fopen(fileName, "r"); if(fp == NULL) { fclose(fp); return NULL; } //2.讀檔案 //格式化讀取檔案,沒有讀到檔案結束標誌,則一直讀下去,讀到的資料插入到連結串列裡面 else { while(fscanf(fp, "%st%st%st%dt%st%st%st%dn", data.studentId,data.name,data.sex,&data.age,data.className,data.major,data.tel,&data.score) != EOF) { //將檔案中原來的資料插入到連結串列當中 insertNodeByHead(data); } //3.關閉檔案, fclose(fp); } } //連結串列的儲存--檔案寫操作 void writeInfoToFile(char* fileName) { //1.開啟檔案D:CodeBlockscodeblocks C projectStudentSystemDemo02studentList FILE *fp; struct Node* pMove = studentList; fp = fopen(fileName, "w"); if(fp == NULL) { //w+具有建立的功能,建立一個新檔案可讀可寫 fp = fopen(fileName, "w+"); //可以給檔案寫入一個表頭資訊 } //2.寫檔案, 按格式寫入操作 while(pMove != NULL) { fprintf(fp,"%st%st%st%dt%st%st%st%dn", STUDENT_DATA); pMove = pMove->next; } //3.關閉檔案 fclose(fp); }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45