Anúncio
Anúncio

Mais conteúdo relacionado

Anúncio

Linguagem c

  1. Treinamento em Desenvolvimento de Aplicativos para Sistemas Embarcados Linguagem C Linguagem C 1
  2. Bibliografia • Shildt, Herbert , C Completo e Total, Editora Linguagem C Makron Books, 3ªedição, São Paulo, 1997. • Manzano, José augusto, Estudo Dirigido de Linguagem C, Editora Érika, São Paulo, 1997. 2
  3. Ementa • Introdução Linguagem C • Operadores e Expressões • Funções de E/S • Estruturas de Controle • Vetores e Matrizes • Strings • Ponteiros • Funções • Estruturas • Alocação Dinâmica de Memória • Arquivos 3
  4. Introdução • Histórico Linguagem C • C é resultado de um processo iniciado com a linguagem BCPL. BCPL influenciou a linguagem de nome B, que evoluiu posteriormente para C. • Projetada em 1972, nos laboratórios da BELL (empresa de desenvolvimento de software básico), por Brian Kerninghan e Dennis Ritchie para o UNIX do PDP-11. • A simplicidade de sua implementação permitiu a extensão da linguagem e a criação de compila- dores C para praticamente todas as plataformas de hardware e sistemas operacionais. • Em 1983 estabeleceu-se o padrão ANSI. 4
  5. Introdução • Características Linguagem C • Portabilidade • Linguagem estruturada e modular • Geração de código eficiente • Simplicidade • Possui apenas 32 palavras chaves • Uso de biblioteca de funções que implementam os recursos de alto nível para o programador • Linguagem de médio nível • Combina facilidades de uma linguagem de alto nível com a versatilidade e potencialidade do Assembly. • Não efetua verificações em tempo de execução. 5
  6. Introdução • Aplicação Linguagem C – Sistemas Operacionais – Compiladores – Planilhas Eletrônicas – Editores de Texto – Banco de Dados 6
  7. Introdução • Linguagem de máquina: única linguagem que o computador entende, ou seja, que pode ser Linguagem C diretamente executada pelo hardware. Ela é formada por códigos binários que representam as instruções e dados. Tem uso difícil e tedioso. Pode-se dizer que, para se programar em linguagem de máquina é necessário um amplo conhecimento do hardware utilizado. • Linguagem de alto nível: conjunto de instruções mais compatíveis com a linguagem humana e com o modo do ser humano pensar. Estas linguagens, na sua maioria, são de uso genérico e não é necessário ter conhecimento do hardware utilizado. 7
  8. Introdução • Todo programa escrito em linguagem de alto nível é chamado de programa-fonte ou código fonte. Linguagem C • O programa em linguagem de máquina, escrito ou resultante, é chamado de programa-objeto ou código objeto. • Todo o programa-fonte, para ser executado, deve obrigatoriamente, de alguma forma, ser traduzido para programa-objeto. Neste momento é que são utilizados os compiladores e/ou interpretadores. 8
  9. Introdução •Interpretador: lê o código-fonte linha-a-linha, Linguagem C faz uma consistência de sua sintaxe e se não houver erro, converte-a para linguagem de máquina para executá-la. Este processo é realizado até que a última linha seja executada ou a consistência apresente algum erro. O interpretador precisa estar presente todas as vezes que vamos executar o nosso programa e o trabalho de checagem da sintaxe deverá ser repetido. 9
  10. Introdução • Compilador: lê o programa inteiro, faz uma consistência de sua sintaxe e se não houver erro, Linguagem C gera o código-objeto em disco com a extensão .OBJ. Este programa não pode ser executado até que sejam agregadas a ele rotinas em linguagem de máquina (biblioteca da linguagem) que lhe permitirão a sua execução. Este trabalho é feito por um programa chamado linkeditor, que cria o código- executável final em disco com a extensão .EXE. Neste momento não é mais necessária a presença do compilador, pois todo o programa já esta traduzido para linguagem de máquina e armazenado em disco, basta rodá-lo. 10
  11. Introdução • C é uma linguagem compilada Linguagem C Executável Fontes C Compilação Ligação + Arquivos OBJ Bibliotecas 11
  12. Estrutura de um programa em C • Declaração das bibliotecas de funções (#include) Linguagem C • Declarações de constantes e seus valores (#define) • Declaração das variáveis globais (públicas) • Declaração das funções • Única função obrigatória e primeira a ser executada é a função main() • O corpo das funções fica entre { } main() /* função obrigatória */ { printf(“Hello World”); } 12
  13. Estrutura de um programa em C /* declaração dos arquivos de cabeçalho e definições */ #include <stdio.h> Linguagem C #define PI 3.1415 /* definição das variáveis globais */ /* função principal do programa */ void main() { /* definição das variáveis locais */ printf (“Hello World”); } 13
  14. Mapa de Memória Linguagem C Pilha Heap Variáveis Globais Código do Programa 14
  15. Tipos básicos de dados TIPO BITs BYTEs DESCRIÇÃO DOMÍNIO Linguagem C void 0 0 sem argumento e não retorna Sem valor valor char 8 1 caractere isolado -128 a 127 int 16 2 valor inteiro -32.768 a 32.767 float 32 4 número ponto-flutuante (no 3.4E-38 a 3.4E+38 contendo um ponto decimal e/ou um expoente) double 64 8 número ponto-flutuante de 1.7E-308 a dupla precisão (mais 1.7E+308 algarismos significativos e um expoente que pode ter mais magnitude) 15
  16. Modificadores de tipos básicos signed char  -128 a 127 Linguagem C signed int  -32.768 a 32.767 unsigned char  0 a 255 unsigned int  0 a 65.535 short int = int  -32.768 a 32.767 unsigned short int = unsigned int  0 a 65.535 long int  -2.147.483.648 a 2.147.483.647 (quatro bytes) unsigned long int  0 a 4.294.967.295 long float = double (padrão ANSI) long double  dez dígitos de precisão (≅ 80 bits) 16
  17. Identificadores Identificadores são os nomes das variáreis, Linguagem C funções, rótulos e outros objetos definidos pelo usuário. • O primeiro caracter deve ser uma letra ou sublinhado • Apenas os 32 primeiros caracteres são significativos • É case sensitive, ou seja, maiúsculas se diferem das minúsculas • int x; /* é diferente de int X; */ • As instruções terminam com “;” • Comentários devem ficar entre /* e */ • Palavras-chave são minúsculas 17
  18. Declaração int i; Linguagem C float f; unsigned int inteiro_sem_sinal; char ch; double balanco, lucro, prejuizo; int i, j, k; int _exemplo_de_um_nome_longo; long int A5k; 18
  19. Primeiro Programa 1. Use o IDE Dev C++ para editar, Linguagem C compilar, linkar e executar o programa Hello.c 2. Qual o tamanho dos arquivos C, OBJ e EXE do programa Hello.c ? 3. Que conclusões você tira da resposta da questão 2? 19
  20. Ementa • Introdução Linguagem C • Operadores e Expressões • Funções de E/S • Estruturas de Controle • Vetores e Matrizes • Strings • Ponteiros • Funções • Estruturas • Alocação Dinâmica de Memória • Arquivos 20
  21. Operadores • Operador de Atribuição Linguagem C • Em C o operador de atribuição é o sinal de igual “=”. • É erro comum em programadores iniciantes confundir o “=” com o operador relacional de igualdade “==”. • Exemplos: a = 1; delta = b * b – 4 * a * c; i = j; • O operando esquerdo deve ser um identificador de variável, isto é, não pode ser uma constante ou expressão. São atribuições inválidas: 1 = a; // constante! b + 1 = a; // expressão! 21
  22. Conversões de tipos • Se os dois operandos de uma atribuição não são do mesmo tipo, o valor da expressão ou operador da direita Linguagem C será convertido para o tipo do identificador da esquerda. • Exemplo 1: int i; float r; i = 5; // valor de i: 5 r = i; // valor de r: 5.0 • Exemplo 2: int i; float r = 654.321; i = r; // i será truncado para 654 22
  23. Conversões de tipos • Pode-se dizer que as conversões potencialmente perigo- Linguagem C sas (onde há possibilidade de perda de informação) são: char  int  float  double • Observe que o compilador C ao encontrar esta operação não gera nenhum aviso de atenção para o programador. Assim este detalhe pode gerar um erro de programação (bug) que passe desapercebido ao programador inexperiente. É possível dizer que a linguagem C possui tipos ”macios” (soft types) pois a operação com variáveis de tipos diferentes é perfeitamente possível. Esta característica do C se contrapõe a algumas linguagens em que isto não é possível. Estas linguagens possuem tipos “duros” (hard types). 23
  24. Operadores • Atribuição Múltipla Linguagem C É possível atribuir um valor a muitas variáveis em uma única instrução. int i, j, k; double max, min; i = j = k = 1; max = min = 0.0; • Operadores Aritméticos Operador Operação + adição - subtração * multiplicação / divisão % módulo (resto da divisão inteira) 24
  25. Conversão de tipo (casting) • O operador cast permite forçar uma expressão a ser de determinado tipo: Linguagem C int num; float valor = 13.0; num = valor % 2; // inválido num =(int) valor % 2; // válido A conversão de tipo é usada para que o dado armazenado em valor fosse transformado no tipo int assim a operação módulo pode ser efetuada. • Regra geral de conversão de tipos: char  int  float  double 25
  26. Incremento/Decremento Utilizados para incrementar e/ou decrementar em uma unidade o valor de uma variável. Eles podem ser Linguagem C utilizados antes (prefixo) ou após (posfixo) a variável, dando resultados ligeiramente diferentes. Ex.: Y = X ++; “Y recebe o valor de X e depois X é incrementado” Y = X --; “Y recebe o valor de X e depois X é decrementado” Y = ++ X; “X é incrementado e depois Y recebe o valor de X” Y = -- X; “X é decrementado e depois Y recebe o valor de X” 26
  27. Operadores Relacionais • As expressões compostas com operadores Linguagem C relacionais comparam dois valores e retornam 0 em caso de expressões falsas e 1 se forem verdadeiras. Operador Operação < Menor que > Maior que <= Menor que ou igual a >= Maior que ou igual a == Igual a != Diferente de 27
  28. Operadores Lógicos • Os operadores lógicos comparam duas expressões Linguagem C e retornam o valor 0 (falso) ou 1 (verdadeiro). Operador Operação && AND (E) || OR (OU) ! NOT (NÃO) • O operador unário ! tem maior precedência, seguido do operador E lógico. O operador OU lógico tem a menor precedência dentre os operadores lógicos. 28
  29. Operadores Bit a Bit • Os operadores de bit só podem ser Linguagem C utilizados com valores do tipo caracter ou inteiro. Operador Operação << Deslocamento à esquerda >> Deslocamento à direita & E bit a bit | OU bit a bit ^ XOU bit a bit ~ Não bit a bit (complemento de um) 29
  30. Operadores Bit a Bit Ex.: a = 15 0 0 0 0 1 1 1 1 Linguagem C a << 1 0 0 0 1 1 1 1 0 a >> 3 0 0 0 0 0 0 1 1 Ex.: a = 15 0 0 0 0 1 1 1 1 b = 56 0 0 1 1 1 0 0 0 a&b 0 0 0 0 1 0 0 0 a|b 0 0 1 1 1 1 1 1 a^b 0 0 1 1 0 1 1 1 30
  31. Operador Condicional (Ternário) • O operador condicional (ou ternário) consiste de um Linguagem C ponto de interrogação (?) e um dois pontos (:) usados juntos e requer três operandos. V resultado = modo > 0 ? 1 : 0; F a variável resultado receberá valor 1 se modo for maior que 0, caso contrário receberá 0. 31
  32. Expressões Reduzidas Expressão normal Expressão reduzida Linguagem C soma = soma + cont; soma += cont; d = d – 3; d-= 3; y = y * (z+1); y*= z+1; i = i / j; i/= j; a = a & b; a &= b; a = a << 3; a <<= 3; 32
  33. Precedência dos Operadores Maior ( ) [ ] -> ! ~ ++ -- - (tipo) * & sizeof Linguagem C * / % + - << >> < <= > >= == != & ^ | && || ?: = += -= *= /= etc. Menor , 33
  34. Problemas 1. Escreva quatro instruções diferentes em C, cada uma subtraindo 1 da variável n. Linguagem C 2. Escreva um bloco de código C que tem o mesmo efeito da instrução n = 100 + m++; sem utilizar o operador de pós-incremento 3. Escreva um bloco de código C que tem o mesmo efeito da instrução n = 100 + ++m; sem utilizar o operador de pré-incremento 4. Escreva uma instrução única em C que subtraia de z a soma de x e y e depois incremente y. 5. Se m=5 e n=2, quais serão os valores de m e n após cada uma das expressões: a. m *= n++; b. m += --n; Instituto CERTI Amazônia. Treinamento para Sistemas Embarcados 34
  35. Ementa • Introdução Linguagem C • Operadores e Expressões • Funções de E/S • Estruturas de Controle • Vetores e Matrizes • Strings • Ponteiros • Funções • Estruturas • Alocação Dinâmica de Memória • Arquivos 35
  36. E/S pelo console FUNÇÃO printf(): Linguagem C A função printf() é utilizada para escrever na tela. O protótipo desta função está descrito no arquivo de cabeçalho <stdio.h>. printf("string de controle", lista de argumentos); A string de controle contém caracteres que serão exibidos na tela, comandos de formatação que dizem a printf() como exibir os argumentos restantes ou ambos. Quando encontra um comando de formatação, a função liga os comandos aos argumentos. 36
  37. E/S pelo console Código Significado %d Exibe um inteiro no formato decimal com Linguagem C sinal %uExibe um inteiro no formato decimal sem sinal %f Exibe um tipo float no formato decimal %c Exibe um caractere %s Exibe uma string %oExibe um número octal sem sinal %x Exibe um número hexadecimal sem sinal (letras minúsculas) %X Exibe um número hexadecimal sem sinal (letras maiúsculas) 37
  38. E/S pelo console Exemplos: printf("%s %d", "Esta é uma string ", 100); Linguagem C exibe: Esta é uma string 100 printf("esta é uma string %d", 100); exibe: esta é uma string 100 printf("o número %d é decimal, %f é ponto flutuante.",10, 110.79); exibe: o número 10 é decimal, 110.79 é ponto flutuante. printf("%s", "Alôn"); exibe: Alô e avança uma linha printf(“%c, %d”,65,”C”); exibe: A, 67 38
  39. E/S pelo console FUNÇÃO scanf(): Linguagem C A função scanf() é utilizada para leitura de dados pelo teclado. O protótipo desta função está descrito no arquivo de cabeçalho <stdio.h>. scanf("string de controle", lista de argumentos); A string de controle determina como os valores são lidos para as variáveis apontadas na lista de argumentos. Todas as leituras devem ser finalizadas por <ENTER>. A lista de argumento deve conter os endereços das variáveis a que devem ser atribuídos os valores. 39
  40. E/S pelo console Exemplos: #include <stdio.h> Linguagem C main(){ int idade; printf(“Digite um número: ”); scanf(“%d”, &idade); printf ("nA minha idade é %d", idade) ; } #include <stdio.h> main(){ int pes; float metros; printf("Informe o número de pes: "); scanf("%d", &pes); metros = pes * 0.3048; printf("n%d pés é %f metros", pes, metros); 40 }
  41. E/S pelo console Instruções Descrição Linguagem C getchar() lê um caracter do teclado aguardando <Enter> getche() lê um caracter do teclado e prossegue getch() lê um caracter sem eco na tela e prossegue putchar() escreve um caracter na tela gets() lê uma string do teclado puts() escreve uma string na tela 41
  42. E/S pelo console Exemplos: #include <stdio.h> Linguagem C main(){ char ch; ch=getchar(); putchar(ch); } Comando printf() Resultado (“%-5.2f”, 123.234) 123.23 (“%5.2f”, 3.234) 3.23 (“%10s”, “alo”) alo (“%-10s”, “alo”) alo (“%5.7s”, “123456789”) 1234567 (“%04d”, 21) 0021 42
  43. Exercícios 1. Utilize o operador sizeof para exibir quanto Linguagem C espaço em bytes ocupa cada um dos tipos básicos de C (char, int, float e double). 2. Leia uma temperatura em graus Centígrados e apresentá-la convertida em graus Fahrenheit. A fórmula de conversão é: F = (9 * C + 160) / 5. Exiba o resultado com 3 casas decimais. 3. Faça um programa que leia um caractere e exiba seu código ASCII equivalente. 4. Leia e exiba uma string com seu nome completo usando a função scanf(). Qual o resultado obtido? Justifique. 43
  44. Ementa • Introdução Linguagem C • Operadores e Expressões • Funções de E/S • Estruturas de Controle • Vetores e Matrizes • Strings • Ponteiros • Funções • Estruturas • Alocação Dinâmica de Memória • Arquivos 44
  45. Estruturas de Controle • Governam o fluxo de execução do Linguagem C programa. Se dividem em três categorias: – Desvios Condicionais: if, operador ternário (?:) e switch. – Loop: while(), do-while(), for() e os comandos continue e break. – Desvio Incondicional: goto. 45
  46. if Sintaxe: if (expressão) comando; Linguagem C else comando; onde, comando poder ser um único, um bloco de comandos e, neste caso, usa-se os delimitadores de bloco de comandos ( { } ) ou nenhum comando. A cláusula else é opcional. V if (expressão) comando; F else comando; próximo comando; 46
  47. if Exemplo: Linguagem C main() { int a, b; printf(“Digite dois números”); scanf(“%d,%d”,&a,&b); if (b) printf(“%fn”,(float)a/b); else printf(“divisão por zeron”); } 47
  48. if aninhados Ocorre quando um comando if é um objeto de um Linguagem C outro if ou else. Sintaxe exemplo: if ( i ) { if ( k ) comando1; if ( j ) comando2; else comando3; } else comando4; 48
  49. if – else - if Sintaxe exemplo: if (expressão) comando; Linguagem C else if (expressão) comando; else if (expressão) comando; else if (expressão) comando; else comando; Neste caso, as expressões são avaliadas de cima para baixo. Assim que uma expressão for diferente de zero (verdadeira), o comando associado a ela é executado e a estrutura encerrada. Se nenhuma expressão for verdadeira, será executado o comando associado ao último else e, se ele não for declarado, nenhum comando será executado. 49
  50. if – else - if main(){ Linguagem C int magico, adivinhacao; randomize(); magico= random(10); printf(“ADIVINHE: ”); scanf(“%d”,&adivinhacao); if (adivinhacao == magico){ printf(“ACERTOU”); printf(“%d é o número mágicon”, magico); } else if (adivinhacao > magico) printf(“—errado– muito alton’); else (“—errado– muito baixon’);} 50
  51. Operador Ternário main(){ Linguagem C int x = 3, y = 7, max; max = (x>y)?1:0; printf(“max = %dn”,max); } 51
  52. switch O comando de seleção switch é utilizado em caso de seleção múltipla. Ele testa o valor de uma expressão contra uma lista de constantes inteiras ou caracter. Quando o valor é igual, os comandos associados àquela Linguagem C constante são executados. Se nenhuma coincidência for encontrada os comandos de default são executados. switch(expressão) { case constante1: comandos; break; case constante2: comandos; break; . default: comandos; } 52
  53. switch O comando break causa a saída imediata do switch. Se não existir um comando break seguindo os comandos de um case, o programa segue executando os comandos dos cases abaixo. Exemplo: Linguagem C void main() { int dia; clrscr(); printf(“Digite um dia da semana: “); scanf(“%d”,&dia); switch(dia) { case 1: printf(“nDomingon”); break; case 2: printf(“nSegundan”); break; . case 7: printf(“nSábadon”); break; default: printf(“nNúmero inválido!!!n”); }} 53
  54. Comandos de repetição O comando de repetição é utilizado nos casos Linguagem C em que queremos repetir determinados comandos. Laço for Sintaxe: for(inicialização;condição;incremento) comando; ou for(inicialização;condição;incremento) { comandos; } 54
  55. for Inicialização: é geralmente uma atribuição Linguagem C que determina o valor inicial da variável de controle. Esta declaração pode ser feita antes do laço e, desta forma, não necessita ser declarada no escopo do comando. Condição: é uma expressão que determina o final do laço ou o valor final da variável de controle. Incremento: define como a variável de controle do laço varia cada vez que o laço é repetido. 55
  56. for Exemplo: int x; for(x=1;x<=100;x++) printf(“%d”,x); Linguagem C for(x=100;x!=65;x-=5) { z=x*x; printf(“o quadrado de %d é %f”,x,z); } O laço infinito: for( ; ; ) printf(“este laço é infiniton”); ch=”0”; for( ; ; ){ ch=getchar(); if (ch==”A”) break;  o comando break causa o término imediato do laço } printf(“Você digitou A”); 56
  57. while Sintaxe: while(condição) comando; Linguagem C ou while(condição) { comandos; } A condição pode ser qualquer expressão, e verdadeiro é qualquer valor não-zero. Quando a condição é falsa, o controle do programa passa para o primeiro comando após o bloco de código do comando while. 57
  58. while Exemplo: void main(){ int t=1, dia; Linguagem C while(t) { printf(“Digite um dia da semana, ou <99> para encerrar: “); scanf(“%d”,&dia); switch(dia) { case 1: printf(“nDomingon”); break; . case 7: printf(“nSábadon”); break; case 99: printf(“nEncerrandon”); t=0; break; default: printf(“nNúmero inválido!!!n”); } /* fim switch*/ } /* fim while */ } /* fim main() */ 58
  59. do-while Ao contrário dos laços for e while, que testam as Linguagem C condições no início, o do-while testa a condição no final. Este laço sempre será executado pelo menos uma vez e repete até que a condição se torne falsa. Sintaxe: do { comando } while (condição); Exemplo: do { scanf(“%d”,&num); }while(num!=99); 59
  60. Comandos de desvio São utilizados para realizar desvios dentro de um Linguagem C programa. • break: O comando break tem duas finalidades. A primeira é de terminar um case num comando switch e a segunda é de forçar o término imediato de um laço de repetição. Exemplo: for(t=0;t<100;t++){ print(“%d n”,t); if(t==10) break; } 60
  61. Comandos de desvio • continue: Linguagem C Força a repetição (retorna ao início do laço e testa a condição). Exemplo: for(x=0;x<100;x++){ if (x%2) continue; print(“%d n”,x); } 61
  62. Comandos de desvio • goto: Linguagem C Apesar das linguagens possuírem estruturas de controle eficientes, também é disponibilizado o comando de desvio. Deve-se ter um cuidado muito grande, pois a sua utilização em demasia ou de forma incorreta tende a tornar os programas ilegíveis. A sua utilização é simples, basta declarar um rótulo (identificador aceito pela linguagem C seguido de dois pontos) e, de algum ponto do programa estabelecer o desvio através da declaração goto rótulo; Sintaxe: goto rótulo; rótulo: 62
  63. Comandos de desvio Exemplo: Linguagem C int x=1; retorno: printf(“%d”,x); x++; if(x<=100) goto retorno; 63
  64. Comandos de desvio • exit(): Linguagem C Assim como o comando break força o término de um laço, a função exit() força o término de execução de um programa, retornando ao sistema operacional. Sintaxe: void exit(código_de_erro); onde código_de_erro é utilizado para indicar o estado de retorno. Quando for zero, indica término normal de execução e outros valores são utilizados para indicar algum tipo de erro (retornado para a variável ERRORLEVEL em arquivos “batch” do DOS). 64
  65. Lista de Exercícios 1. Anacleto tem 1,50 metro e cresce 2 centímetros por Linguagem C ano, enquanto Felisberto tem 1,10 metro e cresce 3 centímetros por ano. Calcule e exiba quantos anos serão necessários para que Felisberto seja maior que Anacleto. 2. Imprima os números perfeitos menores de 100. Nota: Número perfeito é aquele cuja soma de seus divisores, exceto ele próprio, é igual ao número. Exemplo: 6 é perfeito porque 1 + 2 + 3 = 6. 3. Calcule e apresente o valor de S no seguinte somatório: S = 1/225 – 2/196 + 4/169 – 8/144 + ... + 16384/1 65
  66. Ementa • Introdução Linguagem C • Operadores e Expressões • Funções de E/S • Estruturas de Controle • Vetores e Matrizes • Strings • Ponteiros • Funções • Estruturas • Alocação Dinâmica de Memória • Arquivos 66
  67. Vetor • Um vetor é uma matriz de uma dimensão Linguagem C capaz de armazenar um conjunto de variáveis de mesmo tipo, referenciadas pelo seu nome e por um índice. • Sintaxe: tipo nome[tamanho]; • As variáveis são alocadas seqüencialmente na memória. • tamanho representa o número de elementos suportado pelo vetor. • O índice do vetor varia de 0 a (tamanho-1). 67
  68. Vetor Exemplo: Linguagem C main(){ int notas[5], i, soma=0; for (i=0; i<5 ; i++) { printf(“Digite a nota %d:”,i); scanf(“%d”,&notas[i]); } for (i=0; i<5 ; i++) soma = soma + notas[i]; printf(“Media = %f”, (float) soma/5); } Vetor notas 10 5 0 7 2 índices 0 1 2 3 4 68
  69. Verificação de Limites • A linguagem C não faz verificação automática dos limites dos vetores. Linguagem C • O teste dos limites deve ser realizado pelo programa e é erro comum de programação: main() { int a[10],i; for (i=1;i<=10;i++) scanf(“%d”,&a[i]); } 69
  70. Exercícios 1. Leia dois vetores A e B com 5 elementos inteiros Linguagem C cada, calcule e escreva: – O vetor S = A + B; – O vetor W com os elementos intercalados de A e B; – O vetor Z obtido pela inversão da ordem de A; – O vetor Q com os elementos comuns de A e B; – O vetor Y correspondente à união de A e B; – Coloque A em ordem crescente de seus elementos. 70
  71. Matrizes • Possuem duas dimensões fazendo menção a linhas Linguagem C e colunas. • Sintaxe: tipo nome[dim_linha][dim_coluna]; • Ex: int N[2][3]; Matriz N 5 6 7  Valores 0 1 6 7 8  Valores Linha 0 1 2  Coluna 71
  72. Matrizes #include <stdio.h> Linguagem C main() { int a[2][3], x, y; printf(“Digite 6 valores”); for(x=0; x<2; x++) for(y=0; y<3; y++) scanf(“%d”, &a[x][y]); } 72
  73. Inicialização de Matrizes • C permite a inicialização de matrizes no Linguagem C momento da declaração. Ex: int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int sqrs [5][2] = { 1, 1, 2, 4, 3, 9, 4, 16, 5, 25 }; 73
  74. Matrizes Não-Dimensionadas • C pode calcular automaticamente as dimensões de Linguagem C uma matriz, usando matriz não-dimensionadas. Se, na inicialização de uma matriz, seu tamanho for omitido, o compilador C cria uma matriz grande o bastante para conter todos os dados inicializadores presentes. int i[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int sqrs [][2] = { 1, 1, 2, 4, 3, 9, 4, 16, 5, 25 }; 74
  75. Exercícios 1. Leia uma matriz 5x5, imprima a soma dos Linguagem C elementos da diagonal principal e a soma dos elementos da diagonal secundária. 2. Leia duas matrizes A e B, do tipo 3x3, calcule em uma matriz R sua multiplicação, ou seja, R = A * B. 3. Leia uma matriz 5x5, calcule a sua transposta. Imprima as duas matrizes. 4. Faça um programa que ordene uma matriz de 5x5 em ordem decrescente, de maneira que o maior valor se localize na posição [0][0] e o menor na [4][4]. O programa deve escrever a matriz original e a ordenada. 75
  76. Ementa • Introdução Linguagem C • Operadores e Expressões • Funções de E/S • Estruturas de Controle • Vetores e Matrizes • Strings • Ponteiros • Funções • Estruturas • Alocação Dinâmica de Memória • Arquivos 76
  77. Matrizes de char (strings) • Uma "string" é definida como sendo constituída de uma matriz de caracteres (tipo de dado char - 1 byte) Linguagem C que é terminada por um "nulo". Um nulo é especificado usando-se '0' que é zero. • Por exemplo, se quisermos declarar uma matriz "str" que possa armazenar uma string de 10 caracteres, escrevemos: char str [11]; • As funções de manipulação de string armazenam e manipulam automaticamente o ‘0’. • Uma constante string fica entre “ “ (aspas), ex: printf(“%s”, “Curso C”); 77
  78. Strings • Leitura de uma string do teclado: A maneira mais fácil de inserir uma string pelo teclado é com a Linguagem C função de biblioteca gets(). A forma geral da função gets() é: gets(nome_da_matriz); #include <stdio.h> main() { char str [80]; printf("informe uma string:"); gets(str); /*le a string do teclado*/ printf("%s", str); } 78
  79. Inicialização de Strings • Inicialização de string dimensionada: Linguagem C char erro[17] = “erro de leituran”; • Inicialização de string não-dimensionada. Deixa que o compilador crie uma matriz grande o suficiente para conter a string: char erro[] = “erro de leituran”; 79
  80. Funções de Manipulação de String • As funções de manipulação de strings estão declaradas no arquivo de cabeçalho “string.h”. Linguagem C Função strcpy(): Copia o conteúdo da string "de" para a string "para". Forma geral: strcpy(para,de); #include <stdio.h> #include<string.h> main(){ char str [80]; strcpy(str, "Alo"); printf("%s", str); } 80
  81. Funções de Manipulação de String Função strlen(): Retorna o tamanho de s. Linguagem C strlen(s); onde s é uma string. /* imprime o tamanho da string digitada */ #include<stdio.h> #include<string.h> main() { char str [80]; printf("digite uma string:"); gets(str); printf("%d", strlen(str)); } 81
  82. Funções de Manipulação de String Função strcmp(): Compara duas strings e retorna 0 se elas forem iguais. Se s1 é lexicograficamente maior (Exemplos: Linguagem C "BBBB">"AAAA") que s2, então um número positivo é retornado; se for menor que s2, um numero negativo é retornado. strcmp(s1,s2); #include<stdio.h> #include <string.h> main() { char s[80]; printf("informe a senha:"); gets(s); if(strcmp(s, "senha")) printf("senha invalidan"); else printf("senha corretan"); } 82
  83. Funções de Manipulação de String Função strcat(): Anexa (concatena) "s2" em " s1"; Linguagem C "s2" não é modificada. As duas strings devem ser terminadas com nulo e o resultado também será terminado com um nulo. strcat(s1,s2); #include <stdio.h> #include <string.h> main(){ char s1[20], s2[15]; strcpy(s1, "Alo"); strcpy(s2," para todos"); strcat(s1,s2); printf("%s",s1); } 83
  84. Exercícios 1. Escrever um programa que lê duas strings e Linguagem C informa o tamanho, a igualdade entre elas e no final escrever as strings concatenadas. 2. Escrever um programa que lê uma string e a escreve em ordem inversa. 3. Escrever um programa que lê uma string e escreve quantos caracteres iguais a ‘a’ existem na string. 4. Escrever um programa que lê uma string e a escreve em maiúsculo. Ver função toupper. 5. Escrever um programa que lê uma string s[30] e escreve cada palavra desta string numa nova linha 84
  85. Ementa • Introdução Linguagem C • Operadores e Expressões • Funções de E/S • Estruturas de Controle • Vetores e Matrizes • Strings • Ponteiros • Funções • Estruturas • Alocação Dinâmica de Memória • Arquivos 85
  86. Ponteiros • Um ponteiro é uma variável que contém um endereço de memória. Esse endereço é normalmente a posição Linguagem C de uma outra variável na memória. • Sintaxe: tipo *nome_ponteiro; • tipo do ponteiro define que tipo de variável o ponteiro pode apontar. • Operadores de Ponteiros: & Operador unário que retorna o endereço na memória do seu operando. * Operador unário que retorna o valor da variável localizada no endereço que o segue. 86
  87. Exemplos • int y, x=0, *px, *py; px=&x; “px aponta para x” Linguagem C y=*px; “y recebe conteúdo de x, ou seja, 0” py=px; “py também aponta para x” *py=3; “variável apontada por py, ou seja, x, recebe 3” • float x=10.1, y; int *p; p=&x; /* erro */ y=*p; printf(“%f”,y); • int x, *p; x=10; *p=x; /* cuidado, ponteiro perdido */ /* (contém lixo) */ 87
  88. Expressões com Ponteiros • Os ponteiros podem aparecer normalmente no lugar das variáveis. Linguagem C • O operador * tem maior precedência que as operações matemáticas. Y = *px + 1; /* y recebe a soma de 1 ao conteúdo de *px */ y = *(px+1); /* y recebe o conteúdo do endereço de px + 1 (próximo) */ • Dois ponteiros, como outras variáveis, podem ser comparados. if (p1==p2).. /* verifica se p1 e p2 apontam para a mesma variável */ 88
  89. Incremento e Decremento de Ponteiros • Os ponteiros não são necessariamente Linguagem C incrementados e decrementados em uma unidade, mas pelo tamanho do tipo apontado pelo ponteiro. • Os operadores ++ e -- possuem precedência sobre o * e operadores matemáticos. • Qual a diferença entre p++; (*p)++; *(p++); 89
  90. Incremento e Decremento de Ponteiros Linguagem C p++; incrementa o ponteiro, ou seja, o endereço(p passa a apontar para a posição de memória imediatamente superior). (*p)++; incrementa o conteúdo apontado por p, ou seja, o valor armazenado na variável para a qual p está apontando. *(p++); incrementa p, como em p++, e acessa o valor encontrado na nova posição. 90
  91. Ponteiros e Matrizes • Há um grande relacionamento entre ponteiros e Linguagem C matrizes. • Versões com ponteiros são mais rápidas. • Os ponteiros possuem mais facilidades de manipulação. • Ao contrário das matrizes, os ponteiros podem ser incrementados e decrementados diretamente. 91
  92. Exemplo • Lendo um vetor com ponteiro: Linguagem C main() { int a[5]={0,1,2,3,4}, *p, x; p=&a[0]; /* mesmo que p=a */ x=*(p+2); /* x recebe a[2] */ printf(“%d”, x); } 92
  93. Exemplo • Construindo um vetor com ponteiro: Linguagem C main(){ int vet[10], *p, i; p=vet; for (i=0,i<10;i++) { *p=i; p++; } p=vet; for (i=0,i<10;i++) printf(“%d”, *p++); } 93
  94. Exemplo • Ponteiro com string: Linguagem C main(){ char str[80], *p; printf (“Digite string em letras maiúsculas: “); gets(str); printf (“Eis a string em letras minúsculas: “); p=str; /* p aponta para o primeiro elemento de str */ while (*p) printf(“%c”, tolower(*p++)); } 94
  95. Exemplo • Matrizes de Ponteiros: Linguagem C main(){ char *erro[2]={“arquivo inexistenten”, “erro na leituran”}; printf (“%s”, erro[0]); printf (“%s”, erro[1]); } 95
  96. Exercícios 1. Usando ponteiros, faça um programa que Linguagem C imprima uma string invertida. 2. Usando ponteiros, faça um programa que preencha uma matriz 10x10 de inteiros com os números de 1 a 100. 3. Usando ponteiros, faça um programa que leia duas strings e as concatene numa terceira string. 96
  97. Teste 1. Leia 10 strings para uma matriz de string. Ordene e Linguagem C imprima as strings em ordem alfabética. 2. Na teoria de sistemas define-se como elemento minimax de uma matriz o menor elemento da linha em que se encontra o maior elemento da matriz. Escreva um programa que leia uma matriz 4 x 4 e determine e imprima o seu elemento minimax. 3. Escreva um programa que converta um numero em notação romana para notação decimal. Considere números menores que 1000. 97
  98. Ementa • Introdução Linguagem C • Operadores e Expressões • Funções de E/S • Estruturas de Controle • Vetores e Matrizes • Strings • Ponteiros • Funções • Estruturas • Alocação Dinâmica de Memória • Arquivos 98
  99. Funções • É uma sub-rotina que realiza uma tarefa específica. • Linguagem C Um programa em C é uma coleção de funções. • Forma geral de uma função: tipo_retorno nome(lista_parâmetros) { // corpo da função } tipo_retorno especifica o tipo de dado retornado pela função. Pode ser qualquer tipo válido exceto um array. nome especifica o nome da função. lista_parâmetros é uma seqüência de pares de tipo e identificador separados por vírgulas. São as variáveis que recebem o valor dos argumentos passados para a função quando chamada. 99
  100. Função sem parâmetro // Este programa contém duas funções: main() e minha_func() Linguagem C void minha_func(); // protótipo de minha_func() // Não há parâmetros formais int main(){ printf(“Em main() n”); minha_func(); // chame minha_func() printf(“De volta a main()”); } // Esta é a definição da função. void minha_func(){ printf(“De dentro de minha_func()n”); } Em main() De dentro de minha_func() De volta a main() 100
  101. Função com parâmetro void box(int length, int width, int height); // protótipo de box() com 3 parâmetros formais Linguagem C int main(){ box(7, 20, 4); // passa argumentos para box box(28, 30, 25); box(3, 5, 4); } // Computa o volume da caixa. void box(int length, int width, int height){ printf(“Volume da caixa e %d”, length*width *height); } // Os parâmetros recebem os valores dos argumentos passados para box(). 101
  102. O retorno de valores • Uma função pode retornar um valor para seu Linguagem C chamador. • Para retornar um valor usamos return valor. • O tipo do valor retornado deve ser compatível com o tipo de retorno declarado na função. Se não for, um erro em tempo de compilação ocorrerá. 102
  103. Função com retorno int box(int length, int width, int height); // box() agora retorna um Linguagem C inteiro int main(){ int volume; volume=box(7, 20, 4); // o valor de retorno de box() é atribuído a volume. printf(“O Volume da caixa e %d”, volume); } // Computa o volume da caixa. int box(int length, int width, int height){ return length*width*hieght; } // box() retorna o volume da caixa para main() O Volume da caixa e 560 103
  104. Regras de Escopo • Existem três tipos de variáveis: variáveis locais, Linguagem C parâmetros formais e variáveis globais. • As regras de escopo regem a visibilidade e o tempo de vida de cada um desses tipos. Variáveis Locais  Declaradas dentro de uma função ou dentro de um bloco de código.  Conhecidas apenas dentro do bloco no qual estão declaradas.  São criadas na entrada do bloco e destruídas na saída. 104
  105. Variáveis Locais void func1() { int x; //x é local para func1() Linguagem C x=10; printf(“x = %d”,x); } void func2(){ int x=9; //x é local para func2(). if (x==9){ int y=20; //y é local ao bloco if printf(“x + y = %d”, x+y); } y=100; //erro! Y não é conhecido aqui. } 105
  106. Parâmetros Formais • Parâmetros Formais Linguagem C – São as variáveis que recebem os argumentos de uma função. – Dentro de uma função, elas se comportam como qualquer outra variável local. – Os parâmetros formais declarados devem ser do mesmo tipo dos argumentos usados para chamar a função. 106
  107. Parâmetros Formais #include <stdio.h> /* declaração do arquivo de cabeçalho*/ Linguagem C int mul_var(int, int); /* declaração do protótipo mul_var */ int mul_var(int x, int y) /* declaração da função mul_var */ { int z; Parâmetros formais z = x * y; da função return(z); } void main(void) /* declaração da função main() { int a, b, mul; Argumentos da função, devem ser printf("Digite 2 valores:n"); do mesmo tipo do parâmetro formal scanf("%d %d", &a, &b); mul = mul_var( a, b); /* chamada da função mul_var*/ printf("n %d ", mul); } 107
  108. Variáveis Globais • Variáveis Globais Linguagem C – Estas variáveis são declaradas fora das funções, ou seja, logo após as declarações #include. – São conhecidas por todo o programa e podem ser usadas por qualquer parte do código. – Variáveis globais retêm seus valores durante toda a execução do programa. 108
  109. Variáveis Globais #include <stdio.h> void func1(); Linguagem C int count; // count é global int main() { int i; // i é local for (i=0;i<10;i++) { count = i*2; func1(); } return 0; } void func1() { printf(“count: %dn”, count); //acessa count global } 109
  110. Exercícios 1. Escreva e teste a seguinte função média(), que retorna a Linguagem C média dos três números: float media(float x1, float x2, float x3) 1. Escreva e teste a seguinte função power(), que retorna x elevado a potência de n, onde n pode ser qualquer inteiro: double power(double x, int n) Utilize o algoritmo que calcularia x20 multiplicando 1 por x 20 vezes. 3. Escreva e teste a seguinte função isSquare(), que determina se o inteiro dado é um número quadrado: int isSquare(int n). Retorna 1 se for número quadrado e 0 caso contrário. Os primeiros 10 números quadrados são: 0, 1, 4, 9, 16, 25, 36, 49, 64 e 81 110
  111. Passagem de ponteiros para funções #include <stdio.h> Linguagem C void f(int *j); // f adota um ponteiro int* como parâmetro int main() { int i=0, *p; p=&i; f(p); // passa o ponteiro // ou f(&i) passa o endereço de i printf(“ i = %d”, i); return 0; } // f recebe um ponteiro para um int void f(int *j) { *j=100; // var apontado por j recebe 100 } 111
  112. Passagem de um array • Quando um array é um argumento para Linguagem C uma função, o endereço do array é passado, e não uma cópia de todo o array. • Um nome de array sem qualquer índice é um ponteiro para o primeiro elemento no array. 112
  113. Passagem de um array #include <stdio.h> void mostra(int num[10]); Linguagem C int main() { int t[10], i; for (i=0; i<10 ;i++) t[i]=i; mostra (t); // passa o array t para uma função return 0; } // Parâmetro é um array dimensionado void mostra(int num[10]) { int i; for (i=0; i<10 ;i++) printf(“%d “,num[i]); } OBS: O Compilador C automaticamente converterá o parâmetro num para um ponteiro int, já que nenhum parâmetro pode receber um array inteiro. Apenas o endereço do array é passado. 113
  114. Passagem de um array Outras possibilidades de passar um ponteiro de Linguagem C array: • Parâmetro é um array não dimensionado void mostra(int num[ ]) { int i; for (i=0; i<10 ;i++) printf(“%d “,num[i]); } • Parâmetro declarado como ponteiro void mostra(int *num) { int i; for (i=0; i<10 ;i++) printf(“%d “,num[i]); } // um ponteiro pode ser indexado usando [], como se // fosse um array 114
  115. Passagem de strings • Como uma string é simplesmente um array Linguagem C de caracteres que é terminado por caractere nulo, quando passamos uma string para uma função, apenas um ponteiro para o início da string é na realidade passado. 115
  116. Passagem de strings void strInvertCase(char *str); Linguagem C int main() { char str[80]; strcpy(str, “Isto E Um Teste”); strInvertCase(str); //passa ponteiro para str puts(str); return 0; } void strInvertCase(char *str){ while(*str) { if (isupper(*str)) *str=tolower(*str); else if (islower(*str)) *str=toupper(*str); str++; }} 116
  117. Exercícios 1. Escreva e teste a função strlen() 2. Escreva e teste a seguinte função: Linguagem C void add(float a[], int n, float b[]); A função adiciona os primeiros n elementos de b aos n primeiros elementos de a. Por exemplo, se a for {2.2,3.3,4.4,5.5,6.6,7.7,8.8,8.9} e b for {6.0,5.0,4.0,3.0,2.0,1.0}, a chamada add(a, 5, b) transformaria a em {8.2, 8.3, 8.4, 8.5, 8.6, 7.7, 8.8, 8.9}. 3. Escreva e teste a seguinte função, que remove um item de um array: void remove(float a[], int &n, int i); A função remove a[i] mudando para baixo todos os elementos acima dessa posição e decrementando n. 117
  118. A função main() • Podemos passar informações para um programa ao Linguagem C rodá-lo. Isto é possível passando argumentos de linha de comando para a função main(). • C define dois parâmetros embutidos, mas opcionais para main(). Eles são argc e argv. • argc é um número inteiro que contém o número de argumentos na linha de comandos. Ele sempre será pelo menos 1, porque o nome do programa se qualifica como primeiro argumento. • argv é um ponteiro para um array de ponteiros de caracteres. Cada ponteiro no array argv aponta para uma string contendo um argumento de linha de comando. 118
  119. A função main() • O nome do programa é apontado por Linguagem C argv[0]; argv[1] apontará para o primeiro argumento, argv[2] para o segundo argumento e assim por diante. • argv é declarado da seguinte forma: char *argv[]; 119
  120. argc e argv • Esse programa exibe os argumentos da linha de comando: Linguagem C int main(int argc, char *argv[]) { for (int i=0; i<argc; i++) puts(argv[i]); return 0; } Se o programa for chamado de ComLine, então executá-lo da forma: Comline um dois tres, teríamos a seguinte saída: Comline um dois tres 120
  121. Exercícios 1. Escreva e teste a seguinte função que retorna o Linguagem C índice do menor valor de um array dado: int minIndex(float a[ ]) 1. Escreva e teste a seguinte função que retorna o valor mínimo entre os primeiros n elementos de um array dado: float min(float a[ ], int n) 1. Escreva a função strcpy(). 2. Escreva um programa que exiba a soma dos dois argumentos numéricos de linha de comando. 121
  122. Ementa • Introdução Linguagem C • Operadores e Expressões • Funções de E/S • Estruturas de Controle • Vetores e Matrizes • Strings • Ponteiros • Funções • Estruturas • Alocação Dinâmica de Memória • Arquivos 122
  123. Estruturas • Uma estrutura é uma coleção de variáveis Linguagem C referenciadas pelo mesmo nome. • As variáveis que formam a estrutura são chamadas de membros ou campos da estrutura. • A palavra reservada struct informa ao compilador a definição de uma estrutura. 123
  124. Estruturas Exemplo de estrutura: Linguagem C struct pessoal { char nome[30]; char endereco[80]; int idade; float salario; }; Para declarar uma variável com essa estrutura: struct pessoal funcionario; 124
  125. Estruturas Referência aos elementos da estrutura: operador ponto (.) Linguagem C gets(funcionario.nome); funcionario.idade=20; printf(“ %f”, funcionario.salario); puts(funcionario.endereco); 125
  126. Matrizes de Estruturas • Para declarar uma matriz de estruturas do tipo Linguagem C pessoal de 100 elementos: struct pessoal funcionario[100]; • Para acessar uma estrutura específica, indexamos o nome da estrutura. Por exemplo, para imprimir o campo nome da estrutura 3: gets(funcionario[3].nome); 126
  127. Exercício 1. Escreva um programa simples que Linguagem C gerencie um cadastro com registros com os campos NOME, SEXO, COR_DE_OLHOS, IDADE, ALTURA e PESO. Escreva as funções Inserir, Exibir e Excluir um registro da matriz. Obtenha a seleção das funções através de um menu. Sugestão: assuma que uma estrutura não está em uso se o campo NOME estiver vazio. 127
  128. Uniões • Uma união é uma localização de memória Linguagem C usada por muitas variáveis diferentes, que podem ser de tipos diferentes. A definição de uma união é parecida com aquela de uma estrutura: union u_type { int i; char ch; }; • Para declarar uma variável do tipo u_type: union u_type cvnt; 128
  129. Uniões • Em cntv, tanto o inteiro i como o Linguagem C caractere ch compartilham da mesma localização de memória. No entanto i ocupa dois bytes e ch apenas um. • Para acessar um elemento de uma union: cvnt.i=1; 129
  130. Exemplo de União main(void){ Linguagem C union u_type { int i; char ch[2]; }; union u_type cvnt; cvnt.i=1000; printf ("uniao u como int: %dn", cvnt.i); printf ("uniao u como char: %c %cn", cvnt.ch[0],cvnt.ch[1]); getch(); } 130
  131. typedef • C permite a definição de novos nomes de tipos de Linguagem C dados com a palavra-chave typedef. • A forma geral da instrução typedef é: typedef tipo nome; • Por exemplo, podemos criar um novo nome para float usando: typedef float balance; • Essa instrução diria ao compilador para reconhecer balance, como um novo nome pra float. Assim, poderíamos criar uma variável float usando: balance v_contabil; 131
  132. Enumerações • Enumeração é um conjunto de constantes inteiras Linguagem C com nome e especifica todos os valores legais que uma variável daquele tipo pode ter. • Forma geral: enum nome_do_tipo_enum {lista de veriáveis} lista variável; • Exemplo: enum transporte {carro, aviao, trem, navio}; • Declaração de variável enum: enum transporte tr1; 132
  133. Enumerações • Cada um dos símbolos da enumeração representa um valor inteiro. Como tal, eles Linguagem C podem ser usados em qualquer expressão de números inteiros. A menos que inicializado de outra forma, o valor do primeiro símbolo da enumeração é 0, o valor do segundo é 1 e assim por diante. tr1=navio; if (tr1==carro) printf(“ vou de carro”); printf(“%d”, aviao); 133
  134. Ementa • Introdução Linguagem C • Operadores e Expressões • Funções de E/S • Estruturas de Controle • Vetores e Matrizes • Strings • Ponteiros • Funções • Estruturas • Alocação Dinâmica de Memória • Arquivos 134
  135. Alocação Dinâmica de Memória • Um programa em C usa uma das duas maneiras principais de se armazenar informações na memória Linguagem C principal do computador. • A primeira maneira usa variáveis globais e locais. Variáveis globais têm seu armazenamento fixo durante todo o tempo de execução do programa. Variáveis locais são armazenadas na pilha do programa. Entretanto essa maneira requer que o programador saiba, com antecedência, o montante de armazenamento necessário para cada situação. • A segunda maneira é através de alocação dinâmica da área de memória livre (heap) do programa. • As funções malloc() e free() formam o sistema de alocação dinâmica de C. 135
  136. malloc() • void *malloc(unsigned size) Linguagem C Retorna um ponteiro void para o primeiro byte de uma região da memória de tamanho size da área de alocação dinâmica. O ponteiro void deverá ser atribuído a um ponteiro do tipo desejado (usar cast explícito). Se não houver memória suficiente para satisfazer o pedido, malloc() retornará um ponteiro NULL. 136
  137. free() • free (void *p) Linguagem C O oposto de malloc(), free() devolve ao sistema a memória previamente alocada. free() nunca deve ser chamada com um argumento inválido, porque isto fará com que o computador destrua a lista livre. 137
  138. Exemplo main() { */ Aloca memória para 50 inteiros /* Linguagem C int *p, t; p=(int *)malloc(50*sizeof(int)); if (!p) printf(“Memória Insuficiente!”); else { for (t=0; t<50; t++) *(p+t)=t; for (t=0; t<50; t++) printf(”%d”, *(p+t)); free(p) } } 138
  139. Exercício 1. Escreva um programa que aloque espaço para cinco strings inseridas pelo usuário. Linguagem C 2. Escreva uma função getstruct() que aloque memória para uma estrutura addr e retorne o ponteiro para a memória alocada: struct addr { char nome[40]; char rua[40]; char cidade[30]; char esrado[3]; char cep[10]; }; 139
  140. Ementa • Introdução Linguagem C • Operadores e Expressões • Funções de E/S • Estruturas de Controle • Vetores e Matrizes • Strings • Ponteiros • Funções • Estruturas • Alocação Dinâmica de Memória • Arquivos 140
  141. Arquivos Ponteiro de Arquivo Linguagem C • Para ler ou escrever em um arquivo de disco, o programa deve declarar uma variável ponteiro de arquivo. • Um ponteiro de arquivo é um ponteiro para uma área na memória(buffer) onde estão contidos vários dados sobre o arquivo a ler ou escrever, tais como o nome do arquivo, estado e posição corrente • Este buffer intermediário entre arquivo e programa é chamado 'fluxo‘ ou ‘stream’, e é uma entidade lógica genérica, que pode estar associada a uma unidade de fita magnética, um disco, uma porta serial, etc. 141
  142. Arquivos Ponteiro de Arquivo Linguagem C • Para obter uma variável ponteiro de arquivo : FILE *fp; onde fp é o ponteiro de arquivo. Abrindo um Arquivo: • A função fopen() abre um fluxo e liga um arquivo a esse fluxo. Retorna o ponteiro de arquivo associado ao fluxoem questão. FILE *fopen(char *nome_de_arquivo, char *modo); • onde modo é uma string contendo o estado desejado para abertura. • O nome do arquivo deve ser uma string de caracteres que compreende um nome de arquivo válido incluindo uma especificação de caminho (PATH). 142
  143. Modos de Abertura Modo Significado "r" Abre um arquivo-texto para leitura Linguagem C "w" Cria um arquivo-texto para escrita "a" Acrescenta dados para um arquivo-texto existente "rb" Abre um arquivo binário para leitura "wb" Cria um arquivo binário para escrita "ab" Acrescenta dados a um arquivo binário existente "r+" Abre um arquivo-texto para leitura/escrita "w+" Cria um arquivo-texto para leitura/escrita "a+" Acrescenta dados ou cria um arquivo-texto para leitura/escrita "r+b" Abre um arquivo binário para leitura/escrita "w+b" Cria um arquivo binário para leitura/escrita "a+b" Acrescenta ou cria um arquivo binário para leitura/escrita 143
  144. Abertura de Arquivo • Um arquivo pode ser aberto ou em modo Linguagem C texto ou em modo binário. • No modo texto, as seqüências de retorno de carro e alimentação de formulários são transformadas em seqüências de novas linhas na entrada. Na saída, ocorre o inverso: novas linhas são transformadas em retorno de carro e alimentação de formulário. Tais transformações não acontecem em um arquivo binário. 144
  145. Abertura de Arquivo • Se um erro ocorre quando se está abrindo Linguagem C um arquivo, fopen() retorna um nulo (NULL). • Por exemplo: tentar abrir um arquivo inexistente para leitura, escrever em um arquivo protegido contra gravação, ou ainda criar um arquivo se o disco estiver cheio, um erro ocorrerá e fopen() retornará NULL. 145
Anúncio