• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Mr.kraft

Ler um espaço num switch case

14 mensagens neste tópico

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!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

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  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando detectares um espaço não fazes nada. Só tomas alguma acção quando encontras uma letra que seja minúscula.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:thumbsup: 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  :D.

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:thumbsup: 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  :D.

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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++  :D:)

Vou procurar sobre essa biblioteca.

:thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora