学习内容:
1、初始化菜单栏
首先考虑好需要实现内容(1)输入学生信息(2)查找学生信息(3)删除学生信息
(4)修改学生信息(5)插入学生信息(6)学生成绩排名(7)统计学生总数(8)显示所有信息
(9)退出系统
函数waitConfirm():清楚缓冲区使用rewind(stdin)和getchar函数获取输入的字符(多为回车键)
控制板的背景颜色选择: system("color 7d");

全局变量设置:
#define MAX_COUNT 1000 //学生人数
#define RECORDER_PER_PAGE 10 //一页显示数目
struct student
{
int num;//学号
char name[16];//姓名
int clanguage;//C语言
int algo;//算法
int database;//数据库
int sum;//总成绩
};
static char head[][COL_LEN_MAX] = {
"学号","姓名","C语言","算法","数据库","总分"
};
student stu[MAX_COUNT]; //输入学生信息存放
student stu1[MAX_COUNT]; //成绩排序后的学生信息
int studentCount = 0;//学生个数!!!
int flag = 0;//flag为0则输入学生信息顺序展示,flag为1则按照成绩排序后的学生信息展示
2、文件使用
(1)读文件init()
fopen():第一个参数打印的文件名如果没有自动生成,第二个参数打开方式
feof():判断读取的文件是否结束
fread():将文件内容读入stu数组中每次读取一个学生的所有信息,读一次,读的内容为fp,读取成功返回1
FILE *fp = fopen("studentdata.txt", "rb");//FILE文件指针,"rb"只读+二进制
if (fp == NULL) { //判断读取的文件是否为空
studentCount = 0;
return;
}
int i = 0;//记录文件中学生人数
while (!feof(fp))
{
int ret = fread(&stu[i], sizeof(struct student), 1, fp);
if (ret == 1) i++;
}
studentCount = i;
(2)写文件save()
bool save() {
//覆盖式写入操作
FILE *fp = fopen("studentdata.txt", "wb");
if (fp == NULL) {
fclose(fp);
return false;
}
for (int i = 0; i < studentCount; i++) {
int ret = fwrite(&stu[i], sizeof(struct student), 1, fp);
//一次写入一组学生的信息,写入成功返回1
if (ret != 1) {
fclose(fp);
return false;
}
}
fclose(fp);
return true;
}
3、实现分页数据展示showPahe()
void showPage(int starIndex, int endIndex) {
if (endIndex >= studentCount)
endIndex = studentCount - 1;
if ((endIndex - starIndex + 1) > RECORDER_PER_PAGE)
endIndex = starIndex + RECORDER_PER_PAGE - 1;
char row[6][COL_LEN_MAX];
system("cls");
printTableHead(TABLE_WIDTH, 6);//打印表头
printTableRow(TABLE_WIDTH,head,sizeof(head)/sizeof(head[0]));//打印首行
printTableMidLine(TABLE_WIDTH, 6);//打印内部数据
for (int i = starIndex; i <= endIndex; i++) {
if (flag == 0) {//按输入先后排序
sprintf(row[0], "%d", stu[i].num);
sprintf(row[1], "%s", stu[i].name);
sprintf(row[2], "%d", stu[i].clanguage);
sprintf(row[3], "%d", stu[i].algo);
sprintf(row[4], "%d", stu[i].database);
sprintf(row[5], "%d", stu[i].sum);
}
else if (flag == 1) {//打印排序后的信息
sprintf(row[0], "%d", stu1[i].num);
sprintf(row[1], "%s", stu1[i].name);
sprintf(row[2], "%d", stu1[i].clanguage);
sprintf(row[3], "%d", stu1[i].algo);
sprintf(row[4], "%d", stu1[i].database);
sprintf(row[5], "%d", stu1[i].sum);
}
printTableRow(TABLE_WIDTH, row, 6);
if (i < endIndex)
printTableMidLine(TABLE_WIDTH, 6);
else
printTableTail(TABLE_WIDTH, 6);
}
flag = 0;
}
程序代码:
void input() {
char str[16];
struct student s;
while (1) {
system("cls");
printf("输入学生信息(y/n):>");
rewind(stdin);
scanf("%s", str);
if ((strcmp(str, "Y") != 0) && (strcmp(str, "y") != 0)) {
break;
}
struct student s = inputInfo();
if (searchStu(s.num) >= 0) {//判断学号是否已经存在
printf("学号:%d以及存在!\n", s.num);
waitConfirm();
continue;
}
stu[studentCount++] = s;//在数组stu尾部添加学生信息
if (!save())
printf("保存失败!\n");
else
printf("保存成功!\n");
}
waitConfirm();
printf("\n结束输入!\n");
}
void search() {
int stunum = 0;
system("cls");
printf("请输入学号:>");
scanf("%d", &stunum);
int i = searchStu(stunum);
if (i < 0) {
printf("没有找到该学生信息!\n");
return;
}
char row[6][COL_LEN_MAX];
printTableHead(TABLE_WIDTH, 6);
printTableRow(TABLE_WIDTH, head, sizeof(head) / sizeof(head[0]));
printTableMidLine(TABLE_WIDTH, 6);
sprintf(row[0], "%d", stu[i].num);
sprintf(row[1], "%s", stu[i].name);
sprintf(row[2], "%d", stu[i].clanguage);
sprintf(row[3], "%d", stu[i].algo);
sprintf(row[4], "%d", stu[i].database);
sprintf(row[5], "%d", stu[i].sum);
printTableRow(TABLE_WIDTH, row, 6);
printTableTail(TABLE_WIDTH, 6);
}
void del() {
FILE* fp;
int stunum3;
char str[16] = "";
system("cls");
printf("请输入需要删除的学生信息:>");
scanf("%d", &stunum3);
int i = searchStu(stunum3);
if (i < 0) {
printf("没有找到该学生信息!\n");
return;
}
printf("找到该学生信息,是否删除(y/n):>");
scanf("%s", str);
if (strcmp(str, "Y") == 0 || strcmp(str, "y") == 0) {
for (int j = i; j < studentCount; j++) {
stu[j] = stu[j + 1];
}
studentCount--;
if (save())
printf("删除成功!\n");
else
printf("保存文件失败!\n");
}
else {
printf("取消删除!\n");
}
}
void modify() {
int stunum1;
system("cls");
printf("请输入需要修改的学生学号:>");
scanf("%d", &stunum1);
int i = searchStu(stunum1);
if (i < 0) {
printf("没有找到该学生信息!\n");
return;
}
printf("找到该学生信息,可进行修改信息!\n");
rewind(stdin);
rewind(stdin);//先清空缓冲区
printf("学号(10位数):>");
scanf("%d", &stu[i].num);
printf("姓名:>");
scanf("%s", &stu[i].name);
printf("C语言成绩(0-100分):>");
scanf("%d", &stu[i].clanguage);
printf("算法成绩(0-100分):>");
scanf("%d", &stu[i].algo);
printf("数据库成绩(0-100分):>");
scanf("%d", &stu[i].database);
stu[i].sum = stu[i].clanguage + stu[i].algo + stu[i].database;
if (save())
printf("修改成功!\n");
else
printf("保存文件失败!\n");
int stunum = 0;
}
void insert() {
int stunum2;
system("cls");
printf("请输入要插入的位置(学号):>");
scanf("%d", &stunum2);
int index = searchStu(stunum2);
if (index < 0) {
printf("没有找到该学生,插入位置错误!\n");
return;
}
struct student s = inputInfo();
int i = searchStu(s.num);
if (i >= 0) {
printf("学号[%d]已经存在!\n", s.num);
return;
}
for (int j = studentCount - 1; j > index; j--) {
stu[j + 1] = stu[j];
}
stu[index + 1] = s;
studentCount++;
if (save())
printf("插入成功!\n");
else
printf("保存文件失败!\n");
}
void sort() {
flag = 1;
int size = sizeof(stu) / sizeof(stu[0]) - 1;
for (int num = 0; num < size; num++)
{
stu1[num] = stu[num];
}
if (studentCount == 0) {
printf("暂无学生信息!\n");
return;
}
for (int i = 0; i < studentCount - 1; i++) {
for (int j = i + 1; j < studentCount; j++) {
if (stu1[i].sum < stu1[j].sum) {
struct student s = stu1[i];
stu1[i] = stu1[j];
stu1[j] = s;
}
}
}
if (!save())
printf("排序后,保存文件失败!\n");
else
show();
}
void total() {
system("cls");
char row[2][COL_LEN_MAX];
printTableHead(TABLE_WIDTH, 2);
sprintf(row[0], "%s", "学生总数");
sprintf(row[1], "%d", studentCount);
printTableRow(TABLE_WIDTH, row, 2);
printTableTail(TABLE_WIDTH, 2);
}
void show() {
system("cls");
if (studentCount == 0) {
printf("暂无有学生信息\n");
return;
}
int pageCount = (studentCount + RECORDER_PER_PAGE - 1) / RECORDER_PER_PAGE; //页数
char buff[64];
for (int i = 0; i < pageCount; i++) {
showPage(i * RECORDER_PER_PAGE, (i + 1) * RECORDER_PER_PAGE - 1);
sprintf(buff, "共%d页 第[%d]页",pageCount,i+1);
printMidInfo(buff);
if (i < studentCount - 1) {
waitConfirm();//显示一页后清空
}
}
flag = 0;
}
学习结果:




需要源代码可自取!!!
链接:https://pan.baidu.com/s/1_OFct_jX_47j7JgIPocZsA?pwd=f43m
提取码:f43m
本文介绍了用C语言开发的学生管理系统的实现过程,包括初始化菜单、文件操作和分页数据显示等功能。学习内容涵盖菜单设计、文件读写及学生信息管理。提供源代码链接供读者参考。
853

被折叠的 条评论
为什么被折叠?



