#include <stdio.h> //头文件 #include <string.h> #define _CRT_SECURE_NO_WARNINGS #define YES 1 #define NO 0 //全局变量部分 char V[20]; //病毒DNA字符串 char D[20]; //人的DNA字符串 //主要功能函数的具体实现及说明 //模式匹配函数(BF) int BF(char *D, char *V) { //用BF算法进行模式匹配 int i=0,j=0; while (i<strlen(D) && j<strlen(V)) { if (D[i]==V[j]) { i++; j++; } else { i = i-j+1; j = 0; } } if (j>=strlen(V)) return YES; else return NO; } //循环展开函数(BFjudge) int BFjudge(char *D, char *V) { int flag = 0; int i,j,m; char temp[20]; m = strlen(V); for(i=m,j=0;j<m;j++) V[i++]=V[j]; V[2*m] = '\0'; //将字符串长度为m的病毒DNA扩展为长度为2m的字符串 for(i=0; ;i++) { for(j=0;j<m;j++) temp[j] = V[i+j]; temp[m] = '\0'; //循环展开环状病毒DNA flag = BF(D,temp); //调用BF模块进行模式匹配 if (flag) break; else if (i>=m) return NO; //所有展开字符串均匹配失败 else continue; } return YES; } // 程序使用一维数组存储,在输入完一组数据后存储在缓存区内, // 然后将判断结果存入数组s中,最后根据数组s统一输出判断结果。 int PRINThand() { FILE *fp1,*fp2; int i=0,k=0; int s[20]; while(1) { printf("\n请输入病毒DNA以0结束:"); scanf("%s", &V[i]); printf("\n请输入人的DNA以0结束:\n"); scanf("%s", &D[i]); if(V[i]=='0' && D[i]=='0') break; if(BFjudge(D, V)==1) { s[k]=1; }else{ s[k]=0; } k++; } printf("病毒感染检测输出结果:\n"); for(k=0;s[k]<2;k++) { if(s[k]==1) printf("YES\n"); else printf("NO\n"); } return 0; } //主函数 int main() { int key = 0, Num; while(1) { printf("欢迎使用病毒感染检测系统\n"); PRINThand(); break; } }
时间: 2024-04-27 19:24:36 浏览: 78
define.docx
这段代码有以下几个问题:
1. 在字符串输入时,应该使用%s格式化符号,而不是将变量名作为参数传递。例如:
```
scanf("%s", V);
scanf("%s", D);
```
2. 在循环展开函数(BFjudge)中,当所有展开字符串均匹配失败时,应该返回NO,而不是YES。因此,需要将以下代码:
```
else if (i>=m) return NO;
```
改为:
```
else if (i>=m) return NO;
```
3. 在程序使用一维数组存储时,应该注意数组越界问题。例如,在输入完一组数据后,应该将数组末尾的元素设为'\0'。因此,需要将以下代码:
```
scanf("%s", &V[i]);
scanf("%s", &D[i]);
```
改为:
```
scanf("%s", V);
scanf("%s", D);
V[strlen(V)] = '\0';
D[strlen(D)] = '\0';
```
4. 在主函数中,没有提供退出程序的选项。因此,需要在用户输入完一组数据后询问是否继续。例如:
```
while(1) {
printf("欢迎使用病毒感染检测系统\n");
PRINThand();
printf("是否继续(1表示是,0表示否):");
scanf("%d", &key);
if (key == 0) {
break;
}
}
```
将以上修改应用到代码中后,可以得到以下代码:
阅读全文