第一篇博客
2022-04-05 第一次-test
-------------------------
2022-04-07 strlen() 函数返回值为unsigned int 或unsigned long 所以与负数比较会导致结果有误。
#include <stdio.h> #include <string.h> int checkCG(char str[],int i,int j); int checkGC(char str[],int i,int j); //DNA序列检测CCCGGG并切段重组 //输入两行不过长的DNA序列 例: //CCCGGGGGGCCCCCCGGGCGCGCGGC //GGGCCCCCCGGGGGGCCCGCGCGCCG int main(){ char str1[100]={0},str2[100]={0},strTrans[100]={0}; int i=0,j=0,k=0,count,check=0,strBreak[100]={-1}; scanf(" %s %s",str1,str2); for(i=0;i<strlen(str1);i+=2){ check=checkCG(str1,i,strlen(str1)-1); if(check!=0){ j++; strBreak[j]=check; i=check-2; } } for(i=0;i<strlen(str1);i+=2){ check=checkGC(str1,i,strlen(str1)-1); if(check!=0) { j++; strBreak[j]=check; i=check-2; } } //对strBreak排序 冒泡排序 for(count=1;strBreak[count]!=0;count++); for(i=0;i<(count-1);i++){ for(j=0;j<count-1-i;j++){ if(strBreak[j]>strBreak[j+1]){ k=strBreak[j+1];strBreak[j+1]=strBreak[j];strBreak[j]=k; } } } strBreak[count]=100; //改变顺序 str1 k=0; strcpy(strTrans,str1); for(i=count-1;i>=0;i--){ for(j=strBreak[i];j<strBreak[i+1]&&((j+1)<strlen(strTrans));j++){ str1[k]=strTrans[j+1]; k++; } } if(k<100) str1[k]='\0'; //改变顺序 str2 k=0; strcpy(strTrans,str2); for(i=count-1;i>=0;i--){
//下行代码,(j+1)处理,因j可能为-1; for(j=strBreak[i];j<strBreak[i+1]&&((j+1)<strlen(strTrans));j++){ str2[k]=strTrans[j+1]; k++; } } if(k<100) str2[k]='\0'; printf("%s\n%s\n",str1,str2); return 0; } //检测是否有“CCCGGG” int checkCG(char str[],int i,int j){ int check=0; for(;i<=j;i++){ if(str[i]=='C'){ if(check<3) check++; else if(check=3); else check=1; } else if(str[i]=='G'){ if(check>=3&&check<=5) check++; else if(check<3) check=0; if(check==6) break; } else check=0; } if(check==6) return i-3; else return 0; } //检测是否有“GGGCCCC” int checkGC(char str[],int i,int j){ int check=0; for(;i<=j;i++){ if(str[i]=='G'){ if(check<3) check++; else if(check=3); else check=1; } else if(str[i]=='C'){ if(check>=3&&check<=5) check++; else if(check<3) check=0; if(check==6) break; } else check=0; } if(check==6) return i-3; else return 0; }

浙公网安备 33010602011771号