#include <stdio.h>
#include <stdlib.h>
#include <math.h>
float ave=0; //平均值
float v1,v2;
float v4,v3=0,Delta;
float* delet_arry(float *num,int* flag) //剔除函数
{
//循环求和
float sum=0; //!!!!!!!!!!循环初始化!!!!!!!!!
for (int i = 0; i < *flag; i++)
{
sum=sum+num[i];
}
//求平均值
ave=sum/(*flag);
//求Delta
for (int i = 0; i < *flag; i++)
{
v1 = num[i]-ave;
v2 = v1*v1;
v3 = v3+v2;
}
v4 = v3/((*flag)-1);
Delta = (float) sqrt(v4);
Delta = 3*Delta;
//循环剔除
int j = 0;//定义一个变量保存剔除后的数组长度
for (int i = 0; i < *flag; i++)
{
v1 = num[i]-ave;
if(v1>=(-Delta)&&v1<=Delta)
{
num[j] = num[i];
j++;
}
else
{
printf("剔除的位数为:%d\n",j+1);
}
}
*flag = j;//保存剔除后的数组长度,以便下一次调用
return num;
}
int main(void)
{
// 使用动态内存分配一个数组为 int num[len]
float *num = NULL;
int len;
printf("请输入数组长度\n");
scanf("%d",&len);
num = (float *)malloc(len * sizeof(float));
printf("请输入需要测量的数\n");
for (int i = 0; i < len; i++)
{
scanf("%f",&num[i]);
}
printf("\n");
//定义一个指针用来保存数组长度,调用函数不被丢失
int *flag = NULL;
flag = &len;
//定义一个标志位保存上一个数组的长度,用来退出循环
int bijiao = 0;
bijiao = *flag;
//进入循环剔除不合格的数据
do
{
delet_arry(num,flag); //调用函数循环比较
if(bijiao==(*flag)) //跳出循环
{
break;
}
bijiao=(*flag);
}
while(1);
printf("\n");
printf("平均值为:%f\n",ave);
printf("\n");
printf("3*Delta为:%f\n",Delta);
printf("\n");
printf("x=%.2fmm±%.2fmm(99.7%%)\n",ave,Delta);
//10.42 10.40 10.43 10.43 10.42 10.43 10.39 10.30 10.40 10.43 10.42 10.41
//10.42 10.40 10.43 10.43 10.42 10.43 10.39 10.30 10.40 9 10.41 10.42
//10.42 10.40 10.43 10.43 10.42 10.43 10.39 10.30 10.40 10.43 10.41 9
}
010.电气测量--粗大误差的计算
最新推荐文章于 2023-06-05 21:08:10 发布