文件中的字符按列统计

题目见:

http://community.youkuaiyun.com/Expert/TopicView3.asp?id=5011617

1 ATGACAATTGAGGATCTTATTTCTTCGGAGACA--------------------
2 ATGACAATTGA---------------------------------------
3 ATGACAATTGA---------------------------------------
4 ATGACAATTGA---------------------------------------
5 TGAGTAATGAAGGATCTTATTTCTTCGGAGACAATGCAGAGGAATATGACAGT
6 TGAGTAATGAAGGATCTTATTTCTTCGGAGACAATGCAGAGGAATATGAC
7 TGAGTAATGAAGGATCTTATTTCTTCGGAGACAATGCAGAGGAGTATGAC
8 TGAGTAATGAAGGATCTTATTTCTTCGGAGACAATGCAGAGGAGTATGACTGCAG
9 TGAGTAATGAAGGATCTTATTTCTTCGGAGACAATGCAGAGGAGTACGACAGGATCT
10 TCAGTAATGAAGGATCTTATTTCTTCGGAGACAATGCAGAGGAGTACGAC
11 TCAGTAATGAAGGATCTTATTTCTTCGGAGACAATGCAGAGGAGTACGAC

我想统计后面的序列,每列元素出现的次数,序列一般都不一样长,空缺的地方不要管
输出的结果象是
1: 4A,7T
2: 2T,5G,2C
3: 4G,5A
....
57: 1T (冒号前面的是列号,因为第9个序列最长,有57个元素,所以最后一列为57)
直到算到列数最多的一个

解答:

#include  < iostream >
#include 
< fstream >
#include 
< map >
#include 
< string >
using   namespace  std;

//  表示“列”的类
class  column
{
public:
    column();
    column(
const column& col);
    column
& operator=(const column& col);
    
void parse(char c); // 处理一个字符
    friend ostream& operator<<(ostream& os, const column& col);
    
    
int num;
private:
    map
<charint> content;
}
;

//  表示“统计结果”的类
class  result
{
    typedef map
<int, column> column_map;
    typedef column_map::iterator column_map_iter;
public:
    
void parse(const string& row); // 处理一行数据
    friend ostream& operator<<(ostream& os, const result& ret);
private:
    column_map columns;
}
;

string &  parse( string &  row);

int  main( void )
{
    ifstream ifs(
"lp.txt");
    result ret;
    
while (ifs)
    
{
        
string row;
        
if (getline(ifs, row))
        
{
            ret.parse(parse(row));
        }

    }

    
    ofstream ofs(
"output.txt");
    ofs 
<< ret;
    
    
return 0;
}


column::column()
{
    num 
= 0;
}


column::column(
const  column &  col)
: num(col.num),
content(col.content)
{
}


column
&  column:: operator = ( const  column &  col)
{
    
if (this != &col)
    
{
        num 
= col.num;
        content 
= col.content;
    }

    
return *this;
}


void  column::parse( char  c)
{
    
++content[c];
}


ostream
&   operator << (ostream &  os,  const  column &  col)
{
    os 
<< col.num << "";
    
for (map<charint>::const_iterator iter = col.content.begin(); iter != col.content.end(); ++iter)
    
{
        os 
<< iter->second << iter->first << ",";
    }

    
return os;
}


void  result::parse( const   string &  row)
{
    
int sz = row.size();
    
for (int i = 1; i <= sz; ++i)
    
{
        
if (isalpha(row[i-1])) // 如果是A~Z或a~z
        {
            columns[i].num 
= i; // 设置列号
            columns[i].parse(row[i-1]); // 让列对象来统计这个字符
        }

    }

    columns.size();
}


ostream
&   operator << (ostream &  os,  const  result &  ret)
{
    
for (result::column_map::const_iterator iter = ret.columns.begin(); iter != ret.columns.end(); ++iter)
    
{
        os 
<< iter->second << endl;
    }

    
    
return os;
}


string &  parse( string &  row)
{
    
string::size_type sz = row.find(' ');
    row.erase(
0, sz+1);
    
    
return row;
}

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值