您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“C語言如何實現學生信息管理系統的文件操作”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C語言如何實現學生信息管理系統的文件操作”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
//學生數據文件儲存 //儲存任意時期的學生數據 void Store_List(Link head) { //文件操作 ofstream ofs; ofs.open("Std_Information.txt",ios::out); if(head==NULL) { printf("學生為空\n"); return; } else { Link p=head->next; while(p) { ofs<< "姓名:"<<p->data.studentName<<" 學號:"<<p->data.studentNo<<" 成績:"<<p->data.score<<endl; p=p->next; } } }
#include <stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<stdbool.h> #include<iostream> #include<fstream>//文件操作所需頭文件 using namespace std; #define NO_LENGTH 20 #define NAME_LENGTH 11 /* 定義學生結構體的數據結構 */ typedef struct Student{ char studentNo[NO_LENGTH]; char studentName[NAME_LENGTH]; int score; }st; /* 定義每條記錄或節點的數據結構 */ typedef struct node { struct Student data; //數據域 struct node *next; //指針域 }Node,*Link; //Node為node類型的別名,Link為node類型的指針別名
typedef struct Student{ char studentNo[NO_LENGTH]; char studentName[NAME_LENGTH]; int score; }st;
/* 定義每條記錄或節點的數據結構 */ typedef struct node { struct Student data; //數據域 struct node *next; //指針域 }Node,*Link; //Node為node類型的別名,Link為node類型的指針別名
//定義提示菜單 void myMenu(){ printf("*****************************菜單*****************************\n"); printf("***********************1 增加學生記錄*************************\n"); printf("***********************2 刪除學生記錄*************************\n"); printf("***********************3 查找學生記錄*************************\n"); printf("***********************4 修改學生記錄*************************\n"); printf("***********************5 統計學生人數 ************************\n"); printf("***********************6 顯示學生記錄*************************\n"); printf("***********************7 信息文件打印*************************\n"); printf("***********************8 退出系統 ****************************\n"); }
void inputStudent(Link l){ printf("請輸入學生學號:"); scanf("%s",l->data.studentNo); printf("請輸入學生的姓名:"); scanf("%s",l->data.studentName); printf("請輸入學生的成績:"); scanf("%s",&(l->data.score)); //每個新創建的節點的next域都初始化為NULL l->next = NULL; system("cls"); }
void inputStudentNo(char s[],char no[]){ printf("請輸入要%s的學生學號:",s); scanf("%s",no); }
//遍歷表中學生 void displayNode(Link head){ if(head==NULL) { printf("學生為空\n"); return; } else { Link p=head->next; while(p) { cout<<"姓名:"<<p->data.studentName<<" 學號"<<p->data.studentNo<<" 成績:"<<p->data.score<<endl; p=p->next; } } // 填寫代碼,根據傳入的鏈表head頭指針,掃描鏈表顯示所有節點的信息 system("pause"); system("cls"); }
/* 增加學生記錄 */ bool addNode(Link head){ Link p,q; //p,q兩個節點一前一后 Link node; //node指針指向新創建的節點 node=(Link)malloc(sizeof(Node)); inputStudent(node); q = head; p = head->next; //q指向head后面的第一個有效節點 if(head->next==NULL) //鏈表為空時 head->next = node; else { //循環訪問鏈表中的所有節點 while(p != NULL){ if (node->data.studentNo < p->data.studentNo){ //如果node節點的學號比p節點的學號小,則插在p的前面,完成插入后,提前退出子程序 q->next = node; node->next = p; return true; } else{ //如果node節點的學號比p節點的學號大,繼續向后移動指針(依然保持pq一前一后) q = p; p = p->next; } } //如果沒能提前退出循環,則說明之前沒有插入,那么當前node節點的學號是最大值,此時插在鏈表的最后面 q->next = node; } return true; system("pause"); system("cls"); }
//刪除學生信息 bool deleteNode(Link head){ // 按照給定的學號刪除學生記錄,如果刪除成功返回true,如果沒找到學號返回false //輸入要處理的學號 char no[NO_LENGTH]; inputStudentNo("刪除",no); Link p=head->next; Link q=head; while(p) { if(strcmp(p->data.studentNo,no)==0) { cout<<"成功刪除該學生"<<endl; q->next=p->next; free(p); system("pause"); system("cls"); return true; } else { q=p; p=p->next; } } cout<<"未找到該學生"<<endl; system("pause"); system("cls"); return false; }
//查找學生信息 bool queryNode(Link head){ // 按照給定的學號查詢學生記錄,如果查找成功返回true,如果沒找到學號返回false //輸入要處理的學號 char no[NO_LENGTH]; inputStudentNo("查找",no); Link p=head->next; while(p) { if(strcmp(p->data.studentNo,no)==0) { system("cls"); cout<<"姓名:"<<p->data.studentName<<" 學號:"<<p->data.studentNo<<" 成績:"<<p->data.score<<endl; return true; } else { p=p->next; } } cout<<"未找到該學生"<<endl; system("cls"); return false; }
//修改學生信息 bool modifyNode(Link head){ // 按照給定的學號找到學生記錄節點,如果修改成功返回true,如果沒找到學號返回false //輸入要處理的學號 char no[NO_LENGTH]; inputStudentNo("修改",no); Link p=head->next; while(p) { if(strcmp(p->data.studentNo,no)==0) { cout<<"請輸入修改后的姓名"<<endl; cin>>p->data.studentName; cout<<"請輸入修改后的學號"<<endl; cin>>p->data.studentNo; cout<<"請輸入修改后的成績"<<endl; cin>>p->data.score; system("cls"); return true; } else { p=p->next; } } cout<<"未找到該學生,請重新輸入學號"<<endl; system("cls"); return false; }
//統計學生人數 int countNode(Link head){ //統計學生人數,掃描鏈表統計節點個數,返回節點數 Link p; int count = 0; p = head->next; while(p) { p=p->next; count++; } //填充代碼 system("cls"); return count; }
//清空鏈表 void clearLink(Link head){ Link q,p; p=head->next; q=head; while(p) { q->next=p->next; free(p); p=q->next; } //遍歷鏈表,用free語句刪除鏈表中用malloc建立起的所有的節點 }
//學生數據文件儲存 //儲存任意時期的學生數據 void Store_List(Link head) { //文件操作 ofstream ofs; ofs.open("Std_Information.txt",ios::out); if(head==NULL) { printf("學生為空\n"); return; } else { Link p=head->next; while(p) { ofs<< "姓名:"<<p->data.studentName<<" 學號:"<<p->data.studentNo<<" 成績:"<<p->data.score<<endl; p=p->next; } } }
int main() { int select; int count; Link head; // 定義鏈表 //建立head頭結點,在這個程序中head指向頭結點,頭結點data部分沒有內容,其后續節點才有真正的數據 head = (Link)malloc(sizeof(Node)); head->next = NULL; while(1) { myMenu(); printf("\n請輸入你的選擇(0-7):"); //顯示提示信息 scanf("%d",&select); switch(select) { case 1: //增加學生記錄 if(addNode(head)) printf("成功插入一個學生記錄。\n\n"); break; case 2: //刪除學生記錄 if(deleteNode(head)) printf("成功刪除一個學生記錄。\n\n"); else printf("沒有找到要刪除的學生節點。\n\n"); break; case 3: //查詢學生記錄 if(queryNode(head)) printf("成功找到學生記錄。\n\n"); else printf("沒有找到要查詢的學生節點。\n\n"); break; case 4: //修改學生記錄 if(modifyNode(head)) printf("成功修改一個學生記錄。\n\n"); else printf("沒有找到要修改的學生節點。\n\n"); break; case 5: //統計學生人數 count = countNode(head); printf("學生人數為:%d\n\n",count); break; case 6: //顯示學生記錄 displayNode(head); break; case 7: //退出前清除鏈表中的所有結點 clearLink(head); return 0; default: printf("輸入不正確,應該輸入0-7之間的數。\n\n"); system("cls"); break; } } return 0; }
#include <stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<stdbool.h> #include<iostream> #include<fstream>//文件操作所需頭文件 using namespace std; #define NO_LENGTH 20 #define NAME_LENGTH 11 /* 定義學生結構體的數據結構 */ typedef struct Student{ char studentNo[NO_LENGTH]; char studentName[NAME_LENGTH]; int score; }st; /* 定義每條記錄或節點的數據結構 */ typedef struct node { struct Student data; //數據域 struct node *next; //指針域 }Node,*Link; //Node為node類型的別名,Link為node類型的指針別名 //定義提示菜單 void myMenu(){ printf("*****************************菜單*****************************\n"); printf("***********************1 增加學生記錄*************************\n"); printf("***********************2 刪除學生記錄*************************\n"); printf("***********************3 查找學生記錄*************************\n"); printf("***********************4 修改學生記錄*************************\n"); printf("***********************5 統計學生人數 ************************\n"); printf("***********************6 顯示學生記錄*************************\n"); printf("***********************7 信息文件打印*************************\n"); printf("***********************8 退出系統 ****************************\n"); } void inputStudent(Link l){ printf("請輸入學生學號:"); scanf("%s",l->data.studentNo); printf("請輸入學生的姓名:"); scanf("%s",l->data.studentName); printf("請輸入學生的成績:"); scanf("%d",&(l->data.score)); //每個新創建的節點的next域都初始化為NULL l->next = NULL; system("cls"); } void inputStudentNo(char s[],char no[]){ printf("請輸入要%s的學生學號:",s); scanf("%s",no); } //遍歷表中學生 void displayNode(Link head){ if(head==NULL) { printf("學生為空\n"); return; } else { Link p=head->next; while(p) { cout<<"姓名:"<<p->data.studentName<<" 學號"<<p->data.studentNo<<" 成績:"<<p->data.score<<endl; //ofs<< "姓名:"<<p->data.studentName<<" 學號"<<p->data.studentNo<<" 成績:"<<p->data.score<<endl; p=p->next; } } // 填寫代碼,根據傳入的鏈表head頭指針,掃描鏈表顯示所有節點的信息 system("pause"); system("cls"); } /* 增加學生記錄 */ bool addNode(Link head){ Link p,q; //p,q兩個節點一前一后 Link node; //node指針指向新創建的節點 node=(Link)malloc(sizeof(Node)); inputStudent(node); q = head; p = head->next; //q指向head后面的第一個有效節點 if(head->next==NULL) //鏈表為空時 head->next = node; else { //循環訪問鏈表中的所有節點 while(p != NULL){ if (node->data.studentNo < p->data.studentNo){ //如果node節點的學號比p節點的學號小,則插在p的前面,完成插入后,提前退出子程序 q->next = node; node->next = p; return true; } else{ //如果node節點的學號比p節點的學號大,繼續向后移動指針(依然保持pq一前一后) q = p; p = p->next; } } //如果沒能提前退出循環,則說明之前沒有插入,那么當前node節點的學號是最大值,此時插在鏈表的最后面 q->next = node; } return true; system("pause"); system("cls"); } bool deleteNode(Link head){ // 按照給定的學號刪除學生記錄,如果刪除成功返回true,如果沒找到學號返回false //輸入要處理的學號 char no[NO_LENGTH]; inputStudentNo("刪除",no); Link p=head->next; Link q=head; while(p) { if(strcmp(p->data.studentNo,no)==0) { cout<<"成功刪除該學生"<<endl; q->next=p->next; free(p); system("pause"); system("cls"); return true; } else { q=p; p=p->next; } } cout<<"未找到該學生"<<endl; system("pause"); system("cls"); return false; } //查找學生信息 bool queryNode(Link head){ // 按照給定的學號查詢學生記錄,如果查找成功返回true,如果沒找到學號返回false //輸入要處理的學號 char no[NO_LENGTH]; inputStudentNo("查找",no); Link p=head->next; while(p) { if(strcmp(p->data.studentNo,no)==0) { system("cls"); cout<<"姓名:"<<p->data.studentName<<" 學號:"<<p->data.studentNo<<" 成績:"<<p->data.score<<endl; return true; } else { p=p->next; } } cout<<"未找到該學生"<<endl; system("cls"); return false; } //修改學生信息 bool modifyNode(Link head){ // 按照給定的學號找到學生記錄節點,如果修改成功返回true,如果沒找到學號返回false //輸入要處理的學號 char no[NO_LENGTH]; inputStudentNo("修改",no); Link p=head->next; while(p) { if(strcmp(p->data.studentNo,no)==0) { cout<<"請輸入修改后的姓名"<<endl; cin>>p->data.studentName; cout<<"請輸入修改后的學號"<<endl; cin>>p->data.studentNo; cout<<"請輸入修改后的成績"<<endl; cin>>p->data.score; system("cls"); return true; } else { p=p->next; } } cout<<"未找到該學生,請重新輸入學號"<<endl; system("cls"); return false; } //統計學生人數 int countNode(Link head){ //統計學生人數,掃描鏈表統計節點個數,返回節點數 Link p; int count = 0; p = head->next; while(p) { p=p->next; count++; } //填充代碼 system("cls"); return count; } //清空鏈表 void clearLink(Link head){ Link q,p; p=head->next; q=head; while(p) { q->next=p->next; free(p); p=q->next; } //遍歷鏈表,用free語句刪除鏈表中用malloc建立起的所有的節點 } //學生數據文件儲存 //儲存任意時期的學生數據 void Store_List(Link head) { //文件操作 ofstream ofs; ofs.open("Std_Information.txt",ios::out); if(head==NULL) { printf("學生為空\n"); return; } else { Link p=head->next; while(p) { ofs<< "姓名:"<<p->data.studentName<<" 學號:"<<p->data.studentNo<<" 成績:"<<p->data.score<<endl; p=p->next; } } } int main() { int select; int count; Link head; // 定義鏈表 //建立head頭結點,在這個程序中head指向頭結點,頭結點data部分沒有內容,其后續節點才有真正的數據 head = (Link)malloc(sizeof(Node)); head->next = NULL; while(1) { myMenu(); printf("\n請輸入你的選擇(0-8):"); //顯示提示信息 scanf("%d",&select); switch(select) { case 1: //增加學生記錄 if(addNode(head)) printf("成功插入一個學生記錄。\n\n"); break; case 2: //刪除學生記錄 if(deleteNode(head)) printf("成功刪除一個學生記錄。\n\n"); else printf("沒有找到要刪除的學生節點。\n\n"); break; case 3: //查詢學生記錄 if(queryNode(head)) printf("成功找到學生記錄。\n\n"); else printf("沒有找到要查詢的學生節點。\n\n"); break; case 4: //修改學生記錄 if(modifyNode(head)) printf("成功修改一個學生記錄。\n\n"); else printf("沒有找到要修改的學生節點。\n\n"); break; case 5: //統計學生人數 count = countNode(head); printf("學生人數為:%d\n\n",count); break; case 6: //顯示學生記錄 displayNode(head); break; case 7:Store_List(head); cout<<"打印成功"<<endl; system("pause"); system("cls"); break; case 8: //退出前清除鏈表中的所有結點 clearLink(head); return 0; default: printf("輸入不正確,應該輸入0-8之間的數。\n\n"); system("pause"); system("cls"); break; } } return 0; }
讀到這里,這篇“C語言如何實現學生信息管理系統的文件操作”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。