Resumo
Esta aula abre a segunda unidade do curso, dedicada aos dados e seus tipos. Explica para que serve a unidade: ensinar que todo dado de um programa vive na memória com um tipo que fixa quais valores ele pode assumir, quanto espaço ocupa e quais operações admite, e que esses limites têm consequências observáveis; apresenta suas quatro aulas e o fio que as une, desde a variável como posição de memória com nome e valor até as conversões entre tipos e as constantes; recorda o que a unidade dá por sabido da primeira, que é escrever, compilar e executar um programa que lê e escreve; formula o problema que a unidade resolve, o de um programa correto na aparência cujas contas não coincidem com as da matemática, começando pela soma , que num computador não dá exatamente ; e mostra aonde conduz, nas unidades seguintes e no curso Programação em C++ II.
Objetivos de aprendizagem
- Descrever a sequência de conteúdos da unidade e explicar o que cada aula traz para a seguinte.
- Recordar o necessário da unidade 1 (o ciclo de compilar e executar, a saída com formato, a leitura com
std::cine a leitura das mensagens do compilador) e revisá-lo se for preciso. - Explicar, com um exemplo, por que um número de um programa não é um número da matemática, e antecipar por que não é exatamente num computador.
- Reconhecer o que se espera saber fazer ao terminar a unidade, e distingui-lo do que se aprenderá nas unidades seguintes.
Avaliação de entrada
Antes de percorrer a unidade, convém medir o ponto de partida. Esta avaliação é uma autoavaliação: não se pontua, e seu único propósito é orientar o estudo. As quatro primeiras perguntas verificam o que a unidade dá por sabido da primeira: o acompanhamento de um procedimento passo a passo, a escrita de um número com duas casas decimais, o arredondamento e a leitura de uma mensagem de erro. As seis seguintes tocam, na ordem das aulas, as ideias centrais da unidade. Ninguém é obrigado a acertá-las ainda, e numa delas “ainda não sei” é uma resposta honesta: cada resposta, certa ou não, explica o ponto e nomeia a aula que o trata. As mesmas habilidades voltam a ser medidas no final, na aula de síntese.
Antes de começar a unidade, meça seu ponto de partida. É uma autoavaliação breve: não recebe nota e seu resultado fica guardado apenas no seu navegador.
Pergunta 1De unidades anterioresUm procedimento diz: “1. recebe o valor 17. 2. recebe o valor . 3. recebe o valor ”. Quanto vale ao terminar?
Supõe que cada passo parte do valor inicial; o segundo parte do valor que o primeiro deixou.Lê “recebe o valor” como uma igualdade matemática; é uma ordem que substitui o valor de .Confunde uma variável com uma constante: o valor de uma variável muda cada vez que se lhe atribui outro.Cada passo parte do valor que tem nesse momento, não do inicial. Acompanhar o procedimento à mão, com o valor de cada variável depois de cada passo, é a tabela de rastreamento da unidade 1, e a aula 2.1 a converte no instrumento para raciocinar sobre o estado de um programa.Revisar: Do problema ao algoritmo
Pergunta 2De unidades anterioresO que escreve a instrução
std::println("{:.2f}", 2.0 / 3);?Acredita que a especificação de formato trunca; ela arredonda para o decimal mais próximo.Ignora a especificação de formato: essa é a escrita sem.2f.Acredita que a divisão é inteira; com2.0, que tem casas decimais, a divisão é real.A especificação.2fescreve o número com duas casas decimais, arredondando: se escreve0.67. O valor guardado não muda; só a sua escrita.Revisar: Entrada, saída e erros
Pergunta 3De unidades anterioresQuer-se escrever com duas casas decimais, arredondando. O que se obtém?
Trunca em vez de arredondar: descarta o terceiro algarismo sem olhá-lo.Arredonda para uma casa decimal, não para duas.Aumenta o segundo algarismo decimal mais do que o devido: está entre e , e o arredondamento escolhe um desses dois.Arredondar para duas casas decimais é escolher o número de duas casas decimais mais próximo: está mais perto de do que de . A aula 2.3 mostrará que o computador arredonda da mesma maneira, mas em base 2, e que por isso quase nenhum número com casas decimais é guardado exatamente.Revisar: Entrada, saída e erros
Pergunta 4De unidades anterioresUm programa tem na linha 5
const int pages{12}e na linha 6std::println("{}", pages);. O compilador escreve6:5: error: expected ',' or ';' before 'std'. Onde está o defeito?A linha 6 está correta; o compilador a aponta porque foi ali que percebeu a falta.stdé reconhecido; a mensagem diz que esperava um ponto e vírgula antes dele.A mensagem dizerror, nãowarning: não há executável.O compilador descobre a falta quando encontra algo que não pode seguir a declaração, no começo da linha 6, e aponta esse lugar. Se a linha apontada está correta, o defeito costuma estar no final da anterior.Revisar: Anatomia de um programa
Pergunta 5Um programa declara
int a{2};eint b{7};, e depois executaa = b;eb = 10;. Quanto valeano final?Acredita que a atribuição liga as duas variáveis, como seafosse outro nome deb; ela só copia o valor.Lêa = bao contrário, como se copiasseaemb; o valor vai da direita para a esquerda.Soma os dois valores; a atribuição substitui, não acumula.A atribuiçãoa = bcopia emao valor quebtem nesse momento; depois,aebsão posições independentes, e alterarbnão alteraa.Revisar: Variáveis e memória
Pergunta 6Como se escreve o número 13 em base 2?
É uma resposta honesta: a aula 2.2 ensina a escrever um número em base 2 e a lê-lo, e a avaliação de saída voltará a perguntá-lo.Lê os restos das divisões sucessivas na ordem em que aparecem; eles se leem do último para o primeiro.Soma mal os pesos: .Em base 2 cada posição pesa o dobro da que está à sua direita, e os algarismos são só 0 e 1. A aula 2.2 ensina isso, porque todo inteiro de um programa é guardado assim.Revisar: Os inteiros e sua representação
Pergunta 7Um
intde 4 bytes guarda , seu valor máximo, e o programa lhe soma 1. O que se pode afirmar?Ignora o limite da representação: esse número não cabe numintde 4 bytes.Assim se comportam os inteiros sem sinal, cuja aritmética é modular; para os inteiros com sinal, o padrão não o garante.O compilador não conhece os valores que o programa terá ao ser executado, a menos que sejam constantes; quase sempre compila sem dizer nada.Um inteiro de um programa tem um número fixo de bits e, com eles, um intervalo finito. Sair do intervalo de um inteiro com sinal viola a pré-condição da soma; o detector do curso interrompe o programa, e sem ele o programa pode escrever qualquer coisa. A aula 2.2 estuda isso.Revisar: Os inteiros e sua representação
Pergunta 8 tem desenvolvimento decimal finito?
é uma aproximação: , não 1.Por mais que se escrevam, sempre sobra um resto; o desenvolvimento é periódico, não finito.É uma propriedade do número e da base, não do instrumento; a calculadora só mostra uma aproximação.Uma fração irredutível tem desenvolvimento decimal finito se e somente se seu denominador não tem fatores primos além de 2 e 5, os da base 10. Em base 2 a condição é mais exigente: o denominador deve ser uma potência de 2, e por isso não tem desenvolvimento binário finito. A aula 2.3 extrai disso as suas consequências.Revisar: Os números de ponto flutuante
Pergunta 9O que escreve
std::println("{}", 0.1 + 0.2);?Supõe que o computador soma decimais exatos; ele soma aproximações binárias.Confunde a escrita com o marcador vazio com a especificação{:.2f}, que arredonda para duas casas decimais.A soma de doisdoubleé legítima; o surpreendente é o seu resultado, não a sua escrita.Nem nem se guardam exatamente em binário, e a soma de suas aproximações não é a aproximação de .std::printlnescreve a representação decimal mais curta que identifica o valor guardado, e essa representação revela a diferença. A aula 2.3 explica algarismo por algarismo de onde ela vem.Revisar: Os números de ponto flutuante
Pergunta 10Um programa declara
const double ratio{7 / 2};e escreveratio. O que aparece?Acredita que o tipo da variável decide como se divide; quem o decide é o tipo dos operandos.Acredita que a divisão inteira arredonda; ela descarta a parte decimal.O valor 3 é constante e se representa exatamente numdouble: não há perda, e as chaves o admitem.A divisão7 / 2é entre inteiros, e dá o quociente inteiro, 3; só depois esse 3 é convertido emdouble. Qual divisão se faz é decidido dentro da operação, pelo tipo dos operandos, e não ao guardar o resultado. A aula 2.4 ensina onde pôr a conversão para obter 3.5.
Carregando o conteúdo…