Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 21.09.2014
Сообщений: 6
1

Найти ID цепочки ДНК, имеющей наибольший показатель содержания GC

21.09.2014, 17:51. Показов 1206. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, как можно дописать код, чтобы программа заработала? Вот условие и сама программа:
Дано: Максимум 10 цепочек ДНК в формате FASTA (каждая длинной не более 1 тыс. знаков).
Возвращаемое значение: ID цепочки, имеющей наибольший показатель содержания GC, за которым следует сам показатель цепочки с точностью до 2-х десятичных знаков.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/* 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;
};
Текстовый файл с данными
http://markoutte.me/wp-content... ind_GC.txt
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.09.2014, 17:51
Ответы с готовыми решениями:

STL: найти все максимальные цепочки подряд идущих положительных чисел с указанием длины каждой цепочки
Создать массив длины N (число N вводится с клавиатуры). Заполнить массив рандомно. Найти все...

По исходной и требуемой цепочкам ДНК найти необходимую для этого цепочку элементарных преобразований
Преобразование ДНК Биологи лаборатории Advanced Celluar Mechanics Lab. (ACM Lab.) занимаются...

Найти время, за которое двойная спираль молекулы ДНК может раскрутиться на две отдельные спирали
Считая молекулу ДНК &quot;плотно упакованной&quot; двойной спиралью радиусом R=6,8*{10}^{-10}м,найти...

найти показатель
найти показатель, с которыми число 5 содержится в числе 60!/30!*30!

7
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
21.09.2014, 20:01 2
Цитата Сообщение от Sanchezzz961 Посмотреть сообщение
показатель цепочки
А что это?
0
0 / 0 / 0
Регистрация: 21.09.2014
Сообщений: 6
21.09.2014, 20:25  [ТС] 3
Если своими словами, то в ответе должно получится номер цепочки и процентное соотношение GC(относительно других символов) наибольшей из цепочек
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
21.09.2014, 21:18 4
Если своими словами, то в ответе должно получится номер цепочки и процентное соотношение GC(относительно других символов) наибольшей из цепочек
C++
1
2
3
4
int GC_count=0;
for(size_t pos=0;pos!=string::npos;pos=sequence.find("GC",pos),++GC_count)
    if(pos!=string::npos)
        pos+=2;
GC_count в проценты сами переведете?
0
0 / 0 / 0
Регистрация: 21.09.2014
Сообщений: 6
21.09.2014, 21:45  [ТС] 5
Renji, при попытке скомпилировать выдает ошибку связанную с sequence, а именно: 'sequence' was not declared in this scope. Не подскажете, что можно сделать?
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
22.09.2014, 02:57 6
Цитата Сообщение от Sanchezzz961 Посмотреть сообщение
Renji, при попытке скомпилировать выдает ошибку связанную с sequence, а именно: 'sequence' was not declared in this scope. Не подскажете, что можно сделать?
Поменять слово "sequence" на имя переменной с последовательностью в которой надо искать GC. Извините, не вникал где в вашем коде что лежит.
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
22.09.2014, 09:57 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/////////////////////////////////////////////////////////////////////////////////////////
//Дано: Максимум 10 цепочек ДНК в формате FASTA (каждая длинной не более 1 тыс. знаков).
//Возвращаемое значение: ID цепочки, имеющей наибольший показатель содержания GC, за которым 
//следует сам показатель цепочки с точностью до 2-х десятичных знаков.
//
// 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"
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cctype>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <map>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string                             T_str;
typedef T_str::size_type                        T_pos;
typedef std::map        < T_str,    T_str   >   T_DNA_chain_of_chain_name;
typedef std::pair       < T_str,    T_str   >   T_chain_name_and_chain;
typedef std::multimap   < double,   T_str   >   T_DNA_chain_name_of_GC_rate;
/////////////////////////////////////////////////////////////////////////////////////////
void    remove_from_string_symbol_and_spaces
    (
        T_str   &   s,
        char        bad_symb
    )
{
    s.erase
        (
            std::remove_if
                (
                    s.begin     (),
                    s.end       (),
 
                    [=]         ( char  c )
                    {
                        return      c == bad_symb
                                ||  isspace(c);
                    }
                ),
 
            s.end()
        );
}
/////////////////////////////////////////////////////////////////////////////////////////
namespace std
{
    std::istream    &   operator>>
        (
            std::istream            &   istr,
            T_chain_name_and_chain  &   chain_name_and_chain
        )
    {
        static  const   char    CHAIN_NAME_PREFIX   =   '>';
 
        getline                                 ( istr,     chain_name_and_chain.first                          );
        getline                                 ( istr,     chain_name_and_chain.second,    CHAIN_NAME_PREFIX   );
 
        remove_from_string_symbol_and_spaces    ( chain_name_and_chain.first,   CHAIN_NAME_PREFIX   );
        remove_from_string_symbol_and_spaces    ( chain_name_and_chain.second,  CHAIN_NAME_PREFIX   );
 
        return  istr;
    }
}
////////////////////////////////////////////////////////////////////////////////////////
class   T_DNA_calculator
{
    //-----------------------------------------------------------------------------------
    T_DNA_chain_of_chain_name       DNA_chain_of_chain_name_;
    T_DNA_chain_name_of_GC_rate     DNA_chain_name_of_GC_rate_;
    //-----------------------------------------------------------------------------------
public:
    //-----------------------------------------------------------------------------------
    void    load_data_from_file( T_str  const   &   filename )
    {
        std::ifstream   ifile( filename );
 
        if( !ifile )
        {
            std::cout   <<  "Файл \""
                        <<  filename
                        <<  "\" не найден."
                        <<  std::endl;
 
            system("pause");
            exit(0);
        }//if
 
        std::copy
            (
                std::istream_iterator< T_chain_name_and_chain >     ( ifile ),
                std::istream_iterator< T_chain_name_and_chain >     (),
 
                std::inserter
                    (
                        DNA_chain_of_chain_name_,
                        DNA_chain_of_chain_name_.begin()
                    )
            );
    }
    //-----------------------------------------------------------------------------------
    void    calc_GC_rate()
    {
        std::transform
            (
                DNA_chain_of_chain_name_.begin  (),
                DNA_chain_of_chain_name_.end    (),
 
                std::inserter
                    (
                        DNA_chain_name_of_GC_rate_,
                        DNA_chain_name_of_GC_rate_.begin()
                    ),
 
                [=]  ( T_DNA_chain_of_chain_name::value_type    const   &   chain_name_and_chain )
                {
                    return  std::make_pair
                                (
                                    get_GC_rate_for_DNA_chain( chain_name_and_chain.second ),
                                    chain_name_and_chain.first
                                );
                }
            );
    }
    //-----------------------------------------------------------------------------------
    void    print_max_GC_rate()
    {
        static  const   int     PRECISION   =   2;
        auto                    rev_it      =   DNA_chain_name_of_GC_rate_.rbegin();
 
        std::cout   <<  "Частота подстроки \"GC\" максимальна в цепочке \""
                    <<  rev_it->second
                    <<  "\" "
                    <<  std::endl
                    <<  "и составляет "
                    <<  std::fixed
                    <<  std::setprecision( PRECISION )
                    <<  rev_it->first
                    <<  " %."
                    <<  std::endl;
    }
    //-----------------------------------------------------------------------------------
private:
    //-----------------------------------------------------------------------------------
    double  get_GC_rate_for_DNA_chain( T_str   const   &   chain )
    {
        static  const   int     PERCENT_PER_UNIT    =   100;
        int                     GC_counter          =   0;
        T_pos                   find_begin_pos      =   0;
        T_str                   substr_for_find     =   "GC";
 
        while   (
                        (
                            find_begin_pos  =   chain.find
                                                    (
                                                        substr_for_find,
                                                        find_begin_pos
                                                    )
                        )
 
                    !=  T_str::npos
                )
        {
            ++GC_counter;
            ++find_begin_pos;
        }//while
 
        return  double( GC_counter ) / chain.size() * PERCENT_PER_UNIT;
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
    const   T_str       DNA_FILENAME    =   "dna.txt";
    T_DNA_calculator    DNA_calculator;
 
    DNA_calculator.load_data_from_file  ( DNA_FILENAME );
    DNA_calculator.calc_GC_rate         ();
    DNA_calculator.print_max_GC_rate    ();
    system("pause");
}
0
0 / 0 / 0
Регистрация: 21.09.2014
Сообщений: 6
22.09.2014, 11:09  [ТС] 8
Mr.X, большое спасибо за программу, но мне надо только дописать недостающую часть.
0
22.09.2014, 11:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2014, 11:09
Помогаю со студенческими работами здесь

Найти показатель степени
Всем привет, это снова я. Появились проблемы с одной задачей. Не пойму как ее написать. Помогите...

Найти показатель степени
Дано целое число N (&gt; 0), являющееся некоторой степенью числа 2: N = 2K. Найти целое число K —...

Найти показатель степени числа
Что нужно, чтобы реализовать программу, которая показывает показатель степени?

Найти показатель преломления жидкости
Собственно, еще одна задача, которую не смог решить. Пробовал, но не получилось. Прошу, помогите с...

Найти показатель степени числа
Есть число 0.0045 представляем его в виде 4.5*10^(-3). Мне нужно сохранить -3. Или допустим 425...

Найти показатель преломления стекла
Найти показатель преломления стекла, если при отражении от него света отраженный луч будет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru