1. //vs2013下编译通过.换别的编译器自行补充头文件和修改源代码
    #include<iostream>
  2. #include<fstream>
  3. #include <string>
  4. using namespace std;
  5. char temp[256];//存放的临时数组
  6. char virus[20];//病毒数组
  7. char DNA[20];//DNA的数组
  8. int j = 0;//病毒长度
  9. int DNAlength = 0;//dna长度
  10. int flag = 0;//判断是不是感染开关
  11. void toCharArry(string str)//将读入的字符串转化为字符数组
  12. {
  13.  
  14. j = 0;
  15. int tem=0;
  16. strcpy_s(temp, str.c_str());
  17. //cout << str.length();
  18. for (int i = 0; i < str.length(); i++)//找到空格的位置
  19. {
  20. if (temp[i] == ' '){ j=(i+1); break; }
  21. }
  22. tem = j;
  23. for (int i = 0; i < str.length() - j + 1;i++)//写入DNA数组;
  24. {
  25. DNA[i] = temp[tem];
  26. if (i == str.length() - j){
  27. DNA[i] = '\0';//到底用不用加\我也不知道
  28. }
  29. tem++;
  30. }
  31. for (int i = 0; i < j; i++)//得到病毒序列
  32. {
  33. virus[i] = temp[i];
  34. }
  35.  
  36. /*for (int i = 0; i <9; i++)//输出Dna序列
  37. {
  38. cout <<DNA[i];
  39. }
  40. cout << endl;
  41.  
  42. for (int i = 0; i < j; i++)//输出病毒序列
  43. {
  44. cout << virus[i];
  45. }
  46. cout << endl;
  47. cout << j;*/
  48. }
  49. void addvVirusToDouble(char virus[])//将病毒序列扩大为原来二倍
  50. {
  51. int k = j-1;
  52. for (int i = 0; i < j-1 ; i++)
  53. {
  54. virus[k] = virus[i];
  55. k++;
  56. }
  57. /*for (int i = 0; i < j*2; i++)//输出病毒序列
  58. {
  59. cout << virus[i];
  60. }
  61. cout << endl;*/
  62. }
  63. int BF(int zhu, int fu, char virus[], char DNA[])//BF算法判断
  64. {
  65. int i = 0, j = 0;
  66.  
  67. while (i <= zhu&&j <= fu)
  68. {
  69. if (DNA[i]==virus[j]){ i++; j++; }
  70. else { i = i - j + 1; j = 0; }
  71.  
  72. }
  73. if (j > fu){ return 1; }
  74. else return 0;
  75.  
  76. }
  77. void virusPossibility()//列出将长度扩大二倍的病毒序列可能性
  78. {
  79. char temp[30];
  80. for (int i = 0; i < j; i++)
  81. {
  82. for (int k = 0; k < j; k++)temp[k] = virus[i + k];
  83. //temp[j] = '\0';
  84. if (BF(DNAlength - j - 1, j - 2, temp, DNA) == 1)flag = 1;
  85.  
  86. }
  87. /*if (flag == 1) { flag = 0; cout << "O" << endl; }
  88. else cout << "X" << endl;
  89. */
  90.  
  91. }
  92. void detection()//调用函数判断是否感染
  93. {
  94. int num = 0;
  95. string str;
  96. ifstream infile("病毒检测输入数据.txt", ios::in);
  97. ofstream outfile("病毒检测结果.txt", ios::out);
  98. if (!infile){ cout << "open document ERROE!!" << endl; exit(-1); }
  99. else cout << "The document reads into success!!" << endl;
  100. if (!outfile){ cout << "Establish document failure ERROE!!" << endl; exit(-1); }
  101. getline(infile, str);
  102. num = stof(str);//赋值给num之后判断;
  103. //cout << num;
  104. while (num--)
  105. {
  106. getline(infile, str);
  107. DNAlength = str.length();
  108. toCharArry(str);
  109. addvVirusToDouble(virus);
  110. virusPossibility();
  111. if (flag == 1){ flag = 0; outfile << str + " " + "YES" << endl; }//妈的这里必须把flag弄成0,要不只要有一个是下面的都是了...
  112. else { outfile << str + " " + "NO" << endl; }
  113. }
  114.  
  115. infile.close();
  116. outfile.close();
  117.  
  118. }
  119.  
  120. int main()
  121. {
  122. string str;
  123. detection();
  124. cout << "The TXTdocument outputs success!!!" << endl;
  125.  
  126. }

程序截图:

老师让思考的作业,网上找了找也没有找到,作为小白,自己动手写了一下分享给大家,造福后来人,代码写的不够好......不要乱喷谢谢!!

数据结构第二版之(课后题)BF算法病毒感染检测的更多相关文章

  1. C++面向程序设计(第二版)课后习题答案解析

    最近没什么心情整理零散的知识点,就整理一下第四章的课后习题答案. 1.定义一个复数类Complex,重载运算符“+”,使之能用于复数的加法运算.将运算符函数重载为非成员函数,非友元的普通函数.编程序, ...

  2. 数据结构Java版之递归与迭代算法(五)

    递归的概念很简单,就是自己调用自己. 而迭代,则是通过修改初始化数据,得到中间结果,然后不断的对中间结果进行修改,而得到最终结果.简单来说迭代就是循环. 在此,我们用一个比较经典的Fibonacci数 ...

  3. 《python核心编程第二版》课后习题6-12答案

    下午脑子瓦特,想了半天也没有想出算法,刚刚抽风终于实现了,特此记录. ̄□ ̄|| 题目 (a)创建一个名字为 findchr()的函数,findchr()要在字符串 string 中查找字符 char, ...

  4. 武汉科技大学ACM :1004: 华科版C语言程序设计教程(第二版)课后习题3.7

    Problem Description 输入无符号短整数k[hex.]和p[oct.],将k的高字节作为结果的低字节,p的高字节作为结果的高字节组成一个新的整数. Input k[hex.]和p[oc ...

  5. 武汉科技大学ACM :1001: 华科版C语言程序设计教程(第二版)课后习题3.12

    Problem Description 输入n,输出对应的边长为n的空心正六边形. 为方便看图,样例中点 '.' 表示空格,打印图形时请打印空格而非小圆点. Input 边长n.(n<=20) ...

  6. 数据结构(c++)(第二版) Dijkstra最短路径算法 教学示范代码出现重大问题!

    前言 去年在数据结构(c++)的Dijkstra教学算法案例中,发现了一个 bug 导致算法不能正常的运行,出错代码只是4行的for循环迭代代码. 看到那里就觉得有问题,但书中只给了关键代码的部分,其 ...

  7. 算法(JAVA)----两道小小课后题

    LZ最近翻了翻JAVA版的数据结构与算法,无聊之下将书中的课后题一一给做了一遍,在此给出书中课后题的答案(非标准答案,是LZ的答案,猿友们可以贡献出自己更快的算法). 1.编写一个程序解决选择问题.令 ...

  8. 数据结构之BF算法,kmp算法,三元组,十字链表总结

    在这一章中,老师教了我们四种数据结构:BF算法,kmp算法,三元组和十字链表:还给我们讲了2019年团体天体赛中T1-8的AI题 1.对于BF和kmp算法,老师除了在课堂上讲解算法的主要核心思想外,还 ...

  9. C程序设计(谭浩强)第五版课后题答案 第一章

    大家好,这篇文章分享了C程序设计(谭浩强)第五版课后题答案,所有程序已经测试能够正常运行,如果小伙伴发现有错误的的地方,欢迎留言告诉我,我会及时改正!感谢大家的观看!!! 1.什么是程序?什么是程序设 ...

随机推荐

  1. LDAP-轻量级目录访问协议(统一认证)

    概念 LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP. 参考资料 LDAP概念和原理介绍 我花了一个五一终于搞懂 ...

  2. Spring boot 2.x 中使用redis

    一.添加Maven  依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...

  3. Linux (Ubuntu) 服务器安装MySQL,设置不限ip,root远程密码访问

    1.注释bind-address = 127.0.0.1 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf   将bind-address = 127.0.0.1 ...

  4. 使用display inline-block 布局时,出现的间距问题的解决办法和相关说明

    在CSS中,块级对象元素会单独占一行显示,多个block元素会各自新起一行.而内联对象元素前后不会产生换行,一系列inline元素都在一行内显示,直到该行排满. 使用 display inline-b ...

  5. Django 学习 之路由层(URL)

    路由层(URL) 1.路由层简单配置 (1)path方法 写固定的url. (2)re_path方法 可以正则规则 例: urlpatterns = [ path('admin/', admin.si ...

  6. C++11并发编程4------线程间共享数据

    举个例子: 刚参加工作的你,只能租房住,嫌房租贵就和别人合租了,两个人住一起只有一个洗手间,每天早上起床的时候,如果你室友在洗手间,你就只能等着,如果你强行进去,那画面就不可描述了.同样的问题,如果多 ...

  7. 科学计算库(BLAS,LAPACK,MKL,EIGEN)

    函数库接口标准:BLAS (Basic Linear Algebra Subprograms)和LAPACK (Linear Algebra PACKage) 1979年,Netlib首先用Fortr ...

  8. C. Gas Pipeline DP

    C. Gas Pipeline time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  9. ORM常用字段及查询

    目录 ORM常用字段及参数 创建表 ORM常用字段 ORM字段参数 ORM表关系创建 ForeignKey OneToOneField ManyToManyField 多对多三种创建方式 单表查询 q ...

  10. 视图家族 & 路由组件

    目录 视图家族 & 路由组件 视图集与路由组件 基于 GenericAPIView 的十大接口 基于 generics 包下工具视图类的六大基础接口 视图集 路由组件:必须配合视图集使用 自定 ...