请用C语言编写,输入十几个离散数字,求出平均值及平均极差(极差就是第一个数减去第二个数,)

(第二个数减去第三个数,依次求出差值后取平均值就是平均极差),然后判读这几个数字哪个超出了UCL和LCL控制线,其中 UCL=平均值+3*平均极差; LCL=平均值-3*平均极差;把超出的这个数输出。然后再检验下哪个极差超出UCLR及LCLR控制线,其中UCLR=3.267*平均极差,LCLR=0,把这个数据输出,跪谢,给加分啊!
假设这些数据分布在长L的直线上,为确定离起始点位置,画红线的为自己添加上的,希望给检查下,谢谢
if(dif[i] > UCLR)
{D=L*i/N;
printf("相对强度值%.2lf ,起始位置处(mm)%.2lf ",a[i],D);
}

/*

原式数据:

28.41  23.31  20.37  18.04  25.23  10.52  18.45  36.23  35.64  10.64

极差数据:

5.10  2.94  2.33  -7.19  14.71  -7.93  -17.78  0.59  25.00

低于UCL:10.52  10.64

高于UCL:36.23  35.64

低于LCLR:-7.19  -7.93  -17.78

高于UCLR:14.71  25.00

Press any key to continue

*/

#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#define N 10

void Show(double a[], int n) {
int i;
for(i = 0; i < n; ++i)
printf("%.2lf  ",a[i]);
printf("\n");
}

int main() {
int i;
double a[N],dif[N] = {0.0},avrdif = 0.0;
double avr = 0.0,UCL,LCL,UCLR,LCLR = 0.0;
srand(time(NULL));
for(i = 0; i < N; ++i) {
a[i] = (rand()%5000 + 1)/100.0;
avr += a[i]/N; // 平均值
}
for(i = 0; i < N - 1; ++i) {
dif[i] = a[i] - a[i + 1]; // 极差
avrdif += dif[i]/(N - 1); // 平均极差
}
UCL = avr + 3 * avrdif;
LCL = avr - 3 * avrdif;
UCLR = 3.267 * avrdif;
printf("原式数据:\n");
Show(a,N);
printf("极差数据:\n");
Show(dif,N - 1);
printf("低于UCL:");
for(i = 0; i < N; ++i)
if(a[i] < LCL) printf("%.2lf  ",a[i]);
printf("\n");
printf("高于UCL:");
for(i = 0; i < N; ++i)
if(a[i] > UCL) printf("%.2lf  ",a[i]);
printf("\n");
printf("低于LCLR:");
for(i = 0; i < N - 1; ++i)
if(dif[i] < LCLR) printf("%.2lf  ",dif[i]);
printf("\n");
printf("高于UCLR:");
for(i = 0; i < N - 1; ++i)
if(dif[i] > UCLR) printf("%.2lf  ",dif[i]);
printf("\n");
return 0;
}

追问

你好,很感激你的答案,估计有七、八成的样子了,但你写的是输入数字的个数是固定的,就只有10个,我想要输入数据不确定,也就是再加上一段统计输入数据个数的程序,另外 (a[i] - a[i + 1])这个地方是绝对值,跪谢,一定加分啊!!!!希望再帮我改改

追答

把N宏定义去掉,在main函数中声明N为自动变量,提示数据个数,并读入N,接下来是
double *a = (double *)malloc(N * sizeof(double));
double *dif = (double *)malloc(N * sizeof(double));
其他部分不用改变,最后在return 0;语句前添加一下两句
free(dif);
free(a);
至于在哪儿使用fabs()函数,你自己添加吧,我手头没有C编译环境。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-25
#ifndef __BACEDATA__
#define __BACEDATA__
/*baseDataFun.h*/
#include "baseDataFun.h"
#include <stdlib.h>
#include <stdio.h>
#ifndef bool
#define bool unsigned char
#endif
#ifndef true
#define true 1
#endif
#ifndef false
#define false 0
#endif
typedef struct
{
double * data;
unsigned int size;
}data;
bool initData(data * Data, const unsigned int Size)
{
unsigned int ii = 0;
Data->data = malloc(Size*sizeof(double));
Data->size = Size;
if (Data->data)
{
for (; ii < Size; ++ii)
{
(Data->data)[ii] = 0;
}
}
return (Data->data!=0);
}
bool deleteData(data * Data)
{
if (Data->data)
{
free(Data->data);
Data->data = 0;
Data->size = 0;
return true;
}
return false;
}
unsigned int getSize(data * Data)
{
return(Data->size);
}
bool setData(data * Data,const unsigned int n,const double num)
{
if (n<getSize(Data))
{
if (Data->data)
{
(Data->data)[n] = num;
}
return true;
}
return false;
}
double getData(data * Data, const unsigned int n)
{
double temp = 0;
if (n < getSize(Data))
{
return((Data->data)[n]);
}
return 1.0/temp;
}
double average(data * Data)
{
double sumtemp = 0;
unsigned int ii = 0;
unsigned int size = 0;
if (getSize(Data))
{
size = getSize(Data);
for (; ii<size; ++ii)
{
sumtemp += getData(Data,ii);
}
return sumtemp / (double)getSize(Data);
}
return 1.0 / sumtemp;
}
double averageRange(data * Data)
{
double subtemp=0;
double sumtemp = 0;
unsigned int ii = 0;
unsigned int size = 0;
if (getSize(Data)>1)
{
size = getSize(Data);
for (; ii < size-1; ++ii)
{
subtemp = getData(Data, ii) - getData(Data, ii + 1);
sumtemp += subtemp;
return sumtemp / (double)(size-1);
}
}
return 1.0 / subtemp;
}
double ucl(data * Data)
{
return(average(Data)+3*averageRange(Data));
}
double lcl(data * Data)
{
return(average(Data) - 3 * averageRange(Data));
}
double uclr(data * Data)
{
return 3.267*averageRange(Data);
}
double lclr(data * Data)
{
return 0;
}
void showNotInUCLLCL(data * Data)
{
double ucl_data = ucl(Data);
double lcl_data = lcl(Data);
unsigned int ii = 0;
unsigned int size = getSize(Data);
if (size <= 0){ return; }
for (; ii < size;++ii)
{
if ((getData(Data, ii) > ucl_data) || (getData(Data, ii) < lcl_data))
{
printf("Not_In_UCL_LCL %f\n", getData(Data, ii));
}
}
printf("\n");
}
void showNotInUCLRLCLR(data * Data)
{
double uclr_data = uclr(Data);
double lclr_data = lclr(Data);
double range_temp = 0;
unsigned int ii = 0;
unsigned int size = getSize(Data);
if (size <= 1){ return; }
for (;ii<size-1;++ii)
{
range_temp = (getData(Data, ii) - getData(Data, ii+1));
if ((range_temp > uclr_data) || (range_temp < lclr_data))
{
printf("Not_In_UCLR_LCLR %f,%f,%f\n", getData(Data, ii),getData(Data,ii+1),range_temp);
}
}
printf("\n");
}
#endif

//main.c
#include "baseDataFun.h"
int main()
{
data m;
initData(&m,10);

setData(&m,3,6);
double temp = getData(&m,3);
temp = average(&m);
temp = averageRange(&m);
showNotInUCLLCL(&m);
showNotInUCLRLCLR(&m);
deleteData(&m);
system("pause");
return 0;
}追问

大哥,能给些注释嘛?跪谢啊,看不懂

相似回答