Esta seção é completamente inspirada no apêndice C do livro [15].
A memória do computador é uma seqüência de bytes. Um byte consiste em 8 bits, onde bit significa a menor unidade de informação que pode ser armazenada na memória e pode assumir apenas dois valores possíveis: 0 ou 1. Assim, um byte pode assumir 256 valores possíveis: 00000000, 00000001, . . . , 11111111. De fato, o conjunto de todas as seqüências de k bits representa os números naturais de 0 a 2k− 1.
Uma seqüência de bits é chamada de um número binário ou número na base 2. Por exem- plo, 010110 é um número binário representado por uma seqüência de 6 bits. Podemos conver- ter um número binário em um número decimal, ou número na base 10, que nada mais é que um número natural. Por exemplo, o número binário 010110 representa o número decimal 22, pois 0 × 25+ 1 × 24+ 0 × 23+ 1 × 22+ 1 × 21+ 0 × 20 = 22.
Na linguagem C, os números inteiros positivos e negativos são conhecidos como inteiros com sinal. Para declarar uma variável i do tipo inteiro com sinal, temos de digitar
int i;
Cada variável do tipo int é armazenada em b bytes consecutivos na memória, onde b é dependente da arquitetura do computador. A maioria dos computadores pessoais atuais têm b = 4e assim cada variável do tipo int é representada por uma seqüência de 8 × 4 = 32 bits, perfazendo um total de 232valores possíveis, contidos no conjunto
5.3 REVISÃO DE NÚMEROS INTEIROS 57
ou
−2147483648, . . . , −1, 0, 1, . . . , 2147483647 .
Cada seqüência de 32 bits que começa com 0 representa um int não-negativo em notação binária. Cada seqüência de 32 bits que começa com 1 representa o inteiro negativo k − 232,
onde k é o valor da seqüência em notação binária. Esta representação de números inteiros negativos é chamada de complemento-de-dois. Números inteiros que estejam fora do intevalo
−231, 231− 1 são representados módulo 232.
Ressaltamos ainda que todos os valores acima podem ser obtidos usando fórmulas gerais em função do número de bytes consecutivos usados para representar um int.
Exercícios
5.1 Escreva um programa que receba a temperatura ambiente em graus Célsius e mostre uma mensagem para o usuário informando se a temperatura está muito quente. Considere como temperatura limite o valor de 30 graus Célsius.
Programa 5.5: Solução do exercício5.1.
#include <stdio.h>
/* Recebe um número inteiro que representa uma temperatura e imprime uma mensagem de aviso */ int main(void)
{
int temperatura;
printf("Informe uma temperatura (em graus Celsius):")); scanf("%d", &temperatura);
if (temperatura > 30)
printf("Hoje é um dia bem quente!\n"); else
printf("Hoje não é um dia tão quente.\n"); return 0;
}
5.2 Escreva um programa que receba um número inteiro x e avalie o polinômio p(x) = 3x3− 5x2+ 2x − 1 .
5.3 Para transformar um número inteiro i no menor inteiro m maior que i e múltiplo de um número inteiro j, a seguinte fórmula pode ser utilizada:
m = i + j − i mod j ,
onde o operador mod é o operador de resto de divisão inteira na notação matemática usual, que corresponde ao nosso operador %.
Por exemplo, suponha que usamos i = 256 dias para alguma atividade e queremos saber qual o total de dias m que devemos ter de forma que esse número seja divisível por j = 7, para termos uma idéia do número de semanas que usaremos na atividade. Então, pela fórmula acima, temos que
m = 256 + 7 − 256 mod 7 = 256 + 7 − 4
= 259 .
Escreva um programa que receba dois números inteiros positivos i e j e devolva o menor inteiro m maior que i e múltiplo de j.
5.4 Escreva um programa que receba um número inteiro a e verifique se a é par ou ímpar. 5.5 Escreva um programa que receba um número inteiro a e verifique se a é positivo, negativo
ou igual a 0.
5.6 Escreva um programa que receba três valores, armazenando-os nas variáveis x, y e z, e or- dene esses valores de modo que, ao final, o menor valor esteja armazenado na variável x, o valor intermediário esteja armazenado na variável y e o maior valor esteja armazenado na variável z.
AULA6
E
STRUTURA DE REPETIÇÃO
while
As estruturas de repetição são, juntamente com a estrutura seqüencial e as estruturas condi- cionais que vimos nas aulas passadas, elementos fundamentais em algoritmos e programação. São essas três estruturas básicas que permitem que um(a) desenvolvedor(a)/programador(a) consiga resolver centenas e centenas de problemas de maneira efetiva. De posse apenas das es- truturas seqüencial e condicional, um(a) programador(a) fica muito restrito à solução de uma pequena parcela de problemas. Assim, nesta aula motivaremos o estudo das estruturas de repetição e apresentaremos a estrutura de repetição while da linguagem C.
Esta aula é baseada em [16,9].
6.1 Motivação
Suponha que alguém queira escrever um programa para imprimir os dez primeiros núme- ros inteiros positivos. Este problema, apesar de muito simples e pouco útil à primeira vista, motiva a introdução das estruturas de repetição, como veremos adiante. Com o que aprende- mos até o momento, é bem fácil escrever um programa como esse.
#include <stdio.h>
/* Escreve os 10 primeiros números inteiros positivos na saída */ int main(void) { printf("1\n"); printf("2\n"); printf("3\n"); printf("4\n"); printf("5\n"); printf("6\n"); printf("7\n"); printf("8\n"); printf("9\n"); printf("10\n"); return 0; }
Além de bem simples, o programa acima está correto, isto é, realiza corretamente o pro- pósito de imprimir os dez primeiros números inteiros positivos na saída. Mas e se quisés- semos, por exemplo, imprimir os 1000 primeiros números inteiros positivos? Um programa semelhante ao que acabamos de apresentar ficaria um pouco mais complicado e monótono de escrever, já que teria muitas e muitas linhas de código.
Uma das propriedades fundamentais dos computadores, talvez a que mais nos auxilia, é que eles possuem a capacidade de executar repetitivamente um conjunto de instruções. Essa capacidade de repetição permite que um(a) desenvolvedor(a)/programador(a) escreva algo- ritmos e programas mais concisos, contendo processos repetitivos que poderiam necessitar de centenas ou milhares de linhas se não fossem assim descritos. Na linguagem C podemos ter três estruturas de repetição diferentes. A seguir veremos a estrutura de repetição while, mais simples, mais didática, mais ilustrativa e provavelmente a mais usada estrutura de repetição da linguagem C.