RVicente Posted May 27, 2009 at 06:51 PM Report #267797 Posted May 27, 2009 at 06:51 PM 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!
Baderous Posted May 27, 2009 at 07:58 PM Report #267822 Posted May 27, 2009 at 07:58 PM 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'.
OldCoder Posted May 27, 2009 at 10:37 PM Report #267867 Posted May 27, 2009 at 10:37 PM 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.
RVicente Posted May 28, 2009 at 07:46 PM Author Report #268091 Posted May 28, 2009 at 07:46 PM 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 😄
Baderous Posted May 28, 2009 at 08:24 PM Report #268112 Posted May 28, 2009 at 08:24 PM 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.
RVicente Posted May 28, 2009 at 09:15 PM Author Report #268133 Posted May 28, 2009 at 09:15 PM 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?
Baderous Posted May 28, 2009 at 09:20 PM Report #268136 Posted May 28, 2009 at 09:20 PM Quando detectares um espaço não fazes nada. Só tomas alguma acção quando encontras uma letra que seja minúscula.
RVicente Posted May 28, 2009 at 09:27 PM Author Report #268137 Posted May 28, 2009 at 09:27 PM 👍 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.
Baderous Posted May 28, 2009 at 09:46 PM Report #268142 Posted May 28, 2009 at 09:46 PM Mostra o código.
RVicente Posted May 28, 2009 at 10:31 PM Author Report #268156 Posted May 28, 2009 at 10:31 PM 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; }
Baderous Posted May 28, 2009 at 10:36 PM Report #268160 Posted May 28, 2009 at 10:36 PM 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>.
RVicente Posted May 28, 2009 at 10:40 PM Author Report #268162 Posted May 28, 2009 at 10:40 PM 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
OldCoder Posted May 28, 2009 at 10:44 PM Report #268166 Posted May 28, 2009 at 10:44 PM 👍 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++.
RVicente Posted May 28, 2009 at 10:54 PM Author Report #268169 Posted May 28, 2009 at 10:54 PM 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. 👍
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now