Title: LINGUAGEM C
1LINGUAGEM C
Centro Federal de Educação Tecnológica da
ParaíbaCoordenação de InformáticaProfessor
Lafayette B. Melo
2Tó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
3Programas 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)
41. 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
51. 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
61. 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
71. 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
81. 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
91. 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
101. 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!)
111. 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)
121. Introdução à Linguagem C
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)
131. Introdução à Linguagem C
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)
141. 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
151. 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)
161. 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)
171. 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)
18Programa 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
19Condiçõ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
20Blocos de código if (x lt 10) printf (muito
baixo, tente de novo) scanf (d,x)
TÓPICOS
gt
lt
SAIR
21Programa 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
22Programa 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
23Expressõ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
26TIPO 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
27Este 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)
28Podem 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
30Regras 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?
34Programa 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)
35Programa 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
38Comandos 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
39Programa 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)
44Programa 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 (-)
45Programa 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
46for (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)
47Exemplo 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)
48Variaçã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()
49Variaçã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)
50For 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()
52Exemplo 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!!!
54Programa - 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)
55Loops 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)
56Uso 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
57Matrizes 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
58Exemplo 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
59Exemplo 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!
60Exemplo atribuindo valores além do limite da
matriz main() int erro10, i for
(i0ilt100i) erroi1
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)
62Exemplo 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
64Exemplo 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)
66Exemplo 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
68Exemplo 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)
70Ponteiros
- 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
73Exemplo 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!!!
76Exemplo 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)
78Exemplo 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
87Exemplo 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!!!!!
88Funçõ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
)
94Erro 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)
101Outro 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)
105Ló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