Задание № 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 системах. Запустите его через консоль, чтобы увидеть результат.
Если в ходе компиляции возникают ошибки, внимательно изучите где они произошли и что произошло.

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: