小项目_学生管理系统

本文介绍了用C语言开发的学生管理系统的实现过程,包括初始化菜单、文件操作和分页数据显示等功能。学习内容涵盖菜单设计、文件读写及学生信息管理。提供源代码链接供读者参考。

学习内容:

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值