Ir ao conteúdo
  • Cadastre-se

C++ Abreviar nomes e deixar primeira letra maiuscula


Posts recomendados

@Artivis Sob    no c++ você pode usar o comando push_back(); para inserir dados no vetor , e para converter você precisa verificar as letras , percorrendo todos os caracteres da string  , e seu código poderia ser assim 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <vector>
#include <stdlib.h>
using namespace std;
int main()
{
    int n;
    vector <string> nome;
    string minha_string;
    cin >> n;
    cin.ignore();
    for (int i = 0; i < n; i++)
    {
        getline(cin, minha_string);
        nome.push_back(minha_string);
    }
    for (int i = 0; i < n; i++)
    {
        int cont = 0;                                 // contar as palavras do nome
        for (int j = nome[i].size(); j >=0; j--)      // para controlar a ultima e 
        {                                             // as outras
            cout << nome[i][j] << endl;
            if (nome[i][j] == 32)
            {
                if (cont == 0 && nome[i][j + 1] > 96) // se for minuscula
                {
                    nome[i][j+1] -= 32;               // converte para maiuscula
                }
                if (cont)                             // se cont diferente de zero
                {
                    // converter as outras palavras
                }
              cont++;
            }
        }
      cout << nome[i] << " " << endl;
    }
    cout << "\n\n" << endl;
    return 0;
}

 

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

Olá (todos)

 

@Artivis Sob Estás uma semana (ou próximo disso) travado na lógica do programa em C++.

 

Escrevi solução operando com recurso chamando  find, uma função  que procura (sub-strings ou caractere) na ‘string’ e retorna a posição da primeira ocorrência. 

 

Sabendo que os dados são ideias isso significa que todas as palavras são separas por único espaço. Se retorna a posição de um espaço na ‘string’, podemos presumir que posição seguinte é a primeira letra do nome seguinte. Daí, em seguida se buscar e retorna, novamente, uma posição de espaço então aquela letra que ficou na posição seguinte do espaço anteriormente será impressa:

 

Maiúscula, com Ponto e espaço.

image.png.7b738e9981ce49c2412325bde490e79a.png

 

Notou que a lógica está em “loop”/laço? O término desse “loop” acontece ao atingir o começo do último nome na “string”. Convenientemente, se buscar um espaço na ‘string’ próximo do último nome a função retorna valor identificador por   npos  .  Isso significa que a última posição de espaço que retornou antes de  npos  é também posição que antecede a última palavra.

 

 

Esperamos que consiga com as explicações.

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

Eu cria uma função com o parâmetro do nome,

 

string abreviar(string &nome);

 

Para retornar o nome abreviado primeiro poderia pegar a posição do último caractere com espaço com a função find_last_of. Assim quando fizer o loop nas letras do nome, pode testar se o índice de determinada letra é menor esse valor. Algo assim,

 

size_t n = nome.find_last_of(" ");
...
if(i > n){
    if(nome[i - 1] == ' '){
        abreviado += toupper(nome[i]);   
    }else{
        abreviado += nome[i];
    }
}else{
    if(i == 0 || nome[i - 1] == ' '){
        abreviado += toupper(nome[i]);
        abreviado += ". ";
    }
}

 

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

 

Claro que há muitas maneiras de escrever algo assim, mas olhando para o arquivo de entrada
 

3
maria andrade ferreira
felipe barros silva matos
joao barbosa


E vendo a saída esperada:

 

M. A. Ferreira
F. B. S. Matos
J. Barbosa
  • Se vê que não há memória dos valores exceto pela última palavra.
     
  • Não há necessidade de usar vetores, criar novas strings ou encontrar palavras para passar para funções adicionais
     
  • A primeira letra de cada nome ou sobrenome já pode ser convertida para maiúscula

EXEMPLO simples em C++

 

Esse exemplo usa um loop para ler as N linhas  depois de ler N, sempre do arquivo nomes.txt. Não era preciso, podia ler até o fim do arquivo. Mas está no enunciado.

 

Dentro do loop:

  • apenas mostra a inicial em maiúscula
  • se for o ultimo nome mostra o nome completo, senão mostra o ponto apenas
  • pula linhas em branco
  • aceita brancos em sequência
#define ESPACO_ (' ')
#include<fstream>
#include<iostream>
#include<string>
using namespace std;
    
int main(void)
{
    ifstream    in { "nomes.txt" };
    string      nome_completo;
    unsigned    N = 0;
    in >> N;    // le o total de linhas
    getline( in, nome_completo); // le o resto da primeira linha
    for ( unsigned i = 0; i<N; i+=1 )
    {   // le linha por linha os N nomes
        getline( in, nome_completo); // le o nome completo
        if ( nome_completo.length() == 0 )
        {   cout << "\n"; // nome em branco
            continue;
        }
        int         st = 0;

        auto ix_frase = 0;
        auto ix_nome =  0;
        while ( nome_completo[ix_frase] != 0 )
        {
            auto letra = nome_completo[ix_frase];
            switch ( st )
            {
                case 0: // inicio de palavra
                    if ( letra == ESPACO_ ) break;
                    ix_nome = ix_frase; // comeca um nome
                    cout << (char) toupper(letra);
                    st = 1;
                    break;
                case 1: // lendo uma palavra
                    if ( letra == ESPACO_ )
                    {   cout << ". "; // tinha algo antes
                        st = 0; // volta
                    } 
                    break;
            }   // switch()
            ix_frase++; // anda um 
        };  // while()
        if ( ix_frase-ix_nome > 0 ) // sobrou algo para o sobrenome
            cout << nome_completo.substr( ix_nome+1, (ix_frase-ix_nome)) << "\n";
        else
            cout << "\n";
    };  // for()
    return 0;
}

 

Exemplo de compilação, execução e o arquivo de teste: 
 

clube> pr -n -l 10  nomes.txt
    1   7
    2   maria andrade ferreira
    3   felipe barros silva matos
    4   joao barbosa
    5
    6   maria
    7                            mais
    8   t e s t e 
clube> g++ -Wall fase2.cpp
clube> ./a.out
M. A. Ferreira
F. B. S. Matos
J. Barbosa

Maria
Mais
T. E. S. T. E.  
clube> 

 

23 horas atrás, devair1010 disse:

no c++ você pode usar o comando push_back(); para inserir dados no vetor , e para converter você precisa verificar as letras , percorrendo todos os caracteres da string  , e seu código poderia ser assim

pode ser, claro. Mas não é preciso copiar tudo de novo para vetores de strings. Nem percorrrer a string mais de uma vez: a primeira letra SEMPRE sai em maiúscula.

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!