Exemplo C++ – Comparar duas datas que se encontram armazenadas numa estrutura

 

#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
using namespace std;
struct mydata
{
    int ano, mes, dia;
    string aaaammdd;
};
int main()
{
    mydata d1, d2;
    ostringstream c1, c2;

    //Definir a primeira data
    d1.ano = 1970;
    d1.mes = 1;
    d1.dia = 9;
    c1 << fixed << setfill('0') << setw(4) << d1.ano << setw(2) << d1.mes << setw(2) << d1.dia;
    d1.aaaammdd = c1.str();
    cout << d1.aaaammdd << endl;

    //Definir a segunda data
    d2.ano = 2015;
    d2.mes = 10;
    d2.dia = 12;
    c2.clear();
    c2 << fixed << setfill('0') << setw(4) << d2.ano << setw(2) << d2.mes << setw(2) << d2.dia;
    d2.aaaammdd = c2.str();
    cout << d2.aaaammdd << endl;

    // Comparar as datas = comparar inteiros :)
    if(d1.aaaammdd < d2.aaaammdd)
        cout << d1.aaaammdd;
    else
        cout << d2.aaaammdd;
    cout << endl;

    return 0;
}

 

Como recuperar todas as mensagens enviadas “acidentalmente” para a pasta lixo(trash) do GMAIL?

A história é muito simples.
Estava a brincar aos filtros no GMail e enviei 12736 mensagens para o lixo!
Numa primeira abordagem, pensei que tinha que selecionar página a página, o que ao 50 de cada vez, me iria durar a noite toda!
E foi aí que reparei …

gmailRecoverFromTrash
Quando selecionamos todas as mensagens e da página visível (ver 1), surge a opção para selecionar todas (ver 2).
Uff … desta vez safei-me :)

Dicas sobre manilupação de “strings” em C++ com base na classe “string”

Atenção!

Este artigo não pretende ser exaustivo quanto ao assunto em análise, ou seja, a manipulação de strings tendo como base os objetos da classe string.

Trata-se apenas de um conjunto de dicas muito simples para quem quer fazer um consulta rápida e seguir viagem …

Recomendo a consulta de http://www.cplusplus.com/reference/string/string/

Vou passar diretamente para os exemplos.

#1 – Declaração e leitura de strings

Neste exemplo vou declarar 3 strings e proceder à respetiva inicialização de várias formas distintas.

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s1;
    string s2("Hello String 2!");
    string s3 = "Hello String 3!";
    string s4( 1, 'z');
    cin >> s1;
    cout << s1 << endl << s2 << endl << s3 << endl << s4 << endl;
    return 0;
}

Continue reading “Dicas sobre manilupação de “strings” em C++ com base na classe “string””

2014 in review

The WordPress.com stats helper monkeys prepared a 2014 annual report for this blog.

Here’s an excerpt:

The Louvre Museum has 8.5 million visitors per year. This blog was viewed about 87,000 times in 2014. If it were an exhibit at the Louvre Museum, it would take about 4 days for that many people to see it.

Click here to see the complete report.

Morcela com Ananás

Não é bem “Morcela com Ananás”, pois um dos ingredientes não mencionado faz a diferença.

Refiro-me às folhinhas de coentros, que para além do verde, dão uma acabamento delicioso a este trio.

Fruto do acaso, acabei com uma morcela nas mãos e, saltando os comentários mal intencionados que vos possam ter atravessado a mente, não sabia muito bem o que lhe fazer.

Nestas alturas, o Google está para o informático, tal com o bacalhau está para a cozinha Portuguesa, tal é o seu estatuto de fiel amigo.

Depois de iniciada a pesquisa, o mais difícil é escolher, e eu acabei por selecionar esta receita do Chefe João Pronto: http://lifestyle.sapo.pt/sabores/receitas/morcela-com-ananas?r=sabores.sapo.pt

Desde já aviso que é delicioso!

Enquanto faço a digestão, aproveito para deixar a recomendação.

morcelaComAnanasECoentros

Exemplo C++ – Validar o tipo de dados recebido via cin

Quando estamos a escrever pequenos programas, que utilizam o objeto cin para fazer a leitura de valores, é frequente depararmos com situações deste tipo:

#include <iostream>
using namespace std;
int main()
{
    int nota;
    cin >> nota;
    if(nota<0 || nota>20)
        cout << "Inseriu uma nota inválida" << endl;
    else
        if(nota<10)
            cout << "O aluno foi reprovado" << endl;
        else
            cout << "O aluno foi aprovado" << endl;
    return 0;
}

Se repararem, o programa funciona muito bem se o utilizador for “educadinho”, ou seja, se fornecer apenas números inteiros.

No caso de este ser distraído, ou malandreco, em vez de um número inteiro, os resultados podem ser imprevisíveis. Experimentem e vejam o que acontece para os seguintes exemplos de input:

  • t
  • Z
  • x

Pois é! Todos reprovados, mesmo sem se saber a nota. Nem uma satisfação!

Uma forma muito simples de contornar esta limitação é a seguinte:

#include <iostream>
using namespace std;
int main()
{
    int nota;
    if(!(cin >> nota) || nota<0 || nota>20)
        cout << "Inseriu uma nota inválida" << endl;
    else
        if(nota<10)
            cout << "O aluno foi reprovado" << endl;
        else
            cout << "O aluno foi aprovado" << endl;
    return 0;
}

Atendendo a que nota é uma variável do tipo int, cin >> nota irá devolver o valor lógico falso caso não receba um número inteiro (int).

Assim sendo, basta adicionais mais uma condição ao nosso if!

Construção de algoritmos em Pseudocódigo – enquanto … fazer … fimfazer

Trata-se de uma estrutura de repetição, controlada pela avaliação do valor lógico de uma condição.

Este tipo de estruturas são geralmente designadas por “ciclos“.

enquanto &lt;condição&gt;
fazer
    instrução 1
    instrução 2
    . . .
    instrução n
fimfazer

Assim temos:

  • <condição> é uma expressão lógica que, sendo verdadeira, determina que se voltem a executar as instruções contidas no ciclo. Caso esta expressão tenha o valor lógico falso, o controlo passa para a instução seguinte, sendo o ciclo abandonado.
  • instrução 1 … instrução n  corresponde ao bloco de instruções que vão ser executados em cada iteração (entenda-se iteração como uma “volta”, tendo presente a noção de cliclo).

Este tipo de estrutura tem infinitas aplicações mas, em termos genéricos, podemos afirmar que se utiliza sempre que:

  • pretendermos repetir 0 bloco de instruções um número indeterminado de vezes;
  • o número de iterações, ou seja, o número de vezes que se repete o ciclo, depende do valor lógico da candição;
  • fazendo variar os valores das variáveis que são utilizadas na condição permite controlar o respetivo valor lógico, consequentemente, continuar a iterar ou terminar.

Vamos pensar, a título de exemplo, no seguinte problema:

“Dada uma sequência de números, terminada por um número negativo, calcular a média dos seus elementos.”

Algoritmo em pseudocódigo

Nome MédiaN
Descrição
    Dada uma sequência de números, cujo fim é assinalado por um número
    negativo, este algoritmo calcula a respetiva média.
Variáveis
    contar: Inteiros
    num, soma, média: Real
Início
    contar ← 0
    soma ← 0
    ler (num)
    enquanto ( num >= 0 )
    fazer
        contar ← contar + 1
        soma ← soma + num
        ler (num)
    fimfazer
    média ← soma / contar
    escrever (média)
fim

Seguem-se uma implementação deste problema.

Em linguagem C++

#include <iostream>
using namespace std;
int main()
{
    int contar;
    double num, soma, media;
    contar = 0;
    soma = 0;
    cin >> num;
    while(num >=0)
    {
        contar = contar + 1;
        soma = soma + num;
        cin >> num;
    }
    media = soma/contar;
    cout << media;
    return 0;
}
Anterior Índice Seguinte

Construção de algoritmos em Pseudocódigo – selecionar caso … fimselecionar

Depois de alguns exercício a aplicar a estrutura se… então… senão… fimse, provavelmente acabamos por concluir que, em certos casos específicos, não é muito prática a sua utilização.

Vamos pensar, a título de exemplo, no seguinte problema:

“Dado um número inteiro, compreendido entre 1 e 4, representando os quatro trimestres do ano, vamos fazer corresponder a sua descrição por extenso.”

Algoritmo em pseudocódigo

Nome Trimestres
Descrição
    Dado um número inteiro, compreendido entre 1 e 4, representando
    os quatro trimestres do ano, este programa faz corresponder a
    sua descrição por extenso.
Variáveis
    trimestre: Inteiro
Início
    ler (trimestre)
    se trimestre = 1
    então   escrever("Primeiro trimestre")
    senão   se trimestre = 2
            então   escrever("Segundo trimestre")
            senão   se trimestre = 3
                    então   escrever("Terceiro trimestre")
                    senão   se trimestre = 4
                            então   escrever("Quarto trimestre")
                            senão   escrever("ERRO!")
                            fimse
                    fimse
            fimse
    fimse
fim

Neste ponto já somos convidados a pensar como ficaria esta estrutura encadeada para outros exemplos como:

  • os dias da semana;
  • os meses do ano;
  • os signos;

Continue reading “Construção de algoritmos em Pseudocódigo – selecionar caso … fimselecionar”

Construção de algoritmos em Pseudocódigo – se… então… senão… fimse

Vamos avançar para a utilização de estruturas de decisão.

Em primeiro lugar vamos abordar a estrutura se… então… senão… fimse.

Para o efeito vamos considerar o problema seguinte:

“Dado um número inteiro, verificar se este é par ou ímpar.”

Algoritmo em pseudocódigo

Nome ParOuImpar
Descrição
    Dado um número inteiro, este algoritmo permite verificar se é par ou ímpar.
Variáveis
    nr: Inteiro
Início
    ler (nr)
    se nr % 2 = 0
    então   escrever (&amp;quot;O número é par.&amp;quot;)
    senão   escrever (&amp;quot;O número é ímpar&amp;quot;)
    fimse
Fim

Para saber se o número é par, utilizeio o operador %, conforme expliquei aqui, embora já numa abordagem em linguagem C++. Continue reading “Construção de algoritmos em Pseudocódigo – se… então… senão… fimse”