Você está na página 1de 27

Tutorial de programao em C parte 1

1 Ambiente de desenvolvimento
Aqui darei uma breve explicao de como criar um ambiente de desenvolvimento de
programas em C tanto para usurio do Linux como Windows.
Como primeiro passo crie um diretrio (pasta), como por exemplo TutoriaC, para salvar os
exemplos aqui mostrados uma vez que iremos reusar muitos deles conforme formos
evoluindo.
C uma linguagem compilada, isto quer dizer que aps voc escrever seu programa em
C voc necessita de um programa denominado compilador que ir transformar seu
programa escrito em uma linguagem de alto nvel para uma linguagem de maquina que
a linguagem que o computador entende.
Existem diversos compiladores para C, nesse tutorial iremos usar o GCC que faz parte do
GNU Compiler Collection uma coleo de compiladores criados pelo projeto GNU
(General Public License).
Alm de um compilador voc precisar de um editor de textos para escrever seus
programas e para isso iremos usar o Geany que mais do que um editor de textos sendo
considerada uma IDE (Integrated Development Environment ou Ambiente Integrado de
Desenvolvimento), no vou entrar no assunto sobre o que uma IDE basta voc saber
que o Geany permite alm da edio de seus programas compil-los e execut-los sem a
necessidade de sair da ferramenta o que facilita a criao e depurao dos programas.

1.1 Instalao do GCC e Geany


1.1.1 No Linux
Tanto o GCC como o Geany se encontram na maioria dos pacotes das distribuies
Linux. Irei demonstrar como instal-los nas distribuies Debian e derivados e nas
distribuies Fedora e CentoS derivadas da Red Hat.,
Nas distribuies Debian e derivados voc pode se logar como root ou usar o comando
sudo e simplesmente digitar:
Logado como root: $ apt-get install gcc geany
Usando o comando sudo : $ sudo apt-get install gcc geany
Da mesma forma nas distribuies derivadas da Red Hat como Fedora e Centos:
Logado como root: $ yum install gcc geany
Usando o comando sudo : $ sudo yum install gcc geany
Pronto voc feliz usurio do Linux j tem seu ambiente de trabalho pronto.
1.1.2 No Windows
Siga as instrues do tutorial no link abaixo:
Tutorial instalando o GCC e o Geany no Windows

2- A estrutura de um programa em C
2.1 O primeiro programa
Abaixo o cdigo do seu primeiro programa em C:
/*
Meu primeiro Programa em C
o famoso Ola Mundo
*/
#include <stdio.h>
// Inicio do programa
int main() {
printf("\n Ola Mundo \n\n");
return 0;
}
Quem j aprendeu outra linguagem de computador provavelmente j viu algo parecido,
esse o famoso programa Ola Mundo ou Hello World com o qual a maioria dos autores
comeam a ensinar uma linguagem de computador, ele simplesmente escreve no terminal
Ola Mundo.
Uma coisa importante em ressaltar e a identao do cdigo ou tabulao no cdigo acima
voc deve ter reparado, se no for cego, que o
Feitas as devidas apresentaes vamos dissecar a estrutura do programa linha por linha:
Linha 1 /*
Inicia um espao para comentrios de mltiplas linhas, lembrando que um bom
programador sempre comenta seus cdigos para que no futuro outros
programadores e mesmo voc possam entender o que foi feito.
Linha 2 e 3 Meu primeiro Programa em C
o famoso Ola Mundo
Este o nosso cometrio de duas linhas.
Linha 4 */
Fecha o espao de cometrios
Linha 5 #include <stdio.h>
A instruo include precedida de cerquilha (#) solicita ao compilador para incluir o
arquivo de cabealho stdio.h no programa. Os arquivos com extenso .h sendo o
h de header so conhecidos como arquivos de cabealho sua prerrogativa

disponibilizar outras funes que no se encontram no programa para o prprio.


stdio.h faz parte das bibliotecas definidas no padro C ANSI (American National
Standards Institute) adotado pela maioria dos compiladores, ela contem funes
pr-definidas para cuidar de entradas e sadas dos programas em C. Iremos ver ao
longo desse tutorial outras importantes bibliotecas definidas no padro C ANSI.
Linha 7 // Inicio do programa
Duas barras servem para inserir um comentrio de uma nica linha.
Linha 8 int main() {
onde nosso programa comea. A funo main obrigatria em C pois a
primeira chamada de um programa em C para a funo main e dentro dela que
voc coloca o seu cdigo e as chamadas as outras funes de um programa em C.
Se no existir uma funo main no seu programa o C no saber por onde
comear a executar o programa. O abre e fecha parnteses vazio depois da
declarao de main indicam que ela no recebe nenhum parmetro (irei abordar
parmetros melhor quando entrarmos em funes em C).
O int na frente da funo main indica que ela deve retornar um valor do tipo
inteiro, devendo retornar zero se tudo ocorrer bem ou outro nmero caso o
programa encerre de forma inesperada.
Aqui vou abrir um pequeno parnteses para esclarecer o que uma duvida
comum nos iniciantes em programao por que main deve retornar um valor ?
essa uma caracterstica do compilador GCC que obriga a main a retornar um
valor inteiro sem o que ele iria retornar um erro na compilao j outros
compiladores como o CL do Visual Studio permitem que voc no retorne nenhum
valor aplicando void antes de main (iremos ver o tipo de retorno void em funes
mais saiba que e um tipo de dado que representa nada), porm, exite uma logica
no GCC, lembre-se que um programa em C pode ser chamado pelo sistema
operacional ou por um outro programa qualquer nesse caso ele deve retornar um
valor nem que seja para indicar o sucesso de sua execuo.
A chave de abertura ({) aps main() indica o inicio do bloco de instrues da
funo main que deve ser encerrado por uma chave de fechamento (}).
Linha 10 printf(\n Ola Mundo \n\n);
Antes de analisamos a instruo acima vale ressaltar a identao do cdigo ou
tabulao. No cdigo acima voc deve ter reparado, se no for cego, o recuo dado
em relao a linha 8 dessa nossa nova instruo. de boa praxe em programao
sempre recuar as linhas dentro de um bloco de instrues isso torna o seus
programas mais legveis e organizados. Em C essa identao costuma ser de 4
colunas ou espaos em branco.
A funo printf() faz parte da biblioteca stdio.h e serve para imprimir algo no
terminal nesse caso ela recebe como parmetro uma cadeia de caracteres formada
pelo caractere de nova linha representado por \n, seguido de um espao e da frase
Ola Mundo e novamente um espao e dois caracteres de nova linha. Repare que
tudo est dentro de parenteses duplos, est a forma de representar uma cadeia
de caracteres em C.

Ao final da funo printf() temos um ponto e virgula, ele serve para encerrar
uma instruo, ele s no usado depois de instrues precedidas de cerquilha (#)
como include. Ento lembre-se Toda e qualquer instruo em C deve terminar
com um ponto e virgula.
Linha 12 return 0;
a ltima instruo da funo main() indicando que ela esta retornando um
valor zero ou seja que nossa funo main() terminou sem maiores problemas.
Linha 14 }
Indica o fim do nosso bloco de instrues.
Como exerccio voc pode:
Criar um programa que escreve na primeira linha Meu Primeiro e na segunda linha
Programa em C;

2.1 Criando, compilando e executando o primeiro programa


Agora que j entendemos o programa vamos execut-lo abra-o Geany e digite o
programa.
Agora na sua tela de computador voc deve ter algo semelhante com a figura 1 caso
Linux, ou da figura 2 caso Windows.

Figura 1

Figura 2

Clique em salvar (terceiro boto na barra de ferramentas, circulado com verde nas figuras
1, 2 e 3) e salve o programa com o nome de alomundo.c no diretrio (pasta) que voc
criou no inicio do tutorial, ateno no esquea de colocar o sufixo .c depois do nome do
arquivo se no o Geany no saber com que tipo de arquivo esta lidando.
Agora o texto do seu programa deve aparecer coloridinho e alguns cones que estavam
esmaecidos na barra de ferramenta tambm devem ter passado a coloridos, como na
figura 3 abaixo, esses cones servem para construir o seu programa execut-lo .

Figura 3

Na figura 3 acima o boto circulado por vermelho e o construtor de seu programa clique
nele e repare que a janela debaixo do Geany (figura 4) mostra uma mensagem indicando
o status da compilao se tudo correu bem voc vera uma mensagem similar com a
abaixo:
gcc -Wall -o "alomundo" "alomundo.c" (no diretrio: /home/francisco/TutorialC)
Compilao terminada com sucesso.

Figura 4

Caso tenha ocorrido um erro durante compilao verifique a digitao.


Com o programa j compilado clique no boto executar aquele circulado em amarelo na
figura 3 (ela aparece com o desenho de engrenagens), a tela do terminal deve se abrir e
aparecer escrito Ola Mundo. Depois de apreciar sua obra pressione uma tecla qualquer
para fechar o terminal.
Pronto agora voc j sabe como criar, compilar e executar um programa com o Geany.

2.2 Corrigindo acentuao de caracteres no Windows


Aqui vou dar uma dica para usurios do Windows que tiverem problemas com acentuao
das palavras na execuo dos programas ficarem muito incomodados com isso. Crie a
sua estrutura de programa da seguinte maneira:
/*
Meu Programa em C
*/
#include <stdio.h>

#include <locale.h>
// Inicio do programa
int main() {
setlocale(LC_ALL, Portuguese);
codigos aqui
}
Aqui eu inclui um novo arquivo de cabealho locale.h e depois dentro do bloco de
instruo de main() inclumos a seguinte linha:
setlocale(LC_ALL, Portuguese);
Agora quando for salvar seus programas certifique-se de estar usando a codificao de
caracteres ANSI ou ISO-8859-1 no Geany v em Documento Definir Codificao
Europeu Ocidental e selecione Ocidental (ISO-8859-1) pronto seu acentos iro aparecer
de forma correta.
De agora em diante deixarei nas suas mos corrigir o problema de caracteres no
Windows.

3 - Tipos de dados em C
A linguagem C apresenta cinco tipos de dados bsicos:
inteiro, caractere, ponto flutuante e ponto flutuante de dupla preciso
representados nos programas como:
int, char, float e double.
Alm dos tipos bsicos C possui os qualificadores:
signed, unsigned, short e long
Os qualificadores signed e unsigned, servem para definir se a faixa dos nmeros ira
incluir nmeros com sinal ou no. Eles s podem ser empregados com os tipos int e char
visto que o C trata os tipo caracteres como um nmero inteiro. Como signed define os
nmeros com sinal ele e redundante e seu uso e desaconselhado uma vez que a
declarao int por padro assume os nmeros com sinal. A grande diferena em usar
unsigned que como computadores usam o bit mais significativo (bit de valor mais alto)
como marcador de sinal os valores da faixa de unsigned podem atingir nmeros inteiros
sem sinal em uma faixa maior do que signed.
Os qualificadores short e long servem para prover tamanhos diferentes nos tipos bsicos
nas maquinas onde isso possvel.
Todos esses qualificadores podem ser usados com os tipos int e char, fora esses tipos o
qualificador long pode ser usado com o tipo double.
Como estes tipos esto intimamente ligados a maquina em que se est trabalhando aqui
irei mostrar uma tabela para estes valores em um PC 64/32 bits.
Tipo

Bytes

Faixa de Valores

char

-128 a 127

unsigned char

0 a 255

int

2.147.483.648 a 2.147.483.647

unsigned int

0 a 4294967295

short int

-32.768 a 32.767

unsigned short int

0 a 65.535

long int

2.147.483.648 a 2.147.483.647

unsigned long int

0 a 4.294.967.295

float

seis dgitos de preciso

double

dez dgitos de preciso

16 (64) ou 8 (32)

Dez dgitos de preciso

long double

Tabela 1

3 - Variveis e operadores aritmticos em C


3.1 - Variveis
Variveis em C devem comear com uma letra ou um sublinhado (_) seguido de letras
sublinhados e nmeros. Exemplos de nomes de variveis:
peso, altura2, v2t, somA, Soma, xyz_21, ir_depois
Devo lembrar que C case sensitive ou seja ele diferencia maisculas e minusculas,
ento no caso acima somA e Soma so duas variveis diferentes.
Por motivos bvios no se deve dar a variveis nomes de palavras reservadas em C.
Alguns exemplos de palavras reservadas esto representados na tabela 2 abaixo:
auto

break

case

char

continue

do

double

define

else

enum

float

for

goto

if

int

long

return

short

sizeof

static

struct

union

unsigned

void

while

Tabela 2

3.2 - Operadores aritmticos


Em C existem alm dos quatro operadores aritmticos bsicos da matemtica outros trs
operadores: um para o incremento de um outro para o decremento de um e o operador de
resto de uma diviso, apresentados na tabela 3 abaixo:
Operador aritmtico

Bytes

Realiza a soma de dois valores

Realiza a subtrao de dois valores

Realiza a multiplicao de dois valores

Realiza a diviso de dois valores

Retorna o resto de uma diviso por inteiros

++

Incremento

--

Decremento
Tabela 3

Alm dos operadores acima temos o operador de atribuio (=) sua funo atribuir o
valor da expresso que se encontra do seu lado direito a uma varivel ou ponteiro (don't
worry be happy) que deve estar no seu lado esquerdo.
E de praxe em C escrever certas atribuies de maneira simplificada como nos exemplos
da tabela 4 abaixo:
Atribuio

Operao equivalente

x += y

x=x+y

x -= y

x= x - y

x *= y

x=x*y

x /= y

x=x/y
Tabela 4

Exemplo do operador resto:


x = 10 % 7
Neste caso x recebe o valor 3 ou seja o resto da diviso de 10 por 7, salientando que o
uso do operador resto s pode ocorrer entre nmeros do tipo inteiro.
Exemplos de incremento e decremento:
x = 10;
x++;
Aps a aplicao do operador de incremento a varivel x agora vale 11.
Exemplo de decremento:
y = 9;
y--;
Aps a aplicao do operador de decremento a varivel y agora vale 8.
Quando usamos os operadores de incremento e decremento o lugar onde ele colocado
ira influenciar no resultado de uma atribuio, exemplo:
x = 10;
y = x++;
No caso acima apesar da varivel x ter tido seu valor alterado para 11 a varivel y recebe
o valor 10 pois a operao de incremento foi realizada depois da atribuio. Para que a
varivel y recebesse 11 como valor deveramos realizar a operao de decremento antes
da atribuio:
x = 10;
y = ++x;
Agora sim a varivel y recebe o valor 11.
No tente aplicar os operadores de incremento ou decremento diretamente a
valores como por exemplo:
x = ++11;
Vamos criar um programa para ver os operadores resto, incremento e decremento em

ao abra-o Geany e digite o cdigo abaixo e salve como operadores.c:


/**
* Exemplo dos operadores
* resto, incremeto e decremento
*/
#include <stdio.h>
int main() {
int x;
int y;
x = 10 % 7;
printf("\nvalor do resto da diviso0 de 10 por 7 : %d\n", x);
x = 10;
++x;
printf("\nx era igual a 10 o valor de x depois do incremento : %d\n", x);
y = 9;
--y;
printf("\ny era igual a 9 o valor de y depois do decremento : %d\n\n", y);
x = 10;
y = x++;
printf("\nO valor de x depois do incremento : %d\n", x);
printf("\nmas valor que y recebeu de x : %d\n\n", y);
x = 10;
y = ++x;
printf("\nO valor de x depois do incremento : %d\n", x);
printf("\ne agora sim y : %d\n\n", y);
return 0;
}
Analisando o programa operadores.c
Logo depois de iniciarmos o bloco de declaraes da funo main() a primeira coisa que
fizemos foi declarar as variveis que fazem parte do programa, lembre-se toda a varivel
tem que ser declarada antes de ser utilizada pelo programa e o ideal e que seja logo no
inicio do programa pois facilita a legibilidade e entendimento do programa.
Quando declaramos as variveis temos o seu tipo de dado precedendo o nome da
varivel. Em C fundamental que voc estabelea a qual tipo de dado a varivel
pertence.
A nossa funo printf recebe agora dois parmetros a sequencia de caracteres a ser
imprimida e a varivel x ou y. Alm disso aqui nos inserimos um novo operador %d
dentro da sequencia de caracteres ele um operador de converso pois a funo printf
s possibilita a escrita de caracteres no terminal tanto o valor armazenado na varivel x
quanto y do tipo inteiro ento temos que incluir dentro da cadeia de caracteres o
operador de converso para que ele converta o valor do tipo inteiro da varivel em uma
sequencia de caracteres numricos que possam ser usados pela funo printf para

imprimi-los no terminal.
Aps a execuo do programa a seguinte sada deve aparecer no terminal:

Figura 5

3.3 - Operadores aritmticos e ordem de precedncia


A ordem de precedncia dos operadores e dada na Tabela 3 sendo os operadores no
inicio da tabela os de maior precedncia e os de baixo de menor precedncia:
Operador aritmtico
++ --

incremento e decremento (maior precedncia)

* /%

multiplicao diviso e resto

++=, -=, *=, /= e =

soma e subtrao
Atribuies (menor precedncia)
Tabela 5

Alm da tabela de precedncia acima os operadores aritmticos de mesma precedncia


so avaliados da esquerda para a direita ou o que estiver mais a esquerda e tiver a
mesma precedncia do mais a direita realizado primeiro.
Um exemplo de precedncias passo a passo:
x = 3 + 4 20 / 4 + 2 * 3;
no primeiro passo a operao realizada a diviso por ser o operador de
maior precedncia mais a esquerda
x = 3 + 4 5 + 2 * 3; (resultado do primeiro passo)
no segundo passo a operao realizada e a multiplicao por ser o operador de
maior precedncia
x = 3 + 4 5 + 6; (resultado do segundo passo)
no terceiro passo a operao realizada e a soma de 3 + 4 por ser o operador de
maior precedncia mais a esquerda

x = 7 5 + 6; (resultado do terceiro passo)


no quarto passo a operao realizada e a subtrao de 7 - 5 por ser o operador de
maior precedncia mais a esquerda
x = 2 + 6; (resultado do quarto passo)
e por fim o quinto e ltimo passo a soma de 2 + 6 atribuindo o valor 8 a varivel x
x = 8; (resultado do quinto passo)
Em C as precedncias podem ser alteradas pelo uso de parnteses.
O mesmo exemplo anterior s que agora as ordens de precedncias so alteradas pelo
uso do parnteses:
x = 3 + (4 20) / 4 + 2 * 3;
no primeiro passo a operao realizada a subtrao de 4 - 20 por se encontrar
entre parnteses
x = 3 - 16 / 4 + 2 * 3; (resultado do primeiro passo)
no segundo passo a operao realizada e a diviso por ser o operador de
maior precedncia mais a esquerda
x = 3 4 + 2 * 3; (resultado do segundo passo)
no terceiro passo a operao realizada e a multiplicao por ser o operador de
maior precedncia
x = 3 4 + 6; (resultado do terceiro passo)
no quarto passo a operao realizada e a subtrao de 3 - 4 por ser o operador de
maior precedncia mais a esquerda
x = -1 + 6; (resultado do quarto passo)
e por fim o quinto e ltimo passo a soma de -1 + 6 atribuindo o valor 5 a varivel x
x = 5; (resultado do quinto passo)
O programa a seguir realiza as operaes mostradas acima crie ele e salve-o com o
nome de opprec.c e como exerccio procure alterar ou inserir parnteses e veja os
resultados obtidos. Um lembrete x do tipo inteiro e todos os nmeros usados so
inteiros ento na diviso de 20 por 6 por exemplo o numero e truncado ou seja tudo que
vem depois da virgula e desprezado.
/**
* Exemplo de precedncia
* dos operadores
*/
#include <stdio.h>
int main() {
int x;
// Primeiro exemplo
x = 3 + 4 - 20 / 4 + 2 * 3;
printf("\nO valor de x : %d\n", x);

x = 3 + (4 - 20) / 4 + 2 * 3;
printf("\nO valor de x : %d\n", x);
return 0;
}

4 Usando as funes printf e scanf


Como j vimos anteriormente a funo printf serve para imprimir uma cadeia de
caracteres no terminal. Podemos dizer que essa funo recebe um ou mais parmetros
sendo o primeiro uma a cadeia de caracteres e o restante expresses que podem ser
variveis ou expresses realmente como por exemplo x + 2 onde x uma varivel j
definida com um valor. Veja um exemplo de printf:
printf(um numero %d e outro numero %d, x, x + 2)
Onde como vimos %d um operador de converso usado para transformar um valor
inteiro em uma sequencia de caracteres numricos sendo que cada operador de
converso deve corresponder a uma expresso na sequencia em que surgem dentro da
funo, no caso acima o primeiro %d corresponde ao valor de x, e o segundo
corresponde ao valor resultante de x + 2. Abaixo segue a tabela 6 com os operadores de
converso:
operador

converso

%c

caractere

%d

inteiros com sinal

%i

inteiros com sinal

%f

ponto flutuante

%lf

ponto flutuante de dupla preciso

%s

cadeia de caracteres (string)

%p

ponteiro

%e

Notao cientifica com e minusculo ex: 1.243255e+22

%E

Notao cientifica com e minusculo ex: 3.454353E-05

%o

octal

%x

Hexadecimal sem sinal com letras minusculas ex: f2

%X

Hexadecimal sem sinal com letras maisculas ex: C3

%g

Usa %e ou %f o que for menor

%G

Usa %E ou %f o que for menor

%%

Escreve o simbolo %
Tabela 6

Alm disso temos os caracteres que no possuem representao no teclado e portanto


so apresentados por uma barra invertida seguida de um caractere como \n cujo
significado e o caractere de nova linha (new line) outra representao em que a barra
invertida usada e no escape de caracteres como aspa dupla () que devem ser
escapados para no criarem problemas na representao de uma cadeia de caracteres.
Abaixo na tabela 6 representaes e seus significados:

Representao

Significado

\b

Backspace - retrocesso do cursor em um caractere ()

\f

Form feed - salto da pgina

\n

New Line - Insere uma nova linha

\r

Carriege Return - retrocede o cursor para o inicio da linha

\t

Tab - Tabulao horizontal

Aspa dupla

\'

Aspa simples

\0

Caractere nulo - corresponde ao final de uma string

\\

Barra invertida

\a

Beep - emite um sinal de alerta


Tabela 7

A funo scanf basicamente o oposto a funo printf, ela l caracteres a partir do


terminal e os transforma em valores que sero atribudos a variveis, um exemplo da
funo scanf:
float x;
int y;
scanf(%f %d, &x, &y);
No exemplo acima o primeiro parmetro %f %d da funo scanf faz o papel inverso do
que realiza na funo printf os operadores de converso %f e %d iro converter
caracteres vindos do terminal para respectivamente um nmero de ponto flutuante e um
nmero inteiro, estes valores sero atribudos aos parmetros seguintes. Nos parmetros
seguintes da funo scanf aparece um novo simbolo o especificador unrio & que vem a
frente das variveis x e y este especificador indica que estamos lendo os valores vindos
do terminal para dentro do endereo apontado pela variveis x e y, mais adiante quando
virmos ponteiros esse especificador ficar mais claro no momento basta lembrar de
colocar o especificador & na frente das variveis que so lidas pelo terminal.
Vamos criar um programa que para converter a temperatura em Celsius para Fahreinheit
e ver a funo scanf em ao. Digite o cdigo abaixo no Geany salve-o como celsius.c
ao executar o programa ele a sada deve ser semelhante a da figura 6.
/**
* Conversor de Celsius para Fahrenheit
*/
#include <stdio.h>
int main() {
float celsius, fahr;
printf("\nEntre com a temperatura em celsius: ");
scanf("%f", &celsius);
fahr = 32.0 + ((9.0 / 5.0) * celsius);
printf("\nCelsius\tFahrenheit\n");
printf("%.2f\t%.2f\n", celsius, fahr);

return 0;
}

Figura 6

Vamos analisar o nosso conversor de Celsius para Fahrenheit:


Agora na nossa equao colocamos os nmeros com um ponto do decimal, isso
necessrio para indicar para o compilador que se trata de nmeros com ponto flutuante se
no o compilador iria tratar os nmeros com inteiros e o resultado no sairia como o
esperado pois ao dividir 9 por 5 ao invs de 1.8 obteramos o resultado truncado para 1 e
nossa converso iria resultar em um valor bem abaixo do esperado. Experimente tirar o
ponto decimal dos nmeros dentro da equao e compare com os resultados obtidos
anteriormente. No v fazer que nem o boco aqui que uma vez em uma demonstrao
esqueceu de recompilar a equao e os resultados continuavam dando os mesmos.
Agora na funo printf inserimos outra novidade que a formatao %.2f essa uma
formatao para uma sada com s duas casas decimais em nmeros com ponto
flutuante. Abaixo na tabela 7 como formatar a sada de nmeros inteiros e com ponto
flutuante:
operador

converso

%nd

Formata um inteiro com n caracteres de sada de se n for maior que o


nmero de sada o restante sera preenchido com espaos a esquerda
ex: %6d a sada no numero 1060 fica __1060 onde _ e um espao
em branco

%0nd

Formata a sada de um inteiro com n caracteres de sada de se n for


maior que o nmero de sada o restante sera preenchido com zeros a
esquerda ex: %6d a sada no numero 1060 fica 001060

%nf

Formata ponto flutuante com pelo menos n caracteres

%n.kf

Formata ponto flutuante com pelo menos n caracteres e k caracteres


depois do ponto decimal

%n.f

Formata ponto flutuante com pelo menos n caracteres e nenhum


caractere depois do ponto decimal

%.nf

Formata ponto flutuante com pelo menos n caracteres depois do

ponto decimal
%.f

Formata ponto flutuante sem nenhum caractere depois do ponto


decima
Tabela 7

5 Estruturas de Controle
5.1 Operadores relacionais e lgicos
Como qualquer linguagem de programao C possui estruturas capazes de tomarem
decises durante a execuo do programa travs de expresses condicionais que
retornam verdadeiro ou falso com base nos operadores relacionais (tabela 8) e
operadores lgicos (tabela 9).
Operador relacional

Descrio

>

Maior que

>=

Maior ou igual

<

Menor que

<=

Menor ou igual

==

Igual

!=

Diferente
Tabela 8

Operador logico

Descrio

Ao

&&

AND (E)

Retorna falso se uma das condies for


falsa

||

OR (OU)

Retorna falso somente se ambas as


condies forem falsas

NOT (NO)

Usado para alterar a condio se ela for


verdadeira passa a ser falsa e vice-versa
Tabela 9

A funo dos operadoras lgicos de comparar duas expresses e verificar se esta


comparao verdadeira ou falsa exemplo:
(10 - 9) < (12 - 8)
verdadeira pois (10 - 9) igual a 1 que (12 - 8) igual a 2 ento a expresso (10 -9)
menor que (12 -8)
(4 - 3) == 5
falsa pois 1 no igual a 5
Os operadores lgicos concatenam uma serie de expresses com os operadores
relacionais e verificam o resultado. A tabela 10 mostra os resultados dessas
concatenaes considerando P e Q duas comparaes relacionais cuje os resultados
podem ser V de verdadeiro ou F de falso:
P

P && Q

P || Q

!P

Tabela 10

Os operadores lgicos tambm possuem uma ordem de precedncia sendo que em


primeiro lugar sua ordem de precedncia menor que as dos operadores aritmticos,
abaixo na tabela 11 as ordens de precedncia de todos os operadores vistos at aqui,
sendo os na parte de cima da tabela de maior precedncia e os de baixo de menor
precedncia
Operador
++ --

incremento e decremento (maior precedncia)

* /%

multiplicao diviso e resto

+<, >, >=, \<=, ==, !=


!

soma e subtrao
operadores relacionais
NOT (NO)

&&

AND (E)

||

OR (OU)

+=, -=, *=, /= e =

Atribuies (menor precedncia)


Tabela 11

Analisando uma operao com operadores lgicos, relacionais e aritmticos de acordo


com a precedncia:
4 - 3 == 5 || (10 - 9) < 12 8 && !(10 < 12)
no primeiro passo fazemos as operaes aritmticas que so as de maior precedncia:
1 == 5 || 1 < 4 && !(10 < 12)
aqui realizamos a operao relacionais e substituindo valores por F e V:
1 == 5 Falso (F)
1 < 4 Verdadeiro (V)
10 < 12 Verdadeiro (V)
F || V && !V
Agora pela tabela a operao logica ! (NOT) tem precedncia sobre as outras, aplicando o
NOT(!) temos ento que o valor passa de verdadeiro para falso:
F || V && F
Aproxima operao lgica de acordo com nossa tabela && (AND) conectando um
verdadeiro com um falso resultando em um falso:
F || F
Por fim temos o operador lgico || (OR) conectando um falso com um falso resultando em
um falso:
F

A nossa operao ento resulta em falso.

5.1 Estruturas de deciso if-else


A primeira estrutura de deciso que iremos analisar o comando if que significa se em
portugus sua forma dada no exemplo abaixo:
if (expresso_condicional) {
alguns cdigos aqui
}
continua o programa
O seu significado bem simples se o que estiver na expresso condicional for verdadeiro
faa o que se encontra dentro do bloco de instrues, lembre que o abra e fecha ({)
chaves (}) marcam o inicio e fim de um bloco de instrues, se for falso ele pula esse
bloco de instrues e passa para a prxima instruo do programa. Caso o if abranja uma
nica de instruo voc pode ignorar as chaves.
If (x < 0)
printf(x menor que zero);
outros cdigos aqui
O programa media1.c abaixo faz um pequeno teste para verificar se um aluno vai prestar
exame final ou no de acordo com sua media:
/**
* Programa Media
*/
#include <stdio.h>
int main() {
float nota1, nota2, media;
printf("\nEntre com a primeira nota: ");
scanf("%f", &nota1);
printf("\nEntre com a segunda nota: ");
scanf("%f", &nota2);
media= (nota1 + nota2) / 2;
if (media >= 7)
printf("\nAluno aprovado\n");
if (media < 7)
printf("\nAluno em prova final");
return 0;
}
Acompanhando o comando if temos o else que significa se no em portugus. Uma
estrutura de comando if -else vista abaixo:
if (expresso_condicional) {
alguns cdigos aqui

} else {
outros cdigos aqui
}
outros cdigos aqui
Nessa estrutura se a expresso condicional for verdadeira executado o cdigo dentro
bloco de instrues depois do if se no executado o cdigo que se encontra dentro do
bloco de instrues depois de else.
O uso de if-else permite uma melhoria significativa em muitos programas uma vez que
precisamos analisar uma nica expresso condicional para resolver um problema.
Com o uso do if-else vamos alterar nosso programa media.c para torn-lo mais eficaz e
simples:
/**
* Programa Media
*/
#include <stdio.h>
int main() {
float nota1, nota2, media;
printf("\nEntre com a primeira nota: ");
scanf("%f", &nota1);
printf("\nEntre com a segunda nota: ");
scanf("%f", &nota2);
media= (nota1 + nota2) / 2;
if (media >= 7)
printf("\nAluno aprovado\n");
else
printf("\nAluno em prova final");
return 0;
}
Em muitos programas teremos que avaliar mais de uma estrutura de deciso para
obtermos a resposta ao problema. Por exemplo no caso do programa media.c acima
poderamos ter uma outra condio a de que alunos com media menor 3 estariam
automaticamente reprovados, nesse caso a nossa estrutura de decises anterior usando
o else se tornaria ineficaz.
Uma das maneiras para solucionar o problema do nosso programa media.c para a nova
condio imposta ficaria da maneira abaixo:
/**
* Programa Media
*/
#include <stdio.h>
int main() {
float nota1, nota2, media;

printf("\nEntre com a primeira nota: ");


scanf("%f", &nota1);
printf("\nEntre com a segunda nota: ");
scanf("%f", &nota2);
media= (nota1 + nota2) / 2;
if (media >= 7)
printf("\nAluno aprovado\n");
else {
if (media < 3)
printf("\nAluno reprovado\n");
else
printf("\nAluno em prova final");
}
return 0;
}
A estrutura acima conhecida como escada if-else-if devido a sua aparncia. Se voc
seguir as boas praticas de programao e recuar seus cdigos para mant-los legveis e
organizados essa estrutura pode se tornar excessivamente profunda, por isso C
possibilita uma outra forma para se escrever uma escada if-else-if apresentada abaixo:
if (expresso_condicional) {
alguns cdigos aqui
} else if (expresso_condicional) {
outros cdigos aqui
} else if (expresso_condicional) {
outros cdigos aqui
} else if (expresso_condicional) {
outros cdigos aqui
..
} else {
outros cdigos aqui
}
continua o programa
Com isso podemos reescrever nosso programa media.c da seguinte forma:
/**
* Programa Media
*/
#include <stdio.h>
int main() {
float nota1, nota2, media;
printf("\nEntre com a primeira nota: ");
scanf("%f", &nota1);
printf("\nEntre com a segunda nota: ");

scanf("%f", &nota2);
media= (nota1 + nota2) / 2;
if (media >= 7)
printf("\nAluno aprovado\n");
else if (media < 3)
printf("\nAluno reprovado\n");
else
printf("\nAluno em prova final");
return 0;
}
Para encerrarmos o assunto sobre if-else vale dizer que muitas linguagens de
programao apresentam um tipo de dado especifico para os resultados das expresses
condicionais chamado de boolenao normalmente definidos como TRUE (true) e FALSE
(false), mas, como vimos C no possui esse tipo de dados, para C o resultado das
expresses condicionais so 0 (zero) para falso e 1 (um) para verdadeiro. Vamos mais
alm qualquer coisa que tenha um valor diferente de zero em C considerado verdadeiro
isso pode simplificar muitos testes condicionais
Note ento que podemos substituir nossa expresso condicional por qualquer expresso
em C ento por exemplo se x uma varivel com um valor definido ento o teste abaixo
perfeitamente valido:
if (x)
printf(x diferente de zero);
else
printf(x igual zero);

5.2 O operador ternrio ?


O operador ternrio ? uma alternativa a uma estrutura if-else simples, sua estrutura
mostrada abaixo:
y = x > 7 ? 2 : 10;
Na estrutura acima se x for maior que 7 ento y igual a 2, se no ento y igual a 10.
Uma forma muito usada dessa estrutura mostrada abaixo:
y = x + 2 > 7 ? x : 10;
Aqui se x + 2 for maior que 7 ento y recebe o valor de x se no y recebe 10
O programa divnum.c a seguir garante que no haver uma operao de diviso por zero
entre dois nmeros.
/**
* Dividir dois nmeros
*/
#include <stdio.h>
int main() {
float x, y, z;
printf("\nDigite dois numeros: ");

scanf("%f %f", &x, &y);


z = y ? x/y : 0;
if(z)
printf("\nO resultado da diviso : %.2f\n", z);
else
printf("\nerro diviso por zero\n");
return 0;
}

5.3 Estruturas de deciso switch case


A estrutura de deciso com o switch testa uma expresso contra uma lista de nmeros
inteiros ou de caracteres uma vez que C trata o caractere como um inteiro. A sua forma
geral :
switch (expresso) {
case constante1 :
sequencia de cdigos
break;
case constante2 :
sequencia de cdigos
break;
case constante3 :
sequencia de cdigos
break;
default:
sequencia de cdigos
}
Quando o switch encontra o valor da expresso dentro de uma instruo case ele
realiza a sequencia de cdigos logo aps case at encontrar uma instruo break,
quando encontra a instruo break o programa sai do switch e volta ao programa
principal. Caso no encontre nenhum valor correspondente em um case ento
executada a instruo depois de default, no caso default opcional e se no estiver
presente se no existir uma opo valida nenhuma sequencia de cdigos realizada.
Vamos criar o programa calculadora.c uma simples calculadora em C conforme abaixo:
Aviso em C um caractere deve ser colocado em aspas simples(') aspas duplas ()
so usadas para uma cadeia de caracteres exemplo: 'c' um caractere e ac cadeia
de caractere
/**
* Programa Calculadora C
*/
#include <stdio.h>
int main() {
char c;
double x, y;
printf("\n\tCalculadora C\n");

printf("\n\tEscolha uma das operaes abaixo\n");


printf("\n\t(+) Soma");
printf("\n\t(-) Subtrao");
printf("\n\t(*) Multiplicao");
printf("\n\t(/) Diviso\n");
printf("\n\tEntre com a operao desejada: ");
scanf("%c", &c);
printf("\tEntre com o primeiro nmero: ");
scanf("%lf", &x);
printf("\tEntre com o segundo nmero: ");
scanf("%lf",&y);
switch (c) {
case '+':
printf("\n\tO resultado : %.4lf\n", x + y);
break;
case '-':
printf("\n\tO resultado : %.4lf\n", x - y);
break;
case '*':
printf("\n\tO resultado : %.4lf\n", x * y);
break;
case '/':
if(y)
printf("\n\tO resultado : %.4lf\n", x / y);
else
printf("\n\terro diviso por zero\n");
break;
default:
printf("\n\nVoc no escolheu nenhuma operao valida\n");
}
return 0;
}
O programa vogal.c abaixo verifica se foi digitada uma vogal diz qual vogal foi digitada,
ele de uma nulidade incrvel, mas, serve para esclarecer uma caracterstica de switch
importante.
/**
* Programa Vogal
*/
#include <stdio.h>
int main() {
char c;
printf("\nEntre comuma letra: ");
scanf("%c", &c);
switch (c) {

case 'a':
case 'A':
printf("\nO voc digitou a vogal A");
break;
case 'b':
case 'B':
printf("\nO voc digitou a vogal B\n");
break;
case 'e':
case 'E':
printf("\nO voc digitou a vogal E\n");
break;
case 'i':
case 'I':
printf("\nO voc digitou a vogal I\n");
break;
case 'o':
case 'O':
printf("\nO voc digitou a vogal O\n");
break;
case 'u':
case 'U':
printf("\nO voc digitou a vogal U\n");
break;
default:
printf("\n\nVoc digitou uma consoante\n");
}
return 0;
}

5.4 O lao while


Acima vemos a estrutura do comando while:
while (expresso) {
cdigos aqui
}
continua o programa
O comando while verifica a expresso dentro do parnteses enquanto ela for
verdadeira os cdigos dentro do bloco de instrues do comando so executados at que
a expresso se torne falsa.
A melhor forma de entender o comando while atravs de um exemplo, por isso abra o
nosso programa celsisu.c e vamos modific-lo para que ele crie uma tabela de converso
das temperaturas de Celsius para Fahrenheit de 0 at 100 em intervalos de 10 em 10 (0,
10, 20 100).
Abaixo no programa modificado voc pode ver que inicializamos a varivel celsius junto
com sua declarao com o valor 0.0 e depois vamos incremento seu valor de 10 em 10
dentro co bloco de instrues do while que verifica a cada lao a condio celsius <=
100 quando a condio se torna falso, no caso quando celsius passa a valer 110 ele pula
o bloco de instrues e volta ao programa principal. Repare que a expresso do while
deve ser cuidadosamente escolhida para evitar um lao infinito (loop infinito), no caso

por exemplo se errarmos a digitao e ao invs de 100 digitssemos -100 o programa


nunca terminaria pois a condio celsius <= -100 seria sempre verdadeira.
/**
* Conversor de Celsius para Fahrenheit
*/
#include <stdio.h>
int main() {
float celsius = 0.0, fahr;
printf("\nCelsius\tFahrenheit\n");
while (celsius <= 100) {
fahr = 32.0 + ((9.0 / 5.0) * celsius);
printf("%.2f\t%.2f\n", celsius, fahr);
celsius += 10.0;
}
return 0;
}
Vamos melhorar agora nosso programa calculadora.c com o uso do while. Aqui nosso
programa ficar em loop at que o usurio digite o caractere s ou S para encerrar o loop
e encerrar o programa
Nessa nossa modificao surgem novidades em primeiro lugar uma nova e includa a
stdlib.h que nos fornece a funo system() e temos tambm funes novas da biblioteca
stdio.h: fflush(), __fpurge() e getchar(). Vamos analisar uma por uma:
fflush() e __fpurge(): essas funes recebem como parmetro stdin e tem como objetivo
limpar o buffer do teclado. Isso por que depois que voc realiza a entrada pelo teclado a
ultima tecla que voc pressionou o <enter> fica armazenado nesse buffer, pois <enter> e
considerado um caractere vindo do teclado e no foi consumido por essa entrada, ento
quando logo aps voc manda a funo scanf() ler um caractere do teclado ela vai
consumir o caractere <enter> que ficou armazenado no buffer e colocando o seu
caractere de entrada junto com o novo enter no buffer. Para limpar todo o buffer ento
voc utiliza de flush(stdin) no Windows e __fpurge(stdin) para Linux ento lembre-se de
trocar a funo de acordo com seu Sistema Operacional.
system(): recebe como parmetro uma funo do sistema operacional para execut-la.
No caso do nosso programa ela chama as funo para limpar a tela: cls no Windows e
clear do Linux. Repare que voc deve trocar o valor dependendo do Sistema Operacional
em que voc est executando o programa system(cls) para o Windows e system(clear)
no Linux.
getchar(): essa uma outra funo para entrada de dados dada pela biblioteca stdio.h
sua funo ler um caractere do teclado. Sua funo no programa ficar aguardando
que o usurio digite uma tecla para continuar o programa, caso ela no existisse o usurio
no conseguiria ler o resultado pois logo aps a sada do resultado a tela seria limpa.
Acima voc viu como o programa em C pode ficar altamente dependente do
Sistema Operacional em que est sendo executado por isso preste ateno.

/**
* Programa Calculadora C
*/
#include <stdio.h>
#include <stdlib.h>
int main() {
char c;
double x, y;
while (c != 's' && c != 'S') {
printf("\n\tCalculadora C\n");
printf("\n\tEscolha uma das operaes abaixo\n");
printf("\n\t(+) Soma");
printf("\n\t(-) Subtrao");
printf("\n\t(*) Multiplicao");
printf("\n\t(/) Diviso\n");
printf("\n\tEntre com a operao desejada: ");
//fflush(stdin);
__fpurge(stdin);

// Para limpar o buffer do teclado no Windows


// Para limpar o buffer do teclado no Linux

scanf("%c", &c);
if (c != 's' && c != 'S') {
printf("\tEntre com o primeiro nmero: ");
scanf("%lf", &x);
printf("\tEntre com o segundo nmero: ");
scanf("%lf",&y);
switch (c) {
case '+':
printf("\n\tO resultado : %.4lf\n", x + y);
break;
case '-':
printf("\n\tO resultado : %.4lf\n", x - y);
break;
case '*':
printf("\n\tO resultado : %.4lf\n", x * y);
break;
case '/':
if(y)
printf("\n\tO resultado : %.4lf\n", x / y);
else
printf("\n\terro diviso por zero\n");
break;
default:
printf("\n\nVoc no escolheu nenhuma operao
valida\n");
}

//fflush(stdin);
__fpurge(stdin);

// Para limpar o buffer do teclado no Windows


// Para limpar o buffer do teclado no Linux

getchar();
system("clear");

// Trocar o paramtro para cls no Windows


// ou clear no Linux

}
}
return 0;
}

5.4 O lao do...while


Sua estrutura :
do {
cdigos aqui
} while (expresso);
continua o programa
A nica diferena entre o do..while e o while que no do..while como o teste da
expresso feito no final ele sempre executa pelo menos uma vez o cdigo dentro do seu
bloco de instrues.

5.5 O lao for

Você também pode gostar