头歌c语言实训项目-综合案例课外练习:学生成绩管理系统

news2024/12/24 3:08:03

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)

目录

第1关:学生成绩管理系统 

题目:

代码思路:

代码表示:

如何运行程序


第1关:学生成绩管理系统 

题目:

系统介绍

本学生成绩管理系统是为教师人员提供管理班级成绩的工具,该系统可以实现的对学生的成绩进行增、删、改、查、信息保存和信息导入等基本功能,以及对学生成绩排序和分段的扩展功能,有利于对学生成绩管理。

设计思想

利用结构体——定义STU结构体存储学生学号、姓名、各科成绩,总成绩和平均成绩,利用文件来存储,读取数据。

功能描述

(1) 创建学生基本信息,便于之后查询和浏览;

(2) 录入各科学习成绩;

(3) 计算每个学生各门课程的总分和平均分;

(4)计算每门课程的总分和平均分;

(5) 按每个学生的总分由高到低排出名次表;

(6) 按每个学生的总分由低到高排出名次表;

(7) 按学号由小到大排出成绩表;

(8) 按姓名的字母顺序排出成绩表;

(9) 按学号查询学生排名及其考试成绩;

(10) 按姓名查询学生排名及其考试成绩;

(11) 按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;

(12) 输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分;

(13) 将每个学生的记录信息写入文件;

(14) 从文件中读出每个学生的记录信息并显示。

代码思路:

大部分代码题目都已经给出,我们只需要补全 ReadScore()函数,AverSumofEveryCourse()函数,SearchbyNum()函数三个部分即可

1.ReadScore()函数,根据源代码的提示,我们可以得出需要输入学生的学号,姓名,以及五门成绩,而五门成绩则需要以数组的形式录入,所以我们可以将成绩单独放入一个for循环,然后将学号,姓名,成绩放入一个总循环中进行输入

2.AverSumofEveryCourse()函数,要求使用选择排序(http://t.csdn.cn/Rwqtb)的方法,只需要写出一个选择排序即可

3.SearchbyNum()函数,与下面的SearchbyName()函数相似,我们可以在搞清楚SearchbyName()函数后依葫芦画瓢写出SearchbyNum()函数函数

代码表示:

#include  <stdio.h>
#include  <stdlib.h>
#include  <string.h>
#define   MAX_LEN  10                    	// 字符串最大长度 
#define   STU_NUM 30                       // 最多的学生人数 
#define   COURSE_NUM 6                     // 最多的考试科目数 
typedef struct student
{
	long num;						// 每个学生的学号 
	char name[MAX_LEN];            	// 每个学生的姓名 
	float score[COURSE_NUM];		// 每个学生COURSE_NUM门功课的成绩 
	float sum;                   	     // 每个学生的总成绩 
	float aver;               	     // 每个学生的平均成绩 
}STU;
int   Menu(void);
void  ReadScore(STU stu[], int n, int m);
void  AverSumofEveryStudent(STU stu[], int n, int m);
void  AverSumofEveryCourse(STU stu[], int n, int m);
void  SortbyScore(STU stu[], int n, int m, int (*compare)(float a, float b));
int   Ascending(float a, float b);
int   Descending(float a, float b);
void  SwapFloat(float* x, float* y);
void  SwapLong(long* x, long* y);
void  SwapChar(char x[], char y[]);
void  AsSortbyNum(STU stu[], int n, int m);
void  SortbyName(STU stu[], int n, int m);
void  SearchbyNum(STU stu[], int n, int m);
void  SearchbyName(STU stu[], int n, int m);
void  StatisticAnalysis(STU stu[], int n, int m);
void  PrintScore(STU stu[], int n, int m);
void  WritetoFile(STU record[], int n, int m);
void   ReadfromFile(STU record[], int* n, int* m);
int main(void)
{
	char  ch;
	int   n = 0, m = 0;
	STU   stu[STU_NUM];
	printf("Input student number(n<%d):", STU_NUM);
	scanf("%d", &n);
	printf("Input course number(m<=%d):", COURSE_NUM);
	scanf("%d", &m);
	while (1)
	{
		ch = Menu();					    // 显示菜单,并读取用户输入 		
		switch (ch)
		{
		case 1:ReadScore(stu, n, m);
			break;
		case 2: AverSumofEveryCourse(stu, n, m);
			break;
		case 3: AverSumofEveryStudent(stu, n, m);
			break;
		case 4: SortbyScore(stu, n, m, Descending);
			printf("\nSort in descending order by score:\n");
			PrintScore(stu, n, m);
			break;
		case 5: SortbyScore(stu, n, m, Ascending);
			printf("\nSort in ascending order by score:\n");
			PrintScore(stu, n, m);
			break;
		case 6: AsSortbyNum(stu, n, m);
			printf("\nSort in ascending order by number:\n");
			PrintScore(stu, n, m);
			break;
		case 7: SortbyName(stu, n, m);
			printf("\nSort in dictionary order by name:\n");
			PrintScore(stu, n, m);
			break;
		case 8: SearchbyNum(stu, n, m);
			break;
		case 9: SearchbyName(stu, n, m);
			break;
		case 10: StatisticAnalysis(stu, n, m);
			break;
		case 11:PrintScore(stu, n, m);
			break;
		case 12:WritetoFile(stu, n, m);
			break;
		case 13:ReadfromFile(stu, &n, &m);
			break;
		case 0: printf("End of program!");
			exit(0);
		default:printf("Input error!");
		}
	}
	return 0;
}
//  函数功能:显示菜单并获得用户键盘输入的选项 
int Menu(void)
{
	int itemSelected;
	printf("Management for Students' scores\n");
	printf("1.Input record\n");
	printf("2.Calculate total and average score of every course\n");
	printf("3.Calculate total and average score of every student\n");
	printf("4.Sort in descending order by score\n");
	printf("5.Sort in ascending order by score\n");
	printf("6.Sort in ascending order by number\n");
	printf("7.Sort in dictionary order by name\n");
	printf("8.Search by number\n");
	printf("9.Search by name\n");
	printf("10.Statistic analysis\n");
	printf("11.List record\n");
	printf("12.Write to a file\n");
	printf("13.Read from a file\n");
	printf("0.Exit\n");
	printf("Please Input your choice:");
	scanf("%d", &itemSelected); 	// 读入用户输入 
	return itemSelected;
}
// 函数功能:输入n个学生的m门课成绩 
void ReadScore(STU stu[], int n, int m)
{
	int i, j;
	printf("Input student's ID, name and score:\n");
	/* ---------- begain ---------- */
	for (i = 0; i < n; i++)
	{
		scanf("%ld", &stu[i].num);
		scanf("%s", &stu[i].name);
		for (j = 0; j < m; j++)
		{
			scanf("%f", &stu[i].score[j]);
		}
	}
	/* ----------- end ----------- */
}
// 函数功能:计算每个学生各门课程的总分和平均分 
void AverSumofEveryStudent(STU stu[], int n, int m)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		stu[i].sum = 0;
		for (j = 0; j < m; j++)
		{
			stu[i].sum = stu[i].sum + stu[i].score[j];
		}
		stu[i].aver = m > 0 ? stu[i].sum / m : -1;
		printf("student %d: sum = %.0f, aver = %.0f\n",
			i + 1, stu[i].sum, stu[i].aver);
	}
}
// 函数功能:计算每门课程的总分和平均分 
void  AverSumofEveryCourse(STU stu[], int n, int m)
{
	int i, j;
	float sum[COURSE_NUM], aver[COURSE_NUM];
	/* ---------- begain ---------- */
	for (j = 0; j < m; j++)
	{
		sum[j] = 0;
		for (i = 0; i < n; i++)
		{
			sum[j] = sum[j] + stu[i].score[j];
		}
		aver[j] = n > 0 ? sum[j] / n : -1;
		printf("course %d:sum=%.0f, aver=%.0f\n", j + 1, sum[j], aver[j]);
	}
	/* ----------- end ----------- */
}
// 函数功能:按选择法将数组sum的元素值排序 
void SortbyScore(STU stu[], int n, int m, int (*compare)(float a, float b))
{
	int  i, j, k, t;
	for (i = 0; i < n - 1; i++)
	{
		k = i;
		for (j = i + 1; j < n; j++)
		{
			if ((*compare)(stu[j].sum, stu[k].sum)) k = j;
		}
		if (k != i)
		{
			for (t = 0; t < m; t++)             // 交换m门课程的成绩 
			{
				SwapFloat(&stu[k].score[t], &stu[i].score[t]);
			}
			SwapFloat(&stu[k].sum, &stu[i].sum);    // 交换总分 
			SwapFloat(&stu[k].aver, &stu[i].aver); // 交换平均分   
			SwapLong(&stu[k].num, &stu[i].num);     // 交换学号 
			SwapChar(stu[k].name, stu[i].name);     // 交换姓名 
		}
	}
}
// 使数据按升序排序 
int Ascending(float a, float b)
{
	return a < b;     // 这样比较决定了按升序排序,如果a<b,则交换 
}
// 使数据按降序排序 
int Descending(float a, float b)
{
	return a > b;    // 这样比较决定了按降序排序,如果a>b,则交换 
}
// 交换两个单精度浮点型数据 
void  SwapFloat(float* x, float* y)
{
	float  temp;
	temp = *x;
	*x = *y;
	*y = temp;
}
// 交换两个长整型数据 
void  SwapLong(long* x, long* y)
{
	long   temp;
	temp = *x;
	*x = *y;
	*y = temp;
}
// 交换两个字符串 
void  SwapChar(char x[], char y[])
{
	char temp[MAX_LEN];
	strcpy(temp, x);
	strcpy(x, y);
	strcpy(y, temp);
}
// 函数功能:按选择法将数组num的元素值按从低到高排序 
void AsSortbyNum(STU stu[], int n, int m)
{
	int  i, j, k, t;
	for (i = 0; i < n - 1; i++)
	{
		/* ---------- begain ---------- */
		k = i;
		for (j = i + 1; j < n; j++)
		{
			if (stu[j].num < stu[k].num)    k = j;
		}
		if (k != i)
		{
			for (t = 0; t < m; t++)            // 交换m门课程的成绩 
			{
				SwapFloat(&stu[k].score[t], &stu[i].score[t]);
			}
			SwapFloat(&stu[k].sum, &stu[i].sum);    // 交换总分 
			SwapFloat(&stu[k].aver, &stu[i].aver); // 交换平均分   
			SwapLong(&stu[k].num, &stu[i].num);     // 交换学号 
			SwapChar(stu[k].name, stu[i].name);     // 交换姓名 
		}
		/* ----------- end ----------- */
	}
}
// 函数功能:交换法实现字符串按字典顺序排序 
void SortbyName(STU stu[], int n, int m)
{
	int  i, j, t;
	for (i = 0; i < n - 1; i++)
	{
		for (j = i + 1; j < n; j++)
		{
			if (strcmp(stu[j].name, stu[i].name) < 0)
			{
				for (t = 0; t < m; t++)// 交换m门课程的成绩 
				{
					SwapFloat(&stu[i].score[t], &stu[j].score[t]);
				}
				SwapFloat(&stu[i].sum, &stu[j].sum);    // 交换总分 
				SwapFloat(&stu[i].aver, &stu[j].aver); // 交换平均分   
				SwapLong(&stu[i].num, &stu[j].num);     // 交换学号 
				SwapChar(stu[i].name, stu[j].name);     // 交换姓名 
			}
		}
	}
}
// 函数功能:按学号查找学生成绩并显示查找结果 
void SearchbyNum(STU stu[], int n, int m)
{
	long  number;
	int   i, j;
	printf("Input the number you want to search:");
	scanf("%ld", &number);

	/* ---------- begain ---------- */
	for (i = 0; i < n; i++)
	{
		if (number == stu[i].num)
		{
			printf("%ld\t%s\t", stu[i].num, stu[i].name);
			for (j = 0; j < m; j++)
			{
				printf("%.0f\t", stu[i].score[j]);
			}
			printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver);
			return;
		}
	}
	/* ----------- end ----------- */

	printf("\nNot found!\n");
}
// 函数功能:按姓名的字典顺序排出成绩表 
void SearchbyName(STU stu[], int n, int m)
{
	char x[MAX_LEN];
	int  i, j;
	printf("Input the name you want to search:");
	scanf("%s", x);
	for (i = 0; i < n; i++)
	{
		if (strcmp(stu[i].name, x) == 0)
		{
			printf("%ld\t%s\t", stu[i].num, stu[i].name);
			for (j = 0; j < m; j++)
			{
				printf("%.0f\t", stu[i].score[j]);
			}
			printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver);
			return;
		}
	}
	printf("\nNot found!\n");
}
// 函数功能:统计各分数段的学生人数及所占的百分比 
void StatisticAnalysis(STU stu[], int n, int m)
{
	int  i, j, t[6];
	for (j = 0; j < m; j++)
	{
		printf("For course %d:\n", j + 1);
		memset(t, 0, sizeof(t));    // 将数组t的全部元素初始化为0 
		for (i = 0; i < n; i++)
		{
			if (stu[i].score[j] >= 0 && stu[i].score[j] < 60)t[0]++;
			else if (stu[i].score[j] < 70)				   t[1]++;
			else if (stu[i].score[j] < 80)				   t[2]++;
			else if (stu[i].score[j] < 90)				   t[3]++;
			else if (stu[i].score[j] < 100)				   t[4]++;
			else if (stu[i].score[j] == 100)    		   t[5]++;
		}
		for (i = 0; i <= 5; i++)
		{
			if (i == 0) printf("<60\t%d\t%.2f%%\n", t[i], (float)t[i] / n * 100);
			else if (i == 5) printf("%d\t%d\t%.2f%%\n",
				(i + 5) * 10, t[i], (float)t[i] / n * 100);
			else 	printf("%d-%d\t%d\t%.2f%%\n",
				(i + 5) * 10, (i + 5) * 10 + 9, t[i], (float)t[i] / n * 100);
		}
	}
}
// 函数功能: 打印学生成绩 
void PrintScore(STU stu[], int n, int m)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
		printf("%ld\t%s\t", stu[i].num, stu[i].name);
		for (j = 0; j < m; j++)
		{
			printf("%.0f\t", stu[i].score[j]);
		}
		printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver);
	}
}
// 输出n个学生的学号、姓名及m门课程的成绩到文件student.txt中 
void WritetoFile(STU stu[], int n, int m)
{
	FILE* fp;
	int i, j;

	if ((fp = fopen("student.txt", "w")) == NULL)
	{
		printf("Failure to open score.txt!\n");
		exit(0);
	}
	fprintf(fp, "%d\t%d\n", n, m);    //将学生人数和课程门数写入文件
	for (i = 0; i < n; i++)
	{
		fprintf(fp, "%10ld%10s", stu[i].num, stu[i].name);
		for (j = 0; j < m; j++)
		{
			fprintf(fp, "%10.0f", stu[i].score[j]);
		}
		fprintf(fp, "%10.0f%10.0f\n", stu[i].sum, stu[i].aver);
	}
	fclose(fp);
}
//从文件中读取学生的学号、姓名及成绩等信息写入到结构体数组stu中
void ReadfromFile(STU stu[], int* n, int* m)
{
	FILE* fp;
	int i, j;
	if ((fp = fopen("student.txt", "r")) == NULL)
	{
		printf("Failure to open score.txt!\n");
		exit(0);
	}
	fscanf(fp, "%d\t%d", n, m); // 从文件中读出学生人数和课程门数       
	for (i = 0; i < *n; i++)  //学生人数保存在n指向的存储单元
	{
		fscanf(fp, "%10ld", &stu[i].num);
		fscanf(fp, "%10s", stu[i].name);
		for (j = 0; j < *m; j++)//课程门数保存在m指向的存储单元
		{
			fscanf(fp, "%10f", &stu[i].score[j]);          //不能用%10.0f
		}
		fscanf(fp, "%10f%10f", &stu[i].sum, &stu[i].aver);//不能用%10.0f
	}
	fclose(fp);
}

如何运行程序

如何在平台上运行我们的程序呢?

首先,你需要按照下方的编程要求完成我们的代码;

按照下面图里面的步骤输入命令就可以运行我们的程序了!

Stu_Management_System.cpp文件路径为:/data/workspace/myshixun/step1/

想要在头歌里面运行此程序,要先点击编程部分左上角的命令行,然后输入下图所示代码即可 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/450596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Git】git使用

vitevue3部署静态文件到github 1. 新建仓库 新建仓库 仓库名称: 必须是 [你的git用户名]或[仓库名称] .github.io&#xff0c;例如你的用户名是YunZhonJun&#xff0c;统一为小写&#xff0c;如↓ 例1 用户名.github.io yunzhonjun.github.io 例2 仓库名称.github.io colors…

【动力节点】Springsecurity14-18章JWT+Spring Security+redis+mysql 实现认证

15 SpringSecurity 集成thymeleaf 此项目是在springsecurity-12-database-authorization-method 的基础上进行 复制springsecurity-12-database-authorization-method 并重命名为springsecurity-13-thymeleaf 15.1 添加thymeleaf依赖 | org.springframework.boot spring-…

根据vue2数组响应式实现原理找到了一个待优化点

最近学习了相关知识 写出了 vue2数据响应式原理(5) 通过重写函数实现数组响应式监听但也在这里 我发现 数组响应式 一个是通过for遍历监听已有属性 还有就是重写会改变数组的几个内置函数来监听 但 如果 元素之前没有 且 我们不适用这些内置函数去修改呢&#xff1f; 我们创建…

报表生成器 FastReport .Net 用户指南(一):基本原理

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表。 随着FastReport .Net 2023版的正式发布&#xff0c;厂商也发布了最新版的用户手册&#xff0c;从今天起我们将持续更新2023版的…

苹果手机怎么看生产日期?参考方法在这!

案例&#xff1a;怎么查苹果手机买了几年&#xff1f; 【求助&#xff01;我从别人那里买了一部苹果手机&#xff08;非官方&#xff09;&#xff0c;怎么看这个手机用了几年&#xff1f;】 苹果手机作为一款高端手机&#xff0c;备受用户的喜爱。然而&#xff0c;许多用户不知…

utools - 电脑必装软件

目录 一、超级面板二、计算稿纸三、IP地址查询和正则表达式测试四、浏览器书签五、OCR识别六、Markdown编辑器、Emoji表情输入工具七、总结 简介&#xff1a; 今天我要向大家介绍一款非常实用的电脑软件——utools。 官网&#xff1a;utloos &#x1f433;作为一款集成了多种实…

初识c++语法(一)

我们在C语言的基础之上进行c语言的学习。对于我们的c语言来说&#xff0c;c兼容C语言&#xff0c;所以我们以前编写的C语言的程序在c平台上也是可以运行的。唯一不同的就是我们的c对于我们C语言的部分语法做出了优化以及引入了面向对象的概念。所以在刚开始学习c的时候我们可以…

免费馅饼(牛客刷dp)

免费馅饼 比赛主页 我的提交 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 SERKOI最新推出了一种叫做“免费馅饼”的游戏:游戏在一个舞台上进行。舞台的宽度为W格&#…

D. Color with Occurrences(Codeforces Round 811 (Div. 3))

https://codeforces.com/contest/1714/problem/D 题目大意 给定一个字符串 t t t 和一组字符串 s 1 , s 2 , … , s n s_1, s_2, \ldots, s_n s1​,s2​,…,sn​。每次操作可以选择其中一个字符串 s i s_i si​&#xff0c;将 t t t 中所有 s i s_i si​ 的出现位置染…

管理后台项目-04-SPU列表-增删改SPU-获取SKU【续】

目录 1-删除spu 2-添加sku 2.1-获取skuForm页面组件的数据 2.2-收集form表单数据 2.3-保存提交数据 3-查看SKU信息和loading效果 上一篇文章管理后台项目-03-SPU列表-增删改SPU-获取SKU_ycmy2017的博客-CSDN博客内容较多&#xff0c;交互逻辑有点复杂&#xff0c;所以分两…

微风·六·JAVA中“==”、hashcode、equals及字符串常量池的区别

vector线程安全的集合 hashset底层为hashmap 文章目录 1 “”和equals的区别是什么?1.1 “”解释1.2 “equals”解释1.3 注意点&#xff1a;equals不能比较基本数据类型1.4 Integter缓存数组1.4.1 引入案例发现问题1.4.2 解释缓存数组 1.5 字符串常量池1.5.1 案例一1.5.2 案例…

视频直播网站开发的最佳实践

随着互联网技术的不断发展&#xff0c;视频直播成为了网络世界中的一股热潮。无论是企业还是个人&#xff0c;都可以通过搭建自己的视频直播网站来实现自己的目标。但是&#xff0c;对于很多企业来说&#xff0c;视频直播网站的开发是一项复杂的任务。因此&#xff0c;本文将介…

响应式开发(HTML5CSS3)实现媒体查询的功能案例

目录 前言 一、媒体查询知识点 二、实现功能的尺寸 三、代码部分 1.不带嵌套的媒体查询功能 1.1.代码段 1.2.运行结果 2.带嵌套的媒体查询功能 2.1.代码段 2.2.运行结果 2.2.3视频效果 前言 1.本文讲解的响应式开发技术&#xff08;HTML5CSS3Bootstrap&#xff09…

C语言开发环境搭建及调试

C简介 可移植 标准C C/C &#xff08;系统硬件操作的接口&#xff0c;windows&#xff0c;Linux不一样&#xff09; 跨平台 Java Python 下载 去官网选择Visual Studio 2019下载 安装过程中勾选使用C的桌面开发 安装好之后点击创建新项目——空项目 位置最好放在根目录下&…

从数据管理到数据资产管理

数据已经与土地、劳动力、资本、技术并称为五种生产要素&#xff0c;数据的价值是毋庸置疑的。数据甚至成为了国家的基础性战略资源&#xff0c;数字经济也正在成为经济增长的强大创新动力。那么—— 数据到底指的是什么&#xff1f; 数据管理又是怎么回事&#xff1f; 数据如何…

Django项目之经济预测平台,应用LSTM、GBDT等算法

一、平台功能与技术点 1.技术点&#xff1a;Python3.9、Django4.1.7&#xff0c; tensorflow2.11.0&#xff0c;keras2.11.0&#xff0c;numpy1.24.2、bootstrap、ajax、MySQL等等 2.功能&#xff1a;正常前后端&#xff0c;前台主要完成经济预测功能&#xff08;特征和标签都…

✨✨✨ ❃ ♕ ꕥXpath解析html获取表情符号,丰富你的文章 ꧁ ꧂꧁ ꧂

✨✨✨ ❃ ♕ ꕥXpath解析html获取表情符号&#xff0c;丰富你的文章 ꧁ ꧂꧁ ꧂ 1. 推荐几个好玩的表情符号网站2. xpath解析html获取表情3. xpath解析html源码3.1 parse_li.py3.2 symbol2.html 参考 1. 推荐几个好玩的表情符号网站 &#x1f495; &#x1f9da; &#x1f6b…

SPDK软件栈基础概念

SPDK SPDK软件架构SSD和SPDK中controller和nsSPDK RPC &#xff08;一&#xff09;driverSPDK virtio-PCIe 和 vhost-user &#xff08;二&#xff09;Storage Services(存储设备)对象存储SPDK BlobStore&BlobFS SPDK 块设备驱动块设备驱动层的其他模块 &#xff08;三&…

KMP字符串匹配算法详解

目录 简单的暴力匹配算法KMP算法next数组next数组的优化 简单的暴力匹配算法 对于字符串的匹配通常是给出一个主串str和一个模式串sub&#xff0c;然后在主串pos位置开始匹配&#xff0c;如果能在str中找到sub那么就返回sub在str中首次出现的首个字符的下标&#xff0c;否则返…

地球系统模式(CESM)

目前通用地球系统模式&#xff08;Community Earth System Model&#xff0c;CESM&#xff09;在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。CESM由美国NCAR于2010年07月推出以来&#xff0c;一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆地、海…