Share your repls and programming experiences

← Back to all posts
Atividade 4 - Omar
OmarGhoche (2)

Q1: Anos bissextos ----------------------------------------------------

Devido a um bug dos anos do calendário Gregoriano a cada 100 anos, a gente pula um ano bissexto se esse ano não for divisível por 400! Então, por exemplo, os anos: 1700, 1800 e 1900 não foram anos bissextos e os anos: 2100, 2200 e 2300 não serão bissextos!!

Aqui a explicação: http://mathandmultimedia.com/2012/03/08/the-mathematics-of-leap-years-explained/

Aqui a lógica utilizada:

using System;

class Bissexto {
  public static void Main () {

    Console.WriteLine("Digite um ano YYYY a partir de 1001:");
    
    int ano = int.Parse(Console.ReadLine());

    // Enquanto o usuário não digitar um valor >= 1001,
    // O programa vai ficar no while-loop
    while (ano < 1001) {
      Console.WriteLine("Ano inválido! Tente novamente:");
      ano = int.Parse(Console.ReadLine());
    }

    // Para imprimir uma mensagem mais coerente,
    // verifica se o `ano` digitado é atual, passado ou futuro,
    // dependendo do caso, modifica o verbo `ser`
    int currentYear = DateTime.Now.Year;
    string ser;
  
    if (ano < currentYear) {
      ser = "FOI";
    } else if (ano > currentYear) {
      ser = "SERÁ";
    } else {
      ser = "É";
    }

    // para facilitar a impressão
    string sim = $"\nO ano de {ano} {ser} ano bissexto! :-)\n";
    string nao = $"\nO ano de {ano} NÃO {ser} bissexto! :-(\n";

    //Devido a um bug dos anos que ocorre a cada 100 anos,
    // Eu adaptei o código seguindo a lógica desse link:
    // http://mathandmultimedia.com/2012/03/08/the-mathematics-of-leap-years-explained/

    if (ano % 400 == 0)||(ano % 4 == 0 && ano % 100 != 0) {
      Console.WriteLine(sim);
    } else {
      Console.WriteLine(nao);
    }
  }
}

Q2: Triângulo ----------------------------------------------------

using System;

class Triangle {
  public static void Main () {

    // Apenas para ficar mais legível!
    Console.WriteLine("\n Δ Programa Δ para desenhar Δ TRIÂNGULOS Δ\n");
    Console.WriteLine("Digite 3 números para os lados do triângulo");

    // Lê os 3 valores do usuário
    float a = float.Parse(Console.ReadLine());
    float b = float.Parse(Console.ReadLine());
    float c = float.Parse(Console.ReadLine());

    // Condições para a existência de um triângulo 
    bool c1 = (Math.Abs(b - c) < a) &&  (a < b + c);
    bool c2 = (Math.Abs(a - c) < b) && (b < a + c);
    bool c3 = (Math.Abs(a - b) < c) && (c < a + b);

    if (c1 && c2 && c3) {

      // Para utilizar depois na impressão
      string valores = $"valores a = {a}, b = {b} e c = {c}";

      string tipo;

      // dependendo dos valores de `a`, `b` e `c`,
      // o tipo do triângulo muda!
      if (a == b && b == c) {
        tipo = "EQUILÁTERO";
      } else if (a != b && b != c && a != c) {
        tipo = "ESCALENO";
      } else {
        tipo = "ISÓSCELES";
      }

      Console.WriteLine($"\nOs {valores} PODEM FORMAR um triângulo {tipo}!\n");

    } else {

      Console.WriteLine($"\nOs {valores} NÃO PODEM FORMAR um triângulo :-(\n");
    }

  }
}

Q3: mdc com WHILE loop ------------------------------------------------

using System;

class MDC {
  public static void Main () {

    Console.WriteLine("\nVamos descobrir o m.d.c* de dois números!");
    Console.WriteLine("*máximo divisor comum\n");

    Console.WriteLine("Digite dois números inteiros:");
    int num1 = int.Parse(Console.ReadLine());
    int num2 = int.Parse(Console.ReadLine());

    // para arrumar os valores a serem imprimidos no final
    int a, b;
    if (num1 < num2) {
      a = num1;
      b = num2;
    } else {
      a = num2;
      b = num1;
    }

    // apenas para inicializar `mdc`
    int mdc = 1;

    // enquanto mdc != 0, ou seja, enquanto o resultado,
    // do modulo for diferente de zero, o loop continua!
    while (mdc != 0) {
      // pelo metodo das Divisões Sucessivas
      mdc = num1 % num2;
      // pelo design do algoritmo, acaba que `num1` fica,
      // com o valor final de m.d.c - que no final é impresso!
      num1 = num2;
      num2 = mdc;
    }

    Console.WriteLine($"\nm.d.c.({a}, {b}) = {num1}\n");
  }
}

Q4: mdc com DO-WHILE loop ---------------------------------------------

using System;

class mdcDoWhile {
  public static void Main () {

    Console.WriteLine("\nVamos descobrir o m.d.c* de dois números!");
    Console.WriteLine("*máximo divisor comum\n");

    Console.WriteLine("Digite dois números inteiros:");
    int num1 = int.Parse(Console.ReadLine());
    int num2 = int.Parse(Console.ReadLine());

    // para arrumar os valores a serem imprimidos no final
    int a, b;
    if (num1 < num2) {
      a = num1;
      b = num2;
    } else {
      a = num2;
      b = num1;
    }

    // apenas para inicializar `mdc`
    int mdc = 1;

    // para o meu design de algoritmo, acho que,
    // o DO-WHILE loop resultou em mesmo desempenho e
    // linhas de código, mas é mais legível!!
    do {
      mdc = num1 % num2;
      num1 = num2;
      num2 = mdc;
    } while (mdc != 0);

    Console.WriteLine($"\nm.d.c.({a}, {b}) = {num1}\n");
  }
}

Para testar os códigos basta usar o repl.it abaixo, mas ao invéz de clicar em ▶ play, use o comando mono pasta/arquivo.exe por exemplo - > mono Q1\:\ Anos\ Bissextos/bissexto.exe para executar o programa bissexto.exe