Você está na página 1de 40

UNIVERSIDADE FEDERAL DE CAMPINA GRANDE

CENTRO DE CINCIAS E TECNOLOGIA


DEPARTAMENTO DE SISTEMAS E COMPUTAO
INTRODUO PROGRAMAO

Linguagem de Programao C
Roberto Medeiros de Faria

Agosto/2002

Linguagem de Programao C

NDICE
INTRODUO

04

REGRAS E COMANDOS DA LINGUAGEM C

06

Principais Extenses

06

Bloco De Cdigo (Marcadores de Bloco {})

06

Ponto-e-vrgula (;)

06

Comentrios (/* comentrio */)

06

Identificadores

06

Tipos de Dados

07

Modificadores de Tipos

07

Definio de Variveis

08

Atribuio e Inicializao de Variveis

09

Operadores

09

Incremento e Decremento

09

Expresses de Atribuio

10

Atribuies Mltiplas

10

Prioridade dos Operadores

11

Notao Hexadecimal e Octal

12

Constante Caractere

12

Constante de Caracteres Especiais

12

Constante Cadeia de Caracteres (String)

13

Converso de Tipo

13

SADA DE DADOS

15

ENTRADA DE DADOS

17

CONTROLE DE FLUXO

18
2

Linguagem de Programao C

Comando if

18

Expresso Condicional (forma compacta para o if)

18

Comando switch

19

Comando while

19

Comando for

20

Comando break

21

Comando continue

21

DIRETIVAS DE COMPILAO

22

Diretiva #define

22

Diretiva #include

22

VETORES

24

Vetores de uma dimenso

24

Sem Verificao de Limites

25

Vetores unidimensionais so conjuntos

25

Vetores bidimensionais ou matrizes

26

STRINGS (cadeias de caracteres)

27

Lendo uma string pelo teclado

27

Algumas funes de bibliotecas com strings

28

A funo strcpy()

28

A funo strcat()

28

A funo strcmp()

28

A funo strlen()

29

Usando o terminador \0 (NULL)

29

APONTADORES

30

Varivel Apontador

30
3

Linguagem de Programao C

Operadores de Apontadores

30

Expresses com Apontadores

31

Atribuio com Apontadores

31

Aritmtica com apontadores

32

Inicializao de apontadores

32

Alocao dinmica

32

As funes malloc() e free()

33

FUNES

35

ESTRUTURAS

36

Operador de Seleo

36

Rtulo

36

Inicializao de Estruturas

37

ARQUIVOS

38

Funo fopen()

38

Funo fwrite()

39

Funo fread()

39

Macro feof()

39

Funo fclose()

39

Linguagem de Programao C

INTRODUO
C uma linguagem de programao desenvolvida nos Laboratrios Bell, por volta
de 1972, tendo sido projetada e escrita por Dennis Ritchie, que trabalhava junto com Ken
Thompson no sistema operacional UNIX. Esse sistema foi concebido como um conjunto
de ferramentas para engenheiros de software, das quais C se tornou a mais bsica.
Quase todos os utilitrios do UNIX, seu ncleo e o compilador C so escritos em C.
A grande fora de C a habilidade para construir programas complexos como
elementos simples, tanto que seu lema poderia ser "muito com pouco".
O C destinado a construo de software bsico, ou seja, linguagens de
programao, sistemas operacionais, geradores de programas, processadores de texto,
etc.
A linguagem C pode ser considerada uma linguagem de mdio nvel. O C oferece
recursos de baixo nvel permitindo a especificao de todos os detalhes na lgica de um
programa, alcanando a mxima eficincia computacional, como tambm possui um
relativo alto nvel para abstrair os detalhes da arquitetura do computador.

Linguagem de Programao C

REGRAS E COMANDOS DA LINGUAGEM C


Principais Extenses
Os tipos arquivos mais comuns envolvidos na edio, compilao, linkedio e
execuo de um programa C, tm as seguintes terminaes padro:
.C

- Arquivo contendo o Cdigo Fonte do programa representado por uma


seqncia de caracteres ASCII;

.H

- Arquivos cabealhos (header). Definies em cdigo fonte para o programa e


Bibliotecas pr-compiladas.

.OBJ - Arquivo objeto gerado a partir da compilao do cdigo fonte.


.EXE - Cdigo executvel. Resultado da juno de um ou mais arquivos objetos e
bibliotecas padres pelo processo de linkedio.

Bloco de Cdigo (Marcadores de Bloco {})


Um bloco de cdigo um grupo de comandos de programa, conectados
logicamente, que o compilador trata como uma unidade. A sintaxe da linguagem C para
crio de um bloco uma seqncia de comando entre chaves. As chaves so usadas
para delimitar um comando composto ou bloco de comandos - equivalente ao begin ...
end da linguagem Pascal.

Ponto-e-Vrgula (;)
O ponto-e-vrgula um terminador de comando e indica o final de um comando.

Comentrios (/* comentrio */)


Tudo que estiver entre /* e */ considerado um comentrio e ser ignorado pelo
compilador. Os comentrios no interferem na execuo do programa. Os comentrios
podem aparecer em qualquer parte do programa.

Identificadores
A linguagem C define identificadores como sendo nomes usados para se fazer
referncia a entidades do programa (variveis, funes, rtulos, etc.) definidas pelo
programador. Em C, um identificador composto de um ou mais caracteres, sendo que,
para identificadores internos, os 31 primeiros so significativos. O primeiro caractere deve
ser uma letra ou um sublinha (_) e os caracteres subseqentes devem ser letras, nmeros
ou sublinhas. Alguns compiladores C tambm permitem que voc use um cifro ($) dentro
de um identificador, mas no como o caractere inicial. Eis aqui alguns exemplos de
identificadores corretos e incorretos:

Linguagem de Programao C

Corretos

Incorretos

cont
valor23
total_geral
totalGeral

1cont
al
total..geral
valor-total

Isto quer dizer que se duas variveis tm em comum os 31 primeiros caracteres e


diferem apenas a partir do trigsimo segundo, o compilador C no ser capaz de
distingui-Ias. Por exemplo, esses dois identificadores so iguais:
isto_e_um_exemplo_de_um_nome_longo
isto_e_um_exemplo_de_um_nome_longo_tambm
Uma outra observao que em C as letras maisculas e minsculas so tratadas
de maneira diferentes. Por exemplo, cont, Cont e CONT so trs identificadores distintos.
Um identificador no pode ser igual a uma palavra reservada do C e no deve ter o
mesmo nome das funes que voc escreveu ou daquelas que esto pr-definidas nas
bibliotecas do C.
Quando um identificador for composto por vrias palavras, deve-se separa-las com
sublinha ou iniciar cada palavra, a partir da segunda, com letra maiscula.
Exemplos:
valor_convertido_para_celcius
valorConvertidoParaCelcius

Tipos de Dados
Existem cinco tipos primitivos de dados em C: caractere, inteiro, ponto flutuante,
ponto flutuante de preciso dupla e sem valor. As palavras reservadas usadas para
declarar variveis desse tipo so char, int, float, double, void, respectivamente. A tabela
abaixo representa o valor e a escala de cada tipo de dado em C.

Tipo
char
Int
float
doubl
void

Blts

Valor

8
16
32
64
0

-128 a 127
-32768 a 32767
3.4E -38 a 3.4E+38
1.7E-308 a 1.7E+308
sem valor

Modificadores de Tipos
Com exceo do tipo void, os tipos primitivos podem ser precedidos por
modificadores. O modificador usado para alterar o significado do tipo-base para que ele
7

Linguagem de Programao C

se adapte de maneira mais precisa s necessidades das vrias situaes. Os


modificadores de tipo so:
signed
unsigned
long
short
Abaixo esto todas as possibilidades para relacionar os tipos primitivos com os
modificadores de tipo. Embora permitido, o uso de signed com Inteiros redundante.
porque a declarao revelia (default) dos inteiros assume um nmero com sinal.

Tipo
Char
unsigned char
signed char
Int
unsigned int
signed int
short int
unsigned short int
signed short int
long int
signed long int
unsigned long int
Float
Doubl
long double
Void

Bits

Valor

8
8
8
16
16
16
16
16
16
32
32
32
32
64
90
0

-128 a 127
o a 255
-128 a 127
-32768 a 32767
0 a 65535
-32768 a 32767
-32768 a 32767
0 a 65535
-32768 a 32767
-2147483648 a 2147483647
-2147483648 a 2147483647
0 a 4294967295
3.4E-38 a 3.4E+38
1.7E-308 a 1.7E+308
3.4E-4932 a 1.1 E+4932
sem valor

A diferena entre inteiros com sinal e inteiros sem sinal est na maneira com que o
computador interpreta o bit de ordem superior (mais esquerda) do inteiro. Se voc
especificar um inteiro com sinal, ento o compilador do C gerar um cdigo que assumir
que ele deve usar o bit de ordem superior de um inteiro para representar o sinal. Se o bit
de sinal zero, ento o nmero positivo; se o bit de sinal um, ento o nmero
negativo. Para o inteiro sem sinal, o bit de maior ordem representa um dgito binrio como
os demais e no h representao de sinal o valor sempre positivo.

Definio de Variveis
Definir uma varivel cria-la na memria (aloca-la), dar a ela um nome e
especificar o tipo de dado que nela vai armazenar.
Sintaxe:
tipo lista-de-identificadores;
8

Linguagem de Programao C

O tipo deve ser um tipo de dado vlido em C, e lista-de-identificadores pode


consistir em um ou mais identificadores separados por vrgula. Exemplos:
int soma ;
unsigned char i,j,k ;
float salrio;
signed long [int] x;
unsigned int idade;
short int y;
long caminho, estado;
unsigned valor;

Atribuio e Inicializao de Variveis


O smbolo usado como operador para atribuir o valor de uma expresso a uma
varivel o igual (=). Exemplos:
soma = 10;
delta = b * b 4 * a * c;
A atribuio tambm pode ser feita diretamente na declarao. Exemplos:
int soma = 10;
char i = 3 + 2;

Operadores

Relacionais:
==
!=
>
<
>=
<=

(igual a);
(diferente de);
(maior do que);
(menor do que);
(maior ou igual a);
(menor ou igual a).

Aritmticos:
+
*
/
%
++
--

(soma);
(subtrao);
(multiplicao);
(diviso);
(resto da diviso inteira).
(incremento)
(decremento)

Lgicos:
!
||

(negao not no);


(disjuno or ou);
9

Linguagem de Programao C

&&

(conjuno and e).

Incremento e Decremento
Na linguagem C existem operadores especiais para as operaes de incremento
(adicionar um) e decremento (subtrair um) de variveis.
Suponha que uma varivel y deva ser incrementada de uma unidade antes de seu
valor ser atribudo varivel x, temos ento o seguinte trecho de programa:
y = y + 1;
x = y;
Usando o operador de incremento pr-fixado, o mesmo trecho do programa acima
pode ser reduzido a:
x = ++y;
Com a operao de incremento ps-fixado, temos:
x = y++;

Dessa formal y atribudo a x para depois ser incrementado, ou seja:


x = y;
y = y + 1;
O mesmo raciocnio se aplica quando se trata de uma operao de decremento. O
operador de decremento subtrai um do valor de uma varivel. O operador de decremento
pode ser tambm, pr-fixado e ps-fixado.

Expresses de Atribuio
usada para substituir trechos de programas, como por exemplo:
x = x + y;
Usando expresso de atribuio teramos o mesmo trecho, escrito como:
x += y;
Ou seja, quando a varivel a que se atribuir o valor da expresso igual ao
primeiro operando e na expresso s se tem um nico operador, pode-se utilizar
expresses e atribuio.
Esta forma se aplica as quatro operaes elementares e ao resto da diviso inteira
(+=, -=, *=, /=, %=).
10

Linguagem de Programao C

Atribuies Mltiplas
Usadas para na iniclalizar vrias variveis com um nico valor de uma expresso.
Exemplo:
x = y = z = 0;
importante observar que o valor zero atribudo s variveis em ordem da direita
para esquerda. Ento, a mesma expresso, com parnteses (para indicar a
associatividade) seria:
x = (y = (z = 0));
Ou seja, seria o mesmo que escrever as atribuies separadamente:
z = 0;
y = 0;
x = 0;

Prioridade dos Operadores


multo importante que saibamos a precedncia e associatividade dos operadores,
para que uma expresso seja avaliada e tenha o resultado esperado. A tabela abaixo lista
todos os operadores que iremos trabalhar. Alguns, voc j conhece.

OPERADOR
[]
()
->
.
!
~
++
-(tipo)
*
&
Sizeof
*
/
%
+
<<

NVEL
1

NOME
arrav
funo
membro
membro
negao
complemento
incremento
decremento
menos unrio
Cast
indireco
endereo
tamanho do objeto
multiplicao
diviso
resto da diviso inteira
adio
subtrao
deslocamento esquerda
11

Linguagem de Programao C

>>
<
<=
>
>=
==
!=
&
^
|
&&
||
?
=
,

6
7
8
9
10
11
12
13
14

deslocamento direita
menor que
menor ou igual a
maior que
maior ou igual a
igual a
diferente de
e para bits
ou para bits (exclusivo)
ou para bits
e lgico
ou lgico
expresso condicional
atribuico
multipla expresso

Notao Hexadecimal e Octal


Dependendo do tipo de aplicao que estamos trabalhando, as vezes, mais
cmodo usar a notao hexadecimal ou a octal.
Para indicarmos que um valor est escrito em hexadecimal, devemos inici-Io com
0x.
Exemplo:
vbit = 0xFA14;
flag = 0xFF;
Para valores octais basta iniciar com 0.
Exemplo:
voct = 0123;
masc = 088;
Note que 09 um nmero em octal e portanto diferente de 9 em decimal.

Constante Caractere
Uma constante caractere em C delimitada por apstrofo (').
Exemplo:
'a', 'b', '1', '0' , 9
12

Linguagem de Programao C

Constante de Caracteres Especiais


As constantes de caracteres especiais so representadas da mesma forma que as
constantes de caracteres comuns, porm, caso o caractere no tenha representao
visual ou seu uso confunda a verificao sinttica da linguagem C, usa-se o caractere
contra-barra (barra invertida) para auxiliar na sua representao. A tabela abaixo ilustra
alguns dos usos do caractere contra-barra ('\') na representao na representao de
caracteres especiais.

SEQNCIA

VALOR

SIGNIFICADO

'\0'
'\8'
'\b'
'\f
'\n'
'\r'
\t'
'\v'
'\\'
\
\

0
0x07
0x08
0x0C
0x0A
0x0D
0x09
0x0B
0x5C
0x27
0x22

finalizador de um string(NULL)
apito sonoro (bell)
retrocesso (backspace)
avano para o incio de outra folha
avano de linha (new line)
retorno do cursor (return)
tabulao horizontal (tab)
tabulao vertical
barra invertida (contra-barra)
apstrofo
aspas

Constante Cadeia de Caracteres (String)


Toda seqncia de caracteres que estiver entre aspas (").
Exemplos:
"Empresa de Demonstrao", "123.456"

Converso de Tipo
Quando operadores de tipos diferentes aparecem em expresses aritmticas, eles
so convertidos para um tipo comum (default), de acordo com as seguintes converses:
char e short so convertidos para int;
float convertido para double.
Argumentos passados para uma funo tambm esto sujeitos a regras de
converso.
H ainda a possibilidade de converso forada (cast) em uma expresso, com a
construo:
13

Linguagem de Programao C

(tipo)expresso;
Esta construo converte a expresso para o tipo "tipo". Por exemplo, a funo
sqrt() da biblioteca C, espera sempre um argumento em preciso dupla assim se tivermos
uma varivel numero do tipo inteiro sua raiz deve ser calculada como:
raiz =sqrt((double)numero);
Exemplo:
char i;
unsigned char k;
int j;
i = (char)j;
k = (unsigned char)i;
j = (unsigned char)calcxy(); /* converte o retorno da funo
*/

14

Linguagem de Programao C

SADA DE DADOS
Sintaxe:
printf("cadeia de controle", lista-de-argumentos) ;
A cadeia de controle especifica o formato de sada da lista-de-argumentos. A
tabela abaixo mostra os cdigos que podem ser usados na cadeia de controle como
especificao de formato:

CDIGO

FORMATAO

%c
%d
%f
%u
%x
%o
%p
%s
%e

caractere
decimal
ponto flutuante
decimal sem sinal
hexadecimal
octal
apontador
Cadeia de caracteres (string)
notao cientfica (exponencial)

Os cdigos de formatos podero ter especificaes da largura do campo, nmero


de casas decimais e o indicador de alinhamento esquerda. Um inteiro colocado entre o
sinal (%) e o comando de formatao atua como especificador da largura de campo
mnima, o que preenche a sada com brancos ou zeros para assegurar que tenha ao
menos um campo mnimo. Caso uma srie ou um nmero sejam maiores que o mnimo,
sero completamente impresso, mesmo que ultrapasse o mnimo. O preenchimento
normal feito com espao, Caso voc queira preencher com zeros, basta colocar um zero
antes do especificador de largura de campo. Por exemplo %05d vai preencher um nmero
como menos de cinco dgito, com 0's a esquerda.
Para especificar o nmero de casas decimais impressas para um nmero em
pontos flutuante. coloque um ponto decimal seguido pelo nmero de casas decimais que
voc quer apresentar, aps o especificador de largura de campo. Por exemplo %10.4f
apresentar um nmero com pelo menos 10 caracteres de comprimento, com quatro
casas decimais. Esse mtodo tambm funciona quando voc quer especificar o
comprimento mxImo do campo, para string e valores inteiros. Por exemplo, %5.75
apresentara um string com pelo menos cinco caracteres de comprimento e que no
exceda sete. Caso o string seja mais comprido que a mxima largura do campo. os
caracteres sero truncados na extremidade final.
Como condio normal, toda sarda alinhada pela direita: se a largura do campo
for mais larga que os dados impresso, os dados sero colocados no lado direito do
campo. Voc pode formatar a informao a ser colocada no lado esquerdo, pela
colocao de um sinal de menos logo aps %. Por exemplo, %-10.2f far um alinhamento
esquerda.
15

Linguagem de Programao C

Exemplos:
printf( "Empresa de Demonstrao ) ;
printf( "%s", "Empresa de Demonstrao);
printf( %c", B);
printf("%5d", 100);
printf("%-05d", 100);

16

Linguagem de Programao C

ENTRADAS DE DADOS
Sintaxe:
scanf("cadeia de controle", <lista de argumentos>)
A cadeia de controle especifica o tipo de dados que se deseja ler do teclado. A
tabela abaixo mostra os cdigos que podem ser usados na cadeia de controle:

CDIGO

SIGNIFICADO

%c
%d
%f
%x
%o
%s

ler um caractere
ler um inteiro
ler um nmero em ponto flutuante
ler um nmero em hexadecimal
ler um nmero em octal
ler uma cadeia de caracteres (string)

Todos os argumentos devem ser precedido do sinal &. Por exemplo se voc quiser
ler um inteiro para a varivel inteira cont, dever utilizar o seguinte comando:
scanf("%d", &cont);
Os comandos de formatao podem utilizar modificadores de largura de campo,
formados por nmeros inteiros colocados entre o sinal % e o cdigo de formatao. Se for
colocado um *, a funo scanf() avanar para o prximo campo de entrada.
Exemplos:
scanf("%c", &op);
scanf("%30s", &nome);
scanf("%d", &idade);
scanf("%d %c", &ld, &ch);

17

Linguagem de Programao C

CONTROLE DE FLUXO
Comando if
Sintaxe:
if(condio)
comando1;
else
comando2;
Caso a condio seja verdadeira, ou seja, o valor da expresso condicional seja
diferente de zero, o comando1 ser executado; caso contrrio, ser executado o
comando2.
A clusula else opcional.
Os comandos, tanto no if quanto no else, podem ser comandos de blocos.
Exemplo:
void main() {
int valorA, valorB;
scanf("%d %d", &valorA, &valorB);
if(valorA > valorB) {
printf("%d ", valorA);
}
else {
printf("%d ", valorB);
}
}

Expresso Condicional (forma compacta para o if)


Existe uma forma mais prtica, porm menos legvel, para uma expresso
condicional. Essa forma bastante usada na definio de macros.
Sintaxe:
identificador = condio ? exp1 : exp2;
Exemplo:
max = a > b ? a : b;
A expresso acima equivalente a:
if(a > b) {
max = a;
18

Linguagem de Programao C

}
else {
max = b ;
}

Comando switch
Sintaxe:
switch(expresso-inteira) {
case constante-inteira-1:
comando1;
break;
case constante-inteira-2:
comando2;
break;
default:
comandoN;
}
O comandos break e a clusula default so opcionais.
O switch executar o primeiro bloco de comando em que a varivel coincidir com a
constante at encontrar um break. Caso nenhuma constante seja igual ao valor da
varivel a clusula default ser avaliada.
Exemplo:
switch(ch) {
case '1':
printf("opo um escolhida");
break;
case '2':
printf("opo dois escolhida");
break;
case '3':
case '4':
printf("opo escolhida foi trs ou quatro");
default:
printf("escolha um, dois, trs ou quatro");
}

Comando while
Sintaxe:
while(condio)
comando;

19

Linguagem de Programao C

O comando pode ser um nica declarao ou um bloco de comandos que devem


ser repetidos. A condio pode ser qualquer expresso em que a verdade qualquer
valor diferente de zero.
Exemplo:
void main() {
int valor = 10;
while(valor >= 10) {
printf("%d", valor);
}
}

Comando for
Dos comandos vistos at agora, o comando for o mais completo. Sua sintaxe e
semntica difere, e muito, das outras linguagens.
Sintaxe:
for([lista-de-exp1]; [exp2]; [lista-de-exp3>])
comando;
Onde:
lista de exp1 - uma lista de expresses de inicializao;
exp2 uma expresso condicional;
lista de exp3 uma lista de expresses de reinicializao.
Semntica:
1o.) as expresses de Inlcializao so executadas.
2o.) a expresso condicional avaliada; se for zero (falsa), o lao terminar; se for
diferente de zero (verdadeira), os comandos internos sero executados, e em seguida,
executada a lista de expresses de reinicializaao.
Exemplos:
for(i=0; i<10; i++) {
a -= i
}
for(i = 0; j = 10; !j; ) {
i++;
}
for(a = 1; a != b; a+=5) {
b += c * a;
20

Linguagem de Programao C

c++;
}
for(; ; ); /* comando vazio lao eterno */

Comando break
O comando break usado para interromper o lao dos comandos while, for e
do...while.

Comando continue
O comando continue provoca uma nova avaliao da expresso de controle dos
comandos de repetio.

21

Linguagem de Programao C

DIRETIVAS DE COMPILAO
O Pr-processador
Conceitualmente, o pr-processador C um filtro que executado antes do
compilador. Ele executa substituies textuais, incluso de arquivos, e capaz de
processamento condicional. Todas as diretivas para o pr-processador comeam como
sinal cardinal #, que deve ocorrer no comeo da linha.
Diretiva #define
Existem duas formas da diretiva define. A primeira #define identificador stringchave e faz com que o identificador seja substitudo pela cadeia de caracteres chave onde
quer que ele ocorra no mdulo fonte:
#define identificador(identificador,...) string-chave
A segunda forma :
No permitido espao em branco entre o primeiro identificador e o parnteses
esquerdo. Esta forma capas de substituies mais complexas; assim
#define min(A,B) A<B?A:B
define uma substituio da expresso min(a,b) que resulta no menor dos dois
arqumentos. Porque voc est lidando com substituio textual, os argumentos da macro
pode ser de qualquer tipo vlido para as operaes. Existem, no entanto, dois problemas.
Primeiro, a macro pode ter efeitos colaterais; assim, min(++a,b) expande-se para a++< b
? ++a:b que faz mais do que era esperado. Segundo, j que um identificador pode ser
substitudo por uma expresso contendo operadores, aconselhvel colocar cada
identificador entre parnteses. Logo
#define min(A,B) ((A)B)?(A):(B
mais seguro.
Diretiva #include
A diretiva include tem a forma:
#include "nome-do-arquivo"
ou
#include <nome-do-arquivo>
A linha substituda por todo o contedo do arquivo especificado. As duas formas
podem, ou no. ser tratadas de forma identicas. Em ambos os casos, os arquivos
referenciados so obtidos em algum lugar pr-determinado no sistema; a primeira forma.
22

Linguagem de Programao C

pesquisa primeiros no seu prprio diretrio. Como regra geral, use < > para incluir
arquivos gerais do C, como:
#include <stdio.h>

23

Linguagem de Programao C

VETORES
Um vetor uma coleo de variveis do mesmo tipo que so referenciadas pelo
mesmo nome. Na Linguagem C, um vetor consiste em locaes contguas de memria. O
endereo mais baixo corresponde ao primeiro elemento, e o mais alto corresponde ao
ltimo elemento. Um vetor pode ter de uma a vrias dimenses. Voc acessa um
determinado elemento em um vetor usando ndice.
O vetor que voc vai usar a de caracteres. Como C no tem tipo de dados string
intrnseco, ele usa os vetores de caracteres. Como voc ver em breve esse mtodo de
lidar com strings concede mais fora e flexibilidade que as linguagens que usam tipos
strings especiais.

Vetores de Uma Dimenso


A forma geral da declarao de um vetor :
tipo nome-var [tamanho];
Aqui, tipo declara o tipo base do vetor. O tipo base determina o tipo de dado de
cada elemento do vetor. O tamanho define quantos elementos o vetor conter. Por
exemplo, segue.se a declarao de um vetor de inteiros chamado amostra que tem
tamanho de 10 elementos:
int amostra[10];
Em C, todas os vetores usam zero como ndice do primeiro elemento. Portanto o
exemplo acima declara um vetor de inteiros que ter 10 elementos: amostra[0] at
amostra[9]. Por exemplo, o programa a seguir carrega um vetor de inteiros com nmeros
de 0 a 9:
main() {
int x[10];
/* isto reserva 10 elementos inteiros */
int t;
for (t=0; t<10; ++t) {
x(t]=t;
}
}
Para um vetor de dimenso nica, voc computa o tamanho de uma matriz em
bytes. conforme mostramos aqui:
total-de-bytes = sizeof(tipo) * comprimento-do-vetor
Os vetores so comuns em programao porque permitem que voc lide facilmente
com muitas variveis relacionadas. Por exemplo, o uso de matrizes facilita calcular a
mdia de uma lista de nmeros, conforme mostra este programa:
/* encontrar a mdia de dez nmeros */
24

Linguagem de Programao C

main() {
int amostra[10], i, med;
for (i=0; i<1O; i++) {
printf("digite nmero %d: ", i);
scanf ("%d", &amostra[i]);
}
med=0;
/* agora somar os nmeros */
for (i=O; i<1O; i++) {
med = md + amostra[i];
}
printf("A mdia %d\n", medl1 C);
}

Sem verificao de limites


A linguagem C no realiza verificao de limites em vetores; por isso, nada impede
que voc v alm do fim de um vetor. Se voc transpuser o fim de um vetor durante uma
operao de atribuio, ento voc atribui valores a dados de outras variveis ou at
mesmo a uma parte do cdigo do programa. Eis aqui uma outra maneira de visualizar
esse problema: voc pode indexar um vetor de tamanho N alm de N sem nenhuma
mensagem de erro em tempo de compilao ou de erro em tempo de execuo, embora
esse ato possa causar um erro em seu programa. Como programador, voc tem a
responsabilidade de assegurar que todos os vetores sejam grandes o bastante para
conter tudo o que o programa ir colocar dentro deles; voc tambm tem a
responsabilidade de providenciar a verificao dos limites sempre que necessrio. Por
exemplo, Turbo C ir compilar e rodar este programa, embora ele transponha o vetor erro:
/* Um programa incorreto /*
main() {
int erro[10], i;
for (i=0; i<100; i++) {
erro[i] = i;
}
}
Nesse caso, o lao (loop) ter 100 iteraes, embora o vetor erro tenha apenas 10
elementos de tamanho.
Voc pode se perguntar por que Turbo C ou a linguagem C em geral, no fornece a
verificao de limites em vetores. A resposta que C foi projetado para substituir na
maioria das situaes a codificao em linguagem assembly. Para fazer isto, C no inclui
virtualmente nenhuma verificao de erro, porque isto aumenta (geralmente de forma
dramtica) o tempo de execuo do programa. Em vez disso, C espera que o
programador seja bastante responsvel para evitar em primeiro lugar a transposio de
vetores.

Vetores unidimensionais so conjuntos


Os vetores de dimenso nica so essencialmente um conjunto de informaes do
mesmo tipo. Por exemplo, depois que voc rodar este programa:
25

Linguagem de Programao C

main () {
char ch[7];
int i;
for (i=O; i<6; i++) {
ch[i] = 'A' + i;
}
ch[6] = '\O';
}
ch ficar assim:

Vetores bidimensionais ou matrizes


C permite vetores multidimensionais. A forma mais simples do vetor
multidimensional a bidimensional ou matriz. Um vetor bidimensional um vetor de
vetores unidimensionais. Para declarar uma matriz de inteiros bindm de tamanho 10 x 20
voc escrever:
int b1dm[10][20];
Exemplo:
main() {
int t, I, num[3][4];
for (t=O; t<3; ++t) {
for (i=0; i<4; ++i) {
num[t][i] = (t*4) + i + 1 ;
}
}
}
Neste exemplo, num[0][0] ter valor 1, num[0][1] ter valor 2, num[0][2] ter valor 3
e assim por diante. O valor de num[2][3] ser 12.

26

Linguagem de Programao C

STRINGS (Cadeias de Caracteres)


At agora, o uso mais comum dos vetores unidimensionais criar strings (cadeias)
de caracteres. Em C, um string consiste em um vetor de caracteres terminada em zero.
Um zero especificado como '\0'. Por essa razo, voc deve declarar os vetores de
caracteres como sendo um caractere maior que o maior string que voc quer que eles
contenham. Por exemplo, se voc declarar um vetor str que conter um slring de dez
caracteres, voc escrever:
char str[11];
Esta declarao deixa espao para o zero no final do string.
O C, embora no tenha o tipo de dado string, ainda assim permite constantes
string. Lembre-se que uma constante string uma lista de caracteres que aparecem entre
aspas. Eis aqui dois exemplos:
"bom dia"
"isto um teste"
Voc no precisa acrescentar o zero manualmente no final das constantes string. O
compilador C faz automaticamente. Assim, o string "bio" ficar na memria da seguinte
maneira:

Lendo um string pelo teclado


A melhor maneira de inserir uma string atravs do teclado usar a funo de
biblioteca gets(). A forma geral de gets() :
gets(nome-do-vetor);
Para ler um string, voc chama gets() com o nome-do-vetor, sem qualquer ndice
como argumento. De acordo com o retorno de gets(), o vetor conter o string introduzido
pelo teclado. A funo gets() continuar at que voc insira um carriage return.
void main() {
char str[80];
gets(str);
printf("%s", str);
}
Note que voc pode usar str como argumento de printf(). Note tambm que o
programa usa o nome do vetor sem um ndice. Por motivos que ficaro claros
27

Linguagem de Programao C

posteriormente, voc tambm pode usar o nome de um vetor de caracteres sem ndice,
desde que ela contenha um string em qualquer lugar onde voc possa usar uma
constante string.
Tenha em mente que gets() no efetua nenhuma verificao de limites no vetor
com o qual ela e chamada. Portanto, se voc inserir um string maior que o tamanho do
vetor, esse vetor ser sobrescrito.

Algumas funes de bibliotecas para usar com strings


A funo strcpy()
A chamada da funo strcpy() tem a forma geral:
strcpy(destino, origem);
Voc usa a funo strcpy() para copiar o contedo do string origem para destino.
Lembre-se de que o vetor destino deve ser grande o bastante para conter o string
em origem. Se destino no for suficientemente grande, o vetor ser transposto e
provavelmente danificar seu programa. Por exemplo:
void main() {
char str[80];
strcpy(str, "bio");
}
A funo strcat()
Para se chamar a funo strcat(), usa-se esta forma:
strcat(s1, s2)
A funo strcat() anexa s2 ao final de s1; s2 fica inalterada. Ambos os strings
devern ser encerrados por um \0, e o resultado tambm ser encerrado por \0.
void main() {
char primeiro[20], segundo[10];
strcpy(primeiro, "bom");
strcpy(segundo. "dia");
strcpy(primeiro, segundo);
printf("%s", primeiro);
}
A funo strcmp()
Para chamar a funo strcmp(), usa-se esta forma geral:
strcmp(s1, s2);
28

Linguagem de Programao C

A funo strcmp() compara dois strings e devolve 0 se eles forem iguais. Se s1 for
lexicograficamente maior que s2, ento a funo devolver um nmero positivo; se s1 for
menor que s2, a funo devolver um nmero negativo.
A funo strlen()
A forma geral da chamada de uma funo strlen() strlen(s) onde s um string. A
funo strlen() devolve o comprimento de um string para a qual s aponta.
Exemplo:
void main() {
char str[80];
printf(digite um string: )
gets(str);
printf("%d", strlen(str));
}

Usando o terminador \0 (NULL)


Voc pode fazer bom uso do fato de todos os strings terminarem em \0 para
simplificar vrias operaes com strings. Por exemplo, veja como voc precisar de
pouco cdigo para tornar maisculo cada caractere de uma string:
void main() {
char str[80];
int i;
strcpy(str, "isto um teste");
for (i=0; str(i); i++) {
str[i] = toupper(str[i];
}
printf("%s", str);
}

29

Linguagem de Programao C

APONTADORES
Um apontador uma varivel que contm um endereo de memria. Ou seja, esse
endereo a localizao de uma outra varivel na memria. Se uma varivel contm o
endereo de uma outra varivel, ento detemos que a primeira aponta para a segunda.
Analise o esquema abaixo:
Endereo na memria

Varivel na memria

1000

1003

1001
1002
1003
1004

Memria

Varivel Apontador
Se uma varivel ir conter um apontador, ento voc precisa declara-la como uma
varivel do tipo apontador. A forma geral :
tipo *nome-da-varivel
onde o tipo pode ser qualquer tipo base vlido em C, e nome-da-varivel um
identlficador vlido. Por exemplo, estes comandos declaram apontadores a inteiros e
caracteres:
char *p;
int *temp, *inicio;

Operadores de Apontadores
Existem dois operadores especiais de apontadores: * e &, que so operadores
unrios. Por exemplo:
x = &y;
Coloca em x o endereo de memria da varivel y. Esse endereo a localizao
interna da varivel na memria do computador. O endereo no tem nada a ver com o
valor de y. Voc pode se lembrar da operao de & devolvendo "o endereo de" para a
30

Linguagem de Programao C

varivel que precede. Portando voc pode ler o comando de atribuio que acabamos de
mostrar como "x recebe o endereo de y".
Para entender essa atribuio mais claramente, assuma que a varivel y esteja
localizada no endereo 2000. Depois da atribuio que acabamos de mostrar, x conter o
valor 2000.
O segundo operador, o complemento de &. Ele um operador unrio que
devolve o valor da varivel localizada no endereo que se segue. Por exemplo, se x
contiver o endereo de memria da varivel y, ento:
k = *x;
Coloca o valor de y em k. Por exemplo, se y originalmente contivesse o valor 100,
ento, depois dessa atribuio, k conteria o valor 100, porque este o valor armazenado
na localizao 2000, que o endereo de memria que foi atribudo a x. Lembre-se da
operao de * como "no endereo". Assim. nesse caso, voc poderia ler o comando
acima como "k recebe o valor que est no endereo x".
O sinal de multiplicao e o sinal "no endereo" so iguais. Ao escrever seus
programas, tenha em mente que esses operadores no tm relao uns com os outros.
Tanto o operador & como * tm precedncia mais alta que todos os outros operadores
aritmticos, exceto o menos unrio, com o qual eles se equivalem.
Eis aqui um programa que usa os dois comando de atribuio que acabamos de
mostrar:
void main() {
int x, *y, k
x = 100;
y = &x; /* obtm o endereo de x */
k = *y; /* obtm o valor naquele endereo */
printf("%d", k); /* exibe 100 */
}

Expresses com Apontadores


Em geral, as expresses que envolvem apontadores obedecem s mesmas regras
das outras expresses em C.

Atribuio com Apontadores


Como acontece com qualquer varivel, voc pode usar um apontador no lado
direito dos comando de atribuio para atribuir seu valor a um outro apontador, como
neste exemplo:
void main() {
int x = 10;
int *p1, *p2;
p1 = &x;
p2 = p1;
31

Linguagem de Programao C

printf("%p", p2); /* exibe o valor do endereo de x,


no o valor de x */
}

Aritmtica com apontadores


Em C, voc pode ter apenas duas operaes aritmticas com apontadores: + e -.
para entender o que ocorre na aritmtica com apontadores, suponha que p1 seja um
apontador para um inteiro com valor corrente de 2000. Depois da expresso:
p1++;
o contedo de p1 ser 2002 e no 2001. Cada vez que o computador incrementa
p1, ele aponta para o prximo inteiro. O mesmo verdade para os decrementos. Por
exemplo:
p1--;
far com que p1 tenha o valor 1998, se anteriormente tivesse o valor 2000.
Cada vez que o computador incrementa um apontador, ele aponta para a
localizao de memria do prximo elemento de seu tipo-base. Cada vez que o
computador decrementa, ele aponta para a localizao do elemento anterior. No caso dos
apontadores para caracteres, a aritmtica com apontadores, em geral, se parece com a
"normal". Porm, todos os outros apontadores aumentam ou diminuem de acordo como o
comprimento do tipo de dado para o qual aponta.

Inicializao de apontadores
Depois que voc declara um apontador, mas antes de lhe atribuir um valor, ele
conter um valor desconhecido. Se tentar usar um apontador antes de atribuir-Ihe um
valor, voc provavelmente danificar no apenas o programa mas tambm o sistema
operacional. Por conveno, voc deve dar a um apontador que no aponta para lugar
nenhum o valor nulo (null), para indicar esse fato. Porm o fato de um apontador ter
simplesmente o valor nulo no o torna "seguro" para ser usado. Se voc usar um
apontador nulo ao lado esquerdo de um comando de atribuio, ainda correr o risco de
danificar seu programa.
Por enquanto, a forma mais segura de nicializar um apontador atribuir-Ihe o
endereo de uma varivel declarada. Como por exemplo:
int x = 4;
int *y;
y = &x;

Alocao dinmica
Existem dois mtodos principais por meios dos quais um programa em C pode
armazenar informaes na memria principal do computador. O primeiro usa as variveis
32

Linguagem de Programao C

locais e globais que C define. No caso das variveis globais, o armazenamento fixado
durante o tempo de execuo de seu programa. Para essas variveis, o programa aloca
armazenamento no espao da pilha do computador. Embora as variveis locais sejam
eficientemente implementadas em C. elas exigem que voc saiba, de antemo, o
montante de memria necessria para cada situao.
O segundo mtodo que o programa pode usar para armazenar informaes
atravs das funes de alocao dinmica do C, malloc() e free(). Nesse mtodo um
programa aloca armazenamento para informaes da rea de memria livre chamada
heap (ou rea de alocao dinmica), que fica entre seu programa, com sua rea de
armazenamento permanente, e a pilha. Examine a figura a seguir:

A figura mostra a forma conceitual como um programa aparece na memria. A


pilha cresce de cima para baixo na medida em que o programa a usa; portanto o desenho
do programa determina a quantidade de memria que ele precisa. Por exemplo, um
programa com muitas funes recursivas demandar muito mais memria da pilha que
um programa que no tenha funes recursivas, porque as variveis locais e os
endereos de retorno esto armazenados na pilha. Lembre-se de que o computador aloca
permanentemente a memria exigida para o programa e dados globais durante a sua
execuo. O computador obtm memria da rea de memria livre para satisfazer um
pedido de malloc(), iniciando exatamente acima das variveis globais e crescendo em
direo pilha.

As funes malloc() e free()


As funes malloc() e free() formam o sistema de alocao dinmica do C e
so parte de sua biblioteca. Elas trabalham juntas usando a regio de memria livre que
fica entre seu programa e o comeo da pilha, para estabelecer e manter uma lista de
memria disponvel.
Cada vez que voc fizer um pedido de memria malloc(), esta alocar uma parte
do restante da memria livre. Cada vez que voc pedir uma liberao de memria
free(), esta devolver memria para o sistema.

33

Linguagem de Programao C

A funo malloc() retorna um apontador do tipo void, que significa que voc
dever usar um cast explcito quando atribuir o apontador devolvido a um apontador do
tipo que voc deseja. Depois de uma chamada bem sucedida, malloc() devolver um
apontador para o primeiro byte da regio de memria que foi alocada. Se no houver
memria suficiente disponvel para satisfazer o pedido malloc(), ocorrer um fracasso
na alocao e malloc() devolver um apontador nulo. Voc pode usar sizeof para
determinar O nmero exato de bytes de que cada tipo de dado precisa. Fazendo isto,
voc torna seus programas portteis a uma variedade de sistemas.
Depois de usar free() para liberar memria, voc pode reus-Ia atravs de uma
seqente chamada a malloc1(). Exemplo:
void main() {
int *p, t;
p = (int *) malloc(40 * sizeof(int));
if (!p) {
printf(memria insuficiente\n);
}
else {
for (t = 0; t < 40; ++t) {
*(p+t) = t;
}
for (t = 0; t < 40; ++t) {
prlntf("%d ", *(p+t));
}
free(p);
}
}

34

Linguagem de Programao C

FUNES
Sintaxe:
tipo-r nome-da-funo(lista-de-declaraes-dos-parmetros) {
declarao-de-variveis-locais;
corpo-da-funo;
}
O tipo-r especifica tipo da expresso de retorno. Por default, quando o tipo-r
omitido, o C assume que a funo do tipo int, ou seja a expresso de retorno inteira.
Quando uma funo no retorna nenhum valor, dizemos que ela do tipo void. Exemplo:
max(int x, y) {
int aux;
if (x > y) {
aux = x;
}
else {
aux = y ;
}
return(aux);
}
A funo acima retornar o maior valor entre dois nmeros inteiros. Uma possvel
chamada dessa funo seria:
printf("O maior valor entre %d e %d %d",
a, b, max(a,b));
Todos sabemos que h duas formas de chamar uma funo. A primeira forma
chamada por valor (ou passagem por valor). Esse mtodo copia o valor dos argumentos
nos parmetros formais (parmetros declarados na funo). A funo max() declarada
acima um exemplo de chamada por valor.
A segunda forma de passagem de argumentos para uma funo chamada por
referncia, onde o endereo de cada argumento compartilhado pelos parmetros
formais. Isso significa que as alteraes feitas nos parmetros afetam a os respectivos
argumentos (variveis) utilizados para chamar a funo.
Na chamada por referncia os parmetros devem ser declarados como
apontadores Veja o exemplo abaixo:
troca(int x, y) {
int aux;
aux = *x;
*x = *y;
*y = aux;
}
35

Linguagem de Programao C

ESTRUTURAS
Estruturas so grupos de variveis. Diferentemente de matrizes, podem ser
compostas de tipos diferentes (inteiros, reais, ...). Elas so comparveis aos registro em
outras linguagens. Cada estrutura pode ser tratada como um todo ou por cada um de
seus componentes.
Sintaxe:
struct rtulo {
declarao-de-varivel;
nome-da-varivel;
};
O rtulo opcional e ser discutido posteriormente. As declaraes de variveis
so as mesmas j vistas. O nome da estrutura segue as mesmas regras dos nomes de
variveis simples. Por exemplo:
struct {
char mes[10];
int dia;
int ano;
} feriado;
esse exemplo declara feriado como sendo uma estrutura que tem trs variveis.

Operador de Seleo
Cada membro da estrutura o equivalente a uma varivel simples de seu tipo. o
operador de seleo (.) utilizado para referenciar um membro de um estrutura. Por
exemplo:
feriado.mes[0] = 'B';
feriado.dia = 1;
feriado.ano = 94;

Rtulo
Uma estrutura pode receber um rtulo. Uma vez definida, ela pode ser utilizada
para declarar outras estruturas como os mesmos membros. Veja o seguinte exemplo:
struct data {
char mes[10];
int dia;
int ano;
};
Uma vez que data esteja definida, ela pode ser utilizada para declarar outras
variveis. Por exemplo:
36

Linguagem de Programao C

struct data diaDoAno, feriado;

Inicializao de Estruturas
A iniclalizao de estruturas assemelha-se muito como a inicializao de matrizes:
struct data feriadao = {"FEVEREIRO", 1, 1994};

37

Linguagem de Programao C

ARQUIVOS
Os arquivos em C precisam ser explicitamente abertos e referenciados. As funes
fopen() e fclose() so utilizadas, respectivamente para abrir e fechar arquivos.
Cada arquivo aberto referenciado por um identificador de arquivo que deve ser do
tipo FILE (estrutura definida no arquivo stdio.h no diretrio INCLUDE).
Exemplo de declarao de um identificador de arquivo:
FILE *id-arq;
A tabela abaixo mostra algumas das funes e macros para manipulao com
arquivos:

FUNO

AO

fopen

abre um arquivo

fwrite

escreve dados em um arquivo

Fread

ler dados de um arquivo

fclose

fechar um arquivo

Feof

verifica se o apontador do arquivo atingiu a marca final do arquivo

Funo fopen()
Sintaxe:
fopen("nome-arquivo", modo-de-acesso");
Abre um arquivo e retorna um estrutura FILE que identificar arquivo ou stream
associado. Se fopen() no abrir o arquivo, um NULL retornado.
O modo de acesso especificado pelos caracteres:
r"
"w
a"

abre um arquivo para leitura e o apontador posicionado no incio-doarquivo.


abre um arquivo apenas para gravao; o arquivo ser criado se no existir;
se o arquivo existir, todo o contedo do arquivo ser perdido (reset).
abre um arquivo no modo de incluso; se o arquivo no existir, um arquivo
ser criado; caso exista, todas incluses sero feitas no final do arquivo.

ilegal ler de arquivos que estejam abertos nos modos "w" ou "a", ou gravar em
arquivos abertos no modo "r". Caso se deseje abrir um arquivo tanto para leitura como
para escrita, deve-se usar um "+" logo aps o modo desejado. Assim temos os seguintes
modos:
"r+" abre um arquivo para leitura; o apontador posicionado no incio-doarquivo; gravao tambm permitida
38

Linguagem de Programao C

arquivo; gravao tambm permitida.


"w+ abre um arquivo para gravao; leitura tambm permitida.
"a+" abre um arquivo no modo de incluso; leitura tambm permitida.

Funo fwrite()
Sintaxe:
fwrite(p, bytes, nmero, stream);
A funo fwrite() usada para gravar um nmero de itens, do tamanho
especificado em bytes, no stream (no traduzido), comeando na localizao de memria
p. A funo retorna um nmero inteiro informando a quantidade de bytes realmente
gravados. Se um zero for retornado, houve um erro na operao.

Funo fread()
Sintaxe:
fread(p, bytes, nmero, stream);
Para ler os dados gravados com fwrite() deve-se usar a funo fread(). A funo
retornar um zero se ocorrer um erro, Caso contrrio, o numero de bytes realmente
gravados.

Macro feof()
Retorna um inteiro deferente de zero ser o fim-de-arquivo foi lido no stream, ou
seja, se o apontador de arquivo est posicionado no EOF (End-Of-File).

Funo fclose()
Sintaxe:
fclose(stream)
Fechar um arquivo descarregando o buffer a ele associado.

Exemplo
#include <stdio.h>
#include <string.h>
char buffer[] = "Ncleo de Informtlca
int main (void) {
FILE *id-arq;
char buf-str[22];
/* abre o arquivo no modo de escrita */
39

Linguagem de Programao C

if ((id-arq = fopen("TEXTO.DAT, w )) == NULL) {


printf("Erro na abertura do arquivo TEXTO.DAT");
return 1;
}
/* escreve um string no arquivo */
if (fwrite(buffer, sizeof(buffer), 1, id-arq) != 1) {
printf( "Erro de escrita no arquivo TEXTO.DAT")
return 1;
}
/* fecha o arquivo */
if (fclose(id-arq) != 0) {
printf("Erro no fechamento do arquivo TEXTO.DAT");
return 1;
}
/* abre o arquivo no modo de incluso e leitura */
if ((id-arq = fopen("TEXTO.DAT", "a+")) == NULL) {
printf("Erro na abertura do arquivo TEXTO.DAT")
return 1;
/* l um string do arquivo */
if (fread(buf_str, 22, 1, id-arq) != 1) {
printf("Erro de leitura no arquivo TEXTO.DAT);
return 1;
}
/* adiciona final de string */
buf-str[22] = '\0';
printf("\n%s", buf-str);
}

40

Você também pode gostar