DEV Community

Matheus
Matheus

Posted on • Updated on

CS50: S1 | E o problema do Mario

É interessante como um material tão enriquecedor esteja disponivel para estudo, e acompanhamento. Tenho tido bastante alegria em começar a acompanhar o CS50 de forma semanal - como é o esperado - já que cada unidade é tratado por semanas. Dessa forma, eu acredito que evito as chances de ter um burnout e consigo, por ventura, solidificar o aprendizado em diversos assuntos.

Problems Set 1

No post anterior apresentei sobre o que foi a semana 1 do curso de Introdução a Ciência da Computação (CS50) ministrado em Harvard. Ao terminar a primeira aula, somos levados para a primeira lista que podemos chamar de dever de casa, onde são dados duas opções:

  • Uma versão simples
  • Uma versão complexa

O que não muda e nem impede a sua capacidade de ser um programador. Tendo, é claro, que respeitar a sua jornada. Se, você preferiu fazer só as versões mais simples, meus parabéns!
Você resolveu problemas, e encontrou soluções!

O que se espera na resolução desses problemas, é:

  • Assistir a aula correspondente a semana 1: C
  • Se familiarizar com a IDE do CS50 na nuvem
  • Entender sobre como utilizar os comandos linux no terminal
  • Ficar confortável com os blocos fundamentais da programação: condicionais, loops, operadores, e tipos de dados.
  • Entender a função prototipo na linguagem C

Com a resolução, seja do exercicio em sua versão simples, ou em sua versão complexa, te dará familiariadade com todos esses temas. E caso, não tenha conseguido resolver, não desista! Peça ajuda! A comunidade brasileira de desenvolvedores é muito receptiva, e mesmo que não tenham feito esse problema em especifico, eles te ajudarão a dar um norte para melhorar o seu algoritmo.

Mario: Simples

Quero mostrar o começo dos exercicios nas próximas semanas que virão, então darei ênfase, na escrita, para suas versões mais simples.

A ideia aqui é gerar apenas um lado da pirâmide. Replicando as escadas geradas no mapa 1-1 do Super Mario para SNES. Como podemos ver na imagem abaixo:

https://cs50.harvard.edu/x/2022/psets/1/mario/less/pyramid.png

Tirando a parte gráfica, o céu azul e o cano verde, a expectativa em nosso terminal é algo como:

       #
      ##
     ###
    ####
   #####
  ######
 #######
########
Enter fullscreen mode Exit fullscreen mode

E a sua altura se dará por um número dado pelo usuário que informará quanto será.

Neste primeiro momento, como o programa terá que produzir atividades repetitivas, podemos pensar em um laço de repetição que é um dos blocos fundamentais da linguagem de programação.

Partindo do príncipio que o triangulo acima tenha altura igual a 8.

Vemos uma sequência de etapas, sendo produzida como:

  • Primeira linha: 7 espaços vazios e 1 bloco preenchido
  • Segunda linha: 6 espaços vazios e 2 blocos preenchidos
  • Terceira linha: 5 espaços vazios e 3 blocos preenchidos
  • ...
  • Oitava linha: 0 blocos vazios e 8 blocos preenchidos

Conseguimos ver um padrão repetitivo.

Antes de escrever qualquer código, precisamos observar o ambiente para pensar nessa sequência de etapas que está sendo executada. Tanto faz a linguagem de programação, seja C, Python, JavaScript, o que for.

Linguagens de programação são apenas ferramentas para te auxiliar na construção de um algoritmo, por isso, aprender bem os blocos fundamentais tornam o seu aprendizado horizontal, caso você precise mudar de ferramenta, o seu conhecimento continua sendo válido, só mudando a sua sintaxe, e as particularidades de cada linguagem.

Desta maneira, voltarei a resolução do exercicio. E aqui, deixo claro, não existe solução única, nem o jeito certo de fazer o problema. Toda solução pode ser otimizada, mas a solução é aquela que você consegue resolver o problema.

Resolução

#include <cs50.h>
#include <stdio.h>

int get_height();

int main(void)
{
    int height = get_height();
    while(height < 1 || height > 8) {
        height = get_height();
    }

    int counter = 1;
    while (counter <= height) {
        int spaces = height - counter;
        for(int i = 0; i < spaces; i++) {
            printf(" ");
        }
        for(int i = 0; i < counter; i++) {
            printf("#");
        }
        printf("\n");
        counter++;
    }
}

int get_height() {
    return get_int("Height: ");
}
Enter fullscreen mode Exit fullscreen mode

Valendo-se do conceito de prototipo introduzido na primeira aula, crio uma função get_height() que pedirá ao usuário para informar a altura que o triângulo deve ter.

Ali são as condições de contorno estipuladas pelo próprio exercicio, onde caso a altura seja um número que não esteja dentro do intervalo, a função será chamada novamente até atender o que se pede.

E depois, entra no laço de repetição onde encontrei um padrão de repetição lá em cima.

Vamos partir do principio aqui que o usuário informou que a altura é igual a 8.

int counter = 1;
    while (counter <= height) {
        int spaces = height - counter;
        for(int i = 0; i < spaces; i++) {
            printf(" ");
        }
        for(int i = 0; i < counter; i++) {
            printf("#");
        }
        printf("\n");
        counter++;
    }
Enter fullscreen mode Exit fullscreen mode
  • Primeira linha

counter = 1;
height = 8;
spaces = 8 - 1 = 7;

Na primeira linha serão gerados 7 espaços e 1 bloco construido

  • Segunda linha

counter = 2;
height = 8;
spaces = 8 - 2 = 6;

Na segunda linha serão gerados 6 espaços e 2 blocos construidos

  • Terceira linha

counter = 3;
height = 8;
spaces = 8 - 3 = 5;

Na terceira linha serão gerados 5 espaços e 3 blocos construidos

Conclusão

Desta maneira conseguimos repetir por meio de uma ferramenta o mesmo padrão do problema suposto, e assim replicar o triângulo gerado para todos os casos dentro da condição de contorno estabelecido pelo Problem Set da aula.

Em um próximo post, falarei sobre o outro exercicio simples, onde trabalharemos com tipos de dados e operadores.

Discussion (3)

Collapse
leonardoxavier11 profile image
leonardoxavier11

Boa noite Matheus, tudo bem?

Começei a 1 semana a estudar sobre programação e inicei pelo CC50. Cara, só queria te agradecer porque a sua resolução do problema me ajudou muito a entender a lógica que deveria aplicar nesse excercício. Excelente forma, valeu mesmo!

Collapse
mpfdev profile image
Matheus Author

Que legal, Leonardo!

Fico feliz que tenha te ajudado a entender a lógica, o importante é isso, escrever código é a última parte do problema, entenda o processo e quais são as instruções. Estou escrevendo sobre as aulas e alguns dos exercícios, espero que te ajude mais vezes.
Obrigado!

Collapse
amartinscs profile image
amartinscs

Bom dia Matheus, tudo bem jovem?

Começei a estudar sobre programação iniciando com CC50 muita dificuldade mas voce ajudou demais com isso pra quem esta iniciando, muito obrigado.
Parabens pela iniciativa e incentivo.