题目是输入两串配对的DNA字符串(长度100以内),在CCCGGG处中间切断然后让切断后的各子串从最后一个开始依次相连。我目前遇到的问题在前半段,我想用如下的代码标出各需要切割的点的位置(标号在6个字母里的4个),存储在数组p中。(之后将数组p内元素排序并求出每个切割后子串的长度)。但是如下代码我在实际运行中却出现了p[1]和j同时变化的境况。举例,我输入
“CCCGGG
GGGCCC"
即将执行p[n++]=j+3后,理论结果应为p[1]=3,j=0,pn=2吧。但是我调试结果xian'sj同p[1]一起变成了3,之后随着循环变化j变回了0,然后p[1]此时也跟着变回了0,两者一起变化之后也有发生。所以这个问题是出在哪里了呢?自己发现原因了。是因为p,l两个数列没有声明长度。
#include <stdio.h>
#include <math.h>
char in[2][101],out[2][101];
char *to[2],*sub[2];
char window[6]={'C','C','C','G','G','G'};
int i,len,j,wj,wn,t,q;
int p[],l[];
int pn = 0;
int main( )
{
gets(in[0]);
gets(in[1]);
len=strlen(in[0]);
p[pn++]=0;
for (i=0;i<2,i++){
for (j=0;j<(len-5);j++){ //找出断点,右侧标号
wj=j;wn=0;
while (in[0][wj] == window[wn]){
wj++;wn++;
if (wn==6){
p[pn++] = j + 3;
break;
}
}
}
}
for (i=0;i<pn-1;i++){ //排序
t=i;
for (j=i+1;j<pn;j++){
if (p[wj]>p[j])
t=j;
}
if (t != i){
q=p[t]; p[t]=p[i]; p[i]=q;
}
}
for (i=0;i<pn-1;i++){ //每子串长度
l[i]=p[i+1]-p[i];
}
l[pn-1]=len-p[pn-1];
#include <vector>
#include <stdio.h>
#include <string>
using namespace std;
#pragma warning(disable:4996)
int main() {
vector<int> points;
vector<string> list;
char a[100];
char b[100];
string CheckA = "CCCGGG";
string CheckB = "GGGCCC";
string A;
string B;
scanf("%s", &a);
//scanf("%s", &b);
A = a;
B = b;
int j = 0;
for (int i = 0; i < A.length(); i++) {
for (j = 0; j < CheckA.length(); j++) {
if (i >= A.length()) {
break;
}
if (A[i] == CheckA[j]) {
//向右偏移
i++;
}
else {
j = -1;
i++;
}
}
if (j == 6) {
printf("断点:%d", i - 3);
points.push_back(i - 3);
j = -1;
}
}
int start = 0;
for (int i = 0; i < points.size(); i++) {
string res = A.substr(start, points[i]-start);
printf("根据断点截获字符串:%s\n", res.data());
list.push_back(res);
start = points[i];
}
string res = A.substr(start, A.length() - start);
printf("根据断点截获字符串:%s\n", res.data());
list.push_back(res);
//
printf("结果字符串:\n");
for (int i = list.size()-1; i >= 0; i--) {
printf("%s", list[i].data());
}
printf("结束!:\n");
}
ACCCGGGTCCCGGGTT
断点:4断点:11根据断点截获字符串:ACCC
根据断点截获字符串:GGGTCCC
根据断点截获字符串:GGGTT
结果字符串:
GGGTTGGGTCCCACCC
第二行自己写。
实际上要做匹配没这么麻烦。你直接用两个数组存碱基序列。
然后,每一个位置一一对应不就好了。、'
int i = 0;
char A[100];
char B[100];
scanf("%s",A);
scanf("%s",B);
bool flag = true;
while(flag || i<length){
if(A[i]=='C')
{
flag = B[i] == 'G'? true:false;
}
i++;
}
你上面那一些拗口难懂。
建议编写易于读写的,可供维护的代码。