2016-04-23 4 views
2

Я пытаюсь написать код, который будет сравнивать 10 фрагментов последовательности ДНК с ДНК последовательности 10 родственников. Пользователь вводит свое имя, количество родственников, которых они хотят сравнить, и их ДНК. Компьютер выводит процент соответствия. ATTAGACGCA по сравнению с ATAAGACGCA будет соответствовать 90%. Количество родственников является постоянным после того, как пользователь указывает, сколько родственников. Я попытался использовать const, но, похоже, он не хочет использовать этот номер.Использование переменной в качестве параметра массива в C++

/********************************************************************** 
* Get DNA Sequence 
***********************************************************************/ 
void getMyDNA(char myDNA[]) 
{ 
    cout << "Enter your DNA sequence: "; 
    cin >> myDNA; 
} 

/********************************************************************** 
* Get Potential Relatives 
***********************************************************************/ 
int getRelatives() 
{ 
    int relatives = 0; 
    cout << "Enter the number of potential relatives: "; 
    cin >> relatives; 

    return relatives; 
} 

/********************************************************************** 
* Get Potential Relatives Names 
***********************************************************************/ 
void getRelativeName(string relativeNames[], int relatives) 
{ 
    string name; 
    for (int i = 0; i < relatives; i++) 
    { 
     cout << "Please enter the name of relative #" << i + 1 << ": "; 
     cin >> name; 
     relativeNames[i] = name; 
    } 
} 

/********************************************************************** 
* Get Potential Relatives DNA Sequence 
***********************************************************************/ 
void getRelativeDNA(char relativeDNA[][10], string relativeNames[], int relatives) 
{ 
    for (int i = 0; i < relatives; i++) 
    { 
     cout << "Please enter the DNA sequence for " << relativeNames[i] << ": "; 
     cin >> relativeDNA[i]; 
    } 
} 

/********************************************************************** 
* Display Potential Relatives Match 
***********************************************************************/ 
void displayMatch(string relativeNames, char relativeDNA[][10], int relatives, char myDNA[]) 
{ 
    const int family = relatives; 
    int count[family] = 0; 
    for (int r = 0; r < 3; r++) //relative number r 
    { 
     for (int d = 0; d < 10; d++) //dna piece number d 
     { 
     if (relativeDNA[r][d] == myDNA[d]) 
      count[r]++; 
     } 
    } 
} 

/********************************************************************** 
* Main 
***********************************************************************/ 
int main() 
{ 
    char myDNA[10]; 
    string relativeNames[50]; 
    char relativeDNA[50][10]; 

    // My DNA 
    getMyDNA(myDNA); 


    //# of relatives 
    int relatives = getRelatives(); 
    cout << endl; 

    //thier names 
    getRelativeName(relativeNames,relatives); 
    cout << endl; 


    //their dna 
    getRelativeDNA(relativeDNA,relativeNames,relatives); 
    cout << endl; 

    //display 
    displayMatch(relativeNames,relativeDNA,relatives,myDNA); 

    return 0; 
} 
+0

C++ не имеет [массивы переменной длины] (https://en.wikipedia.org/wiki/Variable-length_array), поэтому технически это недопустимо C++. Если вы хотите, чтобы массив переменной длины использовал ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector). –

+0

Кроме того, что означает 'count'? Это массив или нет? –

+0

Я обновил свой вопрос, чтобы включить весь мой код. Граф должен считать, сколько букв в последовательности ДНК между мной и моим родственником одинаково. –

ответ

2

count Если новый массив создать новый массив динамически, как следует ...

int *count = new int[relatives]; 

Я заметил, что вы используете следующие позже ...

count++; 

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

#include <assert.h> 
#include <iostream> 
#include <typeinfo> 

int main(void) { 
    const int x = 500; 
    int* a = new int[x]; 
    size_t i = 0; 
    for(i = 0; i < x;i++) { 
    a[i] = i; 
    } 

    for(i = 0; i < x;i++) { 
    //Print numbers without moving pointer 
    std::cout << a[i] << std::endl; 
    } 
    for(i = 0; i < x;i++) { 
    //Print numbers moving pointer 
    std::cout << a[0] << std::endl; 
    a++; 
    } 
    a = a - x; 
    delete[] a; 
    return 0; 
} 
+1

Консультирование новичков по использованию 'new' для массива является диаболическим. –

+0

И никаких упоминаний об использовании 'delete []'. – PaulMcKenzie

+0

Я исправлю это галочкой – Harry

2

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

int *count = new int[relatives]; 
+0

Пожалуйста, не используйте термин 'vector', чтобы описать, что вы советуете OP. – PaulMcKenzie

+0

Я не уверен, что '' динамический массив '' - хороший термин для этого. Его размер является переменной, но массив никоим образом не является динамическим. –

+1

@MatthewCliatt Вы правы, моя ошибка. –

2

Вместо

int count[relatives] = 0; 

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

std::vector<int> count(relatives); 

Включите <vector> заголовок.

+0

Даже если «родственники» не могут меняться, разве это еще недействительный код? Вы не можете назначить целочисленный массив целому числу. –

+1

@MatthewCliatt: Да, инициализатор должен быть исправлен, например '{0}' (или просто '{}'). –