У меня есть задание, в котором я должен взять последовательность нуклеотидов, по три за раз, которые разделены пробелами. например 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