Jump to content
arthurdr

Ajuda com programa

Recommended Posts

Estou fazendo um programa, mas estou trancado em uma parte. O ojetivo desta parte do programa é ver se as letras em que o usuário digita, são iguais as permitidas. Procurei algumas maneiras de fazer isso, mas só achei essa. O problema deste programa é que quando ele vai analisar a cadeia t, ele sempre mostra que a cadeia é invalida, mesmo estando dentro do exigido, abrindo melhor a cadeia t, descobri que o programa sempre diz que a 18º letra é invalida, mas não consegui descobrir o motivo, mesmo ponto letras validas, a 18º ele mostra que é errada.

A parte do programa é essa:

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
    int M, N, i, j, a, b;
    char p[M], t[N];
    int letrasT, letraT, letrasP, letraP;
    
    M=5;
    N=25;
do
{
    do
    {
        i=0;
        letraP=0;
        letrasP=0;
        printf ("\n    Digite a cadeia p: ");
        scanf ("%s", p);
        if (M!=strlen(p))
            printf ("\n\n        !!!TAMANHO DE p INVALIDO!!!\n");
        for (i=0; i<M; i++)
            if ((p!='A') && (p!='C') && (p!='G') && (p!='T'))
                letrasP=1;
            else
                letrasP=0;
        for (i=0; i<M; i++)
            if (letrasP==1)
                letraP=1;
        if (letraP==1)
            printf ("\n\n        !!!CADEIA DE p INVALIDA!!!\n");
    }while (letraP==1);
}while (M<strlen(p));
    
do
{
    do
    {
        i=0;
        letraT=0;
        letrasT=0;
        printf ("\n    Digite a cadeia t: ");
        scanf ("%s", t);
        if (N!=strlen(t))
            printf ("\n\n        !!!TAMANHO DE t INVALIDO!!!\n");
        for (i=0; i<N; i++)
            if ((t!='A') && (t!='C') && (t!='G') && (t!='T'))
                letrasT=1;
            else
                letrasT=0;
        for (i=0; i<N; i++)
            if (letrasT==1)
            printf ("*%i", letrasT);
                letraT=1;
        if (letraT==1)
            printf ("\n\n        !!!CADEIA DE t INVALIDA!!!\n");
    }while (letraT==1);
}while (N<strlen(t));
    
printf ("\n%s", p);
printf ("\n%s", t);
}

Screenshot_1.png

Share this post


Link to post
Share on other sites

Arthur, antes de tudo, observo o que pode ser erros de sintaxe: as declarações das strings não me parecem corretas; há comparação entre string e char etc...

Você de fato conseguiu compilar esse código, e, mais, executá-lo?

  • -1 1

Share this post


Link to post
Share on other sites

arthurdr ao compilar o seu programa ele trava logo no começo da execução antes mesmo de imprimir qualquer coisa na tela por que as variáveis M e N que delimitam o tamanho das cadeias de caracteres p e t não são inicializadas com valor algum fazendo com que elas assumam qualquer valor que esteja escrito naquela região da memória para aonde elas apontam e consequentemente tornando seus valores inteiros em lixo de memória. Aqui no meu computador ao mandar imprimir o valor inteiro de M ele mostra um número maior do que 2 bilhões. Isso explica tudo pois para cada posição da cadeia de caracteres p o programa irá reservar 1 byte na memória e nesse caso p vai ter mais do que 2 bilhões de bytes o que calculando resulta em p sendo uma variável de 2 giga bytes e isso é muito mais do que toda a memória do meu computador que é de apenas 256 mega bytes.

 

Mais abaixo o programa tenta comparar cada letra digitada e armazenada em p com as letras A, C, G e T para ver se a cadeia digitada pelo usuário contém somente as letras permitidas e caso não contenha retorna uma mensagem dizendo que a cadeia digitada é inválida porém a cada comparação ele testa se a cadeia inteira é igual a cada letra o que fará com que dê sempre a mensagem de cadeia inválida mesmo que o usuário digite somente as letras permitidas pois um conjunto de letras é diferente de apenas uma letra em individual. Para que o teste dê positivo deve-se comparar individualmente cada letra da cadeia digitada com as do código. Para fazer isso usa-se um número entre colchetes após o nome da cadeia que indicará a posição da letra na cadeia que se quer comparar. Pode-se também usar uma variável para representar esse número. Então:

 
for (i = 0 ; i < M ; i ++)
if (( p!= 'A' )
&& ( p!= 'C' ) && ( p != 'G' ) &&
( p != 'T' ))
letrasP = 1 ;
else
letrasP = 0 ;

 

irá ficar:

 

for (i = 0 ; i < M ; i ++)
if (( p[i]!= 'A' )
&& ( p[i]!= 'C' ) && ( p[i] != 'G' ) &&
( p[i] != 'T' ))
letrasP = 1 ;
else
letrasP = 0 ;

 

Mais abaixo o programa em um laço com contador tenta verificar se há alguma letra não permitida digitada repetindo diversas vezes o mesmo teste que sempre dará a mesma resposta. Podemos modificá-lo para que faça o teste somente uma vez. Então:

 
for (i = 0 ; i < M ; i ++)
if ( letrasP==1 )
letraP = 1 ;

 

Vai ficar:

 

if ( letrasP==1 )
letraP = 1 ;

 

Podemos fazer até mais do que isso.

Usar uma variável apenas para confirmar se há caractéres não-permitidos ao invés de duas. Então:

 
if ( letrasP==1 )
letraP = 1 ;
if ( letraP== 1)
printf ( "\n\n !!!CADEIA DE p INVALIDA!!!\n" );

 

Vai ficar:

 

if ( letrasP==1 )
printf ( "\n\n !!!CADEIA DE p INVALIDA!!!\n" );

 

e consequentemente removendo a variável não usada letraP do código e todas as demais linhas de código que a utilizam.

 

As variáveis inteiras declaradas a e b podem ser retiradas também pois não são usadas.

 

Após ler a cadeia t podemos fazer o mesmo que com p e colocarmos um índice após o nome da cadeia durante as comparações e também remover a variável letraT e as referências a ela. O laço de repetição que fica fazendo várias vezes a mesma comparação com a variável letrasT também pode ser removido. Na comparação que serve para mostrar a mensagem de cadeia t inválida podemos substituir a variável letraT que iremos remover por letrasT no lugar e também fazer o mesmo na condição do laço que repete a leitura da cadeia t. A linha que imprime o tamanho de um inteiro em bytes logo no começo da função principal após a primeira declaração de variáveis também pode ser removida e o mesmo vale para a variável j. O programa completo e funcionando desse jeito que eu falo fica assim:

 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main ()
{
int M = 5, N = 25, i;
char p [ M ], t [ N ];
int letrasT , letrasP;
do
{
do
{
i = 0 ;
letrasP = 0;
printf ( "\n Digite a cadeia p: " );
scanf ( "%s" , p );
if ( M != strlen (p ))
printf ( "\n\n !!!TAMANHO DE p INVALIDO!!!\n" );
for (i = 0 ; i < M ; i ++)
if (( p[i]!= 'A' )
&& ( p[i]!= 'C' ) && ( p[i] != 'G' ) &&
( p[i] != 'T' ))
letrasP = 1 ;
else
letrasP = 0 ;
if ( letrasP== 1)
printf ( "\n\n !!!CADEIA DE p INVALIDA!!!\n" );
}while ( letrasP== 1);
} while ( M< strlen (p ));
do
{
do
{
i = 0 ;
letrasT = 0;
printf ( "\n Digite a cadeia t: " );
scanf ( "%s" , t );
if ( N != strlen (t ))
printf ( "\n\n !!!TAMANHO DE t INVALIDO!!!\n" );
for (i = 0 ; i < N ; i ++)
if (( t[i]!= 'A' )
&& ( t[i]!= 'C' ) && ( t[i] != 'G' ) &&
( t[i] != 'T' ))
letrasT = 1 ;
else
letrasT = 0 ;
if ( letrasT== 1)
printf ( "\n\n !!!CADEIA DE t INVALIDA!!!\n" );
}while ( letrasT== 1);
} while ( N< strlen (t ));
printf ("\n%s" , p );
printf ("\n%s" , t );
system("pause");
}

 

 

 

 
 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By IgorExtreme
      Olá estou com problema nesta questão: "Escreva um programa que leia e armazene em um vetor os dados de 30 pessoas. Estes dados são o nome da pessoa, sua idade, e os nomes completos do pai e da mãe. A seguir, o programa deve identificar (e mostrar os índices) das pessoas que estão relacionadas por um parentesco avô-neto e irmão-irmão. No caso dos irmãos, deve ser informado ainda qual é o mais novo dos dois." O código é esse
      #include<stdio.h> #include<string.h> #define NUM 4 struct pessoa { char nome[20]; char mae[20]; char pai[20]; int idade; }; main() { struct pessoa vetorPessoas[NUM]; int i; printf("Digite os dados de %d pessoas:\n", NUM); for (i = 0; i < NUM; i++) { printf("Digite o nome da pessoa %d: ", i); fflush(stdin); gets(vetorPessoas[i].nome); printf("%s\n", vetorPessoas[i].nome); printf("Digite o nome da mae da pessoa %d: ", i); fflush(stdin); gets(vetorPessoas[i].mae); printf("%s\n", vetorPessoas[i].mae); printf("Digite o nome do pai da pessoa %d: ", i); fflush(stdin); gets(vetorPessoas[i].pai); printf("%s\n", vetorPessoas[i].pai); printf("Digite a idade da pessoa %d: ", i); fflush(stdin); scanf("%d", &vetorPessoas[i].idade); printf("%d\n", vetorPessoas[i].idade); if(!strcmp(vetorPessoas[0].pai, vetorPessoas[1].nome)){ printf("%s e avo de %s\n", vetorPessoas[1].pai, vetorPessoas[0].nome); } if(!strcmp(vetorPessoas[2].pai, vetorPessoas[3].nome)){ printf("%s e avo de %s\n", vetorPessoas[3].pai, vetorPessoas[2].nome); } } /*if(!strcmp(vetorPessoas[i].pai, vetorPessoas[i].nome)){ printf("%s e pai de %s\n", vetorPessoas[i].pai, vetorPessoas[i].pai); }*/ if(!strcmp(vetorPessoas[0].pai, vetorPessoas[1].pai)){ printf("Eles sao irmaos\n"); if(vetorPessoas[0].idade > vetorPessoas[1].idade){ printf("%s mais velho\n", vetorPessoas[0].idade); } else{ printf("%s e mais novo\n", vetorPessoas[1].idade); } } if(!strcmp(vetorPessoas[2].pai, vetorPessoas[3].pai)){ printf("Eles sao irmaos\n"); if(vetorPessoas[2].idade > vetorPessoas[3].idade){ printf("%s mais velho\n", vetorPessoas[2].idade); } else{ printf("%s e mais novo\n", vetorPessoas[3].idade); } } } O problema é que ele mostra quase tudo menos a parte se tal irmão é mais velho que o outro
    • By ricardo Oliv3ira
      Um cano cilíndrico de raio R1 vai ser usado para guardar outros dois canos de raio R2 e R3. Caso os dois últimos canos caibam dentro do primeiro, seu programa deve imprimir “Coube”. Caso contrário imprima “Não coube”.
      #include <stdio.h> int main(void) { float R1,R2,R3; printf("digite o 1º tamanho:"); scanf("%f",R1); printf("digite o 2º tamanho"); scanf("%f",R2); printf("digite o 3º tamanho"); scanf("%f",R3); if(R2,R3<R1){ printf("Coube"); } else(R2,R3>R1){ printf("Não Coube"); } return 0; }  
    • By Hodol
      Boa tarde, estou começando a programar e ainda não sei qual linguagem de programação eu devo iniciar. Me de uma luz, Obrigado!
    • By flipmartinz13
      Alguém pode me ajudar nessa questão de C++? não estou conseguindo construir o algorítmo corretamente.

      5.92)    Faça um algoritmo que leia a matrícula, nome, sexo e três notas dos alunos de uma escola e obtenha os seguintes resultados:
      a) A matrícula da aluna que obteve a maior média.
      b) A matrícula do aluno que obteve a menor média.
      c) O percentual de mulheres na turma.
      d) Quantos alunos foram aprovados, independente do sexo.
      e) O percentual de alunas aprovadas.
      Obs.: o flag é uma matrícula igual a 0 (zero).
    • By Cangemi
      Olá, alguém pode me ajudar? Estou fazendo um trabalho para estrutura de dados sobre arvore binária e eu decidi usar as funções fprintf para salvar as informações em arquivo e fscanf para ler essas informações e joga - las na minha função de inserção da arvore. O programa está funcionando, ele salva dos dados da arvore, só que, o que acontece é, que na hora de usar o fscanf ele não lê todas as informações contidas no arquivo, ele lê somente dois cadastros e joga pra função de inserção. Alguém sabe como eu posso corrigir isso?
       

       
      Arquivo fonte: 

       
      Código completo: 
      #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<ctype.h> #include<string.h> struct jogador { char nome [31]; char posicao [15]; char escalacao; float salario; int numero; struct jogador *esq; struct jogador *dir; }; struct jogador *raiz; struct jogador *pointer; struct jogador *r; FILE *p; char name [31]=" ", time[51]; char position [15]=" "; char lineup; float salary=0; int num=0, aux = 0; void cadastrar(); void carregar(); struct jogador *salvar(struct jogador *i); struct jogador *criar( struct jogador *a); // função para inserir struct jogador *listar(struct jogador *i, int x); struct jogador *all (struct jogador *i); main() { pointer = NULL; raiz = NULL; int op; do { printf("\t\t\t\t\t\t--------------------------\n"); printf("\t\t\t\t\t | *-*-*Time*-*-* |\n\t\t\t\t\t | |\n\t\t\t\t\t | | \n"); printf("\t\t\t\t\t | [1] Escolher o time |\n\t\t\t\t\t | |\n"); printf("\t\t\t\t\t | [2] Contratar jogador |\n\t\t\t\t\t | |\n"); printf("\t\t\t\t\t | [4] Listar crescente | \n\t\t\t\t\t | | \n"); printf("\t\t\t\t\t | [5] Listar decrescente | \n\t\t\t\t\t | |\n"); printf("\t\t\t\t\t | [6] Excluir time | \n\t\t\t\t\t | |\n"); printf("\t\t\t\t\t | [9] Salvar | \n\t\t\t\t\t | |\n"); printf("\t\t\t\t\t | [0] Sair |\n"); printf("\t\t\t\t\t\t--------------------------\n"); printf("\t\t\t\t\t Opcao [ ]\b\b"); scanf("%i",&op); switch(op) { case 1: { aux=0; cadastrar(); } break; case 2: { cadastrar(); } break; case 4: { if(raiz==NULL) { printf("\n Nao possui cadastro.\n"); system("pause"); } else { system("cls"); listar(pointer, 1); system("pause"); } } break; case 5: { if(raiz==NULL) { printf("\n Nao possui cadastro.\n"); system("pause"); } else { listar(pointer, 2); system("pause"); } } break; case 6: { if(raiz!=NULL) { pointer=all(pointer); printf("\n Todos os jogadores foram excluidos\n"); system("pause"); } else { printf("\n*****Nenhum jogador cadastrado*****.\n"); system("pause"); } } break; case 9: { p=fopen(time,"w"); fclose(p); salvar(pointer); } break; } system("cls"); }while(op!=0); } void cadastrar () { char resposta; char answer; do { if(aux==0) { system("cls"); printf("\n\n\n\n\n\n"); printf("\t\t\t\t\t Escolha o time para iniciar \n"); printf("\t\t\t\t\t\t___\b\b\b "); fflush(stdin); gets(time); strcat(time,".csv"); carregar(); fclose(p); aux = 1; return; } system("cls"); printf("\nNome do jogador: "); fflush(stdin); gets(name); printf("\nPosicao do jogador: "); fflush(stdin); gets(position); printf("\nO jogador e titular? <S/N>: "); answer=getche(); if(toupper(answer)=='S') { lineup = 'T'; } else { lineup = 'R'; } printf("\n"); printf("\nSalario pago ao jogador: "); scanf("%f",&salary); printf("\nInforme o numero do jogador: "); scanf("%i",&num); pointer=criar(pointer); printf("\nCadastrar novamente? <S/N>: "); resposta=getche(); printf("\n "); }while(toupper(resposta)=='S'); } struct jogador *criar( struct jogador *a) { if(a==NULL) { r=(struct jogador*)malloc(sizeof(struct jogador)); if(!r) { printf("\n Nao ha memoria"); exit(1); } strcpy(r->nome,name); strcpy(r->posicao,position); r->escalacao = lineup; r->salario = salary; r->numero = num; r->esq = NULL; r->dir = NULL; if(raiz==NULL) { raiz=r; } return r; } else { if(num>a->numero) { a->dir=criar(a->dir); } else { if(num<a->numero) { a->esq=criar(a->esq); } else { printf("\n Jogador ja cadastrado\n"); system("pause"); return a; } } } fclose(p); return a; } struct jogador *listar(struct jogador *i, int x) { if(i!=NULL&&x==1) { listar(i->esq, x); printf("\t\t\t\n----------\n"); printf("\n-----|%s|-----\n",i->nome); printf("\n-----|%s|-----\n",i->posicao); printf("\n-----|%c|-----\n",i->escalacao); printf("\n-----|%.2f|-----\n",i->salario); printf("\n-----|%i|-----\n",i->numero); listar(i->dir, x); } if(i!=NULL&&x==2) { listar(i->dir, x); printf("\n-----|%i|-----\n",i->numero); listar(i->esq, x); } return i; } struct jogador *all (struct jogador *i) { if(i->esq!=NULL) { all(i->esq); } if(i->dir!=NULL) { all(i->dir); } free(i); if(i==raiz) { raiz=NULL; i=raiz; } return i; } struct jogador *salvar(struct jogador *i) // função que salva os dados no arquivo, esta funcionando. { if(i!=NULL) { salvar(i->esq); p=fopen(time,"a"); strcpy(name,i->nome); strcpy(position,i->posicao); lineup = i->escalacao; salary = i->salario; num = i->numero; fprintf(p,"%s;%s;%c;%f;%i\n",name,position,lineup,salary,num); salvar(i->dir); } fclose(p); } void carregar() // função para ler os arquivos { if((p=fopen(time,"r"))==NULL) { return; } else { while(fscanf(p,"%[^;];%[^;];%c;%f;%i%*c",name,position,&lineup,&salary,&num)!=EOF) { // esse printf foi colocado pra saber quais numeros ele esta lendo. printf("\n-----|%i|-----\n",num); // ele le somente dois cadastros, se tiver mais ele não le, e por isso não joga na função de inserção. pointer=criar(pointer); // chamada da função de inserção, os dois unicos cadastros que são lidos, são inseridos corretamente. } system("pause"); } fclose(p); }  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.