У меня есть задание, в котором я должен взять последовательность нуклеотидов по три за раз, которые разделены пробелами.например, ACT GAT CCT и т. д. - PullRequest
0 голосов
/ 21 мая 2019

У меня есть задание, в котором я должен взять последовательность нуклеотидов, по три за раз, которые разделены пробелами. например ACT GAT CCT. Нуклеотиды должны соответствовать значениям: A, C, G, T, где A = 0, C = 1, G = 2, T = 3. Затем мне нужно преобразовать нуклеотиды в число кодонов по формуле:

????? = (????? × 4 + ??????) × 4 + ?ℎ???

Пример: если вход ACT, A - первый, C - второй, а T - третий, следовательно, поскольку А = 0, С = 1, Т = 3

codon = (0 * 4 + 1) * 4 + 3
codon = 7

Мне нужно знать, как лучше получить информацию от пользователя, а также какие ошибки я совершаю.

До сих пор я использовал комбинацию циклов для получения ввода. Первый цикл должен работать до EOF. Предполагается, что внутренний цикл выполняется 3 раза, пока он получает нуклеотидный характер из потока. Я хочу знать, может ли использование scanf дать мне лучшие результаты, также если мне нужно использовать выделение памяти для codonArray.

#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <stdbool.h>
#include <ctype.h>

#define MAX_LENGTH 3
#define CAPACITY 1000
uint64_t numbers[CAPACITY];

bool matchesChar(int ch, char arr[]);
int codonConverter(int ch);

int main() {

    char nucleiotideArray[] = {'A','C','G','T'};

    /*while (scanf_s("%lf", &number) == 1);*/

    int ch = 0;
    int i = 0;
    int count = 0;
    int first, second, third;
    int codonNumber[CAPACITY];
    int codonValue = 0;
    int nuceliotideChar[MAX_LENGTH];

    printf("Enter a nucleiotide sequence\n");
        do {
            while ((ch = getchar()) != EOF || ch != ' ' || count < MAX_LENGTH) {
                toupper(ch);
                if (matchesChar(ch, nucleiotideArray) == true) {
                    nuceliotideChar[count] = codonConverter(ch);
                    count++;
                }
            }
            //reset count
            count = 0;

            first = nuceliotideChar[0];
            second = nuceliotideChar[1];
            third = nuceliotideChar[2];

            // fromula to find 
            codonValue = (first * 4 + second) * 4 + third;
            codonNumber[i] = codonValue;
            i++;

        } while (ch != EOF);


}

bool matchesChar(int ch, char arr[]) {
    int check = 0;
    size_t arraySize = sizeof(arr) / sizeof(arr[0]);
    for (size_t i = 0; i < arraySize; ++i) {
        if (arr[i] == ch)
            check = 1;
        else
            check = 0;
    }

    if (check == 1)
        return true;
    else
        return false;

}

int codonConverter(int ch) {
    if (ch == 'A') {
        return 0;
    }
    else if (ch == 'C') {
        return 1;
    }

    else if (ch == 'G') {
        return 2;
    }

    else if (ch == 'T') {
        return 3;
    }
    else
        return 0;

}

Ввод: ACT GAT CCT
Ouput: 7 35 23

...