LINGUAGEM C - PowerPoint PPT Presentation

1 / 169
About This Presentation
Title:

LINGUAGEM C

Description:

LINGUAGEM C Centro Federal de Educa o Tecnol gica da Para ba Coordena o de Inform tica Professor: Lafayette B. Melo T picos 1. Introdu o Linguagem C 2. – PowerPoint PPT presentation

Number of Views:177
Avg rating:3.0/5.0
Slides: 170
Provided by: WIN1203
Category:
Tags: linguagem | basic

less

Transcript and Presenter's Notes

Title: LINGUAGEM C


1
LINGUAGEM C
Centro Federal de Educação Tecnológica da
ParaíbaCoordenação de InformáticaProfessor
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
Programas em C são feitos para que outras
pessoas não possam entendê-los e para que depois
de muito tempo nem o próprio programador os
entenda. (?) Programas em C posssuem
liberdade, elegância e consistência. (Herbert
Schildt)
4
1. Introdução à Linguagem C
  • Origens de C, características e uso
  • A linguagem C foi implementada por Dennis Ritchie
    em um PDP-11 que usava UNIX
  • Martin Richards criou a BCPL. A BCPL influenciou
    a criação da linguagem B de Ken Thompson, o que
    levou a C nos anos setenta
  • Se popularizou com os PCs, mas houve a
    necessidade da criação de um Padrão (ANSI)
  • Com o Turbo C foram estabelecidas 3 metas padrão
    ANSI completo, rapidez e eficiência e ambiente
    integrado

5
1. Introdução à Linguagem C
  • C é uma linguagem de alto nível com recursos de
    baixo nível
  • Alto nível Ada, Modula2, Pascal, Cobol, Fortran,
    Basic
  • Nível Médio C
  • Baixo Nível Assembly
  • Cé portátil pode adaptar em um computador
    softwares utilizados em computadores diferentes
  • Erros em tempo de execução são pouco verificados
  • Manipula bits, bytes e endereços

6
1. Introdução à Linguagem C
  • C é estruturada uma linguagem estruturada é
    aquela que permite declarar sub-rotinas dentro de
    sub-rotinas - C faz isso?
  • Outra característica para linguagem estruturada
    compartimentalização de código e dados
  • Estruturadas Pascal, Ada, C, Modula2
  • Não-estruturada Fortran, Basic, Cobol
  • C e Assembly Capacidade de manipular com bits e
    bytes permite substituir Assembly em parte

7
1. Introdução à Linguagem C
  • A linguagem do programador
  • Toda linguagem não é para programador?
  • C foi feita para dar confiabilidade ao código ou
    aumentar a velocidade do código
  • C possui poucas restrições, tem rapidez e
    eficiência
  • Uso de C para sistemas operacionais,
    interpretadores, SGBDs, editores, compiladores

8
1. Introdução à Linguagem C
  • Compiladores X Interpretadores
  • Interpretadores
  • lê o código fonte uma linha de cada vez e efetua
    as instruções
  • está presente sempre que você roda o programa
  • precisa ser sempre traduzido
  • Compiladores
  • lê todo o programa e depois o converte em código
    objeto
  • converte o programa em código objeto
  • tem o custo de uma única transformação
  • Tempos de compilação longos contribuem para
    providências curtas

9
1. Introdução à Linguagem C
  • Um programa C compilado usa 4 regiões
  • Pilha
  • Heap
  • Variáveis Globais
  • Código
  • O compilador compila --- liga as funções da
    biblioteca necessárias --- e roda o programa.
  • No processo de compilação podem surgir erros e
    advertências

10
1. Introdução à Linguagem C
  • Visão geral de programas em C
  • Um programa em C tem uma ou mais funções
  • Formato
  • Exemplo

tipo nome_da_função(lista_de_argumentos) código

main() printf(primeiro programa!)
11
1. Introdução à Linguagem C
  • As funções printf e scanf
  • São funções de entrada/saída
  • Não fazem parte da definição de c
  • Formato
  • Exemplo

printf(expressão de controle,argumentos)
main() printf(Este e um numero par d,2)
12
1. Introdução à Linguagem C
  • Exemplo

main() int dias float anos / entrada de
dados/ printf(Entre com o numero de dias
) scanf (d, dias) anos
dias/365.25 printf (\n\nd dias sao f anos.
\n,dias,anos) return(0)
13
1. Introdução à Linguagem C
  • Uso de funções
  • Exemplo

sqr(x) int x printf (d ao quadrado e
d\n,num,numnum) main() int num printf
(Digite um numero ) scanf (d,num) sqr
(num)
14
1. Introdução à Linguagem C
  • Tipos de variáveis
  • Códigos de controle

Tipo Bits Bytes Escala
char 8 1 -128 a 127
int 16 2 -32768 a 32767
float 32 4 3.4E-38 a 3.4E38
double 64 8 1.7E-308 a 1.7E308
void 0 0 sem valor
Código O que é
d Inteiro
f Float
c Caractere
s String

15
1. Introdução à Linguagem C
  • Outros exemplos (Qual é a saída de cada um?)

printf (teste ) printf (f,40.345) prin
tf (um caractere d e um inteiro
d,D,120) printf (s e um exemplo,Este) p
rintf (sd,Juros de ,10)
16
1. Introdução à Linguagem C
  • Exemplo (Qual é a saída?)

main() int evento5 char corridaC float
tempo27.25 printf (o tempo na etapa
c,corrida) printf (\nda competicao d foi
f.,evento,tempo)
17
1. Introdução à Linguagem C
  • Uso de varíáveis com ponto flutuante
  • Os números de ponto flutuante são os reais
  • Há várias maneiras de eles serem escritos
  • São guardados na memória em duas partes
  • Uso de caracteres e strings
  • Um caractere em c pode ser representado de várias
    formas
  • Exemplos

3 bytes 3 bytes 1 byte
.12345 5
sinal Fração/mantissa Expoente
printf (d c x o \n,A,A,A,A)
18
Programa multiplica mul(a,b) / parâmetros dentro
dos parênteses / int a,b printf ( d
,ab) main() mul (10,11)
TÓPICOS
gt
lt
SAIR
19
Condições if (a lt b) printf (a e menor do que
b) if (a b) printf (Ei, os dois valores
são iguais!) Loop main() int cont for
(cont1contlt100cont) printf (d ,cont)
TÓPICOS
gt
lt
SAIR
20
Blocos de código if (x lt 10) printf (muito
baixo, tente de novo) scanf (d,x)
TÓPICOS
gt
lt
SAIR
21
Programa Mostra Caracteres main() char
ch ch A printf (c,ch) ch
B printf (c,ch) ch C printf
(c,ch)
TÓPICOS
gt
lt
SAIR
22
Programa Mostra String main() char
str80 printf (digite seu nome ) gets
(str) printf (ola s!,str) Programa
Saída printf (s d,isto e uma
string,100) printf (isto e uma string
d,100) printf (numero d e decimal, f e
float.,10,110.789) printf (c s d-x,um,
numero em decimal e hex ,10,10) printf
(s,ALO\n)
TÓPICOS
gt
lt
SAIR
23
Expressões
  • Os operadores manipulam variáveis e constantes
    para formar expressões.
  • Identificadores
  • Nomes utilizados para se fazer referência a
    variáveis, funções, rótulos e outros objetos
  • Regras de formação
  • Os primeiros caracteres com letras ou sublinhados
  • Os subsequentes com letras, números, sublinhados
    ou . Ex. cont, test23, alt_balanco
  • Os 32 primeiros caracteres são significativos

24
  • Letras maiúsculas e minúsculas tratadas de forma
    diferente
  • Não pode ser igual a uma palavra reservada e não
    deve ser igual a uma função da biblioteca
  • Tipos
  • TIPO EXTENSÃO ESCALA
  • char 8 0 a 255
  • int 16 -32768 a 32767
  • float 32 3.4E-38 a 3.4E38
  • double 64 1.7E-308 a 1.7E308
  • void 0 sem valor
  • Modificadores alteram os tipos base de forma que
    se adequem a uma situação específica. São eles
    signed, unsigned, long e short

25
  • Observações quanto aos modificadores
  • todos eles são aplicados a char e int, long pode
    ser aplicado a double
  • signed com inteiro é redundante
  • inteiro com sinal significa que tem um
    sinalizador no bit de ordem superior. Ex. 127 é
    0000000001111111 e -127 é 1000000001111111
  • a maioria dos computadores representará números
    negativos e, complemento de 2. Ex. -127 como
    1111111110000001
  • o número inteiro 32767 se fosse declarado como
    unsigned int seria 65535

26
TIPO EXTENSÃO ESCALA char 8 -128 a
127 unsigned char 8 0 a 255 signed char
8 8 -128 a 127 int 16 -32768 a
32767 unsigned int 16 0 a 65535 signed
int 16 -32768 a 32767 short int 16 -32768 a
32767 unsigned short int 16 0 a 65535 signed
short int 16 -32768 a 32767 long
int 32 -2147483648 a 2147483647 signed long
int 32 -2147483648 a 2147483647 unsigned long
int 32 0 a 4294967295 float 32 3.4E-38 a
3.4E38 double 64 1.7E-308 a 1.7E308 long
double 64 1.7E-308 a 1.7E308
27
Este programa mostra a diferença de um inteiro
com sinal e de um inteiro sem sinal main() int
i /inteiro com sinal/ unsigned int
j/inteiro sem sinal/ j 60000 i
j printf (d u,i,j)
28
Podem ser utilizadas variáveis char que não
sirvam apenas para conter os valores do conjunto
de caracteres ASCII. Ex. main() int i, j,
k char c, d, e long tm tm time(0) for
(i0ilt100i) for (j0jlt100j) for
(k0klt100k) printf(tempo para inteiros
ld\n,time(0)-tm) tm time(0) for
(c0clt100c) for (d0dlt100d) for
(e0elt100e) printf(tempo para caracteres
ld\n,time(0)-tm)
29
  • Variáveis
  • declaração tipo lista_variáveis Ex. int cont
  • Regras de escopo 1) fora de todas as funções 2)
    dentro de uma função 3) na declaração de
    parâmetros formais 4) em um bloco condicional
  • Constantes
  • valores fixos
  • as constantes de caracteres são entre aspas
    simples a e
  • constantes numéricas 10 e -100

30
Regras de escopo (exemplo) int soma / variável
global / main() int cont / variável local
/ soma 0 for (cont0contlt10cont)
total(cont) mostra()
mostra() total(x) int x int conte /
local / for(cont0contlt10cont) soma
x soma printf(-) printf(a soma e
d\n,soma)
31
  • Constantes de ponto flutuante exigem ponto
    decimal seguido do componente fracionário
  • Podem ter vários exemplos combinados
  • Constantes hexa int hex0xFF /255 decimal/
  • Constantes octais int oct011 /9 decimal/
  • Constantes de strings conjunto de caracteres
    entre aspas. Ex. lafa, a a
  • Constantes com barras invertidas Ex. ch\t
    Algumas constantes \b-retrocesso,
    \f-alimentação de formulário, \n-nova linha,
    \r-retorno, \t-tab, \-aspas, \-aspas, \0-zero,
    \\-barra, \v-tab, \a-alerta, \oN-octal, \x-hexa

32
  • Operadores
  • símbolo que manda o computador executar
    manipulações matemáticas ou lógicas
  • Categorias aritméticos, de relação e lógicos e
    bit a bit, além dos operadores especiais
  • O que veremos aritméticos, de relação e lógicos
    e de atribuição
  • Aritmétcos - /
  • O menos unário também é considerado operador
  • -- e Ex. x e x, x-- e --x
  • Há uma diferença entre
  • x10 x10
  • yx e yx
  • Precedência -- - / -

33
  • De relação e lógicos de relação-mostra as
    relações que os valores devem ter uns com os
    outros. Lógicos-mostram a maneira como as
    relações podem ser concatenadas
  • Relação V- é qualquer valor não zero, F- um
    valor zero
  • gt gt lt lt !
  • Lógicos obedecem à tabela verdade
  • (AND) !! (OR) ! (NOT)
  • p q p AND q p OR q NOT p
  • 0 0 0 0 1
  • 0 1 0 1 1
  • 1 1 1 1 0
  • 1 0 0 1 0
  • 10 gt 5 !(10 gt 9) 3lt 4 é V ou F?
  • 1 !(0 1) é V ou F?

34
Programa com operadores de relação main() int
i, j printf (digite dois numeros ) scanf
(dd,i,j) printf (d d e
d\n,i,j,ij) printf (d ! d e
d\n,i,j,i!j) printf (d lt d e
d\n,i,j,iltj) printf (d gt d e
d\n,i,j,igtj) printf (d lt d e
d\n,i,j,iltj) printf (d gt d e
d\n,i,j,igtj)
35
Programa com operadores lógicos main() int i,
j printf (digite dois numeros, 0 ou 1
) scanf (dd,i,j) printf (d AND d e
d\n,i,j,i j) printf (d OR d e
d\n,i,j,i j) printf (NOT d e
d\n,i,!i)
Outro exemplo com operadores relacionais e
lógicos main() int i for (i1ilt100i) if
(!i2) printf (d ,i)
36
  • De atribuição
  • é permitido que seja utilizado com outros
    operadores
  • x10 é o mesmo que xx10
  • posso usar operadores múltiplos xyz0
  • posso usar condicional y x gt 9 ? 100 200
  • Exemplo
  • main()
  • int x, y, produto
  • printf(digite dois numeros )
  • scanf (dd,x,y)
  • if ((produtoxy) lt 0)
  • printf (produto negativo\n)

37
  • Expressões
  • combinam operadores, constantes e variáveis
  • seguem as regras de álgebra
  • quando são misturados tipos diferentes em uma
    expressão, C converte de acordo com as regras
  • char e short int ficam int, float fica double,
  • se um valor é long double o outro fica long
    double
  • se um valor é double o outro fica double
  • se um valor é long o outro fica long
  • se um valor é unsigned o outro fica unsigned
  • Forçando uma expressão a ser de um tipo (casts)
    Ex. (float) x/2 Formato (tipo) exp
  • Pode e devem ser usados espaçamentos e parênteses

38
Comandos de Controle
  • O que são
  • Os comandos de Controle de Fluxo são utilizados
    para definir o fluxo de execução do programa
  • Podem ser agrupados nos comandos if, switch,
    while, for, do-while e goto
  • IF
  • Sintaxe if (condição) comando
  • else comando
  • Apenas um dos comandos, o associado ao if ou o
    associado ao else será executado

39
Programa com if - número mágico main() int
magico,adivinha randomize() magico random
(100) printf (Adivinhe o numero!) scanf
(d,adivinha) if (adivinha
magico) printf (Ok, voce acertou!) else
printf (Voce errou!!)
  • If aninhado if objeto de um else ou de outro if
  • if (x) if (x)
  • if (y) printf (ola!) if (y) printf (ola)
  • else printf (oi!) else printf (oi!)

40
  • Escada if-else-if
  • if (condição)
  • comando
  • else if (condição)
  • comando
  • else if (condição)
  • comando
  • ...

Modificação de número mágico if (adivinha
magico) printf (Ok, voce acertou!\n) prin
tf (d e o numero magico\n) else if
(adivinha gt magico) printf (valor
alto!\n) else printf (valor
baixo!\n)
41
  • Expressões Condicionais em C o fato de não se
    utilizar nas condições do If apenas operadores
    lógicos ou de atribuiçao pode se resultar em ganho

Divisão do primeiro pelo segundo
número main() int a, b printf (digite dois
numeros ) scanf (dd,a,b) if (b)
printf (d\n,a/b) else printf (não divido
por zero\n)
42
  • SWITCH - substitui a escada if-else-if
  • O computador testa uma variável sucessivamente
    contra uma lista de valores. Sintaxe
  • switch (variável)
  • case constante1
  • sequência de comandos
  • break
  • case constante2
  • sequência de comandos
  • break
  • ...
  • default
  • sequência de comandos

Switch e if só testa igualdades e expressões
condicionais, if pode ser de qualquer tipo. Não
pode haver 2 constantes case com valores iguais
no mesmo switch. Ex. de switch de menus
43
char ch printf (1. Verificar erros
\n) printf (2. Corrigir erros \n) printf
(3. Exibir erros \n) printf (4. Outra opção
\n) ch getchar() switch (ch) case
1 verficar() break case
2 corrigir() break case
3 exibir() break default printf(
nenhuma opção escolhida)
44
Programa de saída int t for (t0tlt10t) sw
itch (t) case 1 printf
(Agora) break case 2 printf
(é) case 3 case 4 printf (hora
) printf ( de dar tchau \n) case
5 case 6 printf (vamos...
) break case 7 case 8 case
9 printf (-)
45
Programa de switch aninhado switch (x) case
1 switch (y) case 0 printf(erro
na divisão) break case
1 processa (x,y) case 2 ...
  • Loops - permitem que o computador repita um
    conjunto de instruções até que alcance uma certa
    condição
  • FOR - faz o incremento um número determinado de
    vezes e de acordo com determinadas condições.
    Sintaxe

46
for (inicialização condição incremento) comando
Exemplo simples main() int x for
(x1xlt100x) printf (d ,x)
Exemplo de decremento main() int x for
(x100xgt0x--) printf (s ,x)
47
Exemplo de atribuição main() int x for
(x0xlt100xx5) printf (d ,x)
Cuidado com a condição falsa !!! x10 for
(y10y!xy) printf (d,y) printf
(d,y)
Variação com duas variáveis de controle main()
int x,y for (x0,y0xylt100x,y) printf
(d ,xy)
48
Variação com condições como expressões válidas em
c main() int i, j, resposta char feito
for (i1ilt100 feito ! Ni) for
(j1jlt10j) printf (quanto e d d?
,i,j) scanf (d,resposta) if
(resposta ! ij) printf (Errado\n) else
printf (Certo \n) printf(mais?
) feito getche()
49
Variação de expressões válidas em c em qualquer
lugar do for main() int t for
(prompt()treadnum()prompt()) sqrnum(t) pr
ompt() printf (digite um inteiro
) readnum() int t scanf(d,t) return
t sqrnum(num) int num printf(d\n,numnu
m)
50
For sem todas as expressões for (x0x!123)
Loop infinito for () printf (este loop rodará
para sempre\n)
Saindo de um Loop for () ch getche() if
(ch A) break printf (voce digitou um A)
Loop sem corpo (retardo) for (t0t lt
ALGUM_VALORt)
51
  • WHILE - enquanto uma condição ocorre repete.
    Sintaxe

while (condição) comando
Exemplo simples espera_por_char() char ch ch
\0 while (ch ! A) ch getche()
Condições separadas-1 variável como expressão
condicional funcao1() int trab trab
1 while (trab) trab process1() if
(trab) trab process2() if (trab) trab
process3()
52
Exemplo simples main() char str255 printf(
digite uma sequencia ) gets (str) center
(strlen(str)) printf(str) center(len) int
len len (80 - len)/2 while (lengt0)
printf( ) len--
53
  • DO-WHILE - repete algo enquanto uma condição
    ocorre. Sintaxe

do comando while (condição)
Exemplo simples main() int num do scanf
(d,num) while (num lt 100)
O do-while é muito usado para rotina seleção de
menu!!!
54
Programa - número mágico outra versão main() in
t magico,adivinha, tentativas0 randomize() ma
gico random (100) do printf(adivinhe
) scanf (d,adivinha) if (adivinha
magico) printf ( acretou ) printf
(d e o numero magico\n,magico) else if
(adivinhagt magico) printf (valor alto)
else printf (valor baixo) tentativas
while (adivinha ! magico) printf (voce tentou
d vezes\n,tentativas)
55
Loops aninhados - exemplo das 4 potências de 1 a
9 main() int i, j, k, temp printf ( i
i2 i3 i4 i5\n) for (i1ilt10i)
for (j1jlt5j) temp 1 for
(k0kltjk) temptempi printf
(9d,temp) printf(/n)
56
Uso de break e continue int t for
(t0tlt100t) printf (d ,t) if
(t10) break
int x for (x0xlt100x) if (x2)
continue printf (d ,x)
Uso de rótulos e goto
57
Matrizes e Strings
  • O que são
  • Matrizes conjunto de variáveis de mesmo tipo,
    referenciadas pelo mesmo nome. Em C, matrizes são
    locações contíguas de memória. Podem ter uma ou
    mais dimensões.
  • Strings conjunto de caracteres. Em C, não há o
    tipo string, então são usadas matrizes de
    caracteres
  • Matrizes unidimensionais
  • Sintaxe tipo nome_var tamanho
  • Em C, todas as matrizes usam zero como índice do
    primeiro elemento

58
Exemplo programa matriz simples main() int
x10 / reserva 10 espaços de memória / int
t for (t0tlt0t) xtt
  • Cálculo do tamanho de uma matriz
  • total_em_bytes sizeof(tipo)comprimento
  • Matrizes permitem lidar com muitas variáveis
    relacionadas

59
Exemplo trabalho com várias variáveis - média de
dez main() int amostra10, i, med for
(i0ilt0i) printf(digite numero d
,i) scanf (d,amostrai) med0 for
(i0ilt10i)medmedamostrai printf (A
media e d\n,med/10)
  • Verificação de limites C não faz verificação de
    limites. Por que?
  • Veja a loucura!

60
Exemplo atribuindo valores além do limite da
matriz main() int erro10, i for
(i0ilt100i) erroi1
  • Matrizes são listas

Exemplo matrizes são listas main() int i for
(i0ilt7i) chiA i
ch0 ch1 ch2 ch3 ch4 ch5 ch6
A B C D E F G
E daí ?
61
  • Strings
  • Uso comum das matrizes unidimensionais
  • Em C, uma string pode ser entendida como uma
    matriz de caracteres terminada em zero
  • O zero é /0
  • Em uma constante de strings não é preciso se
    preocupar com o zero. Ex. Lafayette. Como fica
    Hora de dar tchau internamente?
  • Lendo strings pelo teclado
  • Forma usual de ler uma string função gets().
    Sintaxe gets (nome_matriz)

62
Exemplo lendo a string main() char
str80 printf(Digite seu nome/n) gets
(str) printf(Ola, s!,str)
  • Funções de String strcpy(), strcat(), strcmp(),
    strlen()
  • Função strcpy - Sintaxe strcpy(destino,origem)

Exemplo strcpy main() char str80 strcpy(str
,hora de dar tchau)
E se a string for maior do que a variável?
63
  • Função strcat - Sintaxe strcat(string1,string2)

Exemplo strcat main() char primeiro20,
segundo10 strcpy(primeiro,hora de dar
) strccpy(segundo,tchau) strcat(primeiro,se
gundo) printf(Agora e s.,primeiro)
  • Função strcmp - Sintaxestrcmp(string1,string2)
  • Retorna 0 se as strings são iguais, um número
    positivo se string1 for maior do que string2 e um
    número negativo se string1 for menor do que
    string2

64
Exemplo strcmp - senha senha() char
s80 printf (digite a senha
) gets(s) if (strcmp(s,hora de dar tchau))
printf (senha inválida\n) return
0 return 1
  • Se quiser que algo ocorra o que fazer?

main() char s80 for () printf(
) gets(s) if (!strcmp(sair,s)) break
65
  • Função strlen - Sintaxe strlen(string). Retorna
    comprimento.

Exemplo strcat main() char str80 printf(di
gite um nome ) gets(str) printf(d,strlen(
str))
Exemplo imprimir de trás pra frente main() char
str80 int i gets (str) for
(istrlen(str)-1igt0i--) printf
(c,stri)
66
Exemplo todas main() char s180,
s280 gets (s1) gets (s2) printf(compriment
osd e d\n,strlen(s1),strlen(s2)) if
(!strcmp(s1,s2)) printf(as strings são
iguais\n) strcat(s1,s2) printf (s\n,s1)
  • O terminador zero pode ter uso interessante!!

Exemplo terminador zero string em
maiúsculas main() char str80 int
i strcpy(str,hora de dar tchau) for
(i0strii) stritoupper(stri) printf(
s,str)
67
  • Variações de printf()
  • Formato básico printf(s,nome_matriz)
  • Posso usar apenas printf(nome_matriz)?

Exemplo outro modo dever o printf main() char
str80 strcpy(str,Lafayette) printf
(str)
  • Matrizes bidimensionais
  • Forma mais simples da matriz multidimensional
  • Exemplo de declaração int bidm1020

68
Exemplo matrizes bidimensionais main() int t,
i num34 for (t0tlt3t) for(i0ilt4i
) numti(t4) i 1
  • Cálculo do tamanho de uma matriz
  • bytes linhascolunassizeof(tipo)
  • Matrizes de strings - uso comum. Para criar uma
    matriz de strings, é utilizada uma matriz
    bidimensional de caracteres. Índice esquerdo
    número de strings. Índice direito comprimento
    máximo de cada string

69
  • Acesso a uma matriz particular - Exemplo
    gets (matriz_str2) gets (matriz_str20)

Exemplo matriz de string main() register int
t, i, j char texto10080 for
(t0tlt100t) printf (d
,t) gets(textot) if (!textot)
break for (i0iltti) printf
(s\n,textoi)
70
Ponteiros
  • Razões de uso dos ponteiros
  • 1) fornecem maneiras pelas quais podemos mudar
    argumentos de funções
  • 2) rotinas de alocação dinâmica
  • 3) substituição por matrizes
  • Perigos uso de ponteiros não inicializados ou
    perdidos e facilidade para seu uso incorretamente
  • O que são
  • Ponteiros são variáveis que contêm um endereço de
    memória - uma variável aponta para a outra
  • Sintaxe tipo nome_var
  • Note que o tipo diz o tipo de variável que o
    ponteiro pode apontar

71
  • Exemplos char p
  • int temp, inicio
  • Endereço de memória Variável na memória
  • Operadores de ponteiros
  • - end. de memória do operando
  • - conteúdo
  • Ex. end_cont cont leia-se end_cont recebe o
    endereço de cont

val end_cont leia-se val recebe o valor
do endereço end_cont
72
  • Ex. val end_cont leia-se val recebe o valor
    do endereço end_cont

Exemplo ponteiro imprime main() int end_cont,
cont, val cont 100 end_cont cont val
end_cont printf (d,val)
  • Uso do tipo
  • Atribuimos valores indiretos, mas como sabemos
    que o compilador transfere o número adequado de
    bytes para qualquer atribuição que use ponteiro?
  • Você deve assegurar que suas variáveis com
    ponteiros sempre apontem para o tipo correto de
    dados

73
Exemplo apontador tipo errado main() float x
10.1, y int p p x y
p printf(f,y)
  • Expressões com ponteiros
  • Atribuições com ponteiros

Exemplo atribuição de ponteiros main() int
x int p1, p2 p1 x p2 p1 printf (
p,p2)
  • p mostra endereço de ponteiro

74
  • Aritmética de ponteiros uso das operações e -
  • Supondo p1 ponteiro para inteiro com valor 2000
  • p1 faz com que p1 seja 2002
  • se fosse p1-- faria com que p1 tivesse o valor
    1998
  • A aritmética de ponteiros funciona para tipos
    base diferentes

char ch int i Supondo ocuparem o endereço
3000 ch 3000 i ch1 3001 ch2 3002 i1 ch3 300
3 ch4 3004 i2
  • Massa! Você também pode adicionar ou subtrair
    valores inteiros a ponteiros. Veja o efeito
  • p1 p1 9 /p1 apontará para o nono elemento do
    seu tipo base /

75
  • Comparações de ponteiros
  • if (pltq) printf (p aponta para uma posição
    inferior\n)
  • Uso quando 2 ponteiro apontam para um mesmo
    objeto
  • Exemplo de dump os ponteiros podem ser usados
    para o exame do conteúdo de memória
  • Ponteiros e matrizes
  • No programa abaixo entenda que o nome de uma
    matriz sem índice é o endereço do início da
    matriz

Exemplo relacionamento entre ponteiros e
matrizes char str80, p char p1 p1
str posso colocar str4 ou (p14)
  • A aritmética de ponteiros pode ser mais rápida do
    que a indexação de matrizes!!!

76
Exemplo indexação com matrizes main() char
str80 int i printf(digite uma string em
minúsculas ) gets (str) printf
(transformei para ) for (i0strii) prin
tf (c,tolower(stri)
Exemplo acesso com ponteiros main() char
str80, p printf(digite uma string em
minúsculas ) gets (str) printf
(transformei para ) p str while (p)
printf (c,tolower(p))
  • Acesso aleatório é melhor a indexação

77
  • Indexando um ponteiro - pode se indexar um
    ponteiro como se ele fosse uma matriz

Exemplo indexação de ponteiros main() int
i51,2,3,4,5 int p, t p i for
(t0tlt5t) printf(d,pt)
  • Em C, o comando pt é o mesmo que (pt)
  • Exemplo de pilha
  • uma pilha é uma lista primeiro a entrar é o
    último a sair
  • é usada uma rotina para colocar valores na pilha
    (push) e também para tirá-los (pop)
  • é preciso conter um endereço de início de pilha
    (tos)

78
Exemplo pilha int pilha50 int p1,
tos main() int valor p1 pilha tos
p1 do scanf (d,valor) if (valor !
0) push (valor) else printf (aqui esta d\n,
pop()) while (valor ! 0) push(i) int
i p1 if (p1 (tos50)) printf
estouro) exit() p1 i
pop() if (p1 (tos)) printf
(estouro) exit() p1-- return
(p11)
79
  • Ponteiros e strings na passagem de parâmetros o
    computador passa um ponteiro para strings e não o
    valor da string

Exemplo passagem de parâmetros strcmp() char s1,
s2 while (s1) if (s1-s2) return
s1-s2 else s1 s2 return
\0
  • Mas e quando eu passo uma constante de uma string
    como parâmetro?

80
  • O computador trata a constante como se ela fosse
    um ponteiro para o primeiro caractere da string

Exemplo constante de string main() char s s
oi, tudo bem? printf(s)
  • Obter o endereço do elemento de uma matriz
  • p x2 - útil na localização de substring

Exemplo substring main() char s80, p int
i gets(s) for (i0si si !
i) p si printf(p)
81
  • Matrizes de ponteiros feita como com qualquer
    outro tipo. Exemplo int x10
  • Atribuir o endereço de uma variável inteira ao
    terceiro elemento x2 var
  • Achar o valor de var x2
  • Uso comum mensagem de erros

Exemplo mensagens de erros char err não
pode abrir arquivo\n, erro de
leitura\n, erro de escrita\n, falha de
dispositivo\n serro(num) int num printf
(s,errnum)
82
  • Ponteiros para ponteiros
  • Matriz de ponteiros é o mesmo que ponteiros para
    ponteiros, o seu conceito é direto, mas o de
    ponteiros para ponteiros é mais complicado
  • ponteiro (endereço) variável (valor)
  • ponteiro (endereço) ponteiro (endereço) variável
    (valor)
  • Declarando uma variável que é um ponteiro para um
    ponteiro. Ex. float novo

Exemplo ponteiro de ponteiro main() int s, p,
q x 10 p x q p printf
(d,p)
83
  • Inicialização de ponteiros se um ponteiro é
    declarado e não há uma atribuição, ele tem um
    valor desconhecido
  • Ponteiro que não aponta para lugar algum deve ser
    dado um valor nulo
  • Mas a segurança não é total
  • Ponteiro nulo pode tornar as rotinas mais
    eficientes

Exemplo ponteiro nulo for (t0ptt) if
(!strcmp(pt,nome)) break
  • É comum inicializar strings com ponteiros. Ex.
  • char p alo mundo\n - tabela de strings

Exemplo uso de string char p alo
mundo main() register int t print(p) for
(tstrlen(p)-1tgt-1t--) printf(c,pt)
84
  • Problemas com ponteiros
  • ponteiros perdidos
  • o problema em si não é o ponteiro
  • lendo / gravando em posições desconhecidas
  • Há alguns erros que são comuns

Exemplo erro ponteiro não inicializado main() i
nt x, p x 10 p x
Exemplo erro ponteiro interpretação main() int
x, p x 10 p x printf (d,p)
85
  • Alocação dinâmica de memória
  • Existem 2 métodos através dos quais um programa
    em C pode armazenar informações na memória
    principal
  • 1 - através de variáveis locais e globais
  • 2 - através de funções de alocação dinâmica de
    memória malloc() e free() - nesse método o
    programa aloca armazenamento para informações da
    área de memória livre (heap)

Pilha ______ Memória livre para
alocação ________________________ Variáveis
globais _________________________ Programa
86
  • Função malloc() - aloca uma parte do restante de
    memória livre, serve para alocação de memória com
    finalidades gerais. Sintaxe
  • void malloc (int número_de_bytes)
  • retorna um ponteiro do tipo void que significa
    que deve ser usado um tipo cast quando atribuir o
    ponteiro devolvido por malloc() a um ponteiro
    desejado
  • malloc() devolve um ponteiro para o primeiro byte
    da região de memória que foi alocada na área de
    alocação dinâmica
  • se não houver memória suficiente, malloc devolve
    um tipo nulo
  • pode usar sizeof
  • Função free() - devolve ao sistema memória
    previamente alocada. Sintaxe
  • free (void p)
  • free nunca deve ser chamado com um argumento
    inválido, pois será destruída a lista livre

87
Exemplo uso de alocação dinâmica main() int
p, t p (int )malloc(40sizeof(int)) if
(!p) printf (memória insuficientes\n) else
for (t0tlt40t) (pt)t for
(t0tlt40t) printf(d ,(pt))
  • Lembre-se antes de usar o ponteiro que malloc
    devolve, assegura-se que o pedido foi bem
    sucedido testando o valor devolvido!!!!!

88
Funções em detalhes
  • Funções são blocos de construção nos quais
    ocorrem todas as atividades dos programas
  • As funções em maiores detalhes possuem formas de
    modificar argumentos, regras de escopo, tempo de
    vida de variáveis, recursividade especificidades
    da função main
  • Sintaxe
  • especificador_tipo nome_função(lista_parâmetros)
  • declarações de parâmetros
  • corpo

89
  • Uma função simples
  • main()
  • clrscr()
  • linha()
  • printf("\xDB UM PROGRAMA EM C \xDB\n")
  • linha()
  • getche()
  • linha()
  • int j
  • for(j1jlt20j)
  • printf("\xDB")
  • printf("\n")

90
  • Variáveis locais declaradas dentro de uma função
    ou de um bloco (existem durante a execução desse
    bloco de código)

Uso de variáveis locais func1() func2()
int x int x x 10 x -199
Mais uso de variáveis locais f() char
ch printf (continua (s/n)? ) ch
getche() if (ch s) char
s80 printf (digite nome) gets(s)
91
  • Funções que retornam um valor são a maioria e
    têm como padrão o valor inteiro

main() char ch printf("digite 'a' e depois
'b' ") chminusculo() switch(ch) case
'a' printf("\n vc pressionou
'a'.") break case 'b' printf("\n vc
pressionou 'b'" ) break default printf(
"\n vc escolheu algo desconhecido.")
minusculo() char ch ch getche() if (ch
gt 'A' ch lt 'Z') ch'a'-'A' return(ch)
char s80 printf ("digite
nome") gets(s) puts(s)
92
  • Comando return faz com que haja uma saída da
    função e devolve valores
  • Retorno de uma função - A função retorna com uma
    chave () e com return.
  • Usos
  • Devolver valor e retornar para a próxima
    instrução
  • Causar uma saída imediata da função
  • Só retorna um valor a cada chamada

Exemplos de uso de return potência(base,
exp) int base, exp int t if (explt0) return
/ expoente negativo não executa / i
1 for(expexp--) i base i printf (a
resposta é d ,i) minusculo() char
ch chgetche() if (ch gt A ch lt
Z) return (ch a A) else return(ch)

93
  • Passando valores por chamada para passar dados
    para uma função, C usa argumentos e passagem por
    valores

Exemplo passando constante main() printf (d
d d\n, abs(0),abs(-3),abs(10)) abs(x) int
x return((x lt 0?-xx) Exemplo passando
argumentos main() int enpontos while (1)
printf((0 para terminra) pontos
) scanf(denpontos) if
(!enpontos) break else bar(enpontos)
bar(pontos) int pontos int j for
(j1jltpontosj) printf(\xCD) printf(\n
)
94
Erro de uso de função swap (x,y) 100
  • Tipos de valores devolvidos
  • Valores computacionais - devolve valores com base
    em uma operação. Ex. sqrt() e sin()
  • Valores que indicam sucesso na operação. Ex
    fwrite()
  • Valores não explícitos. Ex. printf()
  • Valores podem não ser atribuídos

Exemplo de valores não atribuídos mul
(a,b)---------gt no main z mul(x,y) int a, b
printf(d,mul(x,y)) mul(x,y) return
ab
  • Regras de escopo em c cada função é um bloco de
    código discreto. As variáveis podem ser locais,
    globais e parâmetros formais

95
  • Parâmetros formais variáveis que assumem valores
    dos argumentos

Exemplo de uso de parâmetros formais esta_em(s,c)-
------gt alternativo esta_em(chars, char c) char
s char c while (s) if (s c) return
1 else s return 0
  • Variáveis globais conhecidas em todo o programa
    e declaradas fora de qualquer função mesmo que
    não seja antes do main.

Variáveis globais func1() func2() int
cont int temp int cont main() temp
cont for(cont1contlt10cont) cont
100 func2() printf(.) func1() prin
tf(d,cont)
96
  • Razões de se evitar as variáveis globais
  • ocupam espaço de memória
  • pouca generalização
  • programação de erros
  • alteração acidental
  • Vantagem das variáveis globais uso dos mesmos
    dados em várias funções no programa

Ex. geral Ex. local mul(x,y) int x, y int x,
y mul() return(xy) return(xy)

97
  • Argumentos de funções parâmetros formais dos
    mesmos tipos dos argumentos, podem ser feitas
    atribuições aos parâmetros formais ou pode ser
    usada dentro de uma função, são usadas como outra
    variável local
  • chamada por valor e por referência - em c é feita
    por valor
  • chamada por referência - é simulada

Exemplos main() troca(x,y) int t
10 int x, y printf (d
d,sqr(t),t) temp x x
y sqr(x) y temp int x chama
x xx troca(x,y) return (x)
98
  • chamando funções com matrizes - 3 formas
  • declarando o ponteiro como matriz

Exemplo de funções com matrizes main() int
t10, I for(I0Ilt10I) tII mostre(t)
mostre(num) int num10 int I for
(I0Ilt10I) printf(d ,numI)
  • especificar o parâmetro como uma matriz sem
    tamanho

Exemplo de matriz sem tamanho mostre() int
num int I for (I0Ilt10I) printf(d
,numI)
99
  • especificar o parâmetro como um ponteiro

Exemplo de matriz com ponteiro mostre() int
num int I for (I0Ilt10I) printf(d
,numI)
  • especificar o elemento de uma matriz

Exemplo de especificar elemento de uma
matriz main() int t10, i for (I0Ilt10I)
tI I for (I0Ilt10I) mostre(tI) mostr
e(num) int num printf(d ,num)
100
  • Argumentos argc e argv argumentos de linha de
    comando. Argc e argv são os únicos argumentos
    aceitos por main.
  • Argc - número de argumentos (int). No mínimo um.
  • Argv - ponteiro para uma matriz de ponteiros para
    caracteres. Cada elemento na matriz aponta para
    um argumento da linha de comando

Exemplo de uso de argc e argv main(argc,argv) int
argc char argv if (argc ! 2)
printf(esqueceu o nome\n) exit(0) pr
intf(alo s,argv1)
101
Outro exemplo de uso de argc e argv / contagem
regressiva / main(argc,argv) int argc char
argv int disp, cont if (argc lt 2)
printf(faltou comprimento. Tente
novamente.\n) exit(0) if (arg 3
!strcmp(argv2,display)) disp 1 else
disp 0 for(contatoi (argv1cont--cont) i
f (disp) printf (d ,cont) printf(c,7)
102
  • Para se ter acesso a um caractere individual em
    uma das strings de comando acrescenta-se um
    segundo índice a argv.

Exemplo caracteres individuais da linha de
comando main(argc,argv) int argc char
argv int t, I for (t0tltargct)
I0 while (argvtI) printf
(c,argvtI) I printf( )
103
  • Funções que devolvem não inteiros - quando não é
    o valor default é necessário duas etapas 1) dar
    à função um especificador de tipo explicito 2)
    identificar o tipo da função antes de chamá-la
    pela primeira vez

Exemplo funções não-inteiras float
soma() main() float primeiro,
segundo primeiro 123.13 segundo
99.09 printf(f,soma(primeiro,segundo)) flo
at soma(a,b) float a,b return ab
104
  • Funções void - padrão do unix (nenhum valor)
  • Protótipos - funções que se pode declarar o
    número e o tipo de argumentos - para grandes
    programas ou quando muitos programadores
    trabalham em um projeto

Exemplo protótipo float func(int, float) /
prototipo / main() int x, y x 10 y
10 func(x,y) / não coincide tipos
/ float func(x,y) int x float
y printf(f,y/float)x)
105
Lógica e lógica de programação
  • O que é a lógica
  • Procedimentos utilizados para tirar conclusões de
    premissas e o estudo de tais procedimentos
  • Uma idéia é classificada como lógica se ela puder
    a partir de pressupostos utilizados para
    raciocinar ser considerada uma conclusão
    apropriada
  • Vantagens do estudo da lógica
  • Facilidades para apresentar e organizar as idéias
  • Facilitar a análise das idéias apresentadas por
    outros
  • Se as idéias forem reduzidas ao seu essencial se
    terá mais facilidade para discordar e refutar as
    mesmas

106
  • Lógica dedutiva e lógica indutiva
  • Na lógica dedutiva as conclusões são
    presumivelmente necessárias (se as premissas são
    verdadeiras então as conclusões também o são).
    Ex. a soma de dois inteiros é um inteiro - a e b
    são inteiros - logo, a soma de a e b é um
    inteiro.
  • Na lógica indutiva os argumentos são considerados
    prováveis, mas não necessários. Ex. a galinha e
    o passarinho botam ovo - a galinha e o passarinho
    são ovíparos - logo, os ovíparos botam ovo.
  • Fora da lógica formal existem os vários tipos de
    lógica a lógica capitalista, a lógica marxista,
    a lógica da fome, a lógica da guerra, a lógica da
    engenharia, a lógica do direito, a lógica
    matemática, a lógica da programação etc.

107
  • Argumentações em lógica são utilizadas como um
    padrão da seguinte forma duas premissas e uma
    conclusão
  • A esta construção denominamos silogismo
  • Verdade e validade dos silogismos (a lógica do
    dia-a-dia e a lógica formal)
  • 1a construção
  • Todos os homens são mortais
  • Sócrates é homem
  • Logo, Sócrates é mortal
  • 2a construção
  • Todos as mulheres têm voz fina
  • Pessoas roucas não têm a voz fina
  • Logo, não existem mulheres roucas

108
  • Consideração sobre a construção
  • Todo X é Z
  • Todo Y é Z
  • Todo X é Y
  • Todo mamífero é mortal
  • Todo homem é mortal
  • Todo mamífero é homem
  • 3a construção
  • As pessoas que fazem muitos exercícios físicos
    são musculosas
  • Alguns homens são musculosos
  • Logo, alguns homens fazem muitos exercícios
    físicos

109
  • 4a construção
  • Todos os peixes nadam
  • Alguns mamíferos nadam
  • Logo, alguns mamíferos são peixes
  • A verdade de uma conclusão (correspondência ou
    não à verdade) é diferente da validade da
    conclusão
  • A constatação da verdade, seja ela uma premissa
    ou uma conclusão depende da relação da afirmativa
    com a realidade e não com as outras afirmativas
    do argumento. A validade depende apenas da
    consideração dos elementos do argumento em que
    ela se encontra. Se a premissa leva a uma
    consideração ela é considerada válida.

110
  • Conclusões válidas e verdadeiras

Não verdadeira
Verdadeira
Todos os homens são mortais Sócrates é
homem Logo, Sócrates é mortal
Todos as mulheres têm voz fina Pessoas roucas
não têm a voz fina Logo, não existem mulheres
roucas
Válida
As pessoas que fazem muitos exercícios físicos
são musculosas Alguns homens são
musculosos Logo, alguns homens fazem muitos
exercícios físicos
Todos os peixes nadam Alguns mamíferos
nadam Logo, alguns mamíferos são peixes
Não é válida
111
  • Formas de regras de inferência da lógica dedutiva

Modus Ponens Se estiver chovendo, Pedro voltará
molhado. ( Se P então Q.) Está chovendo. ( P
) Conclusão Pedro voltará molhado. ( Q ) Modus
Tollens Se estiver chovendo, Pedro voltará
molhado. ( Se P então Q.) Pedro não voltará
molhado. ( Não Q ) Conclusão Não está
chovendo. ( Não P ) Afirmação do
Consequente Se estiver chovendo, Pedro voltará
molhado. ( Se P então Q.) Pedro voltará
molhado. ( Q ) Conclusão Está chovendo. (
P )
112
  • Negação do Antecedente
  • Se estiver chovendo, Pedro voltará molhado. ( Se
    P então Q.)
  • Não está chovendo. ( Não P )
  • Conclusão Pedro não voltará molhado. ( Não Q )
  • As pessoas costumam inferir por Modus Ponens,
    apesar de uma quantidade substancialmente menor
    tirar inferências por Modus Tollens.
  • Afirmação do Consequente e Negação do
    Antecedente são consideradas inválidas.

113
Write a Comment
User Comments (0)
About PowerShow.com