1. 程式人生 > >C語言學生管理系統

C語言學生管理系統

自己用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;
}