Ir ao conteúdo
  • Cadastre-se

C++ Utilização de string para representar textos


Sheila Macedo

Posts recomendados

Olá boa tarde!

Estou com dificuldades em um  exercício, alguém pode me ajudar?

 Faça um programa na linguagem C++ que leia uma string e imprima os o carácteres que se encontra no meio dela

Ex:para a string ovo → o programa deve imprimir a letra v

Ex: para a string andré → o programa deve imprimir a letra d

Ex: para a string jose → o programa deve imprimir as letras os

Ex: para a string amarelo → o programa deve imprimir as letras ar

Na imagem abaixo está o código, mas não está como se deve.

Desde já agradeço.

 

Trabalho 8.png

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

É só contar o número de caracteres, depois testar se é ímpar ou par. Se for par, divide por dois e manda imprimir o caractere anterior e o da divisão.

Tipo:

panqueca = 8 caracteres / 2 = 4 -> imprimi os índices 3 e o 4;

 

Se for ímpar, divide por dois e imprime o caractere do resultado inteiro.

Tipo:

andré = 5 caracteres / 2 = 2,5 -> imprime o índice 2.

 

adicionado 0 minutos depois

E observe que os índices começam com 0 (zero) e não um como você colocou.

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

@Sheila Macedo      a linguagem C++ não é a mesma linguagem C , apesar de ter o nome bem parecidos e  Quase iguais , porém o que acontece é que em C++ pode se usar os comandos da linguagem C , então como o enuncido disse para fazer em C++ , não é para usar os comandos da linguagem C ,  então creio que seu código poderia ser assim  :

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    string str;
    cout<<"Uma String ";
    cin>>str;
    cout<<"\n\ntamanho da string -> "<<str.size()<<endl;
    char chr[str.size()];
    str.copy(chr,1,str.size() / 2 );
    chr[1]='\0';
    cout<<"\n\n"<<"O Caractre Do Meio Dessa String eh "
        <<chr<<"\n\n"<<endl;
    return 32768;
}

 

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

Ex:para a string ovo  o programa deve imprimir a letra v
Ex: para a string andré  o programa deve imprimir a letra d
Ex: para a string jose  o programa deve imprimir as letras os
Ex: para a string amarelo  o programa deve imprimir as letras ar

Talvez deva rever seu exemplo no caso "amarelo"...

 

Pode usar um trecho assim, usando substr() que retorna uma substring de comprimento L a partir da posição P na string original:

	string substr (size_t P, size_t L) const;

size_t é um inteiro positivo. Mas pode usar int. E escrever

    string str = "teste";
    int inicio = 0;
    int total = 0;
    if (str.size() == 0) return 0;
    if (str.size() % 2 == 1)
    {   inicio = str.length() / 2;
        total = 1; // impar
    }
    else
    {   inicio = str.length() / 2 - 1;
        total = 2; // par
    };
    cout << "String: '" << str
        << "'\tTamanho: " << str.length()
        << "\tMeio: '" << str.substr(inicio, total)
        << "'\n";

Que iria mostrar

String: 'teste' Tamanho: 5      Meio: 's'

Talvez não possa usar outras funções, já que fica um pouco sem propósito usar substr() e esse seria o equivalente

    string saida = "";
    int len = str.length();
    if (len > 0)
    {
        if (len % 2 == 1)
            saida += str[len/2];
        else
        {
            saida += str[(len / 2) - 1];
            saida += str[(len / 2)];
        };
        cout << "String: '" << str
            << "'\tTamanho: " << len
            << "\tMeio: '" << saida << "'\n";
    };  // if
    return 0;

Do modo C++ de ser, pode considerar pegar a classe string e  criar uma função meio() --- historicamente se chama método em C++ ao invés de função --- e escrever algo assim

class StringNova : public std::string
{
public:
    string meio()
    {
        if (size() == 0) return "";
        if (size() % 2 == 1)
            return substr(size() / 2, 1);
        else
            return substr((size() / 2) - 1, 2);
    };
    StringNova() : string(""){};
    StringNova(const char* s) : string(s){};
};

Isso se chama estender a classe string, e StringNova é dita derivada de string. E aí pode escrever só

    StringNova valor{ "teste" };
    cout << "String: '" << valor <<
        "' \tTamanho: " << valor.length() <<
        "\tMeio: '" << valor.meio() << "'\n";

Porque valor já tem o método meio() então é só chamar valor.meio()

 

Um teste com as 3 opções
 

Spoiler

#include <iostream>
using namespace std;

class StringNova : public std::string
{
public:
    string meio()
    {
        if (size() == 0) return "";
        if (size() % 2 == 1)
            return substr(size() / 2, 1);
        else
            return substr((size() / 2) - 1, 2);
    };
    StringNova() : string(""){};
    StringNova(const char* s) : string(s){};
};

int main(void)
{
    string str = "teste";
    int inicio = 0;
    int total = 0;
    if (str.size() == 0) return 0;
    if (str.size() % 2 == 1)
    {   inicio = str.length() / 2;
        total = 1; // impar
    }
    else
    {   inicio = str.length() / 2 - 1;
        total = 2; // par
    };
    cout << "String: '" << str
        << "'\tTamanho: " << str.length()
        << "\tMeio: '" << str.substr(inicio, total)
        << "'\n";

    string saida = "";
    int len = str.length();
    if (len > 0)
    {
        if (len % 2 == 1)
            saida += str[len/2];
        else
        {
            saida += str[(len / 2) - 1];
            saida += str[(len / 2)];
        };
        cout << "String: '" << str
            << "'\tTamanho: " << len
            << "\tMeio: '" << saida << "'\n";
    };  // if

    StringNova valor{ "teste" };
    cout << "String: '" << valor <<
        "'\tTamanho: " << valor.length() <<
        "\tMeio: '" << valor.meio() << "'\n";

    return 0;
};

 

 

Que ia mostrar 3x a mesma coisa

String: 'teste' Tamanho: 5      Meio: 's'
String: 'teste' Tamanho: 5      Meio: 's'
String: 'teste' Tamanho: 5      Meio: 's'

@devair1010 veja nos exemplos que quando a string de entrada tem comprimento par você tem que retorna DUAS letras.

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

No caso do amarelo não é só 'r'?

 

#include <iostream>

using namespace std;

int main(){
    string str[4] = {
        "ovo","andre","jose","amarelo"};
    
    for(int i = 0, n = 0;i<4;i++){
        n = str[i].size()/2;
        
        cout << "Valor do elemento " << i+1 << " = ";
        
        if(!(str[i].size() % 2)){
            cout << str[i][n - 1];
        }
        cout << str[i][n] << endl;
    }
    return 0;
}

 

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

36 minutos atrás, Midori disse:

Exatamente.

 

 

 

O exemplo do tópico tem esse erro no exemplo do "amarelo". Só isso.

 

@Midori 
Outro exemplo:

note que o loop de seu exemplo

    string str[4] = {
        "ovo","andre","os","amarelo" };
    for(int i = 0, n = 0;i<4;i++){
        n = str[i].size()/2;
        
        cout << "Valor do elemento " << i+1 << " = ";
        
        if(!(str[i].size() % 2)){
            cout << str[i][n - 1];
        }
        cout << str[i][n] << endl;
    }

que mostra 

Valor do elemento 1 = v
Valor do elemento 2 = d
Valor do elemento 3 = os
Valor do elemento 4 = r

pode ser trocado por algo como

    string str[4] = {
        "ovo","andre","os","amarelo" };
    for (auto uma : str)
    {
        int n = uma.size() / 2;
        cout << "\"meio\" de '" << uma << "' = ";
        if (!(uma.size() % 2)) cout << uma[n - 1];
        cout << uma[n] << endl;
    };  // for()

que mostraria

'meio' de "ovo" = "v"
'meio' de "andre" = "d"
'meio' de "os" = "os"
'meio' de "amarelo" = "r"

que pode ser um pouco mais fácil de ler, o programa e o resultado. Claro, estender string como eu mostrei antes é o mais legível e moderninho :) 

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

@macpedral       Oi ,  no caso esse código que poster acima , seria apenas um exemplo do modo de como fazer em C++ ,  para mostrar o ( s )  caractere ( s ) da String ,  e a partir daí cada hum usa a prória Lógica criada pela sua imaginação para mostra N's caracteres ,  do modo que melhor lhe convier  ,  por exemplo ,  aqui acima tem outros códigos mais sofisticados que mostram os caracteres do jeito que foi pedido pelo enunciado ,  

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

@devair1010 @arfneto

Muito obrigado pelo retorno, sou iniciante nessa nova jornada e agradeço pela orientação

adicionado 22 minutos depois

@arfneto Como elaborar nesse caso :
 

Ex: para a string jose → o programa deve imprimir as letras os

Ex: para a string amarelo → o programa deve imprimir as letras ar

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

1 hora atrás, macpedral disse:

@devair1010 @arfneto

Muito obrigado pelo retorno, sou iniciante nessa nova jornada e agradeço pela orientação

adicionado 22 minutos depois

@arfneto Como elaborar nesse caso :
 

Ex: para a string jose → o programa deve imprimir as letras os

Ex: para a string amarelo → o programa deve imprimir as letras ar

 

No caso de "amarelo", por favor entenda o que foi discutido e o que expliquei:
 

Citação

quando a palavra tem comprimento ímpar o resultado só tem uma letra....



Eu por exemplo postei 3 soluções acima... Olhe lá e me diga se não entendeu e tento explicar de outro modo...

 

Lá no tópico clique no botão 

image.png.509070f9d050d3dec661c33c19654c6c.png e vai ver o programa com as 3 versões para a solução, e veja o que expliquei

 

 

 

 

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

@macpedral      aqui  esse código atende o que foi pedido no enunciado ,  que está com  erro  ou foi de propósito ,  mas creio que seria uma boa Solução para o caso , e com a permissão do  @arfneto  vou usar o código que ele criou  e fazer algumas modificações nele para isso   :

#include <iostream>
#include <locale>
using namespace std;
int main(){
    setlocale(LC_CTYPE, "");
    string str[4] = {"ovo","andré","jose","amarelo"},
           enunciado;
    int i;
    cout << endl;
    for(i=0; i<4; i++){
        int inicio = 0;
        int total = 0;
        if (str[i].size() == 0) return 0;
        if (str[i].size() % 2 == 1)
        {
            inicio = str[i].length() / 2;
            total = 1; // impar
        }
        else
        {
            inicio = str[i].length() / 2 - 1;
            total = 2; // par
        };
        cout << "String --: '" << str[i]          << "'"  << endl
             << "Tamanho -:  " << str[i].length() <<         endl
             << "Meio ----: '" << str[i].substr( inicio , total )
             << "'\n" << endl;
        if(str[i] == "amarelo")
        {
            enunciado = "ar";
            cout << "como pedido no enunciado "  << "\n" << "\n"
            << "String --: '" << str[i]          << "'"  << endl
            << "Tamanho -:  " << str[i].length() <<         endl
            << "Meio ----: '" << enunciado       << "'"  <<
            " <- está errado pois é Ímpar então só uma Letra" << endl;
        }
    }
    cout << endl;
    return 32768;
}

 

Link para o comentário
Compartilhar em outros sites

@devair1010 Note que no tópico #10 eu também sugeri algo como

    const string str[4] = {
        "ovo","andre","os","amarelo" };

    cout << "\ncaso 1: mostra so as letras na saida\n\n";
    for (const auto& uma : str)
    {
        int n = uma.size() / 2;
        cout << "\"meio\" de '" << uma << "' = ";
        if (!(uma.size() % 2)) cout << uma[n - 1];
        cout << uma[n] << endl;
    };  // for()

E no exemplo que eu mostrei inicialmente era pra ler uma única string.
Acho que essa maneira acima é a mais curta de escrever isso.

Sobre essa chamada:

 

setlocale (LC_ALL, "");

 

Note que eu não usei acentos em "andre"

 

Quando você chama setlocale() assim está dizendo ao programa para usar as configurações do sistema em que o programa está rodando. Só que você não sabe qual é a configuração de locale. Em geral é problema. Windows 10 por exemplo entra sempre com a página 850, onde o 'é' vai virar "Ú". Veja esse trecho numa máquina comum:

C:\Users\toninho\source\repos\ConsoleApplication29\Debug>chcp
Página de código ativa: 850

C:\Users\toninho\source\repos\ConsoleApplication29\Debug>ConsoleApplication33

caso 1: mostra so as letras na saida

"meio" de 'ovo' = v
"meio" de 'andrÚ' = d

... 


C:\Users\toninho\source\repos\ConsoleApplication29\Debug>chcp 1252
Página de código ativa: 1252

C:\Users\toninho\source\repos\ConsoleApplication29\Debug>ConsoleApplication33

caso 1: mostra so as letras na saida

"meio" de 'ovo' = v
"meio" de 'andré' = d

...

Apaguei as linhas dos outros testes acima, claro. O que --- eu acho --- importa é entender que se: 

- provavelmente o melhor é apenas nem tentar usar acentos.É irrelevante aqui

- se vai usar então salve o locale chamando getlocale(), mude para português com setlocale(), mostre os valores e restaure ao final com o valor de locale que você salvou. 

- o fato de sair ok em seu computador não quer dizer que vai sair assim em outros. Ou mesmo no seu depois que você rodar um programa que, assim como o seu eventualmente, muda coisas e não restaura, como fontes da console, cores ou atributos regionais ;) 

 

Outra opção: criar uma string com o resultado

 

As outras opções de que falei eram criar uma string com o valor, algo que o enunciado não exige, apenas para mostrar o overload do operador '+' no caso da classe string em C++, tipo java:

    // opcao 2 sem usar funcoes
    cout << "\ncaso 2: cria uma string\n\n";
    for (const auto& uma : str)
    {
        string saida = "";
        int len = uma.length();
        if (len > 0)
        {
            if (len % 2 == 1)
                saida += uma[len / 2];
            else
            {
                saida += uma[(len / 2) - 1];
                saida += uma[(len / 2)];
            };
            cout << "String: '" << uma
                << "'\tTamanho: " << len
                << "\tMeio: '" << saida << "'\n";
        };  // if
    };  // for()

Outra opção: derivar string e cria o método meio

    cout << "\ncaso 3: deriva classe 'string' e cria metodo meio()\n\n";
    for (const auto& uma : str)
    {
        StringNova valor(uma.c_str());
        cout << "String: '" << valor <<
            "'\tTamanho: " << valor.length() <<
            "\tMeio: '" << valor.meio() << "'\n";
    };  // for()

Esse é o princípio de classes afinal e a linguagem foi escrita para isso. Bem mais fácil de ler, já que basta escrever valor.meio() e ter a string.

Precisaria de algo assim

class StringNova : public std::string
{
public:
    string meio()
    {
        if (size() == 0) return "";
        if (size() % 2 == 1)
            return substr(size() / 2, 1);
        else
            return substr((size() / 2) - 1, 2);
    };
    StringNova() : string("") {};
    StringNova(const char* s) : string(s) {};
};

Claro que na prática teria que ser mais elaborado :) 

 

Clique no botão para ver o programa completo

Spoiler

#include <iostream>
using namespace std;

class StringNova : public std::string
{
public:
    string meio()
    {
        if (size() == 0) return "";
        if (size() % 2 == 1)
            return substr(size() / 2, 1);
        else
            return substr((size() / 2) - 1, 2);
    };
    StringNova() : string("") {};
    StringNova(const char* s) : string(s) {};
};

int main(void)
{
    const string str[4] = {
        "ovo","andré","os","amarelo" };


    // opcao 1, moderninha mas usa size()
    cout << "\ncaso 1: mostra so as letras na saida\n\n";
    for (const auto& uma : str)
    {
        int n = uma.size() / 2;
        cout << "\"meio\" de '" << uma << "' = ";
        if (!(uma.size() % 2)) cout << uma[n - 1];
        cout << uma[n] << endl;
    };  // for()

    // opcao 2 sem usar funcoes
    cout << "\ncaso 2: cria uma string\n\n";
    for (const auto& uma : str)
    {
        string saida = "";
        int len = uma.length();
        if (len > 0)
        {
            if (len % 2 == 1)
                saida += uma[len / 2];
            else
            {
                saida += uma[(len / 2) - 1];
                saida += uma[(len / 2)];
            };
            cout << "String: '" << uma
                << "'\tTamanho: " << len
                << "\tMeio: '" << saida << "'\n";
        };  // if
    };  // for()

    cout << "\ncaso 3: deriva classe 'string'"
        "e cria metodo meio()\n\n";
    for (const auto& uma : str)
    {
        StringNova valor(uma.c_str());
        cout << "String: '" << valor <<
            "'\tTamanho: " << valor.length() <<
            "\tMeio: '" << valor.meio() << "'\n";
    };  // for()

    return 0;
};

 

E aqui para ver a saída, que é a mesma de antes

Spoiler

caso 1: mostra so as letras na saida

"meio" de 'ovo' = v
"meio" de 'andrÚ' = d
"meio" de 'os' = os
"meio" de 'amarelo' = r

caso 2: cria uma string

String: 'ovo'   Tamanho: 3      Meio: 'v'
String: 'andrÚ' Tamanho: 5      Meio: 'd'
String: 'os'    Tamanho: 2      Meio: 'os'
String: 'amarelo'       Tamanho: 7      Meio: 'r'

caso 3: deriva classe 'string'e cria metodo meio()

String: 'ovo'   Tamanho: 3      Meio: 'v'
String: 'andrÚ' Tamanho: 5      Meio: 'd'
String: 'os'    Tamanho: 2      Meio: 'os'
String: 'amarelo'       Tamanho: 7      Meio: 'r'

 

 

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