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