c++ - 基本使用类来执行基本的定量生物学

标签 c++

我正在编写一个程序来执行基本的定量生物学操作。我有两个单独的文件,.h 和 .cpp。 .h 包含我的带有函数原型(prototype)的类,我的 .cpp 包含我的函数定义。我觉得我写的代码是正确的,但它不会编译。这是我的代码:

//.h file

#ifndef __JMCREADY_QUBIENGINE_H_
#define __JMCREADY_QUBIENGINE_H_
#include <vector>
#include <string>
#include <fstream>
using namespace std;

class QubiEngine{
private:
   vector<string> dna;
public:
   QubiEngine();                    //Default constructor
   QubiEngine(ifstream& dnaFile);       //Reads lines from given input file and pushes every read DNA sequence into the dna vector.
   void dna2rna();              //Reads the DNA from the dna vector and computes it's RNA, then stores them in a file rna.txt
   void compute_revcom();           //Reads the DNA sequences from the dna vector, computes the reverse, and stores in revcom.txt
   void nucl_frequency();           //Counts the total occurances of each nucleotide in the DNA sequence.
   int count_CpG();             //Counts the occurance of the string "CG"
   bool isPalindromic();                //Checks if the string is palindromic.

};

#endif
//.cpp file

#include "jmcready_QubiEngine.h"
  #include <iostream>
  #include <string>
  #include <vector>
  #include <fstream>
  #include <algorithm>
  #include <iterator>
  using namespace std;

  QubiEngine::QubiEngine(ifstream& dnaFile){
    string neucleotides;                    //Declares an empty string of nucelotides,
                                        //opens the file to be stored into the vector,
    while (getline(dnaFile, neucleotides)){ //and while it is reading the whole line from the
       dna.push_back(neucleotides);     //dnaFile, it is pushing the nucelotides into the vector.
   }
  }


 void QubiEngine::dna2rna(){
   ofstream outfile;
   outfile.open("rna.txt");         //Creates a blank text file
   const char* foo = "t";
   for (vector<string>::iterator it = dna.begin(), endOfString = dna.end(); it != endOfString; it++){
    if ( find(dna.begin(), dna.end(), foo) != dna.end() ){              //for loop with a nested if statement to run through each
        dna.at(*foo) = "u";                  //member of the vector and check if the iterator is equal
        outfile << *it;             //to "t", if it is, it is changed to "u."
    }                               //Then saves the new iterator value to the outfile.
}
 outfile.close();               //Closes the file so no further changes can be made.
}

void QubiEngine::compute_revcom(){
char letter = '\0';

ofstream outfile;
outfile.open ("revcom.txt");            //Another blank text file.
vector<string> temp;                //A dummy blank vector to store the reverse of the dna vector.
reverse( dna.begin(), dna.end() );  //Stores the reverse of vector dna to temp vector.
               for (vector<string>::iterator it = temp.begin(), endOfString = temp.end(); it != endOfString; it++){
                   while ( it != dna.end() ){       //For loop with nested while loop to change
                       switch(letter){              //each element in the temp vector to it's complement element.
                           case 'a' :
                               *it = "t";
                               break;
                           case 't' :
                               *it = "a";
                               break;
                           case 'c' :
                               *it = "g";
                               break;
                           case 'g' :
                               *it = "c";
                               break;
                           default :
                               cout << "File contains elements that aren't valid, please fix."<< endl;
                               break;
                       }
                   }
  }
  outfile.close();
}

 void QubiEngine::nucl_frequency(){
int numOfA = 0;             //Declares multiple counts and letters
    int numOfT = 0;             //to keep track of each nucleotide seperately
    int numOfC = 0;
    int numOfG = 0;
    string a = "a";
    string t = "t";
    string c = "c";
    string g = "g";

    for (vector<string>::iterator it = dna.begin(), endOfString = dna.end(); it != endOfString; it++){
        if (*it == a){              //For loop with multiple nested if statements
                numOfA++;                   //to check each individual element
            }                       //and count it towards the total.
            if(*it == t){
                    numOfT++;
            }
            if (*it == c){
                    numOfC++;
            }
            if (*it == g){
                    numOfG++;
            }
    }
 }

int QubiEngine::count_CpG(){

int count = 0;
    string CpG = "cg";

    for (vector<string>::iterator it = dna.begin(), endOfString = dna.end(); it != endOfString; it++){
        if (*it == CpG){                //For loop with nested if statement to check
                count++;                    //for the string "cg" and add them to an int
            }                       //counter.
    }

    return count;
}


bool QubiEngine::isPalindromic(){

for (vector<string>::iterator it = dna.begin(), endOfString = dna.end(); it != endOfString; it++){

    if(*it == string(dna.rbegin(), dna.rend())){        //For loop with nested if statement
                return true;
            }                                //to check if *it is equal to
            else{
                    return false;
            }                            //the reverse of it's original,
                                                    //if it is equal than it is palindromic.
                   }
}



int main (int args, char* argv[]) {         //Main function given in the pdf, calls each

ifstream dnaFile;                   //public function to check if it works, and how
    dnaFile.open("dna.txt");

    QubiEngine qbengine(dnaFile);               //effectively.
    qbengine.dna2rna();

    qbengine.compute_revcom();

    qbengine.nucl_frequency();

    int cpg = qbengine.count_CpG();
    cout << "The total number of CG islands is : " << cpg << endl;

    if ( qbengine.isPalindromic() )
        cout << "Palindromic" << endl;
    else
        cout << "Not Palindromic" << endl;
    return 0;
};               

编辑:我已经设法修复了尽可能多的错误。唯一剩下的就是一些编译器错误,希望有人能给我一些提示。错误在底部的评论中

最佳答案

QubiEngine::QubiEngine(ifstream& dnaFile)中不要做

dnaFile("dna.txt");

它已经初始化(在 main 中)而且它不是正确的语法。

dna2rna*it 是一个 string 所以在 *it == 't' 你尝试将 stringchar 进行比较。它不会工作,但你已经知道如何解决这个问题:你在别处使用 string::iterator,用它遍历字符串中的所有 char 并比较 charchar

compute_revcom 中,您永远不会初始化letter,而是在switch 中使用它,使用st。 您也不要在 while 中推进 string::iterator。您还需要使用'' 代替"t",一个是char,另一个是字符串。

再次在 nucl_frequency 中比较 stringchar,使用 string::iterator

count_CpG 中,您忘记了 dna 的类型,它是一个字符串 vector ,请使用正确的迭代器类型。此外,*it == CpG 将比较两个字符串是否相等,这不是您想要的。

如果 *it 是“cgcg”,您希望计数为 2,但实际上为 0。看看您是否可以使用 string::iterator 完成此任务.

还有

vector<string>& temp = dna;            //A dummy blank vector to store the reverse of the dna vector.

因为那个“&”它不会像你想的那样,temp 将是 dna(准确地)而不是拷贝。

可能还有很多。

尽量不要一次写完所有的东西,在最后构建。相反,编写一个函数或函数的一部分并构建(和测试)它。

从编译和工作的小程序转移到编译和工作的稍大的程序。重复直到完成!

关于c++ - 基本使用类来执行基本的定量生物学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16491043/

相关文章:

c++ - 无法在 VS 2015 中创建 C++ ConsoleApplication 或 C++ EmptyProject

c++ - 在末尾移动容器的项目(双端队列)

C++ 神秘结构赋值与 int 截断

c++ - SQLITE 内存不足无法执行语句

c++ - Boost-python 如何将 C++ 类实例传递给 Python 类

c++ - OpenGL-三角形没有被显示?

c++ - DLL 注入(inject)有效,除非我在 Qt Creator 中编译它

c++ - 如何使用 NTEventLogAppender?

c++ - Boost::Bimap 等价于双向 multimap

c++ - 为什么我的 hello world 程序不能在 C++ 中运行?