Jump to content

Recommended Posts

Posted

Boas!

Estou a desenvolver um algoritmo que converte, numa frase, as letras minúsculas para maiúsculas, e até aí tudo bem.

Decidi fazer uma função que convertesse essas mesmas letras presentes na frase e consegui. O problema agora é que quando essa frase tem espaços (ou seja antes seria só uma palavra lol) ele apenas converte a primeira cadeia de caracteres.

Tento antes experimentado usar arrays de chars e não ter funcionado, experimentei usar strings que estão presentes em <string>.

A nível de código um exemplo:

for(int contador = 0; counter <= lenght; counter++)
{
   switch (string[counter] )
   {
       case 'a':
           nova_palavra += 'A';
           break;
       ... ...
       case ' ':
          nova_palavra += ' ';
          break;
   }
}

Lembrei-me então de substituir o espaço pelo seu respectivo código ASCII e depois coloca-lo na nova palavra. Será que funciona? E como poderei fazer?

Cump's!

Posted

Isso não é assim que se faz, já viste o que é ter de fazer isso para todas as letras do alfabeto?!

Simplesmente percorres a string com esse ciclo e verificas:

1º - se o caracter em questão é uma letra

2º - se for letra, verificas se é minúscula

Caso seja, então convertes para maiúscula. Em C, existe uma função chamada toupper que faz esse processo automaticamente, mas em C, as strings são definidas como char*. Para as strings da classe String de C++ não sei como funciona. Mas podes também definir esse processo manualmente:

char c ='a';
printf("%c\n",'A'+c-'a');

Isto transforma o caracter 'a' em 'A'.

Posted

Como o Baderous disse, estás mais bem servido utilizando o toupper.

Em C++, o header que contém esta função de C é

#include <cstdlib>

Mas se tens apenas curiosidade numa implementação simples alternativa, este é um caso em que o switch é desnecessário.

No caso mais simples, sem acentos, pode-se por exemplo fazer a conversão a uma string assim:

string allcaps(const string &text)
{
  string ret = text;
  for(int i = 0; i < ret.size(); ++i)
  {
     if(s[i] >= 'a' && s[i] <= 'z')
       s[i] -= 32;
  }
  return ret;
}

Tal como em C, pode-se utilizar a conversão implícita entre char e int.

Posted

A questão aqui seria fazer a própria função de uppercase. Se eu estiver a verificar se ela é minúscula ou maiúscula já estou a usar funções do género  👍 .

Mas sim, não tem muita lógica fazer isto tudo para todas as letras do alfabeto mas de facto comecei por fazer isso e ainda está assim.

if(s >= 'a' && s <= 'z')

      s -= 32;

Não consigo compreender o que este pedaço de código faz. Para ser franco, sou franco em sintaxe de C/C++ e não estou a ver como é que ele vai associar as letras por ordem, do tipo,  < b.

De qualquer das maneiras, mesmo que optimize o algoritmo o problema do espaço continua  😄

Posted

O que isso faz é verificar se o caracter guardado na variável s está entre 'a' e 'z', isto é, se é uma letra minúscula. Se for, então é-lhe subtraído o valor 32. Como os caracteres correspondem a valores inteiros segundo a Tabela ASCII, podes fazer essa operação sem haver problema nos tipos. Por exemplo, para o caracter 'a' que tem código ASCII decimal de 97, essa operação iria retornar o código 65, que corresponde ao 'A'. Podes então concluir que essa operação transforma uma letra minúscula numa maiúscula.

Posted

Acho que entendi. Então para cara caracter minúsculo, o correspondente maiúsculo terá o valor x-36 na tabela ASCII. Desconhecia por completo. Obrigado.

Então se eu detectar um espaço, por exemplo:

      if(s[i] == ' ' )
       s[i] = 20;

Poderei fazer isto?

Posted

👍 Aqui a principal questão seria essa. Por exemplo:

Input:

Hoje esteve sol

Output

HOJE ESTEVE SOL

mas na verdade o que acontece é:

Output

HOJE

E a duvida seria como por um espaço na frase  😄 .

De qualquer dos modos agradeço a atenção sobre o case.

Posted

ficheiro .cpp

#include <iostream>
#include "uppercase.h"

#ifndef STRING 
        #include <string>
#endif

using namespace std;

string sentence;

int main()
{
    
    cin >> sentence;

    cout << uppercase(sentence)<< '\n';;
    
    system("pause");
return 0;
}

ficheiro .h

#include <string>

#define STRING ;

using namespace std;

string uppercase(string text)
{

  for(int i = 0; i < text.size(); ++i)
  {
     if(text[i] >= 'a' && text[i] <= 'z')
       text[i] -= 32;       
  }
  
  return text;
}
Posted

A função parece-me estar correcta. Tens a certeza de que estás a conseguir ler correctamente o input através do cin? Faz aí um print de sentence após o cin, para ver se lê tudo ou se só está a ler até ao <ESPAÇO>.

Posted

Isto funciona. Eu já sei qual é o problema... não tenho é conhecimentos para o resolver =|

Basicamente, quando declaro uma string e lhe introduzo valores:

string palavra;

cin >> palavra;

cout << palavra

---------

input

hoje esteve sol

output

hoje

----------

Acontece isto lol, ou seja, ele não guarda a frase, apenas a primeira cadeia de caracteres, daí o facto de ele não reconhecer o espaço, ou o numero 32 da tabela ASCII

Posted

👍 Aqui a principal questão seria essa. Por exemplo:

Input:

Hoje esteve sol

Output

HOJE ESTEVE SOL

mas na verdade o que acontece é:

Output

HOJE

E a duvida seria como por um espaço na frase  😄 .

De qualquer dos modos agradeço a atenção sobre o case.

string palavra;
cin >> palavra;

Isto tem o efeito indesejado de excluir do teu input tudo o que venha a seguir ao primeiro espaço. Isto porque ao utilizar o cin e o cout (as streams de input e output para a consola), toda a informação é automaticamente separada e formatada.

Para extrair linhas de texto completas de streams, tens uma excelente função, contida na biblioteca das strings: getline. Basta usá-la assim:

string texto;
getline(cin,texto);

Recomendo algum tempo a dar uma vista de olhos à referência das classes de input/output, e de como estas interagem com strings em C++.

Posted

Sim, faz sentido.

Infelizmente tempo é coisa que não tenho por agora lol mas é certo que daqui a 3 meses sensivelmente vou dar umas belas vistas de olhos no C e no C++  😄🙂

Vou procurar sobre essa biblioteca.

👍

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.