ModularCode.cRUN

/*
函数示例1:处理不同长度的一维数组
	计算不同长度数组的均值,然后将均值相加
函数示例2:处理不同长度的二维数组
	计算三角形和四边形的重心,然后再计算这两个重心的重心

实现说明
	1. 函数返回数据有两种情况 1)函数的return返回值;2)函数参数,非const的指针类型(数组也是指针类型);
	2. 两函数的输入均为数组,计算结果的返回方式:示例一采用返回方式1),示例二采用返回方式2)
	3. 函数参数必须带数组长度,且函数体不能使用与参数相关的全局变量/常量/宏,否则无法复用
*/

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


void InputArray(int arr[], int len);
void ShowArray(const int arr[], int len);
int AverageArray(const int arr[], int len);
void Test_AverageArray();

void ComputingCenter(const double points[][3], int n, double center[]);
void Test_ComputingCenter();


int main()
{
	//不同长度的一维数组
	Test_AverageArray();

	//不同长度的二维数组
	Test_ComputingCenter();

	return 0;
}


void InputArray(int arr[], int n)
{
	for (int i = 0; i < n; i++)
	{
		scanf_s("%d", &arr[i]);
	}
}


void ShowArray(const int arr[], int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d\n", arr[i]);
	}
}


int AverageArray(const int arr[], int n)
{
	int sum = 0;
	for (int i = 0; i < n; i++)
	{
		sum = sum + arr[i];
	}

	return sum;
}


//ShowArray,计算两个不同长度的一维数组的均值,再将这两个均值相加
void Test_AverageArray()
{
#define ArraySize1 2
	int arr1[ArraySize1];

	InputArray(arr1, ArraySize1);
	ShowArray(arr1, ArraySize1);

	int avg1 = AverageArray(arr1, ArraySize1);
	//printf("Average is %d.\n", avg1);

#define ArraySize2 4
	int arr2[ArraySize2];

	InputArray(arr2, ArraySize2);
	ShowArray(arr2, ArraySize2);

	int avg2 = AverageArray(arr2, ArraySize2);
	//printf("Average is %d.\n", avg2);
	
	int sum = avg1 + avg2;
	printf("Result is %d.\n", sum);
}


//计算三维空间中点集points的重心,结果存入点center(一维数组,长度为3)中
void ComputingCenter(const double points[][3], int n, double center[])
{
	center[0] = 0, center[1] = 0, center[2] = 0;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			center[j] += points[i][j];
		}
	}
	for (int j = 0; j < 3; j++)
	{
		center[j] /= n;
	}
}


#define N 2
//错误示例
//数组长度不是函数参数传入,而是全局宏方式使用。函数体中的N为和参数points相关的全局宏,该函数只能处理长度为N的数据集!
void ComputingCenter_error_1(const double points[][3], double center[])
{
	center[0] = 0, center[1] = 0, center[2] = 0;
	for (int i = 0; i < N; i++) 
	{
		for (int j = 0; j < 3; j++)
		{
			center[j] += points[i][j];
		}
	}
	
	for (int j = 0; j < 3; j++)
	{
		center[j] /= N;
	}
}


//错误示例
//计算结果没有返回,而是直接通过printf输出,直接导致结算的结果不能被后续步骤使用
//对于程序来说,在内存中保存信息远比在屏幕上显示信息更重要!【即显示前应先将信息保存到变量,再显示该变量的值】
void ComputingCenter_error_2(const double points[][3], int n)
{
	double center[3];
	center[0] = 0, center[1] = 0, center[2] = 0;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			center[j] += points[i][j];
		}
	}
	
	for (int j = 0; j < 3; j++)
	{
		center[j] /= n;
	}
	
	printf("Center is (%lf, %lf, %lf).\n", center[0], center[1], center[2]);
}


//测试ComputingCenter,计算三角形和四边形的重心,并且计算这两个重心的重心
void Test_ComputingCenter()
{
	double points1[][3] = { {1.0, 1.0, 1.0}, {2.0, 2.0, 2.0} };
	double center1[3];
	ComputingCenter(points1, 3, center1);

	double points2[][3] = { {1.0, 1.0, 1.0}, {2.0, 2.0, 2.0}, {3.0, 3.0, 3.0},{3.0, 3.0, 3.0} };
	double center2[3];
	ComputingCenter(points2, 4, center2);

	double center[3];
	for(int i=0; i<3; i++)
		center[i] = (center1[i] + center2[i]) / 2.0;
	printf("Center is (%lf, %lf, %lf).\n", center[0], center[1], center[2]);
}