image

Acesse bootcamps ilimitados e +650 cursos pra sempre

60
%OFF
Article image
Clodoaldo Souza
Clodoaldo Souza08/07/2024 22:38
Compartilhe
Microsoft Certification Challenge #3 DP-100Recomendados para vocêMicrosoft Certification Challenge #3 DP-100

Dicas para resolver os desafios de códigos

  • #Lógica de Programação

Tenho notado que muitos colegas estão solicitando ajuda em desafios de código e que ao analisar o código, percebo que alguns detalhes poderão ser aprimorados:

Antes de mais nada, leia e entenda o enunciado. Além disso tente entender o código, geralmente os comentários te darão algumas dicas.

Assista primeiro à este curso : ⛓️‍💥Desafios de Código - Seja Protagonista Neste Bootcamp.

1 - Exemplos de entrada:

  • Os dados de entrada são imputados automaticamente, conforme cada linguagem de programação. Exceto naqueles casos onde só há verificações fixas de dados. As entradas podem ser feitas em Python pelo input(), Javascript pelo gets(), Java pelo Scanner, etc...
  • Os exemplos de entrada são apenas utilizados para o entendimento do fluxo na qual o seu código deveria se comportar. A não ser que seja especificada a sua utilização no enunciado.
  • Evite alterar o código inserindo os valores de entrada dos exemplos como valores mágicos. Você deve escrever um único código que processe corretamente todos os dados do exemplo e outros dados possíveis!
  • No código, geralmente tem um comentário TODO, que diz o que se deve fazer nas linhas abaixo.
  • Não alterar os métodos de leitura de entrada, deixe-os como estão (get(), input(), cin(), etc...). Geralmente o que mais se vê de errado é o aluno adicionar uma mensagem como parâmetro, por exemplo : input("Digite um valor"), gets("Digite a nota"), etc...

2 - Saída Conforme o Enunciado:

  • Certifique-se de imprimir as mensagens de saída exatamente como solicitado no enunciado.
  • Evite inserir mensagens desnecessárias, pois elas afetarão os resultados dos testes. Exemplos: print("Digite o valor do saque : "), console.log('Escolha uma opcao : '), input("Digite seu nome : "), System.out.println("Digite o valor inicial : "), Console.WriteLine("Digite uma palavra : "), etc...
  • Quando seu código falhar, verifique os testes abertos e veja o compare a Saídas Esperada com a Sua Saída.
  • Não invente mensagens de validação que não estejam no enunciado do desafio.

3 - Quebra de Linha:

  • Use a quebra de linha (como \n ou %n) apenas quando especificado no problema.
  • Não adicione quebras de linha extras sem necessidade.

4 - Sintaxe e Fechamento:

  • Lembre-se de fechar chaves, parênteses e usar ponto e vírgula no final das linhas (dependendo da linguagem).
  • Se estiver resolvendo em Python, lembre-se de realizar a indentação correta.
  • Uma sintaxe correta é fundamental para o funcionamento correto do código.

5 - Acentuação e Formatação:

  • Utilize acentos corretamente quando necessário e apenas nas mensagens que serãoimpressas, nunca no nome da variável.
  • Verifique se não criou variáveis com acentos, ou que tenha esquecido de algum caractere.
  • Certifique-se de usar as variáveis corretamente, exemplo, declarar a variável A e não usar.
  • Adicione espaços entre as palavras e use maiúsculas e minúsculas adequadamente conforme o enunciado.
  • O caractere A (decimal 65) é diferente de a(decimal 97), por exemplo, Então se o enunciado espera pela primeira letra em maiúsculo, se enviar minúsculo, vai estar errado. Exemplo: "Ímpar" é diferente de "Impar".

6 - Foco na Lógica:

  • Concentre-se na lógica do problema e deixe a saída o mais limpa possível.
  • Não é necessário reinventar a roda! Altere apenas onde o código de template está indicando, geralmente tem um comentário com "TODO: ", com as anotações do que deveria se fazer naquela região.
  • Não use IA para resolver os desafios pra você. Use a sua capacidade de raciocínio. Ainda mais para quem está aprendendo.
  • Não pule processos e faça todas as aulas em sequência correta. Por exemplo assistir as aulas no x2 para simplesmente adquirir os certificados.

Como funcionam os testes.

A linguagem de programação usada é o Java, mas não se importe com isso, isso vale para Python, C++, Rust, Javascript, etc..., o que importa é que existe um processo de validação de entradas e saídas e que você deverá ter em mente como resolver os desafios.

Uma forma de entendimento é, conforme a classe de Teste Unitário com JUnit, onde temos um exemplo em Java de um desafio chamado 1 - Registro de Transações Bancárias que faz parte do ⛓️‍💥Curso de Desenvolvimento Java com IA onde está na categoria Dominando Desafios de Códigos Intermediários em Java:

Figura com os dados de entrada e a exibição da saída dos dados processados.

image

Figura com os exemplos de entradas e saídas (durante a escrita de seu código, não se preocupe com as entradas, elas são automatizadas).

Abaixo temos o código fonte padrão (template) do desafio:

01 import java.util.ArrayList;
02 import java.util.List;
03 import java.util.Scanner;
04 
05 public class RegistroTransacoesBancarias {
06    public static void main(String[] args) {
07        Scanner scanner = new Scanner(System.in);
08        // Lê a Entrada que informa o saldo inicial da conta
09        double saldo = scanner.nextDouble();
10        // Lê a Entrada com a quantidade total de transações
11        int quantidadeTransacoes = scanner.nextInt();
12        // Lista para armazenar as transações
13        List<String> transacoes = new ArrayList<>();
14        // Loop para iterar sobre as transações
15        for (int i = 1; i <= quantidadeTransacoes; i++) {
16            // Lê a Entrada com o tipo de transação (D para depósito ou S para saque)
17            // O método "toUpperCase" padroniza o tipo de transação com a letra maiúscula
18            char tipoTransacao = scanner.next().toUpperCase().charAt(0);
19            // Lê a Entrada com o valor da transação
20            double valorTransacao = scanner.nextDouble();
21            // Atualiza o saldo da conta e adicionar a transação à lista
22            if (tipoTransacao == 'D') {
23                saldo += valorTransacao;
24                transacoes.add("Deposito de " + valorTransacao);
25            } else if (tipoTransacao == 'S') {
26                saldo -= valorTransacao;
27                transacoes.add("Saque de " + valorTransacao);
28            } else {
29                System.out.println("Opção inválida. Utilize D para depósito ou S para saque.");
30                i--; // Decrementa o índice para repetir a iteração
31            }
32        }
33        // TODO: Exibir o saldo final e a lista de transações conforme a tabela de Exemplos.
34
35
36        // Fechar o scanner para evitar vazamentos de recursos
37        scanner.close();
38    }
39 }
40

Então devemos simplesmente adicionar o que o desafio está solicitando, neste caso, logo abaixo de TODO, que neste caso é a linha 33:

33        // TODO: Exibir o saldo final e a lista de transações conforme a tabela de Exemplos.
34        System.out.printf("Saldo: %.1f%n", saldo);
35        System.out.println("Transacoes:");
36        transacoes.stream()
37                .map(transacao -> {
38                    int sequencia = transacoes.indexOf(transacao) + 1;
39                    return sequencia + ". " + transacao;
40                })
41                .forEach(System.out::println);
42        // Fechar o scanner para evitar vazamentos de recursos
43        scanner.close();
44    }
45 }
46

Acima temos o código resolvido. Realizado apenas as inclusões onde haviam os comentários com "TODO".

A resolução deste desafio se deu após a linha 33 e foram adicionadas algumas linhas de código antes da linha 36, do código template.

Abaixo temos o código fonte de uma classe de teste com JUnit 5, na qual eu escrevi para exemplificar como seria a validação de sua solução, conforme o enunciado:

import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.PrintStream;

import static org.junit.jupiter.api.Assertions.assertEquals;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class RegistroDeTransacoesBancariasTest {

  private final PrintStream saidaImpressa = System.out;
  private final InputStream entradaDados = System.in;

  @AfterEach
  public void restoreStreams() {
      System.setOut(saidaImpressa);
      System.setIn(entradaDados);
  }

@ParameterizedTest
@CsvSource({
      "2500\\n2\\nd\\n100\\ns\\n500\\n, Saldo: 2100.0\\nTransacoes:\\n1. Deposito de 100.0\\n2. Saque de 500.0\\n",
      "900\\n1\\ns\\n100\\n, Saldo: 800.0\\nTransacoes:\\n1. Saque de 100.0\\n",
      "0\\n0\\n, Saldo: 0.0\\nTransacoes:\\n",
      "1000\\n1\\ns\\n500\\n, Saldo: 500.0\\nTransacoes:\\n1. Saque de 500.0\\n" // <- Exemplo em teste fechado
})
  @Order(1)
  void deveRealizarCenarios_retornarIguais(String entradaAutomatizada, String saidaEsperada) {
      InputStream entradaSistema = new ByteArrayInputStream(entradaAutomatizada.replace("\\n", "\n").getBytes());
      ByteArrayOutputStream suaSaida = new ByteArrayOutputStream();
      System.setOut(new PrintStream(suaSaida));
      System.setIn(entradaSistema);

      RegistroDeTransacoesBancarias.main(null);

      assertEquals(saidaEsperada.replace("\\n", "\n"), suaSaida.toString()
              .replaceAll("\r\n", "\n")
              .replaceAll(",", "."));

      System.setOut(saidaImpressa);
      System.setIn(entradaDados);
  }
}

image

Na figura acima, temos o resultado da execução dos testes unitários com os 3 eventos presentes no enunciado e um suposto teste fechado.

Note que no exemplo da classe de teste, é esperado o texto conforme o enunciado (inclusive com o valor exibindo uma casa decimal) e sem nenhuma acentuação não solicitada, nenhuma mensagem extra de saída, etc...

Com o código de exemplo acima, fica claro que a entrada de dados foi feita automaticamente e ainda validou a saída impressa.

Note ainda que existem os testes fechados, que não são disponíveis para o aluno, conforme ainda o texto "Certifique-se de

testar seu programa com esses exemplos e com outros casos possíveis.", na qual poderão haver outros valores para testes.

Abaixo temos a figura com código do desafio que foi transcrito para o IntelliJ e executado. Inserindo os valores do exemplo e gerando as saídas que o desafio pede.

image

Figura com exemplo de mensagens corretas.

Abaixo temos outro exemplo do que está sendo esperado (Saída esperada) e o que o seu programa está imprimindo na saída (Sua Saída). Propositalmente foram impressas mensagens desnecessárias como, por exemplo "Digite seu nome : ", fazendo o teste falhar.

image

Em resumo, deverá imprimir exatamente igual o que se espera em "Saída esperada".

Com esse artigo, espero que você tenha entendido um pouco sobre como funcionam os testes.

Aqui na DIO temos um curso sobre o assunto ⛓️‍💥Desafios de Código - Seja Protagonista Neste Bootcamp e ⛓️‍💥Conhecendo o ambiente e resolvendo um desafio (com Venilton Jr, Natália Fernandes e a Adriana Silva).

Lembre-se de que a simplicidade e a clareza são essenciais ao resolver desafios de código.

Boa sorte e bons estudos! 🚀

Compartilhe
Recomendados para você
XP Inc. - Cloud com Inteligência Artificial
Microsoft AI for Tech - Azure Databricks
Microsoft Certification Challenge #3 DP-100
Comentários (8)
Jefferson Leão
Jefferson Leão - 15/11/2024 00:22

acho que sou o unico que continuo sem entender nadica de nada

Aline Antunes
Aline Antunes - 05/08/2024 19:49

Adorei!! Parabéns de mais pelo artigo xD

Douglas Lucio
Douglas Lucio - 26/11/2024 09:43

Clodoaldo parabéns pois acredito que todos ja passamos por isso.

Isaias Silva
Isaias Silva - 04/10/2024 02:41

Bom dms.

Antonio Tiburtino
Antonio Tiburtino - 28/09/2024 18:06

Artigo muito bom, me ajudou a compreender mais ainda.

RS

Ronaldo Sousa - 09/08/2024 18:45

Que legal, valeu pelas dicas.

GV

Gabriel Villela - 09/08/2024 11:00

Muito boa as dicas, parabéns pelo artigo!

MC

Marcus Cesar - 01/08/2024 20:58

Muito bom artigo!!

Recomendados para vocêMicrosoft Certification Challenge #3 DP-100