- Metas da primeira semana
- IDE CS50
- Atualização da linha de comando e do ambiente de trabalho
- Trabalhando no IDE
- Olá, C!
- Insetos?
- Verificação de validação: teste check50
- Noções básicas de C: comparação com Scratch
- Tipos de dados básicos em C
- Bibliotecas C
- Olá C de novo: análise da sintaxe dos programas mais simples
- Um pouco mais sobre E/S em C
- Entrada de dados validados: funções especiais da biblioteca cs50.h
- Tarefa 1. Cálculo inteligente do consumo de água
- Tarefa 2. Mario está conosco!
- Tarefa 3. Hora de trocar
- Como validar seu código e obter notas
- Recurso de código
- literatura adicional
Entrada de dados validados: funções especiais da biblioteca cs50.h
Para tornar este curso mais conveniente, desenvolvemos uma biblioteca especial CS50, que, em particular, possui funções muito úteis para o processamento de dados inseridos pelo usuário.-
GetString()
lê a string inserida pelo usuário; -
GetInt()
lê a string inserida pelo usuário e verifica se ela contém um número inteiro; -
GetFloat()
lê a string inserida pelo usuário e verifica se ela contém um número de ponto flutuante; -
GetLongLong()
lê a string inserida pelo usuário e verifica se ela contém um número real longo.
Tarefa 1. Cálculo inteligente do consumo de água
É lógico: quanto mais tempo você toma banho, mais água é gasta nesse processo. Vamos descobrir quanto? Mesmo que o chuveiro esteja mal aberto, saem dele aproximadamente 6 litros de água por minuto. E são 12 garrafas de água que você carrega para beber. Normalmente uma pessoa toma banho por cerca de 10 minutos, no total, para se lavar, são necessárias 120 garrafas de meio litro. Bastante! Crie um arquivowater.c
no seu ~/workspace/pset1
. O programa deve contar quantas garrafas de água são utilizadas no banho dependendo do horário. Aquilo é:
- O programa pergunta ao usuário quantos minutos passou no banho
- O usuário insere um número inteiro positivo
- O programa exibe a quantidade de garrafas utilizadas pelo usuário.
username:~/workspace/pset1 $ ./water
minutes: 10
bottles: 120
Para simplificar, desta vez assumiremos que o usuário sempre digita corretamente o número de minutos, ou seja, não verificamos se o número digitado é positivo e inteiro. Mais tarde aprenderemos como preencher cheques, mas por enquanto isso é o suficiente. Para verificar se o programa está funcionando corretamente, check50,
você precisa inserir a seguinte linha no terminal:
check50 2015.fall.pset1.water water.c
E se você quiser ver como water
funciona o programa escrito pela equipe do curso, execute o seguinte comando:
~cs50/pset1/water
Tarefa 2. Mario está conosco!
Você conhece o encanador mais famoso do mundo? Com a ajuda da Nintendo, o cara fictício de bigode e um pouco rechonchudo com boné vermelho se tornou um herói para várias gerações de jogadores. Se você não sabe de quem estamos falando, aqui está um link para o clássico jogo de 1985 : acredite, ainda é bom e vale a pena conferir! Você também pode encontrar uma versão do clássico Super Mario para smartphones ou emuladores offline. Precisamos de tudo isso para o desenvolvimento geral, isso, infelizmente, ainda não é uma tarefa ;). E a tarefa é esta. No final do primeiro nível do Mario, todos os jogadores viram esta meia pirâmide: Crie um arquivomario.c
no seu arquivo ~/workspace/pset1
. Nosso programa desenhará uma meia pirâmide semelhante à que você vê, mas diretamente no console, sem gráficos: cada um dos blocos consistirá em um ícone de hash (#). Mesmo que você ainda não tenha descoberto como fazer, acredite: é fácil. Para tornar o problema mais interessante, vamos adicionar a ele a capacidade de definir a altura da meia pirâmide usando um número inteiro não negativo de 0 a 23. A altura da pirâmide na imagem é considerada no lugar mais alto, ou seja, igual a 8. Se o usuário inserir o número incorretamente, será necessário solicitar que ele faça novamente uma vez. Em seguida, gere (usando printf uma pirâmide). Tenha cuidado para alinhar o canto inferior esquerdo da sua meia pirâmide com a borda esquerda da janela do terminal, como no exemplo abaixo. O texto sublinhado é o que o próprio usuário insere.
username:~/workspace/pset1 $ ./mario
height: 8
##
###
####
#####
######
#######
########
#########
Observe que as duas colunas mais à direita têm a mesma altura. Ainda não vale a pena gerar canos, nuvens e o próprio Mario =). Pelo menos para esta tarefa. Caso o usuário tenha digitado dados incorretos (não digitou um número, ou digitou um número menor que um ou maior que 23), o programa deverá solicitar que ele insira os dados novamente, como no exemplo abaixo, onde o texto sublinhado é o que o usuário digitou no teclado. Para ler a string inserida, use GetInt
. Pode ajudar a verificar entradas incorretas, mas não em todos os casos.
username:~/workspace/pset1 $ ./mario
Height: -2
Height: -1
Height: foo
Retry: bar
Retry: 1
##
Para compilar o programa, digite a linha no terminal:
make mario
ou uma versão mais transparente, porém mais longa:
clang -o mario mario.c -lcs50
Depois disso, execute o programa para execução:
./mario
Se você quiser verificar se o programa está funcionando corretamente, execute check50
:
check50 2015.fall.pset1.mario mario.c
E se você quiser brincar com a versão do Mario dos assistentes do curso, digite a seguinte linha:
~cs50/pset1/mario
Tarefa 3. Hora de trocar
Nas nossas latitudes não vimos isso, mas nos EUA, ao que parece, existe um brinquedo assim, mostrado na foto: os cilindros são projetados para moedas de diferentes diâmetros (e denominações), são liberados por um mecanismo de mola , e a própria unidade pode ser fixada no cinto de uma caixa infantil. Porém, o que acontece se alguém pagar ao caixa com uma conta grande? Imagine quanto trabalho será contar moedas para troco. Para minimizar o número de moedas emitidas, você pode usar os chamados algoritmos “gananciosos”. Eles, conforme definido pelo Instituto Nacional de Padrões e Tecnologia (NIST), sempre encontram a solução ótima em cada etapa da resolução de um problema, assumindo que a solução final (obtida da totalidade de tais etapas) também será ótima. O que isso significa? Vamos imaginar que um caixa deve a um cliente 41 centavos de troco e ele tem cilindros de moedas em seu cinto para troco nos valores de 25, 10, 5 e 1 centavo. Um caixa guiado por um algoritmo “ganancioso” desejará imediatamente dar o máximo logo no primeiro passo. Neste ponto, a solução ideal ou melhor seria distribuir 25 centavos. 41-25 = 16,16 centavos restantes para pagar. Obviamente, 25 centavos é demais, então sobra 10. 16-10 = 6. Agora distribuímos 5 centavos de acordo com o mesmo princípio e depois 1. Assim, o comprador receberá apenas quatro moedas nos valores de 25, 10 , 5 e 1 centavo. Acontece que as instruções passo a passo “gananciosos” para a emissão de dinheiro são ideais não só para este caso, mas também para as denominações das moedas dos EUA (e também da União Europeia). Ou seja, se o caixa tiver moedas suficientes de qualquer valor, o algoritmo funcionará melhor, ou seja, emitirá o número mínimo de moedas de todos os casos possíveis. Então, qual é o número mínimo de moedas que precisamos para dar o troco? Esta é a nossa terceira tarefa. Crie um arquivogreedy.c
em seu diretório ~/workspace/pset1
. Dado: moedas em denominações de 25, 10, 5, 1 cêntimo O programa deve:
- Pergunte ao usuário quanto troco ele deve distribuir
- Calcule o número mínimo de moedas com as quais você pode fazer isso
GetFloat
da biblioteca CS50 para entrada e printf
da biblioteca de E/S padrão para saída. Além disso, o programa deve verificar a exatidão da entrada. Pedimos que você usasse GetFloat
, para permitir que o usuário insira um valor em dólares e centavos separados por um ponto. Por exemplo, se devemos US$ 9,75, o usuário deverá inserir 9,75, mas não US$ 9,75 ou 975. Você deve garantir que o usuário insira um número que faça sentido. GetFloat
Digamos que não seja negativo; a função em si não ajudará nisso . Caso o usuário faça uma entrada incorreta, é necessário pedir que ele repita e execute o programa apenas com os dados corretos. Cuidado com as imprecisões inerentes aos números de ponto flutuante. Por exemplo, 0,01 não pode ser representado diretamente como float
. Tente usar saída formatada, por exemplo com 50 casas decimais, usando o código abaixo:
float f = 0.01;
printf("%.50f\n", f);
Aliás, antes de contar qualquer coisa, seria lógico converter o valor total em centavos (e ao mesmo tempo convertê-lo de float
para int
), o que ajudará a evitar muitos erros e dificuldades. Para garantir que nosso analisador automático de código possa verificar corretamente o seu problema, certifique-se de que a última linha da saída do seu programa não contenha nenhuma outra informação além do número mínimo de moedas: um número inteiro com um \n depois (aqueles que aprendem JavaRush estamos bem cientes do que estamos falando aqui =)). Abaixo está um exemplo de como deve ser o resultado do seu programa.
username:~/workspace/pset1 $ ./greedy
O hai! How much change is owed?
0.41
4
Dada a natureza dos números de ponto flutuante, você pode ignorar o zero e inserir esse número no formato .41. Obviamente, os usuários que desejam verificar o programa quanto à possibilidade de inserir dados incorretos por completo devem ver algo como:
username:~/workspace/pset1 $ ./greedy
O hai! How much change is owed?
-0.41
How much change is owed?
-0.41
How much change is owed?
foo
Retry: 0.41
4
Com base nesses requisitos e no exemplo que você viu acima, seu código provavelmente deverá conter algum tipo de loop. Se, ao testar a aplicação, você perceber que o loop não para, você pode interromper a execução do programa com a combinação ctrl-c (às vezes várias vezes). Você já sabe como compilar e executar um programa. Se quiser verificar se o seu programa está funcionando corretamente, através do utilitário check50
, digite a seguinte linha no terminal:
check50 2015.fall.pset1.greedy greedy.c
E se quiser brincar com este programa feito pelos assistentes do curso, escreva o seguinte comando:
~cs50/pset1/greedy
Como validar seu código e obter notas
-
Opção 1
Se for importante para você verificar a correção do código, e não obter nota final, você pode verificar e corrigir usando o comando.
check50 2015.fall.pset1.name name.c
inserido na linha de terminal do CS50 IDE? onde
name
está o nome do seu arquivo de tarefa. -
opção 2
Se você deseja obter notas (essencialmente o mesmo que executar o check50, mas lembrando do resultado e preenchendo alguns formulários em inglês), siga estas etapas:
-
Etapa 1 de 2
- Quando os aplicativos estiverem prontos, faça login no IDE CS50.
- No canto superior esquerdo do IDE CS50, dentro do navegador de arquivos, não na janela do terminal, clique com o botão esquerdo ou com o botão direito no arquivo hello.c (aquele localizado no diretório pset1) e clique em Baixar. Você deve descobrir que o navegador carregou hello.c.
- Repita para água.c.
- Repita para mario.c.
- Repita para ganancioso.c.
- Em uma guia ou janela separada, faça login no CS50 Submit .
- Clique em Enviar no canto inferior esquerdo da janela.
- Em Conjunto de problemas 1 na janela que aparece, clique em Carregar novo envio.
- Na janela que aparece, clique em Adicionar arquivos…. Uma janela chamada Abrir Arquivos deve aparecer.
- Navegue até o local onde o hello.c foi baixado. Geralmente está localizado na pasta Downloads ou na pasta atribuída a você por padrão para downloads. Depois de encontrar hello.c, clique nele uma vez para marcá-lo e clique em Abrir.
- Clique em Adicionar arquivos... novamente e a janela Abrir Arquivos aparecerá novamente.
- Agora encontre o arquivo water.c da mesma maneira. Clique nele e, em seguida, clique em Abrir (ou “Abrir”).
- Agora encontre mario.c. E também clique e abra da mesma forma.
- Tudo é igual com o arquivo ganancioso.c.
- Clique em Iniciar upload para começar a enviar seus arquivos para os servidores CS50.
- Na tela que aparece, você verá uma janela chamada Nenhum arquivo selecionado. Se você mover o cursor do mouse para o lado esquerdo da tela, verá uma lista de arquivos que baixou. Clique em cada um para confirmar o conteúdo de cada um. (Não há necessidade de clicar em outros botões ou ícones). Se você tem certeza de que está pronto para enviar o arquivo para verificação, considere que está pronto! Se você quiser verificar seu código novamente ou corrigir alguma coisa, volte para CS50 Submit e repita essas etapas. Você pode reenviar quantas vezes quiser; Somente a submissão mais recente será avaliada.
-
-
Passo 2 de 2 (não é necessário para avaliação, se for =))
Agora vá para https://www.edx.org/course/cs50s-introduction-computer-science-harvardx-cs50x onde você encontrará formulários especiais. Neles você precisa responder a várias questões teóricas e, a seguir, clicar em Enviar abaixo delas.
- Tudo bem, deveria ter previsto isso chegando! Em apenas algumas frases, o que é uma biblioteca? * (Descreva resumidamente o que é uma biblioteca)
- Em apenas algumas frases, que papel desempenha
#include <cs50.h>
quando você escreve sobre algum programa? *(qual é a função da linha #include <cs50.h> que aparece no topo de alguns programas?) - Aproximadamente quantas horas você diria que gastou no Conjunto de Problemas 0: Scratch?
- Aproximadamente quantas horas você diria que gastou no Conjunto de Problemas 1: C?
- Qual a sua opinião sobre o CS50x até agora? *(Sua opinião sobre o CS50 no momento, escolha a opção gostei ou não gostei)
- Você pediu ajuda a colegas ou funcionários por meio do Grupo CS50 no Facebook em http://www.facebook.com/groups/cs50? *(você pediu ajuda a outros alunos ou assistentes no grupo do Facebook)
- Você pediu ajuda de colegas ou funcionários por meio do Subreddit CS50 em http://www.reddit.com/r/cs50 *(você pediu ajuda de outros alunos ou assistentes por meio do Subreddit)
- Você pediu ajuda a colegas ou funcionários via Twitter usando @cs50 ou #cs50? *(você pediu ajuda a outros alunos ou TAs no Twitter usando @cs50 ou #cs50).
Recurso de código:
-
Aula três
-
Aula quatro
GO TO FULL VERSION