TIPO DE DADOS BOOL E CLASSE STRING
Esta aula tratará sobre um tipo de dado que não está presente no C-ANSI, tendo sido adicionado no C++: O tipo bool.
Além disso, a classe string será formalmente apresentada, e algumas funções-membro da classe serão estudadas.
O
TIPO
BOOL
Durante as primeiras aulas observamos que no C-ANSI, todo valor diferente de zero era tratado como VERDADEIRO no programa, enquanto todo o valor igual a zero era tratado como FALSO. Porém, uma variável lógica não era definida.
No C++, entrementes, existe um tipo de dado especialmente definido para variáveis lógicas. Tal tipo é o tipo bool. Este tipo de dado é capaz de armazenar apenas dois valores
possíveis: VERDADEIRO ou FALSO (True ou False). Observe o Programa 1.
#include <iostream>
using namespace std;
int main(void) {
bool aux;
int a = 9, b = 7;
aux = true; //true é verdadeiro em inglês
if(aux) cout << "VERDADEIRO\n"; aux = (a < b);
if(aux) cout << "VERDADEIRO\n"; else cout << "FALSO\n";
system("PAUSE"); return 0;
}
Programa 1 O tipo bool.
As conversões de dados são aplicáveis da mesma maneira que no C-ANSI, i.e., valores diferentes de zero são convertidos para VERDADEIRO e valores iguais a zero são convertidos para FALSO.
Vale lembrar que, diferentemente de algumas linguagens, expressões booleanas ainda podem ser utilizadas em expressões não booleanas. Da mesma maneira que no C-ANSI, também, pode-se ter uma expressão que não retorna um valor bool em uma instrução de controle (como
em um if, e.g.). Estude o Programa 2.
#include <iostream>
using namespace std;
int main(void) {
int a = 9;
if(a = 8) cout << "OPA\n"; system("PAUSE");
return 0; }
A
CLASSE
STRING
Em C++, strings podem ser escritas e manipuladas da mesma maneira que em C-ANSI, i.e., através da manipulação de um vetor de caracteres. Porém, com o advento da orientação a objetos (e da utilização de classes), pode-se utilizar outro modo de manipular e operar com strings.
O C++ define uma classe string (que já utilizamos em alguns programas). Para utilizá-la basta incluir #include<string> ao programa.
Diferentemente das strings no C-ANSI, na classe string as strings não são terminadas, necessariamente, pelo caractere nulo. O modo como as funções-membro da classe são definidas depende da plataforma, complilador, IDE etc...
LENDO E IMPRIMINDO STRINGS
Observe o Programa 3 onde um objeto da classe string é instanciado e utilizado.
#include <iostream> #include <string>
using namespace std;
int main(void) {
string str1;
str1 = "Este e' um objeto string..."; cout << str1 << endl;
system("PAUSE"); return 0;
}
Programa 3 Utilizando a classe string.
No Programa 3, um objeto str1 da classe string é criado. Após, uma constante string é atribuída diretamente ao objeto str1. Lembre-se que uma atribuição direta deste tipo, utilizando uma string, não era possível em C-ANSI (uma construção semelhante empregando ponteiros poderia ser utilizada). Isto torna mais intuitiva a tarefa de se trabalhar com strings, como será visto mais adiante.
Os operadores >> e << conseguem manipular diretamente strings. Compile o Programa 4.
#include <iostream> #include <string>
using namespace std;
int main(void) {
string str1;
cout << "Digite uma string: "; cin >> str1;
cout << "A string digitada foi: " << str1 << endl; cout << "Digite uma string que contenha espacos: "; cin >> str1;
cout << "A string digitada foi: " << str1 << endl; system("PAUSE");
return 0; }
Como fora visto nas primeiras aulas sobre C++, o operador extração de fluxo >> delimita as
strings não somente no caractere ‘\n’, mas também no caractere espaço ou tabulação. Para
evitar esse “problema”, basta utilizar a função getline() como no Programa 5.
#include <iostream> #include <string> using namespace std;
int main(void) {
string str1;
cout << "Digite uma string: "; getline(cin,str1);
cout << "A string digitada foi: " << str1 << endl; cout << "Digite uma string que contenha espacos: "; getline(cin,str1);
cout << "A string digitada foi: " << str1 << endl; system("PAUSE");
return 0; }
Programa 5 Lendo um objeto string utilizando getline.
A função getline realiza a leitura do teclado (cin) de str1, porém o único caractere que
delimita a string é agora ‘\n’.
I
NICIALIZANDOO
BJETOS STRINGAssim como na maioria das classes,um construtor é disponibilizado para inicializar os objetos. No caso de strings, pode-se não inicializar as strings (como no Programa 5). Nesse caso, o construtor padrão é chamado. O construtor padrão inicializa a string como uma string vazia.
Pode-se, entretanto, utilizar mais dois modos de inicialização, como no Programa 6.
#include <iostream> #include <string> using namespace std;
int main(void) {
string str1; //cria uma string vazia
string str2("OLA..."); //cria uma string OLA...
string str3( 10 , 'R' ); //cria uma string com 10 letras R cout << "str1: " << str1 << endl;
cout << "str2: " << str2 << endl; cout << "str3: " << str3 << endl; system("PAUSE");
return 0; }
Programa 6 Inicialização de strings.
O comando string str2("OLA...") cria uma string e inicializa a mesma com a string
"OLA...". O comando string str3( 10 , 'R' ) cria uma string com dez caracteres, sendo
ATRIBUIÇÃO E CONCATENAÇÃO DE STRINGS
Objetos strings podem ser manipulados intuitivamente, além de possuírem uma infinidade de métodos. A atribuição em strings pode ser realizada como em qualquer variável, ou ainda utilizando métodos dedicados para o fim. Estude o Programa 7.
#include <iostream> #include <string> using namespace std;
int main(void) {
string str1;
string str2("OLA..."); string str3("MUNDO");
str1 = str3; //atribuição direta....
cout << "str1: " << str1 << endl;
str1.assign(str2); //atribuição utilizando método...
cout << "str1: " << str1 << endl; str2.assign("Modificando o conteudo"); cout << "str2: " << str2 << endl; system("PAUSE");
return 0; }
Programa 7 Atribuições em strings.
Observe que foi utilizado um método assign() da classe string para realizar a atribuição.
A concatenação de strings também pode ser realizada de vários modos. Observe atentamente o Programa 8:
#include <iostream> #include <string> using namespace std;
int main(void) {
string str1;
string str2("OLA..."); string str3("MUNDO");
str1 = str2 + str3; //concatenação direta.... cout << "str1: " << str1 << endl;
str1 += " Mais igual a isso"; //concatenação direta 2... cout << "str1: " << str1 << endl;
str1.append(str2); //concatenação utilizando método... cout << "str1: " << str1 << endl;
str3.append(" Adicionando texto..." + str2); cout << "str3: " << str3 << endl;
system("PAUSE"); return 0;
}
Programa 8 Concatenando strings.
No caso, a função append() concatena a string passada como parâmetro na string da qual
S
UBSTRINGSÉ possível obter apenas um pedaço de uma string utilizando a função membro substr().
Estude o Programa 9.
#include <iostream> #include <string> using namespace std;
int main(void) {
string str1("OLA, ESTAMOS AQUI"); string str2;
str2 = str1.substr(5); //obtém a substring do índice 5 até o final.
cout << str2 << endl;
str2 = str1.substr(5, 4); //obtém uma substring com 4 caracteres partindo do índice 5
cout << str2 << endl; system("PAUSE"); return 0;
}
Programa 9 substr().
COMPARANDO STRINGS
É possível verificar se uma string é igual a outra utilizando comparação direta, ou através
do uso da função-membro compare(). Analise e modifique o Programa 10 de modo a entender
como funcionam as relações lógicas
#include <iostream> #include <string> using namespace std;
int main(void) {
string str1("TESTE"); string str2("TESTE");
if(str1 == str2) cout << "IGUAL"; if(str1 > str2) cout << "MAIOR"; if(str1 < str2) cout << "MENOR"; cout << endl;
str1 = "OPA"; str2 = "OPB";
if(str1.compare(str2) < 0) cout << "String1 menor que string2" << endl; if(str1.compare(str2) == 0) cout << "String1 igual a string2" << endl; if(str1.compare(str2) > 0) cout << "String1 maior a string2" << endl; system("PAUSE");
return 0; }
Programa 10 Comparação de strings.
Perceba que a comparação > ou < (bem como >= e <=) avaliam não o tamanho (numero de caracteres) da string. Estas relações atuam de modo semelhante ao se ordenar em ordem alfabética as strings (seguindo a tabela ASCII), i.e., atuam lexicograficamente.