目录
编写一个C语言程序,实现学生成绩管理系统,至少能够管理30条的成绩信息。其中:学生成绩信息主要包括:学号,姓名,各科成绩(假设四科成绩:数学,英语,政治,程序设计),用结构类型数组保存学生成绩信息;学生成绩信息保存到文件中;注:成绩为良以上的需用文件保存数据;每一功能用函数实现; 具体功能要求如下:
1)【录入】能够从文件中读学生成绩信息,也能够随时录入1条学生成绩信息。
2)【修改】能够随时按学号修改1条学生信息,包括:对已录入的信息进行修改。
3)【删除】能够随时按学号删除1条学生信息。
4)【显示】能够按照要求把结果显示到屏幕上。
5)【查询】能够按照输入要求把查询结果显示到屏幕上(例:按学号查询,结果有一条或没有相应信息显示,或按成绩查询,结果可能有多条记录或没有相应信息显示)。
6【统计】能够按照输入要求统计相应功能(例:统计每门课平均成绩并显示,统计每门课优秀率学生人数并显示)。
7)【存储】能够将当前系统中的所有信息保存到文件中。
- #define MAX_STUDENTS 30
- // 定义结构体类型
- typedef struct Student {
- int id; // 学号
- char name[20]; // 姓名
- int scores[4];// 各科成绩(数学、英语、政治、程序设计)
- }STU;
- STU students[MAX_STUDENTS];
首先我们将学生的信息全部封装成一个结构体,这样我们才能方便后续使用。
- #include
- void menu(void);
- void main(void)
- {
- short int flag = 0;
- menu();
- do
- {
- flag = 1;
- switch (getch())
- {
- case '1':; break;
- case '7':exit(0);
- default: printf("输入有误\n");
- }
- printf("按任意键继续\n");
- getch();
- menu();
- } while (flag == 1);
- }
-
- /*选择菜单*/
- void menu(void)
- {
- system("cls");
- printf("\n");
- printf("*********欢迎进入学生成绩管理系统**************\n");
- printf(" 菜单 \n");
- printf("输入记录-------------------------------------1\n");
- printf("修改记录-------------------------------------2\n");
- printf("删除记录-------------------------------------3\n");
- printf("查询记录-------------------------------------4\n");
- printf("统计记录-------------------------------------5\n");
- printf("显示记录-------------------------------------6\n");
- printf("退出系统-------------------------------------7\n");
- printf("**********************************************\n");
- printf("请输入您的选择\n");
- }
这段代码实现了一个学生成绩管理系统的菜单选择功能。以下是代码的解析:
#include 包含了C语言的标准输入输出库,使得程序可以使用printf和getch等函数。void menu(void); 声明了一个名为menu的函数,该函数没有参数,也没有返回值。void main() 是程序的入口点。short int flag = 0; 声明了一个名为flag的短整型变量,并初始化为0。menu(); 调用了menu函数,用于显示系统的菜单。do {...} while (flag == 1); 是一个do-while循环,用于反复显示菜单,直到用户输入'7'为止。switch (getch()) {...} 用于根据用户的输入执行相应的操作。case '1':; break; 中的break语句用于结束switch语句,防止程序继续执行下一个case。exit(0); 用于退出程序。system("cls"); 用于清空控制台屏幕,这是一个Windows特有的函数。在Linux或macOS下,可以使用system("clear");。- void file_read(void)
- {
- // 定义文件指针 fp,用于指向要读取的文件 "file.txt"
- FILE* fp;
- fp = fopen("file.txt", "r");
-
- // 初始化学生数量为0
- student_cnt = 0;
-
- // 通过循环逐行读取文件中的学生信息
- // 每行数据包括学号、姓名、四门成绩,以空格分隔
- // fscanf 函数将每行数据按照格式化字符串 "%d%s%d%d%d%d" 进行解析,并将结果存储到相应的变量中
- // 如果读取失败,fscanf 返回 -1,循环结束
- while (fscanf(fp, "%d%s%d%d%d%d", &students[student_cnt].id, students[student_cnt].name, &students[student_cnt].scores[0], &students[student_cnt].scores[1], &students[student_cnt].scores[2], &students[student_cnt].scores[3]) != -1)
- {
- // 学生数量加1
- student_cnt++;
- }
-
- // 关闭文件指针
- fclose(fp);
- }
我们通过这个函数将文本文件中的数据,按照格式读取出来,文本中的数据内容以空格分开。并在这个时候更新我们的定义的数据内容。
- void file_wirte(void)
- {
- // 定义一个整型变量 i,用于循环计数
- int i;
-
- // 定义一个文件指针 fp,用于指向要写入的文件 "file.txt"
- FILE* fp;
- fp = fopen("file.txt", "w");
-
- // 通过循环逐个将学生信息写入文件中
- // 循环条件是 i < student_cnt,即学生数量小于文件中的学生数量时继续循环
- for (i = 0; i < student_cnt; i++)
- {
- // 使用 fprintf 函数将学生信息按照指定格式写入文件中
- fprintf(fp, "%d\t%-8s\t%d\t%d\t%d\t%d\n", students[i].id, students[i].name, students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].scores[3]);
- }
-
- // 关闭文件指针
- fclose(fp);
- }
fopen 函数打开文件 "file.txt",并以写入模式 "w" 打开它。如果文件不存在,会创建一个新文件;如果文件已经存在,则会清空文件内容。for 循环逐个将学生信息写入文件中。循环条件是 i < student_cnt,即当学生数量小于文件中的学生数量时继续循环。fprintf 函数将学生信息按照指定格式写入文件中。其中,%d 表示整数类型的数据,\t 表示制表符,%s 表示字符串类型的数据,\n 表示换行符。fclose 函数关闭文件指针。- /*输入检查*/
- int input_check(STU student)
- {
- int rt = 1,x=0;
- if (student.id < 1 || student.id>100)
- {
- rt = 0;
- printf("输入学号不合法\n");
- }
- while (x < 4)
- {
- if (student.scores[x] > 100 || student.scores[x] < 0)
- {
- rt = 0;
- printf("输入成绩%d不合法\n", x);
- }
- x++;
-
- }
- return rt;
- }
定义一个输入检查函数,这个函数的主要作用就说将输入进来的数据合法性进行检查,其中学生号在【1,100】 ,学生的成绩在【0,100】区间内。其他输入均判定为输入不合法。
- void input(void)
- {
- STU student;
- FILE* fp;
- fp = fopen("file.txt", "a+");
- printf("请输入学生的学号、姓名和各科成绩:\n");
- printf("学号:");
- scanf("%d", &student.id);
- printf("姓名:");
- scanf("%s", student.name);
- printf("数学成绩:");
- scanf("%d", &student.scores[0]);
- printf("英语成绩:");
- scanf("%d", &student.scores[1]);
- printf("政治成绩:");
- scanf("%d", &student.scores[2]);
- printf("程序设计成绩:");
- scanf("%d", &student.scores[3]);
-
-
- if (input_check(student))
- {
- printf("添加学生信息成功!!!\n");
- fprintf(fp, "%d\t%s\t%d\t%d\t%d\t%d\n", student.id, student.name, student.scores[0], student.scores[1], student.scores[2], student.scores[3]);
- }
- else
- printf("添加学生信息失败!!!\n");
- fclose(fp);
- }
该函数主要功能是通过scanf分别将输入的数据保存到结构体中,在进行数据检查后,将其写入到文件当中。
-
- void output()
- {
- int i;
- file_read();
- printf("学号\t姓名\t\t数学\t英语\t政治\t程序设计\n");
- for(i=0;i
- printf("%d\t%-8s\t%d\t%d\t%d\t%d\n", students[i].id, students[i].name, students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].scores[3]);
- }
这个函数的主要实现就是调用了文件读取函数file_read();将所有文件中的数据读出来,放在结构体中,我们就可以将它通过表格的样式打印出来了。
修改记录:
- void revamp(void)
- {
- int i,id;
- STU student;
- file_read();
- printf("请输入学号:");
- scanf("%d",&id);
- for (i=0;i
- {
- if (id == students[i].id)
- {
- printf("请输入学生的学号、姓名和各科成绩:\n");
- printf("学号:");
- scanf("%d", &student.id);
- printf("姓名:");
- scanf("%s", student.name);
- printf("数学成绩:");
- scanf("%d", &student.scores[0]);
- printf("英语成绩:");
- scanf("%d", &student.scores[1]);
- printf("政治成绩:");
- scanf("%d", &student.scores[2]);
- printf("程序设计成绩:");
- scanf("%d", &student.scores[3]);
- students[i] = student;
- printf("学生信息修改成功!!!\n");
- break;
- }
- }
- if(i!= student_cnt)
- file_wirte();
- else
- printf("没有找到学生信息!!!\n");
- }
这个函数的主要作用是首先将它的从文本中读取出来,然后 通过学号的方式来查找到学生,将他的信息全部修改,如果没有找到的话,我们就不写入文件了,输出没有找到学生信息。
删除记录:
- void del(void)
- {
- int i, id,flag=0;
- file_read();
- printf("请输入学号:");
- scanf("%d", &id);
- for (i = 0; i < student_cnt; i++)
- {
- if (flag==0&&id == students[i].id)
- {
- flag = 1;
-
- printf("学生信息删除成功!!!\n");
- }
- if (flag == 1)students[i] = students[i+1];
- }
- if (i == student_cnt)
- {
- student_cnt--;
- file_wirte();
- }
- else
- printf("没有找到学生信息!!!\n");
- }
函数的作用是从学生数组中删除具有特定学号的学生信息。函数首先提示用户输入要删除的学生的学号,然后遍历学生数组,查找与输入学号匹配的学生信息。如果找到了匹配的学生信息,函数会将其从数组中删除,并输出“学生信息删除成功!!!”。如果遍历完整个数组后仍未找到匹配的学生信息,则输出“没有找到学生信息!!!”。最后,如果成功删除了学生信息,函数会减少学生数组的长度,并将更新后的数组写回文件。
查找信息:
- void find(void)
- {
- int i,mode ,id, scores,flag=0;
- file_read();
- printf("请输入查询方式(1.学号,2.数学成绩,3.英语成绩、4.政治成绩、5.程序设计成绩):");
- scanf("%d", &mode);
- if (mode == 1)
- {
- printf("请输入学号:");
- scanf("%d", &id);
- }
- else
- {
- printf("请输入成绩:");
- scanf("%d", &scores);
- }
- printf("学号\t姓名\t\t数学\t英语\t政治\t程序设计\n");
- for (i = 0; i < student_cnt; i++)
- {
- if (mode == 1)
- {
- if (id == students[i].id)
- {
- flag = 1;
- printf("%d\t%-8s\t%d\t%d\t%d\t%d\n", students[i].id, students[i].name, students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].scores[3]);
- }
- }
- else
- {
- if (scores == students[i].scores[mode-2])
- {
- flag = 1;
- printf("%d\t%-8s\t%d\t%d\t%d\t%d\n", students[i].id, students[i].name, students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].scores[3]);
- }
-
- }
- }
- if (flag==0)
- printf("没有找到学生信息!!!\n");
- }
函数首先提示用户输入查询方式,包括学号、数学成绩、英语成绩、政治成绩和程序设计成绩等选项。根据用户选择的查询方式,函数会要求用户输入相应的信息(如学号或成绩)。
然后,函数会遍历存储在学生数组中的学生信息,查找与用户输入相匹配的学生信息。如果找到了匹配的学生信息,函数会输出该学生的所有信息(学号、姓名以及各科的成绩)。如果未找到匹配的学生信息,则输出“没有找到学生信息”的提示。
函数首先提示用户输入查询方式,包括平均分和优秀率等选项。根据用户选择的查询方式,函数会进行相应的计算。
在计算平均分时,函数会遍历所有学生的信息,将每个学生的成绩累加到avgor数组中对应的元素中。最后,函数将每个元素的值除以学生的总数,并输出每个科目的平均成绩。
在计算优秀率时,函数同样会遍历所有学生的信息。对于每个科目,函数会累加成绩大于等于90的分数的个数,并将结果保存在avgor数组中对应的元素中。最后,函数将每个元素的值除以学生的总数,并输出每个科目的优秀率。
最终代码:
- #define _CRT_SECURE_NO_WARNINGS
- #include
- #include
- #include
- #include
- #define MAX_STUDENTS 100
-
- // 定义结构体类型
- typedef struct Student {
- int id; // 学号
- char name[20]; // 姓名
- int scores[4];// 各科成绩(数学、英语、政治、程序设计)
- }STU;
- STU students[MAX_STUDENTS];
- int student_cnt = 0;
- void menu(void);
- void input(void);
- void output(void);
- void revamp(void);
- void del(void);
- void find(void);
- void statistics(void);
- void main()
- {
- short int flag = 0;
- menu();
- do
- {
- flag = 1;
- switch (getch())
- {
- case '1':input(); break;
- case '2':revamp(); break;
- case '3':del(); break;
- case '4':find(); break;
- case '5':statistics(); break;
- case '6':output(); break;
- case '7':exit(0);
- default: printf("输入有误\n");
- }
- printf("按任意键继续\n");
- getch();
- menu();
- } while (flag == 1);
- }
-
-
- /*选择菜单*/
- void menu(void)
- {
- system("cls");
- printf("\n");
- printf("*********欢迎进入学生成绩管理系统**************\n");
- printf(" 菜单 \n");
- printf("输入记录-------------------------------------1\n");
- printf("修改记录-------------------------------------2\n");
- printf("删除记录-------------------------------------3\n");
- printf("查询记录-------------------------------------4\n");
- printf("统计记录-------------------------------------5\n");
- printf("显示记录-------------------------------------6\n");
- printf("退出系统-------------------------------------7\n");
- printf("**********************************************\n");
- printf("请输入您的选择\n");
- }
- void file_read(void)
- {
- // 定义文件指针 fp,用于指向要读取的文件 "file.txt"
- FILE* fp;
- fp = fopen("file.txt", "r");
-
- // 初始化学生数量为0
- student_cnt = 0;
-
- // 通过循环逐行读取文件中的学生信息
- // 每行数据包括学号、姓名、四门成绩,以空格分隔
- // fscanf 函数将每行数据按照格式化字符串 "%d%s%d%d%d%d" 进行解析,并将结果存储到相应的变量中
- // 如果读取失败,fscanf 返回 -1,循环结束
- while (fscanf(fp, "%d%s%d%d%d%d", &students[student_cnt].id, students[student_cnt].name, &students[student_cnt].scores[0], &students[student_cnt].scores[1], &students[student_cnt].scores[2], &students[student_cnt].scores[3]) != -1)
- {
- // 学生数量加1
- student_cnt++;
- }
-
- // 关闭文件指针
- fclose(fp);
- }
-
- void file_wirte(void)
- {
- // 定义一个整型变量 i,用于循环计数
- int i;
-
- // 定义一个文件指针 fp,用于指向要写入的文件 "file.txt"
- FILE* fp;
- fp = fopen("file.txt", "w");
-
- // 通过循环逐个将学生信息写入文件中
- // 循环条件是 i < student_cnt,即学生数量小于文件中的学生数量时继续循环
- for (i = 0; i < student_cnt; i++)
- {
- // 使用 fprintf 函数将学生信息按照指定格式写入文件中
- fprintf(fp, "%d\t%-8s\t%d\t%d\t%d\t%d\n", students[i].id, students[i].name, students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].scores[3]);
- }
-
- // 关闭文件指针
- fclose(fp);
- }
-
- /*输入检查*/
- int input_check(STU student)
- {
- int rt = 1, x = 0;
- if (student.id < 1 || student.id>100)
- {
- rt = 0;
- printf("输入学号不合法\n");
- }
- while (x < 4)
- {
- if (student.scores[x] > 100 || student.scores[x] < 0)
- {
- rt = 0;
- printf("输入成绩%d不合法\n", x);
- }
- x++;
-
- }
- return rt;
- }
-
- void input(void)
- {
- STU student;
- FILE* fp;
- fp = fopen("file.txt", "a+");
- printf("请输入学生的学号、姓名和各科成绩:\n");
- printf("学号:");
- scanf("%d", &student.id);
- printf("姓名:");
- scanf("%s", student.name);
- printf("数学成绩:");
- scanf("%d", &student.scores[0]);
- printf("英语成绩:");
- scanf("%d", &student.scores[1]);
- printf("政治成绩:");
- scanf("%d", &student.scores[2]);
- printf("程序设计成绩:");
- scanf("%d", &student.scores[3]);
-
-
-
- if (input_check(student))
- {
- printf("添加学生信息成功!!!\n");
- fprintf(fp, "%d\t%s\t%d\t%d\t%d\t%d\n", student.id, student.name, student.scores[0], student.scores[1], student.scores[2], student.scores[3]);
- }
- else
- printf("添加学生信息失败!!!\n");
- fclose(fp);
- }
-
- void output()
- {
- int i;
- file_read();
- printf("学号\t姓名\t\t数学\t英语\t政治\t程序设计\n");
- for (i = 0; i < student_cnt; i++)
- printf("%d\t%-8s\t%d\t%d\t%d\t%d\n", students[i].id, students[i].name, students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].scores[3]);
- }
-
- void revamp(void)
- {
- int i, id;
- STU student;
- file_read();
- printf("请输入学号:");
- scanf("%d", &id);
- for (i = 0; i < student_cnt; i++)
- {
- if (id == students[i].id)
- {
- printf("请输入学生的学号、姓名和各科成绩:\n");
- printf("学号:");
- scanf("%d", &student.id);
- printf("姓名:");
- scanf("%s", student.name);
- printf("数学成绩:");
- scanf("%d", &student.scores[0]);
- printf("英语成绩:");
- scanf("%d", &student.scores[1]);
- printf("政治成绩:");
- scanf("%d", &student.scores[2]);
- printf("程序设计成绩:");
- scanf("%d", &student.scores[3]);
- students[i] = student;
- printf("学生信息修改成功!!!\n");
- break;
- }
- }
- if (i != student_cnt)
- file_wirte();
- else
- printf("没有找到学生信息!!!\n");
- }
-
-
- void del(void)
- {
- int i, id, flag = 0;
- file_read();
- printf("请输入学号:");
- scanf("%d", &id);
- for (i = 0; i < student_cnt; i++)
- {
- if (flag == 0 && id == students[i].id)
- {
- flag = 1;
-
- printf("学生信息删除成功!!!\n");
- }
- if (flag == 1)students[i] = students[i + 1];
- }
- if (i == student_cnt)
- {
- student_cnt--;
- file_wirte();
- }
- else
- printf("没有找到学生信息!!!\n");
- }
-
- void find(void)
- {
- int i, mode, id, scores, flag = 0;
- file_read();
- printf("请输入查询方式(1.学号,2.数学成绩,3.英语成绩、4.政治成绩、5.程序设计成绩):");
- scanf("%d", &mode);
- if (mode == 1)
- {
- printf("请输入学号:");
- scanf("%d", &id);
- }
- else
- {
- printf("请输入成绩:");
- scanf("%d", &scores);
- }
- printf("学号\t姓名\t\t数学\t英语\t政治\t程序设计\n");
- for (i = 0; i < student_cnt; i++)
- {
- if (mode == 1)
- {
- if (id == students[i].id)
- {
- flag = 1;
- printf("%d\t%-8s\t%d\t%d\t%d\t%d\n", students[i].id, students[i].name, students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].scores[3]);
- }
- }
- else
- {
- if (scores == students[i].scores[mode - 2])
- {
- flag = 1;
- printf("%d\t%-8s\t%d\t%d\t%d\t%d\n", students[i].id, students[i].name, students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].scores[3]);
- }
-
- }
- }
- if (flag == 0)
- printf("没有找到学生信息!!!\n");
- }
-
- void statistics(void)
- {
- int i, j, mode;
- float avgor[4] = { 0,0,0,0 };
- file_read();
- printf("请输入查询方式(1.平均分,2.优秀率>=90):");
- scanf("%d", &mode);
-
- for (i = 0; i < student_cnt; i++)
- {
- if (mode == 1)
- {
- for (j = 0; j < 4; j++)
- {
- avgor[j] += students[i].scores[j];
- }
- }
- else
- {
- for (j = 0; j < 4; j++)
- {
- if (students[i].scores[j] >= 90) avgor[j]++;
- }
- }
- }
-
- if (mode == 1)
- {
- printf("数学平均成绩:%.2f\n", avgor[0] / student_cnt);
- printf("英语平均成绩:%.2f\n", avgor[1] / student_cnt);
- printf("政治平均成绩:%.2f\n", avgor[2] / student_cnt);
- printf("程序设计平均成绩:%.2f\n", avgor[3] / student_cnt);
- }
- else
- {
- printf("数学优秀率:%.2f\n", avgor[0] / student_cnt);
- printf("英语优秀率:%.2f\n", avgor[1] / student_cnt);
- printf("政治优秀率:%.2f\n", avgor[2] / student_cnt);
- printf("程序设计优秀率:%.2f\n", avgor[3] / student_cnt);
- }
- }
调试:
软件准备:
超详细的visual studio 2022图文安装教程+新建一个c语言程序-CSDN博客
测试数据:
学号 姓名 数学 英语 政治 程序设计 001 张三 85 78 90 88 002 李四 92 84 76 89 003 王五 79 86 77 83 004 赵六 88 89 85 91 005 刘七 75 71 79 77 006 陈八 82 87 81 86 007 周九 94 91 93 95 008 吴十 76 79 72 78 009 张十一 89 85 82 88 010 李十二 93 92 91 94 011 王十三 77 75 73 74 012 赵十四 84 83 80 82 013 刘十五 95 94 96 97 014 陈十六 73 72 71 70 015 周十七 86 88 84 85
直接复制测试数据版本:
- 1
- 001
- 张三
- 85
- 78
- 90
- 88
-
- 1
- 002
- 李四
- 92
- 84
- 76
- 89
-
- 1
- 003
- 王五
- 79
- 86
- 77
- 83
-
- 1
- 004
- 赵六
- 88
- 89
- 85
- 91
-
- 1
- 005
- 刘七
- 75
- 71
- 79
- 77
-
- 1
- 006
- 陈八
- 82
- 87
- 81
- 86
-
- 1
- 007
- 周九
- 94
- 91
- 93
- 95
-
- 1
- 008
- 吴十
- 76
- 79
- 72
- 78
-
- 1
- 009
- 张十一
- 89
- 85
- 82
- 88
-
- 1
- 010
- 李十二
- 93
- 92
- 91
- 94
-
- 1
- 011
- 王十三
- 77
- 75
- 73
- 74
-
- 1
- 012
- 赵十四
- 84
- 83
- 80
- 82
-
- 1
- 013
- 刘十五
- 95
- 94
- 96
- 97
-
- 1
- 014
- 陈十六
- 73
- 72
- 71
- 70
-
- 1
- 015
- 周十七
- 86
- 88
- 84
- 85
运行程序后直接复制可以一口气导入15条数据,非常方便,不用一条一条的输入,原理就是在每个数据的前方加一个1选择输入数据,输入完接着下一条数据,ctrl+v 粘贴键是不能使用的哦,需要鼠标右键粘贴。 由于加入代码块会复制其他信息导致程序运行错误,直接以文本方式贴出来。
输入,打印输出功能测试:
将全部代码复制到软件中,点击运行。

之后会显示菜单如下图:

点击该博文中的直接复制数据,我们来测试下输入和输出的功能是否正常。

点击复制按钮。
点开运行窗口的情况下,直接右键就一次性的输入15条学生信息。

回车后,我们输入6就可以显示输入的记录了.
上面这种出现重复的数据这种情况我们需要将文件删除掉,因为多次添加操作的缘故。文件地址在工程根目录。名称为file.txt

删除这个文件重新执行添加信息即可。

统计功能测试:
我们输入"5",即可查询到统计的记录。

本次查询我们选择查询平均分,所以我们输入"1".下面就会输入我们的统计结果了。

其他功能测试:
直接输入后面代表的序号就可以测试相关的功能了。
-
相关阅读:
【Java】和【C语言】实现一个有序数组的二分查找
2024有哪些免费的苹果mac电脑系统清理软件?
R语言ggplot2可视化:使用ggpubr包的ggline函数可视化分组折线图(点线图、line plot)、palette参数自定义不同分组折线图的颜色
《回炉重造 Java 基础》——集合(容器)
nginx 的使用命令
为什么只会编程的程序员无法成为优秀的开发者?
Mac - 安装Nginx
uniapp collapse动态生成多个折叠面板手动展开收起(包括uni-ui版)
Java8新特性
Scala 高阶(七):集合内容汇总(上篇)
-
原文地址:https://blog.csdn.net/Tom_Jerry__/article/details/133962961