Escolar Documentos
Profissional Documentos
Cultura Documentos
UFCG Apostila de Linguagem de Programacao C
UFCG Apostila de Linguagem de Programacao C
Linguagem de Programao C
Roberto Medeiros de Faria
Agosto/2002
Linguagem de Programao C
NDICE
INTRODUO REGRAS E COMANDOS DA LINGUAGEM C Principais Extenses Bloco De Cdigo (Marcadores de Bloco {}) Ponto-e-vrgula (;) Comentrios (/* comentrio */) Identificadores Tipos de Dados Modificadores de Tipos Definio de Variveis Atribuio e Inicializao de Variveis Operadores Incremento e Decremento Expresses de Atribuio Atribuies Mltiplas Prioridade dos Operadores Notao Hexadecimal e Octal Constante Caractere Constante de Caracteres Especiais Constante Cadeia de Caracteres (String) Converso de Tipo SADA DE DADOS ENTRADA DE DADOS CONTROLE DE FLUXO 04 06 06 06 06 06 06 07 07 08 09 09 09 10 10 11 12 12 12 13 13 15 17 18 2
Linguagem de Programao C
Comando if Expresso Condicional (forma compacta para o if) Comando switch Comando while Comando for Comando break Comando continue DIRETIVAS DE COMPILAO Diretiva #define Diretiva #include VETORES Vetores de uma dimenso Sem Verificao de Limites Vetores unidimensionais so conjuntos Vetores bidimensionais ou matrizes STRINGS (cadeias de caracteres) Lendo uma string pelo teclado Algumas funes de bibliotecas com strings A funo strcpy() A funo strcat() A funo strcmp() A funo strlen() Usando o terminador \0 (NULL) APONTADORES Varivel Apontador
18 18 19 19 20 21 21 22 22 22 24 24 25 25 26 27 27 28 28 28 28 29 29 30 30 3
Linguagem de Programao C
Operadores de Apontadores Expresses com Apontadores Atribuio com Apontadores Aritmtica com apontadores Inicializao de apontadores Alocao dinmica As funes malloc() e free() FUNES ESTRUTURAS Operador de Seleo Rtulo Inicializao de Estruturas ARQUIVOS Funo fopen() Funo fwrite() Funo fread() Macro feof() Funo fclose()
30 31 31 32 32 32 33 35 36 36 36 37 38 38 39 39 39 39
Linguagem de Programao C
INTRODUO
C uma linguagem de programao desenvolvida nos Laboratrios Bell, por volta de 1972, tendo sido projetada e escrita por Dennis Ritchie, que trabalhava junto com Ken Thompson no sistema operacional UNIX. Esse sistema foi concebido como um conjunto de ferramentas para engenheiros de software, das quais C se tornou a mais bsica. Quase todos os utilitrios do UNIX, seu ncleo e o compilador C so escritos em C. A grande fora de C a habilidade para construir programas complexos como elementos simples, tanto que seu lema poderia ser "muito com pouco". O C destinado a construo de software bsico, ou seja, linguagens de programao, sistemas operacionais, geradores de programas, processadores de texto, etc. A linguagem C pode ser considerada uma linguagem de mdio nvel. O C oferece recursos de baixo nvel permitindo a especificao de todos os detalhes na lgica de um programa, alcanando a mxima eficincia computacional, como tambm possui um relativo alto nvel para abstrair os detalhes da arquitetura do computador.
Linguagem de Programao C
.H
.OBJ - Arquivo objeto gerado a partir da compilao do cdigo fonte. .EXE - Cdigo executvel. Resultado da juno de um ou mais arquivos objetos e bibliotecas padres pelo processo de linkedio.
Ponto-e-Vrgula (;)
O ponto-e-vrgula um terminador de comando e indica o final de um comando.
Identificadores
A linguagem C define identificadores como sendo nomes usados para se fazer referncia a entidades do programa (variveis, funes, rtulos, etc.) definidas pelo programador. Em C, um identificador composto de um ou mais caracteres, sendo que, para identificadores internos, os 31 primeiros so significativos. O primeiro caractere deve ser uma letra ou um sublinha (_) e os caracteres subseqentes devem ser letras, nmeros ou sublinhas. Alguns compiladores C tambm permitem que voc use um cifro ($) dentro de um identificador, mas no como o caractere inicial. Eis aqui alguns exemplos de identificadores corretos e incorretos:
Linguagem de Programao C
Isto quer dizer que se duas variveis tm em comum os 31 primeiros caracteres e diferem apenas a partir do trigsimo segundo, o compilador C no ser capaz de distingui-Ias. Por exemplo, esses dois identificadores so iguais: isto_e_um_exemplo_de_um_nome_longo isto_e_um_exemplo_de_um_nome_longo_tambm Uma outra observao que em C as letras maisculas e minsculas so tratadas de maneira diferentes. Por exemplo, cont, Cont e CONT so trs identificadores distintos. Um identificador no pode ser igual a uma palavra reservada do C e no deve ter o mesmo nome das funes que voc escreveu ou daquelas que esto pr-definidas nas bibliotecas do C. Quando um identificador for composto por vrias palavras, deve-se separa-las com sublinha ou iniciar cada palavra, a partir da segunda, com letra maiscula. Exemplos: valor_convertido_para_celcius valorConvertidoParaCelcius
Tipos de Dados
Existem cinco tipos primitivos de dados em C: caractere, inteiro, ponto flutuante, ponto flutuante de preciso dupla e sem valor. As palavras reservadas usadas para declarar variveis desse tipo so char, int, float, double, void, respectivamente. A tabela abaixo representa o valor e a escala de cada tipo de dado em C.
Tipo
char Int float doubl void
Blts
8 16 32 64 0
Valor
-128 a 127 -32768 a 32767 3.4E -38 a 3.4E+38 1.7E-308 a 1.7E+308 sem valor
Modificadores de Tipos
Com exceo do tipo void, os tipos primitivos podem ser precedidos por modificadores. O modificador usado para alterar o significado do tipo-base para que ele 7
Linguagem de Programao C
se adapte de maneira mais precisa s necessidades das vrias situaes. Os modificadores de tipo so: signed unsigned long short Abaixo esto todas as possibilidades para relacionar os tipos primitivos com os modificadores de tipo. Embora permitido, o uso de signed com Inteiros redundante. porque a declarao revelia (default) dos inteiros assume um nmero com sinal.
Tipo
Char unsigned char signed char Int unsigned int signed int short int unsigned short int signed short int long int signed long int unsigned long int Float Doubl long double Void
Bits
8 8 8 16 16 16 16 16 16 32 32 32 32 64 90 0
Valor
-128 a 127 o a 255 -128 a 127 -32768 a 32767 0 a 65535 -32768 a 32767 -32768 a 32767 0 a 65535 -32768 a 32767 -2147483648 a 2147483647 -2147483648 a 2147483647 0 a 4294967295 3.4E-38 a 3.4E+38 1.7E-308 a 1.7E+308 3.4E-4932 a 1.1 E+4932 sem valor
A diferena entre inteiros com sinal e inteiros sem sinal est na maneira com que o computador interpreta o bit de ordem superior (mais esquerda) do inteiro. Se voc especificar um inteiro com sinal, ento o compilador do C gerar um cdigo que assumir que ele deve usar o bit de ordem superior de um inteiro para representar o sinal. Se o bit de sinal zero, ento o nmero positivo; se o bit de sinal um, ento o nmero negativo. Para o inteiro sem sinal, o bit de maior ordem representa um dgito binrio como os demais e no h representao de sinal o valor sempre positivo.
Definio de Variveis
Definir uma varivel cria-la na memria (aloca-la), dar a ela um nome e especificar o tipo de dado que nela vai armazenar. Sintaxe: tipo lista-de-identificadores; 8
Linguagem de Programao C
O tipo deve ser um tipo de dado vlido em C, e lista-de-identificadores pode consistir em um ou mais identificadores separados por vrgula. Exemplos: int soma ; unsigned char i,j,k ; float salrio; signed long [int] x; unsigned int idade; short int y; long caminho, estado; unsigned valor;
Operadores
Relacionais:
== != > < >= <= (igual a); (diferente de); (maior do que); (menor do que); (maior ou igual a); (menor ou igual a).
Aritmticos:
+ * / % ++ -(soma); (subtrao); (multiplicao); (diviso); (resto da diviso inteira). (incremento) (decremento)
Lgicos:
! || (negao not no); (disjuno or ou); 9
Linguagem de Programao C
&&
Incremento e Decremento
Na linguagem C existem operadores especiais para as operaes de incremento (adicionar um) e decremento (subtrair um) de variveis. Suponha que uma varivel y deva ser incrementada de uma unidade antes de seu valor ser atribudo varivel x, temos ento o seguinte trecho de programa: y = y + 1; x = y; Usando o operador de incremento pr-fixado, o mesmo trecho do programa acima pode ser reduzido a: x = ++y; Com a operao de incremento ps-fixado, temos: x = y++;
Dessa formal y atribudo a x para depois ser incrementado, ou seja: x = y; y = y + 1; O mesmo raciocnio se aplica quando se trata de uma operao de decremento. O operador de decremento subtrai um do valor de uma varivel. O operador de decremento pode ser tambm, pr-fixado e ps-fixado.
Expresses de Atribuio
usada para substituir trechos de programas, como por exemplo: x = x + y; Usando expresso de atribuio teramos o mesmo trecho, escrito como: x += y; Ou seja, quando a varivel a que se atribuir o valor da expresso igual ao primeiro operando e na expresso s se tem um nico operador, pode-se utilizar expresses e atribuio. Esta forma se aplica as quatro operaes elementares e ao resto da diviso inteira (+=, -=, *=, /=, %=). 10
Linguagem de Programao C
Atribuies Mltiplas
Usadas para na iniclalizar vrias variveis com um nico valor de uma expresso. Exemplo: x = y = z = 0; importante observar que o valor zero atribudo s variveis em ordem da direita para esquerda. Ento, a mesma expresso, com parnteses (para indicar a associatividade) seria: x = (y = (z = 0)); Ou seja, seria o mesmo que escrever as atribuies separadamente: z = 0; y = 0; x = 0;
OPERADOR
[] () -> . ! ~ ++ -(tipo) * & Sizeof * / % + <<
NVEL
1
NOME
arrav funo membro membro negao complemento incremento decremento menos unrio Cast indireco endereo tamanho do objeto multiplicao diviso resto da diviso inteira adio subtrao deslocamento esquerda 11
Linguagem de Programao C
6 7 8 9 10 11 12 13 14
deslocamento direita menor que menor ou igual a maior que maior ou igual a igual a diferente de e para bits ou para bits (exclusivo) ou para bits e lgico ou lgico expresso condicional atribuico multipla expresso
Constante Caractere
Uma constante caractere em C delimitada por apstrofo ('). Exemplo: 'a', 'b', '1', '0' , 9 12
Linguagem de Programao C
SEQNCIA
'\0' '\8' '\b' '\f '\n' '\r' \t' '\v' '\\' \ \
VALOR
0 0x07 0x08 0x0C 0x0A 0x0D 0x09 0x0B 0x5C 0x27 0x22
SIGNIFICADO
finalizador de um string(NULL) apito sonoro (bell) retrocesso (backspace) avano para o incio de outra folha avano de linha (new line) retorno do cursor (return) tabulao horizontal (tab) tabulao vertical barra invertida (contra-barra) apstrofo aspas
Converso de Tipo
Quando operadores de tipos diferentes aparecem em expresses aritmticas, eles so convertidos para um tipo comum (default), de acordo com as seguintes converses: char e short so convertidos para int; float convertido para double. Argumentos passados para uma funo tambm esto sujeitos a regras de converso. H ainda a possibilidade de converso forada (cast) em uma expresso, com a construo: 13
Linguagem de Programao C
(tipo)expresso; Esta construo converte a expresso para o tipo "tipo". Por exemplo, a funo sqrt() da biblioteca C, espera sempre um argumento em preciso dupla assim se tivermos uma varivel numero do tipo inteiro sua raiz deve ser calculada como: raiz =sqrt((double)numero); Exemplo: char i; unsigned char k; int j; i = (char)j; k = (unsigned char)i; j = (unsigned char)calcxy(); /* converte o retorno da funo */
14
Linguagem de Programao C
SADA DE DADOS
Sintaxe: printf("cadeia de controle", lista-de-argumentos) ; A cadeia de controle especifica o formato de sada da lista-de-argumentos. A tabela abaixo mostra os cdigos que podem ser usados na cadeia de controle como especificao de formato:
CDIGO
%c %d %f %u %x %o %p %s %e
FORMATAO
caractere decimal ponto flutuante decimal sem sinal hexadecimal octal apontador Cadeia de caracteres (string) notao cientfica (exponencial)
Os cdigos de formatos podero ter especificaes da largura do campo, nmero de casas decimais e o indicador de alinhamento esquerda. Um inteiro colocado entre o sinal (%) e o comando de formatao atua como especificador da largura de campo mnima, o que preenche a sada com brancos ou zeros para assegurar que tenha ao menos um campo mnimo. Caso uma srie ou um nmero sejam maiores que o mnimo, sero completamente impresso, mesmo que ultrapasse o mnimo. O preenchimento normal feito com espao, Caso voc queira preencher com zeros, basta colocar um zero antes do especificador de largura de campo. Por exemplo %05d vai preencher um nmero como menos de cinco dgito, com 0's a esquerda. Para especificar o nmero de casas decimais impressas para um nmero em pontos flutuante. coloque um ponto decimal seguido pelo nmero de casas decimais que voc quer apresentar, aps o especificador de largura de campo. Por exemplo %10.4f apresentar um nmero com pelo menos 10 caracteres de comprimento, com quatro casas decimais. Esse mtodo tambm funciona quando voc quer especificar o comprimento mxImo do campo, para string e valores inteiros. Por exemplo, %5.75 apresentara um string com pelo menos cinco caracteres de comprimento e que no exceda sete. Caso o string seja mais comprido que a mxima largura do campo. os caracteres sero truncados na extremidade final. Como condio normal, toda sarda alinhada pela direita: se a largura do campo for mais larga que os dados impresso, os dados sero colocados no lado direito do campo. Voc pode formatar a informao a ser colocada no lado esquerdo, pela colocao de um sinal de menos logo aps %. Por exemplo, %-10.2f far um alinhamento esquerda. 15
Linguagem de Programao C
Exemplos: printf( "Empresa de Demonstrao ) ; printf( "%s", "Empresa de Demonstrao); printf( %c", B); printf("%5d", 100); printf("%-05d", 100);
16
Linguagem de Programao C
ENTRADAS DE DADOS
Sintaxe: scanf("cadeia de controle", <lista de argumentos>) A cadeia de controle especifica o tipo de dados que se deseja ler do teclado. A tabela abaixo mostra os cdigos que podem ser usados na cadeia de controle:
CDIGO
%c %d %f %x %o %s
SIGNIFICADO
ler um caractere ler um inteiro ler um nmero em ponto flutuante ler um nmero em hexadecimal ler um nmero em octal ler uma cadeia de caracteres (string)
Todos os argumentos devem ser precedido do sinal &. Por exemplo se voc quiser ler um inteiro para a varivel inteira cont, dever utilizar o seguinte comando: scanf("%d", &cont); Os comandos de formatao podem utilizar modificadores de largura de campo, formados por nmeros inteiros colocados entre o sinal % e o cdigo de formatao. Se for colocado um *, a funo scanf() avanar para o prximo campo de entrada. Exemplos: scanf("%c", &op); scanf("%30s", &nome); scanf("%d", &idade); scanf("%d %c", &ld, &ch);
17
Linguagem de Programao C
CONTROLE DE FLUXO
Comando if
Sintaxe: if(condio) comando1; else comando2; Caso a condio seja verdadeira, ou seja, o valor da expresso condicional seja diferente de zero, o comando1 ser executado; caso contrrio, ser executado o comando2. A clusula else opcional. Os comandos, tanto no if quanto no else, podem ser comandos de blocos. Exemplo: void main() { int valorA, valorB; scanf("%d %d", &valorA, &valorB); if(valorA > valorB) { printf("%d ", valorA); } else { printf("%d ", valorB); } }
Linguagem de Programao C
} else { max = b ; }
Comando switch
Sintaxe: switch(expresso-inteira) { case constante-inteira-1: comando1; break; case constante-inteira-2: comando2; break; default: comandoN; } O comandos break e a clusula default so opcionais. O switch executar o primeiro bloco de comando em que a varivel coincidir com a constante at encontrar um break. Caso nenhuma constante seja igual ao valor da varivel a clusula default ser avaliada. Exemplo: switch(ch) { case '1': printf("opo um escolhida"); break; case '2': printf("opo dois escolhida"); break; case '3': case '4': printf("opo escolhida foi trs ou quatro"); default: printf("escolha um, dois, trs ou quatro"); }
Comando while
Sintaxe: while(condio) comando;
19
Linguagem de Programao C
O comando pode ser um nica declarao ou um bloco de comandos que devem ser repetidos. A condio pode ser qualquer expresso em que a verdade qualquer valor diferente de zero. Exemplo: void main() { int valor = 10; while(valor >= 10) { printf("%d", valor); } }
Comando for
Dos comandos vistos at agora, o comando for o mais completo. Sua sintaxe e semntica difere, e muito, das outras linguagens. Sintaxe: for([lista-de-exp1]; [exp2]; [lista-de-exp3>]) comando; Onde: lista de exp1 - uma lista de expresses de inicializao; exp2 uma expresso condicional; lista de exp3 uma lista de expresses de reinicializao. Semntica: 1o.) as expresses de Inlcializao so executadas. 2o.) a expresso condicional avaliada; se for zero (falsa), o lao terminar; se for diferente de zero (verdadeira), os comandos internos sero executados, e em seguida, executada a lista de expresses de reinicializaao. Exemplos: for(i=0; i<10; i++) { a -= i } for(i = 0; j = 10; !j; ) { i++; } for(a = 1; a != b; a+=5) { b += c * a; 20
Linguagem de Programao C
Comando break
O comando break usado para interromper o lao dos comandos while, for e do...while.
Comando continue
O comando continue provoca uma nova avaliao da expresso de controle dos comandos de repetio.
21
Linguagem de Programao C
DIRETIVAS DE COMPILAO
O Pr-processador
Conceitualmente, o pr-processador C um filtro que executado antes do compilador. Ele executa substituies textuais, incluso de arquivos, e capaz de processamento condicional. Todas as diretivas para o pr-processador comeam como sinal cardinal #, que deve ocorrer no comeo da linha. Diretiva #define Existem duas formas da diretiva define. A primeira #define identificador stringchave e faz com que o identificador seja substitudo pela cadeia de caracteres chave onde quer que ele ocorra no mdulo fonte: #define identificador(identificador,...) string-chave A segunda forma : No permitido espao em branco entre o primeiro identificador e o parnteses esquerdo. Esta forma capas de substituies mais complexas; assim #define min(A,B) A<B?A:B define uma substituio da expresso min(a,b) que resulta no menor dos dois arqumentos. Porque voc est lidando com substituio textual, os argumentos da macro pode ser de qualquer tipo vlido para as operaes. Existem, no entanto, dois problemas. Primeiro, a macro pode ter efeitos colaterais; assim, min(++a,b) expande-se para a++< b ? ++a:b que faz mais do que era esperado. Segundo, j que um identificador pode ser substitudo por uma expresso contendo operadores, aconselhvel colocar cada identificador entre parnteses. Logo #define min(A,B) ((A)B)?(A):(B mais seguro. Diretiva #include A diretiva include tem a forma: #include "nome-do-arquivo" ou #include <nome-do-arquivo> A linha substituda por todo o contedo do arquivo especificado. As duas formas podem, ou no. ser tratadas de forma identicas. Em ambos os casos, os arquivos referenciados so obtidos em algum lugar pr-determinado no sistema; a primeira forma. 22
Linguagem de Programao C
pesquisa primeiros no seu prprio diretrio. Como regra geral, use < > para incluir arquivos gerais do C, como: #include <stdio.h>
23
Linguagem de Programao C
VETORES
Um vetor uma coleo de variveis do mesmo tipo que so referenciadas pelo mesmo nome. Na Linguagem C, um vetor consiste em locaes contguas de memria. O endereo mais baixo corresponde ao primeiro elemento, e o mais alto corresponde ao ltimo elemento. Um vetor pode ter de uma a vrias dimenses. Voc acessa um determinado elemento em um vetor usando ndice. O vetor que voc vai usar a de caracteres. Como C no tem tipo de dados string intrnseco, ele usa os vetores de caracteres. Como voc ver em breve esse mtodo de lidar com strings concede mais fora e flexibilidade que as linguagens que usam tipos strings especiais.
Linguagem de Programao C
main() { int amostra[10], i, med; for (i=0; i<1O; i++) { printf("digite nmero %d: ", i); scanf ("%d", &amostra[i]); } med=0; /* agora somar os nmeros */ for (i=O; i<1O; i++) { med = md + amostra[i]; } printf("A mdia %d\n", medl1 C); }
Linguagem de Programao C
main () { char ch[7]; int i; for (i=O; i<6; i++) { ch[i] = 'A' + i; } ch[6] = '\O'; } ch ficar assim:
26
Linguagem de Programao C
Linguagem de Programao C
posteriormente, voc tambm pode usar o nome de um vetor de caracteres sem ndice, desde que ela contenha um string em qualquer lugar onde voc possa usar uma constante string. Tenha em mente que gets() no efetua nenhuma verificao de limites no vetor com o qual ela e chamada. Portanto, se voc inserir um string maior que o tamanho do vetor, esse vetor ser sobrescrito.
Linguagem de Programao C
A funo strcmp() compara dois strings e devolve 0 se eles forem iguais. Se s1 for lexicograficamente maior que s2, ento a funo devolver um nmero positivo; se s1 for menor que s2, a funo devolver um nmero negativo. A funo strlen() A forma geral da chamada de uma funo strlen() strlen(s) onde s um string. A funo strlen() devolve o comprimento de um string para a qual s aponta. Exemplo: void main() { char str[80]; printf(digite um string: ) gets(str); printf("%d", strlen(str)); }
29
Linguagem de Programao C
APONTADORES
Um apontador uma varivel que contm um endereo de memria. Ou seja, esse endereo a localizao de uma outra varivel na memria. Se uma varivel contm o endereo de uma outra varivel, ento detemos que a primeira aponta para a segunda. Analise o esquema abaixo: Endereo na memria 1000 1001 1002 1003 1004 Varivel na memria 1003
Memria
Varivel Apontador
Se uma varivel ir conter um apontador, ento voc precisa declara-la como uma varivel do tipo apontador. A forma geral : tipo *nome-da-varivel onde o tipo pode ser qualquer tipo base vlido em C, e nome-da-varivel um identlficador vlido. Por exemplo, estes comandos declaram apontadores a inteiros e caracteres: char *p; int *temp, *inicio;
Operadores de Apontadores
Existem dois operadores especiais de apontadores: * e &, que so operadores unrios. Por exemplo: x = &y; Coloca em x o endereo de memria da varivel y. Esse endereo a localizao interna da varivel na memria do computador. O endereo no tem nada a ver com o valor de y. Voc pode se lembrar da operao de & devolvendo "o endereo de" para a 30
Linguagem de Programao C
varivel que precede. Portando voc pode ler o comando de atribuio que acabamos de mostrar como "x recebe o endereo de y". Para entender essa atribuio mais claramente, assuma que a varivel y esteja localizada no endereo 2000. Depois da atribuio que acabamos de mostrar, x conter o valor 2000. O segundo operador, o complemento de &. Ele um operador unrio que devolve o valor da varivel localizada no endereo que se segue. Por exemplo, se x contiver o endereo de memria da varivel y, ento: k = *x; Coloca o valor de y em k. Por exemplo, se y originalmente contivesse o valor 100, ento, depois dessa atribuio, k conteria o valor 100, porque este o valor armazenado na localizao 2000, que o endereo de memria que foi atribudo a x. Lembre-se da operao de * como "no endereo". Assim. nesse caso, voc poderia ler o comando acima como "k recebe o valor que est no endereo x". O sinal de multiplicao e o sinal "no endereo" so iguais. Ao escrever seus programas, tenha em mente que esses operadores no tm relao uns com os outros. Tanto o operador & como * tm precedncia mais alta que todos os outros operadores aritmticos, exceto o menos unrio, com o qual eles se equivalem. Eis aqui um programa que usa os dois comando de atribuio que acabamos de mostrar: void main() { int x, *y, k x = 100; y = &x; /* obtm o endereo de x */ k = *y; /* obtm o valor naquele endereo */ printf("%d", k); /* exibe 100 */ }
Linguagem de Programao C
Inicializao de apontadores
Depois que voc declara um apontador, mas antes de lhe atribuir um valor, ele conter um valor desconhecido. Se tentar usar um apontador antes de atribuir-Ihe um valor, voc provavelmente danificar no apenas o programa mas tambm o sistema operacional. Por conveno, voc deve dar a um apontador que no aponta para lugar nenhum o valor nulo (null), para indicar esse fato. Porm o fato de um apontador ter simplesmente o valor nulo no o torna "seguro" para ser usado. Se voc usar um apontador nulo ao lado esquerdo de um comando de atribuio, ainda correr o risco de danificar seu programa. Por enquanto, a forma mais segura de nicializar um apontador atribuir-Ihe o endereo de uma varivel declarada. Como por exemplo: int x = 4; int *y; y = &x;
Alocao dinmica
Existem dois mtodos principais por meios dos quais um programa em C pode armazenar informaes na memria principal do computador. O primeiro usa as variveis 32
Linguagem de Programao C
locais e globais que C define. No caso das variveis globais, o armazenamento fixado durante o tempo de execuo de seu programa. Para essas variveis, o programa aloca armazenamento no espao da pilha do computador. Embora as variveis locais sejam eficientemente implementadas em C. elas exigem que voc saiba, de antemo, o montante de memria necessria para cada situao. O segundo mtodo que o programa pode usar para armazenar informaes atravs das funes de alocao dinmica do C, malloc() e free(). Nesse mtodo um programa aloca armazenamento para informaes da rea de memria livre chamada heap (ou rea de alocao dinmica), que fica entre seu programa, com sua rea de armazenamento permanente, e a pilha. Examine a figura a seguir:
A figura mostra a forma conceitual como um programa aparece na memria. A pilha cresce de cima para baixo na medida em que o programa a usa; portanto o desenho do programa determina a quantidade de memria que ele precisa. Por exemplo, um programa com muitas funes recursivas demandar muito mais memria da pilha que um programa que no tenha funes recursivas, porque as variveis locais e os endereos de retorno esto armazenados na pilha. Lembre-se de que o computador aloca permanentemente a memria exigida para o programa e dados globais durante a sua execuo. O computador obtm memria da rea de memria livre para satisfazer um pedido de malloc(), iniciando exatamente acima das variveis globais e crescendo em direo pilha.
33
Linguagem de Programao C
A funo malloc() retorna um apontador do tipo void, que significa que voc dever usar um cast explcito quando atribuir o apontador devolvido a um apontador do tipo que voc deseja. Depois de uma chamada bem sucedida, malloc() devolver um apontador para o primeiro byte da regio de memria que foi alocada. Se no houver memria suficiente disponvel para satisfazer o pedido malloc(), ocorrer um fracasso na alocao e malloc() devolver um apontador nulo. Voc pode usar sizeof para determinar O nmero exato de bytes de que cada tipo de dado precisa. Fazendo isto, voc torna seus programas portteis a uma variedade de sistemas. Depois de usar free() para liberar memria, voc pode reus-Ia atravs de uma seqente chamada a malloc1(). Exemplo: void main() { int *p, t; p = (int *) malloc(40 * sizeof(int)); if (!p) { printf(memria insuficiente\n); } else { for (t = 0; t < 40; ++t) { *(p+t) = t; } for (t = 0; t < 40; ++t) { prlntf("%d ", *(p+t)); } free(p); } }
34
Linguagem de Programao C
FUNES
Sintaxe: tipo-r nome-da-funo(lista-de-declaraes-dos-parmetros) { declarao-de-variveis-locais; corpo-da-funo; } O tipo-r especifica tipo da expresso de retorno. Por default, quando o tipo-r omitido, o C assume que a funo do tipo int, ou seja a expresso de retorno inteira. Quando uma funo no retorna nenhum valor, dizemos que ela do tipo void. Exemplo: max(int x, y) { int aux; if (x > y) { aux = x; } else { aux = y ; } return(aux); } A funo acima retornar o maior valor entre dois nmeros inteiros. Uma possvel chamada dessa funo seria: printf("O maior valor entre %d e %d %d", a, b, max(a,b)); Todos sabemos que h duas formas de chamar uma funo. A primeira forma chamada por valor (ou passagem por valor). Esse mtodo copia o valor dos argumentos nos parmetros formais (parmetros declarados na funo). A funo max() declarada acima um exemplo de chamada por valor. A segunda forma de passagem de argumentos para uma funo chamada por referncia, onde o endereo de cada argumento compartilhado pelos parmetros formais. Isso significa que as alteraes feitas nos parmetros afetam a os respectivos argumentos (variveis) utilizados para chamar a funo. Na chamada por referncia os parmetros devem ser declarados como apontadores Veja o exemplo abaixo: troca(int x, y) { int aux; aux = *x; *x = *y; *y = aux; } 35
Linguagem de Programao C
ESTRUTURAS
Estruturas so grupos de variveis. Diferentemente de matrizes, podem ser compostas de tipos diferentes (inteiros, reais, ...). Elas so comparveis aos registro em outras linguagens. Cada estrutura pode ser tratada como um todo ou por cada um de seus componentes. Sintaxe: struct rtulo { declarao-de-varivel; nome-da-varivel; }; O rtulo opcional e ser discutido posteriormente. As declaraes de variveis so as mesmas j vistas. O nome da estrutura segue as mesmas regras dos nomes de variveis simples. Por exemplo: struct { char mes[10]; int dia; int ano; } feriado; esse exemplo declara feriado como sendo uma estrutura que tem trs variveis.
Operador de Seleo
Cada membro da estrutura o equivalente a uma varivel simples de seu tipo. o operador de seleo (.) utilizado para referenciar um membro de um estrutura. Por exemplo: feriado.mes[0] = 'B'; feriado.dia = 1; feriado.ano = 94;
Rtulo
Uma estrutura pode receber um rtulo. Uma vez definida, ela pode ser utilizada para declarar outras estruturas como os mesmos membros. Veja o seguinte exemplo: struct data { char mes[10]; int dia; int ano; }; Uma vez que data esteja definida, ela pode ser utilizada para declarar outras variveis. Por exemplo: 36
Linguagem de Programao C
Inicializao de Estruturas
A iniclalizao de estruturas assemelha-se muito como a inicializao de matrizes: struct data feriadao = {"FEVEREIRO", 1, 1994};
37
Linguagem de Programao C
ARQUIVOS
Os arquivos em C precisam ser explicitamente abertos e referenciados. As funes fopen() e fclose() so utilizadas, respectivamente para abrir e fechar arquivos. Cada arquivo aberto referenciado por um identificador de arquivo que deve ser do tipo FILE (estrutura definida no arquivo stdio.h no diretrio INCLUDE). Exemplo de declarao de um identificador de arquivo: FILE *id-arq; A tabela abaixo mostra algumas das funes e macros para manipulao com arquivos:
FUNO
fopen fwrite Fread fclose Feof abre um arquivo escreve dados em um arquivo ler dados de um arquivo fechar um arquivo
AO
Funo fopen()
Sintaxe: fopen("nome-arquivo", modo-de-acesso"); Abre um arquivo e retorna um estrutura FILE que identificar arquivo ou stream associado. Se fopen() no abrir o arquivo, um NULL retornado. O modo de acesso especificado pelos caracteres: r" "w a" abre um arquivo para leitura e o apontador posicionado no incio-doarquivo. abre um arquivo apenas para gravao; o arquivo ser criado se no existir; se o arquivo existir, todo o contedo do arquivo ser perdido (reset). abre um arquivo no modo de incluso; se o arquivo no existir, um arquivo ser criado; caso exista, todas incluses sero feitas no final do arquivo.
ilegal ler de arquivos que estejam abertos nos modos "w" ou "a", ou gravar em arquivos abertos no modo "r". Caso se deseje abrir um arquivo tanto para leitura como para escrita, deve-se usar um "+" logo aps o modo desejado. Assim temos os seguintes modos: "r+" abre um arquivo para leitura; o apontador posicionado no incio-doarquivo; gravao tambm permitida 38
Linguagem de Programao C
arquivo; gravao tambm permitida. "w+ abre um arquivo para gravao; leitura tambm permitida. "a+" abre um arquivo no modo de incluso; leitura tambm permitida.
Funo fwrite()
Sintaxe: fwrite(p, bytes, nmero, stream); A funo fwrite() usada para gravar um nmero de itens, do tamanho especificado em bytes, no stream (no traduzido), comeando na localizao de memria p. A funo retorna um nmero inteiro informando a quantidade de bytes realmente gravados. Se um zero for retornado, houve um erro na operao.
Funo fread()
Sintaxe: fread(p, bytes, nmero, stream); Para ler os dados gravados com fwrite() deve-se usar a funo fread(). A funo retornar um zero se ocorrer um erro, Caso contrrio, o numero de bytes realmente gravados.
Macro feof()
Retorna um inteiro deferente de zero ser o fim-de-arquivo foi lido no stream, ou seja, se o apontador de arquivo est posicionado no EOF (End-Of-File).
Funo fclose()
Sintaxe: fclose(stream) Fechar um arquivo descarregando o buffer a ele associado.
Exemplo
#include <stdio.h> #include <string.h> char buffer[] = "Ncleo de Informtlca int main (void) { FILE *id-arq; char buf-str[22]; /* abre o arquivo no modo de escrita */ 39
Linguagem de Programao C
if ((id-arq = fopen("TEXTO.DAT, w )) == NULL) { printf("Erro na abertura do arquivo TEXTO.DAT"); return 1; } /* escreve um string no arquivo */ if (fwrite(buffer, sizeof(buffer), 1, id-arq) != 1) { printf( "Erro de escrita no arquivo TEXTO.DAT") return 1; } /* fecha o arquivo */ if (fclose(id-arq) != 0) { printf("Erro no fechamento do arquivo TEXTO.DAT"); return 1; } /* abre o arquivo no modo de incluso e leitura */ if ((id-arq = fopen("TEXTO.DAT", "a+")) == NULL) { printf("Erro na abertura do arquivo TEXTO.DAT") return 1; /* l um string do arquivo */ if (fread(buf_str, 22, 1, id-arq) != 1) { printf("Erro de leitura no arquivo TEXTO.DAT); return 1; } /* adiciona final de string */ buf-str[22] = '\0'; printf("\n%s", buf-str); }
40