Você está na página 1de 19

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU

CURSO DE TURBO C
NDICE:
1 - Objetivos. 2 - Introduo. 3 - As palavras reservadas da linguagem C. 4 - Tipos de Dados. 5 - Funes de Entrada e Sada de Dados. 6 - A declarao if. 7 - Operadores Lgicos e Relacionais. 8 - Operadores Aritmticos. 9 - Laos (for, while e do-while). 10 - A declarao break; 11 - A declarao continue. 12 - A declarao switch. 13 - A funco exit(). 14 - Funes em C (declarao return e regras de escopo). 15 - Vetores, Matrizes e Strings. 16 - Ponteiros. 17 - O Pr-Processador da linguagem C. 18 - Tipos de Dados Definidos pelo Usurio (Estruturas, Unies, enumeraes, Typedef e Campos-Bit). 19 - Operadores Avanados (Bit a Bit, ? e vrgula). 20 - Tipos de Dados Avanados (const, volatile, auto, extern, static, register e alocao dinmica). 21 - Arquivos. 22 - Grficos.

BIBLIOGRAFIA:
121 - Objetivos: O principal objetivos desse estudo fazer com que os participantes possam construir programas na linguagem C utilizando todas as ferramentas oferecidas pela mesma e ainda usando os conceitos de programao estruturada adqiridos nas disciplinas IC1, IC2, ED1, ED2, LP, LLF, Esof ou outras similares. 2 - Introduo: A linguagem C uma linguagem de nvel mdio, portanto mais prxima do hardware que linguagens como Pascal ou Fortran e mais distante do mesmo que a linguagem Assembly. Ser uma linguagem de nvel mdio implica que C manipula diretamente os bits, os bytes e os endereos com que o computador funciona. Uma linguagem de nvel mdio fornece aos programadores um conjunto mnimo de declaraes de controle e manipulao de dados, que podero ser usadas para definir construes de alto nvel. Um detalhe importante a fazer que em todas as declaraes funes, comandos, etc, a linguagem C faz distino entre letras maisculas e minsculas, por exemplo do uma palavra reservada e Do ou DO podem representar uma varivel qualquer. 3 - As palavras Reservadas da linguagem C: As 32 palavras reservadas da linguagem C (padro Ansi) so: auto case const default double enum float goto int register short sizeof struct typedef unsigned volatile break char continue do else extern for if long return signed static switch union void while Schildt, Herbert, "TURBO C++ Guia do Usurio", Editora McGraw Hill. Schildt, Herbert, "C Completo e Total:, Editora McGraw Hill.

4 - Tipos de Dados: A linguagem C utiliza cinco tipos bsicos de dados: int (Inteiros)

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


char (caracteres) float (ponto flutuante ou real) double (ponto flutuante duplo) void (sem valor) A partir destes a linguagem utiliza combinaes com os modificadores: unsigned (sem sinal) signed (com sinal) long (longo) short (curto) Resultando ento nas principais combinaes: 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 double long double 8 8 8 16 16 16 16 16 16 32 32 32 32 64 80 Tamanho (bits) -128 a 127 0 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 2147483648 -2147483648 a 2147483648 0 a 4294967295 3.4E-38 a 3.4E+38 1.7E-308 a 1.7E+308 3.4E-4932 a 1.1E+4932 Intervalo

Observando a tabela acima podemos verificar que algumas combinaes entre os tipos bsicos e os modificadores resultam no mesmo intervalo como por exemplo usar signed int e short int. O tipo de dado void usado para identificar uma varivel ou funo que no representa nenhum valor (sem valor). Ex : void func1(void) significa que a funo func1 no retorna nenhum valor e tambm no recebe nenhum parmetro. 5 - Funes de Entrada e Sada de Dados pelo Console: So as funes que envolvem teclado e vdeo. As principais funes de E/S so printf() que imprime na tela e scanf() que l uma informao pelo teclado. Existem outras funes que nos so muito til como: -getchar() -> L um caracter do teclado e aguarda por Enter. -getche() -> L um caracter com eco e no aguarda por Enter. -getch() -> L um caracter sem eco e no aguarda por Enter. -gets() -> L um string do teclado. -putchar() -> Escreve um caractere na tela. -puts() -> Escreve uma string na tela. -printf("string de controle",lista de variveis) *String de Controle -> composta de dois tipos de itens, o primeiro feito de caracteres que sero impressos na tela, e o segundo composto por comandos de formato que definem a maneira como os argumentos so exibidos (comea por sinal de % seguido pelo cdigo). *Lista de Variveis -> so as variveis ou constantes que devero ser impressas. Ex: printf("Meu nome e' %s",'XXXXXXXX'); -scanf("string de controle",lista de variveis) *string de Controle -> so colocados os especificadores de formato (sinal % e seguidos pelo seu cdigo). *Lista de Variveis -> variveis que devero ser lidas. Ex: scanf("%s",nome); Comandos de formato da funo printf() e scanf() %c -> Um nico caractere

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


%d ou %i -> decimal %e ou %E -> Notao cientifica(printf) e ponto flutuante(scanf) %f -> ponto flutuante %g ou %G -> Usa %e ou %f, o que for menor (somente para printf) %o -> octal %x ou %X -> hexadecimal %u -> decimal sem sinal %p -> ponteiro %s -> string Obs: Para imprimir o sinal % usando printf() basta usar %%. Cdigos de barra invertida Existem tambm os cdigos de barra invertida que auxiliam na execuo de algumas impresses, seja na tela ou em formulrios. \b -> Retrocesso \f -> Alimentao de formulrio \n -> Nova linha \r -> Retorno de carro \t -> Tabulao horizontal \" -> Aspas \' -> Apstrofo \O -> Nulo \\ -> Barra invertida \v -> Tabulao vertical \a -> Sinal sonoro 6 - A declarao if: A forma geral da declarao if : if (condio) declarao; else declarao;

A clusula else opcional. Se condio for verdadeira (qualquer coisa diferente de zero), a declarao ou bloco que forma o destino de if ser executada; caso contrrio se ela existir, a declarao ou bloco que o destino de else ser executada. Exemplo: if (opo == 1) printf("Informe um valor: "); else printf("Informe um nome: "); -O encadeamento if-else-if: A forma geral: if (condio) declarao; else if (condio) declarao; else if (condio) declarao; ... else condio; Ex: if (opo == 1) printf("%d", n); else if (opo == 2) printf("%s", nome); else if (opo == 3) printf("%p", point); else printf("Seu Burro!"); 7 - Operadores Lgicos e Relacionais: O termo Operador Relacional refere-se aos relacionamentos que podem haver entre dois valores, e o termo Operador Lgico referese maneira como estes relacionamentos podem ser conectados. OPERADORES RELACIONAIS OPERADOR > >= < <= == != AO Maior que Maior ou igual que Menor que Menor ou igual que Igual Diferente

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


OPERADORES LGICOS && || ! And (E) Or (Ou) Not (No)

8 - Operadores Aritmticos: Os operadores aritmticos em C podem ser aplicados a qualquer tipo de dado interno permitido pela linguagem. Estes operadores so usados dentro dos programas C nas expresses aritmticas, como por exemplo: x = y + z; y = x - k; z = x*y + k; y = x / z; k = y % x; x++ ( o mesmo que x = x + 1 ) x-- ( o mesmo que x = x - 1 ) Na tabela a seguir esto relacionados todos os operadores aritmticos com suas respectivas funes: OPERADORES ARITMTICOS OPERADOR + * / % -++ 9 - Laos: AO Subtrao Adio Multiplicao Diviso Resto da diviso Decremento Incremento

Os laos permitem que um conjunto de instrues seja repetido at que uma condio seja encontrada. Os laos em C so o for, o while e o do-while. -Lao for: A forma geral para este lao a seguinte: for(inicializao;condio;incremento) declarao; A inicializao uma declarao de atribuio usada para inicializar a varivel de controle do lao. A condio usualmente uma expresso relacional que determina quando o lao terminar pelo teste da varivel de controle do lao contra algum valor. O incremento usualmente define como a varivel de controle do lao mudar cada vez que a repetio for realizada. Essas trs divises devem ser separadas por ponto e vrgula (;). O lao for continuar a execuo enquanto a condio for verdadeira, uma vez que ela torne-se falsa, a execuo do programa continuar na declarao seguinte a for. Ex: for (x=1;x<=100;x++) printf("%d",x); for (x=100;x>0;x--) printf("%d",x); Obs: O teste da condio realizado no incio do lao, por isso importante que se a condio for inicialmente falsa o lao no ser executado. -Lao while: Este lao possui a seguinte forma geral: while(condio) declarao; A condio pode ser qualquer expresso vlida. A declarao pode ser uma declarao vazia, uma declarao simples ou um bloco de declaraes que deve ser repetido. O lao repetido enquanto a condio for verdadeira, quando a condio torna-se falsa, o controle do programa passa para a linha seguinte ao cdigo do lao. Ex : while(ch != 'A') ch = getche(); while(x < y) scanf("%f%f",&x,&y); -Lao do-while: Ao contrrio dos laos for e while, que testam a condio do lao no incio, o lao do-while verifica sua condio no final do lao. Isso significa que um lao do-while ser executado pelo menos uma vez. a forma geral :

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


do { declarao; } while(condio);

A declarao pode ser um bloco de declaraes ou simplesmente uma ou ainda nenhuma declarao, este grupo de funes ou comandos sero repetidos at que seja encontra uma condio falsa, esta pode ser qualquer expresso vlida na liguagem C. Ex: do { printf("\ndigite um nmero: "); scanf("%d",&num); } while(num != 0); -Laos Aninhados: Quando um lao est dentro do outro dizemos que o lao interior um lao aninhado. Este tipo de estrutura propiciam meios de resolver alguns problemas de programao. Exemplo genrico: do { while(condio) { for(condio) { declarao for; } } }while(condio); -Lao Infinito: criado usando o lao for e pode ser muito til, quando usado ele faz com que o grupo de declaraes seja repetido infinitamente. Forma: for(;;) declarao; Exerccio: Faa um programa que calcula o MDC de 2 nmeros, utilizando a tcnica de Aristteles: Algortmo: entre X e Y enquanto X Y faa se X > Y ento X X-Y seno Y Y-X fim enquanto imprime MDC = X 10 - A declarao break: A declarao break possui dois usos. O primeiro terminar um case na declarao switch, o qual ser detalhado na seo deste assunto. O segundo uso forar a terminao imediata de um lao, passando sobre o teste condicional normal do lao. Quando uma declarao break encontrada dentro de um lao, este imediatamente encerrado e o controle do programa retomado na declarao seguinte ao lao. Exemplo: int t; for(t=0;t<100;t++) { printf("%d",t); if(t==10) break; } 11 - A declarao continue: A declarao continue funciona de maneira similar declarao break. Mas em vez de forar a terminao, continue fora a ativao da prxima interao do lao, pulando qualquer cdigo que esteja entre eles. Exemplo: #include <stdio.h> main() { int x; for(x=0;x<100;x++) { if(x%2) continue; printf("%d",x); } } 12 - A declarao switch: Ainda que o encadeamento if-else-if possa realizar testes de mltipla escolha, ele quase nunca elegante. O cdigo pode ser muito difcil de acompanhar e confundir o programador. Por esse motivo, a linguagem C tem internamente uma declarao de deciso de

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU

mltipla escolha chamada de switch. Na declarao switch, a varivel sucessivamente testada contra uma lista de inteiros ou constantes, e quando uma associao encontrada, a declarao ou seqncia de declarao associada com a constante executada. Essas constantes no precisam estar numa ordem especial. H trs coisas importantes a saber sobre o switch: 1. Ele difere do if por poder testar somente igualdades. 2. Nunca duas constantes no mesmo switch podem ter valores iguais. 3. Uma declarao switch mais eficiente que um if-else-if encadeado. A forma geral da declarao switch : switch(varivel){ case constante1: seqncia de declaraes break; case constante2: seqncia de declaraes break; case constante3: seqncia de declaraes break; ... default seqncia de declaraes } A declarao default executada se nenhuma correspondncia for encontrada. O default opcional e, se ele no estiver presente, nenhuma ao ser realizada se todas as correspondncias falharem. Exemplo: switch (opo) { case '1' : ao1(); break; case '2' : ao2(); break; default : printf("Opo Invlida"); } 13 - funo exit(): Uma outra maneira de encerrar uma malha de dentro atravs da utilizao da funo exit(), encontrada na biblioteca padro. Pelo fato da funo exit() provocar um encerramento imediato de seu programa sua utilizao limitada. A funo exit() chamada geralmente usando o argumento 0, para indicar que o encerramento do programa normal, mas muitos outros argumentos so usados para a indicao de erros. Muitos compiladores utilizam a chamada da funo sem nehum argumento. Uma aplicao desta funo num caso em que se exige determinadas condies para a execuo do programa e no caso delas no serem encontradas o programa deve ser encerrado imediatamente, usa se ento a funo exit(). Por exemplo, para a execuo de um determinado programa grfico necessrio a presena de uma placa especial de vdeo: main() { ... if(!color_card()) exit(); ... } 14 - Funes em C: As funes so blocos de construo da liguagem C. Este item mostra como uma funo retorna diferente tipos de dados, como usar prottipos de funes, como fazer funes recursivas, a funo main() e alguns outros detalhes envolvendo funes. -A forma geral de uma funo: A forma geral de uma funo : { tipo nome (parmetros) corpo da funo } O tipo determina o tipo de valor que a funo retornar usando a declarao return, pode ser qualquer tipo vlido. Se nenhum tipo especificado, ento, por definio, a funo retorna um resultado inteiro. O nome da funo a forma utilizada para fazer a sua chamada quando necessrio. Os parmetros formam uma lista de tipos de variveis e nomes. Estes so separados por vrgula e recebero os valores dos argumentos quando a funo for chamada. Uma funo pode estar sem parmetro, caso em que a lista de parmetros estar vazia. Ao contrrio da lista de declarao de variveis, na qual muitas variveis podem ser declaradas para serem de um tipo comum, usando-se uma lista de nomes de variveis separados por vrgula, todos os parmetros de uma funo devem incluir tanto o tipo como o nome da varivel, com a seguinte forma geral:

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


tipo f(tipo nomevar1,tipo nomevar2,...,tipo nomevarN) Exemplo: float func1(int x, float y, float z) /*correta*/ float func1(int x, float y,z) /*errada*/

-A declarao return Uma declarao return tem dois importantes usos. Primeiro, ele far com que haja uma sada imediata da funo corrente. Isto , uma declarao return far com que a execuo do programa retorne para o cdigo chamador assim que ele encontrado. Segundo, ela pode ser usada para retornar um valor de uma funo. Para isso basta colocar o valor a ser retornado aps a declarao return. Exemplo: int potncia(int base,int exp) { int i=1; if(exp<0) return; for(;exp;exp--) i=base*i; return i; } Obs: O uso exagerado da declarao return pode desestruturar a funo e fazer com que seu significado fique confuso. A melhor sugesto usar mltiplos returns somente quando contribuirem significativamente para o desempenho de uma funo. -Regras Gerais para o uso de funes: Todas as funes, exceto aquelas declaradas para serem do tipo void, retornam um valor. Esse valor explicitamente especificado pela declarao return ou desconhecido, se nenhuma declarao return especificada. Isso significa que uma funo pode ser usada como um operando em qualquer expresso vlida em C. Exemplos: x = abs(y); if(max(x,y) > 100) printf("excelente"); Entretanto uma funo no pode ser alvo de uma atribuio, como no exemplo: swap(x,y) = 100; /* declarao incorreta */ As funes podem ser declaradas para retornar qualquer tipo vlido da linguagem C. O mtodo da declarao similar ao das variveis: o especificador de tipo precede o nome da funo. Este diz ao compilador que tipo de dado a funo deve retornar. Essa informao essencial execuo correta do programa, uma vez que diferentes tipos de dados tm tamanhos e representaes internas diferentes. -Prottipos de Funes: Antes que uma funo possa ser usada, necessrio que o resto do programa conhea o tipo retornado por esta, mesmo que ela no retorne nenhum valor. A melhor maneira de informar ao compilador sobre o tipo de retorno de uma funo usando um prottipo de funo. Um prottipo de uma funo realiza duas tarefas especiais. Primeiro, ele identifica o tipo de retorno da funo de modo que o compilador possa gerar o cdigo correto. Segundo, ele especifica o tipo e nmero de argumentos usados pela funo. Forma geral: tipo nome-da-funo(lista de parmetros); Normalmente, o prottipo fica prximo ao topo do programa, ou em um arquivo cabealho, e deve ser includo antes que qualquer chamada seja feita para a funo. Exemplo: int func1(int,int); void func2(void); void func3(int,float,int); float func4(float,float); double func5(float,float); -Regras de Escopo de Funes: As regras de escopo de uma liguagem so aquelas que governam se um pedao de cdigo conhece ou tem acesso a outro pedao de cdigo ou dado. Na liguagem C, cada funo um bloco de cdigo discreto. Um cdigo de uma funo privativo daquela funo e no pode ser acessado por qualquer declarao em qualquer outra funo, exceto por uma chamada quela funo. O cdigo que compreende o corpo de uma funo est escondido do resto do programa e, a menos que use variveis ou dados globais, ele no afetar nem poder ser afetado por outras partes do programa, exceto qunado especificado. Existem trs tipos de variveis: variveis locais, parmetros formais e variveis globais. As regras de escopo comandam como cada um desses tipos pode ser acessado por outras partes do seu programa e os seus tempos de vida. Variveis Locais: Uma varivel declarada dentro de uma funo uma varivel local, entretanto, na liguagem C uma varivel pode ser declarada dentro de qualquer bloco de cdigo e ser local a ele. Variveis locais podem ser referenciadas somente pelas declaraes que esto dentro do bloco onde as variveis so declaradas, ou seja, elas no so conhecidas fora do seu prprio bloco de cdigo. O mais importante que as variveis locais existem somente enquanto o bloco de cdigo onde so declaradas est sendo

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


executado. Isto , a varivel criada na entrada do seu bloco e destruda na sada.

Parmetros Formais: Se uma funo usa argumentos, ela deve declarar as variveis que recebero os valores daqueles argumentos. Fora o fato de receberem argumentos de entrada de uma funo, elas comportam-se como quaisquer outras variveis locais dentro da funo. Essas variveis so chamadas de parmetros formais. Os parmetros formais devem ser declarados com o mesmo tipo que os argumentos que so usados para chamar a funo. Estas variveis que recebem os valores dos argumentos passados para a funo podem ser usadas como qualquer outra varivel local. Variveis Globais: Ao contrrio das variveis locais, as variveis globais so conhecidas por meio do programa inteiro e podem ser usadas por qualquer pedao de cdigo. Essencialmente, seu escopo global ao programa. Alm disso, elas mantero seus valores durante a execuo inteira do programa. Variveis globais so criadas declarando-as fora de qualquer funo. Elas podem ser acessadas por qualquer expresso, no importando em qual funo esteja. Variveis globais so muito teis quando o mesmo dado usado em muitas funes no seu programa. Entretanto, deve-se evitar a utilizao de variveis globais por trs razes: 1) Elas ocupam a memria durante todo o tempo em que o programa est executando, no somente quando necessrio. 2) Usar uma varivel global onde haver uma varivel local torna menos geral uma funo, porque ela vai depender de algo que deve ser definido fora dela. 3) A utilizao de um grande nmero de variveis globais pode levar o projeto a erros por causa dos efeitos colaterais desconhecidos e no desejveis. O maior problema no desenvolvimento de programas grandes acidentalmente mudar o valor de uma varivel, j que ela foi usada em outra parte do programa. Ex1: usando var local mul(int x, int y) { return(x*y); } Ex2: usando var global int x,y; {

mul()

return(x*y); } Exerccio:Fazer um funo que calcula o fatorial de n, sendo n inteiro.

15 - Vetores, Matrizes e Strings: Uma matriz uma coleo de variveis do mesmo tipo que so referenciadas por um nome comum. As matrizes podem ter de uma at muitas dimenes, por isso um vetor uma matriz de uma dimenso. Um elemento especfico pode ser acessado por meio de um ndice. A matriz mais freqentemente usada a matriz de caracteres, hajavista que no existe o tipo string internamente na liguagem C. -Vetores: A forma geral da declarao de uma matriz de uma dimenso ou vetor : tipo var_nome[tamanho] O tipo declara o tipo base da matriz, que determina o tipo de cada elemento, o tamanho define quantos elementos a matriz armazenar. -Exemplo: int numeros[10] Na liguagem C, todas as matrizes tm o zero como ndice do seu promeiro elemento. No caso do exemplo anterior a matriz numeros[10], possui dez elementos compreendidos entre numeros[0] e numeros[9]. -Exemplo: main() { int t,x[10]; for(t=0;t<10;++t) x[t] = t; } Obs: A linguagem C no a verificao dos limites da matriz, sendo assim numa matriz de 10 elementos quando acessado um elemento de ordem superior a 9, o compilador no retorna erro, mas voc poder estar acessando o campo de memria destinado a outra varivel. -Strings: O uso mais comum dos vetores na criao de strings de caracteres. Na linguagem C uma string definida como sendo constituda de uma matriz de caractere que terminada por um nulo ('\0'), por isso necessrio declarar os vetores com um caracter a mais que a maior string a ser armazenada. Por exemplo se str uma string de 10 elementos deve ser declarada como str[11]. Para ler uma string do teclado usa-se comumente a funo gets() da biblioteca Stdio.h, com a seguinte forma geral: gets(nome do vetor) Esta funo continua lendo caracteres at que seja inserido um Enter. O nome do vetor ou matriz unidimensional deve estar sem nenhum ndice. Para imprimir uma string usamos a funo printf(), e no caso de necessitar imprimir somente uma string, pode-se usar a funo printf() sem a especificao do tipo. Exemplo: char str[80]; gets(str); printf("%s",str); = printf(str);

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


*Algumas funes que manipulam string: -strcpy(s1,s2) -> Copia o contedo da string "s2" para a string -strcat(s1,s2) -> Anexa "s2" em "s1". -strcmp(s1,s2) -> compara as duas strings e retorna: 0 se s1=s2; >0 se s1>s2; <0 se s1<s2 -strlen(s) -> retorna o temanho de s. -Matrizes: Matrizes multidimensionais, forma geral: tipo nome[tamanho1][tamanho2]...[tamanhoN] int mat[10][10]; char str[10][20]; float num[5][5][5]; "s1".

Exemplo:

Para inicializar uma matriz, a linguagem C permite algumas formas: tipo nome[tam1]...[tamN]={lista de valores} ex: int i[10]={0,1,2,3,4,5,6,7,8,9} Matrizes de caracteres permitem uma inicializao abreviada com a seguinte forma: char nome[tamanho]="string" ex: char str[4]="Alo" Para evitar a contagem do nmero de letras de uma determinada string, pode-se inicilizar a matriz sem a especificao do tamanho: tipo nome[]="string" ex: char str[]="Informao invlida" int num[][2]={1,1,2,4,3,9,4,16,5,25,6,36} 16 - Ponteiros: Um ponteiro uma varivel que guarda um endereo de memria de outro objeto. Mais comumente, esse endereo a localizao de outra varivel na memria. -Variveis Ponteiros: Se uma varivel ir armazenar um ponteiro, ela deve ser declarada para realizar tal tarefa. A forma geral para esta declarao a seguinte: tipo *nome_da_varivel; Onde o tipo pode ser qualquer tipo vlido na linguagem C e o nome da varivel o nome da varivel ponteiro. -Operadores de Ponteiros: Existem dois operadores especiais de ponteiros: & e *. O & um operador unrio que retorna o endereo de memria do seu operando. Ex: count_addr = &count; esta declarao coloca o endereo de count na varivel count_addr. O * o complemento do operador &. um operador unrio que retorna o valor da varivel localizada no endereo que o segue. Ex: val = *count_addr; esta declarao coloca em val o contedo da varivel count, cujo endereo est armazenado na varivel count_addr. Obs: * -> no endereo & -> o endereo -Expresses com Ponteiros: Em geral expresses envolvendo ponteiros obedecem as mesmas regras que qualquer outra expresso na linguagem C. -Atribuio de Ponteiros: Como qualquer varivel, um ponteiro pode ser usado no lado direiro de uma declarao para atribuir seu valor para um outro ponteiro. Exemplo: int x,*p1,*p2; x=101; p1=&x; p2=p1; printf("endereo de x %p",p2); printf("valor de x %d",*p2); -Aritmtica com Ponteiros: Somente duas operaes aritmticas podem ser usadas com ponteiros: adio e subtrao. Seja p1 um ponteiro para inteiro com o valor atual de 2000, aps a expresso: p1++; o contedo de p1 ser 2002 e no 2001, pois a cada incremento p1 apontar para o prximo inteiro (2 bytes). O mesmo ocorre com o decremento, ou seja aps p1--; o contedo de p1 ser 1998. Tambm vlido expresses do tipo: p1=p1+9; onde agora p1 apontar para o nono elemento do tipo base de p1. -Comparao com ponteiros: possvel comparar dois ponteiros em uma expresso relacional. Por exemplo, dados dois ponteiros p e q, quando comparamos: if(p<q)printf("p aponta para um endereo de memria menor que q") Geralmente, comparaes entre ponteiros devem ser usadas somente quando dois ou mais ponteiros esto apontando para um

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


objeto em comum.

10

-Ponteiros e Matrizes: H uma relao entre ponteiros e matrizes, observe: char str[80], *p1; p1=str; Aqui, p1 foi associado ao endereo do primeiro elemento da matriz em str. Na linguagem C, um nome de matriz sem ndice o endereo para o comeo da metriz. O mesmo resultado da declarao acima pode ser gerado como a declarao abaixo: p1=&str[0]; Se desejar acessar o quinto elemento de str: str[4] ou *(p1+4) Portanto pode-se acessar uma matriz por indexao ou usando ponteiros. -Indexando um Ponteiro: Em C, possvel indexar um ponteiro como se ele fosse uma matriz. Por exemplo: int i[5]={1,2,3,4,5}, *p, t; p = i; for (t=0;t<5;t++) printf("%d",p[t]); As declaraes p[t] e (p+t) so idnticas. -Ponteiros e Strings: Observe como pode ser escrita a funo strlen(): int strlen(char *s) { int i=0; while(*s) {i++; s++;} return(i); } -Matrizes de Ponteiros: Podem existir matrizes de ponteiros como acontece com qualquer outro tipo de dado. A declarao para uma matriz de ponteiros, do tipo int, de tamanho 10 : int *x[10]; Para atribuir o endereo de uma varivel ponteiro ao 3ro elemento da matriz x: x[2]=&var; Para encontrar o valor de var: *x[2]; -Endereo de um elemento de uma matriz: possvel atribuir o endereo de um elemento especfico de uma matriz, aplicando-se o operador & para uma matriz indexada. Exemplo: int x[10]; int *p; p = &x[3]; -Ponteiros para Ponteiros: Um ponteiro para ponteiro uma forma de mtipla indireo, ou uma cadeia de ponteiros. No caso de um ponteiro para ponteiro, o primeiro ponteiro contm o endereo do segundo ponteiro, que aponta para uma varivel com o valor desejado. Exemplo: float **ponteiro1; Para acessar o valor desejado, apontado indiretamente por um ponteiro para um ponteiro, o operador asterisco deve ser aplicado duas vezes. Exemplo: main() { int x, *p, **q; x = 10; p = &x; q = &p; printf("x=%d",**q); printf("x=%d",x); printf("Endereo de x=%p",p); printf("Endereo de p=%p",q); } -Erros comuns: Exemplo: /* programa incorreto */ main { int x, *p;

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


x = 10; *p = x; } Exemplo: /* Programa incorreto */ main { int x, *p; x = 10; p = x; } Exemplo: /* Verso Correta */ main { int x, *p; x = 10; p = &x; printf("x=%d",*p); }

11

17 - O Pr-Processador da Linguagem C: possvel incluir vrias instrues para o compilador turbo C no cdigo-fonte de um programa. Essas instrues so chamadas diretivas do pr-processador, que so as seguintes: #if #ifdef #ifndef #else #elif #endif #include #define #undef #line #error #pragma Como se pode ver, todas as diretivas do pr-processador comeam com um sinal #. Alm disso, cada diretiva do pr-processador deve estar numa linha exclusiva. Por exemplo o seguinte trecho no pode ser construdo: #include <stdio.h> #include <conio.h> /* est errado */ #define Esta diretiva usada para definir um identificador e uma seqncia de caracteres que ser substituda por ele cada vez que for encontrada no arquivo de cdigo-fonte. O indentificador chamado macro e o processo de substituio chamado macrossubstituio. A forma geral : #define nome_da_macro seqncia_de_caracteres Ex: #define MAX 100 #define VERSAO "versao 2.1" main() { printf(VERSAO); printf("%d",MAX); } A diretiva define tem uma importante caracterstica, o noma da macro pode ter argumentos. Cada vez que o nome da macro encontrado, os argumentos associados a ela so substitudos pelos argumentos atuais. Exemplo: #define MIN(a,b) ((a)<(b)) ? (a) : (b) #error Esta diretiva fora o compilador a parar qunado encontrada, forma geral: #error mensagem_de_erro A mensagem de erro no fica entre aspas. Quando o compilador encontra esta diretiva, ele exibe a seguinte informao e termina a compilao: Error nome_do_arquivo nmero_da_linha Diretiva_de_Erro: mensagem_de_erro Exemplo: #if !defined(MODEL) #error Building Model not defined #endif #include Esta diretiva do pr-processador instrui o compilador e includir outro arquivo fonte junto ao que possui a diretiva #include. O arquivo-fonte deve estar entre aspas ou entre sinais de menor e maior. Exemplo: #include "stdio.h" /* ou */ #include <stdio.h> #if, #else, #elif, #endi Estas diretivas permitem compilar seletivamente partes de um cdigo-fonte de um programa. Esse processo chamado compilao

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


condicional. A diretiva #if executada se a expresso constante for verdadeira, o cdigo que est entre ela e um #endif compilado. Forma Geral da diretiva #if: #if expresso_constante seqncia de declaraes #endif #define MAX 100 main() { #if MAX>99 printf("MAX maior que 99"); #endif } A diretiva #else funciona, em muitos aspectos, da mesma maneira que o else da linguagem C. Exemplo: #if MAX>99 printf("MAX maior que 99"); #else printf("MAX menor que 99"); #endif A diretiva #elif significa "else if" e usada para estabelecer um encadeamento if/else/if para opes de compilao mltipla. Forma Geral: #if expresso seqncia de declaraes #elif expresso 1 seqncia de declaraes ... #endif #define GERMANY 0 #define ITALY 1 #define BRAZIL 2 #define PAIS_ATUAL BRAZIL #if PAIS_ATUAL==BRAZIL char ataque[]="Romario" #elif PAIS_ATUAL==GERMANY char ataque[]="Matthus" #else char ataque[]="Baggio" #endif

12

Exemplo:

Exemplo:

#ifdef e #ifndef Outro mtodo de compilao condicional usa as diretivas #ifdef e #ifndef, que significam "se definido" e "se no definido", respectivamente. Forma Geral de #ifdef #ifdef nome_da_macro seqncia de declaraes #endif Forma Geral de #ifndef #ifndef nome_da_macro seqncia de declarao #endif Estas diretivas verificam se o nome foi ou no definido por uma declarao #define. Exemplo: Ambas podem usar a declarao #else, mas no podem usar a diretiva #elif. #define JOAO 10 main() { #ifdef JOAO printf("Hello"); #else printf("Oi"); #endif #ifndef RAQUEL printf("Ai"); #endif }

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


#undef Esta diretiva usada para remover uma definio feita previamente do nome da macro que a segue. Forma geral: #undef nome_de_macro Exemplo: #define M 10 char vet[M] #undef M

13

#line Esta diretiva usada para mudar os contedos de _ _ LINE _ _ e _ _FILE _ _ , que so identificadores predefinidos no compilador. Forma geral: #line nmero "nome de arquivo" Onde nmero qualquer inteiro positivo (se torna o novo valor de _ _ LINE _ _ ) e nome de arquivo opcional qualquer identificador de arquivo vlido ( se torna o novo valor de _ _ FILE _ _ ). Ex: #line 100 main() { printf("%d",_ _ LINE _ _); } #pragma Esta diretiva definida pela implementao e permite que vrias instrues sejam dadas ao compilador. Forma Geral: #pragma nome 18 - Dados Definidos Pelo Usurio: A linguagem C permite criar cinco tipos de dados particulares: Estruturas, Campo-bit, Unio, Enumerado e TypeDef (tipo definido). Estruturas: Uma estrutura uma coleo de variveis referenciadas sobre um nome, provendo um meio conveniente de manter informaes relacionadas juntas. Uma declarao de estrutura forma uma fonte que pode ser usada para criar variveis de estrurutas. As variveis que compreendem a estruruta so chamadas de elementos da estrutura ou membros da estrutura. A palavra reservada struct usada para definir as estruturas. A forma geral de uma declarao estrutura : struct nome_do_tipo_da_estrutura { tipo nome_de_elemento_1; tipo nome_de_elemento_2; ... tipo nome_de_elemento_N; } variveis_estrura; Exemplo: struct endereco { char nome[30]; char rua [40]; char bairro[20]; char cidade[30]; char estado[3]; unsigned long int cep; }inf_cliente,inf_aluno,inf_professor; /* ou da seguinte forma */ struct endereco { char nome[30]; char rua [40]; char bairro[20]; char cidade[30]; char estado[3]; unsigned long int cep; }; struct endereco inf_cliente,inf_aluno,inf_professor; Membros individuais da estrutura so referenciados pelo uso do operador de seleo de membro: o ponto. Exemplo: printf(inf_cliente.bairro); inf_cliente.cep = 38400001; Matrizes de estruturas so muito usadas, para declar-la primeiro defini-se a estrutura e ento declara uma varivel matriz daquele tipo. Exemplo: struct endereco inf_geral[100]; Para acessar uma estrutura especfica, o nome da estrutura indexado. Exemplo: printf(inf_geral[0].nome); Se duas variveis so do mesmo tipo, pode-se atribuir uma a outra. Neste caso todos os elementos do lado esquerdo da atribuio

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


recebero os valores dos elementos correspondentes da estrutura do lado direito. Exemplo: inf_cliente = inf_aluno; Passando elementos da estrutura para funes. Exemplo: struct kdt{ char x; int y; char s[10]; }exemplo; main() { func1(exemplo.x) /* passa o valor de x */ func2(exemplo.y) /* passa o valor de y */ func3(exemplo.s) /* passa o endereo da string s */ func1(&exemplo.x) /* passa o endereo de x */ func3(&exemplo.s) /* passa o endereo de s */ func1(exemplo.s[4]) /* passa o valor de s[2] */ Passsando estruturas inteiras para funes. exemplo: struct exemplo { int a,b; char ch; }; void f1(struct exemplo); main(){ struct exemplo arg; arg.a=arg.b=1000; ch='a'; f1(arg); return 0; } void f1(struct exemplo parm){ printf("%d\n%d\n%c",parm.a,parm.b,parm.ch); }

14

Ponteiros para estruturas. A linguagem C permite ponteiros para estruturas da mesma maneira que aceita ponteiros para qualquer outro tipo de varivel. Para declarar um ponteiro para estrutura coloca-se o operador * na frente do nome da varivel . Exemplo: struct endereco *inf_cliente; Pode-se passar toda a estrutura para uma funo, mas existe uma grande desvantagem no caso de uma estrutura com muitos elemntos que a performance de tempo de execuo. A soluo para esse problema passar somente um ponteiro para estrutura. Para encontrar o endereo de uma varivel estrutura, o operador & colocado antes do nome da varivel estrutura. Exemplo: struct banco { float saldo; char nome[80]; } cliente; struct banco *p; /* declara um ponteiro para a estrutura */ main() { p = &cliente; /* coloca o endereo de cliente em p */ printf("%f",(*p).saldo); } Raramente utiliza-se o operador * ao trabalhar com ponteiros para estruturas. Para o acesso a um membro de uma estrutura um operador especial definido pela linguagem C realiza esta tarefa. chamado operador seta e possui a seguinte forma: " -> ". Para acessarmos ao membro saldo da estrutura definida acima usando o operador seta: printf("%f",p->saldo); Membros de estruturas podem ser de qualquer tipo de dado vlido na linguagem C, incluindo-se matrizes e estruturas. Exemplo: struct x{ int a[10][10]; float b; }; struct z{ struct x y; float c; }w; main(){

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


printf("%d",w.y.a[1][2]); printf("%f",w.y.b); printf("%f",w.c); }

15

Unies: Uma union uma localizao de memria usada por muitos tipos de variveis diferentes. A declarao union similar ao de uma estrutura, como no exemplo: union u_tipo{ int i; char ch; } cnvt; Quando uma varivel union declarada, o compilador cria automaticamente uma varivel grande o bastante para armazenar o tipo da varivel de maior tamanho na union. Para acessar um elemento union deve-se usar a mesma sintaxe das estruturas: os operadores ponto e seta. Quando se opera diretamente na union, usa-se o operador ponto. Se a varivel union acessada por meio de um ponteiro, usa-se o operador seta. Ex: cnvt.i=10; Enumeraes: Uma enumerao um conjunto de constantes inteiras que especifica todos os valores legais que uma varivel de um tipo especfico pode ter. So definidas de modo semelhante s estruturas com a palavra reservada enum usada para indicar o incio de um tipo enumerado. A forma geral : enum nome_da_enumerao {lista_de_enumerao} lista_de_variveis; A lista de enumerao uma lista de nomes separados por vrgulas. Tanto o nome do tipo enumerado como a lista de variveis so opcionais. Exemplo: enum cidade{uberlandia,uberaba,araguari}; main() { enum cidade tmineiro; tmineiro=uberaba; if(tmineiro==uberlandia) printf("Ola galera de uberlandia"); } O ponto chave para entender as enumeraes que cada um dos smbolos representado por um inteiro. Assim sendo, eles podem ser usados em qualquer expresso vlida como inteiros. A menos que seja inicializado de outra maneira, o valor do primeiro smbolo da enumerao zero, do segundo 1 e assim por diante. Exemplo: enum cidade{uberlandi,uberaba=32,araguari}; printf("%d,%d,%d",uberlandia,uberaba,araguari) /* 0,32,33 */ Typedef: A linguagem C permite definir explicitamente novos nomes de tipos de dados usando-se a palavra reservada typedef. No se cria um novo tipo de dado, mas, ao contrrio, define-se um novo nome para um tipo existente. Forma geral: typedef tipo nome; Onde tipo qualquer tipo de dado permitido e nome o novo nome para esse tipo. Exemplo: typedef float flutuante; flutuante atraso; /* mesmo que float atraso */ Campos-Bit A linguagem C tem um modo prprio de acesar um ou mais bits dentro de um byte ou palavra. Isso pode ser til por diversas razes: primeiro, se o espao limitado, pode-se armazenar muitas variveis booleanas (true/false) em um byte; segundo, certas interfaces de dispositivos transmitem informaes codificadas em vits dentro de um byte; e terceiro, certas rotinas de codificao de dados necessitam acessar os bits dentro de um byte. Um mtodo que a linguagem C utiliza para acessar os bits baseia-se na estrutura chamada campos-bit. Um campo-bit somente um tipo de membro de estrutura que define o quo grande, em bits, cada elemento deve ser. Forma geral: struct nome_do_tipo_estrutura { tipo nome1: tamanho; tipo nome2: tamanho; ... tipo nomeN: tamanho; } Exemplo: struct equipamento { unsigned inicia_via_disquete: 1; unsigned tem80387: 1; unsigned ram_placa: 2; unsigned modo_vdeo: 2; unsigned flexveis: 2; unsigned dma: 1; unsigned portas: 3;

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU

16

unsigned adptador_jogo: 1; unsigned sem_uso: 1; unsigned num_impressoras: 2; }eq; As variveis campos-bit possuem certas restries: no se pode obter seu endero; no podem ser colocadas em matrizes; no se pode sobrepor o limite dos inteiros. No entanto vlido misturar membros normais de estrutura com elementos compos-bit. 19 - Operadores Avanados: Anteriormente foram mostrados os operadores mais comuns na linguagem C. Alm destes a linguagem C contm muitos operadores especiais que aumentam seu poder de flexibilidade, em seguida o estudo de cada um deles: -Operadores Lgicos Bit-a-Bit: As operaes bit-a-bit referem-se a testar, indicar ou movimentar os bits em um byte ou uma palavra, que correspondem aos tipos char, int e long em C. Operaes bit-a-bit no podem ser usadas nos tipos float, double, long double, void ou tipo mais complexo. Os operadores bit-a-bit AND, OR e NOT so governados plea mesma tabela verdade que seus equivalentes lgicos, s que eles funcionam em nvel bit-a-bit. Existe tambm um outro operador lgico denominado OR ^exclusivo (XOR) que se torna verdadeiro apenas se exatamente um dos operadores verdadeiro, caso contrrio ele falso. Operador & | ^ ~ >> << Ao AND OR OR exclusivo (XOR) Complemento de um (NOT) Deslocamento direita Deslocamento esquerda

Exemplo: /*Exibe os bits dentro de um byte*/ void exibe(int i) { register int t; for(t=128;t>0;t=t/2) if(i&t) printf("1"); else printf("0"); } -O Operador ? O operador ? pode ser usado para substituir as declaraes if/else desta forma geral: if(condio) expresso else expresso A principal restrio que o alvo, tanto do if como do else, deve ser uma expresso simples - no uma declarao em C. O ? chamado operador ternrio porque requer trs operandos e tem a seguinte forma geral: Exp1 ? Exp2 : Exp3 A exp1 avaliada. Se for verdadeira, Exp2 avaliada e torna-se o valor da expresso ? , caso seja falso, Exp3 avaliada e torna-se o valor da expresso. Por exemplo: x=10; y=x>9 ? 100 : 200; /* ou ento */ if(x>9) y=100; else y=200; -Abreviao em C: A linguagem C tem um abreviador que simplifica a codificao de um certo tipo de declatao de atribuio. Por exemplo: x+ = 10; /* x = x + 10 */ Essa abreviao funcionar para todos os operadores binrios na linguagem C, isto aqueles que requerem dois operandos. A forma geral da abreviao : var op = expresso; -O operador vrgula: O operador vrgula usado para enfileirar muitas expresses. Essencialmente, o objetivo do operador vrgula fazer com que uma seqncia de operaes seja realizada. Quando ele usado do lado direito de uma declarao de atribuio, o valor atribudo o da ltima expresso da lista separada por vrgula. Exemplo: x=(y=3,y+1) /* y=3; x=y+1 */ x=(y=20,y-=5,30/y) /* y=20; y=y-5; x=30/y */ 20 - Tipos de Dados Avanados: At o ento foram usados somente os cinco tipos de dados bsicos (int, float, double, char, void). Entretanto a linguagem C

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


proporciona vrios modificadores: -Modificadores de tipo : long, short,signed e unsigned -Modificadores de acesso : const e volatile -Modificadores (especificadores de classe) de armazenamento : Forma geral: Modificador especificador_de_tipo lista_de_variveis; Os modificadores de tipo j foram vistos anteriormente. -Modificadores de acesso: So usados para controlar o modo como as variveis podem ser acessadas ou modificadas.

17

auto, extern, static e register

-Const: Variveis declaradas com o modificador const no podem ser modificadas durante a execuo do programa. Entretanto, pode-se dar a elas um valor inicial. Por exemplo: const float verso=3.2; cria uma varivel do tipo float chamada verso que no pode ser modificada pelo programa, mas ser usada em outros tipos de expresso. Uma varivel const receber seu valor ou por inicializao explcita ou por algum meio dependente de hardware. Este modificador assegura que a varivel no sofrer modificao por outras partes do programa. -Volatile: O modificador volatile usado para dizer ao compilador que o valor de uma varivel pode ser mudado de maneira no especificada pelo programa. Por exemplo, assuma que a varivel clock esteja sendo atualizada a cada 10 segundos pelo mecanismo de relgio do computador. Se a varivel no assumida como volatile, a seguinte declarao no funcionar adequadamente. -Especificadores de classe de armazenamento: So usados para dizer ao compilador como a varivel que os segue deve ser armazenada. O especificador de armazenamento precede o resto da declarao da varivel. Sua forma geral: especif._de_armazenamento especif._de_tipo lista_de_variveis -Auto: O especificador auto usado para declarar variveis locais. Contudo, ele raramente usado, j que variveis locais so auto por definio. extremamente difcil ver esta declarao em um programa. -Extern: A linguagem C contm a palavra reservada extern, que ajuda no suporte a aplicaes de mltiplos arquivos. Isto torna necessrio quando os programas tornam-se exageradamente grande e o tempo de compiao passa a ser demasiadamente longo. Uma vez que a linguagem C permite que os mdulos compiladados separadamente seja link-editados para agilizar a compilao e auxiliar no gerenciamento de grandes projetos, h uma maneira de mostrar a todos arquivos as variveis globais requeridas pelo programa. Se elas forem declaradas em cada arquivo (de um programa de mltiplos arquivos), surgir problemas. Ento a soluo declar-las em um arquivo e usar a declarao extern nos outros. Veja o exemplo a seguir: Arquivo 1 int x,y; char ch; void main(void) { ... } func1(void) { x=123; } Arquivo 2 extern int x,y; extern char ch; func22(void) { x=y/10; } func23(void) { y=10; }

-Static: Variveis do tipo static so permanentes dentro da sua prpria funo ou arquivo. Elas diferem das variveis globais por no serem conhecidas fora da sua funo ou arquivo, porm mantm seu valor entre chamadas. Essa caracterstica pode ser bastante til quando se escreve funes generalizadas e funes de biblioteca que podem ser usadas por outros programadores. J que os efeitos da declarao static so diferentes quando usada em variveis locais e em variveis globais, veja a seguir. Quando aplicado a uma varivel Local, o modificador static faz com que o compilador crie armazenamento permanente para ela, em muitos aspectos, da mesma maneira que para uma varivel global. A diferena principal entre uma varivel local static e uma global (no static) que a static local permanece conhecida somente no bloco onde ela declarada. Simplificando, uma varivel static local uma varivel local que retm seu valor entre as chamadas de funes. Veja o exemplo: int series(void)

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


{ static int num; num = num + 23; /*num mantido entre chamadas de series*/ return(num); }

18

Quando aplicado a um a varivel Global, o especificador static instrui o compilador a criar uma varivel que conhecida somente no arquivo onde a varivel static global declarada. Isso significa que, ainda que a varivel seja global, outras rotinas em outros arquivos no podem ter conhecimento dela ou alterar o seu contedo diretamente, assim, ela no est sujeita a efeitos colaterais. Portanto, nas poucas situaes em que uma varivel static local no possa fazer o trabalho, pode-se criar um pequeno arquivo contendo somente as funes que necessitam das variveis static globais, compilar separadamente e us-lo sem preocupao com os efeitos colaterais. Veja o exemplo: static int num; int series(void); { num = num + 23; return(num); } void inicial(int valor) { num = valor; } -Register: Outro importante modificador de tipo encontrado na linguagem C register, tradicionalmente aplicado somentedo tipo int e char. Na verso original da linguagem C, o especificador register requisita ao compilador para manter o valor das variveis declaradas com ele em registradores da CPU em vez de na memria, onde as variveis so normalmente armazenadas. Isto significa que as operaes com variveis register podem ser muito mais rpidas que as operaes com variveis armazenadas na memria, uma vez que nenhum acesso memria requerido para determinar ou modificar os seus valores. Contudo, a padronizao ANSI C expandiu o significado do modificador register, agora ele pode ser aplicado a qualquer tipo de dado e, com isso, o compilador tentar tornar o acesso a qualquer varivel modificada por register to rpido quanto possvel. O especificador register somente pode ser aplicado s variveis locais e aos parmetros formais em uma funo. Por conseguinte, variveis register globais no so permitidas. Exemplo: int pwr(int m,register int e) { register int temp; ... } 21 - Alocao Dinmica: Existem duas maneiras primrias de um programa em C armazenar informao na memria do computador. A primeira usa variveis globais e locais definidas pela linguagem C. Neste caso requerido ao programador saber a quantidade de espao necessrio para cada situao. A segunda maneira por meio do uso do sistema de alocao dinmica da linguagem C. Nesse mtodo (usando-se o modelo de memria padro small), o epao para informao alocado na rea de memria livre que fica entre o seu programa e a rea de armazenamento permanente da pilha. O mago do sistema de alocao da linguagem C so as funes malloc() e free(). Elas trabalham juntas usando a regio de memria livre para estabelecer e manter uma lista do espao disponvel. A funo malloc() aloca a memria e a funo free() libera-a. Qualquer programa que use essas funes deve incluir o arquivo cabealho STDLIB.H . A funo malloc() tem este prottipo: void *malloc(unsigned nmero_de_bytes); Ela retorna um ponteiro do tipo void, o que significa que voc pode atribuir a ele qualquer tipo de ponteiro. Depois de uma chamada com sucesso, a funo malloc() retornar um ponteiro para o primeiro byte da regio de memria alocada do heap (restante da memria RAM disponvel depois do carregamento de um programa para execuo). Se no memria disponvel suficiente para satisfazer a requisio da funo malloc(), ocorre uma falha de alocao e a funo retorna nulo. Pode-se usar o operador sizeof para determinar o nmero exato de bytes necessrios a cada tipo de dado. A funo free() o oposto da malloc(), j que ela retorna a memria previamente alocado ao sistema. Uma vez liberada, a memria pode ser reutilizada por uma chamada subseqente a malloc(). A funo free() tem este prottipo: void free(void *p); Exemplo: int *p,t; p = malloc(40*sizeof(int)); if(!p) printf("Erro de alocao"); else free(p); 22 - Arquivos Aarquivos so estruturas de entrada e/ou sada de dados. Existem diversos comandos para voc inserir criar, ler, escrever, modificar os

CURSO DE TURBO C - ENGENHARIA ELTRICA/UFU


arquivos.

19

Existem basicamente dois tipos de arquivos em C : Arquivos binrios e arquivos ASCII. Os arquivos binrios so aqueles que foram escritos em modo binrio e somente podero ser lidos com comandos especiais que entendam os cdigos binrios. Arquivos ASCII, ou modo textos so arquivos que podem ser lidos diretamente do arquivo pelo usurio e tambm existem comandos especiais para l-los de dentro do seu programa. Para trabalhar com arquivo em C primeiro voc precisa definir um ponteiro para o arquivo. Atravs deste ponteiro todas as operaes podero ser feitas. Ex: FILE *fp; FILE um tipo definido pelo C para definir ponteiros de arquivo. Para abir um arquivo usa-se o seguinte comando: fp = fopen(<nome do arquivo>, <atributos>); <nome do arquivo> = Nome do arquiovo que voc pretende abir. Os <atributos> podem ser os seguintes: wt : Para escrita em modo texto. Com este atributo voc cria um arquivo para escrita em modo texto e apaga se existir algum arquivo com o nome <nome de arquivo>. rt : Para leitura de arquivos em modo texto. Com este atributo voc abre um arquivo para leitura. Note que se o arquivo no existir ocorrer um erro. at : Abre e/ou Cria arquivo para atualizao em modo texto. wb : Cria arquivo para escrita em modo binrio. rb : Abre arquivo para leitura em do binrio. ab : Abre e/ou cria arquivo para atualizao em modo binrio. Sendo que todos estesm atributos podem ter o sinal + entre as letras que indicam que o arquivo escrita e leitura. Por exemplo: r+t ser aberto um arquivo em modo texto para escrita mas tambm poder ser lido dados deste arquivo. Funes de Entrada e Sada em Arquivos Existem vrias funes de entrada e sada em arquivo. Iremos apresentar aqui algumas delas: int getc(FILE *fp); Le um caracter do arquivo apontado por fp, retorna o caracter em caso de sucesso e -1 em caso de falha. int putc(FILE *fp, int c); Escreve um caracter no arquivo apontado por fp, retorna 1 em caso de sucesso e 0 em caso de falha. int fprintf(FILE *fp, <string de controle>, <variveis>,...);Semelhante ao printf, sendo que a estring de controle direcionada para o arquivo apontado por fp. int fscanf(FILE *fp, <string de controle>, <varivveis>,...); Semelhante ao scanf, sendo que a leitura direcionada para o arquivo apontado por fp. As funes dada acima so para arquivos tipo texto, sendo que podem ser utilizadas para arquivos binrios. int fwrite(void far *ptr, unsigned tam_bytes_cada_elem, unsugnded num_elem, FILE *fp); Escreve em um arquivo em modo binrio os dados apontados por ptr, sendo que cada elemento possue tam_bytes_cada_elem bytes, e ser escrito num_elem elementos no arquivo. Este arquivo est sendo apontado por fp. int fread(void *ptr, unsigned tam_bytes_cada_elem,unsigned num_elem, FILE *fp); L de um arquivo apontado por fp num_elem dados, sendo que cada dado possue tam_bytes_cada_elem bytes, e estes dados sero colocados na regio de memriia apontado por ptr. int fclose(FILE *fp); Funo para fechar um arquivo. Sempre que se abir um arquivo, o mesmo dever ser fechado. int fseek(FILE *fp, unsigned long int Pos, int Opo); Esta funo manipula o ponteiro de arquivo fp dentro do arquivo. De acordo com a Opo escolhida voce pode avanar o ponteiro Pos byte apartir do inicio, Pos bytes apartir do final, ou ainda Pos bytes apartir da posio atual. Estas so as funes bsicas que iremos apresentar, sendo que existem muitas outras funes podem ser exploradas a medida que cada desejar. 23 - Grficos Para inicializar o modo grfico em C, necessrio primeiro detectar o modo de vdeo apropriado e o driver de dispositivo instalado. Assim, temos a seguir uma forma de que o modo grfico pode ser inicializado. void initgr(void) { int placa,modo; detectgraph(&placa,&modo); initgraph(&placa, &modo, "c:\borlandc\bgi"); } Da maneira que est sendo inicializado, sempre que voce precis executar este programa ele procura pelo diretrio c:\borlandc\bgi para buscar os drivers de inicizao do modo grfico. Existe um meio para voc colocar isto dentro do seu programa. utilizando as funes a seguir: if(registerbgidriver(EGAVGA_driver) < 0) exit(1); if(registerbgifont(small_font) < 0) exit(1); if(registerbgifont(triplex_font) < 0) exit(1); if(detectgraph(&placa,&modo) < 0) exit(1); A funo registerbgidriver para inicializar o driver da placa de vdeo dentro do seu programa, e as outras funes para os tipos de letras que o C define para o modo grfico.