No tópico anterior nós criamos um ambiente de programação C e aprendemos alguns conceitos, entre eles:
Identação: a utilização de espaços em branco para facilitar a leitura do código.
Função: uma seqüência de passos necessários para a realização de uma tarefa através do uso de outras funções e variáveis.
Variável: um espaço limitado no qual podemos armazenar valores durante a execução do nosso programa.
Função principal: em C, ela é "main(){ ... }" e nos nossos exemplos ela não recebe argumentos.
Argumento: o modo pelo qual funções trocam informações. Falaremos mais sobre ele e sobre seu irmão gêmeo, o parâmetro, em tópicos futuros.
Biblioteca: contêiner de funções e variáveis. Arquivo que nos permite usar funções e variáveis pré-escritas, por nós ou por terceiros, e nos livra da necessidade de estarmos sempre fazendo códigos repetidos.
Bloco de código: espaço de descrição de todas as operações da função, são delimitados por chaves.
String: cadeia de caractéres. Também traduzido como literal, cordão, corda e muitas vezes chamado de vetor de caractéres. É uma seqüência de símbolos tipográficos envoltos por aspas duplas.
Comentário: modo de escrever informações no código fonte do programa sem alterar a lógica algorítmica. Em ANSI C é todo código escrito entre /* e */.
Uhu, vimos muita coisa em tão breve tópico, não é mesmo? Com certeza, lá ainda existe muita mais coisas que ainda não somos capazes de ver!
Mas chega de papo, :D
Iniciando - As Seqüências de Escape
No nosso Hello World escrevemos o seguinte código:
printf("hello, world\n");
Nós já sabemos que a função printf recebe uma string como argumento e a exibe na tela. Mas o leitor atento já perbeu que a seqüência "\n" não é mostrada na tela.
Ela é a notação do carecter de nova linha (newline character), o qual quando exibido efetua uma quebra de linha e posiciona o cursor no canto esquerdo da nova linha.
Para entender a sua importância veja o código abaixo.
#include <stdio.h>
main(){
printf("H");
printf("e");
printf("l");
printf("l");
printf("o");
printf(",");
printf(" ");
printf("world");
printf("\n");
}
O código acima produz uma saída idêntica ao do nosso primeiro exemplo e só há quegra de linha na saída quando utilizamos o \n.
Indo mais fundo, o \n representa apenas um caractere de saída. Ele faz parte das seqüências de escape (escape sequence), que são simples mecanismo de texto ou simples caractéres invisíveis.
Dentro de uma string as seqüências de escape possuem as seguintes funções:
\a - Alerta, um bip (bell character*)
\b - backspace
\f - Nova Página (formfeed**)
\n - Nova Linha (newline)
\r - Retorno do Carro(carriage return)***
\t - Tabulação Horizontal****
\v - Tabulação Vertical****
\0 - Caracter Nulo, Fim de Vetor
\\ - Exibe \ (backslash)
\? - Exibe ? (question mark*****)
\' - Exibe Aspas Simples
\" - Exibe Aspas Duplas
\000 - Exibe Número Octal("0" varia de 0 a 7)
\xhh - Exibe Número Hexadecimal("h" varia de 0 a F)
* Usando o Windows 7 e Code::Blocks MinGW as caixas de som emitiram um bip;
** Form feed não funciona no prompt de comando, mas deve funcionar em impressoras;
*** Volta para o início da linha, não é criada uma nova linha;
**** É um pouco difícil domá-los de modo a fazer a saída bem formatada;
***** Foi criado para manter compatilidade em ambientes Unix, onde "?" tem outra utilização na shell;
Veja em: http://www.grymoire.com/Unix/Quote.html
Iniciando - Variáveis e Expressões Matemáticas
O próximo programa usa a fórmula °C=(5/9)(°F-32) para exibir temperaturas em graus Celsius e Fahrenheit.
#include <stdio.h>
main() {
int celsius;
int fahrenheit;
int temperatura_baixa, temperatura_alta;
temperatura_baixa = 0;
temperatura_alta = 150;
fahrenheit = temperatura_baixa;
celsius = 5 * (fahrenheit - 32) / 9;
printf("%d F \t = \t %d C \n", fahrenheit, celsius);
fahrenheit = temperatura_alta;
celsius = 5 * (fahrenheit - 32) / 9;
printf("%d F \t = \t %d C \n", fahrenheit, celsius);
}
O mesmo código, porém, comentado.
/* Exibir uma tabela
Fahrenheit-Celsius */
#include <stdio.h>
main() {
/* Podemos declarar variaváveis um a um*/
int celsius;
int fahrenheit;
/* Ou várias ao mesmo tempo, separando-as por vírgula*/
int temperatura_baixa, temperatura_alta;
/* As declarações acima determinaram a criação de 4
espaços de memória para o armazenamento de números
inteiros e com seus respectivos nomes: celsius,
fahrenheit... */
temperatura_baixa = 0;
/* Acima fizemos a atribuição do valor 0 */
temperatura_alta = 150;
/* Acima fizemos a atribuição do valor 150 */
fahrenheit = temperatura_baixa;
/* Acima fizemos a atribuição do valor armazenado
no espaço de inteiros chamado temperatura_baixa
e o armezenamos em outro espaço de memória que
também foi destinado a inteiros mas agora chamado
de fahrenheit. */
celsius = 5 * (fahrenheit - 32) / 9;
/* Acima a variável celsius passou a guardar o
resultado da expressão matemática acima, ou seja,
a conversão de fahrenhei em celsius. */
printf("%d F \t = \t %d C \n", fahrenheit, celsius);
/* Exibe a seguinte mensagem:
0 F = -17 C
No futuro discutiremos o uso de %d */
fahrenheit = temperatura_alta;
celsius = 5 * (fahrenheit - 32) / 9;
printf("%d F \t = \t %d C \n", fahrenheit, celsius);
}
Atenção: além da identação outro recurso que facilita o entendimento do código é a utilização de comentários. A medida que nos programas se tornarem maiores e principalmente quando for necessário rever um código que fizemos no mês passado ou antes, ficará claro a importância de ambos.
Os comentários em ANSI C são quaisquer caracteres entre /* e */, e seu conteúdo é ignorado pelo compilador. Em C++ podemos usar "//" para fazermos comentários de uma única linha. Novamente, a utilidade de um comentário é a de tornar o código mais compriensível. Veja o código abaixo.
/* Demostração de uso de comentários do C++ */
// O que é escrito na mesma linha
// após o uso do // é complemtamente
// ignorado pelo compilador.
int c; // armazena graus Celsius
int f; // armazena graus Fahrenheit
int k; // armazena graus Kelvin
Até aqui fizemos uso de números inteiros, strings, funções e expressões matemáticas. Mas e os números reais? Eu posso fazer minhas próprias funções? Como representar expressões matemáticas maiores?
Começaremos pelos tipos primitivos de dados.
Tipos Primitivos
Quando você digita "int i" está dizendo que a variável i é do tipo inteiro. Caso digite "float f" estará criando um número de ponto flutuante (floating point) que em português é número real.
Eu poderia fazer uma lista dos intervalos numéricos suportados por cada tipo de dado em C, porém, no presente estágio de desenvolvimento tal lista poderia nos induzir ao erro. É melhor entender, vejamos.
Caso usemos um compilador para C em MS-DOS Real, neste caso um número inteiro será de 16-bits e por isso guardará um valor entre -32.768 e +32.767.
Porém, se utilizarmos um compilador C para MS-Windows 32-bits, um número inteiro será de 32-bits e portanto guardará um valor entre -2.147.483.648 e +2.147.483.647.
Agora, num universo 64-bits, onde tanto o Sistema Operacional quanto o compilador seja 64-bits, um número inteiro terá 64-bits e por isso guardará um valor entre -9.223.372.036.854.775.808 e +9.223.372.036.854.775.807.
Por isso, prefiro não fazer tal tabela. No futuro aprenderemos como descobrir o limite possível de armazenamento de cada tipo de dado através de programação, sem usarmos tabelas. Tenha paciência, :D
Tabela de tipos primitivos em ANSI C*
char 'a', armezena um caractere
int 10, armazena um número inteiro
float 5.5, armezana um tipo real
double 0.5, armazena um tipo real grande
* &, armazena endereços de variáveis
Tabela de qualificadores de tipo
signed armazena valores sinal de + e -
unsigned armazena valores sem sinal
short armazena valores menores
long armazena valores maiores
const armazena valores constantes, imutáveis
volatile não sei ainda pra que serve :D
* Alguns podem estar curiosos em relação ao uso da expressão ANSI C. Isso tem a ver com a fabricação de compiladores.
Pode parecer confuso, mas nós criamos uma linguagem de programação no papel, ou em nossa mente, e só depois a implementamos. Ou seja, só depois criamos um programa capaz de converter o código da linguagem que invetamos em linguagem de máquina - na linguagem que seu computador entender.
Este programa capaz de converter códigos humanamente compreensívveis em linguagem de máquina é chamado compilador. Ok, alguns seres humanos compreendem código de máquina, mas eu não tenho tanta certeza se eles são realmente humanos :D
Um código, ou um compilador, ser ANSI C significa que ele respeita todas as regras determinas pela American National Standards Institute (ANSI) para se escrever código em C. =]
abraços
Nenhum comentário:
Postar um comentário