Aprenda C++

  • Página Inicial
  • Contato!
  • Tudo sobre C++ Parte 1!
  • Tudo sobre C++ Parte 2!
  • Tudo sobre C++ Parte 3!
  • Tudo sobre C++ Parte 4!
  • Tudo sobre C++ Parte 5!
  • Tudo sobre C++ Parte 6!
  • Tudo sobre C++ Parte 7!
  • Tudo sobre C++ Parte 8!
  • Tudo sobre C++ Parte 9!
  • Tudo sobre C++ Parte 10!
  • Tudo sobre C++ Parte 11!
  • Tudo sobre C++ Parte 12!
  • Tudo sobre C++ Parte 13!
  • Tudo sobre C++ Parte 14!
  • Tudo sobre C++ Parte 15!
  • Tudo sobre C++ Parte 16!
  • Tudo sobre C++ Parte 10

    Mais sobre Printf, Cout e Conversões

    Podemos usar também o printf para formatar dados de diversas formas também.

    Vamos vê um exemplo, no qual usamos uma variável float com o PI:

    
    #include <iostream>
    #include <cstdio> // Para printf
    #include <cmath> // Para a constante PI
    
    using namespace std;
    
    int main() {
        float pi = M_PI;
    
        printf("Valor de PI: %f", pi);
    
        return 0;
    }
    
    

    PS: Observe que o PI foi retirado de uma constante (M_PI) de uma biblioteca do próprio programa.

    Dessa forma, podemos usar a formatação do float, exibindo quantas casas decimais desejamos exibir, dessa forma:

    
    printf("Valor de PI: %.2f", pi);
    
    

    Para completar o número com zeros à esquerda, também é possível, veja um exemplo com int:

    
    #include <iostream>
    #include <cstdio> // Para printf
    
    using namespace std;
    
    int main() {
        int num = 5;
    
        printf("Valor de Num: %07d", num);
    
        return 0;
    }
    
    

    No caso acima, o 0 indica o caractere a completar as casas "vazias" (só funciona com 0), e o segundo número (no caso, 7), indica a quantidade de casas decimais (incluindo o número exibido). Da mesma forma funciona com o float.

    Existem inúmeras formatações para a maioria dos tipos de dados, usando números nas máscaras.

    Sobre o cout, podemos usar atributos para converter dados também, veja um exemplo onde convertemos números para hexadecimal:

    
    #include <iostream>
    #include <cstdio> // Para printf
    
    using namespace std;
    
    int main() {
        int num = 15;
    
        cout << "Valor de Num em decimal: " << num << endl;
        cout << "Valor de Num em hexadecimal: " << hex << num << endl;
        cout << "Valor de Num em octal: " << oct << num << endl;
    
        return 0;
    }
    
    

    No caso acima, bastou apenas colocar um atributo hex antes da variável para converter pra hexadecimal, e o oct para octal (se formos converter hexadecimal para decimal, usamos o dec).

    Mas para converter octais e hexadecimais, é melhor usarmos um método (importe iomanip):

    
    #include <iostream>
    #include <cstdio> // Para printf
    #include <iomanip> // Para setbase
    
    using namespace std;
    
    int main() {
        int num = 15;
    
        cout << "Valor de Num em decimal: " << num << endl;
        cout << "Valor de Num em hexadecimal: " << setbase(16) << num << endl;
        cout << "Valor de Num em octal: " << setbase(8) << num << endl;
    
    
        return 0;
    }
    
    

    No caso acima, apenas precisamos passar o parâmetro de números, no caso, seria 8 para octal e 16 para hexadecimal.

    Podemos também usar o precision para formatar casas decimais no cout, passando o número de casas pelo parâmetro, dessa forma:

    
    #include <iostream>
    #include <cstdio> // Para printf
    #include <cmath> // Para a constante PI
    
    using namespace std;
    
    int main() {
        float pi = M_PI;
    
        cout.precision(3);
    
        cout << "Valor de PI: " << pi << endl;
    
        return 0;
    }
    
    

    PS: O ponto também é contado no precision, para exibir duas casas usamos o número 3. Se quiser voltar ao número de casas padrão do cout, basta colocar o precision novamente, com o número -1.

    Podemos também usar o std::scientific para colocar os números em notação científica:

    
    #include <iostream>
    #include <cstdio> // Para printf
    #include <cmath> // Para a constante PI
    
    using namespace std;
    
    int main() {
        float pi = M_PI;
    
        cout << "Valor de PI: " << scientific << pi << endl;
    
        return 0;
    }
    
    

    Podemos usar também o setw para configurar a largura à esquerda (importe iomanip):

    
    #include <iostream>
    #include <iomanip> // Para setw
    
    using namespace std;
    
    int main() {
        int num = 30;
    
        cout << "Valor de num: " << setw(10) << num << endl;
    
        return 0;
    }
    
    

    E para escolhermos o caractere que preencherá esses espaços, usamos o setfill(), dessa forma:

    
    cout << "Valor de num: " << setw(10) << setfill('0') << num << endl;
    
    

    Para converter tipos em C++, podemos fazer assim:

    
    float real = 4.8;
    int num = (int)real;
    
    

    PS: Isso de colocar o tipo entre parênteses, é chamado de typecast, pode ser feito com qualquer tipo pra forçar uma conversão, mas só funciona quando é de tipos semelhantes (como forçar conversão de float para int, por exemplo).

    No caso de const char*, podemos usar a função atoi pra isso (importe cstdlib):

    
    const char* frase = "90";
    int novo = atoi(frase);
    
    

    Também podemos usar o strtol para converter const char* em int (em qualquer base numérica), dessa forma, sem necessitar de importação:

    
    const char* frase = "90";
    int novo = strtol(frase, NULL, 10); // O primeiro é a variável a ser convertida, o último número é a base numérica (no caso, a decimal)
    
    

    Para converter int em const char*, usamos o sprintf assim:

    
    int numero = 50;
    char texto[10];
    
    sprintf(texto, "%i", numero); // Sempre na ordem: Variável string a receber o valor, tipo de número convertido e o número.
    printf("%s\n", texto);
    
    

    PS: O sprintf também pode ser usado para concatenar variáveis de diferentes tipos numa variável só, por exemplo:

    
    int hora = 10;
    int minuto = 25;
        
    char relogio[100];
        
    sprintf(relogio, "A hora passada foi %.2d:%.2d.", hora, minuto);
    printf("%s\n", relogio);
    
    

    Vector

    Antes de mais nada, não confunda vector com vetor, sendo que esse último é apenas o array unidimensional. O vector é sim como um "vetor moderno", mas ele é bem diferente de um array unidimensional.

    Para criar um vector, importe a biblioteca vector e declare a classe com o tipo e a variável, dessa forma:

    
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main() {
        vector<int> num;
    
        return 0;
    }
    
    

    Podemos adicionar o número de elementos também, dessa forma:

    
    vector<int> num(5);
    
    

    Ou seja, podemos definir o número de elementos ou simplemente não indicá-los, no segundo caso ele alocará dinamicamente a memória para os elementos

    Para inserir elementos no final do vector, usamos o método push_back() (ou também emplace_back()), como visto abaixo:

    
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main() {
        vector<int> num;
        int tam;
        int i;
    
        num.push_back(10);
        num.push_back(2);
        num.push_back(5);
        num.push_back(8);
    
        tam = num.size();
    
        cout << "Tamanho do vector: " << tam << endl;
        
        for(i = 0; i < tam; i++) {
            cout << num[i] << endl;
        }
    
        return 0;
    }
    
    

    No caso acima, usamos o método size() para retornar o tamanho do vector.

    PS: Só podemos usar a sintaxe de array para exibir elementos de vector, para inserir dados dessa forma não funciona.

    Agora, vamos criar dois vectores, dessa forma:

    
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main() {
        vector<int> num1;
        vector<int> num2;
    
        int tam;
        int i;
    
        num1.push_back(1);
        num1.push_back(2);
        num1.push_back(3);
        num1.push_back(4);
    
        num2.push_back(5);
        num2.push_back(6);
        num2.push_back(7);
        num2.push_back(8);
    
        tam = num1.size();
    
        for(i = 0; i < tam; i++) {
            cout << num1[i] << endl;
        }
    
        cout << endl;
    
        for(i = 0; i < tam; i++) {
            cout << num2[i] << endl;
        }
    
        return 0;
    }
    
    

    Para trocar os valores de um vector para outro, usamos o elemento swap(), dessa forma:

    
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main() {
        vector<int> num1;
        vector<int> num2;
    
        int tam;
        int i;
    
        num1.push_back(1);
        num1.push_back(2);
        num1.push_back(3);
        num1.push_back(4);
    
        num2.push_back(5);
        num2.push_back(6);
        num2.push_back(7);
        num2.push_back(8);
    
        num1.swap(num2);
    
        tam = num1.size();
    
        for(i = 0; i < tam; i++) {
            cout << num1[i] << endl;
        }
    
        cout << endl;
    
        for(i = 0; i < tam; i++) {
            cout << num2[i] << endl;
        }
    
        return 0;
    }
    
    

    Pode ver que os elementos do vector num1 agora estão no num2 e vice-versa.

    Para exibirmos o primeiro e o último elemento do vector, usamos respectivamente, os métodos front() e back(), assim:

    
    cout << "Primeiro valor de num1: " << num1.front() << endl;
    cout << "Último valor de num1..: " << num1.back() << endl;
    
    

    Agora insira mais elementos no vector com o push_back() para ver que o último mudará.

    Para pegar um valor específico, como o do meio, usamos o método at(), com o tamanho dentro, dessa forma:

    
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main() {
        vector<int> num1;
        vector<int> num2;
    
        int tam;
        int i;
    
        num1.push_back(1);
        num1.push_back(2);
        num1.push_back(3);
        num1.push_back(4);
        num1.push_back(5);
    
        num2.push_back(6);
        num2.push_back(7);
        num2.push_back(8);
        num2.push_back(9);
        num2.push_back(10);
    
        cout << "Primeiro valor de num1: " << num1.front() << endl;
        cout << "Último valor de num1..: " << num1.back() << endl;
        cout << "Valor do meio.........: " << num1.at(num1.size() / 2) << endl;
    
        tam = num1.size();
    
        for(i = 0; i < tam; i++) {
            cout << num1[i] << endl;
        }
    
        cout << endl;
    
        for(i = 0; i < tam; i++) {
            cout << num2[i] << endl;
        }
    
        return 0;
    }
    
    

    Para inserir elementos no vector, usamos o método insert, indicando a posição (no caso, com begin para o início):

    
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main() {
        vector<int> num1;
        vector<int> num2;
    
        int tam1, tam2;
        int i;
    
        num1.push_back(1);
        num1.push_back(2);
        num1.push_back(3);
        num1.push_back(4);
        num1.push_back(5);
    
        num1.insert(num1.begin(), 888);
    
        num2.push_back(6);
        num2.push_back(7);
        num2.push_back(8);
        num2.push_back(9);
        num2.push_back(10);
    
        cout << "Primeiro valor de num1: " << num1.front() << endl;
        cout << "Último valor de num1..: " << num1.back() << endl;
        cout << "Valor do meio.........: " << num1.at(num1.size() / 2) << endl;
    
        tam1 = num1.size();
        tam2 = num2.size();
    
        for(i = 0; i < tam1; i++) {
            cout << num1[i] << endl;
        }
    
        cout << endl;
    
        for(i = 0; i < tam2; i++) {
            cout << num2[i] << endl;
        }
    
        return 0;
    }
    
    

    Para inserir na segunda posição, some 1 ao begin(), na terceira some 2, na quarta e assim por diante:

    
    num1.insert(num1.begin() + 1, 888);
    
    

    O end() insere na última posição, e pode ser usado para inserir na penúltima posição subtraindo 1, na antepenúltima subtraindo 2 e assim por diante:

    
    num1.insert(num1.end() - 2, 888);
    
    

    Para remover, usamos o método erase(), da mesma forma, assim:

    
    num1.erase(num1.end() - 1);
    
    

    Podemos também usar métodos como o pop_back() e o pop_front() para retirar elementos, veja um exemplo:

    
    while(!num1.empty()) {
        num1.pop_back();
    }
        
    cout << "Novo tamanho de num1: " << num1.size() << endl;
    
    num2.clear();
    
    

    Veja que o empty() verifica se o vector está vazio. Como visto acima, o clear() deleta todos os elementos, dispensando o uso de while para isso.

    Para ordenar um vector, podemos fazer assim:

    
    sort(num1.begin(), num1.end()); // Inclua algorithm
    
    

    E pra ordenar de ordem reversa, fazemos assim:

    
    sort(num1.begin(), num1.end()); // Inclua algorithm
    reverse(num1.begin(), num1.end());
    
    

    PS: Podemos usar o "for it" em vector e outros containers, por exemplo:

    
    for(int n: num1) {
        cout << n << endl;
    }
    
    

    Para verificar se um item existe num vector, use o método find de std, assim:

    
    vector<int> num;
    
    num.push_back(0);
    num.push_back(1);
    
    int item = 1;
    
    if(find(num.begin(), num.end(), item) != num.end()) { // No lugar do item, coloque o item que você deseja verificar, inclua algorithm
        cout << "O número " << item << " está no vector!" << endl;
    }
    else {
        cout << "Número " << item << " não encontrado!" << endl;
    }
    
    

    PS: O método acima também funciona com listas.