PerformanceManagementSystem

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>//文件包含:exit()函数
#define N 80//宏定义

//菜单
int menu()
{
	int m;
	do{
		printf("\t========成绩管理系统========\n\n");
		printf("\t\t1. 导入初始数据\n");
		printf("\t\t2. 显示信息\n");
		printf("\t\t3. 输入记录\n");
		printf("\t\t4. 删除记录\n");
		printf("\t\t5. 查询信息\n");
		printf("\t\t6. 批量导出数据\n");
		printf("\t\t0. 退出\n\n");
		printf("\t请选择:");
		scanf("%d", &m);

	} while (m < 0 && m>6);//菜单选项外跳出

	return m;
}

//学生信息
typedef struct
{
	char xh[10];//学号
	char xm[20];//姓名,10个汉字以内
	char xb[3];//性别,只能保存一个汉字
	int nl;//年龄
}Student;
//课程信息
typedef struct
{
	char kh[10];//课号,长度10字符以内
	char km[25];//课名,12个汉字以内
	float xf;//课程学分,为一个浮点数
}Course;
//学生选课信息
typedef struct
{
	char xh[10];//学号,长度10字符以下
	char kh[10];//课号
	float c;//成绩,为一个浮点数
}Select;

//学生的成绩单信息
typedef struct
{
	char xh[10];//学号
	char xm[20];//姓名
	float cj[30];//各门课程成绩
	float zpj;//加权平均分
	float zxf;//总修习学分
}Score;
//Score cjlist[N];//学生的成绩信息

//初始化数据
void init(Student slist[], int *scount, Course clist[], int *ccount, Select sclist[], int *sccout)
{
	//读入学生信息
	FILE *fpStu = fopen("D:\\Students.txt", "r");
	if (!fpStu)
	{
		printf("Can't open Students.txt file\n");
		exit(1);;//失败推出程序
	}
	*scount = 0;
	while (!feof(fpStu))
	{
		fscanf(fpStu, "%s %s %s %d", slist[*scount].xh, slist[*scount].xm, slist[*scount].xb, &slist[*scount].nl);
		(*scount)++;
	}
	fclose(fpStu);
	//读入课程信息
	FILE *fpCou = fopen("D:\\Courses.txt", "r");
	if (!fpCou)
	{
		printf("Can't open Courses.txt file\n");
		exit(1);;//失败推出程序
	}
	*ccount = 0;
	while (!feof(fpCou))
	{
		fscanf(fpCou, "%s %s %f", clist[*ccount].kh, clist[*ccount].km, &clist[*ccount].xf);
		(*ccount)++;
	}
	fclose(fpCou);
	//读入选课信息
	FILE *fpSel = fopen("D:\\Select.txt", "r");
	if (!fpSel)
	{
		printf("Can't open Select.txt file\n");
		exit(1);;//失败推出程序
	}
	*sccout = 0;
	while (!feof(fpSel))
	{
		fscanf(fpSel, "%s %s %f", sclist[*sccout].xh, sclist[*sccout].kh, &sclist[*sccout].c);
		(*sccout)++;
	}
	fclose(fpSel);
	printf("成功导入数据\n");
}

//建立成绩单
void create_cjlist(Student slist[], int scount, Select sclist[], int sccount, Course clist[], int ccount, Score cjlist[], int *cjcount)
{
	*cjcount = 0;//成绩单初始化0
	char temp_xh[10] = " ";
	//for (int i = 0; i < sizeof(sclist) / sizeof(Select); i++)
	for (int i = 0; i < sccount; i++)//遍历选课信息
	{
		if(strcmp(sclist[i].xh, temp_xh) != 0)//判断成绩单信息是否已录
		{
			strcpy(temp_xh, sclist[i].xh);//xh复制到temp_xh
			strcpy(cjlist[*cjcount].xh, sclist[i].xh);//成绩单学号

			int i_xh = 0;
			while (strcmp(slist[i_xh].xh, sclist[i].xh) != 0 && i_xh < scount)
				i_xh++;
			if (i_xh == scount)
			{
				printf("未根据学号找到相关学生信息!\n");
				exit(1);//输入数据错误退出程序
			}
			strcpy(cjlist[*cjcount].xm, slist[i_xh].xm);//成绩单姓名

			//cjlist[*cjcout].cj[0] = sclist[i].c;//数学成绩
			for (int i_cc = 0; i_cc < ccount; i_cc++)
			{
				cjlist[*cjcount].cj[i_cc] = sclist[i].c;//数学成绩 英语成绩 计算机成绩
				i++;
			}
			i--;
			//加权平均分
			cjlist[*cjcount].zpj = (cjlist[*cjcount].cj[0] * clist[0].xf + cjlist[*cjcount].cj[1] * clist[1].xf + cjlist[*cjcount].cj[2] * clist[2].xf) / (clist[0].xf + clist[1].xf + clist[2].xf);
			//总学分
			cjlist[*cjcount].zxf = clist[0].xf + clist[1].xf + clist[2].xf;
			(*cjcount)++;
		}
	}
} 

//显示
int disp()//查找功能下的第二级菜单
{
	int i;
	printf("\t\t1.显示学生数据\n");
	printf("\t\t2.显示课程数据\n");
	printf("\t\t3.显示成绩单信息\n");
	printf("\t请选择:");
	scanf("%d", &i);

	return i;//返回选项

}
//显示学生数据
void disp_stud(Student slist[], int scount)
{
	printf("\t------------------------------------------------------\n");
	printf("\t学号		姓名		性别		年龄\n");
	printf("\t------------------------------------------------------\n");
	for (int i = 0; i < scount; i++)
	{
		printf("\t%-15s%-17s%-17s%-15d%\n", slist[i].xh, slist[i].xm, slist[i].xb, slist[i].nl);
		printf("\t------------------------------------------------------\n");
	}
}
//显示课程数据
void disp_course(Course clist[], int ccount)
{
	printf("\t------------------------------------------------------\n");
	printf("\t课号		课名		课程学分\n");
	printf("\t------------------------------------------------------\n");
	for (int i = 0; i < ccount; i++)
	{
		printf("\t%-16s%-16s%-15f%\n", clist[i].kh, clist[i].km, clist[i].xf);
		printf("\t------------------------------------------------------\n");
	}
}
//显示成绩单信息
void disp_cjlist(Score cjlist[], int cjcout, int ccount)
{
	printf("\t---------------------------------------------------------------------------------------------------------\n");
	printf("\t学号		姓名		各门课程成绩			加权平均分		总修习学分\n");
	printf("\t---------------------------------------------------------------------------------------------------------\n");
	for (int i = 0; i < cjcout; i++)
	{
		printf("\t%-15s%-15s", cjlist[i].xh, cjlist[i].xm);
		for (int i_c = 0; i_c < ccount; i_c++)
			printf(" %f", cjlist[i].cj[i_c]);
		printf("\t%-24f%-15f%\n", cjlist[i].zpj, cjlist[i].zxf);
		printf("\t---------------------------------------------------------------------------------------------------------\n");
	}
}

//输入
int input()//查找功能下的第二级菜单
{
	int i;
	printf("\t\t1.学生信息输入\n");
	printf("\t\t2.课程信息输入\n");
	printf("\t\t3.选课信息输入\n");
	printf("\t请选择:");
	scanf("%d", &i);

	return i;//返回选项

}
//学生信息输入
int input_stud(Student slist[], int *scount)
{
	char jixu = 'Y';
	char x[10];
	while (jixu != 'n'&&jixu != 'N')
	{
		printf("输入学生学号:");
		scanf("%s", slist[*scount].xh);
		printf("输入学生姓名:");
		scanf("%s", slist[*scount].xm);
		printf("输入学生性别:");
		scanf("%s", slist[*scount].xb);
		printf("输入学生年龄:");
		scanf("%d", &slist[*scount].nl);
		(*scount)++;
		gets(x);
		printf("输入下一个?(Y/N)\n");
		scanf("%c", &jixu);
	}
	printf("学生信息输入成功!\n");
	return *scount;
}
//课程信息输入
int input_course(Course clist[], int *ccount)
{
	char jixu = 'Y';
	char x[10];
	while (jixu != 'n'&&jixu != 'N')
	{
		printf("输入课程课号:");
		scanf("%s", clist[*ccount].kh);
		printf("输入课程课名:");
		scanf("%s", clist[*ccount].km);
		printf("输入课程学分:");
		scanf("%f", &clist[*ccount].xf);
		(*ccount)++;
		gets(x);
		printf("输入下一个?(Y/N)\n");
		scanf("%c", &jixu);
	}
	printf("课程信息输入成功!\n");
	return *ccount;
}
//选课信息输入
int input_select(Student slist[], int scount, Select sclist[], int *sccount)
{
	char jixu = 'Y';
	char x[10];
	while (jixu != 'n'&&jixu != 'N')
	{
		printf("输入学生学号:");
		char temp_scxh[10];
		scanf("%s", temp_scxh);
		int i_xh = 0;
		while (strcmp(slist[i_xh].xh, temp_scxh) != 0 && i_xh < scount)
			i_xh++;
		if (i_xh == scount)
		{
			printf("未根据学号找到相关学生信息,无法插入选课信息!\n");
			return -1;//错误退出
		}
		strcpy(sclist[*sccount].xh, temp_scxh);//复制
		printf("输入选课课号:");
		scanf("%s", sclist[*sccount].kh);
		printf("输入成绩:");
		float temp_scc;
		scanf("%f", &temp_scc);
		if (-1 <= temp_scc <= 120)
		{
			sclist[*sccount].c = temp_scc;
		}
		else
		{
			printf("输入成绩超出范围\n");
			return -1;
		}
		(*sccount)++;
		gets(x);
		printf("输入下一个?(Y/N)\n");
		scanf("%c", &jixu);
	}
	printf("选课信息输入成功!\n");
	return *sccount;
}

//删除
int delete()
{
	int i;
	printf("\t\t1.删除学生记录\n");
	printf("\t\t2.删除课程记录\n");
	printf("\t\t3.删除选课信息\n");
	printf("\t请选择:");
	scanf("%d", &i);

	return i;//返回选项
}
//删除学生记录
void delete_stud(Student slist[], int *scount)
{
	char temp_x[20];
	printf("\t输入要删除的学生姓名或学号:");
	scanf("%s", temp_x);

	int i = 0;
	while (strcmp(slist[i].xm, temp_x) != 0 && strcmp(slist[i].xh, temp_x) != 0 && i< (*scount))//字符串比较
		i++;
	if (i == (*scount))
	{
		printf("未找到相关学生信息!\n");
		return -1;
	}
	for (int j = i; j < (*scount) - 1; j++)
	{
		strcpy(slist[j].xh, slist[j + 1].xh);//复制字符串
		strcpy(slist[j].xm, slist[j + 1].xm);
		strcpy(slist[j].xb, slist[j + 1].xb);
		slist[j].nl = slist[j + 1].nl;
	}
	(*scount)--;
	printf("该学生信息已删除!\n");
	//return *scount;
}
//删除课程记录
void delete_course(Course clist[], int *ccount)
{
	char temp_k[25];
	printf("\t输入要删除的课程名或课程号:");
	scanf("%s", temp_k);

	int i = 0;
	while (strcmp(clist[i].kh, temp_k) != 0 && strcmp(clist[i].km, temp_k) != 0 && i<*ccount)//字符串比较
		i++;
	if (i == *ccount)
	{
		printf("未找到相关课程信息!\n");
		return -1;
	}
	for (int j = i; j < *ccount - 1; j++)
	{
		strcpy(clist[j].kh, clist[j + 1].kh);//复制字符串
		strcpy(clist[j].km, clist[j + 1].km);
		clist[j].xf = clist[j + 1].xf;
	}
	(*ccount)--;
	printf("该课程信息已删除!\n");
}
//删除选课信息
void delete_select(Select sclist[], int *sccount)
{
	char temp_xh[10];
	printf("\t输入学号删除与其相关的若干课程:");
	scanf("%s", temp_xh);

	int n = 0;
	for (int i = 0; i < *sccount; i++)
	{

		if (strcmp(sclist[i].xh, temp_xh))
		{
			for (int j = i; j < *sccount - 1; j++)
			{
				strcpy(sclist[i].xh, sclist[i + 1].xh);
				strcpy(sclist[i].kh, sclist[i + 1].kh);
				sclist[i].c = sclist[i + 1].c;
			}
			n++;
			(*sccount)--;
		}
	}
	if (n == 0)
	{
		printf("未找到与学号相关的选课信息!\n");
		return -1;
	}

	printf("与学号相关的选课信息已删除!\n");
}

//查询
int query()
{
	int i;
	printf("\t\t1.查询学生信息\n");
	printf("\t\t2.查询课程信息\n");
	printf("\t\t3.查询学生成绩\n");
	printf("\t请选择:");
	scanf("%d", &i);

	return i;//返回选项
}
//查询学生信息
void query_stud(Student slist[], int scount)
{
	char temp_x[20];
	printf("\t输入要查询的学生姓名或学号:");
	scanf("%s", temp_x);
	int i = 0;
	while (strcmp(slist[i].xm, temp_x) != 0 && strcmp(slist[i].xh, temp_x) != 0 && i< scount)//字符串比较
		i++;
	if (i == scount)
	{
		printf("未找到相关学生信息!\n");
		return -1;
	}

	printf("-------------------------------------------------------------------\n");
	printf("学号	姓名	性别	年龄\n");
	printf("-------------------------------------------------------------------\n");
	printf("%-10s%-10s%-10s%-10d%\n",
		slist[i].xh, slist[i].xm, slist[i].xb, slist[i].nl);
	printf("-------------------------------------------------------------------\n");
}
//查询课程信息
void query_course(Course clist[], int ccount)
{
	char temp_k[25];
	printf("\t输入要查询的课程名或课程号:");
	scanf("%s", temp_k);

	int i = 0;
	while (strcmp(clist[i].kh, temp_k) != 0 && strcmp(clist[i].km, temp_k) != 0 && i< ccount)//字符串比较
		i++;
	if (i == ccount)
	{
		printf("未找到相关课程信息!\n");
		return -1;
	}
	printf("-------------------------------------------------------------------\n");
	printf("课号	课名	课程学分\n");
	printf("-------------------------------------------------------------------\n");
	printf("%-10s%-10s%-10f%\n",
		clist[i].kh, clist[i].km, clist[i].xf);
	printf("-------------------------------------------------------------------\n");

}
//查询学生成绩
void query_cjlist(Score cjlist[], int cjcount, int ccount)
{
	char temp_xh[10];
	printf("\t输入要查询学生的学号:");
	scanf("%s", temp_xh);
	int i = 0;
	while ((strcmp(cjlist[i].xh, temp_xh) != 0) && i< cjcount)//字符串比较
		i++;
	if (i == cjcount)
	{
		printf("未找到相关学生信息!\n");
		return -1;
	}
	printf("\t---------------------------------------------------------------------------------------------------------\n");
	printf("\t学号		姓名		各门课程成绩			加权平均分		总修习学分\n");
	printf("\t---------------------------------------------------------------------------------------------------------\n");
	printf("\t%-15s%-15s", cjlist[i].xh, cjlist[i].xm);
	for (int i_c = 0; i_c < ccount; i_c++)
		printf(" %f", cjlist[i].cj[i_c]);
	printf("\t%-24f%-15f%\n", cjlist[i].zpj, cjlist[i].zxf);
	printf("\t---------------------------------------------------------------------------------------------------------\n");


	//printf("-------------------------------------------------------------------\n");
	//printf("学号	姓名	各门课程成绩	加权平均分	总修习学分\n");
	//printf("-------------------------------------------------------------------\n");
	//printf("%-10s%-10s%", cjlist[i].xh, cjlist[i].xm);
	//for (int i_cj = 0; i_cj < ccount; i_cj++)
	//{
	//	printf("%-10f", cjlist[i_cj].cj);
	//}
	//printf("%-10f%-10f%", cjlist[i].zpj, cjlist[i].zxf);
	//printf("-------------------------------------------------------------------\n");
}

//导出
int write()
{
	int i;
	printf("\t\t1.导出学生、课程、选课信息数据\n");
	printf("\t\t2.导出学生成绩\n");
	printf("\t请选择:");
	scanf("%d", &i);

	return i;//返回选项
}
//导出学生、课程、选课信息数据
void write_to_file1(Student slist[], int scount, Course clist[], int ccount, Select sclist[], int sccount)
{
	//导出学生信息
	FILE *fpStu = fopen("D:\\Students0.txt", "wb");
	if (!fpStu)
	{
		printf("Can't open Students.txt file\n");
		exit(1);;//失败退出程序
	}
	for (int iStu = 0; iStu < scount; iStu++)
	{
		fprintf(fpStu, "%s %s %s %d\n", slist[iStu].xh, slist[iStu].xm, slist[iStu].xb, slist[iStu].nl);
	}
	fclose(fpStu);
	//导出课程信息
	FILE *fpCou = fopen("D:\\Courses0.txt", "wb");
	if (!fpCou)
	{
		printf("Can't open Courses.txt file\n");
		exit(1);;//失败退出程序
	}
	for (int iCou = 0; iCou < ccount; iCou++)
	{
		fprintf(fpCou, "%s %s %f\n", clist[iCou].kh, clist[iCou].km, clist[iCou].xf);
	}
	fclose(fpCou);
	//导出选课信息
	FILE *fpSel = fopen("D:\\Select0.txt", "wb");
	if (!fpSel)
	{
		printf("Can't open Select.txt file\n");
		exit(1);;//失败退出程序
	}
	for (int iSel = 0; iSel < sccount; iSel++)
	{
		fprintf(fpSel, "%s %s %f\n", sclist[iSel].xh, sclist[iSel].kh, sclist[iSel].c);
	}
	fclose(fpSel);
}
//导出学生成绩
void write_to_file2(Score cjlist[], int cjcount, int ccount)
{
	FILE *fp;
	if ((fp = fopen("D:\\chengji0.txt", "wb")) == NULL) /* c盘下创建c:\123.txt文件*/
	{
		printf("\nFailed to open file.");
		getchar();
		exit(1);
	}
	for (int i = 0; i < cjcount; i++)
	{
		fprintf(fp, "%s %s ", cjlist[i].xh, cjlist[i].xm);
		for (int i_cj = 0; i_cj < ccount; i_cj++)
		{
			fprintf(fp, "%f ", cjlist[i_cj].cj);
		}
		fprintf(fp, "%f %f\n", cjlist[i].zpj, cjlist[i].zxf);
	}

	fclose(fp);
	printf("成功导出学生成绩\n");
}

int main()//主函数
{
	Student slist[N];//用来记录学生信息的数组存储
	int scount;//学生信息总量
	Course clist[N];//用来记录课程信息的数组存储
	int ccount;
	Select sclist[N];//学生选课信息和成绩
	int sccount;
	Score cjlist[N];//成绩
	int cjcount;

	for (;;)//死循环
	{
		switch (menu())
		{
		case 1:init(slist, &scount, clist, &ccount, sclist, &sccount); create_cjlist(slist, scount, sclist, sccount, clist, ccount, cjlist, &cjcount); break;
		case 2:
			switch (disp())
			{
			case 1:disp_stud(slist, scount); break;
			case 2:disp_course(clist, ccount); break;
			case 3:disp_cjlist(cjlist, cjcount, ccount); break;
			} break;
		case 3:
			switch (input())
			{
			case 1:input_stud(slist, &scount); break;
			case 2:input_course(clist, &ccount); break;
			case 3:input_select(slist, scount, sclist, &sccount); break;
			} break;
		case 4:
			switch (delete())
			{
			case 1:delete_stud(slist, &scount); break;
			case 2:delete_course(clist, &ccount); break;
			case 3:delete_select(sclist, &sccount); break;
			} break;
		case 5:
			switch (query())
			{
			case 1:query_stud(slist, scount); break;
			case 2:query_course(clist, ccount); break;
			case 3:query_cjlist(cjlist, cjcount, ccount); break;
			} break;
		case 6:
			switch (write())
			{
			case 1:write_to_file1(slist, scount, clist, ccount, sclist, sccount); break;
			case 2:write_to_file2(cjlist, cjcount, ccount); break;
			} break;
		case 0:exit(0); break;
		default:printf("*输入错误!*"); break;
		}
	}
	return 0;
}

chengji0.txt
01 Xiaoli 0.000000 0.000000 0.000000 90.000000 10.000000
02 Xiaowang 0.000000 0.000000 0.000000 85.000000 10.000000
03 Xiaozhang 0.000000 0.000000 0.000000 80.000000 10.000000

Courses0.txt:
000001 Math 5.000000
000002 English 2.500000
000003 Computer 2.500000

Select0.txt
01 000001 90.000000
01 000002 90.000000
01 000003 90.000000
02 000001 85.000000
02 000002 85.000000
02 000003 85.000000
03 000001 80.000000
03 000002 80.000000
03 000003 80.000000
Students0.txt
01 Xiaoli nan 20
02 Xiaowang nan 20
03 Xiaozhang nv 20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值