C語言學生管理系統
阿新 • • 發佈:2019-02-19
自己用C語言寫的學生管理系統,資料存入檔案。
#include <stdio.h> #include <stdlib.h> #include "common.h" /* 函式:Show 功能:顯示選單 注意:使用後記得清屏 */ void Show() { system("cls"); //清屏 printf("\t學生資訊管理系統\r\n"); printf("1.增加學生資訊 2.刪除學生資訊 3.修改學生資訊\r\n"); printf("4.查詢學生資訊 5.統計學生資訊 6.顯示學生資料\r\n"); printf("7.磁碟整理 8.退出\r\n"); printf("please close 1-8:"); }
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include "common.h" /* 函式:Add 功能:增加學生資訊 注意:不可以無限制的增加 */ void Add() { int i = 0; int nCount = 0; char aryInput[2] = { 0 }; FILE *pf = NULL; if ((pf = fopen("data.txt", "a+")) == NULL) { printf("不能開啟!\r\n"); } while (!feof(pf)) { if (fread(&Stu[nCount], STU_LENGTH, 1, pf) == 1) { nCount++; //統計當前記錄條數 } } fclose(pf); if (nCount == 0) { printf("沒有記錄,請開始新增:\r\n"); } else { system("cls"); ShowData(); } if ((pf = fopen("data.txt", "wb")) == NULL) { printf("不能開啟!\r\n"); } for (i = 0; i < nCount; i++) { fwrite(&Stu[i], STU_LENGTH, 1, pf); //寫入檔案 } printf("是否要新增學生資訊(y/n):"); scanf("%s", aryInput); while (strcmp(aryInput, "Y") == 0 || strcmp(aryInput, "y") == 0) //判斷是否要錄入新資訊 { printf("請輸入學號:"); scanf("%d", &Stu[nCount].nId); for (i = 0; i < nCount; i++) { if (Stu[i].nId == Stu[nCount].nId) { printf("這個學號已經存在,請按任意鍵繼續!"); } } printf("請輸入姓名:"); scanf("%s", Stu[nCount].szName); printf("請輸入電話號碼:"); scanf("%d", &Stu[nCount].nTel); printf("請輸入C語言成績:"); scanf("%lf", &Stu[nCount].dblCGrade); printf("請輸入生日(年-月-日):"); scanf("%d-%d-%d", &Stu[nCount].Bir.nYear, &Stu[nCount].Bir.nMonth, &Stu[nCount].Bir.nDay); Stu[i].isDel = 1; if (fwrite(&Stu[nCount], STU_LENGTH, 1, pf) != 1) //將新錄入的資訊寫入檔案 { printf("不能儲存!"); } else { printf("%s同學已經儲存!\n", Stu[nCount].szName); nCount++; } printf("是否繼續(y/n):"); scanf("%s", aryInput); } fclose(pf); } /* 函式:Del 功能:刪除學生資訊 注意:是以序號來刪除的 */ void Del() { int i = 0; int nIndex = 0; int nCount = 0; int nDelNumber = 0;//刪除的序號 int nAge = 0; char aryInput[2] = { 0 }; FILE *pf = NULL; if ((pf = fopen("data.txt", "r+")) == NULL) { printf("不能開啟\r\n"); } while (!feof(pf)) { if (fread(&Stu[nCount], STU_LENGTH, 1, pf) == 1) { nCount++; } } fclose(pf); if (nCount == 0) { printf("沒有記錄\r\n"); } ShowData(); printf("請輸入要刪除的學號:"); scanf("%d", &nDelNumber); if (Stu[i].isDel == 0) { printf("此資料已被刪除,請重新輸入\r\n"); system("pause"); } else { for (i = 0; i < nCount; i++) { if (nDelNumber == Stu[i].nId) { printf("找到這個學生,是否刪除(y/n)"); scanf("%s", aryInput); if (strcmp(aryInput, "Y") == 0 || strcmp(aryInput, "y") == 0)//判斷是否要進行刪除 { Stu[i].isDel = 0; } if ((pf = fopen("data.txt", "wb")) == NULL) { printf("不能開啟\r\n"); } for (nIndex = 0; nIndex < nCount; nIndex++)//將更改後的記錄寫入檔案中 { if (fwrite(&Stu[nIndex], STU_LENGTH, 1, pf) != 1) { printf("不能儲存!\r\n"); } } fclose(pf); printf("刪除成功!\r\n"); system("pause"); } } for (i = 0; i < nCount; i++) { if (Stu[i].isDel != 0) { printf("●"); } else if (Stu[i].isDel == 0) { printf("○"); } } system("pause"); } } /* 函式:Mod 功能:修改學生的資訊 注意:修改注意長度 */ void Mod() { int i = 0; int j = 0; int nCount = 0; int nModInput = 0; FILE *pf = NULL; if ((pf = fopen("data.txt", "r+")) == NULL) { printf("不能開啟\r\n"); } while (!feof(pf)) { if (fread(&Stu[nCount], STU_LENGTH, 1, pf) == 1) { nCount++; } } if (nCount == 0) { printf("沒有記錄!\r\n"); fclose(pf); } ShowData(); printf("請輸入要修改的學號:"); scanf("%d", &nModInput); for (i = 0; i < nCount; i++) { if (nModInput == Stu[i].nId)//判斷是否有修改的資訊 { printf("請輸入修改後的姓名:"); scanf("%s", Stu[i].szName); printf("請輸入修改後的電話號碼:"); scanf("%s", &Stu[i].nTel); printf("請輸入修改後的C語言成績:"); scanf("%lf", &Stu[i].dblCGrade); printf("修改成功!"); system("pause"); if ((pf = fopen("data.txt", "wb")) == NULL) { printf("不能開啟\r\n"); } for (j = 0; j < nCount; j++)/*將新修改的資訊寫入檔案中*/ { if (fwrite(&Stu[j], STU_LENGTH, 1, pf) != 1) { printf("不能儲存!\r\n"); } } fclose(pf); } } printf("沒有找到要修改的資訊!\n"); } /* 函式:Search 功能:查詢學生的資訊 注意:可根據姓名學號等查詢 */ void Search() { int i = 0; int j = 0; int nCount = 0; int nAge = 0; //計算出來的年齡 int nSearchInput = 0; //輸入的1234 int nInputId = 0; //輸入的學號 int nInputTel = 0; //輸入的號碼 double dblInputGrade = 0.0f; //輸入的成績 char aryInput[2] = { 0 }; char szInputName[15] = { 0 }; //輸入的姓名 FILE *pf = NULL; if ((pf = fopen("data.txt", "rb")) == NULL) { printf("不能開啟\r\n"); } while (!feof(pf)) { if (fread(&Stu[nCount], STU_LENGTH, 1, pf) == 1) { nCount++; } } fclose(pf); if (nCount == 0) { printf("沒有記錄!\r\n"); } printf("請輸入要查詢的方式1.學號 2.姓名 3.成績 4.號碼:\r\n"); scanf("%d", &nSearchInput); switch (nSearchInput) { case 1: printf("請輸入要查詢的學號:\r\n"); scanf("%d", &nInputId); for (j = 0; j < nCount; j++) { if (nInputId == Stu[j].nId && Stu[j].isDel != 0) { printf("學號 姓名 電話號碼 C語言成績 年齡\t\r\n"); nAge = 2018 - Stu[j].Bir.nYear; printf("%-15d%-15s%-15d%-15.1lf%-15d\r\n", Stu[j].nId, Stu[j].szName, Stu[j].nTel, Stu[j].dblCGrade, nAge); break; } else if (nInputId == Stu[j].nId && Stu[j].isDel == 0) { printf("此條資料已被刪除\r\n"); } } system("pause"); break; case 2: printf("請輸入要查詢的姓名:\r\n"); scanf("%s", szInputName); printf("學號 姓名 電話號碼 C語言成績 年齡\t\r\n"); for (j = 0; j < nCount; j++) { if (strcmp(szInputName, Stu[j].szName) == 0 && Stu[j].isDel != 0) { nAge = 2018 - Stu[j].Bir.nYear; printf("%-15d%-15s%-15d%-15.1lf%-15d\r\n", Stu[j].nId, Stu[j].szName, Stu[j].nTel, Stu[j].dblCGrade, nAge); break; } else if (strcmp(szInputName, Stu[j].szName) == 0 && Stu[j].isDel == 0) { printf("此條資料已被刪除\r\n"); } } system("pause"); break; case 3: printf("請輸入要查詢的成績:\r\n"); scanf("%lf", &dblInputGrade); for (j = 0; j < nCount; j++) { if (dblInputGrade == Stu[j].dblCGrade && Stu[j].isDel != 0) { nAge = 2018 - Stu[j].Bir.nYear; printf("學號 姓名 電話號碼 C語言成績 年齡\t\r\n"); printf("%-15d%-15s%-15d%-15.1lf%-15d\r\n", Stu[j].nId, Stu[j].szName, Stu[j].nTel, Stu[j].dblCGrade, nAge); break; } else if (dblInputGrade == Stu[j].dblCGrade && Stu[j].isDel == 0) { printf("此條資料已被刪除\r\n"); } } system("pause"); break; case 4: printf("請輸入要查詢的號碼:\r\n"); scanf("%d", &nInputTel); printf("學號 姓名 電話號碼 C語言成績 年齡\t\r\n"); for (j = 0; j < nCount; j++) { if (nInputTel == Stu[j].nTel && Stu[j].isDel != 0) { nAge = 2018 - Stu[j].Bir.nYear; printf("%-15d%-15s%-15d%-15.1lf%-15d\r\n", Stu[j].nId, Stu[j].szName, Stu[j].nTel, Stu[j].dblCGrade, nAge); break; } else if (nInputTel == Stu[j].nTel && Stu[j].isDel == 0) { printf("此條資料已被刪除\r\n"); } } } system("pause"); } /* 函式:Statis 功能:統計學生的資訊 注意:只可以統計出學生的最高最低平均分 */ void Statis() { int i = 0; int j = 0; int nCount = 0; double dblSum = 0.0; double dblValue = 0.0; double dblMaxSouce = 0.0; double dblMinSouce = 0.0; FILE *pf = NULL; if ((pf = fopen("data.txt", "r+")) == NULL) { printf("不能開啟\r\n"); } while (!feof(pf)) { if (fread(&Stu[nCount], STU_LENGTH, 1, pf) == 1) { nCount++;//統計記錄學生個數 } } if (nCount == 0) { printf("沒有記錄!\r\n"); fclose(pf); } /*計算平均分*/ for (i = 0; i < nCount; i++) //統計的時候,做個判斷,如果被刪除了,就不做統計 { if (Stu[i].isDel != 0) { dblSum += Stu[i].dblCGrade; } } for (i = 0; i < nCount; i++) //如果那條資料被刪除,總長度自減 { if (Stu[i].isDel == 0) { nCount--; } } dblValue = dblSum / nCount; printf("平均分為:%5.1lf\r\n", dblValue); dblMaxSouce = Stu[0].dblCGrade; dblMinSouce = Stu[0].dblCGrade; for (j = 1; j < nCount; j++) { if (Stu[j].dblCGrade > dblMaxSouce) { dblMaxSouce = Stu[j].dblCGrade; } else if (Stu[j].dblCGrade < dblMinSouce) { dblMinSouce = Stu[j].dblCGrade; } } printf("最高分為:%5.1lf\r\n", dblMaxSouce); printf("最低分為:%5.1lf\r\n", dblMinSouce); system("pause"); fclose(pf); } /* 函式:ShowData 功能:顯示已經輸入的資訊 注意:斷電也可以顯示 */ void ShowData() { int i = 0; int nCount = 0; int nAge = 0; FILE *pf = NULL; pf = fopen("data.txt", "rb"); while (!feof(pf)) { if (fread(&Stu[nCount], STU_LENGTH, 1, pf) == 1) { nCount++; } } fclose(pf); printf("學號 姓名 電話號碼 C語言成績 年齡 是否被刪除(1否/0是)\t\r\n"); for (i = 0; i < nCount; i++) { nAge = 2018 - Stu[i].Bir.nYear; printf("%-15d%-15s%-15d%-15.1lf%-15d%-15d\r\n", Stu[i].nId, Stu[i].szName, Stu[i].nTel, Stu[i].dblCGrade, nAge, Stu[i].isDel); } Fifure(); system("pause"); } /* 函式:Fifure 功能:顯示磁碟分佈圖 注意:空心代表無,實心代表有 */ void Fifure() { int i = 0; int nCount = 0; int nAge = 0; FILE *pf = NULL; pf = fopen("data.txt", "rb"); while (!feof(pf)) { if (fread(&Stu[nCount], STU_LENGTH, 1, pf) == 1) { nCount++; } } fclose(pf); for (i = 0; i < nCount; i++) { if (Stu[i].isDel != 0) { printf("●"); } else if (Stu[i].isDel == 0) { printf("○"); } } } /* 函式:Finish 功能:磁碟整理 注意:定長 */ void Finish() { int i = 0; int j = 0; int nCount = 0; int nIndex = 0;//空心圈的總數 FILE *pf = NULL; if ((pf = fopen("data.txt", "rb")) == NULL) { printf("不能開啟\r\n"); } while (!feof(pf)) { if (fread(&Stu[nCount], STU_LENGTH, 1, pf) == 1) { nCount++; } } fclose(pf); for (i = 0; i < nCount; i++) { if (Stu[i].isDel == 0) { nIndex++; } } int nCurLength = nCount; for (i = 0; i < nIndex; i++) { for (j = 0; j < nCount; j++) { if (Stu[j].isDel == 0) { Stu[j] = Stu[j + 1]; } } nCurLength--; } printf("整理成功\r\n"); if ((pf = fopen("data.txt", "wb")) == NULL) { printf("不能開啟\r\n"); } for (j = 0; j < nCurLength; j++) { if (fwrite(&Stu[j], STU_LENGTH, 1, pf) != 1) { printf("不能儲存!\r\n"); } } fclose(pf); for (i = 0; i < nCount; i++) { if (Stu[i].isDel != 0) { printf("●"); } } system("pause"); }
/************************************************************ Copyright (C), 2017-2018, Tech. Co., Ltd. FileName: File_StuManagement.c Description: 完成對學生資訊的增加,刪除,修改,查詢,統計,顯示,磁碟整理功能 Version: V1.0 Function List: common.h David 17/10/05 1.0 ***********************************************************/ #include <stdio.h> #include <stdlib.h> #include "common.h" /* 函式:main 功能:查詢 */ int main() { int nInput = 0; Show(); scanf("%d", &nInput); while (nInput) { switch (nInput) { case 1: Add(); break; case 2: Del(); break; case 3: Mod(); break; case 4: Search(); break; case 5: Statis(); break; case 6: ShowData(); break; case 7: Finish(); break; case 8: break; default: break; } system("cls"); Show(); //再顯示選單介面 scanf("%d", &nInput); } return 0; }