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;
}

猜你喜欢

转载自blog.csdn.net/qq_36818386/article/details/81383799
今日推荐