Задание № 1. Поиск показателя GC
Описание проблемы
Цепочка ДНК должна быть каким-либо образом обозначена в базе данных. Обычно используют метод обозначения называемый формат FASTA. В этом формате цепочка представлена в виде строки, которая начинается со знака «>», за которым следует информация о названии и характере строки. Последующие строки содержат саму строку; следующая строка, начинавшаяся со знака «>» указывает на обозначение следующей цепочки.
В нашей реализации цепочка в формате FASTA будет помечена ID «Rosalind_XXXX», где «XXXX» обозначает четырёхзначное число между 0000 и 9999.
Дано: Максимум 10 цепочек ДНК в формате FASTA (каждая длинной не более 1 тыс. знаков).
Возвращаемое значение: ID цепочки, имеющей наибольший показатель содержания GC (относительная величина содержания цитозина (C) и гуанина (G) от общего числа нуклеотидов в цепочке, выраженная в процентах), за которым следует сам показатель цепочки с точностью до 2-х десятичных знаков.
Пример данных:
>Rosalind_Sequence_6404 CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTT CCCTCCCACTAATAATTCTGAGG >Rosalind_Sequence_5959 CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGG TCTATATCCATTTGTCAGCAGACACGC >Rosalind_Sequence_0808 CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCC GGACTGGGAACCTGCGGGCAGTAGGTGGAAT
Пример возвращаемого значения:
Rosalind_Sequence_0808 60.92%
Задание: допишите недостающую часть кода в code_template.cpp так, чтобы программа заработала корректно. Файлы code_template.cpp и rosalind_GC.txt следует поместить в одну и ту же папку; если вы работаете с Windows, то путь до папки не должен содержать пробелов или букв не латинского алфавита.
Исходные данные задания
Файл входных данных: rosalind_GC.txt
Исходный код программы:
/* Template of the assignment 1 */ // Include libraries #include <cstdio> #include <fstream> #include <string> using namespace std; // Main function int main() { // Open file "rosaling_GC.txt" without any errors check ifstream sample; sample.open("rosalind_GC.txt"); if (!sample.good()) { // Check has file been opened printf("%s\n", "Bad file. Does it exist?"); return -1; } // Define a strands' amount to process const unsigned int STRANDS_AMOUNT = 9; // 2 arrays keep a pair of values: id of a strand and the strand itself // e.g. // >strand1 // ACTGA // GTTC // >strand2 // CTGGC // will be kept as ids[0] == "strand1", ids[1] == "strand2" // strands[0] == "ACTGAGTTC", strands[1] == "CTGGC" string ids[STRANDS_AMOUNT]; string strands[STRANDS_AMOUNT]; // Some auxiliary variables int pos = -1; string currentLine; // Loop writes a pair of a strand's id and the strand to arrays while (!sample.eof()) { getline(sample, currentLine); // read one line from txt if (currentLine[0] == '>') { // check if it's id pos++; ids[pos] = currentLine.substr(1, currentLine.length()); // fill id strands[pos] = ""; } else { // else proceed the strand filling int winReturnPos = currentLine.rfind('\r'); // A dirty hack aganst a windows file format strands[pos] += currentLine.substr(0, (winReturnPos < 0) ? currentLine.length() : winReturnPos); } }; // some auxiliary variables int maxValuePosition = 0; double maxValue = 0.0; // ============ YOUR CODE HERE ======================= // ==================================================== printf("%s\n%.2f%%\n" , ids[maxValuePosition].c_str(), maxValue); sample.close(); return 0; };
Необходимые инструменты
Windows: mingw (Как установить? Клик!)
Linux: gnu gcc compiler
Mac: XCode с g++
Для компиляции программы необходимо через командную строку запустить программу g++ с указанием компилируемого файла, например:
g++ code_template.cpp
В результате в папке появится исполняемый файл под название «a.exe» в Windows или просто «a» в *nix-like системах. Запустите его через консоль, чтобы увидеть результат.
Если в ходе компиляции возникают ошибки, внимательно изучите где они произошли и что произошло.