A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo.

Apresentações semelhantes


Apresentação em tema: "LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo."— Transcrição da apresentação:

1 LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo

2 Tópicos 1. Introdução à Linguagem C 2. Operadores e Expressões
3. Estruturas de Controle 4. Entrada e Saída 5. Vetores 6. Strings 7. Funções 8. Ponteiros 9. Estruturas e Uniões 10. Arquivos Texto 11. Arquivos Binários

3 Exemplos de define - número
Entrada e Saída Como ocorre em C Através do uso de bibliotecas Dois sistemas: o sistema de arquivo bufferizado (Ansi) e o sistema não-bufferizado (Unix) As funções do padrão Ansi não têm o sistema não-bufferizado, mas devem ser as mais usadas Comandos do pré-processador # define identificador string Exemplos de define - número #define verdadeiro 1 #define falso 0 ... printf(”%d %d %d”,falso,verdadeiro,verdadeiro+1)

4 Exemplos de define - parte de definição
#define um 1 #define dois um+um #define tres um+dois Exemplos de define - saída #define ms_e “erro padrao na entrada \n” ... printf(ms_e); Exemplos de define - em string #define xyz “isto e um teste\n” ... printf(xyz); Exemplos de define - tamanho de elementos #define tamanho_max 16 unsigned int pots_de_dois[tamanho_max]; main() { int i; pots_de_dois[0]=1; for (i=1; i<tamanho_max; i++) pots_de_dois[i]=pots_de_dois[i-1]*2; for (i=0; i<tamanho_max; i++) printf(“%u “,pots_de_dois[i]);

5 Exemplos de include - stdio
Comandos do pré-processador # include arquivo Exemplos de include - stdio #include <stdio.h> #include “stdio.h” Os arquivos colocados no include são chamados arquivos-cabeçalho (stdio.h ou io.h) fila de bytes = abstração entre o dispositivo e o programador dispositivo real = arquivo embora cada dispositivo seja diferente, o sistema de arquivo bufferizado transforma cada um em um dispositivo lógico chamado fila de bytes as funções que escrevem em um arquivo em disco podem também escrever no console fila de texto = sequência de caracteres organizada em linhas encerradas por \n

6 filas binárias = sequência de bytes que têm correspondência unívoca com os bytes do dispositivo externo Contudo, o computador pode usar bytes nulos para completar a informação para que seja preenchido o setor de um disco Arquivos É associada uma fila de bytes a um determinado arquivo realizando uma opção de abertura Todas as filas de bytes são iguais, mas nem todos os arquivos são iguais Na solicitação de posicionamento de arquivo a abertura do mesmo também inicializa o indicador de posição do arquivo para o início do arquivo. O indicador de posição é incrementado.

7 Para que um arquivo deixe de ser associado a uma fila de bytes é realizada uma opção de fechamento. Esse processo, chamado esvaziamento de buffer, garante que o computador fechará automaticamente os arquivos quando o programa terminar. E quando houver uma queda do sistema? Na execução de um programa, são abertas três filas de texto pré-definidas: stdin, stdout, sterr Cada fila de bytes associada a um arquivo tem uma estrutura de controle de arquivo do tipo FILE Para o programador, toda entrada e saída é feita através de filas de bytes

8 Entrada e saída do console
Operações que ocorrem no teclado e na tela do computador. Caso especial do sistema de arquivo não-bufferizado. Existem funções especiais para este sistema de arquivo. getche() - lê um caractere do teclado putchar() - imprime um caractere na tela Exemplo getche - putchar #include “stdio.h” main() { char ch; do { ch = getche(); if (islower(ch)) putchar (toupper(ch)); else putchar(tolower(ch)); } while (ch != ‘.’); }

9 Exemplo gets Variações de getche:
getchar() - armazena a entrada até que seja dado um enter getch() - igual a getche, só que não ecoa na tela Funções que permitem que sejam lidas e gravadas strings de caracteres no console: gets() - lê uma string de caracteres que podem ser inseridos no teclado formato do gets: char *gets(char *s) Exemplo gets main() { char str[80]; gets (str); printf (“comprimento e %d”, strlen(str)) } puts() - escreve uma string e um \n na tela formato do puts: char *puts(char *s)

10 Qual das funções deve ser mais usada: O puts ou o printf?
Formatos de entrada e saída de console: são verificados no printf e no scanf formato do printf: printf(“string”, argumentos); Código Formato %c um caractere %d decimal %i decimal %e notação científica %f decimal flutuante %g %e ou %f %o octal %s string de caracteres %u decimal sem sinal %x hexa %% % %p ponteiro %n ponteiro inteiro com o número de caracteres

11 formato do scanf: scanf(“string”, argumentos);
Código Formato %c um caractere %d decimal %i decimal %e notação científica %f decimal flutuante %o octal %h hexa %s string de caracteres %x hexa %% % %p ponteiro %n ponteiro inteiro com o número de caracteres

12 Entrada e saída bufferizado
Possui várias funções: fopen() abre uma fila fclose() fecha uma fila putc() grava um caractere na fila getc() lê um caractere da fila fseek() procura byte específico fprintf() printf de uma fila fscanf() scanf de uma fila feof devolve verdadeiro ao achar EOF ferror() devolve verdadeiro quando erro rewind() restabelece o localizador de posição remove() apaga arquivo

13 O ponteiro de arquivo: mantém unido o sistema de entrada e saída bufferizado.
Define vários aspectos como nome, status e posição corrente. O ponteiro de arquivo é uma variável de ponteiro do tipo FILE. Função fopen(): abre uma fila de bytes e liga um arquivo àquela fila forma: FILE *fopen(char *nomearquivo,char *modo); para abrir: fp = fopen(“teste”,”w”); uso comum: if ((fp=fopen(“teste”,”w”))==null) { puts (“não pode abrir arquivo\n”); exit(1); }

14 “w” cria arquivo texto p/ gravação “a” anexa a um arquivo texto
Modo Significado “r” abre arquivo texto p/ leitura “w” cria arquivo texto p/ gravação “a” anexa a um arquivo texto “rb” abre arq. binário p/ leitura “wb” cria arq. binário p/ gravação “ab” anexa a um arq. binário “r+” abre arq. texto p/ l/e “w+” cria arq. texto p/ l/e “a+” abre ou cria arq. texto p/ l/e “r+b” abre arq. binário p/ l/e “w+b” cria arq. binário p/ l/e “a+b” abre arq. binário p/l/e “rt” abre arq. texto p/ leitura “wt” cria arq. texto p/ gravação “at” anexa a um arq. texto “r+t” abre arq. texto p/ l/e “w+t” cria arq. texto p/ l/e “a+t” abre ou cria arq. texto p/ l/e

15 Função putc(): grava caracteres em uma fila previamente aberta
forma: int putc(int ch, FILE*fp); putc é int por razões históricas se a gravação for bem sucedida devolve o caractere, caso contrário devolve EOF Função getc(): lê caracteres de uma fila forma: int getc(FILE *fp); devolve EOF quando é alcançado o final de arquivo uso comum ch = getc(fp); while (ch != eof) { ch = getc(fp);} ou while (!feof(fp)) ch = getc (fp);

16 Função fclose(): fecha uma fila aberta com fopen.
forma: int fclose(FILE *fp); valor de retorno 0 significa operação de fechamento bem-sucedida Função ferror(): determina se uma operação produziu erro forma: int ferror(FILE *fp); retorna 1 se houver ocorrido um erro e 0 se a operação de arquivo foi bem sucedida Função rewind(): restabelece o localizador de posição para o início de arquivo forma: void rewind(FILE *fp);

17 Exemplo escreve em arquivo
main(argc, argv) int argc; char *argv[]; { file *fp; char ch; if (argc != 2){ printf(“esqueceu o nome do arquivo\n”); exit(1); } if ((fp = fopen(argv[1], “w”)) == null) { printf(“não pode abrir arquivo\n”); do { ch = getchar(); putc = (ch, fp); while (ch != ´$´); fclose (fp);

18 Exemplo escreve arquivo em arquivo
main(argc, argv) int argc; char *argv[]; { file *in, *out; char ch; if (argc != 3) { printf(“esqueceu nome do arquivo\n”); exit(1); } if (in = fopen (argv[1],“rb”)) == null) { printf(“não pode abrir arq fonte\n”); exit (1); if (out = fopen (argv[2],“wb”)) == null) { printf(“não pode abrir arq dest\n”); exit (1);} while (!feof(in)) putc(get(in),out); fclose (in); fclose (out);

19 Função getw(): lê inteiro de um arquivo
mesma forma de getc Função putw(): grava inteiro em um arquivo mesma forma de putw. Ex.: putw(100,fp); Função fgets(): lê fila de arquivo forma:char *fgets(char *str,int comprimento, FILE *fp); lê até \n ou comprimento - 1 Função fputs(): grava fila em arquivo forma: char *fputs(char *str, FILE *fp); Função fread(): lê bloco de dados forma:int fread(void *buffer,int num_bytes, int cont, FILE *fp);

20 Exemplo fwrite - fread Função fwrite(): lê bloco de dados
forma:int fwrite(void *buffer,int num_bytes, int cont, FILE *fp); Exemplo fwrite - fread main() { FILE *fp; float f = 12.23; if((fp=fopen(“teste”,”wb”)) == NULL) { printf(“não pode abrir arquivo\n”); return; } fwrite(&f,sizeof(float),1,fp); fclose(fp) Função fseek(): leitura e gravação aleatórias forma:int fseek(FILE*fp,long int num_bytes,int origem); Origem: início = seek_set, corrente = seek_cur, fim de arquivo = seek_end

21 Exemplo fseek Exemplo filas padrão func1() { FILE *fp;
if((fp=fopen(“teste”,”rb”)) == NULL) { printf(“não pode abrir arquivo\”); exit(1); } fseek (fp,234l,0); return getc(fp); Filas de bytes stdin, stdout e stderr podem ser redirecionadas Exemplo filas padrão putchar() char c { putc(c, stdout); }

22 Função fprintf(): printf para arquivos
forma: fprintf(fp,”string de controle”,argumentos); Função fscanf(): scanf para arquivos forma: fscanf(fp,”string de controle”,argumentos); Função remove(): apaga arquivos forma: int remove(char *nomearquivo); se bem sucedido devolve zero, senão não-zero

23 Entrada e saída não-bufferizado
Funções tipo Unix de baixo nível read() lê um buffer de dados write () grava um buffer de dados open() abre arquivo em disco close() fecha aquivo em disco lseek() procura arquivo pelo byte unlink() remove arquivo do diretório Função open(): forma:int open(char *nomearquivo, int modo, int acesso); modo é uma das macros: o_rdonly, o_wronly, o_rdwr Função close(): forma: int close(int fd);

24 Função creat(): forma: int creat(char *nomearquivo, int acesso); Função write(): forma: int write(int fd, void *buf, int tamanho); Função read(): forma: int read(int fd, void *uf, int tamanho); Função unlink(): forma: int unlink(char *nomearquivo); Função lseek(): forma: long lseek(int fd, long num_bytes, int origem);

25 Dados definidos pelo usuário
C permite 5 tipos de dados personalizados pelo usuário: estrutura, campo de bit, união, enumeração e typedef Estrutura Coleção de variáveis; referência pelo mesmo nome Variáveis que formam a estrutura são elementos de estrutura Exemplo estrutura struct addr { char nome[30]; char rua[40]; char cidade[20]; char estado[3] unsigned long int cep; };

26 Exemplo variável com estrutura
Declarando variável com a estrutura anterior Exemplo variável com estrutura struct addr ender_info; Exemplo outra forma declarar variável como estrutura struct addr { char nome[30]; char rua[40]; char cidade[20]; char estado[3] unsigned long int cep; }ender_info, binfo, cinfo; Exemplo outra forma declarar uma variável como estrutura struct { char nome[30]; char rua[40]; char cidade[20]; char estado[3] unsigned long int cep; }ender_info;

27 Exemplo acesso a variável com estrutura
Forma geral: struct nome_tipo_estrut { tipo nome_variável; ... } variáveis_estrut; Referências aos elementos da estrutura forma: nome_estrutura.nome_elemento Exemplo acesso a variável com estrutura ender_info.cep = 12345; printf(“%lu”,ender_info.cep); ou gets(ender_info.nome); Acesso a elementos individuais é indexado: Exemplo acesso a elementos individuais int t; for (t=0; ender_info.nome[t];++t) putchar (ender_info.nome[t]);

28 Exemplo matrizes de estrutura
Matrizes de estruturas: define a estrutura e depois declara uma variável daquele tipo Exemplo matrizes de estrutura struct addr ender_info[100]; Acesso a um elemento: indexa printf(“%lu”, ender_info[2].cep); Exemplo estrutura de enderecos struct addr { char nome[30]; char rua[40]; char cidade[20]; char estado[3]; } ender_ info[tamanho];... gets(ender_info[1].nome); /* inserir elemento */ ... printf(“%s \n”,ender_info[1].nome);/* mostrar elemento */ fread(&ender_info[i],sizeof(struct_addr),1,fp); /* lê */ fwrite(&ender_info[i],sizeof(struct_addr),1,fp);/*salva*/

29 Exemplos de passagens para estrutura
Passando estruturas para funções Passando elementos de estruturas para funções: passa-se uma variável simples ou endereços Exemplos de passagens para estrutura struct aluno { char x; int y; float z; char s[10]; } joao; ... Func1(joao.x); Func2(joao.y); Func3(joao.z); Func4(joao.s); Func5(joao.s[3]);

30 Exemplos de passagens de endereços para a estrutura
... Func1(&joao.x); Func2(&joao.y); Func3(&joao.z); Func4(joao.s); Func5(&joao.s[3]); Passando estruturas inteiras para funções: quando uma estrutura é um argumento de uma função ela é passada inteira usando a passagem por valor; o tipo de argumento é o tipo de parâmetro. Exemplos de passagens de estrutura inteira main() f1(parm) { struct { struct { int x, y; int a, b; char ch; char ch; }parm; } arg; { arg.a = 1000; printf(“%d”, parm.x); f1(arg); } }

31 Exemplos de outra forma de passar a estrutura inteira
struct struct_tipo { int a, b; char ch; }; main() f1(parm) { struct struct_tipo parm; struct struct_tipo arg; { arg.a = 1000; printf(“%d”,parm.a); f1(arg); } } Ponteiros para estruturas declaração: struct tipo_estrutura *ponteiro uso: obtendo chamada por referência e criando listas e outras estruturas desvantagem no uso da estrutura: esforço extra para tirar e colocar elementos na pilha. A solução é a passagem de apenas um ponteiro o conteúdo será modificado e a passagem será mais rápida

32 Exemplos de uso de ponteiro para estruturas
struct bal { float balanço; char nome[80]; } pessoa; struct bal *p ... Colocando o endereço de pessoa no ponteiro p: p = &pessoa; ... Fazendo referência ao indivíduo: (*p).balanco Existem dois métodos de fazer referência a uma variável de estrutura com ponteiros: com referências explícitas e com o operador flecha o primeiro método é considerado arcaico o segundo método é considerado uma abreviação do segundo o primeiro método é a base de entendimento do segundo

33 Exemplo de método de referências explícitas
struct tm { int horas; int minutos; int segundos; }; main() { struct tm time; time.horas = 0; time.minutos = 0; time.segundos = 0; for (;;) { update (&time); display (&time); } /* função update com referências explícitas */

34 update(t) struct tm *t; { (*t).segundos++; if ((*t).segundos == 60) { (*t).segundos = 0; (*t).minutos++; } if ((*t).minutos == 60) { (*t).minutos = 0; (*t).horas++; if ((*t).horas == 24) (*t).horas = 0; delay(); display(t) delay() struct tm *t; { { long int t; printf(“%d:”,(*t).horas); for (t=1;t<128000;++t); printf(“%d:”,(*t).minutos); } printf(“%d:”,(*t).segundos);

35 Exemplo de método de flecha
/* função update com flecha */ update(t) struct tm *t; { t->segundos++; if (t->segundos == 60) { t->segundos = 0; t->minutos+++; } if (t->minutos == 60) { t->minutos = 0; t->horas++; if (t->horas == 24) t->horas = 0; delay();

36 Exemplo com uma estrutura complexa
Matrizes e estruturas dentro de estruturas: um elemento de uma estrutura pode ser simples ou complexo Exemplo com uma estrutura complexa struct x { int a[10][10]; float b; } y; ...referência ao inteiro 3,7 em a da estrutura y: y.a[3][7] ...estrutura complexa aninhada struct emp { struct addr endereço; float salario; }trabalhador; ...atribuição trabalhador.endereco.cep = 98765 As referências são feitas da esquerda para a direita do mais externo para o mais interno

37 Campos de bit Método de acessar um único bit em um byte
Vantagens: se o armazenamento for limitado, pode se armazenar várias variáveis booleanas em um byte; interfaces de dispositivos transmitem informações codificadas em bits dentro de um byte; algumas rotinas de codificação precisam acessar bits dentro de bytes Sintaxe: struct nome_tipo_estrutura { tipo nome1: comprimento; tipo nome2: comprimento; ... tipo nome3: comprimento; } O Campo de bit é declarado como int, unsigned ou signed; campos de bit de comprimento 1 são unsigned

38 Exemplo com campo de bit
struct device { unsigned active: 1; unsigned ready: 1; unsigned xmt_error: 1; } dev_code; ... wr_tape() char c; { while (!dev_code.ready) rd(&dev_code); wr_to_tape() while (dev_code.active) rd(&dev_code); if (dev_code.xmt_error) printf(“erro de gravação) } Não é preciso dar nome a cada campo de bit Exemplo com campo de bit sem nome struct device { unsigned active: 1; unsigned ready: 1; unsigned xmt_error: 1; unsigned: 2; unsigned eot:1; } dev_code;

39 Exemplo mistura estrutura normal com campo de bit
Desvantagens dos campos de bit: não se pode utilizar o endereço de uma variável de campo de bit; não se pode colocar as variáveis de campo de bit em matrizes; não ultrapassa limite de inteiros; é dependente de máquina. Pode se misturar estrutura comum com campos de bit Exemplo mistura estrutura normal com campo de bit struct emp { struct addr endereco; float pagamento; unsigned lay_off: 1; unsigned horista: 1; unsigned deducoes: 3; } dev_code; Uniões Localização de memória usada por variáveis diferentes que podem ser de tipos diferentes

40 Exemplo passando para uma função um ponteiro
union u_type { int i; char ch; }; union u_type cn Para se ter acesso a union pode ser usado o ponto ou a flecha. Ex.: cn.i = 1; Exemplo passando para uma função um ponteiro func1(un) union u_type *un; { un->i = 10; } Union ajuda a produzir código independente Exemplo union put(word,fd) union pw { union pw, word; int i; file *fp; char ch[2]; { putc(word->ch[0],fp); } putc(word->ch[1],fp); }

41 Exemplo mostra inteiro de símbolo
Enumerações Conjunto de constantes inteiras com nome e especificação de todos os valores legais forma: enum nome_tipo_enum{lista_enum}lista_var Exemplo enumeração enum moeda{penny, nickel, dime, quarter, half_dolar,dolar}; enum moeda dinheiro; ...referências: dinheiro = dine; if (dinheiro == quarter) printf(“é um quarter\n”); Na enumeração cada símbolo também é um valor inteiro: Exemplo mostra inteiro de símbolo enum moeda{penny, nickel, dime, quarter, half_dolar,dolar}; enum moeda dinheiro; ...referências: dinheiro = dine; if (dinheiro == quarter) printf(“é um quarter\n”);

42 Exemplo inicializa símbolo
Pode se atribuir o valor inteiro de um ou mais símbolos usando um inicializador; os próximos símbolos seguirão a sequência Exemplo inicializa símbolo enum moeda {penny, nickel, dime, quarter=100, half_dolar, dolar}; ERRO no uso de enumeração (achar que o símbolo pode ser tratado diretamente) Exemplo erro na enumeração dinheiro = dolar; printf(“%s”dinheiro); ...outro gets(s) strcpy(dinheiro,s) Para usar os nomes dos símbolos é preciso escrevê-los explicitamente

43 Exemplo mostrar nome do símbolo
switch (dinheiro) { case penny: printf(“penny”); break; case nickel: printf(“nickel”); case dime: printf(“dime”); case quarter: printf(“quarter”); case half_dolar:print(“half_dolar”); case dolar: printf(“dolar”); } Exemplo mostrar nome do símbolo através do array char nome[][20] = { “penny”, “nickel”, “dime”, “quarter”, “hal_dolar”, “dolar” } ... printf(“%s”,nome[diheiro]);

44 Exemplo uso correto de símbolo associado a array
enum moeda {penny, nickel, dime, quarter, half_dolar, dolar}; char nome[][20] = { “penny”, “nickel”, “dime”, “quarter”, “half_dollar”, “dolar” }; main() { enum moeda dinheiro; for (dinheiro=penny;dinheiro<=dolar;dinheiro++) printf(“%s”,nome[dinheiro]); } Uso de sizeof para portabilidade: ajuda a eliminar código dependente de máquina Exemplo mostrar tamanho da variável char ch; int i; double f; printf(“%d %d %d”,sizeof(ch), sizeof(i), sizeof(f));

45 Exemplo qual é o tamanho da union? sizeof(tom)
union x { char ch; int i; float f; } tom; Typedef Forma de definir explicitamente novos nomes de tipos de dados forma: typedef tipo nome; Exemplo para dados simples typedef float balanco; ... balanco bal_do_ano; Exemplo para dados complexos typedef struct { float vencimento; int em_atraso; char nome[40]; } cliente; cliente clist[num_clientes];

46 Tipos de dados avançados
Apesar de existirem 5 tipos de dados em C, algumas vezes eles não conseguem satisfazer a todas as situações. O turbo C permite que sejam aplicados alguns modificadores de tipo que podem se enquadrar nas seguintes categorias: modificadores de acesso modificadores de armazenamento modificadores dos tipos de função modificadores de modelos de memória Sintaxe: modificador_tipo especificação_tipo lista_variáveis;

47 Ex.: const float versão=2.5;
Modificadores de acesso – controla a maneira como as variáveis são modificadas Modificador const – a variável não é mudada durante a execução, exceto na inicialização Ex.: const float versão=2.5; Const assegura que nenhuma parte do programa modificará aquela variável. Um exemplo disso seria na passagem de parâmetros por ponteiros. Exemplo não modificando com const void code(); void code(str) main() const char *str; { code(“oi, tudo bem ?”);} { void code(str) while(*str) { const char *str; *str=*str+1; { printf(“%c”,*str++); while(*str) } printf(“%c”,(*str++)+1); } }

48 Exemplo modificando com volatile
Modificador volatile – para fazer com que o valor de uma variável seja alterado sem uma especificação explícita do programa Exemplo modificando com volatile volatile int clock; int timer; ... timer = clock; printf(“tempo decorrido e %d\n”,clock-timer); Modificadores de armazenamento – são quatro: auto, extern, static, register. auto - utilizado para declarar variáveis locais extern - ocorre um problema se, para cada arquivo de um só projeto, todas as variáveis globais forem declaradas. Devem ser declaradas as variáveis globais em um só arquivo e nos outros deve ser usado o modificador extern.

49 Exemplo modificador extern
Arquivo Arquivo 2 int x, y; extern int x, y; char ch; extern char ch; main() func2() { { x=y/10; } } func1() func3() x=123; y=10; static - para variáveis que são permanentes nas suas próprias funções ou arquivos (mantêm seus valores entre chamadas). Útil quando se escreve funções generalizadas que outros as usam. Varíaveis static locais - são conhecidas apenas no bloco em que são declaradas, mas mantêm o valor Exemplo usando static local series() { static int series_num; series_num = series_num +23; return (series_num); }

50 Exemplo usando static global
Varíaveis static globais - a variável global é conhecida apenas no arquivo no qual foi declarada a variável static global. Exemplo usando static global static int series_num; series() { series_num = series_num + 23; return (series_num); } series_inicio(semente) int semente; series_num = semente; register - a variável declarada será armazenada no registrador da CPU e não na memória Exemplo usando register int_pwr(m,e) int m; register int e; { register int temp; temp = 1; for(;e;e--) temp*=m; return temp; }

51 Modificadores de função
Ponteiros de função: é o endereço de localização de memória de uma função Exemplo usando ponteiro de função main() { int strcmp(); char s1[80], s2[80]; void *p; p = strcmp; gets(s1); gets(s2); check(s1,s2,p); } check(a,b,cmp) char *a, *b; int (*cmp) (); if (!(*cmp)(a,b) printf(“igual”); else printf(“diferente”);

52 Operadores avançados Operadores bit a bit
C possui alguns operadores especiais que melhoram o seu poder a nível de sistema Operadores bit a bit Operadores bit a bit se referem a teste, ajusta ou troca de bits, se aplicam a char ou int OPERADOR EFEITO & AND | OR ~ complemento (NOT) ^ OR exclusivo >> deslocar a direita << deslocar a esquerda

53 Exemplo operador bit a bit &
As operações bit a bit são encontradas a nível de sistema ou em controle de dispositivos O OR bit a bit pode ligar um determinado bit O & pode ser utilizado para desligar bits O OR exclusivo pode ligar um bit se apenas os bits que estiverem sendo comparados forem diferentes Exemplo operador bit a bit & if (status & 4) printf (“bit 3 esta ligado/n”); Exemplo operador bit a bit & mostra_binario(i) int i; { register int t; for (t=128;t<0;t=t/2) if (i&t) printf("1 "); else printf ("0 "); }

54 Os operadores de deslocamento, >> e <<, deslocam, respectivamente, todos os bits de uma variável, para a direita ou para a esquerda formato dos operadores de deslocamento: variável>>num_de_bits ou variável<<num_de_bits Ex.: char x x internamente valor de x x=7; x<<1; x<<3; x<<2; x>>1; x>>2;

55 Exemplo rotação usando Union
Na rotação de bits, um bit pode ser perdido, mas uma forma de não perder os bits rotacionados é a implementação usando Union Exemplo rotação usando Union union rotate{ char ch[2]; unsigned int i; }rot; ... rotaciona(rot) union rotate *rot; { rot->ch[1]=0; rot->i=rot->i << 1; if (rot->ch[1]) rot->i=rot->i:1; }

56 Exemplo complemento Operador ?
O operador de complemento de um (~) inverte o estado de cada bit. Utilidade: encriptação, p. ex. Exemplo complemento main() { char ch; do { ch = getch(); printf(“%c”,~ch); } while (ch != ‘q’); Operador ? Tem mesma função do if-else, só que é aplicado a expressões. Possui 3 operandos. Sintaxe Exp1?Exp2:Exp3 - funciona assim: Se Exp1 é verdadeiro, Exp2 se torna o valor de toda a expressão; se Exp1 for falsa, Exp3 se torna o valor de toda a expressão

57 Parentêses e colchetes
Exemplo operador ? X=10; y=x>9?100:200; ... scanf(“%d”,&t); t ? f1(t) + f2() : printf(“inserido 0”); Formas abreviadas x = x > x+=10; x = x > x-=10; Operador , Junta expressões. Ex.: x = (y=3,y+1) ... y = 10; x = (y=y-5,25 / y); Parentêses e colchetes São considerados operadores


Carregar ppt "LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo."

Apresentações semelhantes


Anúncios Google