Programando em C++: Encontrando Palíndromos | Programação
Por Daniel Cardoso Tavares
Olá a todos, hoje criaremos um programa que verificará se duas palavras (ou frases), são palíndromos, ou seja: leem a mesma coisa de traz para frente ou em sentido normal.
Como comandos novos temos:
nomeDaSuaString.find(“termoQueVoceProcura”) –> encontra determinada palavra ou frase em uma string e retorna o “endereço” de onde ela começa, como se fosse em um array.
Exemplo: string hoje = “Hoje e um bom dia”; hoje.find(“bom dia”); //o retorno será 10.
nomeDaSuaString.begin()+indexador –> retorna a string a partir de determinado ponto. O indexador pode ser o número retornado pela função membro .find.
nomeDaSuaString.erase(nomeDaSuaString.begin()+indexador) –> este comando serve para deletar (erase) determinado character que está na posição escolhida ou entre duas posições = nomeDaString.erase(posição1, posição2);
como exemplos de palindromos temos as frases: Anotaram a data da maratona; Socorram-me, subi no onibus em Marrocos; Mar e numero remuneram etc.
#include <iostream> #include <conio .h> #include <string> using namespace std; int main() { string string1 = ""; string string2 = ""; string stringReverse = ""; int strLength = 0; int index = 999; int counter = 0; cout < < "Entre com uma string: "; getline(cin, string1); string2 = string1; cout << "A string e: " << string1 << endl; for(int x = 0; x < string2.length(); x++) { string y = ""; y = string2[x]; if(y == " ") { counter++; } } if(counter > 0) { do { index = string2.find(" "); string2.erase(string2.begin()+index); counter--; }while(counter > 0); } stringReverse = string2; for(int x = 0; x < string2.length(); x++) { int c1 = string2.length() - x; stringReverse[c1 - 1] = string2[x]; } cout << "O inverso dessa string e: " << stringReverse << endl; if(stringReverse == string2) { cout << "As duas strings inseridas sao palindromos!" << endl; cout << "String 1: " << string2 << endl; cout << "String 2: " << stringReverse << endl; } getch(); return 0; }
Programando em C++: Strings Reversas (Colocando Textos ao Contrário) | Programação
Por Daniel Cardoso Tavares
Dando prosseguimento à série de códigos de aprendizado em c++, hoje colocaremos um que mostra como inverter a ordem da uma string, apresentando o texto ao contrário.
Para isso, utilizamos os seguintes comandos:
getline(cin, suaString) –> cuja finalidade é receber strings contendo espaços, o ideal para nomes completos, por exemplo.
nomeDaString[posiçãoQueVoceQuerDentroDoVetor] –> se você lidar com as strings como se fossem arrays (ou vetores), poderá “andar” por elas e verificar caractere por caractere. Como o c++ trata strings como classes, você utilizará isso a seu favor aqui e no comando seguinte.
nomeDaString.length() –> este comando retornará o tamanho da string.
Vamos ao código (que deve ser compilado utilizando o Dev-C++):
#include <iostream> #include <conio .h> using namespace std; int main() { string string1 = ""; string stringReverse = ""; int strLength = 0; cout < < "Entre com uma string: "; getline(cin, string1); stringReverse = string1; cout << "A string e: " << string1 << endl; for(int x = 0; x < string1.length(); x++) { int c1 = string1.length() - x; stringReverse[c1 - 1] = string1[x]; } cout << "O inverso dessa string e: " << stringReverse << endl; getch(); return 0; }
Programando em C++: Rvalue e Lvalue | Programação
Por Daniel Cardoso Tavares
Fontes: ibm e VTC.
Algumas coisas não são tão importantes assim no dia-a-dia, mas são conceitualmente necessárias, por isso vou colocar aqui, rapidamente, o que são rvalues e lvalues em c++.
Lvalue
Basicamente, lvalues são aqueles valores que persistem ao longo do tempo.
Ex: x = 8 + 5; Aqui, 8, 5 e o resultado de 8 + 5, por si sós, serão perdidos após a passagem por esta parte do código. Em si mesmos, 8, 5 e o resultado da operação são “descartáveis”.
Por outro lado, x continuará “por aí”, interagindo com o valor que contém. Então, x, permanecendo ao longo do tempo, é um lvalue.
Em geral, lvalues aparecem do lado esquerdo da expressão (lvalue lembra “left value”).
Rvalue
Rvalues são exatamente aqueles valores 8, 5 e 13 (resultado) do exemplo x = 8 + 5;
Rvalues são temporários e permanecem apenas enquanto durar a execução. Além disso, rvalues não podem acontecer no seguinte contexto: 8 + 5 = x; –> isso gerará um erro.
Um rvalue é um valor que será guardado em determinada localização na memória. Todo lvalue guardará algum rvalue.
Quando chamamos um lvalue em determinados contextos, ele poderá ser convertido implicitamente em rvalue. Exemplo:
x = 15; y = x + 1;
Em geral, os rvalues aparecerão do lado direito da expressão (rvalue lembra “right value”).
Programando em C++: Strings para Nomes Completos | Programação
Por Daniel Cardoso Tavares
Faremos, hoje, uma string que receba nomes completos em C++.
Em primeiro lugar, é importante notar que você deve incluir a biblioteca <string>. Em seguida, sugiro que faça um teste utilizando apenas um cin tradicional e tente inserir seu nome completo:
#include <iostream> #include <string> #include <conio .h> int main() { std::string nomeCompleto = ""; std::cout < < "Digite seu nome completo: " << std::endl; std::cin >> nomeCompleto; std::cout < < "Seu nome e: " << nomeCompleto; getch(); }
Não dará certo: apenas o primeiro nome aparecerá.
Isto se dá porque o recebimento de strings que aceitem espaços requer outro comando: getline(comando, variável).
Assim, em nosso código o certo seria colocar: getline(cin, nomeCompleto).
#include <iostream> #include <string> #include <conio .h> int main() { std::string nomeCompleto = ""; std::cout < < "Digite seu nome completo: " << std::endl; getline(std::cin, nomeCompleto); std::cout << "Seu nome e: " << nomeCompleto; getch(); }
Valeu e até a próxima
Programando em C++: (Training Wheel) Como Criar variáveis Sem Precisar Declarar o Tipo Usando “Auto” do C++11 | Programação
Por Daniel Cardoso Tavares
Em mais um curso de C++ que estou fazendo (colocarei o review aqui em breve), como sempre precedido pelo “blá blá blá” de ifs, elses, whiles etc., (desculpe quem está começando, mas depois da décima quinta vez que você vê isso a paciência começa a faltar) finalmente veio algo novo. De fato, várias informações novas, que aos poucos colocarei aqui.
A info do dia é: como criar variáveis no c++ sem ter que declarar o tipo (int, float, bool etc), ao estilo PHP (que não tem qualquer declaração) ou JavaScript (que usa o termo genérico “var”).
Bom, a coisa é muito simples, basta colocar “auto” como tipo
e o C++ cuidará de resolver qual a melhor estrutura para suportar seus dados.
Naturalmente, essa é a pior coisa que você pode fazer em um programa “de verdade”, pois você perderá o controle “fino” da coisa, mas serve como método de aprendizado, como “training wheel”.
Auto não está funcionando! C++03 versus C++11 ou C++0x
Ok, quem for mais apressado e testar no DevC++ verá que não funciona.
Isso se dá porque o “auto” está habilitado a partir do chamado C++11 (ou programas que traziam suas inovações), que é uma nova formulação do C++, que surgiu no ano passado (aprovado pela ISO em 12 de agosto de 2011). Até então, o C++03 era o padrão.
O C++11 incorpora diversas bibliotecas acessórias ao “standart” do C++, excluindo, porém, as de expressões matemáticas complexas. Veja maiores informações aqui.
Como fazer o “Auto” funcionar?
Aqui, estou utilizando o Microsoft Visual Studio c++ 2010 versão express (a Microsoft libera o download gratuito aqui). Importante é lembrar-se de usar a versão “Win32 Console Aplication”: há diferentes versões de C++ no Visual Studio, sendo que a sintaxe muda de uma para a outra.
Script de teste (Visual C++ Express 2010)
Neste teste, introduzimos um novo comando: typeid(x).name()
O typeid(x) recebe a variável no X e mostra seu tipo.
#include <iostream> #include <conio .h> int main() { int a = 34; double b = 2; auto y = 9; std::cout < < "O tipo de A e: " << typeid(a).name() << std::endl; std::cout << "O tipo de B e: " << typeid(b).name() << std::endl; std::cout << "O tipo de (a*b) e: " << typeid(a*b).name() << std::endl; std::cout << "O tipo de y e: " << typeid(y).name() << std::endl; getch(); }
Programando em C++: Using Namespace STD ou Não? | Programação
Por Daniel Cardoso Tavares
Hoje, enquanto fazia um trabalho para a faculdade, acabei esbarrando em uma discussão sobre o uso ou não do comando using namespace std.
Os pontos de vista são basicamente os seguintes:
-
Um lado acredita que a programação fica mais fácil, rápida e simples sem ter que colocar std:: antes de cada pequeno comando, como cout.
-
O outro, acredita que não é uma boa prática de programação o uso do using namespace std (ou qualquer outro).
O lado dos “contra” (composto por programadores mais experientes) afirma que em grandes códigos muitas vezes namespaces diferentes acabam utilizando os mesmos comandos, o que pode fazer com que seu programa saia com bugs ou torne-se complexo demais para uma manutenção adequada.
Eles argumentam que a “preguiça” é rapidamente superada com a prática, que transforma o uso da namespace seguido por :: algo bem visto.
Nesta discussão, eu tendo a apoiar os “preguiçosos” primeiro, sendo minha prática cortar um grande caminho com os namespaces, mas tenho que admitir que os “contra” têm razão.
Vou começar, assim a tentar praticar a forma mais extensa da coisa.
Exemplo de código com “using namespace”
#include <iostream> using namespace std; int main() { cout < < "Olá mundo!" << endl; }
Exemplo de código sem o “using namespaces”
#include <iostream> int main() { std::cout < < "Olá mundo!" << std::endl; }

