Você está na página 1de 44

Linguagem C

1 - Introduo

Histria:
criada por Dennis Ritchie em 1972 na Bell Laboratories
1 utilizao importante reescrita do Unix (que era escrito em Assembly)
dcada de 80, vrias verses do compilador C oferecidas por vrias empresas
1983 ANSI C (American National Standard Institute) C padro com pouca
diferena do C original (define tambm bibliotecas)

Vantagens:
eficincia (na gerao de cdigo)
muito conhecida e usada
pode ser utilizada para desenvolver leque amplo de programas desde Sistemas
Operacionais, editores at aplicaes de usurio
pode ser usada em varias plataformas embora tenha sido originalmente desenvolvida
para Unix
linguagem enxuta, fcil de usar

2- Exemplos de Programas Simples em C

Um programa em C consiste de funes e variveis:

1. Funo
Contm comandos que especificam operaes a serem realizadas.
Todo programa em C tem pelo menos uma funo chamada main que obrigatria.
A execuo do programa inicia pelo primeiro comando da funo main.

2. Variveis
Local na memria onde um valor pode ser armazenado e recuperado posteriormente.

2.1 Programa que escreve bom dia

/* piogiana que escieve lon dia na leIa */

#incIude <sldio.h> /* paia conpiIadoi incIuii infoinao solie lilIioleca padio de enliada e
sada */

nain ( ) /* decIaia funo piincipaI */

|
piinlf(lon dia\n),


Esse programa escreve bom dia na tela do computador.

Os textos entre /* e */ so comentrios para usurios e ignorados pelo compilador.

A chamada da funo piinlf da biblioteca stdio.h escreve uma seqncia de caracteres entre
aspas na sada padro (tela). \n representa o carter para mudana de linha.

Os comandos da funo nain so especificados entre chaves {}.

2.2 Programa que realiza uma operao aritmtica e escreve resultado na tela

Um valor obtido aps uma operao aritmtica pode ser armazenado em uma varivel.
Variveis devem ser declaradas antes de ser usadas. Por ex.:

inl l,

Essa declarao aparece geralmente no incio da funo e indica que uma localizao de
memria chamada b pode armazenar um valor inteiro. A varivel declarada tem um nome
(b) e um tipo (inl).

Para armazenar um valor na varivel, o comando de atribuio utilizado:

l = 5, /* ainazena vaIoi 5 na vaiiveI l */

Para mostrar o valor da varivel na tela, a funo piinlf da biblioteca stdio.h utilizada:

piinlf(d, l),

O formato %d indica que o valor a ser exibido um inteiro decimal.

Exemplo de programa que utiliza variveis:

#incIude <sldio.h>
nain ()
|
inl a,l,c, /* decIaia 3 vaiiveis inleiias */
a = 5, /* aliilui vaIoi 5 paia a vaiiveI a */
l = 7,
c = a + l, /* aliilui vaIoi da expiesso 12 paia a vaiiveI c */
piinlf(d + d = d\n a,l,c),


2.3 Programa que obtm um valor de entrada do teclado

Para obter um valor da entrada padro (teclado) e armazenar em um varivel, a funo scanf
da biblioteca stdio.h utilizada:

scanf(d, &a),

Com esse comando o programa l um valor digitado pelo usurio no teclado e armazena na
varivel a. So especificados o formato do valor (inteiro decimal) e o endereo da varivel
(indicado pelo smbolo &).

Exemplo de programa com entrada pelo teclado:

#incIude <sldio.h>
nain ()
|
inl a,l,c,

piinlf(enlie con o vaIoi:),
scanf(d,&a), /* Ieiluia do piineiio vaIoi inleiio en a */
piinlf(enlie con oulio vaIoi:),
scanf(d,&l), /* Ieiluia do segundo vaIoi inleiio en l */
c = a + l,
piinlf(d + d = d\n, a,l,c),

3- Comando de Atribuio

3.1 Variveis e tipos

Nomes de variveis:
primeiro carter deve ser letra ou sublinhado _
os 32 primeiros caracteres so significativos
letras maisculas so diferentes de letras minsculas
tradicionalmente usa-se minsculo para variveis e maisculas para constantes
no podem ser usadas palavras reservadas como if, else, int, float, etc
nomes devem ser escolhidos conforme o objetivo da varivel

Tipos de variveis: uma varivel est sempre associada a um tipo que determina os valores
que podem ser armazenados na varivel e as operaes que podem ser executadas sobre ela.

Tipos inteiros (tamanho dependente da mquina)
char 1 byte no intervalo [0,128)
signed char 1 byte no intervalo (-128,128)
unsigned char 1 byte no intervalo (0,256)
short 2 bytes no intervalo (-2
-15
, 2
15
)
unsigned short 2 bytes no intervalo[0, 2
16
)
int 2 ou 4 bytes no intervalo (2
-15
, 2
15
) ou (2
-31
, 2
31
) respectivamente
unsigned int 2 ou 4 bytes no intervalo [0, 2
16
) ou [0, 2
32
) respectivamente
long 4 bytes no intervalo (2
-31
, 2
31
)
unsigned long - 4 bytes no intervalo [0, 2
32
)

Tipos flutuantes
float pelo menos 6 dgitos de preciso decimal 4 bytes
double pelo menos 10 dgitos decimais de preciso 8 bytes
long double pelo menos 10 dgitos decimais preciso 12 bytes

Para saber o nmero de bytes ocupados por um varivel, pode-se chamar a funo
sizeof.

nain()
|
unsigned chai c,
piinlf(d, sizeof(c)),


Para saber o valor mximo e mnimo de um certo tipo, pode-se utilizar as constantes
definidas nas bibliotecas limits.h para inteiros (INT_MAX, INT_MIN, LONG_MAX,
LONG_MIN, etc) e float.h para ponto flutuante.

Exemplos de declaraes:

inl i,
inl j= O,
fIoal pi = 3.14,
fIoal eps = 1.O e-5,
inl k=1, n=2,

3.2 Expresses e comandos de atribuio aritmticos

Operadores aritmticos:
+
-
*
/ diviso inteira caso ambos operandos sejam inteiros e real caso contrrio
% mdulo (resto de diviso inteira)

Operadores para incremento e decremento:
++x incrementa x antes de utilizar seu valor
x++ incrementa x depois de utiliz-lo
--x
x--

Precedncia de operadores:
++ -- (mais alta prioridade)
/ % *
+ -

Comando de atribuio:

i = i + 2,

O comando de atribuio calcula a expresso direita do operador = e atribui varivel i
esquerda. Esse comando pode ser escrito tambm como:

i += 2,

Essa notao pode ser utilizada tambm com os outros operadores (-, *, /, %).

Exemplo de comandos de atribuio:

i =2O,
x*= y+1, // equivaIe a x=x*(y+1)

4. Funes Bsicas de Entrada e Sada

4.1 Comando de sada

piinlf escreve no dispositivo padro (tela)

Sintaxe:

piinlf(expiesso de conlioIe, aigunenlos),

A expresso de controle pode conter caracteres que sero exibidos na tela e/ou cdigos de
formatao para os argumentos. Os argumentos so separados por vrgula.

Exemplo de alguns caracteres especiais (so precedidos por \) que podem ser includos na
expresso de controle:
\n nova linha
\t tab
\b retrocesso
\ aspas
\\ barra

Exemplo de formatos que podem ser includos na expresso de controle:
%c para carter
%d para inteiros em decimal
%6d para inteiro decimal com pelo menos 6 caracteres
%f para ponto flutuante
%6f para ponto flutuante com pelo menos 6 caracteres
%.2f com 2 caracteres depois do ponto decimal
%6.2f com 6 caracteres no total e 2 aps o ponto
%o octal
%x hexa
%s cadeia
%u decimal sem sinal

4.2 Comando de entrada

l dados da entrada padro (teclado)

Sintaxe:

scanf(expiesso de conlioIe, aigunenlos),

A expresso de controle especifica o formato dos argumentos. Os argumentos so
separados por vrgula e precedidos pelo operador & (para endereo).

4.3 Exerccios

Escreva programas para:

1. calcular o quadrado de um nmero lido.
2. transformar uma temperatura em F (dado de entrada) para C.
3. calcular a rea de um retngulo sendo que os lados so lidos do teclado.
4. calcular a rea de um crculo aps leitura do seu raio.
5. calcular a mdia de um aluno dadas as notas de 2 provas.
6. calcular o salrio de um empregado dados horas trabalhadas e salrio-hora.
7. transformar polegadas em centmetros.
5 Comandos Condicionais

5.1 Expresses condicionais

Uma expresso condicional considerada falsa se seu valor for zero e verdadeira se
diferente de zero.

Operadores relacionais:
>
>=
<
<=
= = testa igualdade
!= testa desigualdade

Operadores lgicos:
&& (and)
|| (or)
! (not)

Precedncia de operadores:
( ) mais alta prioridade
!, ++, --, + (unrio), (unrio), &, sizeof
*, /, %
+, - (binrio)
<, <=, >, >=
= =, !=
&&
||
=, +=, -=, *=, /=, %= menor prioridade

5.2 Comando if

Sintaxe:

if (expiesso condicionaI)
conando1,
eIse
conando2,

Se a expresso for verdadeira (qualquer valor 0) conando1 executado. Se falsa (= 0)
conando2 executado.

A parte iniciada por eIse opcional.

conando1 ou conando2 podem ser comandos simples ou blocos de comandos entre chaves{
}.

Exemplos de comandos if:

if (x 2)
piinlf(inpai \n),
eIse
piinlf(pai \n),

if (nola > =O && nola <= 1O )
piinlf(vIida \n),
eIse
piinlf(invIida \n),


5.3 Operador ternrio

Sintaxe:

Condio ` exp1 : exp2

uma forma compacta de eIse.

Exemplo:

naioi = (a > l) ` a: l,

Equivale ao comando if abaixo:

if (a > l)
naioi = a,
eIse
naioi = l,

5.4 Comando switch

5.5 Exerccios

Escreva programas para:

1. dados dois nmeros inteiros a e b, verificar se a divisor de b.
2. calcular salrio de um empregado dados horas trabalhadas e salrio-hora. Para salrios
maiores que R$1000,00 existe um desconto de 8%.
3. calcular a mdia de um aluno de mc102 que realiza duas provas com mesmo peso e um
exame caso a mdia das provas seja menor que 5.
4. calcular as razes de uma equao do segundo grau, dados a, b e c.
5. verificar se os valores a, b e c lidos podem ser lados de um tringulo e qual tringulo
(eqiltero, issceles, escaleno).
6. verificar se os valores a, b e c lidos formam um tringulo retngulo.

OBS: voc vai precisar de funes da biblioteca de matemtica math.h que contm
pow(x,y), cos(x), sin(x), tan(x), exp(x), log(x), sqrt(x), fabs(x), entre outras.

6 Comandos de Repetio

6.1 Comando for

Sintaxe:

foi (exp1, exp2, exp3) conando,

exp1 um comando de atribuio para inicializar varivel de controle do lao
exp2 uma expresso condicional que testa a varivel de controle para determinar quando
o lao terminar e o controle passe para o comando seguinte ao foi
exp3 define a alterao na varivel de controle para cada iterao

conando pode ser vazio, simples ou um bloco de comandos.

Exemplo:

foi (i = 1, i < 1O, i++) /* inpiine 1,2,...,9 */
piinlf(d \n, i),

foi (,,,)
piinlf(infinilo\n),

Exerccios:

1. Ler 20 nmeros e escrever os nmeros pares somente.
2. Ler um inteiro n e escrever o quadrado e o cubo para inteiros de 2 a n.
3. Ler n nmeros inteiros e escrever quantos so pares e quantos so mpares.
4. Ler n nmeros e escrever sua somatria.
5. Encontrar a mdia da classe com n alunos.
6. Ler n nmeros e encontrar o maior deles.
7. Para os nmeros inteiros de 1000 a 9999, imprimir os que tem a caracterstica:
30 + 25 = 55
55 = 3025
8. Escrever as potncias de 2 de 0 a n (n lido).
9. Calcular o fatorial de um nmero inteiro lido.
10. Dados x e n, ambos inteiros, calcular x
n
usando multiplicaes.
11. Imprimir os n primeiros termos da seqncia de Fibonacci (1, 1, 2, 3, 5, 8, 13, 21 ...).
12. Calcular m, m 1 como soma dos m mpares consecutivos comeando pelo mpar
m(m 1) + 1. Por exemplo:
m = 5
m(m-1) + 1 = 21
m = 21 + 23 + 25 + 27 + 29 = 125
13. Somar todos os divisores de um nmero inteiro lido.
14. Verificar se um nmero lido primo.


O comando foi pode ser usado dentro de outro comando foi. Por exemplo:

foi (Iinha = 1, Iinha <= 3, Iinha++)
|
foi(coIuna = 1, coIuna < 5, coIuna++)
piinlf(3d 3d, Iinha, coIuna),
piinlf(\n),


Esse trecho de programa escreve na tela:

1 1 1 2 1 3 1 4
2 1 2 2 2 3 2 4
3 1 3 2 3 3 3 4

Exerccios com for encadeado:

1. Ler n e escrever n linhas como o desenho abaixo (para n=3)
*
* *
* * *
2. Ler n e escrever n linhas como o desenho abaixo (para n=3).
* * *
* *
*
3. Ler n e escrever n linhas como o desenho abaixo (para n=3).
* * *
* *
*
4. Ler n e imprimir n linhas como as linhas abaixo (para n=3).
1
2 2
3 3 3
5. Ler n e escrever n linhas como as linhas abaixo (para n=3).
1
2 1
3 2 1
4 3 2 1
6. Ler n e escrever n linhas como as linhas abaixo (para n=3).
1
2 3
4 5 6
7 8 9 10
7. Ler n e escrever as tabuadas de 2 a n.
8. Verificar quais os primos de 2 a n.


6.2 Comando while

Sintaxe:

vhiIe (condio) conando1,

A expresso condicional entre parnteses avaliada e, se verdadeira, o comando conando1
executado. Esse comando pode ser executado de 0 a n vezes.

conando1 pode ser vazio, simples ou bloco.

O comando vhiIe pode ser equivalente a um comando foi. Por exemplo:

foi (exp1, exp2, exp3) conando,

equivale a

exp1,
vhiIe (exp2)|
conando,
exp3,


Exemplo:

/* sonaliia de 1O nneios Iidos */
sona = O,
foi (i=1, i<=1O, i++)
|
scanf(d,&n),
sona += n,


equivale ao cdigo abaixo:

/* sonaliia de 1O nneios Iidos */
sona = O,
i = 1,
vhiIe (i <= 1O)
|
scanf(d,&n),
sona += n,
i++,


Exerccios:

1. Ler nmeros inteiros at encontrar zero e calcular sua somatria.
2. Contar nmero de dgitos de um nmero inteiro lido.
3. Verifique se um nmero inteiro n um quadrado perfeito. Um nmero n quadrado
perfeito se a soma dos m mpares consecutivos (1 + 3 + 5 +...) igual a n. Nesse caso, o
nmero m de termos mpares somados ser a raiz quadrada de n. Por exemplo:
16 = 1 + 3 + 5 + 7
16 = 4
4. Imprimir os termos da seqncia de Fibonacci at encontrar o primeiro termo maior que
um limite lido.

6.3 Comando do while

Sintaxe:

do
|
conando,

vhiIe (condio),

O comando entre chaves executado enquanto a condio for verdadeira. Se a condio for
falsa, o controle passa para o comando seguinte ao do - vhiIe. O comando entre chaves
executado pelo menos uma vez.

Exemplo:

/* sonaliia de 1O nneios Iidos */
sona = O,
foi (i = 1, i <= 1O, i++)
|
scanf(d,&n),
sona += n,


equivale a

/* sonaliia de 1O nneios Iidos */
sona = O,
i = 1,
do
|
scanf(d,&n),
sona += n,
i++,
vhiIe (i <= 1O),

Exerccios:

1. Calcular o mximo divisor comum de dois inteiros x, y lidos pelo mtodo de
Euclides.

2. Faa um programa que l as coordenadas x, y dos vrtices de um polgono e que
calcule seu permetro. Os vrtices devem ser lidos at que o ltimo vrtice seja igual ao
primeiro. A distncia entre 2 pontos calculada como:
d = (x
1
x
2
) + (y
1
y
2
)

6.4 Comandos break e continue

O comando lieak utilizado para forar a sada de um lao.

Exemplo:

/* sai do lao se nmero lido for negativo */
soma = 0;
for (i = 0; i < n; i++)
{
scanf(%d,&x);
if(x < 0)
break;
soma += x;
}

O comando continue ignora os comandos seguintes dentro do lao e passa para a prxima
iterao do lao.

Exemplo:

/* se nneio Iido foi negalivo no incIui na sonaliia e I pixino nneio */
sona = O,
foi (i = O, i < n, i++) |
scanf(d,&x),
if (x < O)
conlinue,
sona += x,

7 Funes

Uma funo uma seqncia de passos que recebe um nome e pode ser invocada uma ou
mais vezes durante a execuo do programa.

7.1 Motivao

Funes so utilizadas para:

estruturao dos programas: permite melhor estruturao facilitando a compreenso do
programa.
reutilizao de cdigo: uma funo escrita para realizar uma determinada tarefa. Por
exemplo, calcular o fatorial de um nmero. O cdigo para o clculo do fatorial aparece
uma nica vez no programa mas a funo pode ser invocada diversas vezes de pontos
diferentes do programa.

7.2 Tipos de funes

Em C, existem as funes pr-definidas cujo cdigo foi escrito previamente e est
disponvel em uma biblioteca. Por exemplo, a funo sqil calcula a raiz quadrada de um
nmero passado como parmetro. Essa funo est disponvel na biblioteca math.h e pode
ser invocada dentro de uma expresso. Exemplo de invocao:

iaiz = (-l + sqil(deIla))/(2*a),

Alm das funes pr-definidas, existem as funes definidas pelo programador. Para esse
tipo de funo, o programador deve especificar um nome, parmetros, tipo e cdigo.

Exemplo de definio de funo:

/* define una funo do lipo inleiia, none naioi e dois painelios inleiios
essa funo ieloina o naioi de dois nneios inleiios
*/
inl naioi (inl x, inl y)
|
if (x > y)
ieluin(x),
eIse
ieluin(y),


Obs.: funo que no retorna nenhum valor deve ser declarada como void.

Exemplo de invocao de funo:

/* piogiana que caIcuIa o naioi de lis nneios */
nain ()
|
inl x, y, z, n,
scanf( d d d, &x, &y, &z),
n = naioi (x, y), // piineiia invocao
n = naioi (n,z), // segunda invocao



Uma chamada para a funo provoca um desvio para o corpo da funo, os
parmetros formais (x e y) so substitudos pelos reais (x e y) na primeira invocao e por
(n e z) na segunda invocao. Aps a execuo da funo, o controle volta para o ponto da
chamada.

7.3 Exerccios

Escreva funes para:

1. determinar se um nmero passado como parmetro primo. A funo deve retornar
1 se for primo e 0 caso contrrio. Usando essa funo, escreva programa que imprime
todos os nmeros primos de 2 a n (n lido).
2. calcular o fatorial de um nmero passado como parmetro.
3. calcular x
n
atravs de multiplicaes. Tanto x (float) como n (int) so parmetros da
funo.
4. calcular a distncia entre dois pontos (x
1
, y
1
) e (x
2
, y
2
) passados como parmetros.
5. calcular o binmio de Newton para n e r passados como parmetros:
C(n, r) = n! / ((n r)! * r!)
utilizando a funo fatorial.
6. calcular a integral de uma funo como somatria das reas de n retngulos.
Os parmetros para a funo so o limite inferior do intervalo a, limite superior do intervalo
b e o nmero de retngulos n no intervalo. Considere a funo
f(x) = (1 x)
7. calcular o MMC entre dois nmeros:
MMC = (n
1
* n
2
) / MDC
utilizando a funo MDC que retorna o MDC entre n
1
e n
2.


7.4 Passagem de parmetros

Existem dois tipos de passagem de parmetro:
passagem por valor: na invocao da funo, a expresso avaliada e copiada em rea
local da funo. Nesse caso, no possvel alterar os parmetros reais. Esse tipo de
passagem de parmetro utilizado quando se quer transmitir dados de quem invoca
para a funo invocada.
passagem por referncia: na invocao da funo, especificado o endereo de uma
varivel. Dessa forma possvel alterar os parmetros reais. Esse tipo de passagem de
parmetro utilizado quando se quer transmitir dados da funo para quem invocou.

Exemplo:

// essa funo len dois painelios passados poi vaIoi
void f1(inl x, inl y)
|
x = O, y = O,
piinlf (en f1: x = d y = d \n, x, y),


// essa funo len dois painelios passados poi iefeincia
void f2(inl *px, inl *py)
|
*px = O, *py = O,
piinlf(en f2: *px = d *py = d \n, *px, *py),


nain ()
|
inl x = 1,
inl y = 3,
piinlf(anles de chanai f1: x = d y = d \n, x, y),
f1(x, y),
piinlf(depois de chanai f1: x = d y = d \n, x, y),
f2(x, y),
piinlf(depois de chanai f2: x = d y = d \n, x, y),


O resultado impresso na tela ser:

antes de chamar f1: x = 1 y = 3
em f1: x = 0 y = 0
depois de chamar f1: x = 1 y = 3
em f2: x = 0 y = 0
depois de chamar f2: x = 0 y = 0

7.5 Passando funes como argumento

nain()
|
inl i, j,
inl piocessa(inl (*) (inl, inl)),
inl func1(inl, inl),
inl func2(inl, inl),


i = piocessa(func1),
j = piocessa(func2),


inl piocessa (inl *pf()),
|
inl a, l, c,
c = (*pf) (a, l),
ieluin (c),


inl func1(inl a, inl l)
|
ieluin ( ),


inl func2(inl x, inl y)
|
ieluin ( ),


8- Vetores e Matrizes

8.1 Vetores

Uma varivel do tipo vetor pode armarzenar uma coleo de valores todos do mesmo tipo.
Por exemplo, uma coleo de notas dos alunos de uma classe, uma coleo de telefones de
uma agenda ou uma coleo de filmes de uma vdeo-locadora.

Os elementos da coleo so armazenados em posies contguas de memria. Cada
elemento da coleo identificado por um seletor (ou ndice) que indica a posio do
elemento na coleo.

Declarao:

tipo identificador[tamanho];

Exemplo de declarao:

inl a|1Oj, // aIoca espao paia una coIeo de 1O inleiios
// iefeienciados cono a|Oj, a|1j, ... , a|9j

Exemplo de um programa:

/* piogiana que caIcuIa a nedia das nolas de una cIasse de n aIunos
e quanlos aIunos liveian nolas naioies que a nedia
*/

nain()
|
inl i,n,naioi,
fIoal nedia,nolas|1OOj,

piinlf(enlie con nuneio de aIunos da cIasse:),
scanf(d,&n),
nedia=O,

// Ieiluia das nolas dos aIunos
foi (i=O,i<n,i++) |
piinlf(enlie con a nola de un aIuno:),
scanf(f,&nolas|ij),
nedia+=nolas|ij,

// cIcuIo da nedia
nedia/=n,

// cIcuIo do nneio de aIunos con nola naioi que a nedia
naioi=O,
foi(i=O,i<n:i++)
if (nolas|ij>nedia) naioi++,
piinlf(nedia=1O.2f\nnaioies que nedia=d\n,nedia,naioi),


Exemplo de uma funo:

// funo que ieloina a sonaliia dos eIenenlos de un veloi de n eIenenlos
inl sonaloiia(inl v| j, inl n)
|
inl i, sona=O,

foi (i=O,i<n:i++)
sona+=v|ij,
ieluin sona,


Inicializao de um vetor

Pode ser feita na declarao do vetor. Exemplo:

inl dia| j = | 31, 28, 21, 3O , // decIaia un veloi con 4 inleiios
// paia dia|Oj e aliiludo o vaIoi 31
// paia dia|1j e aliiludo o vaIoi 28


Exerccios

Escreva trechos de programa para:

1. Contar quantos elementos de um vetor com n elementos so pares.
2. Somar os n elementos de um vetor.
3. Calcular o maior elemento de um vetor e sua posio.

Escreva funes para:

1. Inverter os elementos de um vetor.
2. Buscar um elemento em um vetor no ordenado.
3. Buscar um elemento em um vetor ordenado.
4. Dados dois vetores A e B de n e m elementos, construir um terceiro vetor com
interseco dos vetores A e B.
5. Dados dois vetores A e B de n e m elementos, construir um terceiro vetor com unio de
A e B.
6. Inserir um elemento em um vetor ordenado. Aps insero, o vetor deve continuar
ordenado.
7. Dados dois vetores de n elementos, verificar se so ortogonais.
8. Dados um polinmio de ordem n cujos coeficientes esto armazenados em um vetor,
verificar se um determinado valor x passado como parmetro uma raiz desse polinmio.

8.2 Matrizes

Uma varivel do tipo matriz tem dois seletores: um para linha e outro para coluna.

Declarao:

tipo identificador[tamanho1][tamanho2];

Exemplo de declarao:

fIoal nolas|4Oj|15j, // ainazena as 15 nolas de Ial de una cIasse con 4O aIunos

Exemplo de uma funo utilizando matriz:

// funo que caIcuIa a sona de duas naliizes de n Iinhas e n coIunas

void sona(inl A| j|1Oj, inl | j|1Oj, inl C| j|1Oj, in n, inl n)
|
inl i,j,

foi (i=O,i<n:i++)
foi (j=O,j<n,j++)
C|ij|jj = A|ij|jj + |ij|jj,


Exerccios

Escreva funes para:

1.Verificar se duas matrizes A
nxm
e B
nxm
so iguais.
2. Determinar a soma dos elementos da diagonal principal de uma matriz A.
3. Determinar o maior elemento de uma matriz A
nxm
e sua posio (linha e coluna).
4. Determinar a transposta de A
nxn
.
5. Determinar se A
nxn
uma matriz probabilidade. Uma matriz probabilidade obedece as
seguintes condies:
a. Todos os elementos so maiores ou iguais a zero.
b. A soma de cada linha 1.
c. A soma de cada coluna 1.
6. Calcular a multiplicao de A
nxm
por B
mxp
. A matriz resultante ser C
nxp
onde

m
C
ij
= A
ik
B
kj


k=1
7. Calcular o tringulo de Pascal para um dado n e armazenar em uma matriz. Uma linha i
calculada como:
P
i1
= 1
P
ii
= 1
P
ij
= P
i-1j
+ P
i-1j-1

9 Apontadores

Apontadores podem ser usados para:
criar estruturas de dados dinmicas
passar parmetro para funes (por referncia)
acessar informao em vetores

Declarao:

tipo *nome;

varivel que contm o endereo de outra varivel.

Exemplo:

inl x, inl y, *px, // x e y - vaiiveis inleiias, px e aponladoi paia inleiio

x = 3,
px = &x, // vaiiveI px conlen endeieo de x (aponla paia x)
y = *px, // equivaIe a y = x,
*px = O, // aliilui O a vaiiveI x

Exerccio 1 - Qual valor impresso?

nain ( )
|
inl x,y,*px,
x = 3,
px = &x,
y = *px + 5,
piinlf(y = d \n, y),


Exerccio 2 - Qual valor impresso?

nain ( )
|
inl x = 3, *px,
px = &x,
piinlf(d, d \n, *px, x),
*px = O,
piinlf( d, d \n, *px, x),


Exerccio 3 - Qual valor impresso?

nain ( )
|
inl x, *px, *py,
x = 9,
px = &x,
py = &x,
piinlf ( d, d, d \n, x, *px, *py),



9.1 Expresses com apontadores

operaes aritmticas (* tem maior prioridade que operaes aritmticas)

inl x, z, *px,

x = 2,
px = &x,
z = *px + 1, /* z iecele 2 + 1 */

atribuies

inl *px, *py, y,

py = &y,
px = py,

comparaes

com operadores = =, !=, >, <

incremento, decremento dos endereos

inl x, *px,

px = &x,
(*px)++, // equivaIe a x++

9.2 Apontadores e Vetores

Declara vetor com 5 inteiros armazenados de forma contgua na memria:

inl a|5j,

Declara um apontador para inteiro:

inl *pa,

Apontador pa recebe endereo do primeiro elemento do vetor a:

pa = &a|Oj,

O comando abaixo tambm atribui o endereo do primeiro elemento do vetor a para pa:

pa = a,
O comando abaixo atribui a[0] para varivel inteira x:

inl x = *pa, /* equivaIe a x = a|Oj */

pa




pa a[0]

pa + 1 a[1]

pa + 2 a[2]

pa + 3 a[3]

pa + 4 a[4]



So equivalentes:

a[i] e *(a + i)
&a[i] e a + i
pa[i] e *(pa + i)

Exemplo:

// Copia eIenenlos do veloi a en veloi l

nain ( )
|
inl a|1Oj, l|1Oj,
inl *p, *q,

p = a, q = l,
foi (i = O, i < 1O, i++)
|
*q = *p,
q++,
p++,



10 Alocao Dinmica

Funes em <stdlib.h>:

void *malloc(n)
retorna ponteiro para um bloco de memria de n bytes no inicializado. Retorna
NULL se no houver espao suficiente.

void free(void *p)
desaloca espao apontado por p. p deve ser ponteiro para bloco previamente alocado
por malloc.

Exemplo 1:

// aIoca espao paia 4O inleiios, iniciaIiza inleiios con vaIoies O a 39.

nain ( )
|
inl *p, l,
p = (inl *) naIIoc (4O * sizeof (inl)),
if(!p)
piinlf(neniia insuficienle \n),
eIse
|
foi (l = O, l < 4O, l++)
*(p + l) = l,
foi (l = O, l < 4O, l++)
piinlf(d , *(p + l)),
fiee(p)



Exemplo 2:

// acha o naioi de n nneios

nain ( )
|
inl i, n,
fIoal nax, *p,
piinlf(quanlidade de nneios: ),
scanf(d, &n),
p = (fIoal *) naIIoc (n * sizeof(fIoal)),
if (!p)
|
piinlf(sen neniia ),
exil(1),

piinlf(digile nneios: ),
foi(i = O, i < n, i++)
scanf(f, (p + i)),
nax = *p,
foi (i = 1, i < n, i++)
if(*(p+i) > nax)
nax = *(p + 1),
piinlf( nain = f \n , nax),
fiee (p),


Exemplo 3:

// sona de 2 naliizes n x n

incIude <sldIil.h>

void sona( inl *a, inl *l, inl *c, inl n, inl n)
|
inl i,

foi (i=O, i<n*n,i++)
*c++ = *a++ + *l++,


void inpiine(inl *a, inl n, inl n)
|
inl i,j,

foi (i=O,i<n,i++) |
foi (j=O,j<n,j++)
piinlf(d,*(a+i*n+j)),
piinlf(\n),



nain( )
|
inl *a, *l, *c, i, j, n, n,
scanf(d, d, &n, &n),
a = (inl *) naIIoc (n*n*sizeof(inl)),
l = (inl *) naIIoc (n*n*sizeof(inl)),
c = (inl *) naIIoc (n*n*sizeof(inl)),

foi (i = O, i < n, i++)
foi (j = O, j < n, j++)
|
scanf((a + i * n + j))
scanf((l + i * n + j))

sona(a, l, c, n, n),
inpiine(c, n, n),


11 Tipo char e Cadeias

11.1 Tipo char

Varivel que pode guardar um carter ASCII (uma letra, um dgito, sinais de pontuao,
caracteres de controle).

Declarao
char c;

Atribuio
c = a;

Funes de Entrada/Sada em <stdio.h>

getchar() para leitura de um carter do teclado
putchar(c) para mostrar um carter na tela

Funes para manipular caracteres em <ctype.h>

isalpha(c)
isdigit(c)
isspace(c)
toupper(c)
tolower(c)

Exemplo

// I un cailei e veiifica se e vogaI

nain()
|
chai c,
c = gelchai(),
c = louppei(c ),
if (c==A || c==L || c==I || c==O || c==U) piinlf(vogaI\n),



11.2 Cadeias

Guardam uma coleo de caracteres contiguos na memria. O ltimo carter da cadeia
\0 para indicar o fim da cadeia.

Para armazenar essa coleo pode ser usada uma varivel esttica:
char cadeia[30];

Ou ainda um apontador para uma varivel dinmica:
char *pcadeia;
pcadeia = (char ) malloc (30*sizeof(char));


Constantes cadeia so listas de caracteres entre aspas. \0 colocado pelo compilador.
Essas constantes so armazenadas em uma tabela pelo compilador e o apontador contm
endereo para essa tabela.

Exemplo:

char *s;
s = hello; // s aponta para endereo de hello na tabela criada pelo compilador


char s[100];
s = hello; // erro de compilao

Exemplo de inicializao

Aloca 100 bytes contguos na memria e inicializa com cadeia hello. Tambm coloca \0
na sexta posio.

char s[100] = hello;

Aloca 6 bytes contguos na memria e inicializa com cadeia hello.

char s[] = hello;


Funes para Entrada/Sada de cadeias em <stdio.h>

1 - gets(cadeia)

Leitura do dispositivo padro dos caracteres at encontrar enter. Substitui enter por \0.

Exemplo:

nain( )
|
chai sli|8Oj,
gels(sli),
piinlf(s, sli),


2 puts(cadeia)

Escreve cadeia na sada padro.

Exemplo:

puls(nensagen),

Funes para manipular cadeias em <string.h>

1 strcpy(destino, origem)
Copia origem em destino, coloca \0 em destino, retorna destino.

Exemplo:

nain( )
|
chai sli|8Oj,
slicpy(sli, oIa),
puls (sli), // escieve oIa na leIa


2 strcat(cadeia1, cadeia2)
Concatena cadeia1 e cadeia2 em cadeia1.
No verifica tamanho.

Exemplo:

nain()
|
chai cadeia|3Oj,
slicpy(cadeia, Ana),
slical(cadeia1, Maiia),
puls(cadeia), // escieva AnaMaiia na leIa


3 strcmp(cadeia1, cadeia2)
devolve 0 se iguais
< 0 se cadeia1<cadeia2
> 0 se cadeia1>cadeia2

4 strlen(cadeia)
retorna tamanho de cadeia (sem contar \0)

5 strchr(cadeia,c)
retorna apontador para primeira ocorrncia do carter c em cadeia ou NULL se no existir.

6 strpbrk(cadeia,ct)
retorna apontador para primeira ocorrncia de qualquer caracter em ct ou nulo se no
existir.

12 Tipo Struct

uma coleo de uma ou mais variveis possivelmente de tipos diferentes agrupadas sob
um nico nome. Agrupa variveis relacionadas a uma entidade como, por exemplo,
empregado, aluno.

Declarao

siruci onio{
ini ;
ini y;

siruci onio i;

ou

sliucl ponlo|
inl x,
inl y,

sliucl ponlo pl = |2O,1O, //iniciaIiza vaiiveis da esliuluia

ou

sliucl ponlo|
inl x,
inl y,
pl,

ou

lypedef sliucl
|
inl x,
inl y,
lponlo,
ponlo pl,

Operador .

Usado para referenciar campos de uma estrutura. Exemplo:
pt.x
pt.y


Estruturas e funes

sliucl ponlo|
inl x,
inl y,


sliucl ponlo nakepoinl (inl x, inl y) /* ieloina vaIoi lipo esliuluia */
|
sliucl ponlo lenp,
lenp.x = x,
lenp.y = y,
ieluin(lenp),


sliucl ponlo addpoinl (sliucl ponlo p1, sliucl ponlo p2)
|
p1.x += p2.x,
p1.y += p2.y,
ieluin (p1), /* ieloina sona de 2 ponlos */


Uma estrutura pode ser definida dinamicamente. Exemplo:

sliucl ponlo *pp,
pp = (sliucl ponlo *) naIIoc(sizeof(sliucl ponlo),

Para referenciar campos atravs de apontadores pode-se usar:

(*pp).x = O,
ou

pp->y = 0;


Uma estrutura muito grande deve ser passada para uma funo por referncia. Exemplo:

void nakepoinl (ponlo *pl)
|
pl->x = O,
pl->y = O


Vetores de estruturas

Exemplo de declarao:

sliucl fiIne|
chai liluIo|3Oj, diieloi|3Oj,
inl ano,
vfiIne|1OOj,

Trecho de programa que l a coleo de filmes e dados relacionados:

foi (i=O,i<1OO,i++) |
piinlf(enlie con liluIo:), gels(vfiIne|ij.liluIo),
piinlf(enlie con diieloi:), gels(vfiIne|ij.diieloi),
piinlf(enlie con ano:), scanf(d, &vfiIne|ij.ano),

13 - Recurso

Um programa recursivo quando invoca a si mesmo. A recurso apropriada
principalmente quando o problema a resolver ou a estrutura de dados a ser processada so
definidos recursivamente.

Um programa recursivo P consiste de um teste de uma condio que, se verdadeira, o
problema pode ser resolvido sem outras chamadas recursivas. Se a condio for falsa
existe um bloco de comandos que incluem uma ou mais chamadas recursivas.

Exemplo de problema recursivo:

Fatorial definido como:
a) 0! = 1
b) n! = n (n-1)!

Funo recursiva para clculo de fatorial:

Iong Iong inl faloiiaI(inl n)
|
if(n==O) ieluin 1,
ieluin n*faloiiaI(n-1),


Outros Exemplos:

Funo que calcula a somatria dos inteiros de 1 a n:

inl sona(inl n)
|
if (n==1) ieluin 1,
ieluin n + sona(n-1),


Funo que calcula o nmero de dgitos de um nmero inteiro positivo:

inl digilos(inl n)
|
if (n<1O) ieluin 1,
ieluin 1 + digilos(n/1O),


Funo que escreve a representao binria de um nmero inteiro:

void linaiio(inl n)
|
if (n<2) piinlf(1d,n),
eIse |
linaiio(n/2),
piinlf(1d,n2),


14 - Arquivos

Um arquivo a unidade de armazenamento de informaes em memria secundria como
disco.

As funes para entrada/sada de arquivos encontram-se na biblioteca <stdio.h>.

Declarao de ponteiro para arquivo:

FILE *f;

Declara um apontador f para uma estrutura com informaes para um arquivo (localizao
do buffer para E/S, posio para no buffer, se arquivo foi aberto para leitura ou escrita, etc).

Abertura de arquivo:

fopen(char *nome, char * modo)

Argumentos: nome do arquivo e modo (r para leitura, w para escrita, a para escrita
no final do arquivo, r+ para leitura e escrita, w+ para abrir novo arquivo para leitura e
escrita).
Retorna: apontador para estrutura com informaes do arquivo ou NULL se houver erro.

Entrada/Sada de caracteres:

fgetc(FILE *f)

Argumentos: apontador para arquivo.
Retorna: prximo carter ou EOF se fim de arquivo.

fputc(int c, FILE *f)

Argumentos: carter a ser escrito, apontador para arquivo.
Retorna: carter escrito ou EOF em caso de erro.

Entrada/Sada de cadeias:

fgets(char *linha, int max, FILE *f)

Argumentos: cadeia linha onde ser colocada a prxima linha lida do arquivo f. Inclui \n e
\0 no final da cadeia. L no mximo max-1 caracteres.

fputs(char *linha, FILE *f)

Argumentos: escreve cadeia linha no arquivo f.
Retorna: EOF em caso de erro.

Entrada/Sada formatada:

fscanf(FILE *f, formatos, variveis)

L variveis nos formatos especificados do arquivo f.
Retorna EOF se fim de arquivo ou erro, ou nmero de itens lido no caso de sucesso.

fprintf(FILE *f., formatos, variveis)

Escreve variveis nos formatos especificados no arquivo f.
Retorna negativo se erro.

Trmino de uso:

fclose(f)

Desfaz a conexo entre o apontador f e o arquivo externo. Libera apontador que pode ser
utilizado para outro arquivo.

Exemplo:

// piogiana que I aiquivo enliada.lxl e copia no aiquivo saida.lxl

nain() |

IILL *e,*f,
chai c,

e=fopen(enliada.lxl,i),
s=fopen(saida.lxl,v),
vhiIe((c=fgelc(e))!=LOI) fpulc(c,s),
fcIose(e),
fcIose(s),


Exerccios

1. Ler um arquivo e contar quantos caracteres tem o arquivo, quantos so letras e quantas
linhas tem o arquivo.
2. Verificar se dois arquivos tm o mesmo contedo.
3. Dada uma cadeia de entrada, contar quantas vezes essa cadeia aparece em um arquivo.

15- Listas Ligadas

Uma lista uma seqncia de 0 ou mais elementos de um determinado tipo.

Representao:
a
0
,a
1
, a
2
, ... , a
n

n0 e a
i
tm mesmo tipo
n o tamanho da lista
elemento a
i
est na posio i
elementos so ordenados (a
i
precede a
i+1
)
cada elemento tem apontador para elemento seguinte

Exemplo de uma coleo de cores armazenadas em uma lista ligada:






Operaes:
insere(x,p.L): insere x na posio p da lista L movendo elementos a partir de p para uma
posio adiante na lista.
busca(x,L): retorna posio de x na lista L.
recupera(p,L): retorna elemento na posio p da lista L.
remove(p,L): remove elemento na posio p da lista L.
imprime(L): imprime elementos de L na ordem de ocorrncia.

15.1 Listas Simples - Representao com apontadores

Declarao

sliucl no |
chai info|3Oj,
sliucl no *piox,
,

Funo para inserir um elemento no incio da lista

/* inseie no incio da Iisla */
sliucl no *inseie(chai *x, sliucl no *ini)
|
sliucl no * aux,
aux = (sliucl no *) naIIoc(sizeof(sliucl no)),
slicpy(aux->info,x),
aux->piox=ini,
ieluin(aux),

azul verde branco preto

Funo para buscar um elemento na lista

/* lusca x, ieloina aponladoi da piineiia ocoiincia ou NULL caso no enconlie*/
sliucl no * lusca (chai *x, sliucl no *ini)
|
vhiIe (ini)
if(slicnp(ini->info,x)) ini=ini->piox,
eIse ieluin(ini),
ieluin(NULL),


15.2 Listas Simples com n cabea

Funo para iniciar uma lista

sliucl no *inicia()
|
sliucl no *inicio= (sliucl no *)naIIoc(sizeof(sliucl no)),
inicio->piox=NULL,
ieluin(inicio),


Funo para inserir um elemento no inicio da lista

void inseie(sliucl no *inicio, chai *x)
|
sliucl no *lenp=(sliucl no*)naIIoc(sizeof(sliucl no)),
slicpy(lenp->info,x),
lenp->piox=inicio->piox,
inicio->piox=lenp,



15.3 Exerccios

1. Funo para imprimir campo info dos elementos da lista.
2. Funo para contar nmero de ns na lista.
3. Funo para contar ocorrncias do elemento x na lista.
4. Funo para verificar se 2 listas so iguais (retorna 1 ou 0).
5. Funo para unir 2 listas (retorna apontador para lista unida).
6. Funo que insere elemento em lista ordenada deixando a lista ordenada.
7. Funo para remover um elemento de uma lista ordenada.

15.4 Listas Simples elementos da lista esto ordenados

Funo para inserir em lista ordenada com n cabea

void inseieoidenado(sliucl no *inicio, chai *x)
|
sliucl no *novo,*aluaI,*pied,
aluaI=inicio->piox,
pied=inicio,
vhiIe (aluaI)
if (slicnp(x,aluaI->info)>O)|
pied=aluaI,
aluaI=aluaI->piox,

eIse lieak,
novo= (sliucl no*)naIIoc(sizeof(sliucl no)),
slicpy(novo->info,x),
novo->piox=pied->piox,
pied->piox=novo,


Funo para remover de lista ordenada com n cabea

void ienoveoidenado(sliucl no *inicio, chai *x)
|
sliucl no *aluaI,*pied,
inl i,
aluaI=inicio->piox,
pied=inicio,
vhiIe (aluaI)
if (i=slicnp(x,aluaI->info)>O)|
pied=aluaI,
aluaI=aluaI->piox,

eIse if (i) ieluin(),
eIse |
pied->piox=aluaI->piox,
fiee(aluaI),
ieluin(),

Você também pode gostar