//vs2013下编译通过.换别的编译器自行补充头文件和修改源代码
#include<iostream>
#include<fstream>
#include <string>
using namespace std;
char temp[256];//存放的临时数组
char virus[20];//病毒数组
char DNA[20];//DNA的数组
int j = 0;//病毒长度
int DNAlength = 0;//dna长度
int flag = 0;//判断是不是感染开关
void toCharArry(string str)//将读入的字符串转化为字符数组
{ j = 0;
int tem=0;
strcpy_s(temp, str.c_str());
//cout << str.length();
for (int i = 0; i < str.length(); i++)//找到空格的位置
{
if (temp[i] == ' '){ j=(i+1); break; }
}
tem = j;
for (int i = 0; i < str.length() - j + 1;i++)//写入DNA数组;
{
DNA[i] = temp[tem];
if (i == str.length() - j){
DNA[i] = '\0';//到底用不用加\我也不知道
}
tem++;
}
for (int i = 0; i < j; i++)//得到病毒序列
{
virus[i] = temp[i];
} /*for (int i = 0; i <9; i++)//输出Dna序列
{
cout <<DNA[i];
}
cout << endl; for (int i = 0; i < j; i++)//输出病毒序列
{
cout << virus[i];
}
cout << endl;
cout << j;*/
}
void addvVirusToDouble(char virus[])//将病毒序列扩大为原来二倍
{
int k = j-1;
for (int i = 0; i < j-1 ; i++)
{
virus[k] = virus[i];
k++;
}
/*for (int i = 0; i < j*2; i++)//输出病毒序列
{
cout << virus[i];
}
cout << endl;*/
}
int BF(int zhu, int fu, char virus[], char DNA[])//BF算法判断
{
int i = 0, j = 0; while (i <= zhu&&j <= fu)
{
if (DNA[i]==virus[j]){ i++; j++; }
else { i = i - j + 1; j = 0; } }
if (j > fu){ return 1; }
else return 0; }
void virusPossibility()//列出将长度扩大二倍的病毒序列可能性
{
char temp[30];
for (int i = 0; i < j; i++)
{
for (int k = 0; k < j; k++)temp[k] = virus[i + k];
//temp[j] = '\0';
if (BF(DNAlength - j - 1, j - 2, temp, DNA) == 1)flag = 1; }
/*if (flag == 1) { flag = 0; cout << "O" << endl; }
else cout << "X" << endl;
*/ }
void detection()//调用函数判断是否感染
{
int num = 0;
string str;
ifstream infile("病毒检测输入数据.txt", ios::in);
ofstream outfile("病毒检测结果.txt", ios::out);
if (!infile){ cout << "open document ERROE!!" << endl; exit(-1); }
else cout << "The document reads into success!!" << endl;
if (!outfile){ cout << "Establish document failure ERROE!!" << endl; exit(-1); }
getline(infile, str);
num = stof(str);//赋值给num之后判断;
//cout << num;
while (num--)
{
getline(infile, str);
DNAlength = str.length();
toCharArry(str);
addvVirusToDouble(virus);
virusPossibility();
if (flag == 1){ flag = 0; outfile << str + " " + "YES" << endl; }//妈的这里必须把flag弄成0,要不只要有一个是下面的都是了...
else { outfile << str + " " + "NO" << endl; }
} infile.close();
outfile.close(); } int main()
{
string str;
detection();
cout << "The TXTdocument outputs success!!!" << endl; }

程序截图:

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

数据结构第二版之(课后题)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. 【python-leetcode25-翻转链表】K 个一组翻转链表

    问题描述: 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序. 示例 ...

  2. 【转载】手把手教你使用Git(简单,实用)

    手把手教你使用Git(简单,实用) 标签: git 2016年04月21日 20:51:45 1328人阅读 评论(0) 收藏 举报 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. ...

  3. java使用netty模拟实现一个类dubbo的分布式服务调用框架

    本文较长,如果想直接看代码可以查看项目源码地址: https://github.com/hetutu5238/rpc-demo.git 要想实现分布式服务调用框架,我们需要了解分布式服务一般需要的功能 ...

  4. Springboot + redis + 注解 + 拦截器来实现接口幂等性校验

    Springboot + redis + 注解 + 拦截器来实现接口幂等性校验   1. SpringBoot 整合篇 2. 手写一套迷你版HTTP服务器 3. 记住:永远不要在MySQL中使用UTF ...

  5. 一键GHOST使用图文教程

    一.准备工作 系统安装好以后,对系统进行及时备份,以防不测,以后恢复时三五分钟即可完成,还你一个全新的完整系统. 一键GHOST V8.3 Build 060903 硬盘版免费下载 从以上地址下载软件 ...

  6. ASP.NET MVC4 Web项目中使用Log4Net记录日志到文件和数据库。

    下载与.netframework版本向对应的log4net.dll ,然后添加引用.下载地址:http://logging.apache.org/log4net/download_log4net.cg ...

  7. No module named 'widgets'

    https://blog.csdn.net/heatdeath/article/details/70313645 适配python3的. https://github.com/twz915/Djang ...

  8. Ubuntu 16.04 编译安装&&用dpkg安装--zabbix3.4

    编译安装zabbix3.4,官方有教程,但是遇到一些报错: 总结下来,需要安装这些环境: 更新系统: apt update apt upgrade 先装这些: apt-get install libm ...

  9. java并发之CopyOnWriteArraySet

    java并发之CopyOnWriteArraySet CopyOnWriteArraySet是基于CopyOnWriteArrayList实现的,持有CopyOnWriteArrayList的内部对象 ...

  10. Hystrix熔断机制导致误报请求超时错误

    问题的过程如下: (1)前端向服务端请求往HBase插入1000条数据: (2)请求经路由网关Zuul传递给HBaseService,HBaseService执行插入操作: (3)插入操作需要的时间超 ...