Ir ao conteúdo
  • Cadastre-se

C Programa que substituia palavras especificas em uma frase qualquer.


Posts recomendados

Faça um programa que receba uma frase e troque a palavra ALUNO por
ESTUDANTE e a palavra ESCOLA por UNIVERSIDADE.
Exemplo: EU SOU ALUNO DA ESCOLA
Saída: EU SOU ESTUDANTE DA UNIVERSIDADE
Solução:
 Digitar uma frase.
 Pegar o tamanho da frase digitada.
 Percorrer a frase, pegando caractere por caractere.
 Cada vez que encontrar um espaço em branco ou o fim da frase, foi obtida
uma palavra completa.
 Se a palavra completa for igual à cadeia ALUNO, esta deverá ser removida da
frase digitada e no seu lugar deverá ser inserida a cadeia ESTUDANTE.
 Percorrer a frase, pegando caractere por caractere.
 Cada vez que encontrar um espaço em branco ou o fim da frase, foi obtida
uma palavra completa.

 

Se poder explicar como ficaria este <código> agradeço muito 

Link para o comentário
Compartilhar em outros sites

@Leonardo Augusto0761 Irmão, eu não manjo de C, mas montei um exemplo em Python, e talvez possa te dar um norte para fazer em C.

 

# Recebe a frase do usuário
frase = input("Digite uma frase: ")

# Divide a frase em palavras
palavras = frase.split()

# Inicializa uma lista para armazenar as palavras modificadas
nova_frase = []

# Percorre cada palavra na lista
for palavra in palavras:
    # Verifica se a palavra é "ALUNO" e a substitui por "ESTUDANTE"
    if palavra in "ALUNO, aluno, Aluno":
        nova_frase.append("ESTUDANTE")
    # Verifica se a palavra é "ESCOLA" e a substitui por "UNIVERSIDADE"
    elif palavra in "ESCOLA, escola, Escola":
        nova_frase.append("UNIVERSIDADE")
    # Caso contrário, mantém a palavra original
    else:
        nova_frase.append(palavra)

# Une as palavras modificadas em uma nova frase
nova_frase = ' '.join(nova_frase)

# Exibe a nova frase
print("Saída:", nova_frase)

 

@Leonardo Augusto0761 Caso não te ajude recomendo que poste sua dúvida no Stack Overflow, pois, lá os caras entendem de fato, porém, recomendo que pergunte em inglês.

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

@Leonardo Augusto0761 Como dito no enunciado seu código tem que percorrer cada letra da string, assim poderám testar onde tem espaço e onde termina a frase. Para isso faça um loop onde o contador será o índice do vetor de char referente a posição da letra (0 = E, 1 = U..). A string original e a nova, como no exemplo,

 

frase.png.2909b1827004179c02f01649c9d4c20a.png

 

Para formar a nova frase declare outro vetor de char para ir acrescentando as palavras com as substituições. Você pode usar as funções de string.h para isso como strcpy, strcat, strlen para contar etc.

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

  • 2 semanas depois...

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

int main(void)
{
  int s[1000], i = 0, j = 0;
  char *spre[] = { "ALUNO", "ESCOLA" };
 

  while(1)
  {
    if(i == sizeof s / sizeof *s)
      goto err;
 

    if((s[i] = getchar()) == EOF)
    {
      fprintf(stderr, "Ocorreu um erro de leitura!\n");
 

      return -1;
    }

    if(s[i] == spre[0][j])
    {
      if(++j == strlen(spre[0]))
      {
        char cpre[] = "ESTUDANTE";
 

        for(i -= j - 1, j = 0; j < sizeof cpre - 1; i++, j++)
        {
          if(i == sizeof s / sizeof *s)
            goto err;
          s[i] = cpre[j];
        }
        j = 0;
 

        continue;
      }
    }
    else if(s[i] == spre[1][j])
    {
      if(++j == strlen(spre[1]))
      {
        char cpre[] = "UNIVERSIDADE";
 

        for(i -= j - 1, j = 0; j < sizeof cpre - 1; i++, j++)
        {
          if(i == sizeof s / sizeof *s)
            goto err;
          s[i] = cpre[j];
        }
        j = 0;
 

        continue;
      }
    }
    else
      j = 0;
 

    if(s[i] == '\n')
    {
      s[i] = '\0';

      break;
    }
 

    i++;
  }
 

  for(i = 0; s[i]; i++)
    putchar(s[i]);
  putchar('\n');
 

  return 0;
 

err:
  fprintf(stderr, "Há muitos caracteres!\n");

  return -1;
}

Note que eu não faço uso de char. Usar char com getchar() é perigoso, pois nem toda máquina tem char com sinal (signed char).

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

Uma forma que acho simples é com um único loop onde uma string temporária (vetor de char) armazena cada palavra e depois vai concatenando na nova frase. A string temporária vai facilitar a identificação da palavra aplicando um teste com strcmp.

 

Ali na imagem do meu primeiro comentário, quando o loop chegar na posição 2 é porque uma palavra foi formada. A string temporária será EU e o teste pode ser assim,

 

if(strcmp(temp, de) == 0){
    strcpy(temp, para);
}

 

O retorno da função é diferente de zero já que EU é diferente de ALUNO.

 

Porém quando chegar na posição 12 será ALUNO e portanto a função retornará zero e a palavra temporária poderá ser substituída por ESTUDANTE,

 

O próximo passo é ir concatenando na nova frase, p.ex: strcat(nova, temp)

Link para o comentário
Compartilhar em outros sites

@hekotes630 Use o botão code como explicado no primeiro post do forum.

 

Talvez pudesse acrescentar algo, um mínimo comentário que fosse, ao invés de apenas deixar um programa no tópico. Apresentar uma saída da execução também seria de ajuda, imagino.

 

Não vi razão para o label err estar dentro do loop. Seria bem mais legível e simples apenas deixar o código para o erro FORA do loop e usar um break em caso de erro.

 

EOF não é um erro de leitura. E pode acontecer um erro de todo modo.

Link para o comentário
Compartilhar em outros sites

4 horas atrás, arfneto disse:

Use o botão code como explicado no primeiro post do forum.

Não tenho esse botão.

 

4 horas atrás, arfneto disse:

EOF não é um erro de leitura.

O manual diz que é o resultado de um erro de leitura ou do fim de um arquivo. (Note a conformação com o padrão ANSI C.)

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

9 horas atrás, hekotes630 disse:

Não tenho esse botão.

 

Ninguém "tem" esse botão. Ele faz parte da interface da plataforma que o clube do hardware usa. Ao menos se usa a partir de um navegador... O editor não é assim uma beleza, como se vê, mas... Quem sabe um dia possa aceitar markdown ao menos, ou HTML, mas hoje é o que tem na plataforma.

 

O que pode não ter notado é que dependendo do nível de zoom que usa alguns botões desaparecem, sem sinal. Talvez um dia a plataforma se dê ao trabalho de colocar um ícone tipo '+'.. Não seria nenhuma novidade.

 

image.png.333e982466fa00cdb1ceb89ec91938e7.pngCom 150% de zoom em um navegador ode ver isso.

 

 

image.png.eb5a57591854b51defffb70b84d4bcea.pngE com 125% isso...

 

 

E é um pesadelo copiar código assim da tela. Veja a diferença

 

#include <stdio.h>
#include <string.h>
int main(void)
{
    int   s[1000], i = 0, j = 0;
    char* spre[] = {"ALUNO", "ESCOLA"};
    while (1)
    {
        if (i == sizeof s / sizeof *s) goto err;
        if ((s[i] = getchar()) == EOF)
        {
            fprintf(
                stderr, "Ocorreu um erro de leitura!\n");
            return -1;
        }
        if (s[i] == spre[0][j])
        {
            if (++j == strlen(spre[0]))
            {
                char cpre[] = "ESTUDANTE";
                for (i -= j - 1, j = 0; j < sizeof cpre - 1;
                     i++, j++)
                {
                    if (i == sizeof s / sizeof *s) goto err;
                    s[i] = cpre[j];
                }
                j = 0;
                continue;
            }
        }
        else if (s[i] == spre[1][j])
        {
            if (++j == strlen(spre[1]))
            {
                char cpre[] = "UNIVERSIDADE";
                for (i -= j - 1, j = 0; j < sizeof cpre - 1;
                     i++, j++)
                {
                    if (i == sizeof s / sizeof *s) goto err;
                    s[i] = cpre[j];
                }
                j = 0;
                continue;
            }
        }
        else
            j = 0;
        if (s[i] == '\n')
        {
            s[i] = '\0';
            break;
        }
        i++;
    }
    for (i = 0; s[i]; i++) putchar(s[i]);
    putchar('\n');
    return 0;
err:
    fprintf(stderr, "Há muitos caracteres!\n");
    return -1;
}

 

Claro que o editor da plataforma poderia ter um botão pra copiar o texto direto da caixa de código, como tem em todo lugar --- ok, não todo lugar --- mas MDN tem, a MSDN tem. O Stack Overflow não tem...

 

9 horas atrás, hekotes630 disse:

O manual diz que é o resultado de um erro de leitura ou do fim de um arquivo. (Note a conformação com o padrão ANSI C.)

 

Pois é: OU. EOF é fim de arquivo e não é um erro. Deve usar perror() para identificar. Leia o manual. E considere o todo: fim de arquivo não é um erro. E seu programa vai dizer que 

    fprintf(stderr, "Há muitos caracteres!\n");

 

mesmo que seja um erro... Pode não ser nem uma coisa nem outra.

 

@hekotes630 entendeu o que eu expliquei sobre o label? 

 

Ainda sobre seu programa @hekotes630

 

  • chamar strlen() dentro de um loop para algo que é constante não é legal para um programa que vale nota ou salário. O tamanho de "ALUNO" não vai mudar. Nunca. O valor é constante e seu programa chama uma função toda hora para computar o mesmo valor. Quem sabe o compilador perceba e troque pela constante, mas mesmo assim é difícil de ler. 
  • procure declarar constantes como tal: const. Assim o compilador te avisa se tentar mudar por engano...
  • Se for preciso seguir a descrição como apresentada no tópico seu programa não serviria. Lá está descrito um algoritmo e pode não ser opcional.
Em 01/09/2023 às 11:37, Entusiasta da Elétrica disse:

Caso não te ajude recomendo que poste sua dúvida no Stack Overflow, pois, lá os caras entendem de fato, porém, recomendo que pergunte em inglês

 

Qualquer um pode escrever no Stack Overflow ou forum do Clube do Hardware. Não há assim uma garantia de qualidade. E o SO tende a desprezar perguntas de estudantes pedindo uma solução desse tipo, e fecham questões assim em minutos...

 

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

23 horas atrás, arfneto disse:

Seria bem mais legível e simples apenas deixar o código para o erro FORA do loop e usar um break em caso de erro.

Legível é subjetivo. O que é legível para você pode não ser a outras pessoas. Você não responde por todos. Aliás, se você é um bom programador, não vai se preocupar com isso.

 

8 horas atrás, arfneto disse:

Se for preciso seguir a descrição como apresentada no tópico seu programa não serviria. Lá está descrito um algoritmo e pode não ser opcional.

Se faz o que é pedido, por que se preocupar? O importante é entregar resultado.

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

23 minutos atrás, hekotes630 disse:

Se faz o que é pedido, por que se preocupar? O importante é entregar resultado.

 

Talvez deva prestar mais atenção ao texto e ao que eu expliquei: Se o algoritmo deve ser seguido como está no enunciado então o que tem que entregar deve seguir aquilo. Isso seria "entregar o resultado" e não escrever diferente por sua conta.

 

Agora se aquilo for só uma sugestão então você é livre para escrever como quiser. Em geral você não é: deve seguir a especificação.

 

Esse é o fim do loop como escreveu:

 

err:
    fprintf(stderr, "Há muitos caracteres!\n");
    return -1;
}

 

E o que você pensa disso? 

 

26 minutos atrás, hekotes630 disse:

Legível é subjetivo. O que é legível para você pode não ser a outras pessoas. Você não responde por todos. Aliás, se você é um bom programador, não vai se preocupar com isso.

 

Pois é: não é você que julga. É seu professor, seu patrão, seu cliente, o guia de práticas de sua empresa, o comitê  de revisão se for uma empresa grande, ou qualquer um no caso de um forum público como esse aqui.

 

Como te expliquei a mensagem sequer está correta. Não há garantia de que há um erro como escreveu, e sequer se pode afirmar que há muitos caracteres. 

 

E um label dentro de um loop  --- ao invés de um break e o código separado DEPOIS do while ---  não passaria por quase nenhum julgamento desde os anos 70. Essa questão de legibilidade e segurança foi o que extinguiu praticamente todos os labels e goto nos programas C desde aquela época.

 

Espero que tenha entendido também que chamar strlen() toda hora dentro de um loop para achar o tamanho de uma string constante não faria bem para sua nota nem para seu conceito perante seus colegas de empresa.

 

 

 

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

  • 3 meses depois...
Em 13/09/2023 às 10:54, hekotes630 disse:

Legível é subjetivo. O que é legível para você pode não ser a outras pessoas. Você não responde por todos. Aliás, se você é um bom programador, não vai se preocupar com isso.

 

[Opinião]:

Concordo contigo, reverter o legível para 'bem mais legível' faz sentido para aqueles que (ainda) enunciam. E vou além, destoa de refinamento do código-fonte, dizem uma etapa manual de otimização de software que a partir duma primeira solução, o refinamento define outra em expressões básicas e/ou eficientes;

E daí?

Daí responda, é possível equacionar/provar O eficiente e O Básico (S/N)?

Se SIM, então o eficiente e o básico não são subjetivos. E o legível é!

 

Refinamento do código-fonte, é uma etapa vital por volta de 1946

Hoje, para aqueles que deixam o compilador ajustar o código, meus sinceros parabéns porque o tempo é tudo.

 

Em 01/09/2023 às 10:36, Leonardo Augusto0761 disse:

Se poder explicar como ficaria este <código> agradeço muito 

 

[Opinião]:

As discussões, aparentemente, começam assim desse jeitinho e sendo C uma linguagem dita de cima para baixo, as soluções vão de sintética à analítica.

 

Na realidade, têm-se muitas soluções para um mesmo velho problema.

E não, eu não pesquisei, mas acredito que há muitas soluções de problemas semelhantes, quiça o mesmo problema com enunciado diferente. É uma oportunidade para aprender muito mais do que sugerem; no exercício da leitura do guia — suponho que tenha um ou mais guias de linguagem c para ler.

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!