Escolar Documentos
Profissional Documentos
Cultura Documentos
Introduo
Introduo I t d
C - Dennis Ritchie (Laboratrios Bell) ( ) Inicialmente para mquinas do tipo PDP-1 (com UNIX). Depois para os IBM PC e compatveis D i t i ( (ambientes MS DOS, e MS Windows) , )
Caractersticas C t ti
A linguagem C muito famosa e muito utilizada:
pela conciso de suas instrues; pela facilidade de desenvolvimento de Compiladores C; pela rapidez de execuo de programas; e principalmente pelo f t que o poderoso i i l t l fato d sistema operacional Unix foi escrito em C.
Um Programa Simples
#include <stdio.h>
/* um programa bem simples q que imprima: Ate logo. p g */
void { }
6
main ()
Exemplo 1 E l
#include <stdio.h> #define B 20 int a,s; int { } void main () { scanf("%d",&a); " " s=somar(a,B); printf("%d",s); }
7
/* 1 */ /* 2 */ /* 3 */ / /* 4 */ /
/* 5 */ /* 6 */ /* 7 */ /* 8 */
Comentrios E 1 C t i Ex1
/* 1 */ /* 2 */ /* 3 */ /* 4 */ /* 5 */ / /* 6 */ / /* 7 */ /* 8 */
8
incluso de um arquivo da biblioteca de C que implementa as funes printf, scanf... b deve ser substitudo por 20 declarao de duas variveis inteiras: a e s definio de uma funo somar definio da funo principal: main leitura do valor de a entrado pelo usurio chamada da funo somar com argumentos a e b impresso do resultado s da soma de a e b
Estrutura de um Programa C
Um conjunto de funes j A funo principal main obrigatria. A funo main o ponto de entrada principal do p g p p programa.
9
main i
void main () { declaraes instrues 1 instrues 2 ... instrues n }
10
As outras funes
Tipo nome (declarao-de-parmetros)
Compilao C il
Pre-Processadores:
Transformao lexical d t t d programa. T f l i l do texto do
Compiladores:
Traduo do texto gerado pelo pre-processador e sua transformao em instrues da mquina. q
Observao
Geralmente, o pre-processador considerado como fazendo parte integrante do compilador.
13
Tipos Bsicos
14
Inteiros I t i
Podem receber dois atributos:
de preciso (para o tamanho) de representao (para o sinal)
Atributos de preciso:
: : :
16
Inteiros I t i
Atributos de representao
unsigned signed g
: :
17
: rep. sobre 16 bits [0, 65535] signed int : rep sobre 15 bits rep. [-32768, 32767] unsigned long int : rep. sobre 32 bits g g p [0, 4294967295] signed long int : rep. sobre 31 bits [-2147483648, [ 2147483648 2147483647] unsigned int
18
Os Inteiros
Em Resumo, temos seis tipos de inteiros:
todos signed
e
19
Pseudo-Reais P d R i
(representao da forma: M * 10EXP) Os flutuantes podem ser:
float : representao sobre 7 algarismos
[-3.4*10-38, 3.4*1038 ] double :representao sobre 15 algarismos [ [-1.7*10-308, 1.7*10308 ] long double : representao sobre 19 algarismos [-3.4*10-4932, 3.4*104932 ]
20
Caracteres C t
Um caracter representado por seu cdigo ASCII (cdigo numrico). Ele pode ser manipulado como um inteiro. Um caracter codificado sobre um b te m byte podemos representar at 256 caracteres.
21
Caracteres C t
O tipo : Char
char c,b; c = \65; b = c;
22
E o ti tipo String? St i ?
No existe em C o tipo string p g propriamente dito. Um substituo: os vetores de caracteres:
char nome[20]
23
E o ti tipo Boolean? B l ?
Ateno: O Boolean no existe em C! Isto geralmente substitudo pelo tipo int:
0 1
24
: :
false true
25
0 a 4,294,967,295 -2,147,483,648 a 2,147,483,647 0 a 4 294 967 295 4,294,967,295 3.4E+/-38 (7 dgitos) 1.7E+/ 308 1.7E+/-308 (15 dgitos) 1.2E+/-4932 (19 dgitos)
DECLARAO DE VARIVEIS
26
Identificadores Id tifi d
Um identificador um meio para manipulao da informao Um U nome que i di uma varivel, indica i l funo, tipo de dados, etc. , p ,
27
Identificadores Id tifi d
Formado por uma combinao de caracteres alfanumricos Comea por uma l t d alfabeto ou C letra do lf b t um sublinhado, e o resto pode ser , p qualquer letra do alfabeto, ou qualquer d it numrico ( l i l dgito i (algarismo), ) ou um sublinhado.
28
4_nota;
Palavras Chaves P l Ch
(so 32 palavras)
auto break case char const continue default do
31
Declaraes D l
tipo lista-de-nomes-de-variveis
Exemplo: p
32
Inicializao de Variveis I i i li d V i i
C no inicializa automaticamente suas variveis. Isto pode ser feito no momento da declarao: int i=1,j=2, k=somar(4,5); short int l=1; char c=\0;
33
Operaes
34
Atribuio At ib i
Exemplo:
35
Exemplos de Atribuio E l d At ib i
i = (j = k) - 2; 5 3 (caso k=5) j=5 i=3
/* /* / /* /* /* /*
r1 5.0 */ i1 3 */ / i1 65 */ c1 5 */ r1 65.0 */ c1 3 */
As duas expresses so avaliadas, depois a adio/subtrao/multiplicao realizada, e o valor obtido o valor da li d l btid l d expresso.
Pode ter uma converso de tipos, depois da avaliao das expresses: float x,y; int z; x=y+z;
39
Diviso Di i (1)
Expresso1 / expresso2
Em C, o / designa no mesmo tempo a diviso dos inteiros e dos reais. Isto depende ento dos valores retornados pelas expresses:
Se os dois so inteiros ento a diviso inteira, mas se um deles real ento a diviso real.
40
Diviso Di i
(2)
Caso os dois operandos inteiros so positivos, o sistema arredonda o iti i t d d resultado da diviso a zero:
7 / 2 retorna 3
Caso os dois operandos inteiros so de sinais diferentes, o arredondamento depende da implementao mas p p geralmente feito a zero:
41
O Mdulo % Md l
Expresso1 % Expresso2 Retorna o resto da diviso inteira. R t t d di i i t i
7 % 2 retorna 1
Caso um dois operadores negativo, o sinal do mdulo depende da implementao, mas geralmente o sinal do primeiro
7 % 2 -7 % 2 7 % -2
42
Operadores Relacionais O d R l i i
Expresso1 op-rel Expresso2 Onde op-rel um dos seguintes smbolos: op rel Operador Semntica == igual g != diferentes > superior >= superior ou igual < inferior <= inferior ou igual O resultado da comparao um valor lgico: 1 (se a comparao verificada) e 0 (seno)
43
Operadores Lgicos
Para combinar expresses lgicas
Operador Semntica
&& || !
e ou negao
Exemplos:
a >= b > (a = = 0) || (b != 0) ! ((a = = 0) && (b<3))
44
Operador & O d
o operador de endereamento p (ponteiro): &a o endereo da varivel a acesso ao contedo da varivel a.
45
Incremento/decremento I t /d t
x = x + 1; ; x++; ++x; s+=i; z = y++; y ; z = ++y;
46
/* isto incrementa x */ /* isto incrementa x */ /* isto incrementa x */ / s=s+i / /* s=s+i*/ /* z = y e depois y++ */ p y /* y++ e depois z = y (novo) */
Regra
v = v operador expresso v operador= expresso operador
47
Condicional
a = (b >= 3.0 ? 2.0 : 10.5 );
if (b >= 3.0) a = 2 0; 2.0; else a = 10 5; 10.5;
Entradas e Sadas
49
Sadas S d
printf("Bom dia"); puts("Bom dia"); putch(a) printf
idade)
50
Entradas E t d
gets(s); char c; c = getch(); g (); c = getchar();
/* com echo */ /* leitura de um string */
scanf ("%d",&nome);
/* para a l it leitura d var. nome */ da
51
nova linha tabulao (horizontal) tabulao vertical um espao para trs um return um bip backslash o caracter % um apostrofo um ponto de interrogao
Converso de Tipos
d o x e u c s f
53
notao de decimal notao octal notao hexadecimal notao matemtica notao sem sinal notao de caracter notao de string notao de flutuante
Formatao
Cada um desses caracteres de converso utilizado depois do % para indicar o formato da sada (da converso) Mas, entre os dois podemos entrar outros argumentos:
54
Formatao
+ n 0n n.m justificar a esquerda o sinal sempre aparente o comprimento mnimo da sada (seno brancos) o comprimento mnimo da sada (seno 0s esquerda) para separar as partes antes e depois da virgula total de n dgitos cujo m so depois dgitos, da virgula. para indicar um long
l
55
Exemplo
#include <stdio.h> int main() { int a; long int b; short int c; unsigned int d; char e; float f; double g; a = 1023 1023; b = 2222 2222; c = 123 123; d = 1234; e = X; f = 3 14159 3.14159; g = 3.1415926535898; ... }
56
Exemplo
{
printf("a = %d\n", a); a = 1023 printf( a printf("a = %o\n", a); a = 1777 %o\n , printf("a = %x\n", a); a = 3ff printf("b = %ld\n",b); b = 2222 \ printf("c = %d\n", c); c = 123 printf("d = %u\n", d); d = 1234 printf( e printf("e = %c\n", e); e = X %c\n printf("f = %f\n", f); f = 3.141590 printf("g = %f\n", g); g = 3.141593 \
57
Exemplo
{ printf("\n"); i tf("\ ") printf("a = %d\n", a); printf("a = %7d\n", a); p printf("a = %-7d\n", a); ( \ , ); c = 5; d = 8; printf("a = %*d\n", c, a); printf("a = %*d\n", d, a); }
58
Exemplo
{
printf( \n ); printf("\n"); printf("f = %f\n", f); printf("f = %12f\n" f); %12f\n", printf("f = %12.3f\n", f); printf("f = %12.5f\n", f); p printf("f = %-12.5f\n", f); ( \ , );
}
59
Exemplo
As sadas so:
f f f f f
60
Diretivas de Compilao
61
Diretivas de compilao
So instrues para o pre-processador. Elas no so instrues C, portanto elas no terminam por uma virgula. Para diferenci-las das instrues C, elas p p p so precedidas pelo smbolo especial # Temos principalmente as seguintes diretivas:
#include #define #if, #else, # dif #if # l #endif
62
APPEND (~ PATH, mas para os arquivos de dados e no para os executveis) Em Windows: isto especificado no ambiente
63
#include #incl de
Para a incluso de um arquivo usurio. Neste caso, a busca do arquivo feita apenas no diretrio atual. Seno, pode se especificar o caminho completo do arquivo
64
Exemplo de incluso E l d i l
... #include "f2.c" ...
f2.c
for (i=0;i<5;i++) p printf("Oi");
f1.c f1.c
... for (i=0;i<5;i++) printf("Oi"); ...
65
Um arquivo header contm um conjunto de declaraes de variveis e funes. Observao: Os headers includos podem p tambm incluir outros arquivos (mas no pode existir uma referencia mtua)
66
Substituies: #d fi #define
#define MAX 60 #define TRUE 1 #define FALSE 0 #define BOOLEAN int
{
Outros Macros O t M
#define quadrado(a) (a)*(a) #define quadrado(a) a*a #define adicionar(a,b) ((a)+(b)) #define adicionar(a,b) (a)+(b) quadrado(3-2); (3-2)*(3-2) = 1 5 adicionar(2+1,4); 5 ((2+1)+(4)) 5*adicionar(2+1 4); 5*((2+1)+(4)) = 35
regra geral: colocar todas as variveis entre parnteses e o resultado tambm l d b
69
/*aqui MAX=45*/
70
71
O const t
Para declarar variveis constantes podemos usar a palavra chave const const int N 20
Isto proibe que N seja modificado no programa (toda tentativa de modificao vai dar erro)
Diferena para o #d fi Dif #define: - Usando o const teremos uma reserva de um espao
na memria. Ele se aplica sobre qualquer tipo de var memria var. - O #define serve somente para o pre-processador que faz as substituies necessrias antes da compilao.
73
Estruturas de Controle
74
Blocos d instrues Bl de i t
{ declaraes instruo_1 ..... instruo_2 } Em um bloco pode-se declarar variveis, que ficam visveis somente no bloco bloco.
75
if (a!=0) x=-b/a; b/
78
Observao
A condio no obrigatoriamente uma comparao. P d ser qualquer Pode l expresso retornando um valor que pode ser comparado a zero. d int b=0; if (b) { }
81
82
}
83
Instrues de Repetio
84
while hil
while (condio) instruo instruo Exemplo: c=s; while (c!=f) { c=getch(); }
85
fim d wh do hile
no
86
do...while d hil
do c=getch(); while (c==s)
(2)
instruo i t
fim f do do sim condio! 0 condio!=0 ?
no
87
for
(1)
88
for
(2)
expresso1 inicializao fim do for
condio!=0 ? sim
no
instrues i t
expresso2
89
for f
(3)
A novidade que as expresses podem ser instrues instr es mltiplas (separadas por virgula) irg la)
Exemplo: for (i=1,j=10; i<=j; i++,j--) { instrues; }
90
break b k
O break permite parar a instruo de d repetio (for, do ou while) ti ( )
Se temos vrios nveis, o controle volta , penltima estrutura de repetio. for (i 0 i 20 i ) f (i=0;i<20;i++) if (vet[i]==10) break;
91
continue
Utilizada dentro de uma instruo for, while ou do O continue permite parar a iterao atual e passar iterao seguinte seguinte. Exemplo: p for (i=1;i<20;i++) { if (vet[i]<0) continue; ... }
92
Funes
93
94
95
mdulo de int. mdulo de real exponencial arredondar ao max d d arredondar ao min xy 10x hipotenusa raiz quadrada
double
int
abs(int)
double fabs(double) double exp(double) double d bl double double double ceil(double) il(d bl ) floor(double)
pow(double x,double y)
pow10(double)
sqrt(double)
testa se tecla
int
int
kbhit ()
putch (int c)
putch imprima um char c getch leia char sem echo int t h herex posio x do cursor herey h
97
posio y do cursor i d
99
Exemplos de f E l d funes
graphics.h
rectangle desenha um retngulo void rectangle (int e, int c, int d, int b)
string.h g
100
Semntica S ti
tipo:
o tipo do valor devolvido pela funo
Exemplo E l
float media (a,b) float fl t a,b; b /* / declarao dos
parmetros formais */
104
Observao Ob
A prototipagem da funo pode ser feita de uma vez: int min (int a, int b) { if (a<b) return (a); else return (b); }
105
Procedimentos P di t
Funes que no retornam valores: usando o tipo especial void void linha ()
{ printf("-------------------------\n"); }
Observao: no temos aqui a instruo return (o tipo especial void no existia nas primeiras verses da linguagem)
107
110
&
void somar (int x, int y, int * som) { *som = x+y; } void main () oid { int a=5, b=6, s; somar(a,b, &s); printf("%d + %d = %d",a,b,s); }
111
112
Declarao de Funes
Uma funo F conhecida implicitamente por uma outra funo G se elas so definidas no mesmo arquivo, e que F definida antes de G. Fora desse caso, e para um controle de tipo e um bom link preciso declarar as link, funes antes de usar.
113
Exemplo E l
void { } ... int maior (int x, int y) { return (x>y?x:y); }
/*a main pode ser definida antes*/
114
main
(void)
int maior (int x int y); 2a x, Mas, melhor usar o segundo formato que mais completo
115
Funes Iterativas
exemplo do fatorial long int fat (long int n) { long int i,res=1; for (i=1;i<=n;i++) res=res*i; return (res); }
116
Funes Recursivas F R i
exemplo do fatorial long int fat (long int n) { if (n == 1) return 1 t 1; else return (n*fat(n-1)); }
117
Exerccios
Escreva as funes real_dlar e dlar_real dlar real de converses Real Dlar e vice Real-Dlar versa. Escreva as verses recursiva e it ti E i iterativa da funo soma que retorna a soma dos n primeiros termos:
S(n) = 1 + 1/2 + 1/3 + ... + 1/(n-1) + 1/n
Declaraes
119
Um identificador declarado fora das funes, tem um escopo em todo o programa. Um parmetro formal de uma funo, tem um escopo local funo. Um identificador declarado em um bloco tem um escopo local ao bloco. bloco Uma etiqueta de instruo, tem escopo em toda a funo onde ela declarada declarada.
120
}
121
Variveis Automticas V i i A t ti
Alocao na entrada de uma instruo composta (um bloco) e liberao na sada sada.
Variveis Dinmicas
A declarao e liberao so explicitamente realizadas pelo programador (usando malloc e free). Mas, essas funes so da biblioteca e no fazem parte integrante da linguagem.
122
123
124
auto t
{auto int i; ... }
Este tipo de indicador autorizado somente para as variveis locais a uma instruo composta (um bloco). ( bl ) Ele indica que a varivel tem uma durao q de vida local ao bloco. O uso deste indicador quase inexistente, pois inexistente por default toda varivel local automtica
126
static
{static int i; ... }
O static indica que a varivel tem uma durao de vida ao longo da execuo do programa. Mas que ela fica local ao bloco (ela fica desconhecida fora de seu bloco). Portanto, a varivel guardar seu valor para cada chamada ao bloco.
}
A varivel num_chamada inicializada somente uma vez Tem durao de vida ao vez. longo da execuo do programa. Mas ela tem escopo local.
128
register
{register int a,b; ... }
Este tipo de indicador autorizado somente para as variveis locais a uma instruo composta (um bloco) e para as declaraes de parmetros de funes. Ele tem o significado do auto alm de provocar o auto, armazenamento da varivel em um registro e no na memria. acesso mais rpido. i id Claro que isto depende das capacidades da mquina (nmero e tamanho dos registros)
129
extern t
int a; void f() { {... extern int a; ...} }
Os outros indicadores so relacionados s variveis locais ari eis locais. Uma varivel global definida fora de qualquer corpo de funo. l d f O extern permite usar (acessar) uma varivel que definida fora.
Zona das variveis estticas ; Zona das variveis automticas (organizada em forma de pilhas pois as funes podem ser pilhas, recursivas)
Zona das variveis di i Z d i i dinmicas ( (organizada em forma de i d f d monto ou tas / stack) monto
131
o extern no realmente)
Tabelas
133
Tabelas T b l
O objetivo da estrutura de tabela agrupar um conjunto de informaes de p mesmo tipo em um mesmo nome. Uma tabela pode ser multidimensional ou unidimensional (vetor). dimensional
134
Declarao
float vet[10]; [ ]; long int v1[8], v2[15];
/* v1 um vetor de 8 long int e v2 um vetor de 15 long int */
Dimenso Di
Na prtica, recomendado definir sempre uma constante que indica o nmero de elementos: l t #define N 60 short int v[N];
/* declara um vetor de 60 inteiros indexado de 0 a 59 */
136
Inicializao I i i li
#define N 4 int v[N]={1,2,3,4};
Incializao de somente uma parte do vetor:
Operadores abrangentes O d b t
lembramos que:
x++ i ++ incrementa x mas retorna o valor inicial t t l i i i l ++x incrementa x e retorna o valor incrementado i=0; v[i++]=0; /* v[0]=0 e i=i+1 */ v[i++]=0; [ ] ; / v[1]=0 e i=i+1 */ /* [ ] / i=1; v[++i]=0; v[++i]=0; /* i=i+1 e v[2]=0 */ /* i=i+1 e v[3]=0 */
Pesquisar em um vetor:
for (i=0; i<N && t[i]!=10; i++);
/* usando a instruo nula */ d i t l
Inicialiazao:
int mat [3][4] = { {5,6,8,1}, {4,3,0,9}, {12,7,4,8}, }
141
Exemplo E l
/* Declarao: */
#define L 4; #define C 3; int mat[L][C]; [ ][ ];
/* leitura: */
for (i=0;i<=L;i++) for (j=0;j<=C;j++) { printf("digite o elemento [%d,%d]: ",i,j); scanf("%d",&mat[i][j]); }
142
Observao 1 Ob
for (i=0,j=0;i<L && j<C;i++,j++) {
printf("digite o elemento [%d,%d]: ",i,j); scanf("%d",&mat[i][j]);
Observao 2 Ob
int sum (int n) { int res=0; for (;n>0;n--) /*n inicializada na chamada / (;n>0;n ) / n chamada*/ res=res+n; return (res); ( ) }
chamada: sum(5)
Exerccios
A.1 Escreva o procedimento ini_num_dias que inicializa um vetor num_dias[12] q indica para cada [ ] que p ms do ano seu nmero de dias: (num_dias[i] indica o nmero de dias do ms i do ano), sabendo que:
Se i=2 ento num dias=28; num_dias=28; Se (i par e i<=7) ou (se i impar e i>7) ento num_dias=30 Seno num_dias=31.
A.2 Escreva o procedimento imp_num_dias que imprima os nmeros de dias de todos os meses do ano. B. Escreva a funo ordenar que ordena um vetor.
145
Tipos Enumerados
146
enum
A enumerao permite de agrupar um conjunto de constantes (compartilhando a mesma semntica)
exemplos:
enum dias {Domingo, Segunda, Tera, Quarta, Quinta, Sexta, Sbado};
declarao:
dias d1,d2=Quinta; , Q
enum defini um novo tipo cujo os elementos so numerados automaticamente de pelo compilador: 0 1 2 ...
147
Exemplo E l
#include <stdio.h> enum dias {Segunda Tera Quarta Quinta {Segunda,Tera,Quarta,Quinta, Sexta,Sbado,Domingo} d; // d uma varivel declarada de tipo dias void main (void) { // di dias d uma outra maneira de declarar d; t i d d l for(d = Segunda ; d < Domingo ; d++) printf(O cdigo do dia : %d\n , d); %d\n" }
Vai imprimir os valores dos dias:
148
0 1 at 6 0, 6.
enum
Essa numerao permite comparar os elementos do tipo: if (d1<=d2) ... Portanto podemos mudar essa numerao:
enum boolean {true=1,false=0};
Quando um item no numerado ele pega o valor de se precedente alor seu precedente:
enum temperatura { {baixa=2,media=4,alta}; , , };
149
Ponteiros
150
Variveis Di i V i i Dinmicas
Todas as variveis vistas at agora so estticas (reserva imediata na memria), contudo precisamos de variveis dinmicas Um ponteiro uma referncia sobre um objeto na memria ( um endereo).
151
Variveis Dinmicas
Exemplo de Declarao de Ponteiros: p float * pf
/* declara que pf um ponteiro sobre um real */
pf 4.6
152
P
(Ponteiro)
V
(Varivel)
&v
154
Exemplo E l
int i,j; int *pi;
/* pi um ponteiro sobre um inteiro */
pi &i &j 56 i 4 j
Exerccio
1. Declare um inteiro i e um ponteiro p sobre um inteiro 2. 2 Inicialize o inteiro com um valor qualquer 3. Aponte o ponteiro sobre a varivel i 4. Imprima o valor de i 5. 5 Modifique o valor de i usando o ponteiro 6. Imprima o novo valor de i
156
int i; int * p; i=8; p=&i; printf("i= %d\n",i); *p=5; p=5; printf("novo i= %d\n",i);
157
/* 1 */ /* 1 */ /* 2 */ /* 3 */ /* 4 */ / /* 5 */ / /* 6 */
Passagem de Parmetros P d P t
Passagem de parmetros (dois tipos):
(FORTRAN, PL/1)
Temos a escolha entre a passagem por valor p g p ou por referncia (caso de PASCAL) Toda passagem feita por valor (caso de C)
158
Estratgia d E t t i de C
Em C, toda passagem de parmetros portanto feita por valor. Como ento fazer as passagens por referncia? A soluo de declarar os parmetros formais de tipo ponteiro ponteiro. Isto feito pelo uso do operador & (usado na chamada a funo).
159
Exemplo E l
void
{ }
*res=a+b;
observe que na chamada tem que passar o endereo da varivel onde deseja-se recuperar o resultado
Um outro exemplo
A funo troca
void troca (int * x, int * y) { int temp; temp=*x; *x=*y; *y=temp; }
Funes Genricas
O problema que esta funo troca que ns definimos se aplica somente sobre os inteiros p void troca (void * x, void * y) { int temp; temp=*x; *x=*y; * * *y=temp; } Infelizmente isto no pode ser feito em C Mas o problema resolvido em C++
162
Tabelas e Ponteiros
163
Conseqncia 1 C i
Trs conseqncias principais da considerao que uma tabela um id t b l ponteiro: O operador de indexao [ ] no til: p Mas ele foi adotado pela linguagem parar no quebrar os costumes dos g programadores
165
Conseqncia 2
Manipulao de sub-tabelas:
int t[10]; int * p; p=&t[2];
0 1 2 3 9
p t
Conseqncia 3 C i
O operador de indexao comutativo: t[i] = i[t] isto i t porque a adio comutativa: di t ti
t[i] i[t] *(t+i) *(i+t)
Mas, por razes de legibilidade do programa esta possibilidade muito pouco utilizada.
167
168
/*aponta sobre o 1o elem do vetor*/ /*aponta sobre o ltimo elem do vetor*/ /*aponta sobre o lti /* t b ltimo elem do vetor*/ l d t */ /*aponta sobre o 1o elem do vetor*/
Passagem d P t P de Parmetros
Em C uma tabela pode ser passada como parmetro a uma funo Quando isto feito, em realidade, o endereo do primeiro elemento que passado como parmetro. A passagem ento feita por referncia. O parmetro formal da funo chamada deve ento ser declarado de tipo ponteiro p p
170
1a Abordagem
void imp_tabela (int * t, int num_elem)
Crtica C ti
Este mtodo apresenta inconvenientes: p A declarao e a chamada no parecem muitos naturais para os programadores
Na declarao int * t no mostra se t aponta sobre um inteiro ou sobre uma zona de p inteiros (a tabela)
172
2a Ab d Abordagem
Por esta razo, C permite uma declarao mais natural dos parmetros formais: p
void imp_tabela (int t[],int n) { int i; for (i=0;i<n;i++) printf("%d",t[i]); }
Ateno: No preciso conhecer o tamanho exato da tabela. o tamanho geralmente passado como g p parmetro separado.
chamada:
173
imp_tabela(tab,L); i t b l (t b L)
chamada: min(mat,L);
174
Algumas consideraes Al id
A funo min aplicada a uma tabela que tem qualquer nmero de linhas, mas deve ter um exato C de linhas colunas. As outras dimenses ( 1a) devem ser especificadas por ), que o compilador precisa para gerar o cdigo que permite o acesso aos elementos: No caso de uma matriz binria t por exemplo, o endereo de t[i][j] : t+(i*C+j)*T (T o tamanho de um elemento de t, C o nmero de colunas) Representao da tabela na memria:
175
11 12 13 14 21 22 23 24 31 32 33 34 41...
Tabelas d T b l de ponteiros t i
possvel declarar uma tabela de ponteiros: exemplo: #define N 15 char * tab[N]; /* declara um vetor de ponteiros
sobre elementos de tipo caracter */ /
acesso: *tab[i]
tab
177
*tab[i]
Objeto apontado
Ponteiro de Ponteiro
178
int
Argumentos do main A t d i
Um programa C pode ser chamado externamente com alguns parmetros: t t l t A funo main recebe sempre dois parmetros:
argc (argument count) que determine o nmero de argumentos da linha de comando; e argv (argument vector), que um ponteiro sobre uma tabela de ponteiros sobre strings:
180
argv
um ponteiro sobre um vetor de ponteiros sobre strings: char * argv[]; g []; argv[0] aponta sobre o nome do arquivo (nome do programa)
argv[i] vai apontar sobre os argumentos passados ao programa na linha de comandos.
181
exemplo
Suponha: programa achar_max pega como parmetros um conjunto qualquer de strings e que deve determinar e imprimir a maior string:
argv achar_max\0 \0 \0 \0
argv[0] o nome do programa: achar_max,e os outros argv[i] so os argumentos passados ao programa na linha de comandos.
182
#include <stdio.h> #include <string.h> void main (int argc, char * argv[]) { int com_max=0, arg_max=0; argc--; while (argc>=1) { if (strlen(argv[argc])>com_max) { com_max=strlen(argv[argc]); arg_max=argc; } argc--; } if ( (arg_max) printf("O string maior % " argv[arg_max]); ) i tf("O t i i : %s", [ ]) } 183
Strings
184
String ~ Vetor St i V t
Um string um conjunto de caracteres. Em C, um string uma estrutura equivalente estrutura de vetor, A nica diferena que o string termina sempre pelo caractere \0 Isto para facilitar o tratamento dos strings p g (para poder detectar o fim do string)
185
Declarao D l
O tipo string no existe em C, Portanto existe duas maneiras para simular este tipo de variveis:
186
Os strings declarados como vetor de chars tm um tamanho limite fixo (o tamanho do vetor). Se o tamanho do string menor do que o tamanho do vetor, o compilador C completa pelo caractere especial \0 para indicar o fim do string.
187
char ch[20]= "exemplo"; O tamanho pode ou no estar especificado: char nome[]="este tem 23 caracteres";
188
O i
\0
H i
\0
Contrariamente outra maneira, a reserva do espao memria no feita no momento da declarao, mas dinamicamente no momento da atribuio. atrib io
190
Inicializao e Atribuio I i i li At ib i
A Inicializao feita diretamente por uma string:
ch ch = "uma mudana"; ch = " "outra mudana"; d " uma mudana\0 outra mudana\0
Isto I t no uma copia mas uma atribuio de ponteiros. i t ib i d t i
191
Manipulao d Strings M i l de St i
As funes de manipulao de strings so definidas no arquivo da biblioteca string.h
Temos principalmente as seguintes funes: strcpy, strlen strcat, t t strcmp, strchr, strchr
192
Strcpy/strncpy
A funo especial strcpy permite atribuir um valor texto a uma varivel de tipo texto: O strcpy apresenta dois formatos de uso:
strcpy(string1,string2); strncpy(string1,string2,N);
exemplo:
char *ch1="boa", *ch2="noite"; strcpy(ch1,"isto um exemplo"); strncpy(ch2,ch1,4); /* ch2 vai pegar "isto" */
193
strlen
strlen permite retornar o tamanho de um string: nmero de chars que compem o g string (o \0 no faz parte) exemplo:
int a; char * nome; strcpy(nome,brasil ); strcp (nome brasil") a=strlen(nome); /* a=6 */
194
strcat/strncat
strcat se aplica sobre dois strings e retorna um ponteiro sobre a concatenao dos dois. exemplo:
char *ch1="boa", *ch2="noite", ch1= ch2= *ch3, *ch4;
195
strcmp/strncmp
Lembramos que as letras so ordenadas dando seu cdigo: a< ... z< A...<Z a < z < A < Z
exemplo: l
*ch1="boa tarde", *ch2="boa noite"; ch2 ; int a,b; a=strcmp(ch1,ch2); b=strncmp(ch1,ch2,4); b=strncmp(ch1 ch2 4); char
196
strchr/strrchr t h / t h
strchr procura por um caractere em um string e retorna um ponteiro sobre sua ltima ocorrncia, seno retorna null. t exemplo:
char ch[]="informtica"; [] char *pc, c='f';
pc=strchr(ch,c);
if (pc) /* i.e. if pc!=null */ printf("%d",*pc); else printf("Caractere inexistente"); O strrchr faz a busca no senso inverso.
197
touppar/tolower
toupper converte um caractere minsculo em maisculo. tolower faz o contrrio. # include <ctype.h>
char c='a';
/* c= 'A'
*/
Exerccios 1
A. Defina a funo ocorrncia que retorna o
nmero de ocorrncias de um caractere em um string.
int tamanho1 (char s[]) /* com um vetor */ { int i=0; while (s[i]) /* equiv. while (s[i]!= '\0' ) */ i++; return (i); } int tamanho2 (char * s) /*com os ponteiros*/ { int i=0; while (*s) /* equiv. while (*s!= '\0 ') */ {i++;s++;} return (i); ( ) }
200
void
main (void)
{
char ch[]="So Luis"; int a,b; a=tamanho1(ch); b=tamanho2(ch); /* a= 8*/ /* b= 8*/
201
202
Tipos usurios
203
typedef t d f
Podemos definir novos tipos usando o typedef: typedef <tipo> <sinnimo> exemplo: l
typedef float largura; typedef float comprimento; largura l l l; comprimento c=2.5; l=c; l //* warning *// i
204
typedef e struct t d f t t
205
Estruturas
206
Declarao: mtodo 1
struct cliente { int cpf; char nome [20]; char endereco[60]; };
Declarao: mtodo 2 D l t d
Podemos criar estruturas sem nome: struct { t t int cpf; char nome [20] h [20]; char endereco[60]; } c1,c2; 1 2 Problema: para criar uma outra varivel de mesmo i t i l d tipo em outro lugar do programa preciso rescrever tudo tudo.
208
Declarao: mtodo 3 D l t d
Podemos, no mesmo tempo, dar um nome estrutura e declarar as variveis: struct cliente { int cpf; char nome [20] h [20]; char endereco[60]; } c1,c2; 1 2
Declarao: mtodo 4 D l t d
Definindo um tipo estrutura typedef struct { int cpf; char nome [20]; char endereco[60]; } Cliente; Cliente
210
Exemplo
void { imprimir_cliente (Cliente c)
Combinao de Estruturas
Podemos definir estruturas de estruturas, estruturas d vetores, t t t t de t vetores de estruturas.... exemplo
typedef t d f struct {int num; char * rua; t t {i t h char * bairro; int cep} End; struct {int cpf; char * nome; End endereco} Pessoa;
typedef
213
Vetores d Estruturas V t de E t t
Podemos criar um vetor de estruturas (dois mtodos): exemplo: struct cliente vet[100]; /* seguindo o mt. 1*/ Cliente vet[100]; /*seguindo o mt. 4*/ declara um vetor de 100 clientes. Referencia aos elementos: Para referenciar o nome do isimo cliente do vetor: vet[i].nome
214
Exerccio E i
Escreve um programa C que:
Declara um vetor de alunos: turma (um aluno definido pelo cpd, nome, trs notas, mdia, e conceito) Preenche esse vetor (campos: cpd, nome, e notas). Preenche os campos mdia e conceito (bom se mdia8, regular se 7 e ruim seno); Define a funo que imprime todos o elementos do vetor. Define a funo que pesquisa um elemento do vetor (pesquisa pelo nome, pelo cpd, ou pelo conceito). ( i l l d l it )
215
Estruturas e Ponteiros
216
Estruturas di i E t t dinmicas
Usando as estruturas e os ponteiros p podemos entrar no mundo das estruturas auto referenciais: Listas, Arvores, Grafos, etc. Listas Arvores Grafos etc
217
Para acessar aos campos da estrutura apontada por pp usamos o operador -> pp->nome; /* equiv. a pess.nome */ pp->idade=25; /* pess.idade=18 */
220
PtrPessoa
222
pp;
Ilustrao
CPF nome endereco next CPF nome endereco next
223
... printf("Entra com o nome: "); scanf("%s",&p->nome); printf("Entra com a idade: "); scanf("%d",&p->idade); p->next=NULL;
224
Listas Li t
O fato de que uma estrutura pode apontar para uma o tra permite criar listas encadeadas. ma outra encadeadas Uma lista encadeada til principalmente p p quando ns no sabemos a priori (no momento da compilao) o nmero de seus elementos, o que uma necessidade no caso do uso do tipo vetor. Contrariamente aos vetores uma lista vetores, encadeada uma estrutura dinmica: os elementos so criados dinamicamente:
226
malloc para a alocao do espao memria para um elemento; e calloc para a alocao do espao memria para um conjunto de elementos.
227
malloc ll
um nico parmetro que o tamanho (em bytes) do espao memria do elemento que ns desejamos criar, e retorna um ponteiro sobre o elemento criado.
malloc
pega
Obs. O tamanho do elemento obtido usando o operador sizeof. i f exemplo: Pessoa * p p; p=malloc(sizeof(Pessoa));
228
p=malloc(sizeof(char));
calloc ll
calloc pega dois parmetros: - o nmero de elementos que d l t desejamos criar; - e o tamanho de um elemento (em bytes). O objetivo de alocar espaos para vrios elementos de s uma vez.
229
calloc ll
exemplo: Pessoa * p; int num_elementos=4; ... p=calloc(num_elemenetos, ll ( l t sizeof(Pessoa)); Podemos, depois, usar p[0], p[1], p[1] ... P[num_elementos - 1]
230
Observao Ob
As funes malloc e calloc so definidas no arquivo <alloc.h> d biblioteca. i ll h da bibli t Geralmente antes do malloc tem que especificar o tipo da estrutura cujo o ponteiro que ser criado vai apontar:
pat (PtrPessoa)malloc(sizeof(Pessoa)); pat=(PtrPessoa)malloc(sizeof(Pessoa));
p=(char *)malloc(sizeof(char));
231
null ll
Quando no tem mais espao livre, as funes malloc e calloc retornam o valor null Este valor pode servir tambm para inicializar uma ponteiro exprimindo que ele aponta sobre nada.
232
// 2 bytes
233
234
Exemplo
typedef struct {int dia,mes,ano;} data;
/* funo de comparao entre duas datas */ int comp_datas(data * d1, data * d2) { if (d1->ano==d2->ano) && ... return 1; else return 0; } data d1,d2; ... comp_datas (&d1,&d2);
235
data * d2001 () { data * p; p=malloc(sizeof(data)); p p->dia=1; p->mes=1; p->ano=2000; p p return (p); } data * d; d=d2001();
236
Observao
Pessoa * p; p=malloc(...) ll ( ) Normalmente o malloc no retorna um ponteiro sobre uma estrutura. Isto pode g causar um warning. Uma maneira correta de escrever :
p=(Pessoa*)malloc(sizeof(Pessoa))
Exerccio E i
Defina a funo proximo_aniv que pega em entrada a data de nascimento de uma pessoa e retorna uma estrutura designando a data de seu prximo aniversrio.
238
data * proximo_anniv (data * p) { data * anniv; anniv=(data*)malloc(sizeof(data)); anniv->ano=p->ano + 1; anniv->mes=p->mes; anni >mes p >mes anniv->dia=p->dia; return ( (anniv); i ) } data d_nasci,d_anniv; ... d nasci d anniv; d_anniv=proximo_anniv(&d_nasci);
239
Criao de Li t C i d Listas
typedef struct { char nome[20]; int peso; Pessoa * seguinte; } Pessoa;
nome, peso nome, peso
Cabea
nome,peso
next
240
next
...
NULL
Pessoa * cabeca,pant,patu; char resp; patu=(Pessoa *)malloc(sizeof(Pessoa)); patu->peso=30; ... cabeca=patu; puts("mais uma pessoa ( / ) ") resp=getch(); t (" i (s/n): "); t h() while (toupper(resp)!=N) { pant=patu; patu=(Pessoa *)malloc(sizeof(Pessoa)); )malloc(sizeof(Pessoa)); ... /* leitura dos dados da nova pessoa */ pant->seguinte=patu; patu->seguinte=NULL: puts("mais uma pessoa (s/n): ");resp=getch(); }
241
Listas Li t
Conjunto de elementos individualizados em que cada um referencia um outro elemento distinto como sucessor
243
Listas Li t
Lista de Tarefas
Comeo em 3 C Item 1. 1 Pagar as contas no banco 2. Comprar os livros na livraria 3. Deixar o carro no estacionamento 4. Pegar algumas fitas na videolocadora p 5. Enviar carta pelo correio 6. Buscar as fotos reveladas 7. Autenticar documentos no cartrio 8. Passa na banca de jornais
244
Prximo 6 4 8 Final 1 2 5 7
245
246
247
lista[9].prox = lista[6].prox;
2 Passo
248
Lista[6].prox = 9;
249
250
251
lista[9].prox = lista[4].prox;
2 Passo
252
Lista[4].prox = 9;
253
254
255
lista[9].prox = comeco;
2 Passo
256
comeco = 9;
257
258
259
260
261
PILHA (LIFO)
o inverso de uma fila Regra: todo o elemento que entra na lista, entra no final e todo o elemento que sai da lista, sai do final dela. ltimo a entrar, primeiro a sair lti t i i i LIFO (Last In, First Out) push/pop (empilha/desempilha)
264
265
267
rvores Bi i Binrias
Rapidez na pesquisa, incluso e excluso ( d ordenadas) l (qdo d d )
info
info
270
info
0 0 0
rvores - conceitos it
Raiz Ns N terminal Sub-rvore Altura
271
Transversalizao T li
d b a c e f g
Unies de Tipos
273
Objetivo Obj ti
Todas variveis que nos vimos at agora possuam um i tipo. nico ti As vezes interessante atribuir vrios tipos a uma varivel (uma mesma zona memria). Isto pode ser feito atravs do mecanismo de unies de tipos usando a palavra chave union. Portanto, uma varivel teria, a um dado instante, um nico tipo, porm pode mudar.
274
Declarao D l
Exemplo:
/* declarao de um tipo que una os inteiros e os reais */
typedef union { int i; float f; } nmero;
*/
Observao Ob
A declarao parecida s estruturas, mas nas unies somente um campo atribudo i t t ib d um valor. O problema que nos no podemos saber a um dado instante do programa qual o tipo do programa, atual valor da varivel. Por isso que na prtica a unio associada a um indicador de tipo (o tipo atual) e os dois so combinados em uma estrutura: bi d t t
276
}
277
Arquivos i
280
Streams St
Stream de texto
Sequncia de caracteres
Stream binria
Sequncia de bytes com uma correspondncia de 1 para 1 com aqueles encontrados no dispositivo externo
281
#include <stdio.h>
283
Ponteiro de arquivo
Ponteiro para informaes que definem vrias coisas sobre o arquivo:
Abrindo um arquivo
FILE *fopen(nomearq, modo); fopen devolve um ponteiro de arquivo (em caso de erro o ponteiro retornado nulo)
285
Abrindo um arquivo
r w a rb wb ab
286
Abrindo um arquivo
file *fp; if ((fp=fopen(test,w))==null) { printf(no pode ser aberto); exit(1); }
287
Fechando um arquivo
Funo fclose() Exite uma quantidade mxima de arquivos que podem ser abertos FOPEN_MAX (exemplo: 20)
288
Lendo / Escrevendo
void carrega_arquivo(char s[10000], char nome arquivo[1000]) { nome_arquivo[1000]) FILE *fp; int i=0; if ((fp = fopen(nome_arquivo,"r"))==NULL) { printf("erro\n"); exit(1); } for (i 0 i 9999 && s[i]!=EOF;i++) f (i=0; i<9999 [i]! EOF i ) s[i] = getc(fp); fclose(fp); }
289