Ir ao conteúdo
  • Cadastre-se

C Problema com a condição


Joao_Bilu

Posts recomendados

Boa noite gente, estava fazendo um exercício que pedia para retirar as vogais de uma frase, mas meu programa meio que não obedece a condição. Alguém sabe como resolver?

#include <stdio.h>
#include <string.h>

int main(){
    char frase[50];

    printf("Digite uma Palavra/Frase: ");
    gets(frase);

    for(int i=0;i<strlen(frase);i++){
        printf("Estamos analisando: %c\n",frase[i]);
        if(frase[i]=='a'||'e'||'i'||'o'||'u'){
            frase[i] = ' ';
        }
    }

    //Imprimindo o resultado
    printf("%s",frase);
}

 

Link para o comentário
Compartilhar em outros sites

@Joao_Bilu Não use a função gets(), ela não sabe o tamanho da string com a qual você ta entrando, pode ocorrer um buffer overflow.

Acho melhor passar todas as consoantes para outra string para depois imprimir.

Perceba também que em seu programa, você substitui vogais pelo caractere espaço.

Se digitar batata, o que será impresso é b t t, o correto deveria ser btt.

Tente algo assim:

#include <stdio.h>
#include <string.h>

int main(){
    char frase[51];
    char novafrase[51];
    int i=0, cont=0;

    printf("Digite uma Palavra/Frase: ");
    scanf("%50s", frase); //Espaço para 50 caracteres + NULL ('\0')

    for(;frase[i];i++){
        printf("Estamos analisando: %c\n",frase[i]);
        if(frase[i]!='a'&&frase[i]!='e'&&frase[i]!='i'&&frase[i]!='o'&&frase[i]!='u'){
            novafrase[cont++] = frase[i];
        }
    }

    //Imprimindo o resultado
    printf("%s", novafrase);
}

 

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

@Vitor_TEC valeu cara, não sabia disso.

Uma outra duvida também ligada à condição...em um exercício que tenho que calcular as raízes de uma função, o meu segundo e o terceiro if nao imprimem o que deveriam

#include <stdio.h>
#include <math.h>

int main(){
    float a,b,c,delta,x1,x2,x;

    //Recebendo o Valor do fatores
    printf("Organize a funcao quadratica da seguinte forma: Ax^2+Bx+C=0\n\n");
    printf("Digite o valor de A: ");
    scanf("%f",&a);

    printf("Digite o valor de B: ");
    scanf("%f",&b);

    printf("Digite o valor de C: ");
    scanf("%f",&c);

    //Realizando a operação do delta
    delta = (pow(b,2))-(4*(a)*(c));
    printf("Delta = %f\n", delta);

    if(delta>0){
        printf("Trata-se de uma função com duas raizes reais e distintas\n\n");
        x1=((-b)+sqrt(delta))/(2*a);
        x2=((-b)-sqrt(delta))/(2*a);
        printf("x1 = %f\n",x1);
        printf("x2 = %f\n",x2);
    }else{
        if(delta=0){
            printf("Trata-se de uma função com duas raizes reais e iguais\n");
            x=((-b)+sqrt(delta))/(2*a);
            printf("x1 = x2 = %f",x1);
        }else{
            if(delta<0){
                printf("Trata-se de uma função que não possui raizes reais\n");
            }
        }
    }
}

Obs: Estou usando a=1, b=10 e c=25 que dá delta=0 e deveria cair no segundo if, e
         no outro caso uso a=-1, b=4 e c=-29 que dá delta=-100 e deveria entrar no terceiro if

adicionado 12 minutos depois

@Lucca Rodrigues Cara muito bom, que ótimo que você me avisou. Mas tenho umas duvidas:

1º Por que no scanf você usou 50 no meio do %s e não 51?

2º Por usar scanf em vez de gets, quando fosse digitado uma frase com espaço nao daria erro?

 


 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Joao_Bilu

Tem vários erros...

Não precisa da função pow() pra elevar um número ao quadrado, compensa mais fazer b*b

Se delta é 0, raiz de 0 é 0. Pode tirar raiz de delta da fórmula para esse caso.

Perceba que o primeiro else engloba os 2 if()'s subseguintes. Para não ficar confuso, faça o seguinte:

Para a primeira condição: if;

Para as demais condições: else if;

Para a última, dependendo do caso: else.

Lembre-se, "=" é atribuição, "==" é comparação. Não use "=" para comparação.

32 minutos atrás, Joao_Bilu disse:

if(delta=0){} //Errado
if(delta==0){} //Certo

Você pode imprimir os valores limitando as casas decimais: use %.2f ao invés de %f nos printf()'s.

Por fim, você está tentando imprimir x1 para caso delta seja 0, mas atribuiu valor à x:

32 minutos atrás, Joao_Bilu disse:

x=((-b)+sqrt(delta))/(2*a); //Atribuiu à x
printf("x1 = x2 = %f",x1); //Imprimiu x1

Teste isso:

#include <stdio.h>
#include <math.h>

int main(){
    float a,b,c,delta,x1,x2,x;

    //Recebendo o Valor do fatores
    printf("Organize a funcao quadratica da seguinte forma: Ax^2+Bx+C=0\n\n");
    printf("Digite o valor de A: ");
    scanf("%f",&a);

    printf("Digite o valor de B: ");
    scanf("%f",&b);

    printf("Digite o valor de C: ");
    scanf("%f",&c);

    //Realizando a operação do delta
    delta = (b*b)-(4*(a)*(c));
    printf("Delta = %.2f\n", delta);

    if(delta>0){
        printf("Trata-se de uma função com duas raizes reais e distintas\n\n");
        x1=((-b)+sqrt(delta))/(2*a);
        x2=((-b)-sqrt(delta))/(2*a);
        printf("x1 = %.2f\n", x1);
        printf("x2 = %.2f\n", x2);
    }else if(delta==0){
        printf("Trata-se de uma função com duas raizes reais e iguais\n");
        x1=((-b)/(2*a));
        printf("x1 = x2 = %.2f", x1);
    }else if(delta<0){
        printf("Trata-se de uma função que não possui raizes reais\n");
    }
}

----------------------------------------------------------------------------------------

@Joao_Bilu

32 minutos atrás, Joao_Bilu disse:

1º Por que no scanf você usou 50 no meio do %s e não 51?

Para limitar a quantidade de caracteres com os quais você pode entrar para 50, daí no total são 50 + NULL (caractere utilizado para indicar o final de strings de caracteres).

Por isso foi declarado o tamanho da string originalmente como 51 caracteres.

32 minutos atrás, Joao_Bilu disse:

2º Por usar scanf em vez de gets, quando fosse digitado uma frase com espaço nao daria erro?

Com a função gets() você não tem como limitar a quantidade de caracteres que podem ser inseridos. Se inserir mais caracteres que o tamanho da string, ocasionará o buffer overflow que eu havia comentado.

Não tem nada a ver com frase com espaço.

Seu programa originalmente trocava vogais por espaço:

1 hora atrás, Joao_Bilu disse:

if(frase[i]=='a'||frase[i]=='e'||frase[i]=='i'||frase[i]=='o'||frase[i]=='u'){
	frase[i] = ' ';
}

Daí o correto seria, na minha opinião, identificar se os caracteres não são vogais, e caso não forem, atribuir à uma outra string, que só receberá consoantes. Está exemplificado no programa que mandei.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Lucca Rodrigues entendi entendi a 1ª duvida, mas quanto a 2ª o problema é que usando o scanf para ler uma string ele só faz a leitura de uma palavra e não de uma frase, por exemplo, se digitar "batata doce" ele só lê "batata", por isso eu usei o gets, foi a  forma que achei de solucionar isso.

OBS: Acho que a sua solução, de jogar os caracteres que não são vogais em uma nova string, bem melhor do que substituir por espaço como eu fiz

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Joao_Bilu É um identificador mais específico que o %s.

Com o %[], você pode escolher o que quer ler.

Dentro dos parênteses, você escreve os caracteres permitidos. A diferença é que para negar, você coloca um ^ antes dos caracteres, como eu fiz: %50[^\n].

Está negando o enter, ou seja, a leitura para por aí.

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@Joao_Bilu Exemplo:

scanf("%50[bat]", frase); //Teste digitar batata doce

Agora substitua isso em seu programa e digite batata doce.

O que será impresso é btt, certo? Ele já para de ler logo no espaço, porque ele lê até encontrar caracteres diferentes de b, a ou t. Esses são os permitidos nesse caso.

Link para o comentário
Compartilhar em outros sites

@Lucca Rodrigues Nesse caso o programa fez a analise das vogais para a palavra "batata" mais não pro "doce".

Deixa eu ver se entendi, como o que tá dento do parentese determina o que vai ser lido, então ele vai ler todas as caracteres da string que foram previamente determinadas no scanf. certo?
A ideia é ele ler a palavra ou conteudo que foi delimitado até encontrar uma letra diferente

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...