免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1155 | 回复: 4
打印 上一主题 下一主题

这个程序怎么写? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-27 18:18 |只看该作者 |倒序浏览
有M行,N列的数据,现在想计算同一行中每一个数据除以同一行Total里的数据,如果比例大于且等于50%输出相应的数字和所在列和行的名字,这个程序怎么写啊,头也太了,搞了半天也没搞出来。

如下面这个例子:共3行(M=3),4列(N=4),

        Name1        Name2        Name3        Total
Num1        1        2        3        6
Num2        2        4        9        15
Num3        10        20        15        45


则想输出的结果是:

Num1,Name3=3
Num2,Name3=9


解释:因为Num1,Name3=3   3除以6=50%符合条件;Num2,Name3=9  9除以15=60%符合条件

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2012-03-27 18:35 |只看该作者
回复 1# bioinfor

$ cat 50percent.pl

use strict;
use warnings;

my @aName = split(/\s+/,<DATA>);
while(<DATA>){
  my @aData = split;
  my $sOut = shift @aData;
  my $sTotal = pop @aData;
  my $sCnt = 0;
  my $sFlag_out = 0;
  foreach(@aData){
     $sCnt++;
     if($_  / $sTotal >= 0.5){
        $sOut .= ",$aName[$sCnt]=$_";
        $sFlag_out = 1;
     }
  }
  if($sFlag_out == 1){
    print "$sOut\n";
  }
}

__DATA__
        Name1        Name2        Name3        Total
Num1        1        2        3        6
Num2        2        4        9        15
Num3        10        20        15        45


$ perl 50percent.pl
Num1,Name3=3
Num2,Name3=9

   

论坛徽章:
0
3 [报告]
发表于 2012-03-28 11:12 |只看该作者
谢谢,回复的太快了,程序很强很好用!
弱弱问一下, my @aData = split;这行怎么解释?

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
4 [报告]
发表于 2012-03-28 11:18 |只看该作者
perldoc -f split

论坛徽章:
0
5 [报告]
发表于 2012-03-28 12:11 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. my @title = split /\s+/,<DATA>;
  5. while (<DATA>) {
  6.         my @info = split;
  7.         my @anum = grep {$info[$_] / $info[-1] >= 0.5} 1..$#info-1;
  8.         if (@anum) {
  9.                 print "$info[0],",join(',',map {"$title[$_]=$info[$_]"} @anum),"\n";
  10.         }
  11. }

  12. __DATA__
  13.                 Name1        Name2        Name3        Total
  14. Num1        1        2        3        6
  15. Num2        2        4        9        15
  16. Num3        10        20        15        45
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP