Você está na página 1de 13

INTRODUO LINGUAGEM C

(Organizada por Benedito Ferreira Professor do DI/UFPA


1 INTRODUO
1.1 O que C ?
C uma linguagem de programao de propsito geral (LPPG), projetada por
Dennis Ritchie para o ambiente UNIX na maquina PDP-11. Existe uma forte associao
entre C e o sistema operacional UNIX, j que foi desenvolvida nesse ambiente e o prprio
UNIX e a maior parte de seus aplicativos so escritos em C. Contudo, a linguagem no
"amarrada" a qualquer ambiente e existem compiladores nos mais variados ambientes de
hardware e sistemas operacionais, o que confere uma considervel portabilidade para a
linguagem: programas podem ser executados em vrias mquinas sem (ou com poucas)
alteraes.
A portabilidade dos programas em C origina-se do uso de bibliotecas de funes
para as operaes dependentes da mquina, como I/O e gerncia de memria. C possui
poucas palavras-chave, mas um rico conjunto de operadores, inclusive operadores de bits.
C denominada muitas vezes uma linguagem de nvel mdio, pois oferece elementos
de uma linguagem de alto nvel e recursos tpicos de assembler. Por isso, C bastante
utilizada em programao de sistemas (compiladores, sistemas operacionais), pois permite,
manipulao de bits, bytes e os endereos com que o computador funciona basicamente.
1.2 Em que paradigma se baseia C?
Paradigma, de forma simplificada, o estilo empregado na programao. O
paradigma imperativo (ou procedimental) foi o primeiro a ser empregado em linguagens de
programao, pois o mais ajustado linguagem que o computador emprega em baixo
nvel, na forma de seqncias de comandos. Assim, em uma linguagem imperativa, o
programa semelhante a uma receita, onde so informados os passos necessrios
realizao de uma tarefa. Entre essas linguagens esto FORTRAN (primeira linguagem de
alto nvel), COBOL, Pascal e C. Algum que saiba programar em uma dessas linguagens no
ter muita dificuldade(do ponto de vista do estilo) para aprender uma outra do grupo,
observando as especificidades das regras sintticas. 1 Alm desse paradigma existem o
lgico (PROLOG, por exemplo), funcional (LISP, Goffer), e orientado a objetos (Smalltalk,
C++), que seguem outra "filosofia" ou estilo de programao. A ttulo de exemplo,
PROLOG baseia-se na declarao de fatos e regras que sero utilizados por seu mecanismo
de inferncia para deduzir novos fatos.
2 VISO GERAL DE C
1No

nosso caso, especialmente, ser de grande utilidade o conhecimento da linguagem Pascal, uma vez que
ela e C se assemelham em muitos aspectos.

2.1 Tipos de dados


Em C, como em outras linguagens de programao, existem vrios tipos de dados
embutidos ou pr-definidos.

Nome do tipo
int
unsigned int
__int8
__int16

Bytes
*
*
1
2

__int32

__int64

char
unsigned char
short

1
1
2

unsigned short
long

2
4

unsigned long
enum
float
double
long double

4
*
4
8
10

Outros Nomes
signed, signed int
unsigned
char, signed char
short, short int,
signed short int
signed, signed int

signed char
short int,
signed short int
unsigned short int
long int,
signed long int
unsigned long int

Faixa de Valores
Dependente do Sistema
Dependente do Sistema
128 at 127
32,768 at 32,767
2,147,483,648 at
2,147,483,647
9,223,372,036,854,775,808 at
9,223,372,036,854,775,807
128 at 127
0 at 255
32,768 to 32,767
0 at 65,535
2,147,483,648 at
2,147,483,647
0 at 4,294,967,295
mesmo de int
3.4E +/- 38 (7 digits)
1.7E +/- 308 (15 digits)
1.2E +/- 4932 (19 digits)

Obs:
- Signed e unsigned so modificadores que podem ser aplicados a qualquer tipo integral.
- Os tipos int e unsigned int possuem o tamanho da palavra do sistema: 2 bytes (o
mesmo que short e unsigned short) no MS-DOS e verses 16-bits do Windows, e 4
bytes em SO de 32-bits.
Todas as variveis devem ser declaradas antes de serem utilizadas. Na declarao
so fornecidos o(s) nome(s) da(s) varivel(is) e o tipo de dados a que pertence(m). Na
declarao primeiro especificado o tipo de dados e depois fornecida a lista de variveis.
Por exemplo, para declarar as variveis maior, menor e medio, do tipo inteiro, utiliza-se a
seguinte declarao:
int maior, menor, medio;

obs: as declaraes de variveis, como qualquer declarao em C, terminam com ponto-evrgula. Em C, o ponto-e-vrgula um terminador de comandos, diferentemente de Pascal,
onde funciona como um delimitador de comandos. Por isso todo comando finalizado por
ponto-e-vrgula, mesmo antes da palavra-chave
else, ou do smbolo
equivalente ao end do Pascal, o }
2.2 Nomes de identificadores
Os identificadores (de variveis tipos, etc.) podem comear com qualquer letra do
alfabeto ou o caractere de sublinhar ( _ ). Em seguida, poder haver uma letra, um nmero
ou caractere de sublinhar. Em C, ao contrrio do que ocorre em Pascal, letras maisculas
so diferentes das correspondentes minsculas no nome de identificadores. Por exemplo,
Soma, SOMA e soma podem ser nomes de trs variveis distintas.
No permitida a utilizao das palavras-chave de C como nomes de variveis. Os
nomes de variveis no podem tambm coincidir com nomes de funes.
As variveis podem ser globais ou locais. As globais so declaradas fora de qualquer
funo e podem ser referenciadas em qualquer parte do programa. As locais so utilizadas
somente no interior da funo onde foram declaradas.
Deve-se chamar ateno, a fim de evitar equvocos, para o fato de que as variveis
declaradas dentro na funo main( ) no so globais.
2.3 Palavras-chave de C
C tem 28 palavras-chave, que no podem ser utilizadas como nomes de variveis ou
funes.
auto
break
case
char
continue
default
do

double
else
entry
extern
float
for
goto

if
int
long
register
return
sizeof
short

static
struct
switch
typedef
union
unsigned
while

2.4 Funes em C
Um programa C um conjunto de blocos ou mdulos denominados funes. Para
escrever um programa, deve-se criar as funes, para depois junt-las. Uma funo uma
subrotina formada por uma ou mais declaraes que executa uma tarefa bem definida.
Cada funo tem um nome, um tipo associado e uma lista de argumentos. O tipo
associado funo indica o tipo de valor que a funo retorna. Caso no haja um tipo

especificado, assumido o tipo inteiro (int). Para indicar uma funo que no retorna
nenhum valor (semelhante a uma procedure de Pascal) associa-se a palavra void funo.
A funo main( ) especial por ser a primeira a ser chamada quando um programa
executado. Logo, qualquer programa C deve ter no mnimo uma funo: main( ). A funo
main( ) pode estar localizada em qualquer parte do programa. Contudo, deve-se escolher
um padro a ser adotado, por questo de clareza. Por exemplo, pode-se adotar o prtica de
colocar a funo main( ) sempre no final do programa, semelhante ao corpo principal do
programa Pascal.
Funes sero discutidas com maiores detalhes na seo 4.

2.5 Comentrios
Os comentrios de C podem ser colocados em qualquer local do programa e esto
entre a marca inicial ( /* ) e a marca final (*/), como por exemplo:
/* Isto e um comentario */
// Isto um comentrio de linha (encerra-se no fim da linha)
3 Estruturas de controle de C
3.1 Estruturas condicionais
A declarao if
A forma geral da declarao if
if (condio de teste)
declarao1
else declarao2
onde declarao1 e declarao2 so declaraes normais (terminadas por ponto-e-vrgula).
A declarao else opcional. No lugar das declaraes simples, pode haver blocos de
declaraes. A forma geral de if com blocos de declaraes :
if (condio de teste)
{
/* declaracoes do bloco1 */
}
else
{
/* declaraes do bloco 2 */
}

Exemplo: Construir um trecho de programa C que determine o maior entre 4 valores


numricos
A declarao switch
uma declarao de deciso com mltiplas ramificaes. Compara sucessivamente
uma varivel com uma lista de inteiros ou constantes de caracteres. Ao encontrar uma
coincidencia, uma declarao (ou um bloco) executada. Um comando switch pode ser
substituido por uma sequncia de ifs aninhados, porm, em muitos casos melhor o
emprego de switch por uma questo de clareza. Switch diferente de ifs aninhados na
medida em que s testa igualdadade, enquanto if pode avaliar uma expresso relacional
qualquer. A forma geral do comando switch :
switch (varivel)
{
case const1:
declarao1;
case const2:
declarao2;
.
.
default:
declarao-n;
}
default opcional e ser executado caso no seja encontrada nenhuma coincidncia.
Exemplo:
switch (Opcao)
{
case 1:
Inclusao( );
break;
case 2:
Excluso( );
break;
.
.
default:
printf("Opcao incorreta selecionada");
}

A declarao break utilizada em cada case faz com que o fluxo do programa saia da
declarao switch. Caso no seja includa a declarao break, todas as declaraes na e
abaixo da coincidncia sero executadas.
3.2 Estruturas de repetio
A estrutura for
A estrutura for usada, em geral, quando se deseja executar declaraes um certo
nmero (previamente conhecido) de vezes. A forma geral de for :
for ( inicializao; condio; incremento)
declarao;
Para a repetio de um bloco, a forma geral :
for ( inicializao; condio; incremento)
{
declarao1;
declarao2;
.
.
declarao n;
}

A inicializao , normalmente, uma declarao de atribuio utilizada para


determinar a varivel de controle do lao. a condio uma expresso relacional que
determina o fim da malha. O incremento define como a varivel de controle se altera a cada
repetio. A estrutura for continua a execuo enquanto enquanto o resultado do teste
verdadeiro.
A malha for possui diversas possibilidades sem paralelo em Pascal ou BASIC. Por
exemplo, mltiplas variveis da malha podem ser utilizadas e suas condies verificadas,
conforme o exemplo:
for ( x = 0, y = 0; x + y < 10; ++x)
{
declaraes
}

possvel tambm que partes da definio da estrutura for seja omitida, como nos
dois exemplos a seguir exemplo:

for ( x = o; x != 123; )
{
x = getnum( ); // leia um nmero via teclado
.
.
}
x = 0;
for ( ; x < 10; )
{
printf ( "%d\n", x ) ;
++x;
}
A estrutura while
while outro tipo de estrutura de repetio da linguagem C. A forma geral da
declarao :
while (<expresso>)
declarao;
onde declarao pode ser uma nica declarao ou ou um bloco de declaraes que devem
ser repetidos. A condio pode ser qualquer expresso em que a verdade qualquer valor
diferente de zero. A declarao executada enquanto a condio verdadeira.
A estrutura do-while
Ao contrrio das estruturas for e while, que testam a condio do lao no incio, a
estrutura do-while verifica a condio no final. Isto significa que ser executada pelo menos
uma vez. A forma geral :
do
{
declaraes;
} while (<expresso>);
As chaves no so necessrias quando existe apenas uma declarao. No entanto,
elas so normalmente utilizadas para melhorar a leitura da construo do-while.
Controles adicionais:

A declarao break
Quando a declarao break encontrada dentro de um lao, este imediatamente
encerrado e o controle do programa reassume na declarao seguinte ao lao.
normalmente utilizada em laos onde condies especiais podem provocar encerramento
imediato.

A funo exit( )
Uma outra maneira de encerrar a execuo de um lao o emprego da funo
exit( ), que encerra a execuo do programa. Esta funo possui uso restrito. Geralmente
usada quando uma condio imperativa para a execuo no satisfeita, como, por
exemplo: uma aplicao grfica onde uma placa de funes grficas coloridas deve estar
presente no sistema e, no estando, inviabiliza sua execuo.
A declarao continue
A declarao continue fora a iterao seguinte do lao a ser executada. Nas
estruturas while e do-while, uma declarao continue far com que o controle v
diretamente para a condio para, em seguida, continuar com o processo de repetio. No
caso do for, o trecho de incremento da malha executado, a condio verificada e,
dependendo desta verificao, o lao continua.

4 Funes
As funes so blocos de construo, onde ocorrem todas as atividades do
programa. Depois que uma funo foi escrita e depurada, poder ser utilizada quantas vezes
for necessrio. Este um dos aspectos mais importantes da programao modular.
A forma geral das funes :
<tipo de retorno> <nome da funo> (lista de parmetros)
{
corpo da funo
}
Em geral, funes retornam valores, o que pode ser especificado pelo comando
return. Caso a funo no retorne nenhum valor (semelhante a uma procedure Pascal), o
tipo de retorno que ser associado ser void. Caso o tipo de retorno no seja especificado,
ficar definido por default o tipo inteiro, porm, as tcnicas de programao estruturada,
visando ao aspecto de legibilidade do cdigo, aconselham a declarao explcita, mesmo no
caso de inteiros.

Escopo das variveis


Quanto ao escopo, as vriveis podem ser globais ou locais. Uma varivel local
dinmica; criada somente quando a funo executa e destruda com a concluso da
funo. Assim, uma varivel local reconhecida somente pela funo em que declarada.
Uma varivel global declarada fora de qualquer funo e conhecida (pode ser
referenciada) por qualquer funo do programa. As variveis globais existem (possuem
memria alocada) durante toda a execuo do programa.
Argumento de funes
Os argumentos so os valores passados para as funes. Os argumentos podem ser
passados de uma das duas maneiras: por valor ou por referncia. Na passagem por valor,
copiado o valor dos argumentos nos parmetros formais da funo. Com esse mtodo, todas
as alteraes realizadas nos parmetros das funes no surtiro efeito nas variveis
utilizadas para chamar a funo.
Na passagem por referncia, o endereo de cada argumento copiado nos
parmetros da funo. Isso significa que as alteraes realizadas nos parmetros afetam a
varivel utilizada para chamar a funo.
Nas primeiras verses de C, as funes suportavam somente chamada por valor.
Para conseguir passagem por referncia, era necessrio "forar" isso atravs de ponteiros.
As verses mais modernas j permitem a passagem por referncia, utilizando o smbolo &
antes do nome dos parmetros.
O exemplo a seguir mostra a necessidade de passagem por referncia. A funo
troca recebe dois valores inteiros e fornece-os trocados nos seus contedos.
void troca(int *x, int *y)
{
int temp;
temp = *x;
*x
= *y;
*y
= temp;
}
Essa primeira soluo "fora" a passagem por referncia atravs do uso de ponteiros.
Utilizando-se passagem por referncia, a funo ficaria:
void troca (int & x, int &y)
{
int temp;
temp = x;
x = y;
y = temp;
}
Recursividade

Em C, as funes podem chamar a si mesmas. Uma funo dita recursiva se uma


declarao no corpo da funo chama a mesma funo. Recurso o processo de definir
alguma coisa em funo de si mesmo.
Um exemplo de funo recursiva a funo fatorial, definida das duas formas a
seguir (a segunda, recursiva):
N! = N * (N-1) * (N-2) * . . . * 2 * 1
ou
0! = 1;

N! = N * (N-1)!

Temos a seguir uma funo baseada na definio no recursiva:


fat(int n)
{
long int result, i;
result = 1;
for (i=n; i>0; i--)
result = result * i;
return result;
}
A seguir, a verso recursiva:
fat(int n)
{
if (n == 0) return 1;
return (n*fat(n-1));
}
Observe que a opo de codificao adotada na funo acima seria equivalente a...
if (n == 0) return 1;
else return (n*fatr(n-1));
Isso porque o comando return retorna um valor e encerra a execuo da funo.

5 Principais estruturas de dados


5.1 Registros (structures)
Um registro um tipo composto que possui um grupo qualquer de dados
relacionados, que podem pertencer a tipos diferentes. Qualquer tipo de dados pode
pertencer a um struct, inclusive um array ou outro struct. A definio de um struct segue a
seguinte sintaxe:
struct NOME
{
COMPONENTES
}
Quando se define um registro, no se est declarando uma varivel. Quando uma
varivel declarada, espao alocado, enquanto que quando um tipo definido, o
compilador guarda informaes sobre o novo tipo para utilizar quando variveis daquele
tipo forem criadas e usadas. Para declarar uma varivel registro, a seguinte sintaxe usada:
struct NOME_REGISTRO NOME_VARIAVEL;
onde NOME_VARIAVEL o nome da varivel que est sendo declarada.
Por exemplo, para definir uma estrutura para armazenar informaes sobre pessoas,
para uma aplicao de uma agenda telefnica, poderia se proceder da seguinte forma:
A declarao
struct TPessoa
{
char
nome[39];
char
endereco[39];
char
telefone[7];
int
idade;
};

define um novo tipo registro, contendo quatro campos. As declaraes a seguir


struct TPessoa pessoa;
struct TPessoa VetPessoa[20];

declaram, respectivamente, uma varivel simples e um vetor com 21 posies (0 a 20) de


TPessoa.

possvel tambm declarar variveis na prpria definio do novo tipo. Por


exemplo:
struct TPessoa
{
char
nome[39];
char
endereco[39];
char
telefone[7];
int
idade;
} pessoa;
Vetores em C
Vetores (ou arrays) so agregados homogneos: colees de objetos do mesmo tipo.
Formato para uma dimenso:
<tipo> <identif-vet> [<tam>];
Um vetor pode ter duas ou mais dimenses (vetores bi-dimensionais um multidimensionais). Formato:
<tipo> <identif-vet> [<tam1>][<tam2>]...;
Ex:
float VSalar[100];
int VNotas[40];
int VnotasSem[4][40];
Uso:
(obs: os ndices vo de 0 a n-1)
for (int i=0; i<100; i++)
cin >> VSalar[i];
for (int i=0; i<100; i++)
{
VSalar[i] *= 1.3;
cout<< Salario<< i+1<< reajustado:
<< Vsalar[i];
}
Em C o construtor de array ( [ ] ) empregado para criar cadeias de caracteres. Ex:
char Nome[40];

Definio de (sinnimos para) tipos: typedef


typedef char tNome[40];
typedef char tEnder[40];
typedef char tFone[40];
typedef struct
{
tNome
nome;
tEnder
ender;
tFone
fone;
int
idade;
} tPess;
Declarao de variveis do tipo tPess...
tPess P1,P2;
Definir um tipo vetor com componentes do tipo tPess, e declarar uma varivel do tipo
vetor...
typedef tPess tVetPess[100];
tVetPess VetP;
Alternativa direta...
tPess VetP[100];
Uso...
P1.nome = Ana Amlia Campos;
cout << VetP[0].fone;
for (int i=0; i<100; i++)
{
cout << Fornea o nome << i+1;
cin >> VetP[i].nome;
cout << Fornea o endereo << i+1;
cin >> VetP[i].ender;
.
.
}

Você também pode gostar