| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 926 人关注过本帖
标题:很长的内含子序列前后翻转,怎么解决呀!
只看楼主 加入收藏
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
结帖率:93.94%
收藏
已结贴  问题点数:30 回复次数:8 
很长的内含子序列前后翻转,怎么解决呀!
内含子串联负序列.rar (762.61 KB)

这是500多万个碱基长的字符串,当然这只是一个很短的内含子,还有几千万个、甚至几亿个碱基长的,现在要把内含子序列前后翻转过来,即第一个碱基变成最后一个,第二个变成倒数第二个,第三个变成倒数第三个等;实现完这个过程后好要将碱基字符A换成T,T换成A,C换成G,G换成C。     这是我自己编的程序,但运行有问题,请各位大侠帮忙优化或修改一下,谢谢!!!!
#include"stdio.h"
#include"string.h"
#include"stdlib.h"           
FILE *in,*out;
int main()              
{         
 int i;
 int sum;
 static char str[55000000];
 char zifu;
 in=fopen("F:\\寻找内含子序列\\内含子串联负序列.txt","rb");        //第12行
 out=fopen("F:\\寻找内含子序列\\收获1.txt","wb");     
 while(!feof(in))
 {
 fgets(str,sum+1,in);
 sum=strlen(str);
 for(i=0;i<sum/2;i++)
    {
       zifu=str[i];
       str[i]=str[sum-1-i];
       str[sum-1-i]=str[i];     //第一个与最后一个、第二个与倒数第二个等替换   
    }
   for(i=0;i<sum;i++)
   {
      if(str[i]=='A')
      {
       str[i]='T';
       continue;     //加continue表明完成操作后继续循环,不执行下面的;要加{}否则不管第一个if是否成立执行continue继续循环
      }
      if(str[i]=='T')
      {
       str[i]='A';
       continue;
      }
      if(str[i]=='C')
      {
       str[i]='G';
       continue;
      }
      if(str[i]=='G')
      str[i]='C';
   }
 }
  fputs(str,out);
  fclose(in);
  fclose(out);
}
搜索更多相关主题的帖子: include 内含子 字符串 倒数 
2013-07-05 17:48
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
不需要缓存到内存里,倒着读文件即可。

重剑无锋,大巧不工
2013-07-05 18:10
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
倒着读?用fseek可以吗?
好久没见到您了,最近忙吧!!
2013-07-05 18:50
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
各位帮帮忙,这个对我很有用,我是生物物理专业的,谢谢!!!!!!
2013-07-06 13:40
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
你上传的文件我下载了三遍都打不开。看了看你的代码,让我觉得有点混乱。

首先你fgets用法不对,第二个参数应该设为str的长度。sum用在这里没有道理。

第二,你的文件里到底包含几个内含子?因为你将fgets放在循环里而fputs却放在循环外,这个逻辑我实在觉得有问题。如果只有一个内含子这个逻辑倒不算错,但while循环是多余的。如果有多个内含子,则只能输出最后一个的操作结果。如果你是考虑str不足以保存一个完整的内含子,那这个逻辑完全不符合你的要求。

重剑无锋,大巧不工
2013-07-07 00:10
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
内含子串联负序列.rar (762.61 KB)

我又把文件重新上传了,麻烦您了。
我用sum是用strlen()来统计字符串长度并赋值给sum的。
文件里只有一串内含子,麻烦您了!
2013-07-07 11:59
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用zhou31146001在2013-7-7 11:59:19的发言:


我又把文件重新上传了,麻烦您了。
我用sum是用strlen()来统计字符串长度并赋值给sum的。
文件里只有一串内含子,麻烦您了!
内含子串联负序列.rar (696.29 KB)

这个可以下载!
2013-07-07 12:08
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:30 
呵呵,我还是打不开。算了,你试试这段示例代码吧,注意修改文件路径。我没加容错判断,有兴趣请自己补上
程序代码:
#include<stdio.h>

int main()
{
    FILE *fi, *fo;
    char trans[128];
    int i;

    for(i = 0; i < 128; i++) trans[i] = i;
    trans['A'] = 'T';
    trans['T'] = 'A';
    trans['C'] = 'G';
    trans['G'] = 'C';
    
    fi = fopen("内含子串联负序列.txt", "rb");
    fo = fopen("收获.txt", "wb");
    
    for(i = -1; !fseek(fi, i, SEEK_END); i--) putc(trans[getc(fi)], fo);
    
    fclose(fi);
    fclose(fo);
    
    return 0;
}

重剑无锋,大巧不工
2013-07-07 16:34
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 8楼 beyondyf
非常感谢您,您的程序对我帮助很大,解决了一直困扰我的问题,非常感谢您!!!
2013-07-08 10:26
快速回复:很长的内含子序列前后翻转,怎么解决呀!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036423 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved