Ir ao conteúdo

Posts recomendados

Postado

 Olá, boa noite. Eu estou aprendendo sobre manipulação de caracteres e strings. Eu vi uma questão no github mas não estou conseguindo responde-la. Tentei usar algumas ideias das questões anteriores que já até postei aqui (um for dentro de outro).

 

 A questão é o seguinte: 
 

Faça um programa que receba uma palavra e separe suas silabas levando em consideração o seguinte critério: se após uma vogal existir uma consoante, deve-se separar a sílaba.

Entrada: Uma linha com um texto
Saída: O mesmo texto com - entre as sílabas

Exemplos:
 

Entrada: Paralelepipedo
Saída: Pa-ra-le-le-pi-pe-do

Outro exemplo:

Entrada: Eu sou o rei de Fup
Saída: Eu sou o rei de Fu-p

Estou tentando com esse código mas dá erro como se estivesse fora do vetor: 
 

#include <stdio.h>

int main () {
    
    char palavra[100];
    char vogal[] = {'a', 'e', 'i', 'o', 'u'};
    while(scanf("%[^\n]", palavra) == 1) {
    for(int i = 0 ; palavra[i] ; i++) {
       if(palavra[i] == vogal[i] && palavra[i+1] != vogal[i]) {
           printf("-");
       }
       printf("%c", palavra[i]);
    }
    
}
}

 

  • Curtir 1
Postado

@Talyson Maia Se você quer saber se um caractere da string `palavra` é uma vogal, não basta comparar com só uma vogal...

34 minutos atrás, Talyson Maia disse:
palavra[i] == vogal[i]

Deve comparar com todas as 5.

Você pode fazer uma função pra isso:

int Vogal(char ch)
{
    const char vogal[] = {'a', 'e', 'i', 'o', 'u'};
    
    for(int i = 0; i < 5; i++)
        if(ch == vogal[i])
            return 1;
            
    return 0;
}

Ela retorna 1 se `ch` for vogal, e 0 caso contrário.

 

Sobre isso:

34 minutos atrás, Talyson Maia disse:
for(int i = 0 ; palavra[i] ; i++) {
       if(palavra[i] == vogal[i] && palavra[i+1] != vogal[i])

O loop persiste até encontrar um 0 na string, digamos que temos:

char str[] = {'b','a','t','a','t','a','\0'};

'a' deve ser comparado com '\0' eventualmente, então o que seria impresso na saída é:

image.png.596fa044387cf49bb566cbc1d603e71e.png

Pois 'a' é vogal e '\0' não.

O que você poderia fazer pra solucionar isso é inicializar o índice `i` com 1 e verificar se palavra[i-1] é vogal e palavra[i] não, veja:

putchar(palavra[0]);
for(int i = 1; palavra[i]; i++) {
    if(Vogal(palavra[i-1]) && !Vogal(palavra[i]))
        putchar('-');
    putchar(palavra[i]);
}

Lembra que a função Vogal() retorna 1 se `ch` for vogal? Então:

  • Vogal(palavra[i-1]) retorna 1 se palavra[i-1] for vogal;
  • !Vogal(palavra[i]) retorna 1 se palavra[i] não for vogal, pois estamos usando o operador não-lógico (!);
  • O resultado da operação 1 && 1 é 1, então a condição do if é verdadeira para o caso que queremos.
  • Curtir 2
Postado

@Lucca Rodrigues

17 minutos atrás, Lucca Rodrigues disse:
int Vogal(char ch)
{
    const char vogal[] = {'a', 'e', 'i', 'o', 'u'};
    
    for(int i = 0; i < 5; i++)
        if(ch == vogal[i])
            return 1;
            
    return 0;
}

Essa parte envolve função, certo? Eu ainda não estudei função, seria a próxima aula da minha lista. Você fez um módulo só pra saber se é vogal, foi isso?

 

Tentei fazer com as suas explicações, mas sem usar ''função'' já que não tenho conhecimento sobre o assunto. No entanto, não rodou :(
 

#include <stdio.h>

int main() {

  char palavra[100];
  char vogal[] = {'a', 'e', 'i', 'o', 'u'};
  scanf("%[^\n]", palavra);

  for (int i = 0; i < 5; i++)
    if (palavra == vogal[i]) {
      return 1;
    }
  else {
    return 0;
  }

  for (int i = 1; palavra[i]; i++) {
    if (vogal(palavra[i - 1]) && !vogal(palavra[i]))
      printf("-");
    printf("%c", palavra[i]);
  }
}

 

  • Curtir 1
Postado

@Talyson Maia

17 minutos atrás, Talyson Maia disse:
if (vogal(palavra[i - 1]) && !vogal(palavra[i]))

Se não está usando funções criadas por si, então essa linha não deveria existir, pois nela está chamando uma função vogal().

 

17 minutos atrás, Talyson Maia disse:

Eu ainda não estudei função

Mas já vem usando funções desde que começou a escrever programas em C.

 

17 minutos atrás, Talyson Maia disse:

Você fez um módulo só pra saber se é vogal, foi isso?

Como eu havia dito:

41 minutos atrás, Lucca Rodrigues disse:

Ela retorna 1 se `ch` for vogal, e 0 caso contrário

Basta chamá-la e passar o valor de um char como argumento:

41 minutos atrás, Lucca Rodrigues disse:
Vogal(palavra[i-1])

Este valor será o valor do parâmetro `ch` na declaração da função:

41 minutos atrás, Lucca Rodrigues disse:
int Vogal(char ch)

A função Vogal() é do tipo inteiro, ela retorna o valor 1 se `ch` for vogal, ou seja, se `palavra[i-1] ` for vogal, e retorna 0 caso contrário:

41 minutos atrás, Lucca Rodrigues disse:
int Vogal(char ch)
{
    const char vogal[] = {'a', 'e', 'i', 'o', 'u'};
    
    for(int i = 0; i < 5; i++)
        if(ch == vogal[i])
            return 1;
            
    return 0;
}

É só isso, não tem segredo :)

scanf() é função, printf() é função, e essas você sabe usar, certo?

Tudo o que precisa fazer é passar algo como argumento que tenha correspondência com os parâmetros na declaração da função, e o mesmo vale para Vogal() ou qualquer outra função.

  • Curtir 3
Postado

@Lucca Rodrigues Eu consegui fazer a questão graças a sua ajuda e um pequeno pseudocódigo. Mas teve algumas partes que eu não entendi, você poderia me ajudar?
 

#include <stdio.h>

int vogal(char ch)
{
    const char vogal[] = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
    
    for(int i = 0; i < 10; i++)
        if(ch == vogal[i])
            return 1;
            
    return 0;
}

int main(){
    char texto[50];
    scanf("%[^\n]", texto);

    for(int a = 0; texto[a]; a++){
        printf("%c", texto[a]);
        if(vogal(texto[a]) && !vogal(texto[a + 1]) && texto[a + 1] != ' ' && texto[a + 1])
            printf("-");
    }
}


1° - Eu não entendi porquê o primeiro printf vem antes do if. Nessa atual posição dele não vai aparecer primeiro o nome e depois, em outra linha, os traços?
2° - Eu queria entender o porquê desse ''texto[a+1] no final do último if.

  • Curtir 1
Postado
16 horas atrás, Talyson Maia disse:

Tentei fazer com as suas explicações, mas sem usar ''função'' já que não tenho conhecimento sobre o assunto

 

Sugiro fazer o simples e ver o que é função e usar. Quase nunca dá certo simplesmente tentar fazer com o que já sabe sem tentar aprender algo novo. E sempre tem o risco (quase certo) de perder muito tempo a toa já que usando alguma ferramenta mais moderna vai levar uma fração do tempo.

 

Num exemplo meio ingênuo, é possível às vezes apertar parafusos com um garfo para não usar a chave de fenda, mesmo tendo a chave de fenda na mesma mesa. É sua opção.

 

O compilador compila qualquer programa.

  • Curtir 2
Postado

@Talyson Maia

2 horas atrás, Talyson Maia disse:

Eu consegui fazer a questão graças a sua ajuda e um pequeno pseudocódigo

Por que não posta o pseudocódigo também? :D

 

2 horas atrás, Talyson Maia disse:

1° - Eu não entendi porquê o primeiro printf vem antes do if. Nessa atual posição dele não vai aparecer primeiro o nome e depois, em outra linha, os traços?
2° - Eu queria entender o porquê desse ''texto[a+1] no final do último if.

  1. Porque a regra é "vogal - consoante". Se uma vogal for encontrada e após ela houver uma consoante, a vogal já deveria ter sido impressa antes do '-' prestes a ser impresso:
    2 horas atrás, Talyson Maia disse:
    printf("%c", texto[a]);
            if(vogal(texto[a]) && !vogal(texto[a + 1]) && texto[a + 1] != ' ' && texto[a + 1])
                printf("-");

     

  2. Como eu havia dito:
    18 horas atrás, Lucca Rodrigues disse:

    O loop persiste até encontrar um 0 na string, digamos que temos:

    char str[] = {'b','a','t','a','t','a','\0'};

    'a' deve ser comparado com '\0' eventualmente, então o que seria impresso na saída é:

    image.png.596fa044387cf49bb566cbc1d603e71e.png

    Pois 'a' é vogal e '\0' não.

    Uma forma de evitar que o '\0' faça com que a condição do if seja verdadeira é como você escreveu:

    2 horas atrás, Talyson Maia disse:
    if(vogal(texto[a]) && !vogal(texto[a + 1]) && texto[a + 1] != ' ' && texto[a + 1])

    Caso texto[a+1] seja o caractere nulo (0), e eventualmente vai ser, então o resultado de toda essa operação é 0, já que bit && bit && bit && 0 = 0.

  • Curtir 1

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!