Solicitação de algoritmo 6

Ajudo agora com uma solicitação de algoritmo feita por Gabriel Cabello, que enviou um enunciado curto e simples de entender, mas como envolve manipulação de strings, pode ser complicado de resolver.

Enunciado: desenvolva um programa que receba uma frase do usuário e em seguida mostre a frase digitada, mas com as palavras duplicadas.

Exemplo: “Eu tu ele” —–> “Eu Eu tu tu ele ele.

A solução iniciada pelo Gabriel segue abaixo.

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

int main() {
    char frase[200];
    int i;

    printf("Digite uma frase: ");
    gets(frase);

    for(i = 0; i != '\0'; i++) {
        if(frase[i] == ' ') {
            frase[i] += frase[i];
        }
    }
    printf("%s",frase[i]);

    return 0;
}

Eu inicio comentando sobre o uso da função gets() na linha 9. É bastante comum encontrar o uso dessa função para ler as strings, principalmente em material mais antigo na internet. É melhor utilizar a função fgets() e por isso é a primeiro item que faço ajuste no código. Para aprender mais sobre a função fgets(), clique aqui.

A instrução for utilizada tinha como objetivo percorrer o vetor até o último caractere (identificado pelo caractere especial ‘\0’). Um erro grave se apresenta na condição desse laço de repetição. Observe que a variável i é um número inteiro e somente terá valores numerais, nunca o caractere especial ‘\0’. O teste correto nessa situação é frase[i] != ‘\0’, ou seja, se o caractere na posição i da string indica o final da frase.

Outro erro facilmente identificável está na linha 16. A ideia era mostrar toda a frase lida no início do algoritmo, mas como foi passado para mostrar o frase[i], será mostrada apenas um caractere (o que estiver na posição i da frase). É evidente que essa não é a intenção e piora dependendo do valor da variável i, que pode levar para um valor que é apenas lixo de memória.

A aplicação das correções indicadas até o momento são mostradas a seguir. Na minha correção, eu alterei a linha 13 pois ela não faz muito sentido na solução do Gabriel, e alterei apenas para mostrar em que índices da string são encontrados os caracteres em branco.

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

int main() {
    char frase[200];
    int i;

    printf("Digite uma frase: ");
    fgets(frase,200,stdin);

    for(i = 0; frase[i] != '\0'; i++) {
        if(frase[i] == ' ') {
            printf("Caractere em branco em %i\n", i);
        }
    }
    printf("%s",frase);

    return 0;
}

Considerando que agora sabe onde encontra-se um caractere em branco, a palavra que se quer está nas posições anteriores desse espaço. Nesse sentido, irei buscar as letras da palavras tendo como limite de avaliação onde está esse caractere em branco. Na minha solução, eu coloco cada uma dessas palavras em uma outra string.

Uma vez que a solução fica difícil de entender, eu resolvi gravar um vídeo explicativo para apresentar minha solução. O vídeo está ao final da postagem, mas abaixo segue o código com a resolução.

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

int main() {
    char letra, frase[200], palavra[200];
    int i, j=0, x=0;

    printf("Digite uma frase: ");
    fgets(frase,200,stdin);

    for(i = 0; frase[i] != '\0'; i++) {
        if(frase[i] == ' ') {
            while (x < i) {
                palavra[j] = frase[x];
                j++;
                x++;
            }
            palavra[j] = '\0';
            j=0;
            x++;
            printf("%s %s ", palavra, palavra);
        }
    }

    //usei o i-1 para retirar o \n antes do \0
    //para entender pode ser necessário assistir o vídeo
    while (x < i-1) {
        palavra[j] = frase[x];
        j++;
        x++;
    }
    palavra[j] = '\0';
    printf("%s %s ", palavra, palavra);

    return 0;
}

Segue o vídeo que explica o código.

Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.