C语言学生成绩管理系统(专业训练课设)

该系统使用C语言在VS环境下编写,可实现学生信息录入、浏览、成绩修改、分类查询、总成绩统计和课程成绩统计等功能。包括高数、英语、C语言和物理四门课程的成绩管理。用户可以通过学号或姓名查询,系统能按成绩排序并计算平均分、及格率等统计信息。
摘要由CSDN通过智能技术生成

       之前的课设,源码在下面。

要求:

        学生成绩管理系统

主要内容:该系统实现对学生成绩的批量录入、修改、查询、浏览等功能。具体要求如下:

学生信息包括:学号、姓名、入学年月、4门课的成绩等8个成员,试设计学生成绩管理系统,使之能提供以下功能:

1、信息录入:录入每一位学生信息(包括学号、姓名、入学年月和4门课的成绩);

2、信息浏览:输出系统内所有学生的信息;

3、成绩修改:输入学号,修改该生某一门课的成绩;

4、分类查询:按学号或姓名查找学生,输出学生的成绩单;

5、统计学生总成绩:计算每个学生的总分及平均分,并根据学生的平均成绩进行排序;

6、统计每门课程的成绩:计算每一门课程学生的及格率、优秀率等。

        用VS写的,可以直接复制的哦。

#define _CRT_SECURE_NO_WARNINGS
#define Length 60
#define Stu_Num 8
#include<stdio.h>
#include<string.h>
typedef struct {
	float Math_Score,English_Score;
	float C_language_Score, physics_Score;
}School_Class;
typedef struct {//学生信息
	char StuID[Length];//学生学号 
	char Stuname[Length];//姓名
	char in_school_time[Length];//入学时间
	char Stusex[Length];//性别
	School_Class Score; //各科成绩 
	float total_Score;
}Student;
typedef struct {//统计信息
	//平均值
	float Math_Score_average, English_Score_average;
	float C_language_average, physics_Score_average;
	//最大值
	float Math_Score_Max, English_Score_Max;
	float C_language_Max, physics_Score_Max;
	//及格人数
	int Math_Score_pass_count, English_Score_pass_count;
	int C_language_pass_count, physics_Score_pass_count;
	//及格率
	float Math_Score_pass_rate, English_Score_pass_rate;
	float C_language_pass_rate, physics_Score_pass_rate;

} Account_Score_;

Account_Score_ Account_Score;
Student stu[8];//八个学生
 

void Subject_average_Get_Show(Student* stu_arr, int size, int commond);
void Get_Single_Max_Score_Show(Student stu[], int n, int commond);
void Get_Single_Max_Score_Show(Student stu[], int n, int commond);
void Single_pass_rate_Get_Show(Student stu[], int n, int commond);
void All_Score_Sort_Handle(Student* stu, int size);


void Increase_Student_Information()//case2
{
	int n = 0;
	int i; 
	printf("输入几位学生的信息\n");
	scanf(" %d", &n);//总共八位学生
	for (i = 0; i < n; i++) {
	printf("请输入第%d位学生的姓名:\n", i+1);
	scanf(" %s",&stu[i].Stuname);
	printf("请输入第%d位学生的性别:\n", i + 1);
	scanf(" %s", &stu[i].Stusex);
	printf("请输入第%d位学生的学号:\n", i + 1);
	scanf(" %s", &stu[i].StuID);
	printf("请输入第%d位学生的入学时间:\n", i + 1);
	scanf(" %s", &stu[i].in_school_time);
	printf("请输入第%d位学生的C语言成绩:\n", i + 1);
	scanf(" %f", &stu[i].Score.C_language_Score);
	printf("请输入第%d位学生的高数成绩:\n", i + 1);
	scanf(" %f", &stu[i].Score.Math_Score);
	printf("请输入第%d位学生的英语成绩:\n", i + 1);
	scanf(" %f", &stu[i].Score.English_Score);
	printf("请输入第%d位学生的物理成绩:\n", i + 1);
	scanf(" %f", &stu[i].Score.physics_Score);
		if (i == n-1) {
			printf("录入成功");
		}
	}
}


void Search_stu()//case2
{
	int Select;
	char student_Id[Length], student_name[Length];
	int i; 
	while (1)
	{
		printf("------------------------------\n");
		printf("**-------1.按学号查询------**\n");
		printf("**-------2.按姓名查询------**\n");
		printf("**-------3.退出本菜单------**\n");
		printf("-------------------------------\n");
		scanf(" %d", &Select);

		
		switch (Select)
		{
		case 1:printf("请输入需要查找学生的学号:\n");
			scanf(" %s", student_Id);
			for (i = 0; i < Stu_Num; i++)
			{
				if (strcmp(stu[i].StuID, student_Id) == 0)
				{
					printf("学号\t\t姓名\t性别\tC语言\t高数\t英语\t大物\n");
					printf("%s\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", stu[i].StuID, stu[i].Stuname, stu[i].Stusex, stu[i].Score.C_language_Score, stu[i].Score.Math_Score, stu[i].Score.English_Score, stu[i].Score.physics_Score);
					break;//防止下面的一定会输出
				}
				if (i == Stu_Num) {
					printf("没有这个人\n");
				}
			}
			break;
		case 2:printf("请输入需要查找学生的名字:\n");
			scanf(" %s", student_name);
			for (i = 0; i < Stu_Num; i++)
			{
				if (strcmp(stu[i].Stuname, student_name)==0)//变量没对上
				{
					printf("学号\t\t姓名\t性别\tC语言\t高数\t英语\t大物\n");
					printf("%s\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", stu[i].StuID, stu[i].Stuname, stu[i].Stusex, stu[i].Score.C_language_Score, stu[i].Score.Math_Score, stu[i].Score.English_Score, stu[i].Score.physics_Score);
					break;
				}
				if (i == Stu_Num) {
					printf("没有这个人\n");
				}
			}
			break;
		}
		if (Select == 3)break;

	}
}


void delete_student(Student* stu, int n, int index) 
{
	int i;
	if (index < 0 || index >= n) {
		printf("无效的索引值\n");
	}

	for ( i = index; i < n - 1; i++) {
		stu[i] = stu[i + 1]; // 将后面的元素向前移动一位
	}
	n--; // 更新学生数量
	printf("学生信息已删除\n");
}

void Handle_stu_Information()//case 4
{
	int i,j;
	int Select=0;
	int Select_1;
	char student_Id[Length], student_name[Length];
	char input_Id_change[Length], input_name_change[Length];
	char Delect[Length] = {"delect"};
	while (1) {
		
		if (Select == 0) {
		printf("------------------------------\n");
		printf("**-------1.开始修改学生信息------**\n");
		printf("**-------2.退出本菜单------**\n");
		printf("-------------------------------\n");
		printf("------------------------------\n");
		scanf("%d", &Select);
		}
		if (Select == 1) {

			while (1) {
				printf("**以下是所有已有的学生**\n");//制表符隔开
				for (i = 0; i < 8; i++) {
					printf(" 名字%s\t", stu[i].Stuname);
					printf(" 学号%s\t\t\n", stu[i].StuID);
				}
				printf("------------------------------\n");
				printf("**-------1.以学号为索引删除信息------**\n");
				printf("**-------2.以名字为索引删除信息------**\n");
				printf("---------3.退出子菜单------\n");
				printf("------------------------------\n");
				scanf(" %d", &Select_1);
				switch (Select_1)
				{
				case 1://学号
					printf("--输入你要修改学生的学号--\n");
					scanf(" %s", student_Id);
					for (i = 0; i < 8; i++) {								
						if (strcmp(stu[i].StuID, student_Id) == 0) {
								printf("请输入你要修改的信息,若输入delect则删除此同学\n\n");
							scanf(" %s", input_Id_change);
							if (strcmp(input_Id_change, Delect) == 0) {
								delete_student(stu, Stu_Num, i);
							}
						}
					}
					break;
				case 2:
					printf("--输入你要修改学生的姓名--\n");
					scanf(" %s", student_name);
					for (i = 0; i < 8; i++) {
						if (strcmp(stu[i].Stuname, student_name) == 0) {
							printf("请输入你要修改的信息,若输入delect则删除此同学\n\n");
							scanf(" %s", input_name_change);
							if (strcmp(input_name_change, Delect) == 0) {
								delete_student(stu, Stu_Num, i);
							}
						}	
					}

				}
				if (Select_1 == 3) {
					Select = 0;
					Select_1=0;
					break;
				}
			}
			
		}
		else if (Select == 2) {
			break;
		}
		else printf("请输入正确的菜单指令");
	}
	
}

void Account_Stu_All_Score()//case 5
{
	int Select;
	int Select_1;
	int i, j;
	while (1)
	{
		printf("-----------学生成绩汇总--------\n");
		printf("**-------输入你要查询的科目------**\n");
		printf("**-------1.高数------**\n");//以这个顺序写一个函数
		printf("**-------2.大物------**\n");
		printf("**-------3.英语------**\n");
		printf("**-------4.C语言------**\n"); 
		printf("**-------5.总成绩排名------**\n");
		printf("**-------6.退出本菜单------**\n");
		printf("-------------------------------\n");
		scanf(" %d", &Select);

		while (Select >= 1 && Select <= 4) {
					printf("**-------输入你要查询的信息------**\n");
					printf("**-------1.平均分------**\n");
					printf("**-------2.最高分------**\n");
					printf("**-------3.及格率------**\n");
					printf("**-------4.退出子菜单------**\n");
					scanf(" %d", &Select_1);
					switch (Select_1)//平均分
					{
						case 1:
							Subject_average_Get_Show(stu,Stu_Num, Select);//不仅算出来了,而且能够智能显示出来
						break;
						case 2:Get_Single_Max_Score_Show(stu,Stu_Num, Select);
						break;
						case 3:Single_pass_rate_Get_Show(stu, Stu_Num, Select);
					}
					if (Select_1 == 4) {
						Select = 0;
						break;
					}
		}
		if (Select == 5) {
				All_Score_Sort_Handle(stu, Stu_Num);
				printf("排名如下\n");
				for (i = 0; i < Stu_Num; i++) {
					printf("第%d名%s 总分%f\n",i+1,stu[i].Stuname,stu[i].total_Score);
				}
				printf("按1退出\n");
				scanf("%d", &Select_1);
				if (Select_1 == 1) {
					Select = 0;
				}
		}
		

		if (Select == 6) {
			break;
		}
	}
}
void Now_student_Information_Show()//case6
{
	int Select;
	int i;
	while (1) {
		printf("-----------当前所有学生信息查询--------\n");
		printf("**-------1.开始查询-------------------**\n");
		printf("**-------2.退出子菜单------------------**\n");
		scanf(" %d", &Select);
		if (Select == 1) {
			printf("现有学生所有信息如下\n");
			for (i = 0; i < Stu_Num; i++)
			{
				printf("学号\t\t姓名\t性别\t入学时间\tC语言\t高数\t英语\t大物\n");
				printf("%s\t\t%s\t%s\t\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", stu[i].StuID, stu[i].Stuname, stu[i].Stusex, stu[i].in_school_time, stu[i].Score.C_language_Score, stu[i].Score.Math_Score, stu[i].Score.English_Score, stu[i].Score.physics_Score);
			}
		}
		else if (Select == 2) {
			break;
		}
		else printf("请输入正确的命令数字");

	}
}

void ModifyScoreByID_Show(Student* stu, int n, char* id, float c_score) //配合case7
{
	int i;
	for (i = 0; i < n; i++) {
		if (strcmp(stu[i].StuID, id) == 0) {  // 找到需要修改成绩的学生
			stu[i].Score.C_language_Score = c_score;
			printf("已将学号为 %s 的学生的C语言成绩修改为 %.2f\n", id, c_score);
			return;  // 成功修改成绩后,直接返回
		}
	}
	printf("找不到学号为 %s 的学生!\n", id);
}

void ModifyScoreByName_Show(Student* stu, int n, char* name, float c_score)//配合case7
{
	int i;
	for (i = 0; i < n; i++) {
		if (strcmp(stu[i].Stuname, name) == 0) {  // 找到需要修改成绩的学生
			stu[i].Score.C_language_Score = c_score;
			printf("已将姓名为 %s 的学生的C语言成绩修改为 %.2f\n", name, c_score);
			return;  // 成功修改成绩后,直接返回
		}
	}
	printf("找不到姓名为 %s 的学生!\n", name);
}


void Handle_Stu_Score()//case7
{
	int Select,Select_1;
	char student_name[Length];
	char student_id[Length];
	float change_Score;
	int i;
	while (1)
	{
		printf("**-------输入你要修改的科目------**\n");
		printf("**-------1.高数------**\n");//以这个顺序写一个函数
		printf("**-------2.大物------**\n");
		printf("**-------3.英语------**\n");
		printf("**-------4.C语言------**\n");
		printf("**-------5.退出子菜单-------**\n");
		scanf("%d", &Select);
		if (Select >= 1 && Select <= 4) {
				
				while (1) {
					printf("------------------------------\n");
					printf("**-------1.以姓名为索引修改信息------**\n");
					printf("**-------2.以学号为索引修改信息------**\n");
					printf("**-------3.退出子菜单------**\n");
					scanf("%d", &Select);
					if (Select == 1) {
						printf("输入你要修改学生的姓名");
						scanf(" %s", student_name);
						printf("输入你要你要修改的分数");
						scanf(" %f", &change_Score);
						ModifyScoreByName_Show(stu, Stu_Num, student_name, change_Score);
					}
					 if (Select == 2) {
						printf("输入你要修改学生的学号");
						scanf(" %s", student_id);
						printf("输入你要你要修改的分数");
						scanf(" %f", &change_Score);
						ModifyScoreByID_Show(stu, Stu_Num, student_id, change_Score);
					}
					 if (Select == 3)break;
				}
				
		}
		if (Select==5)
		{
			break;
		}
	}

}

int num_select = 0;
void menu_main_show()
{
	printf("\n\n");
	printf("*                 学生信息管理系统                  *\n");
	printf("                  系统功能菜单                       \n");
	printf("----------------------     --------------------------\n");
	printf("**    1、使用帮助        |    2、增加学生信息     **\n");
	printf("**    3、查询学生信息    |   4、删除学生信息      **\n");
	printf("**    5、统计学生总成绩  |    6、显示当前信息      **\n");
	printf("**                7、修改学生成绩               **\n");
	printf("**                 8、退出系统               **\n");
	printf("---------------------- ╮(╯▽╰)╭ --------------------------\n");
	scanf("%d", &num_select);
	switch (num_select)
	{
	case 1:	printf("这是一个学生信息管理系统,为了帮助您更快的了解使用它,请先仔细阅读以下注意事项:\n");
			printf("                  注意事项:                    \n ");
			printf("1、请根据提示进行操作!\n");
			printf("2.输入对应数字获取对应响应!\n");
			printf("3.作者 xy燚(≧﹏ ≦)!\n");
			printf("4.还有,老师菜菜捞捞 (≧﹏ ≦)!\n");
			break;
	case 2:Increase_Student_Information(); break;
	case 3:Search_stu(); break;
	case 4:Handle_stu_Information(); break;
	case 5:Account_Stu_All_Score(); break;
	case 6:Now_student_Information_Show(); break;
	case 7:Handle_Stu_Score(); break;
	}
}


void main()
{
	
	while (1) {
	menu_main_show();
		if (num_select == 8) {
			break;
		}
	}
	printf("成功退出");
}




//float Average_Get(float* arr, int size) 
//{
//	int i;
//	float sum = 0;
//	for (i = 0; i < size; i++) {
//		sum += *(arr + i);  
//	}
//	return sum / size;
//}



//输出对应平均值的函数,减少代码长度,科目与select对应
void Subject_average_Get_Show(Student* stu_arr, int size,int commond) 
{
	float math_sum = 0, english_sum = 0, c_language_sum = 0, physics_sum = 0;
	int i;
	for (i = 0; i < size; i++) {//可以if
		math_sum += (stu_arr + i)->Score.Math_Score;
		english_sum += (stu_arr + i)->Score.English_Score;
		c_language_sum += (stu_arr + i)->Score.C_language_Score;
		physics_sum += (stu_arr + i)->Score.physics_Score;
	}
	Account_Score.C_language_average = c_language_sum / size;
	Account_Score.English_Score_average = english_sum / size;
	Account_Score.Math_Score_average = math_sum / size;
	Account_Score.physics_Score_average = physics_sum / size;

	if(commond==1)printf("高数平均值是 : %f\n", Account_Score.C_language_average);
	if (commond == 2)printf("物理平均值是 : %f\n", Account_Score.physics_Score_average);
	if (commond == 3)printf("英语平均值是 : %f\n", Account_Score.English_Score_average);
	if (commond == 4)printf("C语言平均值是 : %f\n", Account_Score.Math_Score_average);
}

//计算单科最高分
void Get_Single_Max_Score_Show(Student stu[], int n,int commond) 
{
	int i;
	Account_Score.Math_Score_Max = 0;
	Account_Score.physics_Score_Max = 0;
	Account_Score.English_Score_Max = 0;
	Account_Score.C_language_Max = 0;
	for ( i = 0; i < n; i++) {//没必要选择计算,算力充足,可以优化
		if (stu[i].Score.Math_Score > Account_Score.Math_Score_Max) {
			Account_Score.Math_Score_Max = stu[i].Score.Math_Score;
		}
		if (stu[i].Score.physics_Score > Account_Score.physics_Score_Max) {
			Account_Score.physics_Score_Max = stu[i].Score.physics_Score;
		}
		if (stu[i].Score.English_Score > Account_Score.English_Score_Max) {
			Account_Score.English_Score_Max = stu[i].Score.English_Score;
		}

		if (stu[i].Score.C_language_Score > Account_Score.C_language_Max) {
			Account_Score.C_language_Max = stu[i].Score.C_language_Score;
		}		
	}
	if (commond == 1)printf("高数最高分是 %f", Account_Score.Math_Score_Max);
	if (commond == 2)printf("大物最高分是 %f", Account_Score.physics_Score_Max);
	if (commond == 3)printf("英语最高分是 %f", Account_Score.English_Score_Max);
	if (commond == 4)printf("C语言最高分是 %f", Account_Score.C_language_Max);
}

//计算及格率并显示
void Single_pass_rate_Get_Show(Student stu[], int n,int commond) 
{
	int i;
	Account_Score.Math_Score_pass_count = 0;
	
	for (i = 0; i < Stu_Num; i++) {
		if (stu[i].Score.Math_Score >= 60) {
			Account_Score.Math_Score_pass_count++;
		}
		if (stu[i].Score.physics_Score >= 60) {
			Account_Score.physics_Score_pass_count++;
		}
		if (stu[i].Score.English_Score >= 60) {
			Account_Score.English_Score_pass_count++;
		}
		if (stu[i].Score.C_language_Score >= 60) {
			Account_Score.C_language_pass_count++;
		}
	}
	Account_Score.Math_Score_pass_rate = (float)Account_Score.Math_Score_pass_count / Stu_Num;
	Account_Score.physics_Score_pass_rate = (float)Account_Score.physics_Score_pass_count / Stu_Num;
	Account_Score.English_Score_pass_rate = (float)Account_Score.English_Score_pass_count / Stu_Num;
	Account_Score.C_language_pass_rate = (float)Account_Score.C_language_pass_count / Stu_Num;
	
	if (commond == 1)printf("高数及格率是 %f", Account_Score.Math_Score_pass_rate);
	if (commond == 2)printf("大物及格率是 %f", Account_Score.physics_Score_pass_rate);
	if (commond == 3)printf("英语及格率是 %f", Account_Score.English_Score_pass_rate);
	if (commond == 4)printf("C语言及格率是 %f", Account_Score.C_language_pass_rate);
}




void All_Score_Sort_Handle(Student* stu, int size)
{
	int i, j;
	float total_score1;
	float total_score2;
	Student tmp;
	for (i = 0; i < size - 1; i++)
	{
		for (j = 0; j < size - 1 - i; j++) {
			total_score1 = stu[j].Score.Math_Score + stu[j].Score.English_Score + stu[j].Score.C_language_Score + stu[j].Score.physics_Score;
			total_score2 = stu[j + 1].Score.Math_Score + stu[j + 1].Score.English_Score + stu[j + 1].Score.C_language_Score + stu[j + 1].Score.physics_Score;
			if (total_score1 < total_score2) {
				tmp = stu[j];
				stu[j] = stu[j + 1];
				stu[j + 1] = tmp;
			}
		}
	}
	for (i = 0; i < Stu_Num; i++) {
		stu[i].total_Score= stu[i].Score.Math_Score + stu[i].Score.English_Score + stu[i].Score.C_language_Score + stu[i].Score.physics_Score;
	}
}

//sort 函数也可以像上面show一样封装,不过没必要
void Sort_math(Student* stu, int n) 
{
	// 冒泡排序
	int i, j;
	Student tmp;
	for ( i = 0; i < n - 1; i++) {
		for ( j = 0; j < n - 1 - i; j++) {
			if (stu[j].Score.Math_Score < stu[j + 1].Score.Math_Score) {
				 tmp = stu[j];
				stu[j] = stu[j + 1];
				stu[j + 1] = tmp;
			}
		}
	}
}


void Sort_English(Student* stu, int n) 
{
	// 冒泡排序
	int i, j;
	Student tmp;
	for ( i = 0; i < n - 1; i++) {
		for ( j = 0; j < n - 1 - i; j++) {
			if (stu[j].Score.English_Score < stu[j + 1].Score.English_Score) {
				 tmp = stu[j];
				stu[j] = stu[j + 1];
				stu[j + 1] = tmp;
			}
		}
	}
}

void Sort_C_Language(Student* stu, int n) 
{
	// 冒泡排序
	int i, j;
	Student tmp;
	for ( i = 0; i < n - 1; i++) {
		for ( j = 0; j < n - 1 - i; j++) {
			if (stu[j].Score.C_language_Score < stu[j + 1].Score.C_language_Score) {
				 tmp = stu[j];
				stu[j] = stu[j + 1];
				stu[j + 1] = tmp;
			}
		}
	}
}

void Sort_physics(Student* stu, int n)
{
	// 冒泡排序
	int i, j;
	Student tmp;
	for ( i = 0; i < n - 1; i++) {
		for ( j = 0; j < n - 1 - i; j++) {
			if (stu[j].Score.physics_Score < stu[j + 1].Score.physics_Score) {
				 tmp = stu[j];
				stu[j] = stu[j + 1];
				stu[j + 1] = tmp;
			}
		}
	}
}


小到大
//void Sort_Handle(float* arr, int size) {
//	int i, j;
//	float tmp;
//	for (i = 0; i < size - 1; i++) {
//		for (j = 0; j < size - 1 - i; j++) {
//			if (*(arr + j) > *(arr + j + 1)) {  
//				 tmp = *(arr + j);
//				*(arr + j) = *(arr + j + 1);
//				*(arr + j + 1) = tmp;
//			}
//		}
//	}
//}

void Modify_Score(Student* stu, int n, char* id, char* course_name, float new_score)
{
	int i;
	int course_index = -1;  // 记录待修改成绩的课程在结构体中的索引
	for (i = 0; i < n; i++) {
		if (strcmp(stu[i].StuID, id) == 0) {  // 找到需要修改成绩的学生
			if (strcmp(course_name, "C语言") == 0) {
				course_index = 0;
				stu[i].Score.C_language_Score = new_score;
			}
			else if (strcmp(course_name, "高数") == 0) {
				course_index = 1;
				stu[i].Score.Math_Score = new_score;
			}
			else if (strcmp(course_name, "英语") == 0) {
				course_index = 2;
				stu[i].Score.English_Score = new_score;
			}
			else if (strcmp(course_name, "大物") == 0) {
				course_index = 3;
				stu[i].Score.physics_Score = new_score;
			}
			else {
				printf("输入的课程名称错误!\n");
			}
			break;
		}
	}
	if (i == n) {
		printf("找不到学号为 %s 的学生!\n", id);
	}
	else if (course_index == -1) {
		printf("找不到名称为 %s 的课程!\n", course_name);
	}
	else {
		printf("已将学号为 %s 的学生的 %s 成绩修改为 %.2f\n", id, course_name, new_score);
	}
}


成品是这样的哦

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值