Ir ao conteúdo
  • Cadastre-se

Posts recomendados

Postado

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
Postado

É 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
Postado

@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
Postado
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
Postado

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
Postado
7 minutos atrás, arfneto disse:

 

? ama - r - elo 

ímpar

Exatamente.

 

23 horas atrás, Sheila Macedo disse:

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

 

  • Curtir 2
Postado
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
Postado
2 horas atrás, macpedral disse:

NO caso do "AMARELO", como imprimir o "AR" ?


🤔 Estaria errado. O tamanho é ímpar então no meio só tem uma letra. Foi bem comentado acima. E tem ao menos 5 exemplos completos

 

 

  • Curtir 2
Postado

@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
Postado

@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
Postado
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
Postado

@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;
}

 

Postado

@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

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