C语言课题项目设计——学生成绩管理系统(附加源码)

【项目】------学生管理系统

目录

一:分析学生信息管理系统中对象特征

二:分析学生信息管理系统中的对象------学生

三:分析学生信息管理系统------系统

[四:分析学生信息管理系统各个功能------增,删,改,查,. . . . . .](#四:分析学生信息管理系统各个功能——增,删,改,查,. . . . . .)

五:加密学生信息管理系统

六:学生信息管理系统源码:

[Student_InfoManage_Func.h 代码实现:](#Student_InfoManage_Func.h 代码实现:)

[Student_InfoManage_Func.cpp 代码实现:](#Student_InfoManage_Func.cpp 代码实现:)

[Student_InfoManage_Main.cpp 代码实现:](#Student_InfoManage_Main.cpp 代码实现:)


一:分析学生信息管理系统各式特征

首先,在设计学生信息管理系统时,需要对系统的"主人公"学生进行一系列的特征分析。即一个学生含有姓名、性别、年龄、学号、成绩等等的一系列特征。所以对学生这一个对象的描述就需要使用结构体这一概念功能的用法。

其次,在对学生这一个对象进行特征分析叙述之后,就需对整个学生管理系统进行分析说明,其中一个学生信息管理系统中包含有多个学生,有为了方便对整个学生信息管理系统的学生进行统计其个数而需要的一个变量size(用于统计信息系统内学生的个数),还有对整个学生管理信息系统的整体容量大小(变量capacity)进行严格的把控。

然后,要对整个学生管理系统的功能进行分析,其中功能具体有:添加学生信息,删除学生信息,修改学生信息,查询学生信息,显示系统内全部学生信息,排序系统内学生信息,清空系统内学生信息等等功能。当然还有系统与文件进行交互时,需要进行文件操作的保存学生信息和获取学生信息的功能。

最后,为了更好地使该学生系统更加的安全可靠,就对其进行了加密处理,即确定其身份并输入其密码才可进入该系统中。

二:分析学生信息管理系统中的对象------学生

一个学生信息特征包含姓名、学号、年龄、性别、成绩等,这就需要一个结构体来描述。

三:分析学生信息管理系统------系统

一个学生管理系统内包含由一个学生类型的数组,用来统计学生个数的变量size,和一个用来改变该系统容量大小的变量capacity。

四:分析学生信息管理系统各个功能------增,删,改,查,. . . . . .

4.1:初始化系统

4.2:添加学生信息

运行结果:

4.3:删除学生信息

运行结果:

4.4:修改学生信息

cs 复制代码
//修改enum
enum Edit_Switch
{
	Edit_Name = 1,
	Edit_Sid,
	Edit_Age,
	Edit_Sex,
	Edit_Grade,
	Edit_All
};


// 找某一个学生是否存在
int Find_Stu(InfoManage& pg, char* name)
{
	for (int i = 0; i < pg.size; i++)
	{
		if (strcmp(name, pg.data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}

// 修改信息菜单
void Edit_Menu()
{
	cout << "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl;
	cout << "@        1.修改学生姓名       @" << endl;
	cout << "@        2.修改学生学号       @" << endl;
	cout << "@        3.修改学生年龄       @" << endl;
	cout << "@        4.修改学生性别       @" << endl;
	cout << "@        5.修改学生成绩       @" << endl;
	cout << "@        6.修改学生全部信息   @" << endl;
	cout << "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl;
}

// 修改学生信息
void Tea_Manage_Edit(InfoManage& pg)
{
	assert(pg.data);
	cout << "请输入要修改的学生的姓名:> ";
	char edit_name[Name_Max] = { 0 };
	cin >> edit_name;
	int i = Find_Stu(pg, edit_name);
	if (i >= 0)
	{
		int edit_input = 0;
		Edit_Menu();
		cout << "请输入你的选择:=> ";
		cin >> edit_input;
		switch (edit_input)
		{
		case Edit_Name:
			cout << "请输入修改后的姓名:>";
			cin >> pg.data[i].name;

			break;
		case Edit_Sid:
			cout << "请输入修改后的学号:>";
			cin >> pg.data[i].sid;

			break;
		case Edit_Age:
			cout << "请输入修改后的年龄:>";
			cin >> pg.data[i].age;

			break;
		case Edit_Sex:
			cout << "请输入修改后的性别:>";
			cin >> pg.data[i].sex;
			
			break;
		case Edit_Grade:
			cout << "请输入修改后的成绩:>";
			cin >> pg.data[i].grade;

			break;
		case Edit_All:
			cout << "请输入修改后的姓名:>";
			cin >> pg.data[i].name;

			cout << "请输入修改后的学号:>";
			cin >> pg.data[i].sid;

			cout << "请输入修改后的年龄:>";
			cin >> pg.data[i].age;

			cout << "请输入修改后的性别:>";
			cin >> pg.data[i].sex;

			cout << "请输入修改后的成绩:>";
			cin >> pg.data[i].grade;

			break;
		default:
			cout << "你的输入非法,请重新输入" << endl;
			break;
		}
		if (edit_input >= 1 && edit_input <= 6)
			cout << "修改信息成功" << endl;
	}
	else
	{
		cout << "该系统查无此人" << endl;
	}
}

运行结果:

4.5:查询学生信息

运行结果:

4.6:显示学生信息

运行结果:

4.7:排序学生信息

运行结果:

4.8:保存学生信息

运行结果:

data.txt文件中:

4.9:从文件中获取学生信息数据

在程序开始时直接将data.txt文件中的数据拿出来放入该系统中进行处理。

运行结果:

4.10:清空学生信息

运行结果:

4.11:退出系统

运行结果:

五:加密学生信息管理系统

cs 复制代码
void Stu_Main(InfoManage& img)
{
	// 假设:账号:2211100001,密码:222222
	cout<<"请输入账号(学号)和密码(身份证后六位):>" << endl;
	cout << "请输入账号:=> ";
	char account[20] = { 0 };
	cin >> account;
	cout << "请输入密码:=> ";
	char passwd[10] = { 0 };
	cin >> passwd;
	if (strcmp(account, "2211100001") == 0 && strcmp(passwd, "222222") == 0)
	{
		cout << "密码正确,进入学生系统" << endl;
		Stu_M(img);
	}
	else
	{
		cout << "密码错误,请重新输入" << endl;
	}
}

void Tea_Main(InfoManage& img)
{
	// 假设:账号:02001,密码:111111
	cout << "请输入账号(职工号)和密码(身份证后六位):>" << endl;
	cout << "请输入账号:=> ";
	char account[20] = { 0 };
	cin >> account;
	cout << "请输入密码:=> ";
	char passwd[10] = { 0 };
	cin >> passwd;
	if (strcmp(account, "02001") == 0 && strcmp(passwd, "111111") == 0)
	{
		cout << "密码正确,进入学生系统" << endl;
		Tea_M(img);
	}
	else
	{
		cout << "密码错误,请重新输入" << endl;
	}
}

int main()
{
	char iden[10] = { 0 };

	InfoManage img = { 0 };
	// 初始化系统
	Init_Manage(img);

	cout << "请输入你的身份(教师/学生):>";
	cin >> iden;
	if (strcmp(iden, "教师") == 0)
	{
		Tea_Main(img);
	}
	else if (strcmp(iden, "学生") == 0)
	{
		Stu_Main(img);
	}
	else
	{
		cout << " =>输入身份错误,请重新输入<= " << endl;
	}

	return 0;
}

运行结果:

六:学生信息管理系统源码:

Student_InfoManage_Func.h 代码实现:

cpp 复制代码
// 管理员
// 学生
// 密码
// 文件操作

#include<stdlib.h>
#include<assert.h>
#include<iostream>
using namespace std;

#define Name_Max 20
#define Sid_Max 10
#define Sex_Max 5
#define Max_Count 3

//修改enum
enum Edit_Switch
{
	Edit_Name = 1,
	Edit_Sid,
	Edit_Age,
	Edit_Sex,
	Edit_Grade,
	Edit_All
};

// 排序enum
enum Sort_Switch
{
	Sort_Name = 1,
	Sort_Sid,
	Sort_Age,
	Sort_Grade
};

// 学生信息
typedef struct Student_Info
{
	char name[Name_Max];	// 姓名
	char sid[Sid_Max];		// 学号
	int age;				// 年龄
	char sex[Sex_Max];		// 性别
	double grade;			// 成绩
}Student_Info;

// 学生信息系统
typedef struct InfoManage
{
	Student_Info* data;
	int size;
	int capacity;
}InfoManage;


// 初始化系统
void Init_Manage(InfoManage& pg);

// 从文件中获取数据
void Inq_Stu_Data(InfoManage& pg);

// 退出系统
void Tea_Manage_Exit(InfoManage& pg);

// 添加学生信息
void Tea_Manage_Add(InfoManage& pg);

// 删除学生信息
void Tea_Manage_Del(InfoManage& pg);

// 修改学生信息
void Tea_Manage_Edit(InfoManage& pg);

// 查询学生信息
void Tea_Manage_Inq(InfoManage& pg);

// 显示学生信息
void Tea_Manage_Show(InfoManage& pg);

// 排序学生信息
void Tea_Manage_Sort(InfoManage& pg);

// 清空学生信息
void Tea_Manage_Clear(InfoManage& pg);

// 保存学生信息
void Save_Stu_Info(InfoManage& pg);


// 清空缓冲区
void Buffer_Clear();

Student_InfoManage_Func.cpp 代码实现:

cpp 复制代码
// 学生信息管理系统


#include"Student_InfoManage_Func.h"

// 检查容量
void Check_Capacity(InfoManage& pg)
{
	if (pg.capacity == pg.size)
	{
		int newcapacity = pg.capacity == 0 ? 4 : pg.capacity * 2;
		Student_Info* tmp = (Student_Info*)realloc(pg.data, sizeof(Student_Info) * newcapacity);
		if (tmp == nullptr)
		{
			perror("Check_Capacity realloc fail");
			return;
		}
		pg.data = tmp;
		pg.capacity = newcapacity;
	}
}

// 从文件中获取数据
void Inq_Stu_Data(InfoManage& pg)
{
	// 1.打开文件
	FILE* pf = fopen("data.txt", "rb");
	if (pf == nullptr)
	{
		perror("Inq_Stu_Data fopen fail");
		return;
	}
	Student_Info s = { 0 };
	// 读入文件信息
	while (fread(&s,sizeof(Student_Info),1,pf))
	{
		Check_Capacity(pg);

		pg.data[pg.size] = s;
		pg.size++;
	}
	// 3.关闭文件
	fclose(pf);
	pf = nullptr;
}

// 初始化系统
void Init_Manage(InfoManage& pg)
{
	pg.data = (Student_Info*)malloc(sizeof(Student_Info) * Max_Count);
	if (pg.data == nullptr)
	{
		perror("Init_Manage malloc fail");
		exit(-1);
	}
	pg.capacity = Max_Count;
	pg.size = 0;

	Inq_Stu_Data(pg);
}

// 清空缓冲区
void Buffer_Clear()
{
	int ch = 0;
	while ((ch = getchar()) != '\n')
	{
		;
	}
}

// 添加学生信息
void Tea_Manage_Add(InfoManage& pg)
{
	Check_Capacity(pg);

	Buffer_Clear();
	cout << "请输入学生姓名:> ";
	cin >> pg.data[pg.size].name;
	Buffer_Clear();

	cout << "请输入学生学号:> ";
	cin >> pg.data[pg.size].sid;
	Buffer_Clear();

	cout << "请输入学生年龄:> ";
	cin >> pg.data[pg.size].age;
	Buffer_Clear();

	cout << "请输入学生性别:> ";
	cin >> pg.data[pg.size].sex;
	Buffer_Clear();

	cout << "请输入学生成绩:> ";
	cin >> pg.data[pg.size].grade;
	Buffer_Clear();

	pg.size++;
	cout << "学生信息添加成功" << endl;
}

// 找某一个学生是否存在
int Find_Stu(InfoManage& pg, char* name)
{
	for (int i = 0; i < pg.size; i++)
	{
		if (strcmp(name, pg.data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}

// 删除学生信息
void Tea_Manage_Del(InfoManage& pg)
{
	assert(pg.data);
	cout << "请输入要删除的学生的姓名:> ";
	char del_name[Name_Max] = { 0 };
	cin >> del_name;
	int i = Find_Stu(pg, del_name);
	if (i >= 0)
	{
		int j = 0;
		for ( j = i+1; j < pg.size; j++)
		{
			pg.data[j-1] = pg.data[j];
		}
		pg.size--;
		cout << "成功删除该学生信息" << endl;
	}
	else
	{
		cout << "该系统查无此人" << endl;
	}
}

// 修改信息菜单
void Edit_Menu()
{
	cout << "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl;
	cout << "@        1.修改学生姓名       @" << endl;
	cout << "@        2.修改学生学号       @" << endl;
	cout << "@        3.修改学生年龄       @" << endl;
	cout << "@        4.修改学生性别       @" << endl;
	cout << "@        5.修改学生成绩       @" << endl;
	cout << "@        6.修改学生全部信息   @" << endl;
	cout << "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl;
}

// 修改学生信息
void Tea_Manage_Edit(InfoManage& pg)
{
	assert(pg.data);
	cout << "请输入要修改的学生的姓名:> ";
	char edit_name[Name_Max] = { 0 };
	cin >> edit_name;
	int i = Find_Stu(pg, edit_name);
	if (i >= 0)
	{
		int edit_input = 0;
		Edit_Menu();
		cout << "请输入你的选择:=> ";
		cin >> edit_input;
		switch (edit_input)
		{
		case Edit_Name:
			cout << "请输入修改后的姓名:>";
			cin >> pg.data[i].name;
			Buffer_Clear();

			break;
		case Edit_Sid:
			cout << "请输入修改后的学号:>";
			cin >> pg.data[i].sid;
			Buffer_Clear();

			break;
		case Edit_Age:
			cout << "请输入修改后的年龄:>";
			cin >> pg.data[i].age;
			Buffer_Clear();

			break;
		case Edit_Sex:
			cout << "请输入修改后的性别:>";
			cin >> pg.data[i].sex;
			Buffer_Clear();
			
			break;
		case Edit_Grade:
			cout << "请输入修改后的成绩:>";
			cin >> pg.data[i].grade;
			Buffer_Clear();

			break;
		case Edit_All:
			cout << "请输入修改后的姓名:>";
			cin >> pg.data[i].name;
			Buffer_Clear();

			cout << "请输入修改后的学号:>";
			cin >> pg.data[i].sid;
			Buffer_Clear();

			cout << "请输入修改后的年龄:>";
			cin >> pg.data[i].age;
			Buffer_Clear();

			cout << "请输入修改后的性别:>";
			cin >> pg.data[i].sex;
			Buffer_Clear();

			cout << "请输入修改后的成绩:>";
			cin >> pg.data[i].grade;
			Buffer_Clear();

			break;
		default:
			cout << "你的输入非法,请重新输入" << endl;
			break;
		}
		if (edit_input >= 1 && edit_input <= 6)
			cout << "修改信息成功" << endl;
	}
	else
	{
		cout << "该系统查无此人" << endl;
	}
}

// 查询学生信息
void Tea_Manage_Inq(InfoManage& pg)
{
	assert(pg.data);
	cout << "请输入要查询的学生的姓名:> ";
	char Inq_name[Name_Max] = { 0 };
	cin >> Inq_name;
	int i = Find_Stu(pg, Inq_name);
	if (i >= 0)
	{
		printf("%-20s %-10s %-10s %-5s %-10s\n", "姓名", "学号", "年龄", "性别", "成绩");
		printf("%-20s %-10s %-10d %-5s %-10.2lf\n", pg.data[i].name, pg.data[i].sid, pg.data[i].age,
			pg.data[i].sex, pg.data[i].grade);
	}
	else
	{
		cout << "该系统查无此人" << endl;
	}
}

// 显示学生信息
void Tea_Manage_Show(InfoManage& pg)
{
	printf("%-20s %-10s %-10s %-5s %-10s\n", "姓名", "学号", "年龄", "性别", "成绩");
	for (int i = 0; i < pg.size; i++)
	{
		printf("%-20s %-10s %-10d %-5s %-10.2lf\n", pg.data[i].name, pg.data[i].sid, pg.data[i].age,
			pg.data[i].sex, pg.data[i].grade);
	}
}

// 排序菜单
void Sort_Menu()
{
	cout << "@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl;
	cout << "@   1.按照姓名顺序排序   @" << endl;
	cout << "@   2.按照学号顺序排序   @" << endl;
	cout << "@   3.按照年龄顺序排序   @" << endl;
	cout << "@   4.按照成绩顺序排序   @" << endl;
	cout << "@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl;
}

// 姓名排序
int cmp_name(const void* p1, const void* p2)
{
	return (int)strcmp(((Student_Info*)p1)->name, ((Student_Info*)p2)->name);
}
// 学号排序
int cmp_sid(const void* p1, const void* p2)
{
	return (int)strcmp(((Student_Info*)p1)->sid, ((Student_Info*)p2)->sid);
}
// 年龄排序
int cmp_age(const void* p1, const void* p2)
{
	return (int)(((Student_Info*)p1)->age - ((Student_Info*)p2)->age);
}
// 成绩排序
int cmp_grade(const void* p1, const void* p2)
{
	return (int)(((Student_Info*)p1)->grade - ((Student_Info*)p2)->grade);
}

// 排序学生信息
void Tea_Manage_Sort(InfoManage& pg)
{
	assert(pg.data);
	int sort_input = 0;
	Sort_Menu();
	cout << "请输入你的选择:> ";
	cin >> sort_input;
	switch (sort_input)
	{
	case Sort_Name:
		qsort(pg.data, pg.size, sizeof(pg.data[0]), cmp_name);
		break;
	case Sort_Sid:
		qsort(pg.data, pg.size, sizeof(pg.data[0]), cmp_sid);
		break;
	case Sort_Age:
		qsort(pg.data, pg.size, sizeof(pg.data[0]), cmp_age);
		break;
	case Sort_Grade:
		qsort(pg.data, pg.size, sizeof(pg.data[0]), cmp_grade);
		break;
	default:
		cout << "输入非法,请重新输入" << endl;
		break;
	}
	if (sort_input >= 1 && sort_input <= 4)
		cout << "排序成功" << endl;
}

// 退出系统
void Tea_Manage_Exit(InfoManage& pg)
{
	free(pg.data);
	pg.capacity = pg.size = 0;
}

// 清空学生信息
void Tea_Manage_Clear(InfoManage& pg)
{
	assert(pg.data);
	
	pg.size = 0;
}

// 保存学生信息
void Save_Stu_Info(InfoManage& pg)
{
	// 1.打开文件
	FILE* pf = fopen("data.txt", "wb");
	if (pf == nullptr)
	{
		perror("Save_Stu_Info fopen fail");
		exit(-1);
	}
	// 将数据写入文件
	for (int i = 0; i < pg.size; i++)
	{
		fwrite((pg.data) + i, sizeof(Student_Info), 1, pf);
	}
	// 关闭文件
	fclose(pf);
	pf = nullptr;
}

Student_InfoManage_Main.cpp 代码实现:

cs 复制代码
// 学生信息管理系统

// 管理员
// 学生
// 密码
// 文件操作

#include "Student_InfoManage_Func.h"

void Tea_Menu()
{
	cout << "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl;
	cout << "#  0-退出系统        1-添加学生信息  #" << endl;
	cout << "#  2-删除学生信息    3-修改学生信息  #" << endl;
	cout << "#  4-查询学生信息    5-显示学生信息  #" << endl;
	cout << "#  6-排序学生信息    7-清空学生信息  #" << endl;
	cout << "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl;
}

void Tea_M(InfoManage& img)
{
	int input = 0;
	do
	{
		Tea_Menu();
		cout << "请输入你的选择:> ";
		cin >> input;
		switch (input)
		{
		case 0:
			cout << "退出系统" << endl;
			Save_Stu_Info(img);
			Tea_Manage_Exit(img);
			break;
		case 1:
			cout << "添加学生信息" << endl;
			Tea_Manage_Add(img);
			break;
		case 2:
			cout << "删除学生信息" << endl;
			Tea_Manage_Del(img);
			break;
		case 3:
			cout << "修改学生信息" << endl;
			Tea_Manage_Edit(img);
			break;
		case 4:
			cout << "查询学生信息" << endl;
			Tea_Manage_Inq(img);
			break;
		case 5:
			cout << "显示学生信息" << endl;
			Tea_Manage_Show(img);
			break;
		case 6:
			cout << "排序学生信息" << endl;
			Tea_Manage_Sort(img);
			break;
		case 7:
			cout << "清空学生信息" << endl;
			Tea_Manage_Clear(img);
			break;
		default:
			cout << "输入非法,请重新输入" << endl;
			break;
		}
	} while (input);
}

void Tea_Main(InfoManage& img)
{
	// 假设:账号:02001,密码:111111
	cout << "请输入账号(职工号)和密码(身份证后六位):>" << endl;
	cout << "请输入账号:=> ";
	char account[20] = { 0 };
	cin >> account;
	cout << "请输入密码:=> ";
	char passwd[10] = { 0 };
	cin >> passwd;
	if (strcmp(account, "02001") == 0 && strcmp(passwd, "111111") == 0)
	{
		cout << "密码正确,进入学生系统" << endl;
		Tea_M(img);
	}
	else
	{
		cout << "密码错误,请重新输入" << endl;
	}
}

void Stu_M(InfoManage& img)
{
	int input = 0;
	do
	{
		cout << "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl;
		cout << "1-查询信息  2-显示信息  0-退出系统" << endl;
		cout << "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl;
		cout << "请输入你的选择:> ";
		cin >> input;
		switch (input)
		{
		case 0:
			cout << "退出系统成功" << endl;
			break;
		case 1:
			Tea_Manage_Inq(img);
			break;
		case 2:
			Tea_Manage_Show(img);
			break;
		default:
			break;
		}

	} while (input);
}

void Stu_Main(InfoManage& img)
{
	// 假设:账号:2211100001,密码:222222
	cout<<"请输入账号(学号)和密码(身份证后六位):>" << endl;
	cout << "请输入账号:=> ";
	char account[20] = { 0 };
	cin >> account;
	cout << "请输入密码:=> ";
	char passwd[10] = { 0 };
	cin >> passwd;
	if (strcmp(account, "2211100001") == 0 && strcmp(passwd, "222222") == 0)
	{
		cout << "密码正确,进入学生系统" << endl;
		Stu_M(img);
	}
	else
	{
		cout << "密码错误,请重新输入" << endl;
	}
}

int main()
{
	char iden[10] = { 0 };

	InfoManage img = { 0 };
	// 初始化系统
	Init_Manage(img);

	cout << "请输入你的身份(教师/学生):>";
	cin >> iden;
	if (strcmp(iden, "教师") == 0)
	{
		Tea_Main(img);
	}
	else if (strcmp(iden, "学生") == 0)
	{
		Stu_Main(img);
	}
	else
	{
		cout << " =>输入身份错误,请重新输入<= " << endl;
	}

	return 0;
}
相关推荐
tyler_download1 分钟前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
小小小~1 分钟前
qt5将程序打包并使用
开发语言·qt
hlsd#2 分钟前
go mod 依赖管理
开发语言·后端·golang
小春学渗透3 分钟前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc
杜杜的man6 分钟前
【go从零单排】迭代器(Iterators)
开发语言·算法·golang
亦世凡华、6 分钟前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
神仙别闹13 分钟前
基于MFC实现的赛车游戏
c++·游戏·mfc
小c君tt21 分钟前
MFC中 error C2440错误分析及解决方法
c++·mfc
测试界的酸菜鱼21 分钟前
C# NUnit 框架:高效使用指南
开发语言·c#·log4j
GDAL21 分钟前
lua入门教程 :模块和包
开发语言·junit·lua