Você está na página 1de 46

INTRODUO LINGUAGEM C

Juliano Denner da Rocha

Introduo linguagem C
Autor: Juliano Denner da Rocha
Verso: 0.1
Data: 01 de maio de 2013

Este material tem o objetivo de auxiliar os acadmicos do curso de Sistemas de Informao na


disciplina Estrutura de Dados auxiliando na compreenso da linguagem de programao C para
posterior aplicao das estruturas de dados.
A distribuio do contedo nos captulos segue uma linha de aprendizado, portanto uma leitura
completa indicada para conhecimentos dos conceitos mais bsicos. No se trata de um material
aprofundado sobre o tema e sim de um primeiro contato com a linguagem.

Bom estudo a todos!

Contedo
1. Introduo linguagem C .......................... 4

7. Operadores ............................................ 25

Breve histria ....................................................4


Caractersticas ...................................................4
Influncia em outras linguagens .......................5

Operadores matemticos ............................... 25


Operadores relacionais ................................... 25
Operadores lgicos ......................................... 26
Precedncia de operadores ............................ 26

2. Ferramentas de desenvolvimento .............. 6


Compiladores ....................................................6
Ferramentas IDEs ..............................................6
Apresentando o Code::Blocks ...........................7
Criando um arquivo no Code::Blocks ................7
Executando um programa no Code::Blocks ......9
3. Estrutura de programas em C .................. 10
Estrutura bsica.............................................. 10
Incluso de bibliotecas ................................... 10
Definio de tipos .......................................... 11
Introduo sobre funes .............................. 11
Funo main ................................................... 11
Demais funes .............................................. 12
Indentao ..................................................... 12
Comentrios ................................................... 14

8. Estruturas de deciso.............................. 28
Estrutura de deciso if-else ............................. 28
Estrutura de deciso switch ............................ 29
9. Estruturas de repetio ........................... 31
Estrutura de repetio for............................... 31
Estrutura de repetio while........................... 32
Estrutura de repetio do-while ..................... 33
Comandos continue e break ........................... 33
10. Bibliotecas teis ................................... 35
Biblioteca stdio................................................ 35
Biblioteca stlib ................................................. 35
Biblioteca math ............................................... 36
Biblioteca ctype ............................................... 36

5. Declarao de variveis ........................... 15

11. Funes ................................................ 37

Inicializao .................................................... 15
Escopo ............................................................ 16

O que so e quando utilizar ............................ 37


Declarao de funes .................................... 37
Exemplo de uma funo simples .................... 38
Exemplo de funo com um parmetro ......... 38
Exemplo de funo com vrios parmetros ... 39
Exemplo de funo com retorno .................... 39
Prottipo de funes ...................................... 40

4. Tipos de dados bsicos ............................ 18


Inteiro (int) ..................................................... 18
Decimal (float ou double) ............................... 18
Caractere (char) ............................................. 19
Texto (string) .................................................. 19
Vazio (void) ..................................................... 20
6. Entrada e sada de dados ......................... 21
Sada atravs da funo printf ....................... 21
Sada atravs da funo puts ......................... 21
Sada atravs da funo putchar .................... 22
Entrada atravs de funo scanf .................... 22
Entrada atravs da funo gets ..................... 23
Entrada atravs da funo getchar ................ 23
Limpeza do buffer do teclado ........................ 23

12. Declarao de tipos de dados ................ 41


Definio de tipos de dados (typedef) ............ 41
Estrutura de dados (struct) ............................. 41
Estrutura de dados com definio de tipo ...... 42
13. Ponteiros .............................................. 43
Declarao ...................................................... 43
Inicializao ..................................................... 43
Acessando o contedo do ponteiro ................ 44
Exemplo de uso do ponteiro ........................... 45
Referncias ................................................ 46

1. Introduo linguagem C
Breve histria
A linguagem C foi criada por Dennis Ritchie e Ken Thompson entre os anos de 1969 e 1973 no
Laboratrio Bell, um campo de pesquisa da empresa de telefonia americana AT&T. H
divergncias quanto ao nome "C", a mais hiptese mais aceita que seja a prxima letra da
sequncia BCPL, uma linguagem da qual j havia originado a linguagem B.
O objetivo da criao da linguagem era o desenvolvimento de um sistema operacional prprio, o
que aconteceu. Baseando-se na linguagem foram desenvolvidas partes do sistema Unix. Mas, por
sua simplicidade e performance a linguagem C teve o seu uso expandido para outras aplicaes,
como: desenvolvimento de editores de texto, compiladores, planilhas, etc.
Com o crescimento da utilizao da linguagem um comit foi formado e em 1989 que criou um
padro ANSI, o que formalizou a linguagem na forma como ns utilizamos hoje.
A sequncia cronolgica dos principais fatos :
1966 - Criao da linguagem BCPL
1970 - Criao da linguagem B
1972 - Criao da linguagem C
1989 - Padronizao atravs do padro ANSI
Figura 1 - Ken Thompson e Dennis Ritchie

Caractersticas
A linguagem C apresenta as seguintes caractersticas:

Procedural (todo o cdigo organizado em procedimentos chamados funes)

Multiplataforma (o mesmo cdigo pode ser compilado para diferentes plataformas)

Permite recursos de programao de baixo nvel

Alta performance

Linguagem considerada simples

Muito utilizada

Influncia em outras linguagens


Uma das grandes motivaes para estudarmos a linguagem C a sua influncia da sua sintaxe
sobre outras linguagens. Dessa forma aprendendo a linguagem C estamos criando uma base de
conhecimento que poder ser reaproveitada no aprendizado de outras linguagens.
Entre as linguagens influenciadas pela linguagem C podemos destacar: C++ (que a princpio era
uma evoluo da linguagem C), Java, C#, PHP, Ruby, Python e Object-C. Observe que grande parte
das linguagens mais utilizadas mundialmente foram influenciadas pela sintaxe da linguagem C.

2. Ferramentas de desenvolvimento
Compiladores
Compiladores so programas que transformam cdigos escritos em linguagem de alto nvel em
linguagem de mquina. Assim, ao escrever seu cdigo em linguagem C, voc cria um arquivo .c
contendo todas as instrues em uma linguagem que voc compreende, mas para a execuo
necessrio fazer a compilao, isso , criar um arquivo em uma linguagem que a mquina
entenda. Ao compilar um programa C gerado um arquivo com a extenso .o j compilado.
Existem vrios compiladores para a linguagem C. Borland C, o Microsoft Visual C++ e o GCC (GNU
Compiler Collection) so alguns exemplos. Tambm existem pacotes MinGW e Cygwin que
incluem um compilador e outras ferramentas.

Ferramentas IDEs
Ferramentas IDEs (Integrated Development Environment) so ferramentas que auxiliam o
desenvolvimento de programas. Para cada linguagem existem diversas IDEs disponveis. Para a
linguagem C no diferente.
Algumas das IDEs disponveis para programar em linguagem C so: Turbo C da Borland, Dev C++,
Code::Blocks, o NetBeans (atravs de plugins) e o Microsoft Visual Studio (com o compilador
citado anteriormente, o Microsoft Visual C++).
Os benefcios de programar utilizando uma IDE prpria para a linguagem so:
Compiladores integrados: a ferramenta possui um compilador (citado no tpico anterior)
integrado a ela que facilita a compilao do cdigo.
Editor de cdigo prprio para a linguagem: a ferramenta reconhece no seu cdigo os
operadores e comandos utilizados, destacando cada item em uma cor diferente.
Recurso de auto-completar: em determinadas situaes a ferramenta sugere o comando,
baseando-se nos operadores e funes padres da linguagem.
Previso de erros: em determinadas IDEs os erros de compilao so identificados antes
mesmo da compilao ser executada.
Depurao: recurso muito til para o acompanhamento da execuo do cdigo.

Apresentando o Code::Blocks
Em nossos estudos utilizaremos o Code::Blocks 12.11 que, como visto no tpico anterior, uma
IDE para desenvolvimento de programas C ou C++.
Por que adotarmos o Code::Blocks:
1. prpria para desenvolvimentos de programas C/C++.
2. gratuito: seu uso no implica em gastos.
3. uma ferramenta atual, portanto com verses para as plataformas atuais como Windows 7
e 8 e para diversas distribuies Linux e Mac.
4. Possui um instalador completo, contendo o editor de cdigos e o compilador, o que facilita
a instalao.

Criando um arquivo no Code::Blocks


Para prtica dos exerccios em linguagem C necessrio criar pelo menos um arquivo com
extenso .c. Para isso siga os seguintes passos:

1. Clique em File -> New -> File.

2. Na janela que abrir selecione C/C++ source e clique em Go.

3. Na prxima janela selecione a opo C e clique em Next.

4. Na prxima janela informe o caminho e o nome do novo arquivo.

Executando um programa no Code::Blocks

A barra de ferramenta do Code::Blocks apresenta atalho para as operaes mais utilizadas, como
criar ou abrir arquivos e salvar. Tambm apresenta os botes para compilar
um arquivo. E, para facilitar, o boto que compila e executa

ou executar

( o mais recomendado).

3. Estrutura de programas em C
Estrutura bsica
Podemos adotar como padro a seguinte estrutura:

Esse exemplo a estrutura mais bsica para um programa em C.


Na primeira linha foi includa a biblioteca necessria para entrada e sada de dados, a stdio.h. Em
seguida foi declarada a funo main (principal), que onde o compilador inicia a execuo do
programa. Observe nessa estrutura o uso da chave para delimitar o bloco de cdigo que pertence
funo main.
Essa estrutura a base para nossos exerccios, porm outros cdigos tero de ser acrescentados
conforme a necessidade. Vejamos, ento, a ordem recomendada para incluso de outras
instrues:
1.
2.
3.
4.
5.
6.

Incluso de bibliotecas (opcional, de acordo com a utilizao)


Definio de tipos e estruturas (opcional)
Prottipos de funes (somente se for criada alguma funo)
Variveis globais (as que so utilizadas em todo o programa)
Funo main (obrigatria)
Demais funes (opcional, de acordo com a necessidade)

Veremos nos prximos tpicos mais detalhes sobre cada parte do cdigo.

Incluso de bibliotecas
Muitas funcionalidades j esto prontas nas bibliotecas do C e podem ser utilizadas de acordo
com a necessidade. Por exemplo, para interagirmos com a entrada e sada de dados temos
disponvel a biblioteca stdio.h e para manipularmos textos temos a biblioteca string.h.
Mas, para no sobrecarregar os programas com funcionalidades desnecessrias, necessrio
informar ao compilador quais bibliotecas sero utilizadas no programa atual. Isso feito atravs
do comando include. Esse comando deve sempre estar no incio do cdigo.

#include <stdio.h>
#include <string.h>
Veja mais sobre bibliotecas no captulo 10.

Definio de tipos
A linguagem C permite que, baseando-se nos tipos de dados bsicos, possamos criar tipos
diferentes de dados com as mesmas caractersticas ou com uma estrutura mais complexa.
Veja mais sobre bibliotecas no captulo 12.

Introduo sobre funes


As funes so uma forma de organizar o nosso cdigo facilitando a reutilizao e criando uma
viso mais clara sobre o mesmo. Na linguagem C basicamente todas as operaes so construdas
dentro de uma funo. A principal delas a funo main, pois por onde comea a execuo do
programa, mas, de acordo com a complexidade do cdigo, novas funes podem ser construdas
para organizar melhor o cdigo.
Veja mais sobre funes no captulo 11.

Funo main
A funo main o ponto inicial da execuo de um programa C. Portanto, nos exerccios contento
apenas um arquivo necessria uma funo main que iniciar a execuo.
Sua sintaxe a seguinte:
<tipo de retorno> main(<parmetros>){
<bloco de instrues>
<retorno>
}

Demais funes
Como visto no tpico Introduo s funes, as funes nos auxiliam na organizao do cdigo.
Para isso necessrio identificar trechos do cdigo que podem ser solicitados mais de uma vez e
separar esses trechos funes.
Um exemplo:

Nesse exemplo est declarada a funo main, que contm as primeiras instrues e a funo
imprimeSoma que contm instrues para somar dois nmeros e exibir o resultado.
Veja mais sobre funes no captulo 11.

Indentao
A indentao uma forma de organizar o cdigo e faz parte das boas prticas de programao.
Em linguagem C ela no interfere na execuo do cdigo, mas uma caracterstica esttica que
facilita a compreenso do cdigo, tanto para o programador que o escreveu, quanto para outras
pessoas que o utilizarem posteriormente. Sem a indentao correta a compreenso de blocos de
cdigos relativamente simples se torna complexa.

Existem variaes na forma de indentar o cdigo, mas em linhas gerais, cada bloco de cdigo que
estiver dentro de outro bloco, deve iniciar em uma nova linha e ser recuado um tab.
Normalmente, o espao de um tab equivale a quatro espaos.
Um exemplo no indentado:

O mesmo cdigo, agora com a indentao correta:

Comentrios
Durante a programao pode surgir a necessidade de fazer alguma anotao sobre o cdigo. Para
no sermos obrigados a fazer essa anotao em outro arquivo a linguagem C (assim como a
maioria das outras linguagens) possui duas formas de sinalizar o trecho de cdigo que deve ser
ignorado no momento da compilao, permitindo adicionar comentrios dentro do prprio
cdigo.
Primeiro: atravs de duas barras podemos comentar uma nica linha.
//Esta linha de comentrio ser ignorada na compilao
Segundo: atravs de barra e asterisco podemos iniciar um comentrio com vrias linhas. Para
encerrar o comentrio usa-se asterisco e barra.
/*
Estas linhas sero
ignoradas na
compilao do programa.
*/

5. Declarao de variveis
Programas, desde os mais simples, necessitam armazenar algum tipo de dado para realizar as
suas operaes. Para armazenar esses dados surge o conceito de variveis. Uma varivel em
programao um espao reservado na memria que nomeamos com um identificador para
facilitar a sua manipulao.
A sintaxe para declarao de variveis a seguinte:
<tipo de dado> <identificador>;

Tipo de dado: o tipo de informao que ser armazenada

Identificador: um nome dado varivel para podermos manipul-la.

Um exemplo do uso de varivel seria o armazenamento de uma idade. Idade um nmero


inteiro, portanto usaremos para isso o tipo de dado int.
int idade;
Ateno: a linguagem C case sensitive, ou seja, considera letras maisculas e minsculas diferentes,
portanto a varivel idade diferente da varivel Idade ou IDADE.

Inicializao
Quando declarada as variveis reservaram um espao para armazenar essa informao, porm,
ainda no tem nenhum valor. Portanto, precisamos "aliment-la" com um valor. Esse processo se
chama inicializao e pode ser feito de formas diferentes.
Algumas formas de inicializar a varivel:
1. Inicializar a varivel com um valor no momento da declarao.
int idade = 18;
2. Inicializar a varivel aps a declarao.
int idade;
idade = 18;
3. Inicializar atravs de uma funo de entrada de dados, como por exemplo, a scanf.
int idade;
scanf("%d",&idade);

Escopo
Escopo refere-se ao local onde declaramos a varivel. Inicialmente podemos ter uma viso errada,
de que quando declaramos a varivel, podemos utiliz-la em qualquer parte do cdigo. Isso no
acontece. Quando declaramos a varivel s podemos a utiliz-la dentro do bloco de cdigo onde
ela se encontra (o chamado de escopo da varivel).
Terminando esse bloco de cdigo a varivel deixa de existir, portanto, libera o espao reservado
por ela. Esse o motivo de declaramos as variveis apenas no local onde a iremos usar, para no
alocar espaos desnecessrios na memria.
Um exemplo de escopo:

O cdigo est destacado com quatro cores, cada uma representa um bloco de cdigo.
A cor verde representa o escopo global, ou seja, todo o programa. Portanto, qualquer varivel
declarada dentro desse escopo estar disponvel em qualquer parte do programa. As variveis
dentro desse bloco podem ser chamadas de variveis globais. Um exemplo disso a varivel
opcao declarada na linha 5. Ela usada na linha 21 para compor a mensagem, mas poderia ser
usada em qualquer parte do cdigo.
Na linha 13 temos um exemplo de varivel local, isso porque ela est dentro do bloco de cdigo
da instruo if, esse o seu escopo. Outro exemplo de variveis locais so as variveis das linhas
28 e 29, pois fazem parte do bloco de cdigos da funo funcao_potencia, portanto, no podem
ser usadas fora desse escopo.

4. Tipos de dados bsicos


Programas manipulam dados de diversos tipos. Para conseguir trabalhar com esses dados de
forma adequada necessrio armazen-los em variveis adequadas. Por exemplo, ao trabalhar
com letras no faria sentido as operaes de subtrao ou multiplicao, por que so operaes
numricas.

Inteiro (int)
Para trabalharmos com nmeros inteiros a linguagem C disponibiliza os tipos de dados int e long.
O tipo int adequado para nmero inteiros que variem entre -32.768 e 32.767, para isso reserva
na memria um espao de 2 bytes. O tipo long (como o prprio nome sugere) para nmero
inteiros maiores, abrange os nmeros entre -2.147.438.648 e 2.147.438.647, para isso reserva na
memria um espao de 4 bytes.
Exemplo:
int altitude_pico_da_neblina = 2993;
long habitantes_brasil = 190755799;

Decimal (float ou double)


Outra forma de nmeros que temos que tratar na programao C so os tipos mais precisos, com
decimais. Para trabalhar com esses tipos de dados a linguagem C dispem dos tipos float e
double. O tipo float tem uma preciso de aproximadamente 7 dgitos e para isso ocupa um
espao de 4 bytes de memria, j o double possui o dobro da preciso at aproximadamente 15
dgitos e ocupa 8 bytes de memria.
Exemplo:
float valor_compra = 1230.12;
double pi = 3.14159265359;

Caractere (char)
Observe que os dois tipos de dados citados anteriormente so numricos. Para trabalharmos com
letras e outros caracteres temos disponvel na linguagem C o tipo de dados char. Dentro de uma
varivel char podemos armazenar um caractere da tabela ASCII e esse ocupar 1 byte de
memria.
Um exemplo, inicializando com um valor fixo:
char inicial = 'A';
Variveis char tambm podem ser inicializadas com o cdigo do caractere na tabela ASCII:
char inicial = 65;

Texto (string)
A linguagem C no possui um tipo de dado string para armazenar textos. Para armazenamento de
um texto utilizamos um vetor de caracteres.
Um exemplo:
char texto[50];
texto[0] = 'T';
texto[1] = 'e';
texto[2] = 'x';
texto[3] = 't';
texto[4] = 'o';
Porm, a inicializao de variveis dessa forma se torna trabalhosa. Isso pode ser resolvido
utilizando o texto desejado em uma nica linha entre aspas. Exemplo:
char texto[50] = "Texto";
Outro ponto importe a ser observado que a manipulao de textos no da mesma forma que
outros tipos de dados. A maioria das manipulaes so feitas por funes disponveis na
biblioteca string.h. Por exemplo, para copiar o texto de uma varivel para outra utiliza-se a funo
strcpy.
char origem[50] = "Texto";
char detino[50];
strcpy(detino, origem);

Vazio (void)
Em algumas situaes (principalmente na declarao de funes) preciso indicar um valor
inexistente/vazio. Para isso a linguagem C dispe do tipo void.
Um exemplo:
void imprimeMensagem(char msg[100]){
printf("Mensagem: %s",msg);
}
No exemplo acima declarada uma funo que tem por objetivo imprimir uma mensagem.
Observe que, a funo imprime a mensagem mas no retorna nenhum valor. Nesse caso
indicado no incio de sua declarao que o retorno ser void.

6. Entrada e sada de dados


Sada atravs da funo printf
A funo printf uma funo da biblioteca stdio.h para a exibio de mensagens na tela do
computador. Sua sintaxe a seguinte:
printf(<tipos de sada>,<variveis>);

Tipo de sada: o texto da mensagem contendo os controles onde sero inseridos os


valores passados por variveis.

Variveis: onde so passadas as variveis usadas na mensagem.

Um exemplo:
char nome[50] = "Maria";
int idade = 18;
printf("%s tem %d anos.",nome,idade);

Observe que a mensagem formada por um texto que contm, em determinados locais, o
caractere % seguido de uma letra. Esses controles indicam que nesses locais sero inseridos os
valores das variveis passadas na sequncia.

Alguns caracteres de controle


%d ou %i

Um nmero inteiro

%c

Um nico caractere

%s

Um texto

%f

Um nmero decimal

\n

Nova linha

\t

Tabulao

Sada atravs da funo puts


Outra funo disponvel na biblioteca stdio.h para a exibio de mensagens a puts. Porm ela
voltada para a sada de textos somente, no permitindo montar mensagens com vrias variveis
como a funo printf. Sua sintaxe a seguinte:
puts(<texto>);

Um exemplo:
char nome[50] = "Maria";
puts(nome);

Sada atravs da funo putchar


Outra funo da biblioteca stdio.h para a exibio de mensagens a putchar. Como o prprio
nome indica, utilizada para a exibio de um nico caractere. Sua sintaxe a seguinte:
putchar(<caractere>);
Um exemplo:
char sexo = 'F';
putchar(sexo);

Entrada atravs de funo scanf


A funo scanf est disponvel na biblioteca stdio.h e auxilia na leitura dos valores digitados no
teclado. Sua sintaxe :
scanf(<tipos de entrada>,&<varivel>);
Atravs do parmetro tipo de entrada podemos definir qual o tipo de dados esperado. Na
sequncia deve ser definida a varivel que recebe o valor digitado, precedida do caractere &.
Um exemplo:
int idade;
scanf("%d",&idade);

Alguns caracteres de controle


%d ou %i

Um nmero inteiro

%c

Um nico caractere

%s

Um texto

%f

Um nmero decimal

Entrada atravs da funo gets


A funo gets tambm faz parte da biblioteca stdio.h. Essa funo possibilita a entrada de textos
atravs do teclado. Sua sintaxe :
gets(<varivel>);
Um exemplo:
char nome[50];
gets(nome);

Entrada atravs da funo getchar


A funo getchar, como o prprio nome sugere, faz a leitura de um nico caractere. Sintaxe:
<varivel> = getchar();
Um exemplo:
char sexo;
sexo = getchar();

Limpeza do buffer do teclado


Em alguns casos de leitura de um nico caractere pode ocorrer um comportamento inadequado,
no permitindo informar o valor e passando para a prxima instruo. Isso acontece devido a
sujeiras deixadas no buffer do teclado, principalmente por um scanf.
Existem algumas formas de contornar esse problema.
1. Usando a funo fflush(stdin) (no Windows) ou __fpurge(stdin) (no Linux)..
Essas funes tem a desvantagem de dependerem de plataforma.
Exemplo:
char nome[50], sexo;
scanf("%s", &nome);
fflush(stdin); //ou __fpurge(stdin); no Linux
scanf("%c", &sexo);

2. Utilizando um getchar aps o scanf. Aps a leitura de um texto com o scanf, normalmente,
fica no buffer um caractere, o enter pressionado para enviar o texto. Utilizando um getchar
antes de ler um nico caractere pode tirar essa sujeira do buffer.
Exemplo:
char nome[50], sexo;
scanf("%s", &nome);
getchar(); //Limpeza do caractere deixado no buffer
scanf("%c", &sexo);
3. Uma terceira forma na prpria leitura do caractere indicar para ignorar o caractere deixado
no buffer, adicionando o controle %*c na leitura. Esse controle indica para fazer a leitura de
um caractere (no caso a sujeira) e no armazen-lo.
Exemplo:
char nome[50], sexo;
scanf("%s", &nome);
scanf("%*c%c", &sexo); //Observe o %*c antes do %c

7. Operadores
Operadores so smbolos formados por um ou mais caracteres usados na programao para
realizar operaes diferentes. Veja a seguir uma lista com os principais operadores.
Os operadores formados por dois caracteres esses no podem ser separados.

Operadores matemticos
Operador

Nome

Sintaxe

Resultado

Soma

resultado = a + b;

Total da soma

Subtrao

resultado = a b;

Total da subtrao

Multiplicao

resultado = a * b;

Total da multiplicao

Diviso

resultado = a / b;

Total da diviso

Mdulo

resultado = a % b;

Resto da diviso

++

Incremento

a++;

Nmero mais um

--

Decremento

a--;

Nmero menos um

+=

Atribuio por adio

a += b;

Total da soma em a

-=

Atribuio por subtrao

a -= b;

Total da subtrao em a

Operadores relacionais
Operador

Nome

Sintaxe

>

Maior

(a > b)

<

Menor

(a < b)

>=

Maior ou igual

(a >= b)

<=

Menor ou igual

(a <= b)

==

Igual

(a == b)

!=

Diferente

(a != b)

No confundir o operador de igualdade (==) com o de atribuio (=) . O primeiro compara dois
nmeros, o segundo copia o valor da varivel da direita para a varivel da esquerda.

Operadores lgicos
Operador

Nome

Sintaxe

&&

E lgico

(a > b) && (a > c)

||

OU lgico

(a < b) || (a > c)

Negao

!(a < b)

Precedncia de operadores
Na linguagem C quando a operao apresenta diversos operadores alguns apresentam prioridade
sobre outros, assim como na matemtica. Por exemplo:
int a = 10, b = 15, c = 3, resultado;
resultado = a + b * c;
Observe que foram utilizados os operadores de soma e de multiplicao. primeira vista
podemos supor que a primeira execuo seria a operao de soma por estar esquerda
resultando em 75, porm, a execuo segue a seguinte precedncia de operadores:
Ordem

Operadores

Descrio

( )

Parnteses

++ --

Incremento e decremento

* / %

Multiplicao, diviso e mdulo

+ -

Soma e subtrao

== !=

Igualdade e diferena

&&

||

Ou

Negao

Atribuio

Como o operador de multiplicao tem uma prioridade sobre o operador de soma o resultado da
operao seria 55.
Para evitar confuses em situaes como essa adequado o uso de parnteses para separar
corretamente cada trecho da operao, tal qual na matemtica. Como o operador parntese
tem precedncia sobre os outros operadores, a sentena entre parnteses ser executada antes.
Mesma operao, agora delimitada por parnteses:
resultado = a + (b * c);

Outro exemplo:
if(((a > b) && (a > c)) || (a == (b + c))) {
//Bloco de cdigos...
}
Observe nessa condio que so vrios os operadores e a compreenso estaria comprometida se
no houvesse a separao das sentenas usando parnteses.

8. Estruturas de deciso
Estruturas de deciso so extremamente teis na programao, pois permitem criar condies
para que determinados blocos de cdigo sejam executados.

Estrutura de deciso if-else


Sintaxe completa:
if(<condio>) {
<bloco de cdigo quando verdadeiro>
}else{
<bloco de cdigo quando falso>
}
As chaves que delimitam o bloco de cdigo podem ser suprimidas se for uma nica linha de
cdigo (porm recomendado coloc-las para evitar confuses):
if(<condio>)
<uma nica linha de cdigo quando verdadeiro>
else
<uma nica linha de cdigo quando falso>
A instruo else (seno) tambm pode ser suprimida no caso de no querermos executar um
cdigo quando a condio for falsa:
if(<condio>) {
<bloco de cdigo quando verdadeiro>
}

Exemplo de uso do if-else:

Estrutura de deciso switch


Permite classificar uma varivel escolhendo entre vrios valores.
Sintaxe:
switch(<varivel>){
case <valor1>:
<instruo caso 1>
break;
case <valor2>:
<instruo caso 2>
break;
default:
<instruo caso no seja nenhuma das opes>
}
O switch permite a execuo com variveis do tipo int ou char.
O comando break encerra a execuo do switch assim que encontrar o valor que est sendo
procurado, caso contrrio todas as instrues abaixo da opo encontrada sero executadas.
A opo default opcional e executa quando o valor na varivel de controle no igual a nenhum
dos valores definidos nos cases.

Exemplo de uso do switch:

9. Estruturas de repetio
Estrutura de repetio for
A estrutura de repetio for permitem a repetio de determinado bloco de cdigo sob uma
condio, normalmente utilizando-se de uma varivel de nmeros inteiros para contagem das
execues.
Sintaxe:
for(<inicializao>;<condio>;<incremento>){
<bloco de cdigos>
}
Observe que a sintaxe do for exige trs parmetros de entrada.

Inicializao: refere-se atribuio de um valor inicial varivel de controle.

Condio: uma condio lgica (usando operadores lgicos) que determina a condio
para que o bloco de cdigo seja executado. Normalmente, essa condio baseada na
varivel de controle.

Incremento: o quanto essa varivel de controle ir crescer a cada iterao do lao for.
Normalmente, a varivel de controle incrementada um nmero a cada iterao, para
isso basta usar o operador de incremento (++).

Exemplo de uso da estrutura for:

Observe no exemplo acima que a varivel de controle declarada na linha 5. Na declarao do for
inicializada com valor 1 e determinado, como condio para que lao continue executando,
que esse nmero seja menor ou igual a 100. No terceiro parmetro foi determinado que o

incremento dessa varivel fosse de 1 a cada iterao. Portanto, a instruo printf que est na
linha 9 dentro do bloco de cdigos do lao for, ser executada 100 vezes, imprimindo o valor da
varivel contador a cada iterao.

Estrutura de repetio while


Outra estrutura de repetio o while (enquanto).
Sintaxe:
while(<condio>){
<bloco de cdigo>
}
Um exemplo do uso do while:

Observe que foi declarada uma varivel char para controle do lao. A cada iterao do lao essa
varivel ir armazenar a resposta do usurio e terminando as instrues dentro do bloco de
cdigo do while (o que no exemplo acima acontece na linha 12) ir retornar na condio e
verificar o novo valor.

Estrutura de repetio do-while


Uma estrutura de repetio que se assemelha muito com o while o do-while. Com a diferena
de que a instruo vem antes da condio. Veja a sintaxe:
do {
<bloco de cdigos>
} while(<condio>);
Veja o mesmo exemplo do while alterado para do-while:

Observe que tambm foi necessria a declarao de uma varivel para controle do lao, mas no
foi necessrio inicializa-la para que entrasse no lao na primeira vez. Isso porque, independente
do valor da varivel de controle o lao ser executado no mnimo uma vez, e ao final ir alterar o
valor dessa varivel de controle (linha 10) e verificar a condio (linha 12).

Comandos continue e break


Dois comandos que ajudam no controle das estruturas de repetio so o continue e o break.
O continue obriga a execuo do lao a avanar para a prxima iterao. J o break encerra a
estrutura do lao independente de a condio ainda no estar satisfeita.
Veja um exemplo:

Observe que o while foi declarado com uma condio que nunca ir mudar, pois o valor da
varivel sim nunca alterado. Mas esse no um lao infinito, pois o controle foi feito com os
comandos continue e break. Nas linhas 13 a 17 est uma estrutura de deciso instruindo que,
caso o usurio digite 1 retorne para o incio da estrutura while (linha 7) e caso contrrio pare a
execuo do while.

10. Bibliotecas teis


As instrues bsicas de uma linguagem nem sempre facilitam a implementao de certas
instrues. Para facilitar existem, na linguagem C, as bibliotecas. Essas podem ser includas no
programa e, atravs de funes prontas, facilitam a realizao de tarefas especficas.
Conforme visto anteriormente, para usar qualquer biblioteca preciso inclu-la no programa da
seguinte forma:
#include <<nome da biblioteca>.h>
Abaixo segue uma lista de algumas bibliotecas teis e suas principais funes.

Biblioteca stdio
uma das principais bibliotecas da linguagem C. Seu nome deriva do ingls, standard inputoutput, ou seja, entrada e sada padro. a biblioteca mais utilizada para comunicao com o
usurio.
Principais funes da stdio
scanf

L os dados digitados no console no formato especificado

printf

Imprime os dados formatados no console

puts

Imprime um texto no console

gets

L um texto digitado no console

putchar

Escreve um caractere no console

getchar

L um nico caractere digitado no console

Biblioteca stlib
a biblioteca padro da linguagem C. Seu nome deriva de standard library em ingls, ou seja,
biblioteca padro. Ela apresenta funes de uso geral.
Principais funes da stlib
atof

Converte string para float

atoi

Converte string para int

strtod

Converte string para double

rand

Retorna um nmero aleatrio

srand

Define a semente para nmeros aleatrios

malloc, calloc e realloc

Aloca memria

free

Libera a memria alocada

exit

Encerra o programa

system

Executa um comando no sistema operacional

Biblioteca math
A biblioteca math, como o prprio nome sugere, auxilia em clculos matemticos mais
avanados.
Principais funes da math
pow

Potncia de um nmero (base elevada ao expoente)

sqrt

Raiz quadrada de um nmero

ceil

Arredonda um nmero para maior

floor

Arredonda um nmero para menor

log

Logaritmo

cos

Cosseno

sin

Seno

exp

Exponencial

Biblioteca ctype
A biblioteca ctype auxilia na manipulao de tipos de dados.
Principais funes da ctype
isalnum

Verifica se o caractere um alfanumrico (letra ou nmero)

isalpha

Verifica se o caractere uma letra (A-Z ou a-z)

isdigit

Verifica se o caractere um dgito (0-9)

islower

Verifica se o caractere uma letra minscula

isupper

Verifica se o caractere uma letra maiscula

tolower

Converte uma letra para o formato minsculo

toupper

Converte uma letra para o formato maisculo

11. Funes
O que so e quando utilizar
Funes so blocos de cdigos isolados e nomeados, que ajudam na organizao do programa.
O uso de funes recomendado para:

Reaproveitamento de cdigos: funes evitam que um bloco de cdigo seja repetido


vrias vezes dentro do mesmo programa.

Facilitar a alterao de uma operao em nico local: a manuteno das operaes


realizadas pela funo realizada em um nico lugar, dentro da funo.

Tornar o cdigo mais compreensvel: um programa mais extenso, quando organizado


corretamente em funes, permite a anlise e compreenso do cdigo fonte em partes
isoladas.

Declarao de funes
A declarao da funo o isolamento de um bloco de cdigo com objetivos especficos.
A sintaxe para declarao de funes :
<tipo de retorno> <nome da funo> (<parmetros >){
<bloco de cdigo>
}

Tipo de retorno: quando a funo executada pode ser desejado alguma resposta, essa
respostada chamada de retorno da funo. Por exemplo, quando uma funo executa
um clculo, normalmente, desejado que ela retornasse o resultado final do clculo; para
isso no momento da declarao deve ser declarado o retorno com o tipo de dado do
resultado.
Observao: utilizado o tipo void quando no esperado nenhum retorno.

Nome da funo: um identificador da funo que est sendo chamada e ser utilizado
no momento da execuo da funo. Para facilitar a compreenso do cdigo, o nome dar
clareza sobre a operao que a funo ir realizar.

Parmetros da funo: so informaes necessrias para que a funo execute a


operao.

Observe que essa a mesma estrutura da declarao da funo main. Porm, alm da funo
main o cdigo pode ser organizado em outras funes.

Exemplo de uma funo simples


void mensagem(){
printf("Estou aprendendo sobre funes.");
}
Observe no exemplo que a funo foi declarada sem nenhum retorno (void) e recebeu o nome
mensagem que ser utilizada para executar todas as instrues que esto dentro do bloco de
cdigos dessa funo. Observe tambm que no passado nenhum parmetro para a funo, ela
imprime sempre a mesma mensagem.
A chamada dessa funo seria a seguinte:
mensagem();
Como a funo no retorna valor e no espera nenhum parmetro a execuo feita atravs do
nome da funo e parnteses (mesmo no tendo parmetros).
No exemplo acima, a cada execuo ser impressa a mesma mensagem.

Exemplo de funo com um parmetro


No exemplo anterior a funo exibia sempre a mesma mensagem. Mas supondo que a cada
execuo seja desejada uma nova mensagem, essa poderia ser passada para funo atravs de
parmetros.
void mensagem(char mensagem[]){
printf("%s", mensagem);
}
Nessa nova implementao da funo ela recebe atravs de parmetros um texto que ser
utilizado na mensagem. Esse texto deve ser passado no momento da execuo da funo.
mensagem("Estou aprendendo sobre parmetros.");
A cada execuo pode ser passado um texto diferente para ser exibido.

Exemplo de funo com vrios parmetros


Em determinados casos a funo pode necessitar de mais de um parmetro, por exemplo, uma
funo que calcule a rea de um retngulo necessita das medidas da largura e da altura. Esses
dois parmetros so declarados na funo separados por vrgula.
void area_retangulo(float largura, float altura){
float area;
area = largura * altura;
printf("A rea do retngulo %5.2f", area);
}
Observe no exemplo acima que a funo foi declarada com o nome area_retangulo e espera
como parmetro dois nmeros necessrios para o clculo da rea. Portanto na execuo da
funo necessrio passar esses dois valores tambm separados por vrgula:
area_retangulo(5, 13);

Exemplo de funo com retorno


Conforme citado anteriormente, na declarao da funo a primeira instruo quanto ao tipo de
retorno. Isso til em casos onde a funo precisa dar uma resposta sobre as operaes
realizadas.
Um exemplo: no tpico anterior criamos uma funo que calculava e exibia na tela a rea de um
retngulo, porm essa funo no seria til caso desejssemos fazer a soma da rea de dois
retngulos. Mas com uma modificao ela pode retornar o valor total da rea calculada para
podermos realizar a soma.
float area_retangulo(float largura, float altura){
float area;
area = largura * altura;
return area;
}
No cdigo acima a funo foi declara com o tipo de retorno float, portanto a linha que exibia o
total foi substituda por uma instruo return que retorna o valor calculado no ponto onde a
funo foi executada.
A chamada da funo tambm devera ser modificada para receber esse retorno.

float area1 = area_retangulo(5, 13);


float area2 = area_retangulo(4, 10);
printf("A rea total %5.2f", (area1 + area2));
Observe que a funo area_retangulo foi executada duas vezes e em cada chamada o retorno da
funo foi armazenado em uma varivel diferente, o que possibilitou a soma total.

Prottipo de funes
O prottipo de uma funo utilizado para indicar, logo no incio do programa, que uma funo
estar declarada mais abaixo. Isso instrui o compilador sobre quais parmetros devem ser
passados para a funo e qual o retorno que pode ser esperado da funo.
A sintaxe para a declarao do prottipo seguinte:
<tipo de retorno> <nome da funo> (<parmetros>);
Por exemplo, o prottipo da funo criada no exemplo anterior seria:
float area_retangulo(float largura, float altura);
Ateno: o prottipo da funo deve ser exatamente igual declarao da funo.

12. Declarao de tipos de dados


Os tipos de dados bsicos da linguagem C (int, float, char) ou a declarao de vetores e matrizes
por vezes pode no facilitar a manipulao dos dados. Por esse motivo existem dois comandos
que auxiliam na criao de tipos de dados especficos. Os principais deles so typerdef e struct.

Definio de tipos de dados (typedef)


O comando typedef permite criar sinnimos para os tipos de dados bsicos existentes na
linguagem C. Sua sintaxe :
typedef <tipo de dado> <novo nome>;
Por exemplo uma aplicao que trabalha com diversos valores monetrios, um tipo de dado pode
ser declarado para valores:
typedef float valor;
Depois de definido esse sinnimo para o tipo de dado, esse pode ser utilizado na declarao de
variveis:
valor valor_compra, valor_venda;

Estrutura de dados (struct)


O comando struct permite criar um conjunto de variveis de diferentes tipos. Sua sintaxe :
struct <nome da estrutura>{
<tipo de dado 1> <nome varivel 1>;
<tipo de dado 2> <nome varivel 2>;
...
<tipo de dado N> <nome varivel N>;
};

Nome da estrutura: um identificador para nos referenciarmos a essa estrutura;

Tipo de dado e nome varivel: a declarao das variveis que fazem parte dessa
estrutura;

Um exemplo de estrutura para armazenar as informaes de um aluno:


struct aluno{
int matricula;
char nome[50];
int idade;
};
Depois de declarada a estrutura, podemos criar a quantidade que for necessria de variveis do
tipo struct aluno. Cada uma ter seus prprios atributos e podemos acess-los atravs do nome
da estrutura.nome da varivel.
struct aluno aluno1, aluno2, aluno3;
aluno1.idade = 18;
aluno2.idade = 21;
aluno3.idade = 20;

Estrutura de dados com definio de tipo


Uma forma de tornar mais simples a declarao de estruturas usar o comando typedef para criar
um sinnimo para a estrutura e assim eliminar a necessidade da palavra struct antes de cada
declarao da estrutura no cdigo.
typedef struct {
int matricula;
char nome[50];
int idade;
} aluno;
Dessa forma a declarao de uma estrutura aluno seria a seguinte:
aluno aluno1;
aluno1.idade = 18;

13. Ponteiros
Quando declaramos uma varivel estamos reservando um espao na memria do computador de
tamanho suficiente para armazenar o tipo de dado desejado. Essa varivel recebe um nome com
qual a manipulamos; mas o computador no manipula os dados atravs desse nome, ele traduz
esse nome em um endereo de memria.
A linguagem C permite declarar variveis que armazenem o endereo de uma varivel na
memria, so os chamados ponteiros.
Ponteiros so variveis que armazem um endereo de memria de outra varivel.

Declarao
Ponteiros so declarados utilizando-se do operador asterisco (*) antes do nome do ponteiro.
<tipo de dado> *<nome do ponteiro>;

Tipo de dado: o tipo de dado da varivel que ir ser apontada.

Asterisco: o que sinaliza que essa varivel ser um ponteiro e no uma varivel comum.

Nome do ponteiro: o nome usado para manipular o endereo de memria. Por padro
se inicia o nome do ponteiro com a letra p, para identificar que se trata de um ponteiro.

Um exemplo de um ponteiro para armazenar o endereo de memria de um nmero inteiro:


int *pNumero;

Inicializao
Quando criados os ponteiros no apontam para nenhum endereo conhecido. Portanto, seu uso
sem a devida inicializao pode acarretar em erros e at danificar parte de outros sistemas que
estejam armazenados na memria.
Para inicializarmos um ponteiro devemos indic-lo qual a varivel queremos apontar:
int numero = 7;
int *ponteiro;
ponteiro = &numero;

Observe o uso do caractere & para referenciar-se ao endereo de memria da varivel numero.
Portanto, a partir dessa inicializao o ponteiroNumero est armazenando o endereo na
memria da varivel numero.
Vejamos uma representao do cdigo acima:
MEMRIA
Endereo

Varivel

Contedo

#2665505

numero

#2665506

ponteiro

#2665505

Na representao acima, o nmero que representa o endereo de memria varia a cada


execuo, pois, definido pelo sistema operacional quando solicitado de um espao na
memria para armazenar um dado.

Acessando o contedo do ponteiro


Os ponteiros nos permitem acessar dois contedos diferentes:
1. O endereo que ele armazena.
2. O contedo do endereo que ele armazena.
Vejamos na prtica:
int numero = 7;
int *ponteiro;
ponteiro = &numero;
printf("Endereo da varivel nmero: %d", ponteiro);
printf("Contedo da varivel nmero: %d", *ponteiro);
Observe no exemplo acima que para recuperarmos o endereo armazenado em um ponteiro,
utilizamos apenas o nome do ponteiro e para recuperarmos o contedo de tal endereo
utilizamos o operador * antes do nome do ponteiro.
Da mesma forma que o valor recuperado, pode ser substitudo:
int numero = 7;
int *ponteiro;
ponteiro = &numero;
printf("Contedo da varivel nmero: %d", numero);

*ponteiro = 8;
printf("Novo contedo da varivel nmero: %d", numero);

Exemplo de uso do ponteiro

Referncias
TENENBAUM, Aaron M. Estruturas de dados usando C.
FEOFILOFF, Paulo. Algoritmos em linguagem C.
BACKES, Andr R. Linguagem C descomplicada.
Site: http://programacaodescomplicada.wordpress.com/apostila/
FEOFILOFF, Paulo. Projeto de Algoritmos em C.
Disponvel em: http://www.ime.usp.br/~pf/algoritmos/
Linguagem C.
Disponvel em: http://linguagemc.com.br/