Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
SEM0543 – Organização de Dados em Computadores Estruturas de dados Linguagem C - Introdução 3 Tipos básicos (primitivos) de dados As linguagens de programação de alto nível, a exemplo da linguagem C, definem alguns tipos básicos de dados, que representam, principalmente números e caracteres. Existem poucos tipos básicos em C: char – um byte, utilizado para representar um caractere (ASCII); int – 32 bits (ou 16, de acordo com a plataforma), representa um número inteiro; float – 32 bits, utilizado para ponto flutuante com precisão simples; double – 64 bits, utilizado para ponto flutuante com precisão dupla. tipo bit bytes escala char 8 1 -128 a 127 int 16 2 -32768 a 32767 float 32 4 3.4E-38 a 3.4E+38 double 64 8 1.7E-308 a 1.7E+308 void 0 0 sem valor 4 Tipos básicos (primitivos) de dados O tipo inteiro pode ter variações de tamanho: short (ou short int) – inteiro com tamanho mínimo de 16 bits; long (ou long int) – inteiro com tamanho mínimo de 32 bits. Os tipos inteiros e o char ainda podem representar dados com, ou sem, sinal: signed – inteiro, ou char, com sinal. Ex.: signed char – faixa de valores de -128 a 127 unsigned – inteiro, ou char, sem sinal. Ex.: unsigned char – vai de 0 a 255 5 Tipos básicos (primitivos) de dados O operador sizeof fornece o número de bytes de um tipo (ou representado pelo nome de uma variável declarada como). Exemplo: exibir em tela a quantidade de bytes do tipo char: código significado %d decimal %f ponto flutuante %c caracter simples %s cadeia de caracter %e notação científica %o octal %u decimal sem sinal %x hexadecimal %ld decimal longo %lf ponto flutuante longo printf("Tamanho, em bytes, do tipo char %d\n", sizeof(char)); 6 Tipos e variáveis Variáveis guardam a referência (endereço na memória) de campos de dados. Para a correta interpretação do campo, a variável deve ser associada (declarada) a um tipo. Exemplos: declaração de duas variáveis de nomes i e c, e de respectivos tipos int e char. int i; char c; Serão reservadas quantidades de memória do tamanho de cada tipo declarado. O endereço do primeiro byte (referência) de cada área na memória é associado ao nome da variável. 7 Programa Exemplo Escrever um programa na LP C para imprimir a tabela de conversão da temperatura de graus Fahrenheit para graus Celsius, utilizando a seguinte fórmula C=(5/9)(F-32) F C 0 -17.8 20 -6.7 40 4.4 60 15.6 … 300 148.9 ALGORITMO 8 Programa Exemplo Escrever um programa na LP C para imprimir a tabela de conversão da temperatura de graus Fahrenheit para graus Celsius, utilizando a fórmula C=(5/9)(F-32) F C 0 -17.8 20 -6.7 40 4.4 60 15.6 … 300 148.9 /*programa para conversao de temperatura*/ #include <stdio.h> void main() { int inicio, fim, incr; float fahr, celsius; inicio=0; fim=300; incr=20; fahr=(float)inicio; while (fahr<=fim) { celsius=(5./9.*(fahr-32.)); printf("%4.0f | %6.1f\n",fahr,celsius); fahr=fahr+incr; } } 9 Vetores (Arrays) Arrays são conjuntos (arranjos) de elementos de um mesmo tipo. Um array tem tamanho fixo e é definido em sua declaração ou quando da primeira atribuição de valor à variável do tipo array. Exemplo: declaração de um array de números inteiros, com 100 posições na memória. int a[100]; As 100 posições são alocadas seqüencialmente na memória e pode-se utilizar um índice para acesso a cada um de seus valores. Exemplos: a[0] indica o primeiro elemento do array, enquanto a[99] indica o último. O tamanho de um array pode ser indicado pelo conjunto de elementos atribuídos. Exemplo: criará um array de 10 posições na memória. int numeros[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; O seguinte laço fará a exibição dos elementos em tela: int i; for (i=0; i<10; i++) printf("numeros[%d]: %d\n", i, numeros[i]); 10 Matrizes Matrizes, em C, são representadas por arrays com mais de uma dimensão. Exemplo: declaração de uma matriz 4X5, contendo 20 posições com números inteiros int m[4][5]; Exemplo: declaração e atribuição de valores para uma matriz 2X3 int matriz[2][3] = { {1, 2, 3} , {4, 5, 6} }; 11 Ponteiros Um ponteiro é um tipo de variável especial que armazena o endereço de um campo de dados. É declarado com a prefixação do caracter * antes do nome da variável (que pode ser um tipo básico ou estruturado). Exemplo: declaração de uma variável ponteiro para um inteiro. int *p; O endereço é armazenado na variável e pode ser recuperado, obtendo- se o valor de p: printf(“Endereço para onde p aponta: %d\n”, p); O operador & antes do nome de uma variável fornece o seu endereço na memória, sendo assim: printf("Endereço de p: %d\n", &p); O operador * antes de um ponteiro indica o campo que aponta: int i = 10; p = &i; printf("Valor do campo apontado por p: %d\n", *p); /*exibirá o valor 10 */ 12 Ponteiros (cont.) Exemplo: seqüência de operações com ponteiro int x = 1, y = 2, z[10] = {1,2,3,4,5,6,7,8,9,10}; int *ip; /* ip é um ponteiro para int */ ip = &x; /* ip agora aponta para x */ y = *ip; /* y agora é 1 */ *ip = 0; /* x agora é 0 */ ip = &z[0]; /* ip agora aponta para z[0] */ Pode-se percorrer as posições do array z incrementando-se o ponteiro ip. printf("%d", *(++ip)); /* exibirá o elemento z[1] */ 13 Ponteiros (cont.) Ponteiros são especialmente úteis na passagem de argumentos por referência entre funções. Dessa forma, é possível passar a referência de uma variável local de uma função, cujo endereço pode ser acessado pela função chamada (evita-se o uso de variáveis globais). Exemplo: função que troca os valores de duas variáveis na memória void troca(int *px, int *py); Que pode ser chamada no procedimento de origem na forma: troca(&x, &y); / *x e y são as variáveis inteiras em questão */ 14 Ponteiros (cont.) Strings em C são representadas como uma seqüência de caracteres na memória, terminada pelo caractere '\0'. Para declaração de uma string, usa-se a referência do endereço do primeiro caractere em um ponteiro para char. Exemplo: char *c = “Hello World”; printf("%s\n", c); /* imprimirá todos os caracteres a partir do endereço apontado por c até '\0„ */ 15 Passagem de vetores como parâmetro Faça um procedimento na LP (C) que tenha como parâmetros, um vetor, e os índices n, m, e que realize a seguinte soma: m ni ivs ][ Construa um programa que utilize o procedimento anterior. 16 Passagem de vetores como parâmetro: Procedimento na LP C double sum(a,n,m) /*somatorio de um vetor v[n..m]*/ double *a; int n,m; // faixa do vetor { int i; double s=0.; for (i=n;i<=m;++i) s+=a[i]; return(s); } 17 Programa: Solução 1 -Uso de ponteiro constante #include <stdio.h> #define NMAX 10 void main() { double v[NMAX]; int i; for (i=0; i<NMAX; ++i) /* inicializacao do vetor */ v[i]=i; printf("Soma: %g\n",sum(v,0,NMAX-1)); } 18 Programa: Solução 2 - Uso de ponteiro variável #include <malloc.h> #include <stdio.h> #define NMAX 10 void main() { double *v; int i; v=aloca_dvetor(0,NMAX-1); for (i=0; i<NMAX; ++i) /* inicializacao do vetor */ v[i]=i; printf("Soma: %g\n",sum(v,0,NMAX-1)); libera_dvetor(v,0,NMAX-1); } 19 Funções de Alocação de Vetor double *aloca_dvetor(n,m) int n,m; /*aloca um double vetor na faixa [n..m]*/ { double *v; v=(double *)malloc((unsigned)(m-n+1)*sizeof(double)); if(!v)printf("Erro na alocacao do vetor\n"); return v-n; } void libera_dvetor(v,n,m) double *v; int n,m; /*desaloca um double vetor alocado com a funcao dvetor.*/ { free((char*)(v+n)); }