Mandar um cafézinho para o programador:


Me ajude a transformar café em código!
Mostrando postagens com marcador ||. Mostrar todas as postagens
Mostrando postagens com marcador ||. Mostrar todas as postagens

Ano bissexto em C++

Vamos usar nossos conhecimentos de operadores lógicos para aprender como detectar se um ano é bissexto ou não.

Como verificar se um ano é bissexto em C++

Anos bissextos

Normalmente, o ano tem 365 dias.
Na verdade, é um valor quebrado, são 365 dias e 6h ou 365,25 dias...mas ia ser estranho um dia com menos de 24 horas, ia ser confuso.

Então, pra compensar essas partes quebradas de dia, vez e outra temos um ano com 366 dias, que é a data 29 de fevereiro.

E eles ocorrem a cada 4 anos, menos nos múltiplos de 100 que não são múltiplos de 400.
Ou seja, ele também é bissexto ser for múltiplo de 400.

Calma, respira fundo, leia de novo...é um pouco confuso mesmo no começo.
Dê uma estudada sobre a história dos anos bissextos, calendários etc, pra relaxar um pouco:
https://pt.wikipedia.org/wiki/Ano_bissexto

Basicamente, de 4 em 4 anos temos anos bissextos:
1996, 2000, 2004, 2008, 2012, 2016, 2020, 2024, 2028, 2032, 2036...

De 100 em 100 anos não temos ano bissexto...:
100, 200, 300 ... não são bissextos

... exceto se forem múltiplos de 400:
400, 800, 1200, 1600... são bissextos

Assim:
...
400 – é bissexto
500 – não é bissexto
600 – não é bissexto
700 – não é bissexto
800 – é bissexto
...
1200 – é bissexto
1300 – não é bissexto
1400 – não é bissexto
1500 – não é bissexto
1600 – é bissexto
1700 – não é bissexto
1800 – não é bissexto
1900 – não é bissexto
2000 – é bissexto
2100 – não é bissexto
2200 – não é bissexto
2300 – não é bissexto
2400 – é bissexto
...

Ano bissexto em C++

Ok, vamos colocar isso em prática, criando código C++.
Um problema difícil nada mais é que vários problemas fáceis.

Então vamos quebrar esse algoritmo em um menor, mais simples.
Primeiro, vamos verificar os anos múltiplos de 400. Se for múltiplo de 400, já era, é só sucesso, é bissexto e acabou:

E como verifica isso? Simples:

  • if (year % 400 == 0)


Prontinho. Só dizer que é bissexto.
E se não for? Bom, aí cai no else

Agora vem a parte do 4 anos...a cada 100 anos...um rolo só.
Bom, é assim, precisamos verificar duas coisas:
  • Se é múltiplo de 4 (ocorre a cada 4 anos, a partir do ano 0: 4, 8, 12, ... 1996, 2000)
  • Se não é múltiplo de 100

Fazendo isso em C++:
  • Múltiplo de 4: (year % 4 == 0)
  • Não é múltiplo de 100: (year % 100 != 0)
Unindo os dois, temos o próximo IF (dentro do else), usando o operador lógico AND &&:
  • (year % 4 == 0) && (year % 100 != 0)
Assim, nosso código fica:
#include <iostream>
using namespace std;

int main()
{
    int year;

    cout <<"Ano: ";
    cin >> year;


    if(year % 400 == 0)
        cout << "É bissexto" << endl;
    else
        if( (year % 4 == 0) && (year % 100 != 0) )
            cout << "É bissexto" << endl;
        else
            cout << "Não é bissexto" << endl;


    return 0;
}

Algoritmo do ano bissexto em C++

Programador gosta de escrever pouco.
Quanto mais simples e direto for o código, melhor.

Note no código anterior que temos duas condições para o ano ser bissexto:
  1. (year % 400 == 0)
  2. ( (year % 4 == 0) && (year % 100 != 0) )

Se acontecer uma coisa ou outra, é bissexto.
Ou...huumm...ou lembra o que? Operador lógico ||

Ou seja, podemos unir as duas condições e ter somente um teste condicional IF:
(year % 400 == 0) || ( (year % 4 == 0) && (year % 100 != 0) )

Nosso código fica assim então:
#include <iostream>
using namespace std;

int main()
{
    int year;

    cout <<"Ano: ";
    cin >> year;


    if( (year % 400 == 0) || ( (year % 4 == 0) && (year % 100 != 0) ) )
        cout << "É bissexto" << endl;
    else
        cout << "Não é bissexto" << endl;


    return 0;
}
Bonito, hein?

Operadores Lógicos em C++: AND (&&), OR (||) e NOT (!)

Baixar a apostila C++ Progressivo
Neste tutorial de nosso curso de C++, vamos aprender mais três operadores, chamados operadores lógicos, que nos permitirão fazer testes mais complexos e interessantes. São eles:

  • && - AND ou E
  • || - OR ou OU
  • ! - NOT ou de negação


Operador Lógico AND: &&

O operador && serve para unir duas expressões lógicas em uma só, assim:

  • expressão1 && expressão2
O resultado dessa expressão é verdade somente se a expressão1 E a expressão2 forem verdadeiras.
Se qualquer uma delas for falsa, a expressão geral se torna falsa também.

A tabela verdade do operador && é:
Tabela verdade do operador lógico &&

Por exemplo, para você doar sangue, precisa ser de duas condições:
Ser maior de idade
Não ter doenças

Ou seja, pra dor você precisa ser maior E TAMBÉM não ter doenças:
  • maioridade && não ter doenças

Se qualquer uma dessas condições não for satisfeita (for false), você não pode doar sangue.
Vamos refazer o programinha que diz se é obrigatório você votar ou não.

Para ser obrigatório, deve satisfazer duas condições:
Ter 18 anos ou mais
Ter menos de 65 anos

Ou seja, precisa ter 18 anos E (AND) precisa ter menos de 65 anos.
Nosso código C++ fica assim:

#include <iostream>
using namespace std;

int main()
{
    int age;

    cout <<"Sua idade: ";
    cin >> age;


    if( age>=18 && age<65 )
        cout << "Obrigatório votar.";
    else
        cout << "Voto facultativo";


    return 0;
}

Veja que ficou bem mais enxuto, pois fizemos dois testes condicionais de uma vez só dentro do IF.
Se a pessoa tiver menos de 18 anos, a primeira expressão vai dar falsa e o teste inteiro se torna falso, indo pro ELSE.
Se ela tiver 65 ou mais, a segunda expressão já se torna falsa, deixando o resultado do IF falso também, indo pro ELSE.
Em ambos casos, o voto é facultativo.


Operador Lógico OR: ||

O operador lógico || (OU) une duas expressões assim:
expressão1 || expressão2

Ele retorna verdadeiro se qualquer uma das expressões forem verdadeiras.
Ou seja, só retorna falso se ambas forem falso. Confira a tabela verdade deste operador:

Curso de C++

Por exemplo, se numa rodovia a velocidade máxima é de 80 km/h, andar acima disso e abaixo da metade (40 km/h) dá multa. Vamos testar:

  • velocidade > 80 || velocidade < 40


Ou seja: se a velocidade for maior que 80 km/h OU for abaixo de 40 km/h, o motorista vai levar uma multa. Se alguma das expressões for verdadeira, o teste inteiro é verdadeiro.

Veja um programa que recebe a velocidade de um carro e diz se vai gerar multa ou não:
#include <iostream>
using namespace std;

int main()
{
    int speed;

    cout <<"Velocidade: ";
    cin >> speed;


    if( speed>80 || speed<40 )
        cout << "Vai levar multa.";
    else
        cout << "Tudo ok.";


    return 0;
}
O IF detecta se você vai levar multa, ou seja, pra não levar precisa cair no ELSE, e só cai no ELSE se ambas as expressões forem falsas, logo, você não está nem acima de 80 nem está abaixo de 40, logo está entre 40 e 80, que é o correto. Sacou ? OU uma coisa OU outra.

Operador Lógico NOT: !

Por fim, temos o operador de negação.
Ele transforma o que é falso em verdadeiro, e o que é verdadeiro em falso.

Veja a tabela verdade dele:
Operador de negação !
Ou seja:
!true é o mesmo que false
!false é o mesmo que true

Refazendo o primeiro código:
#include <iostream>
using namespace std;

int main()
{
    int age;

    cout <<"Sua idade: ";
    cin >> age;


    if( !(age>=18 && age<65) )
        cout << "Voto facultativo.";
    else
        cout << "Obrigatório votar";


    return 0;
}
Refazendo o segundo código:
#include <iostream>
using namespace std;

int main()
{
    int speed;

    cout <<"Velocidade: ";
    cin >> speed;


    if( !(speed>80 || speed<40) )
        cout << "Tudo ok.";
    else
        cout << "Vai levar multa.";


    return 0;
}
Pode parecer mais complicado ou a mesma coisa, de fato é a mesma coisa, mas muitas vezes vai ser mais lógico e vai fazer mais sentido usar o operador NOT em alguns testes condicionais. Veremos isso algumas vezes, no decorrer de nosso curso de C++.

A precedência de operadores entre eles é, de cima pra baixo:
!
&&
||

Exercício de Operadores Lógicos

No tutorial passado, sobre IF e ELSEs aninhados, propusemos uma questão sobre converter uma nota numérica em A, B, C... mas tem um bug ali.

E se o usuário digitar menos que 0 ou mais que 10?
É um erro. Ajeite o programa usando o operador lógico || para caso digitem notas abaixo de 0 ou acima de 10.

Ajude o C++ Progressivo

Que tal apoiar e fazer crescer o ensino da programação no Brasil ?

Ajudar nosso país a crescer e se desenvolver cada vez mais, tecnologicamente?

Clica abaixo pra saber mais!

Apoiar o Projeto Progressivo