当我运行以下代码时,它会被变为每个变量,我不明白为什么。 函数会返回一个数据库(一个封闭的txt文件),一个患者和一个指向大小的指针。
关于功能: 该函数返回一个人的数组,其中包含潜在捐献者的所有细节,其中至少与患者具有相同基因的“min_match”数。
如果供体和患者之间没有完全匹配,可以通过部分匹配进行移植。通过将min_match设置为3,该阵列将包含具有3个或更多匹配基因的所有潜在供体作为患者。匹配基因是与患者的相同基因具有完全相同序列的基因。 数组排序如下;第一个标准:匹配基因的数量。 第二个标准:如果两个潜在供体之间的匹配基因数量相同,则优先考虑每个基因错配最少的供体(基因相同位置的DNA序列差异)。 第三个标准:如果两个捐赠者具有完全相同的遗传概况,则优先顺序按照字母顺序给出在电话簿中较早出现的那个。
结构和功能定义如下:
typedef struct person_{
char name[31];
char id[10];
char genes[5][22];
} person;
person* getPotentialDonors(char* database, person patient, int min_match,int *size){
FILE *db;
person * matches,per,temp;
int count,i,j=0,count_per=0,index,big=0,k,countS,countJ,MismatchS,MissmatchJ, minMissS, minMissJ,ind;
db=fopen(database,"r");
if(!db) exit(1);
while(fscanf(db,"%30[^$] %9[^$] %21[^$] %21[^$] %21[^$] %21[^$] %21[^$]%*c",per.name,per.id,per.genes[0],per.genes[1],per.genes[2],per.genes[3],per.genes[4])==7)
{
count=0;
for(i=0;i<5;i++)
if(!strcmp(patient.genes[i],per.genes[0])||!strcmp(patient.genes[i],per.genes[1])||!strcmp(patient.genes[i],per.genes[2])||!strcmp(patient.genes[i],per.genes[3])||!strcmp(patient.genes[i],per.genes[4])) count++;
if(count>=min_match) count_per++;
}
matches=(person*)malloc(sizeof(person)*count_per);
rewind(db);
while(fscanf(db,"%30[^$] %9[^$] %21[^$] %21[^$] %21[^$] %21[^$] %21[^$]%*c",per.name,per.id,per.genes[0],per.genes[1],per.genes[2],per.genes[3],per.genes[4])==7)
{
count=0;
for(i=0;i<5;i++)
if(!strcmp(patient.genes[i],per.genes[i])) count++;
if(count>=min_match)
{
strcpy(matches[j].name,per.name);
strcpy(matches[j].id,per.id);
strcpy(matches[j].genes[0],per.genes[0]);
strcpy(matches[j].genes[1],per.genes[1]);
strcpy(matches[j].genes[2],per.genes[2]);
strcpy(matches[j].genes[3],per.genes[3]);
strcpy(matches[j].genes[4],per.genes[4]);
j++;
}
}
for(index=0;index<count_per;index++){
big = index;
for(j=index+1;j<count_per;j++){
MismatchS = 0;
MissmatchJ = 0;
minMissJ =minMissS =21;
countS=countJ=0;
for(k=0;k<5;k++){
MismatchS = 0;
if(!strcmp(matches[big].genes[k],patient.genes[k])) countS++;
else
{
for(i=0;i<22;i++){
if(matches[big].genes[k][i]!=patient.genes[k][i]) MismatchS++;
}
if(MismatchS<minMissS) minMissS=MismatchS;
}
if(!strcmp(matches[j].genes[k],patient.genes[k])) countJ++;
else
{
for(i=0;i<22;i++){
if(matches[j].genes[k][i]!=patient.genes[k][i]) MissmatchJ++;
}
if(MissmatchJ<minMissJ) minMissJ=MissmatchJ;
}
}
if(countS < countJ)
big = j;
else if (countS == countJ && minMissJ<minMissS) big=j;
else if (countS == countJ && minMissJ==minMissS && strcmp(matches[j].name,matches[big].name)<0) big=j;
}
strcpy(temp.name,matches[index].name);//Index->temp
strcpy(temp.id,matches[index].id);
for(ind=0;ind<5;ind++)
strcpy( temp.genes[ind],matches[index].genes[ind]);
strcpy(matches[index].name,matches[big].name);//big->index
strcpy(matches[index].id,matches[big].id);
for(ind=0;ind<5;ind++)
strcpy( matches[index].genes[ind],matches[big].genes[ind]);
strcpy(matches[big].name,temp.name);//temp->big
strcpy(matches[big].id,temp.id);
for(ind=0;ind<5;ind++)
strcpy(matches[big].genes[ind],temp.genes[ind]);
}
fclose(db);
*size = count_per;
return matches;
}
答案 0 :(得分:0)
可能不是问题的答案,但是我的对称检测器被
弄糊涂了for(i=0;i<5;i++)
if(!strcmp(patient.genes[i],per.genes[0]) ||!strcmp(patient.genes[i],per.genes[1])||!strcmp(patient.genes[i],per.genes[2]) ||!strcmp(patient.genes[i],per.genes[3])||!strcmp(patient.genes[i],per.genes[4])) count++;
//do something with count
和
for(i=0;i<5;i++)
if(!strcmp(patient.genes[i],per.genes[i])) count++;
// do something with count that is supposed to be the same as above