Você está na página 1de 35

1

INTRODUO CINCIA DA COMPUTAO


Andr Christvo Pio Martins - DEE
OBJETIVOS
Ao trmino da disciplina o aluno dever ser capaz de construir algoritmos para soluo de
problemas de mdia complexidade e implement-los em linguagem C
CONTEDO
1. Caractersticas bsicas dos computadores
2. Algoritmos e programas
3. Linguagem de baixo e de alto nvel
4. Linguagens compiladas e interpretadas
5. Programao procedural e orientada a objetos
6. Linguagem C:
a. Estrutura da linguagem
b. Tipos de dados e declaraes
c. Operadores, comandos de atribuio, entrada e sada
d. Funes pr-definidas
e. Estruturas de seleo e repetio
f. Vetores, Matrizes e Strings
g. Arquivos
h. Funes e subrotinas
BIBLIOGRAFIA BSICA
1. ASCENCIO & CAMPOS: Fundamentos da Programao de Computadores - Algoritmos,
Pascal, C/C++ e Java. Pearson.
2. JOYANES: Fundamentos de Programao: Algoritimos, Estruturas de Dados e Objetos.
McGraw-Hill.
3. SCHILDT: C Completo e Total. Pearson.
4. ALVES. C++ Builder 6. rica.
5. FORBELLONE & EBERSPACHER: Lgica de Programao - A Construo de
Algoritmos e Estruturas de Dados. Makron Books.
6. SALIBA: Tcnicas de Programao Uma Abordagem Estruturada. Makron Books.
7. Apostilas da Internet (UFMG, UNICAMP, etc)
CRITRIO DE AVALIAO
P1 + P 2
MP =
5,0
2
Obs

1. Presena obrigatria (70%)


2. O material das aulas ser enviado por e-mail
3. O material referente a cada aula deve ser lido antes da aula
4. Compilador CodeBlocks
5. Compilador DevC++

CARACTERSTICAS BSICAS DOS COMPUTADORES DIGITAIS

1- Monitor
4- Memria RAM
7- Leitor de CD/DVD
10- Teclado

2- Placa-me
5- Placas de rede, som,...
8- Disco rgido(HD)

3- Processador
6- Fonte de energia
9- Mouse

HARDWARE: parte fsica do computador, o principal componente a CPU


(CPUgabinete), os demais so dispositivos de entrada e sada.
SOFTWARE: parte lgica do computador, so os programas:
Sistema Operacional: gerencia o hardware, os demais programas e o uso do
hardware pelos programas, uma plataforma para os aplicativos.
Compilador: permite a construo de novos aplicativos (DevC++, TurboPascal, etc.).
Aplicativo: programa que executa tarefas especficas e pr-definidas (Word: edio
de texto, PowerPoint: apresentao, MatLab: clculos matemticos, etc).
Obs: os detalhes do uso do hardware pelos programas que sero implementados no
sero abordados.
No hardware voc bate, o software voc xinga.

UC Unidade de Controle
ULA Unidade Lgica e Aritmtica
DMA Acesso Direto Memria
UCP Unidade Central de Processamento
(Microprocessador/Microcontrolador CPU/Gabinete)
MEMRIA
Volteis: registradores, cache, RAM
No-volteis: ROM, HD, CD, DVD, memria flash
DISPOSITIVOS DE E/S
Teclado (E)
Pen Drive (E/S)

Monitor de vdeo (S)


Disco Rgido (E/S)

Impressoras (S)
Discos Flexveis (E/S)

PROCESSAMENTO DA INFORMAO
Os microprocessadores so formados por milhes de chaves (transistor) que podem estar
abertas ou fechadas, ou seja, so capazes de distinguir apenas dois nveis de tenso (~3
V, valor binrio 1, e ~0 V, valor binrio 0).
A lgica que permite aos computadores digitais processar informao baseada nestes dois
valores chamada lgebra de Boole. Portanto, toda informao (dados ou instrues)
tratada pelos computadores digitais tem que ser convertida em BIT (BInary DigiT, 0 ou 1)
ou BYTE (grupo de 8 bits). Como 28=256, em um byte podem-se representar 256
diferentes valores, desde 0000.0000 at 1111.1111 Linguagem de Mquina.
Para que o computador seja funcional, as instrues e os dados devem ser arranjados de
forma a que se atinjam objetivos especficos Programas.
A linguagem de mquina resulta em programas ininteligveis e mesmo a Linguagem
Assembly gera programas extensos, difceis de serem entendidos, com baixa portabilidade
e caros, embora eficientes e rpidos (linguagens de baixo nvel). Por exemplo, para o
microprocessador 8085 temos:

Linguagem de mquina:
Linguagem Assembly:
Linguagem humana:

0011.1110
0011.0010
MVI A,32H
Armazene o nmero 50 no Registrador A

Alguns programas (compiladores) permitem que se escrevam os programas com


instrues mais prximas da linguagem humana e fazem a traduo de tais programas
para a linguagem de mquina. Linguagem de alto nvel: ADA, ALGOL, BASIC, CLIPPER,
COBOL, FORTRAN, LISP, LOGO, PASCAL, C, C++, Java, etc.
Os programas podem ser executados medida que as instrues so digitadas pelo
programador (linguagens interpretadas), ou de uma s vez aps o programa todo ter sido
digitado, compilado e criado o arquivo executvel (linguagens compiladas). No primeiro
caso, o programa interpretador deve estar instalado na mquina. No segundo caso, basta
que o executvel criado esteja na mquina.
Programao Estruturada: programas que usam estruturas de controle para definir a
seqncia de execuo das instrues (comandos IF, FOR, WHILE, REPEAT, etc). Evita a
necessidade de LABEL e o comando GO TO.
Programao Procedural: os programas so seqncias de chamadas de procedimentos,
que podem alterar dados ou apenas executar procedimentos especficos. Caracterizam-se
pela passagem de parmetros e pelas variveis locais/globais. Facilita a construo de
programas complexos e a busca por erros.
Programao Orientada a Objeto: consiste em tratar os dados (atributos) e os
procedimentos (mtodos) que atuam sobre os dados como um nico objeto. Caracterizada
pelo Encapsulamento, Herana e Polimorfismo, facilita a construo e manuteno de
programas muito complexos, implementados por equipes de programadores.
UM PROGRAMA ESCRITO EM C++ OU JAVA PODE NO SER UM OOP

ALGORITMOS
Processo de clculo, ou de resoluo de um grupo de problemas
semelhantes, em que se estipulam, com generalidade e sem restries, as
regras formais para a obteno do resultado ou da soluo do problema
[AURLIO]
Especificar uma seqncia de passos lgicos para que o computador possa executar
uma tarefa determinada (independe da linguagem)
MANIPULAO DA INFORMAO PELOS ALGORITMOS

Os algoritmos so formados por INSTRUES que determinam a maneira como os


DADOS devem ser processados
Os dados podem ser numricos (INTEIROS, REAIS, COMPLEXOS), literais
(CARACTERES, STRINGS) ou lgicos (BOOLEANOS)
As variveis armazenam os dados e podem ser de qualquer dos tipos acima, e
ainda multidimensionais (VETORES, MATRIZES)

CARACTERSTICAS

Ter um comeo e um fim


No ser ambguo
Receber dados de entrada e gerar informaes de sada
Todas as etapas do algoritmo devem ser alcanveis em um tempo finito

FORMAS DE REPRESENTAO
1) FLUXOGRAMA
Utiliza smbolos grficos padronizados para representar os algoritmos

VANTAGENS
Visualmente muito informativo
Padronizao mundial

DESVANTAGENS
Aumenta de complexidade e pode perder a clareza medida que o algoritmo
cresce
Difcil de ser traduzido para linguagem de programao
2) LINGUAGEM ALGORTMICA
Pseudolinguagem de programao (Portugol, Pseudocdigo, etc), cujos comandos, em
portugus ou ingls, descrevem as etapas do algoritmo. Nos algoritmos no estruturados
as instrues eram numeradas (LABEL) e as repeties eram foradas por meio de uma
instruo V PARA (GO TO).
VANTAGENS
Usa o portugus ou ingls como base
Facilidade na passagem para as linguagens de programao
Forma de apresentao condensada
DESVANTAGENS
Ainda no est padronizado
Visualmente pouco informativo
CONCLUSO
As duas formas de apresentao podem ser complementares
Fluxograma
mais adequado para dar uma viso geral do algoritmo
ex.: programa principal que chama vrias subrotinas
Pseudocdigo
mais adequado para especificar cada etapa do algoritmo
ex.:detalhar cada subrotina do programa principal
INSTRUES BSICAS DOS ALGORITMOS
Declarao de variveis: var a int[10] ou inteiro a[10]
Expresses aritmticas: a+b-c*d/f**g ou a+b-c*d/f^g
Expresses lgicas: a.E.b ou (a)E(b) ou a AND b ou a & b
Comando de atribuio: ab-c*d/f**g ou a:=b-c*d/f**g
Comando de sada: escreva a ou escreva (a)
Comando de entrada: leia a ou leia (a)

ESTRUTURAS CHAVES PARA A CONSTRUO DE ALGORITMOS


1) SEQUENCIAO
Os comandos do algoritmo fazem parte de uma seqncia, onde a ordem na qual ocorrem
relevante para o resultado final, pois sero executados um de cada vez, estritamente, de
acordo com essa ordem

b0
bb+1
a1/b

931: b0
932: bb+1
933: a1/b

2) DECISO
Tambm conhecida por estrutura condicional, a execuo de um ou mais comandos
depende da veracidade de uma condio.
se a>b ento
auxb
ba
aaux
seno
ca+b
fim_se
622:
623:
624:
625:
626:
627:
628:
629:

se a>b v para 625


ca+b
v para 629
continue
auxb
ba
aaux
continue

3) REPETIO (looping ou lao)


Para (FOR): normalmente usado para executar uma seqncia de comandos um nmero
pr-definido de vezes, permite definir um contador que pode ser incrementado ou
decrementado. O contador uma varivel que pode ser utilizada em operaes internas ao
FOR ou pode ser modificada dentro do FOR. No segundo caso preciso tomar cuidado
para que no ocorra um looping infinito.

para i=1:2:9 faa


leia a[i]
c[i]a[i]+b
fim_para
para i=1 at 9 incr 2 faa
leia a[i]
c[i]a[i]+b
fim_para
para i=1 enquanto i<10 incr 2
faa
leia a[i]
c[i]a[i]+b
fim_para
527:
528:
529:
530:
531:
532:

i1
continue
leia a[i]
c[i]a[i]+b
ii+2
se i<10 v para 528

Enquanto (WHILE): executa uma seqncia de comandos caso uma determinada


condio seja verdadeira, os comandos podem no ser executados nenhuma vez se a
condio for inicialmente falsa, caso a condio seja verdadeira a seqncia de comandos
deve eventualmente torn-la falsa para evitar o looping infinito.
cont0
enquanto a b faa
aa-b
contcont+1
fim_enquanto
874:
875:
876:
877:
878:
879:
880:

cont0
continue
se a<b v para 880
aa-b
contcont+1
v para 875
continue

Repita (REPEAT-UNTIL/DO-WHILE): executa uma seqncia de comandos at que uma


determinada condio se torne verdadeira (ou enquanto permanea verdadeira, no caso
do DO-WHILE), os comandos so executados pelo menos uma vez, caso a condio seja
falsa a seqncia de comandos deve eventualmente torn-la verdadeira para evitar o
looping infinito.

i0
repita
ii+1
leia a[i]
c[i]a[i]+b
at a[i]<0
fim_repita

i0
faa
ii+1
leia a[i]
c[i]a[i]+b
enquanto a[i] 0
fim_faa_enquanto

1054:
1055:
1056:
1057:
1058:
1059:

i0
continue
ii+1
leia a[i]
c[i]a[i]+b
se a[i] 0 v para 1055

REFINAMENTOS SUCESSIVOS
Um algoritmo estar pronto quando todas as suas instrues forem passveis de serem
traduzidas para a linguagem de programao e sua execuo alcanar o resultado
pretendido.
Caso contrrio, as instrues devem ser desdobradas em novas instrues, que
constituiro um refinamento do algoritmo inicial. Isso feito sucessivamente para todos os
comandos, at que o algoritmo esteja pronto.
O algoritmo para um problema nico pode no ser nico programadores diferentes
geram algoritmos diferentes, uns mais eficientes e outros menos, embora todos efetivos
mesmo os algoritmos prontos so passveis de melhorias.
A partir de um primeiro esboo (estrutura base do algoritmo) faz-se sucessivos
refinamentos.
Primeiro se constri um algoritmo efetivo depois se busca o timo.
Partes do algoritmo que aparecem mais de uma vez podem ser agrupadas como
uma nica sub-rotina que ser chamada repetidas vezes.
fundamental documentar o algoritmo com nome, autor, data e objetivo do
algoritmo, descrio das variveis e comandos, seqncia de comandos ou subrotinas.

10

LINGUAGEM C
Desenvolvida por Dennis Ritchie, baseada na linguagem B de Ken Thompson que se
originou da linguagem BCPL de Martin Richards. considerada uma linguagem de mdio
nvel por permitir a manipulao de bits, bytes e endereos de memria.
uma linguagem estruturada e permite a criao de funes, embora no permita a
criao de funes dentro de funes. Essa capacidade de construo de sub-rotinas
isoladas torna a linguagem C muito conveniente para a implementao de programas
complexos.
Outra caracterstica interessante da linguagem C so os blocos de cdigos, ie, grupos de
comando colocados dentro de chaves, que permitem uma implementao mais eficiente e
clara dos algoritmos.
A linguagem C tem apenas 32 palavras-chave reservadas:
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

A linguagem C case sensitive. Por ser muito enxuta, a linguagem C no possui palavraschave para vrias funes que so intrnsecas em outras linguagens, (operaes de
entrada/sada, etc). Por isso, os programas em linguagem C normalmente inclum
chamadas a vrias funes contidas na biblioteca C padro, cujo cdigo-objeto
adicionado, durante a linkedio, ao cdigo do programa para formar o programa
executvel.

11

A estrutura geral de um programa em C :


#include <stdio.h>

//incluses de bibliotecas

float x;

//declarao de variveis globais

int main()

//funo principal

//incio da funo
int x;

//declarao de variveis locais

printf(%i,x);

//comandos

//fim da funo principal

float f(float y)

//tipo devolvido, funo e argumentos

//incio da funo
return x+y;

//comandos
//fim da funo

A linguagem C apresenta cinco tipos bsicos de dados (char, int, float, double e void) que
podem ser modificados (signed, unsigned, long e short):
char (8 bits): 256 caracteres (letras, nmeros, smbolos)
int (16 bits): nmeros inteiros (-32.767 a 32.767)
unsigned int (16 bits): inteiros (0 a 65.535)
long int (32 bits): inteiros (-2.147.483.647 a 2.147.483.647)
unsigned long int (32 bits): inteiros (0 a 4.294.967.295)
float (32 bits): nmeros reais (16 dgitos e expoentes 38)
double (64 bits): reais (16 dgitos e expoentes 308)

Os nomes de identificadores (variveis, funes, rtulos, etc) devem comear com uma
letra ou um sublinhado, seguidos de letras, nmeros ou sublinhados. conveniente que os
nomes sejam significativos, mas no excessivamente longos:
auxiliar

vetor1

produto_34

Todas as variveis devem ser declaradas antes de serem usadas. A declarao pode ser
feita fora de todas as funes (variveis globais), dentro dos blocos (variveis locais) e na
definio dos parmetros das funes (parmetros formais). As variveis podem ser
unidimensionais ou multidimensionais (vetores, matrizes, etc).

12

int i, j;
float a[10][10], x[10], c;
int main()
{
int x;
char c;
{
int c;

As variveis locais so alocadas ao iniciar a execuo do bloco e so destrudas ao


trmino desta. Os parmetros formais das funes se comportam como variveis locais.
Quando houver variveis locais e globais com mesmo nome, o bloco em questo ir
processar apenas a varivel local.
Na linguagem C o comando de atribuio feito utilizando o sinal =, podendo ser feita
atribuio mltipla (x=y=10;), ou dentro de qualquer expresso (havendo sempre a
converso para o tipo da varivel).
As variveis podem ser modificadas por const (impede sua alterao ao longo do
programa=>inicializao explcita ou alterao via hardware) e volatile (informa ao
compilador que a varivel pode ser alterada independentemente do programa)
const int a=10;

A linguagem C permite que um programa seja compilado a partir de arquivos separados,


para facilitar o gerenciamento das variveis pode-se utilizar o comando extern que indica
em cada arquivo as variveis globais:
Arquivo 1

Arquivo 2

int x, y;

extern int x,y;

int main()

void funcao1(void)

As variveis locais podem manter seu valor entre chamadas da funo com o uso de static:
static int n;

13

Esse mesmo modificador aplicado a uma varivel global faz com que a mesma seja
reconhecida apenas no arquivo em que foi declarada. Se for usado o modificador register o
compilador ir fazer com que a varivel em questo seja armazenada no dispositivo de
acesso mais rpido disponvel. Portanto, ela poder no ter endereo, caso seja
armazenada em registradores.
As variveis podem ser inicializadas na declarao fazendo a atribuio de alguma
constante (do tipo int, char, float, etc.). Variveis locais e register no inicializadas
possuem valores desconhecidos, variveis globais e locais static no inicializadas
possuem valor zero. Constantes iniciadas em 0 so octais e em 0x so hexadecimais.
Constantes caractere devem ser escritas entre aspas simples a, e string entre aspas
duplas abc.
int i=1, hex=0x80, oct=012;
float a=3.4F, b=-4.35e-3;

Caracteres no imprimveis so especificados por meio de barras invertidas:


\b

retrocesso

\0

nulo

\\

barra invertida

\n

nova linha

\v

tabulao vertical

\r

retorno

\a

beep

\t

tabulao horizontal

aspas

14

OPERADORES
A linguagem C possui diversos tipos de operadores:
Aritmticos: -

--

++

Obs: 1) na diviso inteira ou caractere o resto truncado.


2) o sinal -- ou ++ pode ser colocado antes ou depois da varivel.
3) x++ mais eficiente do que x=x+1.
Lgicos: &&

||

Obs: 1) na linguagem C falso zero e verdadeiro qualquer no zero.


Relacionais: >

>=

Bit a bit: &

^(xor)

<

<=

==

!=

~(comp. de 1)

>>

<<(deslocamentos)

Ternrio: y=x>9?100:200; (se x>9 ento y recebe 100 cc. recebe 200)
Ponteiro: &(endereo do ponteiro) *(contedo do ponteiro)
Obs: 1) um ponteiro o endereo na memria de uma varivel.
2) variveis ponteiro devem ser declaradas: char eu, *tu, eles;
3) Nesse caso, no endereo apontado por tu tem um caractere.
Tamanho em bytes: sizeof x; sizeof (int);
Vrgula: x=(y=3,y+1);

y=3; x=y+1;

Ponto: cadastro.peso=74.5; (indica um elemento de uma estrutura)


Seta: p->peso=74.5 (mesmo efeito do ponto se p um ponteiro para peso)
Casts: (float) 5/2; (fora um determinado tipo em uma expresso)
C reduzido: -=

+=

*=

/= (x=x+10

x+=10)

Obs: 1) ordem de precedncia:


+
()
[]
->

! ~
++ -<
*
+
<< <= ==
/
&
^
|
&& || ?:
(tipo)
>>
>
!=
%
* &
>=
sizeof
2) Os parnteses podem ser usados para alterar a ordem de precedncia.
3) Durante a avaliao de uma expresso feita a promoo de tipo.

=
+=
-=
*=
/=
%=

15

I/O PELO CONSOLE


A linguagem C no define nenhuma palavra-chave para operaes de entrada/sada, que
so efetuadas por funes de biblioteca (stdio.h). As funes a seguir realizam as
operaes de entrada/sada via console (teclado, monitor).
Entrada/sada no formatada:
letra=getchar();

L o caractere (mostra na tela, no iterativa).

putchar(letra);

Mostra a letra na tela (considera stdin e stdout).

letra=getc(fp);

L o caractere (mostra na tela, no iterativa).

putc(letra,fp);

Mostra a letra na tela (considera a stream fp).

gets(frase);

L a linha at o return; acrescenta nulo no fim.

puts(frase);

Mostra a frase (considera stdin e stdout).

cin>>variavel;

Leitura do C++ para qualquer tipo de varivel.

cout<<variavel;

Sada do C++ para qualquer tipo de varivel.

Entrada/sada formatada:
printf(caractere %c.\n,letra);
printf(numero %f real.\n,x);
printf(numero %5d com cinco digitos.\n ,i);
printf(completa %05d com zeros.\n ,i);
printf(frase %5.7s de 5 a 7 caracteres.\n ,tu);
printf(numero %.3f com 3 casas decimais.\n ,x);
printf(%5.3f com 5 dig. e 3 casas dec..\n ,x);
printf(%-5.3f justificado a esquerda.\n ,x);
scanf(%d, &i);

L um decimal e armazena em i.

scanf(%c, &a);

L um caractere e armazena em a.

scanf(%s, palavra);

L uma string at o 1o espao em branco.

Obs: 1) a leitura com scanf() no precisa ser necessariamente formatada.


2) espaos em branco ou caracteres em scanf() fazem a leitura ignorar a
mesma quantidade de espaos ou os mesmos caracteres.
3) comentrios podem ser colocado entre /* e */ ou aps //.
4) a chamada para a biblioteca feita por: #include <stdio.h>

16

7) a entrada no iterativa requer a digitao do enter aps o dado a ser lido, esse
enter permanece na stream de entrada e pode ser lido posteriormente
Especificadores de formato:
%c %s caractere e string

%d %i inteiro decimal

%u inteiro decimal sem sinal


%e %E notao cientfica com e ou E

%p ponteiro
%f notao em ponto flutuante decimal

%g %G usa o formato mais curto entre, %e ou %f e %E ou %f


%#e %#E %#f %#g %#G fora a colocao do ponto decimal
%o

octal

%#o

fora a colocao de 0

%x

hexadecimal sem sinal (abcdef)

%#x

fora a colocao de 0x

%X

hexadecimal sem sinal (ABCDEF)

%#X

fora a colocao de 0x

printf(pont aponta %n um inteiro com valor 12, &pont);


printf(%% escreve o simbolo de porcentagem);
printf(%*.*f deixa a preciso como argumento,4,2,x);
scanf(%d%*c%d,&x,&y); l o caractere mas no o armazena
scanf(%[abc]s,s1,s2); digitando abcdabc s1=abc e s2=dabc
idem p/ [a-b], mas o inverso p/ [^abc]

17

FUNES MATEMTICAS
Todas a funes a seguir esto definidas na biblioteca math.h. Todos os ngulos so
considerados como radianos, os argumentos das funes devem ser escalares ou
elementos de vetor e matriz, mas nunca o vetor e a matriz.
cos(x) sin(x) tan(x) cosseno, seno e tangente de x
acos(x) asin(x) atan(x) arco cosseno, arco seno e arco tangente de x
atan2(x,y) arco tangente de x/y
cosh(x) sinh(x) tanh(x) cosseno, seno e tangente hiperblicos de x
ceil(x) floor(x) arredondamento inteiro de x, para cima e para baixo
exp(x) log(x) log10(x) exponencial, logaritmo natural e na base 10 de x
fabs(x) fmod(x,y) valor absoluto de x e resto da diviso inteira de x por y
ldexp(x,y) retorna x*2^y
frexp(x,y) retorna a mantissa de x (0,5 a 1) e armazena a potncia de 2 em y
modf(x,y) retorna a parte inteira de x e armazena a parte decimal de x em y
pow(x,y) sqrt(x) x elevado a y e raiz quadrada de x

18

ESTRUTURAS DE CONTROLE DE FLUXO DO PROGRAMA


O fato da linguagem C considerar como resultado falso de um teste condicional o valor 0 e
como valor verdadeiro qualquer valor diferente de 0 permite a construo de cdigos
extremamente eficientes.
Estruturas de seleo:

if (a>b) printf(\n%i,a);
else printf(\n%i,b);
Se a expresso entre parnteses resulta em um valor diferente de zero (verdadeiro), o 1o
comando executado, caso contrrio o 2o comando executado.
Obs: 1) a expresso no precisa ser necessariamente um teste lgico.
2) o 1o comando pode ser um comando nico, um bloco ou estar ausente.
3) o else opcional e se refere sempre ao if anterior do mesmo bloco.
4) o 2o comando pode ser outro if formando uma escada if-else-if.
5) o operador ternrio ? pode substituir o if em algumas situaes.

switch (a+b)
{
case 1:
printf(a+b=1);
break;
case 2:
printf(a+b=2);
break;
default:
printf(a+b=%i,a+b);
}

Se o valor da expresso entre parnteses for igual constante de algum case, o comando
subseqente ser executado, caso contrrio o comando subseqente ao default ser
executado. O padro ANSI C estabelece um mnimo de 257 cases. As mesmas
observaes do if so vlidas para o switch. Sendo que default e break so opcionais.

19

Estruturas de repetio:

for (int i=0;i<=100;i=i+1) printf(\n%i,i);


A inicializao (1o campo) geralmente atribui um valor inicial varivel de controle do lao,
contador i, que alterada conforme o comando de incremento (3o campo). Nesse caso, o
comando subseqente ao for repetido para cada valor do contador enquanto o comando
de condio (2o campo) estiver satisfeito, ie, resulte em um valor no zero.
Obs: 1) a condio verificada antes do comandof, e o incremento depois.
2) inicializao/condio/incremento podem ser qualquer expresso de C.
3) o comandof tambm pode alterar o contador (cuidado com lao infinito).
4) pode-se ter mais de um contador, nesse caso a inicializao e o incremento so
separados por vrgulas.

while (i<=100) printf(\n%i,i++);

O comando subseqente ao while executado repetidamente enquanto a condio entre


parnteses tiver valor no-nulo, verdadeiro. A condio avaliada no incio do lao e pode
ser qualquer expresso de C. Comando pode estar ausente ou ser um bloco de comando.
A varivel de controle, contador i, deve ser declarada e inicializada previamente.

do printf(\n%i,i++); while (i<=100);

O comando subseqente ao do executado repetidamente enquanto condio entre


parnteses tiver valor no-nulo, verdadeiro. A condio avaliada no fim do lao. O
comando pode ser nico ou ser um bloco de comandos. Convm sempre usar um bloco de
comandos com tabulao, mesmo quando o comando for nico, para aumentar a clareza
do cdigo.
Comandos de desvio incondicional:

return x;

Retorna de uma funo, ie, volta ao ponto onde foi feita a chamada da funo. Se tiver um
valor ou varivel associada, esse ser o valor da funo. similar ltima } da funo.

20

goto ponto1;

ponto1:

O comando goto desvia o fluxo de execuo do programa para o rtulo correspondente,


ponto1. O desvio pode ser feito para frente ou para trs. Rtulo um identificador que
segue as regras para os nomes das variveis. muito pouco utilizado por ser um resqucio
da programao no estruturada.

break;

Termina um case em um comando switch ou fora a fim de um lao no qual esteja inserido,
retornando para o comando seguinte ao lao. Nesse ltimo caso, normalmente vem
associado a uma estrutura de seleo if.

exit();

Fora o fim de um programa retornando ao sistema operacional.

continue;

Fora a ocorrncia da prxima iterao do lao no qual est inserida, pulando os cdigos
restantes do comando. Para o lao for, fora a verificao da condio e a execuo do
incremento, para os laos while e do-while, fora a verificao da condio.

21

VETORES E MATRIZES
Uma matriz uma coleo de variveis do mesmo tipo que referenciada por um nome
comum. Cada elemento da coleo acessado por um ndice. Em linguagem C os
elementos de uma matriz ocupam posies adjacentes na memria e os ndices se iniciam
com 0, e no com 1.
float x[10][5]...[12]
A quantidade de memria utilizada para armazenar a matriz :
sizeof(tipo)*10*5*...*12
Em linguagem C cabe ao programador se certificar que os limites da matriz no sero
excedidos ao longo do programa. O nome da matriz sem ndices especifica o endereo do
primeiro elemento que pode ser usado como ponteiro para a matriz:
int *p;
int sample[10];
p=sample; // idntico a
p=&sample[0];
sample[5]=10; // idntico a
*(p+5)=10;
O ponteiro para a matriz muito til para passar a matriz como argumento de uma funo,
j que a matriz propriamente dita no pode ser passada. Vetores so matrizes
unidimensionais, sendo que, em linguagem C, as strings so vetores de caracteres que
terminam em nulo \0. O uso de matrizes de caracteres no raro, sendo que cada linha
da matriz pode ser tratada como uma string.
char palavra[15];
char texto[20][80];
gets(texto[2]);
A inicializao das matrizes pode ser feita durante a declarao (inclusive sem
dimension-las):
int i[2][2]={1,34,43,25};
int i[][2]={1,34,43,25};
char palavra[6]=UNESP;
char palavra[6]={U,N,E,S,P,\0};
char palavra[]=UNESP;
Os comandos cin e scanf buscam todos os caracteres at a ocorrncia de um espao em
branco. O comando gets busca todos os caracteres at a ocorrncia do enter. As
constantes caractere de barra invertida permitem inserir caracteres no imprimveis, p.ex.
\n indica o comeo de uma nova linha. Convm lembrar que os elementos de uma matriz
ocupam posies adjacentes na memria, mas duas variveis declaradas em seqncia
no.

22

FUNES DE CADEIA DE CARACTERES: <string.h>


strcpy(s1,s2)
strncpy(s1,s2,n)
strcat(s1,s2)
strncat(s1,s2)
strcmp(s1,s2)
strncmp(s1,s2,n)
strchr(s1,s2)
strrchr(s1,s2)
strspn(s1,s2)
strcspn(s1,s2)
strspbrk(s1,s2)
strstr(s1,s2)
strlen(s1)
strspn(s1,s2)
strcoll(s1,s2)

copia s2 para s1 e retorna s1;


copia no mximo n caracteres da cadeia s2 para s1,
retorna s1 e preenche as posies restantes com \0;
concatena s2 com s1, retorna s1 e finaliza com \0,
s1 dever ter tamanho suficiente para receber s2;
concatena no mximo n caracteres de s2 com s1, retorna
s1 e finaliza com \0,
compara s1 com s2, retorna negativo se s1<s2, zero se
s1=s2 e positivo se s1>s2;
compara no mximo n caracteres de s1 com s2, retorna
negativo se s1<s2, zero se s1=s2 e positivo se s1>s2;
retorna um ponteiro primeira ocorrncia de s2 em s1, ou
NULL caso no ocorra;
retorna um ponteiro ltima ocorrncia de s2 em s1, ou
NULL caso no ocorra;
retorna o comprimento da substring inicial de s1
consistindo de caracteres em s2;
retorna o comprimento da substring inicial de s1
consistindo de caracteres que no esto em s2;
retorna apontador para a primeria ocorrncia em s1 de
qualquer caractere de s2, ou NULL se no houver;
retorna apontador para a primeira ocorrncia de s2 em s1, ou
NULL se no houver;
retorna o comprimento de s1;
retorna o comprimento da substring inicial de s1
consistindo de caracteres em s2;
compara s1 com s2 segundo a localidade especificada por
setlocale(), retorna negativo se s1<s2, zero se s1=s2 e
positivo se s1>s2;

23

PONTEIROS
Um ponteiro uma varivel que contm um endereo de memria. Se esse endereo o
de uma outra varivel, a primeira varivel aponta para a segunda.
char *p;
Na declarao de um ponteiro, o tipo especificado o da varivel apontada. Assim, a
varivel p armazena um inteiro que o endereo de uma varivel caractere. O operador
unrio & devolve o endereo de seu operando. Enquanto o operador unrio * devolve o
valor armazenado no endereo de seu operando:
p=&palavra;
palavra=*p;
Uma varivel ponteiro pode receber o valor de outro ponteiro, ser incrementada,
decrementada ou deslocada:
p1=p2;
p1++;
p2--;
p1=p1+12;
Obs: os incrementos, decrementos e deslocamentos so feitos segundo o tipo da varivel
apontada. Assim, se o tipo ocupa mais de uma posio de memria um incremento pode
no levar para a posio subseqente da memria.
Um ponteiro pode apontar para outro ponteiro (indireo mltipla):
float **p1, *p2, x;
p2=&x;
p1=&p2;
Durante a compilao de um programa so criadas quatro reas de memria: cdigo do
programa, variveis globais, pilha e heapy. Variveis globais so alocadas durante a
compilao e variveis locais usam a pilha, mas nenhuma delas pode ser acrescentada
durante a execuo. A menos que se use alocao dinmica da memria heapy. Da
biblioteca <stdlib.h> podemos utilizar a funo malloc() para alocar memria
dinamicamente e free() para liber-la:
char *p;
p=(char*)malloc(1000); //aloca 1000 bytes
p=(char*)malloc(500*sizeof(int)); //melhor portabilidade
Como a memria finita convm sempre verificar se o ponteiro no nulo:
if (!(p=(char*)malloc(20*sizeof(float)))) {
printf(SEM MEMRIA.);
exit(1);
}
As operaes utilizando ponteiros para as variveis so, em geral, mais rpidas que as
operaes utilizando as prprias variveis. Alm disso, a alocao dinmica de memria,

24

permite a implementao de programas bastante eficientes, inclusive utilizando vetores e


matrizes de dimenso genrica:
#include stdlib.h>
float *vetor,**matriz;
int main(void)
{
int i,n=10;
vetor=(float*)malloc(n*sizeof(float));
matriz=(float**)malloc(n*sizeof(float));
for (i=0;i<n;i++)
matriz[i]=(float*)malloc(n*sizeof(float));
}
Erros cometidos com ponteiros so, em geral, difceis de serem descobertos. Podendo ser
bastante graves quando se armazena um dado em uma posio errada da memria
(substituindo outras variveis ou mesmo partes do cdigo). Os erros mais comuns so:
int *p, x=10;
*p=x; //ponteiro (endereo) no inicializado
p=x; //erro de sintaxe, o correto seria p=&x;

25

FUNES
Funes so estruturas que facilitam a implementao e verificao dos programas por
dividi-los em blocos independentes (C no permite funes dentro de funes, assim no
estruturada em blocos). Em C tem a seguinte forma geral:

tipo nome(parmetros)
{
comandos;
}

O tipo default de retorno int. Os parmetros so os argumentos da funo, eles se


comportam como variveis locais e sua declarao tem a seguinte forma geral:

tipo nome1, tipo nome2, ... , tipo nomeN

A linguagem C permite especificar uma funo com quantidade de parmetros varivel,


desde que seja maior ou igual a 1:

int func(int a, int b, ...)

Os comandos no corpo da funo determinam a atividade exercida por ela e no so


acessveis aos demais comandos do programa, pois tem escopos diferentes. A chamada
da funo feita simplesmente pelo seu nome:

t=4.0;
x=sqrt(t);

Nesse caso, os parmetros formais da funo copiam os valores dos parmetros que so
passados para a funo. Assim, os valores que os parmetros tm fora da funo no so
alterados, mesmo que os parmetros formais sejam alterados no corpo da funo
(chamada por valor).
Se as alteraes nos parmetros formais, dentro da funo, alteram os valores dos
argumentos que foram passados temos a "chamada por referncia". A linguagem C s faz
chamadas por valor. Quando se deseja alterar as variveis que so passadas para uma
funo, seus parmetros formais devem ser declarados como sendo ponteiros. Nesse
caso, na chamada da funo os argumentos devem ser precedidos por um &.

26

A passagem de matrizes como argumento de funes uma exceo, pois feita sempre
por referncia. Podendo ser declarada de maneiras diferentes, evitando sempre a
ambigidade em matrizes multidimensionais:
Prottipo

argumentos

chamada da funo

void f(int vet[50]);

int x[50]

f(x);

void f(int vet[]);

int x[50]

f(x);

void f(int *vet);

int x[50]

f(x);

void g(float mat[50][10]);

float A[50][10]

g(A);

void g(float mat[][10]);

float A[50][10]

g(A);

A funo main() pode ter parmetros formais (argumentos de linha de comando) que
seguem o nome do programa na linha de comando do sistema operacional:

int main (int argc,char *argv[]);

O argc (argument count) um inteiro e possui o nmero de argumentos com os quais a


funo main() foi chamada na linha de comando (vale no mnimo 1). O argv (argument
values) um ponteiro para uma matriz de strings. Cada string desta matriz um dos
parmetros da linha de comando (argv[0] sempre aponta para o nome do programa),
portanto deve-se fazer as converses adequadas:

i=atoi(argv[1]);

converte o segundo argumento em inteiro

x=atof(argv[2]);

converte o segundo argumento em real

O comando return provoca o encerramento imediato da funo e, se o valor de retorno


informado, a funo retorna este valor, que tem que ser compatvel com o tipo declarado
para a funo:

int mul(int a, int b)


{
return a*b;
}

Como o default para tipos de funes o int e o C pode no fazer a verificao de tipo, o
uso incorreto das funes podem gerar resultados bizarros. Para evitar esse tipo de erro foi

27

criado o prottipo de funo, que consiste em declarar no incio do programa todas a


funes (com seus tipos e parmetros) que sero escritas:

tipo func(tipo var1, tipo var2, ..., tipoN varN);

Obs: 1) uma alternativa para os prottipos seria escrever as funes antes da funo
main(), de modo que o compilador j saiba durante a compilao da chamada das
funes quais so os parmetros e os tipos retornados (pode no funcionar quando
se tem o programa espalhado por vrios arquivos).
2) uma funo que retorna um ponteiro deve ser declarada como sendo um ponteiro
para o tipo de varivel apontada pelo ponteiro de retorno.
3) uma funo que no retorna valor pode ser declarada com void para evitar a
atribuio incorreta do valor retornado.
Em C, uma funo pode chamar a si prpria, se tornando recursiva (p/ex. clculo do
fatorial). A maioria das funes recursivas no torna o programa mais eficiente (em termos
de linhas de cdigos, uso de memria ou tempo de execuo), mas alguns algoritmos so
mais facilmente implementados recursivamente.
Obs: essencial que funes recursivas tenham critrios de parada para que no
entrem em loop infinito.

28

ARQUIVOS
A linguagem C permite que o programa manipule um arquivo armazenado em um
dispositivo de memria secundria utilizando funes de biblioteca. C++ suporta todo o
sistema de arquivo do C, a recproca no verdadeira. Lembrando que a linguagem C++
orientada, e implementar um programa orientado a objeto mais do que simplesmente
utilizar comandos do C++.
Para a linguagem C qualquer dispositivo de E/S um arquivo: HD, disquete, impressora,
teclado, vdeo, etc . O sistema de E/S da linguagem C fornece um nvel de abstrao entre
o programador e o dispositivo utilizado. Essa abstrao chamada de stream e o
dispositivo real chamado de arquivo. Existem dois tipos de streams: texto (seqncia de
caracteres) e binria (seqncia de bytes).
Uma stream associada a um arquivo especfico realizando um processo de abertura,
com recursos diferentes para cada arquivo, p.ex. o acesso aleatrio existe quando o
arquivo um disco mas no para o teclado. No fechamento ocorre a dissociao da
stream e o contedo desta descarregado no arquivo, flushing. Todos os arquivos so
fechados automaticamente ao fim do programa main ou com uma chamada a exit(). O
fechamento no se d quando ocorre uma quebra do programa ou quando se chama
abort().

A biblioteca com as funes para manipulao de arquivos <stdio.h>. Um ponteiro de


arquivo um ponteiro para informaes que definem o arquivo: nome, status, posio atual
do arquivo. As operaes das funes de E/S so feitas a partir desse ponteiro. A
declarao feita como:

FILE *arq;

As funes mais comuns da biblioteca so:

arq=fopen(dados.dat,modo);

abre um arquivo, devolve o ponteiro

fclose(arq);

fecha um arquivo

Obs: 1) dados.dat: nome do arquivo (ou path)


2) modo: caractere que indica o modo de abertura do arquivo
r: abre arquivo de texto, somente leitura
w: cria arquivo de texto, somente escrita
a: anexa novos dados, arquivo de texto

29

3) b indica que o arquivo binrio: rb, wb e ab


4) + indica que o arquivo de leitura e escrita: r+, w+, a+, rb+, wb+ e ab+
5) w e wb criam um arquivo novo ou sobrepe o antigo com um vazio
ao manipular um arquivo existente deve-se usar leitura ou leitura e escrita
6) sempre conveniente testar a abertura do arquivo

fputc(ch,arq); escreve um caractere num arquivo


ch=fgetc(arq); l um caractere do arquivo
fputs(s1,arq); escreve uma string num arquivo
fgets(s1,n,arq);

l uma string de at n-1 caracteres do arquivo

Obs: 1) char: varivel do tipo caractere que ser lida/escrita no arquivo


2) s1: varivel string que ser escrita no arquivo

fwrite(&var,nbytes,cont,arq); escreve qualquer tipo de dado


fread(&var,nbytes,cont,arq); l qualquer tipo de dado

Obs: 1) var: varivel cujo contedo ser escrito ou lido no arquivo


2) nbytes: nmero de bytes do contedo
3) cont: quantos itens, cada um de nbytes, sero escritos ou lidos
4) para cada tipo de varivel (int, float, double, etc.) nbytes pode ser determinado
com o comando: sizeof(tipo)

fprintf(arq,texto+spf,&var1,...);

escreve qualquer tipo de dado

fscanf(arq,texto+spf,&var1,...); l qualquer tipo de dado

Obs: 1) spf: especificadores de formato, caractere iniciado com %


2) var1,...: variveis cujos contedo sero escritos ou lidos
Embora esta seja a forma mais prtica de manipular arquivos devido ao fato de os dados
estarem em ASCII, o tempo de converso do binrio para ASCII faz com que essa no
seja a forma mais rpida

rewind(arq);

reposiciona o indicador no incio do arquivo

30

fseek(arq,nbytes,pos);

posiciona o indicador num endereo especfico

Obs: 1) nbytes: quantidade de bytes deslocados a partir da posio pos


2) pos: macro que define o ponto de origem para o posicionamento
SEEK_SET: posio inicial
SEEK_CUR: posio atual
SEEK_END: posio final

feof(arq);

verifica se o final do arquivo foi atingido

Obs: 1) Valor retornado zero fim do arquivo no atingido


2) Valor retornado no zero fim do arquivo atingido

remove(arq);

apaga um arquivo

31

TIPOS DE DADOS DEFINIDOS PELO USURIO


A ESTRUTURA uma coleo de variveis de tipos diferentes, referenciadas por um
nome, conveniente para agrupar informaes relacionadas. A forma geral :

struct ident {
tipo campo1;
...
tipo campoN;
} var1,..., varM;

struct ident {
tipo campo1;
...
tipo campoN;};
struct ident var1,..., varM;

Um exemplo seria a identificao dos assinantes numa lista telefnica:

struct assinante {
char nome[30];
char rua[20];
long int cep;
char tel[9];
} residencial[1000], comercial[200];

Os campos da estrutura so acessados usando o operador ponto:

residencial[10].cep=17030;
printf(%d,comercial[0].cep);
scanf(%d,&comercial[0].cep);
scanf(%s,comercial[0].tel);
scanf(%c,&comercial[0].tel[2]);

gets(residencial[98].rua);

O campo de uma estrutura1 pode ser uma estrutura2, para acessar um campoX desta
ltima a forma geral :

estrutura1.estrutura2.campoX

O padro C ANSI permite a atribuio de estruturas, eliminando a necessidade de


atribuio campo a campo:

residencial[23]=comercial[11];

Uma estrutura inteira pode ser passada para uma funo. A passagem da estrutura feita
por valor: a estrutura, que est sendo passada, copiada, campo por campo, em uma
varivel local da funo, no alterando a varivel fora da funo. Assim, os parmetros da
funo devem ser declarados como estruturas (as mesmas dos argumentos), e estas
devem ser declaradas como estruturas globais (fora do main). Na linguagem C pode-se
declarar um ponteiro para uma estrutura:

struct assinante *p;

Isso permite a passagem por referncia de estruturas como argumentos de funes, o que
torna o programa mais rpido. Nesse caso, o acesso aos campos da estrutura feita por
meio do operador seta (->):

p=&assinante[77];
p->cep=37140;

Para economizar memria, se adequar a dispositivos de hardware ou para atender rotinas


de criptografia pode ser necessrio acessar individualmente os bits dentro dos bytes. Isso
pode ser feito utilizando os campos de bits. No exemplo abaixo, status guarda informaes
booleanas distintas em cada um de seus bits, embora se possa usar mais de um bit para o
mesmo campo:

struct status_type {
unsigned delta_cts: 1;
unsigned delta_dsr: 1;
...
unsigned dsr: 1;
unsigned ring: 1;
unsigned rec_line: 1;
} status;

Uma declarao union determina uma nica localizao de memria onde podem estar
armazenadas vrias variveis diferentes em momentos diferentes. Portanto, o compilador
reserva espao suficiente para acomodar o maior tipo dentre os campos (isso permite
tornar o cdigo independente da mquina). A declarao e acesso de uma unio so
semelhantes as de uma estrutura:

union identificador {
tipo nome1;
...
tipo nomeN;
} var1, ... , varM;

Uma enumerao um conjunto de variveis inteiras que especifica todos os valores


legais que uma varivel desse tipo pode ter. A forma geral :

enum identificador {lista_de_valores} variveis;

Cada valor da lista corresponde a um inteiro comeando em 0, que pode ser inicializado,
no exemplo abaixo mao=0, balaio=10 e carro=11:

enum medida {mao, balaio=10, carro} volume;

O operador sizeof (no funo, pois a substituio feita na compilao) retorna o


tamanho em bytes de variveis ou de tipos, e pode ser usado para garantir portabilidade
ou fazer alocao dinmica de memria de tipos definidos pelo usurio. O sizeof admite
duas formas:

sizeof varivel

sizeof (tipo)

O comando typedef permite ao programador definir um novo nome para um determinado


tipo. No se est criando um novo tipo de dado apenas renomeando um j existente, isso
pode ser til para aumentar a portabilidade. Sua forma geral :

typedef tipo novo_nome;

Em linguagem C toda linha de comando comeando com # uma diretiva do prprocessador.

#define nome_macro string substitui toda nome_macro que aparecer no cdigo pela
string, o nome da macro pode ter argumentos (macro semelhante a funo):
#define ABS(a) (a)<0? -(a) : (a)
printf(valor absoluto de 1 e %d,ABS(-1));
#error mensagem pra a compilao e mostra a mensagem.
#include <arquivo.h> instrui o compilador a ler o cdigo no arquivo.
#if #ifdef #ifndef #else #elif #endif permitem a compilao condicional de
uma parte do cdigo de acordo com uma condio/definio.
#if condio
comandos;
#endif
#undef nome_macro remove a definio do nome da macro.
defined nome_macro verifica se o nome da macro est definido.
#line numero nome_arquivo estabelece novos __LINE__ e __FILE__.
#pragma permite dar instrues ao compilador (consultar manual).

O padro C ANSI especifica cinco nomes intrnsecos de macros:

__LINE__ nmero da linha atualmente sendo compilada.


__FILE__ string com o nome do arquivo sendo compilado.
__DATE__ data da traduo do arqivo fonte em cdigo objeto, mm/dd/aa.
__TIME__ hora da traduo do arqivo fonte em cdigo objeto, h:m:s.
__STDC__ booleana que indica se a implementao segue o padro C ANSI.