My life in English

Aiming to be a Canadian citizen.

Posts Tagged ‘miséria’

Variáveis e identificadores – Parte I

Posted by fabianovasconcelos on 29 de January de 2010

Salve, galerinha do país em que vale de tudo pra se dar de bem!

Aos que acreditam piamente que a polícia do estado do Ceará está firme e forte, notem que alguns termos são um link para páginas externas. Clique neles, se necessitar de alguma informação complementar a respeito.

Tá mais perdido que debutante grávida? Pois você veio parar num curso on line de C/C++! Clica aqui pra ver o índice!

Aê, cambada!
Quanto tempo, heim?

Aqui estou eu, com a cara mais ensebada do mundo, de volta depois de várias promessas de voltar com força total. Ainda bem que eu sou brasileiro e cara-de-pau por natureza.
Aos que vem acompanhando essa putaria esse curso de C, e ainda mais, estão gostando, eis-me aqui para mais uma aventura, a de um cara que não sabe de nada, mas quer ensinar a alguém. Pode um cego guiar o outro?
Este post vai especialmente para três leitores em particular: o Wallace, que me deu uma alfinetada essa semana, perguntando porque eu não tinha vergonha na cara de terminar o que eu comecei, pro Daniel Habib e também pro André, que num ato de insanidade disseram que os meus posts estavam ajudando a eles (esses não tem a mínima condição de passar nem no psicotécnico do Detran, que é o exame de sanidade mental mais furreca que existe). Agora eu só posso é continuar a escrever, pois já dizia Antoine de Saint-Exupéry, no livro “O pequeno príncipe”: “Tu te tornas responsável por tudo aquilo que cativas”.
Já que eu tô aqui enchendo linguiça, queria aproveitar pra agradecer ao meu brother Bruno Sanches, leitor e meu esbofeteador corretor de erros oficial. Sem ele, os poucos doentes leitores que eu tenho já teriam ido embora e os grilos estariam aqui cantando.
Agora, sem mais delongas, vamos começar a enganação o conteúdo!
Dando continuidade ao nosso ato de auto-flagelo, eu gostaria de falar de uma coisa basicona em qualquer linguagem de programação: as variáveis e os identificadores.
Bom cambada, eu quero deixar esse conceito o mais claro e sucinto possível pra vocês. Imaginem uma calculadora. Daquelas bem simples, de mão, como aquela que você comprou ou encomendou da 25 de março na semana passada. Agora imagine que você vai lá na budega (mercearia, taverna, venda, boteco, mercadinho ou sei lá como diabos você chama na sua região) e o budegueiro vai somar a tua conta do mês. Ele vai querer te enrrolar, porque é bem típico de muitos deles querer enfiar no teu rabo as contas do teu vizinho que costuma comprar na tua nota. Ele soma na caneta. Você depois soma tudinho na sua calculadora. Dígito por dígito, você vai somando, até que você pressiona a tecla igual e vê o resultado final.
Pois bem, o primeiro ítem foi de 3 reais. Imagine-se digitando ‘3’. Ops! Onde fica guardado esse ‘3’ dentro da calculadora? Depois você, na intenção de somar, pressiona ‘+’ e depois digita o segundo ítem, que foi R$1,80. Mais uma vez eu pergunto: onde ficará armazenado, socado, alocado, cravado ou enterrado todos estes valores até o final da soma? E o resultado final, onde fica armazenado? Esta e mais outras respostas, já, já, aqui, no blog do NewWave!
Pois muito bem. Como muita gente deve saber, todos os computadores eletrônicos e programáveis possuem um tipo de memória, chamada de memória RAM. Essa memória é uma memória volátil, que se extingue quando o computador é desligado ou quando o programa é fechado. Em outras palavras, a memória RAM é como uma sala de expediente de uma repartição. Quando o expediente começa, a sala começa a encher e fica movimentada. Quando o expediente termina, a sala esvazia, diferentemente do HD (hard disk), que possui memória fixa, que não se apaga quando o computador é desligado. Bem, o objetivo aqui não é descrever com detalhes o que é uma memória RAM. Para isso, clique aqui, se ainda não estiver entendendo direito.
Observe a figura abaixo:

Uma representação de memória RAM em forma de diagrama. Cada quadradinho numerado são 8 bits ou 1 byte.

Este é um diagrama simplificado de memória RAM. Cada quadradinho representa um byte (oito bits). Se a memória RAM do teu computador é de 2Gb, por exemplo, isso quer dizer que uma representação da sua memória, nesse esquema aí, deveria ter 8 x 1024 x 1024 x 1024 x 2 quadradinhos, ou seja, aproximadamente 1,72 x 10¹º. Uma coisa monstruosa.
Agora, vamos voltar aquelas perguntas iniciais: onde ficam armazenados os dígitos da calculadora enquanto você sai digitando a conta da budega? Agora sim, podemos responder com segurança: na memória RAM do computador! É lá onde as coisas realmente acontecem. É lá onde os programas rodam, onde a festa rola.
Podem parecer desconexas as informações que eu estou descrevendo aqui, mas daqui a pouco tudo fará sentido (espero!).
Vamos falar agora de tipos de dados. Certamente nem só de números inteiros vivem os programas. Não existem só calculadoras, com seus números pra somar, dividir, multiplicar ou subtrair. Existem também processadores de texto, programas de controle de estoque, cadastros de pacientes de uma clínica, controladores de hardware, firmware para vibradores sexuais, etc. Tudo isso demanda muitos tipos de dados, não só de números inteiros.

Os tipos de dados em C, basicamente, são:

int – que representam os números inteiros (1, 3, -9, 0, 7, 876, -1000, etc);
float – que são números “quebrados” relativamente pequenos (1.7, 8.32, -9.923, 873.9002, 500.01, etc);
double – que representam números “quebrados” grandes (1.000001, 9.28347455, -0.98374455, 98384.88001, etc);
char – que representam caracteres (a, b, i, p, ç, [espaço], ‘, ~, ð, ŧ, →, j, /, ¢, ], 4 (o caractere, não o número), }, etc);
void – que representa a ausência de qualquer que seja o tipo.

Pode anotar estas palavras aí, porque elas são palavras-chave de C (e de C++), que você terá de saber obrigatoriamente: int, float, double, char e void.
Quando você escreve um programa, certamente vai ter que usar variáveis, posições de memória, pra poder armazenar os dados que serão entrados pelo utilizador.
Quando você declara uma variável, você está reservando um espaço na memória para acomodar os valores que você pretende entrar no seu programa.

Vamos analisar o seguinte código:

01 #include <stdio.h>
02
03 int main(){
04
05 int a;
06 int b;
07 int c;
08
09 printf(“Digite o primeiro número: “);
10 scanf(“%d”,&a);
11 printf(“\nDigite o segundo número: “);
12 scanf(“%d”,&b);
13 c=a+b;
14 printf(“\nO resultado da soma é: %d”, c);
15
16 return 0;
17 }

A linha 01 você já sabe pra que serve.
A linha 03 será explicada em outro tópico, quando falarmos de funções.
Já as linha 05, 06 e 07 nos interessam diretamente. Estas linhas são as chamadas declarações de variáveis. Porque declarar uma variável? Para que seja reservado espaço na memória RAM para o seu programa usar, trabalhar. Em outras palavras, quando eu digo:

int a;

eu estou dizendo ao compilador: “por favor, senhor compilador, reserve aí um espaço na memória para que eu possa entrar um dado do tipo inteiro”! O nome da variável, também chamado de identificador, nesse caso é a. Na linha 6, é declarada uma variável, do tipo inteiro, de nome b. Na linha 7, uma variável int de nome c é declarada. Os nomes de identificadores podem ser o que você quiser, desde que atenda aos seguintes requisitos: não pode começar com um número; devem obrigatoriamente começar com uma letra ou sublinhado; os caracteres subsequentes devem ser letras, números ou sublinhados.
Observe isso:

Correto:

name
Name
Adress
nome_do_cliente
numero_da_casa

Errado:

nome!dele
codigo…postal
2ovos

Por obséquio, não use palavras acentuadas. Evite também nomes de identificadores muito longos, tanto para fins de compatibilidade quanto para não ficar uma coisa amacacada:

este_nome_de_identificador_eh_muito_logo_de_se_ler

Já não é preciso repetir que C e C++ são case sensitive, né? Isso quer dizer que Count, count e COUNT, são três nomes de identificadores completamente diferentes. Também não é preciso repetir que as palavras-chave são palavras reservadas e que não devem ser usadas como nomes de identificadores, né? Olha, se eu pelo menos sonhar que algum de vocês tentou usar uma palavra-chave como nome de identificador eu urino dentro da caixa d’água de um, viu?

Bom, continuando a análise do programa acima, entenda que esse programa serve pra somar dois números. A linha 09 imprime na tela a seguinte mensagem:

“Digite o primeiro número: “

Já a linha 10 diz pro programa esperar que o usuário digite um número inteiro e armazene este número “na variável de nome a” (na verdade, armazene na posição de memória que você reservou para o seu programa e a chamou de a). A linha 11 faz coisa parecida com a linha 9: imprime na tela:

“Digite o segundo número: “

A linha 12 espera que o utilizador do programa digite um número inteiro e dê enter para armazenar esse número na memória, exatamente no mesmo esquema da linha 9. E a linha 13? Se você for um pouco mais inteligente que os macacos da finada novela global Caras e Bocas, vai perceber que ela está dizendo que a variável inteira c será atribuida a soma dos valores de a e b. E será beeeem fácil, depois de duas explicações, descobrir que o valor da variável c será impresso na tela quando a linha 14 for executada, precedido pela mensagem

“O resultado da soma é: “.

Por enquanto, esqueça as linhas restantes. Este programa será esclarecido bem detalhadamente em outras oportunidades. Nada ficará sem explicação, pelo menos com respeito a esse programa. O que eu quero é que você atente ao conceito de variável: é uma posição de memória RAM, que é representada por uma palavra (identificador), batizada pelo programador e que é usada para receber um dado do programa e para o programa, seja por meio do teclado ou pelo próprio código, como é o caso da linha 13.
Mais: procure escolher nomes de identificadores que tenham a ver com o uso dele. Por exemplo, você não vai querer armazenar um CEP numa variável de nome idade, vai? Isso te confunde na hora de manter o programa. Tanto confunde você, quando outro desgraçado que vai ter o azar de revisar e dar manutenção no teu código. Entendido esse conceito, vamos nos aprofundar mais no assunto.
Well, você já deve ter desconfiado (ou não) que não se pode armazenar qualquer número numa variável do tipo int. O número 1, dá pra armazenar tranquilo. O 1000, também. 0 10.000, cabe numa variável do tipo int sem besteira nenhuma. Mas e se eu quisesse armazenar o número 1.000.000, por exemplo? Aí a coisa muda de figura. Teriamos que usar outros recursos pra manipular valores realmente enormes. Vejamos os limites mínimos (faixas) de cada tipo que foi citado anteriormente (estes são os tipos mais básicos da linguagem C, o resto, que eu ainda não falei, deriva destes):

char : -127 a 127
int : -32.767 a 32.767
float : seis dígitos de precisão
double : Dez dígitos de precisão

Suponha que você queira fazer um programa que some dois números, mas que você tenha certeza de que estes números não passarão de 30.000, por exemplo. Para armazenar o primeiro número você pode usar uma variável do tipo int. O mesmo vale para armazenar o segundo número, pois ambos não passam de 32.767. Mas, e o resutado? Como fica? Se eu somar 30.000 + 30.000? O resultado será 60.000! Onde eu armazeno esse número? Que tipo de variável vai comportar esse resultado? O que acontece se eu tentar armazenar o resultado dessa soma numa variável do tipo int?
Vamos começar pela resposta da última pergunta. Bom, se você tentar armazenar o valor 60.000 numa variável do tipo int, muitos erros podem ocorrer. Um deles, particularmente ,eu chamo de erro do relógio. (Não viajem: esse nome fui eu quem inventou). Imagine um relógio de ponteiros. Ele marca três horas em ponto. O que acontece se eu somar 12 horas a ele? A resposta é: NADA! Ele simplesmente girará, dará uma volta completa, até voltar exatamente a marcar três horas. E se eu somasse cinco horas às três? Aí sim, ele marcaria oito horas. E se somassemos dezesseis horas as três que estão marcando? Ele giraria uma volta completa e mais quatro horas, parando em sete horas.

Bem, caros leitores malucos, eu acho que não preciso explicar mais nada. Um dos erros mais comuns de quando você extrapola os limites de um tipo é rodar feito um relógio. No caso de ints, o resultado da soma dos números 32.767 + 2, por exemplo, é negativo, ou seja, -32.765. Se eu somar 60.000 a esse resultado, o novo resultado será 27.235. Se eu somar 10.000 a esse número, o resultado será novamente negativo: -4.468. E por aí vai. Esse é um dos erros que podem ocorrer. Podem ocorrer outros erros, vai depender da arquitetura do processador que você está usando. Portanto entendam: se vocês querem fazer um programa sem bugs (erros), querem que o programa funcione direitinho, escolham bem os tipos que você vai usar. Tipos apropriados para os dados que você pretende manipular.

Uma coisa interessante a ser falada aqui a respeito dessas faixas que eu citei acima, é que esses valores são valores mínimos. Os padrões pro C/C++. Normalmente, com essa ruma de processador irado de hoje em dia, um int, por exemplo, pode ir bem além de 32.767 (ou bem menor que 32.767) sem erros, mas não confie nisso. Escreva seus programas de maneira padrão, porque você não sabe em que bomba ele vai acabar rodando. E se for um PC da era mesozóica?
Como eu falei anteriormente, nem só de ints vive um programa. Se você precisar manipular nomes de pessoas, nomes de ruas, marcas de carro, nomes de doença ou qualquer outro dado que envolva uma sequência de caracteres, o tipo de dado básico pra isso é o char. Como você pode ver, ele tem uma largura de 8 bits (vai de -127 a 127). O que significa isso? Significa que esse tipo pode abarcar 256 caracteres diferentes. Eu já toquei nesse assunto aqui anteriormente. Falei também na tabela ASCII. Refrescando: a tabela ASCII é uma tabela de caracteres em que cada caractere é associado um número, e que vai de ZERO a 255. Veja os posts anteriores se quiser saber mais. Mais à frente aprenderemos a manipular strings de caracteres.
E se você quiser manipular dados números em ponto flutuante, ou seja, não inteiros, com casas decimais, se valha do float ou do double. O float, para números em ponto flutuante até 6 dígitos de precisão. Por exemplo: 29.090991 ou 23.8 ou 0.878204. De sete casas até dez de precisão, use o double. Exemplos de double: 90.0000000001, 870.1100000000, 0.7537257, etc. (veja os exemplos contando as casas decimais, depois não fique aí voando, sem saber do que é que eu estou falando).
Bem, galera, por hoje é só. Mas esse tópico não termina aqui. Vamos fazer a parte II de Variáveis e identificadores. Ainda tem muita coisa pra ser batida e algumas perguntas desse post ainda precisam de respostas. Ainda vou falar de float e double. Só espero que eu realmente tenha agradado neste post como eu penso que agradei. Qualquer dúvida, já sabem: postem aqui! Se eu falei alguma merda coisa errada, façam que nem o Bruno Sanches: esculhambem. Não se esqueçam que eu sou tão estudante quanto vocês.

Fiquem com Deus e um abraço a todos! 😀


Geralmente eu costumo postar uma piada aqui, mas desta vez eu queria falar sério. Como todo mundo sabe, o terremoto no Haiti acabou com a cidade de Porto Príncipe e cidades vizinhas, matou milhares de pessoas e muitas ficaram desabrigadas, feridas e sem rumo. Somente crianças, são mais de um milhão, sem pai, nem mãe, desamparadas nas ruas das cidades, com fome, sede e simplesmente sem saber a quem recorrer. NÃO EXISTE ÁGUA POTÁVEL, NEM SAÚDE, NEM HIGIENE. Não existe NADA! Só destruição. As pessoas brigam por comida nas ruas, feito animais, dos mais selvagens. Os mais fortes conseguem algo, enquanto os mais fracos ficam a mercê de alguém que os ampare. E você? Vai ficar aí parado, sabendo que poderia contribuir com algo, mas se acomoda na cadeira? O dia de amanhã, só a Deus pertence. Não sabemos da NOSSA condição no futuro. Não sabemos se um dia precisaremos de comida e água potável por meio da caridade de alguém. Não fique aí parado! Pegue JÁ o telefone, ligue pra Cruz Vermelha da sua cidade e pergunte no que pode ajudar! A vida desses miseráveis está nas nossas mãos. Pense nisso!


Copyright 2009, 2010 (C) Fabiano Bezerra de Vasconcelos – Todos os direitos reservados.

Advertisements

Posted in C/C++ | Tagged: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | 8 Comments »