If and Else referências e sintaxe [RESOLVIDO]

1. If and Else referências e sintaxe [RESOLVIDO]

Mistery
Cmistry

(usa Ubuntu)

Enviado em 31/01/2020 - 10:34h

O que acontece no terceiro for dentro do main que ele imprime assim
----> http://i.stack.imgur.com/TD2CT.png <--- ????
O objetivo no terceiro for é varrer a string verificando de 3 em 3 letras e imprimir uma outra
Assim como fiz em python ---->
http://i.stack.imgur.com/JZcJb.png
Utilizando essa sequência...
-->
AGCTAGCTAGCGTGCATAGCTGATCGATGCAGTGCTAGCTAGCAGTCAGTCAGCACGTGATAGCGTACGTAG
<--

Alusão em Java
https://pt.stackoverflow.com/questions/46342/como-verificar-se-os-quatro-primeiros-caracteres-de-uma...



#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BFFSIZE 50
int str_tamanho(char *str){
//função q retorna o tamanho da string
int cont = 0;
for(;*str;str++) cont ++;
return cont;
}
int str_valida(char *str){
//função q avalia se a string é valida
for(;*str;str++)
if(!( *str=='A' || *str=='C' || *str=='G' || *str=='T' || *str=='a' || *str=='g' || *str=='c' || *str=='t')) return 0;
return 1;
}
int main(void){
char str_P[BFFSIZE];
int i,x,d,e;
printf("Informe uma fita de DNA:\n");
scanf("%s",&str_P);
d = str_tamanho(str_P);
if(!(str_valida(str_P)))
//se não forem validas
printf("Invalida - permitido somente A C G T...");
else if(d % 3==0){
//se td estiver ok...
//puts("Fita complementar: ");
for(i=0;str_P[i];i++){
//varre a string T inteira atras de uma letra igul
if(str_P[i] == 'A'){ printf("T");
}else if(str_P[i] == 'G'){ printf("C");
}else if(str_P[i] == 'C'){ printf("G");
}else if(str_P[i] == 'T'){ printf("A");
}else if(str_P[i] == 'g'){ printf("c");
}else if(str_P[i] == 'c'){ printf("g");
}else if(str_P[i] == 't'){ printf("a");
}else if(str_P[i] == 'a'){ printf("t");}
}
printf("\n");
for(e=0;str_P[e];e++){
//varre a string T inteira atras de uma letra igul part2
if(str_P[i] == 'A'){ printf("A");
}else if(str_P[e] == 'G'){ printf("G");
}else if(str_P[e] == 'C'){ printf("C");
}else if(str_P[e] == 'T'){ printf("U");
}else if(str_P[e] == 'g'){ printf("g");
}else if(str_P[e] == 'c'){ printf("c");
}else if(str_P[e] == 't'){ printf("u");
}else if(str_P[e] == 'a'){ printf("a");}
}
printf("\n");
for(x=0;str_P[x];x++){
//varre a string T inteira atras de uma letra igul part 3
if(str_P[x] == 'GGG'||'ggg'){ printf("\33[1;35mG\33[0m");
}if(str_P[x] == 'GGA'||'gga'){ printf("\33[1;35mG\33[0m");
}if(str_P[x] == 'GGC'||'ggc'){ printf("\33[1;35mG\33[0m");
}if(str_P[x] == 'GGT'||'ggt'){ printf("\33[1;35mG\33[0m");
}if(str_P[x] == 'GAG'||'gag'){ printf("\33[0;36mE\33[0m");
}if(str_P[x] == 'GAA'||'gaa'){ printf("\33[0;36mE\33[0m");
}if(str_P[x] == 'GAC'||'gac'){ printf("D");
}if(str_P[x] == 'GAT'||'gat'){ printf("D");
}if(str_P[x] == 'GCG'||'gcg'){ printf("\33[1;36mA\33[0m");
}if(str_P[x] == 'GCA'||'gca'){ printf("\33[1;36mA\33[0m");
}if(str_P[x] == 'GCC'||'gcc'){ printf("\33[1;36mA\33[0m");
}if(str_P[x] == 'GCT'||'gct'){ printf("\33[1;36mA\33[0m");
}if(str_P[x] == 'GTG'||'gtg'){ printf("\33[0;35mV\33[0m");
}if(str_P[x] == 'GTA'||'gta'){ printf("\33[0;35mV\33[0m");
}if(str_P[x] == 'GTC'||'gtc'){ printf("\33[0;35mV\33[0m");
}if(str_P[x] == 'GTT'||'gtt'){ printf("\33[0;35mV\33[0m");
}if(str_P[x] == 'AGG'||'agg'){ printf("\33[0;32mR\33[0m");
}if(str_P[x] == 'AGA'||'aga'){ printf("\33[0;32mR\33[0m");
}if(str_P[x] == 'AGC'||'agc'){ printf("\33[0;37mS\33[0m");
}if(str_P[x] == 'AGT'||'agt'){ printf("\33[0;37mS\33[0m");
}if(str_P[x] == 'AAG'||'aag'){ printf("\33[1;30mK\33[0m");
}if(str_P[x] == 'AAA'||'aaa'){ printf("\33[1;30mK\33[0m");
}if(str_P[x] == 'AAC'||'aac'){ printf("N");
}if(str_P[x] == 'AAT'||'aat'){ printf("N");
}if(str_P[x] == 'ACG'||'acg'){ printf("\33[0;34mT\33[0m");
}if(str_P[x] == 'ACA'||'aca'){ printf("\33[0;34mT\33[0m");
}if(str_P[x] == 'ACC'||'acc'){ printf("\33[0;34mT\33[0m");
}if(str_P[x] == 'ACT'||'act'){ printf("\33[0;34mT\33[0m");
}if(str_P[x] == 'ATG'||'atg'){ printf("\33[1;33mM\33[0m");
}if(str_P[x] == 'ATA'||'ata'){ printf("I");
}if(str_P[x] == 'ATC'||'atc'){ printf("I");
}if(str_P[x] == 'ATT'||'att'){ printf("I");
}if(str_P[x] == 'CGG'||'cgg'){ printf("\33[0;32mR\33[0m");
}if(str_P[x] == 'CGA'||'cga'){ printf("\33[0;32mR\33[0m");
}if(str_P[x] == 'CGC'||'cgc'){ printf("\33[0;32mR\33[0m");
}if(str_P[x] == 'CGT'||'cgt'){ printf("\33[0;32mR\33[0m");
}if(str_P[x] == 'CAG'||'cag'){ printf("Q");
}if(str_P[x] == 'CAA'||'caa'){ printf("Q");
}if(str_P[x] == 'CAC'||'cac'){ printf("\33[0;32mR\33[0m");
}if(str_P[x] == 'CAT'||'cat'){ printf("\33[0;32mR\33[0m");
}if(str_P[x] == 'CCG'||'ccg'){ printf("\33,[0;33mP\33[0m");
}if(str_P[x] == 'CCA'||'cca'){ printf("\33[0;33mP\33[0m");
}if(str_P[x] == 'CCC'||'ccc'){ printf("\33[0;33mP\33[0m");
}if(str_P[x] == 'CCT'||'cct'){ printf("\33[0;33mP\33[0m");
}if(str_P[x] == 'CTG'||'ctg'){ printf("\33[0;31mL\33[0m");
}if(str_P[x] == 'CTA'||'cta'){ printf("\33[0;31mL\33[0m");
}if(str_P[x] == 'CTC'||'ctc'){ printf("\33[0;31mL\33[0m");
}if(str_P[x] == 'CTT'||'ctt'){ printf("\33[0;31mL\33[0m");
}if(str_P[x] == 'TGG'||'tgg'){ printf("W");
}if(str_P[x] == 'TGA'||'tga'){ printf("*");
}if(str_P[x] == 'TGC'||'tgc'){ printf("\33[1;33mC\33[0m");
}if(str_P[x] == 'TGT'||'tgt'){ printf("\33[1;33mC\33[0m");
}if(str_P[x] == 'TAG'||'tag'){ printf("*");
}if(str_P[x] == 'TAA'||'taa'){ printf("*");
}if(str_P[x] == 'TAC'||'tac'){ printf("Y");
}if(str_P[x] == 'TAT'||'tat'){ printf("Y");
}if(str_P[x] == 'TCG'||'tcg'){ printf("\33[0;37mS\33[0m");
}if(str_P[x] == 'TCA'||'tca'){ printf("\33[0;37mS\33[0m");
}if(str_P[x] == 'TCC'||'tcc'){ printf("\33[0;37mS\33[0m");
}if(str_P[x] == 'TCT'||'tct'){ printf("\33[0;37mS\33[0m");
}if(str_P[x] == 'TTG'||'ttg'){ printf("\33[0;31mL\33[0m");
}if(str_P[x] == 'TTA'||'tta'){ printf("\33[0;31mL\33[0m");
}if(str_P[x] == 'TTC'||'ttc'){ printf("F");
}if(str_P[x] == 'TTT'||'ttt'){ printf("F");}
}printf("\n");
//a primeira letra da string P
/*
//se achar alguma igual, verifica os proximos caracteres
e_igual = 1;
//var q valera 1 se for encontrada a substring
for(x=0;str_P[x]&&e_igual;x++)
if(str_T[i+x]!=str_P[x])
e_igual = 0;
//caso não seja a substring
if(e_igual)printf("\nOcorrencia na posicao %i",i+1);//imprime
- */
}else
{
printf("\n");
printf("Invalido - somente multiplos de 3\n");
}
printf("\n");




  


2. Re: If and Else referências e sintaxe [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 31/01/2020 - 18:07h

Estou no celular agora, então não vai dar para comentar seu código interativamente, como eu prefiro normalmente fazer. Mas eis alguns pontos rápidos.

• Ao compilar o programa, você habilitou diagnóstico de código potencialmente inválido? Se não, recomendo que o faça. Com o GCC, eu geralmente recomendo as opções “-Wall -Werror -pedantic-errors -O2”. Fazendo isso, creio que o próprio compilador vai indicar uma porção de coisas para você corrigir (e que deve mesmo corrigir).

• No Segundo for, que usa e como variável de controle, um dos testes que você faz usa i como índice do array, mas eu entendo que isso está errado (até porque os outros testes usam e como índice).

• Aquelas sequências de escape todas no meio do código o deixam meio poluído (a ponto de você mesmo ter errado em uma delas, deixando-a invalida). Eu sugiro que você crie uma função que receba como parâmetro a string a ser impressa e a cor e/ou atributos como parâmetros adicionais. Com isso o uso de sequências de escape aparecerá em apenas um ponto do código.


Quando voltar a casa, vou ver se consigo examinar seu programa com mais calma.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


3. Re: If and Else referências e sintaxe

Mistery
Cmistry

(usa Ubuntu)

Enviado em 31/01/2020 - 21:21h

paulo1205 escreveu:


• Ao compilar o programa, você habilitou diagnóstico de código potencialmente inválido? Se não, recomendo que o faça. Com o GCC, eu geralmente recomendo as opções “-Wall -Werror -pedantic-errors -O2”. Fazendo isso, creio que o próprio compilador vai indicar uma porção de coisas para você corrigir (e que deve mesmo corrigir).

• No Segundo for, que usa e como variável de controle, um dos testes que você faz usa i como índice do array[/b], mas eu entendo que isso está errado (até porque os outros testes usam [i]e como índice).

... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


Interessante os erros foram apontados exatamente nos If do terceiro for!
E realmente aquele i não era pra estar ali no segundo for e sim o e.


$ gcc gen1.c -Wall -Werror -pedantic-errors -O2 -o gen
gen1.c:21:16: error: format specifies type 'char *' but the argument has type 'char (*)[50]'
[-Werror,-Wformat]
scanf("%s",&str_P);
~~ ^~~~~~
gen1.c:55:19: error: multi-character character constant [-Werror,-Wmultichar]
if(str_P[x] == 'GGG'||'ggg'){ printf("\33[1;35mG\33[0m");
^
gen1.c:55:26: error: multi-character character constant [-Werror,-Wmultichar]
if(str_P[x] == 'GGG'||'ggg'){ printf("\33[1;35mG\33[0m");
^
gen1.c:55:24: error: use of logical '||' with constant operand
[-Werror,-Wconstant-logical-operand]
if(str_P[x] == 'GGG'||'ggg'){ printf("\33[1;35mG\33[0m");
^ ~~~~~
gen1.c:55:24: note: use '|' for a bitwise operation
if(str_P[x] == 'GGG'||'ggg'){ printf("\33[1;35mG\33[0m");
^~~~~~~
|
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.


Aí descobri que o erro está em tentar fazer duas comparações simultâneas usando o operador
|| em str_P[x] == 'ABC'||'abc'.
Aí fiz assim:
(str_P[x] == 'ABC') || (str_P[x] == 'abc') em todas as expressões.

Porém após ter feito isso --->


$ vim gen1.c
$ gcc gen1.c -Wall -Werror -pedantic-errors -O2 -o gen
gen1.c:21:16: error: format specifies type 'char *' but the argument has type 'char (*)[50]'
[-Werror,-Wformat]
scanf("%s",&str_P);
~~ ^~~~~~
gen1.c:55:19: error: multi-character character constant [-Werror,-Wmultichar]
if(str_P[x] == 'GGG')||(str_P[x] =='ggg'){ printf("\33[1;35mG\33[0m");
^
gen1.c:55:25: error: expected expression
if(str_P[x] == 'GGG')||(str_P[x] =='ggg'){ printf("\33[1;35mG\33[0m");
^
gen1.c:55:39: error: multi-character character constant [-Werror,-Wmultichar]
if(str_P[x] == 'GGG')||(str_P[x] =='ggg'){ printf("\33[1;35mG\33[0m");
^
gen1.c:55:16: error: result of comparison of constant 4671303 with expression of type 'char' is
always false [-Werror,-Wtautological-constant-out-of-range-compare]
if(str_P[x] == 'GGG')||(str_P[x] =='ggg'){ printf("\33[1;35mG\33[0m");
~~~~~~~~ ^ ~~~~~
5 errors generated.

$ gcc gen1.c -o gen
gen1.c:21:16: warning: format specifies type 'char *' but the argument has type 'char (*)[50]'
[-Wformat]
scanf("%s",&str_P);
~~ ^~~~~~
gen1.c:55:19: warning: multi-character character constant [-Wmultichar]
if(str_P[x] == 'GGG')||(str_P[x] =='ggg'){ printf("\33[1;35mG\33[0m");
^
gen1.c:55:25: error: expected expression
if(str_P[x] == 'GGG')||(str_P[x] =='ggg'){ printf("\33[1;35mG\33[0m");
^
gen1.c:55:39: warning: multi-character character constant [-Wmultichar]
if(str_P[x] == 'GGG')||(str_P[x] =='ggg'){ printf("\33[1;35mG\33[0m");
^
gen1.c:55:16: warning: result of comparison of constant 4671303 with expression of type 'char'
is always false [-Wtautological-constant-out-of-range-compare]
if(str_P[x] == 'GGG')||(str_P[x] =='ggg'){ printf("\33[1;35mG\33[0m");



4. Re: If and Else referências e sintaxe [RESOLVIDO]

Adriano Siqueira
adrisiq

(usa KDE Neon)

Enviado em 31/01/2020 - 22:16h

Organizando e simplificando seu código, ele pode ficar mais ou menos assim:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define TAMANHO_MAXIMO 52 // 51 caracteres (múltiplo de 3) + 1 caracter nulo (fim de string)

void imprimir(char nome[], char sequencia[], int tamanho);

int main() {
char sequenciaOriginal[TAMANHO_MAXIMO];
char sequenciaComplementar[TAMANHO_MAXIMO];
char sequenciaRNA[TAMANHO_MAXIMO];

int tamanho = 0;

for (int i = 0; i < TAMANHO_MAXIMO; ++i) {
// Inicializa todas as sequências
sequenciaOriginal[i] = '\0';
sequenciaComplementar[i] = '\0';
sequenciaRNA[i] = '\0';
}

printf("Informe uma fita de DNA: ");
scanf(" %51s", sequenciaOriginal);

tamanho = (int) strlen(sequenciaOriginal);

if (tamanho % 3 != 0) {
printf("[ ERRO ]: A quantidade de elementos da sequência deve ser múltiplo de 3 \n");
return EXIT_FAILURE;
}

for (int i = 0; i < tamanho; ++i) {
// Normaliza as letras e verifica se alguma é inválida
sequenciaOriginal[i] = _toupper(sequenciaOriginal[i]);

if (sequenciaOriginal[i] != 'A' && sequenciaOriginal[i] != 'T' &&
sequenciaOriginal[i] != 'C' && sequenciaOriginal[i] != 'G') {
printf("[ ERRO ]: Encontramos caracteres inválidos na sequência. \n");
return EXIT_FAILURE;
}
}

for (int i = 0; i < tamanho; ++i) {
// Percorre a sequência original completando as outras

switch (sequenciaOriginal[i]) {
case 'A':
sequenciaComplementar[i] = 'T';
sequenciaRNA[i] = 'U';
break;
case 'C':
sequenciaComplementar[i] = 'G';
sequenciaRNA[i] = 'G';
break;
case 'G':
sequenciaComplementar[i] = 'C';
sequenciaRNA[i] = 'C';
break;
case 'T':
sequenciaComplementar[i] = 'A';
sequenciaRNA[i] = 'A';
break;
default:
printf("[ ERRO ]: Ocorreu um erro interno. Verifique a validação da string. \n");
return EXIT_FAILURE;
}
}

// Imprime as sequências
imprimir("Ori", sequenciaOriginal, tamanho);
imprimir("Com", sequenciaComplementar, tamanho);
imprimir("RNA", sequenciaRNA, tamanho);

return EXIT_SUCCESS;
}

void imprimir(char nome[], char sequencia[], int tamanho) {
printf("[ %s ]: ", nome);

for (int i = 0; i < tamanho; ++i) {
printf("%c", sequencia[i]);
}

printf("\n");
}



5. Empolgante!

Mistery
Cmistry

(usa Ubuntu)

Enviado em 31/01/2020 - 23:43h


adrisiq escreveu:

Organizando e simplificando seu código, ele pode ficar mais ou menos assim:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define TAMANHO_MAXIMO 52 // 51 caracteres (múltiplo de 3) + 1 caracter nulo (fim de string)

void imprimir(char nome[], char sequencia[], int tamanho);

int main() {
/*
*
*/
}

void imprimir(char nome[], char sequencia[], int tamanho) {
printf("[ %s ]: ", nome);

for (int i = 0; i < tamanho; ++i) {
printf("%c", sequencia[i]);
}

printf("\n");
}


Que formatação espetacular, show!
Empolgante falar com vcs colaboradores. *-*






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts