分页: 1 / 3

请敎:如何写程序来实现这样的功能(已经解决)

发表于 : 2012-01-30 11:08
autocup
已经解决,感谢josephyoung
Screenshot.png
此公式是计算重复性误差的
已知:
(1) s的值是在0.00%~2.00%范围内;
(2) C是一个数组,共6个,C的值是在36~44范围内;
想达到的目标:
编写一段程序,将符合(1)(2)要求的所有C数组输出并以文本方式存到home目录下面。

要求:
数组是可以任意组合的,只要s值是在0.00%~2.00%即可。
但是数组不可重复,下面的例子就不允许出现。

代码: 全选

41 41 41 41 42 41
与
41 41 41 42 41 41
正确格式如下:

代码: 全选

.
.
.
41 41 41 41 41 41  0.00%
41 41 41 41 41 42 0.99%
41 41 41 41 42 42 1.25%
.
.
.
44 44 44 43 42 44 1.92%
.
.
.
*^_^*看了《提问的智慧》重新改了改,感谢josephyoung 的建议
*^_^*谁有空就帮帮忙,写一段程序呗,语言无所谓,
最好能方便一些(.sh执行文件最好),本人非计算机专业,对计算机语言了解甚少。
^_^在此谢谢各位了

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 11:11
枫叶饭团
这个公式只能让我想起一个软件:matlab

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 11:21
cuihao
shell么 :em06
python或C倒是好写。

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 11:22
月下叹逍遥
fortran也可以。。。

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 11:24
xiooli
awk 吧,可以实现

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 11:25
ljj_jjl2008
楼上,好久不见。
过年好。

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 11:37
xiooli
ljj_jjl2008 写了:楼上,好久不见。
过年好。
亮晶晶同学新年好啊,其实我一直都是半死不活的在论坛上诶,呵呵

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 11:40
delectate
不涉及算法,很简单c就可以实现,何必舍近求远用shell。

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 11:59
cjxgm
这个应该很简单吧
弄个 wxMaxima 不久都解决了么

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 13:04
josephyoung
将C数据每组一行以空格分隔作为原始数据调用

代码: 全选

#!/usr/bin/awk -f
BEGIN{
    T=6;
    C_min=36;
    C_max=44;
    outfile=ENVIRON["HOME"]"/result.txt";
}
NF==T{
    C_sum=0;
    C_ave=0;
    C_tmp=0;
    for(i=1;i<=T;i++){
	if($i < C_min || $i > C_max)next;
	C_sum+=$i;
    }
    C_ave=C_sum/T;
    for(i=1;i<=T;i++)
	C_tmp+=($i-C_ave)**2;
    s=sqrt(C_tmp/(T-1))/C_ave*100;
    if(s<=2){
	printf("%s  %.2f%%\n",$0,s) >> outfile;
    }
}

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 13:32
cjxgm
好吧,我也动手。
C语言版
[c]/** s.c
* compile: gcc -o s s.c -lm
* usage: ./s > ~/output
* then, type the 6 datas in
*
* by eXerigumo Clanjor
*/

#include <stdio.h>
#include <math.h>

static float c[6];

int main()
{
int i;
for (i=0; i<6; i++)
scanf("%g", &c);

float ave = (c[0] + c[1] + c[2] + c[3] + c[4] + c[5]) / 6.0;
float sum = 0;
for (i=0; i<6; i++)
sum += (c-ave) * (c-ave);
sum = sqrt(sum / 5.0) / ave * 100.0;

printf("%g %g %g %g %g %g %2.2f%%\n", c[0], c[1], c[2], c[3], c[4], c[5], sum);

return 0;
}
[/c]

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 13:53
月下叹逍遥
[fortran]
open(unit=10,file="data.txt")
real c[6],s,avg,sum
sum=0
read(*,*) c
do i=1,6
sum=sum+c
enddo
avg=sum/6
do i=1,6
sum=(c-avg)**2
enddo
s=1/avg*sqrt(sum/5)
print(10,*) (c,i,1,6), s
[/fortran]

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 13:55
cjxgm
使用 wxMaxima

代码: 全选

C: [41, 41, 41, 41, 41, 41];
ave: lsum(j, j, C)/6;
sqrt(lsum((i-ave)^2, i, C)/5)/ave*100;
snap.png
就这么简单 :em09

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 13:59
ljj_jjl2008
:em06 :em06
学习了!

Re: 请敎:这样功能怎么样实现

发表于 : 2012-01-30 17:07
autocup
cjxgm 写了:这个应该很简单吧
弄个 wxMaxima 不久都解决了么
:em06 全英文的软件好吃力哦,可以把方档发给我吗