大學宿舍管理系統 C語言實現
阿新 • • 發佈:2018-12-08
廢話不說,先上程式碼(本文最後有測試資料):
程式碼:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> typedef struct pnode //結構體定義 用於存放學生資訊的節點 { char name [10]; //姓名 char num[16]; //學號 char dor[30]; //房號 char group[20]; //班級 }student; char filename[200]="data.txt"; //檔名 FILE *fp; //指向檔案的指標 void creat() // 建立一個二進位制檔案 用於存放學生資料 { student *person; person=(student *)malloc(sizeof(student)); //為節點分配記憶體 if((fp=fopen(filename,"w+"))==NULL) { exit(0); } printf("data.txt檔案已建立。\n\n"); printf("\n請輸入學生的姓名 學號 房號 班級 用空格隔開 以#結束\n"); scanf("%s",person->name); while(strcmp(person->name,"#")) //該迴圈用於控制學生資訊的錄入 遇#結束 { scanf("%s %s %s",person->num,person->dor,person->group); fprintf(fp,"%-10s%-10s%-10s%-10s\n",person->name,person->num,person->dor,person->group);scanf("%s",person->name); } fclose(fp); } void readfile() //檔案讀取函式 { if((fp=fopen(filename,"r+"))==NULL) {printf("\n無法開啟該檔案:\n");exit(0);} fclose(fp); } void output() //輸出函式 用於輸出檔案的全部資訊 { student *person; long offset1,offset2; char name1[10],name2[10],name3[10]; char num1[16],num2[16],num3[16]; char dor1[30],dor2[30],dor3[30]; char group1[20],group2[20],group3[20]; person=(student *)malloc(sizeof(student)); if((fp=fopen(filename,"r"))==NULL) { printf("\n 無法開啟該檔案");exit(0); } printf("\n****************************************************************\n"); printf("%40s\n","輸出的記錄如下\n"); printf("%-20s%-20s%-20s%-20s\n","姓名","學號","房號","班級"); while(!feof(fp)) //次迴圈用於輸出檔案 { fscanf(fp,"%s%s%s%s\n",person->name,person->num,person->dor,person->group); printf("%-20s%-20s%-20s%-20s\n", person->name,person->num,person->dor,person->group); } fclose(fp); printf("************************************************************\n\n"); } void namesearch() // 按姓名搜尋函式 { int k=0; char namekey[10]; student *person; person=(student *)malloc(sizeof(student)); printf("\n 請輸入您要查詢的姓名:"); scanf("%s",namekey); if((fp=fopen(filename,"rb"))==NULL) {printf("\n 無法開啟檔案");exit(0);} while(!feof(fp)) { fscanf(fp,"%s %s %s %s\n",person->name,person->num,person->dor,person->group); if(!strcmp(namekey,person->name)) { printf("\n\n 已經為您找到 以下是記錄:\n\n"); printf("%-20s%-20s%-20s%-20s\n","姓名","學號","房號","班級"); printf("%-20s%-20s%-20s%-20s\n",person->name,person->num,person->dor,person->group); k=1; } } if(!k) printf("\n\n 沒有關於此姓名的任何資訊! \n"); fclose(fp); } void numsearch() //按學號搜尋函式 { int k=0; char xhkey[16]; student *person; person=(student *)malloc(sizeof(student)); printf("\n 請您輸入需要查詢的學號:"); scanf("%s",xhkey); if((fp=fopen(filename,"rb"))==NULL) { printf("\n 無法開啟檔案 "); exit(0); } while(!feof(fp)) { fscanf(fp,"%s %s %s %s\n",person->name,person->num,person->dor,person->group); if(!strcmp(xhkey,person->num)) { printf("\n\n 已經為您找到 以下是記錄:\n\n"); printf("%-20s%-20s%-20s%-20s\n","姓名","學號","房號","班級"); printf("%-20s%-20s%-20s%-20s\n",person->name,person->num,person->dor,person->group); k=1; } } if(!k) printf("\n\n 沒有關於該學號的任何資訊\n"); fclose(fp); } void dorsearch () //按房號搜尋函式 { int k=0; char fhkey[30]; student *person; person=(student *)malloc(sizeof(student)); printf("\n 請您輸入想要查詢的房號"); scanf("%s",fhkey); if((fp=fopen(filename,"rb"))==NULL) { printf("\n 無法開啟檔案"); exit(0); } while(!feof(fp)) { fscanf(fp,"%s %s %s %s\n",person->name,person->num,person->dor,person->group); if(!strcmp(fhkey,person->dor)) { printf("\n\n 已經為您找到 以下是記錄:\n\n"); printf("%-20s%-20s%-20s%-20s\n","姓名","學號","房號","班級"); printf("%-20s%-20s%-20s%-20s\n",person->name,person->num,person->dor,person->group); k=1; } } if(!k) printf("\n\n 沒有關於此房號的任何資訊\n"); fclose(fp); } void add() //插入函式 用於像已有檔案插入一條新的學生資訊記錄 { student *person; person=(student *)malloc(sizeof(student)); if((fp=fopen(filename,"a"))==NULL) { printf("\n 無法開啟檔案");exit(0);} printf("\n 請您輸入學生姓名 學號 房號 班級 \n"); scanf("%s %s %s %s",person->name,person->num,person->dor,person->group); fprintf(fp,"%-10s%-10s%-10s%-10s\n",person->name,person->num,person->dor,person->group); fclose(fp); } void modify() //更新函式 用於修改指定學生姓名的記錄 { int k=0; long offset; char namekey[10]; student *person; person=(student *)malloc(sizeof(student)); printf("\n 請您輸入想要更改的學生的姓名 :"); scanf("%s",namekey); if((fp=fopen(filename,"r+"))==NULL) { printf("\n 無法開啟檔案"); exit(0);} while(!feof(fp)) { offset=ftell(fp); fscanf(fp,"%s %s %s %s\n",person->name,person->num,person->dor,person->group); if(!strcmp(namekey,person->name)) //比較是否相同 如 {k=1; break;} } if(k) //相同 輸出記錄並進行修改 { printf("\n 記錄輸出如下:\n\n"); printf("%-20s%-20s%-20s%-20s\n","姓名","學號","房號","班級"); printf("%-20s%-20s%-20s%-20s\n",person->name,person->num,person->dor,person->group); printf("\n 請您輸入新的學生姓名 學號 房號 班級:\n"); scanf("%s %s %s %s",person->name,person->num,person->dor,person->group); fseek(fp,offset,SEEK_SET); fprintf(fp,"%-10s%-10s%-10s%-10s\n",person->name,person->num,person->dor,person->group); } else printf("\n 沒有關於該姓名的任何記錄\n"); fclose(fp); } void deleted() //刪除函式 用於刪除指定學生姓名的記錄 { int k=0; char m; long offset; char namekey[10]; student *person; person=(student *)malloc(sizeof(student)); printf("\n請您輸入想要刪除的姓名:"); scanf("%s",namekey); if((fp=fopen(filename,"r+"))==NULL) { printf("\n 無法開啟檔案 "); exit(0); } while(!feof(fp)) //此迴圈遍歷整個檔案 查詢需要刪除的記錄 { offset=ftell(fp); fscanf(fp,"%s %s %s %s\n",person->name,person->num,person->dor,person->group); if(!strcmp(namekey,person->name)) { k=1; break; } } if(k) { printf("\n 記錄輸出如下:\n\n"); printf("%-20s%-20s%-20s%-20s\n","姓名","學號","房號","班級"); printf("%-20s%-20s%-20s%-20s\n",person->name,person->num,person->dor,person->group); printf("\n 您真的確定要刪除?y/n?"); scanf("%s",&m); if(m=='y') //刪除確認按鈕 { fseek(fp,offset,SEEK_SET); //刪除記錄 fprintf(fp,"%-10s%-10s%-10s%-10s\n","","","",""); } else rewind(fp); } else printf("\n 沒有關於該姓名的任何記錄\n"); fclose(fp); } int main() //主函式 { int m,flag=1; // m用於控制選單的選擇項 flag用於控制選單彈出 while(flag) { printf("%40s\n","平頂山大學宿舍管理系統"); printf("--------------------------------------------------------------------------------\n"); printf("\t\t0 ------------ 建立檔案\n"); printf("\t\t1 ------------ 開啟檔案\n"); printf("\t\t2 ------------ 姓名查詢\n"); printf("\t\t3 ------------ 學號查詢\n"); printf("\t\t4 ------------ 房號查詢\n"); printf("\t\t5 ------------ 修改記錄\n"); printf("\t\t6 ------------ 刪除記錄\n"); printf("\t\t7 ------------ 增加紀錄\n"); printf("\t\t8 ------------ 輸出記錄\n"); printf("\t\t9 ------------ 退出\n"); printf("--------------------------------------------------------------------------------\n"); printf("\t 請輸入0-9選擇您的操作:\n"); scanf("%d",&m); switch(m) { case 0:creat(); break; case 1:readfile(); break; case 2:namesearch (); break; case 3:numsearch(); break; case 4:dorsearch(); break; case 5:modify(); break; case 6: deleted(); break; case 7:add(); break; case 8:output(); break; case 9:exit(0); default:break; } } }
測試資料:
小杰 1701 101 001
小飛 1702 102 002
小豪 1703 103 003
小來 1704 104 004
小帥 1706 106 006
小陽 1705 105 005
#
第一次使用先輸入0然後輸入資料(以#結束)進行建立data.txt檔案