Buscar

Apostila algorítmos de programação - Linguagem C

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 226 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 226 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 226 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

ALGORÍTMOS DE 
PROGRAMAÇÃO 
Marcela Santos
A linguagem C – 
conceitos básicos
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
� Conhecer o histórico da linguagem C.
� Identificar a estrutura básica de um programa em C.
� Instalar e conhecer ambientes de desenvolvimento da linguagem C.
Introdução
Da mesma forma que existem vários idiomas no mundo, na computa-
ção, existem várias linguagens de programação, as LPs. Uma LP é uma 
linguagem na qual os programas são escritos e que faz uma tradução do 
algoritmo para uma linguagem que o computador entenda. 
Neste texto, você vai estudar sobre a linguagem C, também conhecida 
como a “linguagem das linguagens”, por ser bastante difundida no meio 
acadêmico e usada para que você dê os primeiros passos no mundo da 
programação. Você vai entender como surgiu a linguagem por meio do 
histórico da linguagem C, compreender a estrutura básica da linguagem, 
além de conhecer vários ambientes de desenvolvimento e configurar o 
que melhor adaptar-se às suas necessidades.
Histórico da linguagem C
Antes de começarmos a falar sobre C, que é a linguagem que usaremos, vamos 
entender o que é uma linguagem de programação. No capítulo Introdução 
à Lógica de Programação, falamos sobre Algoritmos e como o seu papel é 
importante no desenvolvimento de um programa. A Figura 1, a seguir, faz a 
representação de como um algoritmo ajuda na resolução de problemas.
Figura 1. Diagrama de como um algoritmo ajuda na resolução de problemas.
Problema Algoritmo
ProgramaSolução
Porém, se o algoritmo não está escrito em uma linguagem que o compu-
tador entenda, é preciso, então, fazer uma tradução da linguagem que nós, 
humanos, usamos para a que a máquina entenda. Essa tradução é feita por 
meio da utilização de uma linguagem de programação (LP). Existem várias 
linguagens de programação, com paradigmas e níveis de abstração diferentes.
Quando uma LP assemelha-se à linguagem falada ou escrita por um ser 
humano, ela é dita de alto nível, e, quando ela aproxima-se da linguagem de 
máquina, é dita de baixo nível. Da mesma forma que o Português, por exemplo, 
tem regras (sintaxe) para que seja compreendido por qualquer pessoa que fale 
esta língua, as LPs também têm um conjunto de regras com as quais é possível 
traduzir um algoritmo e gerar um programa.
Dito isso, podemos começar a falar da linguagem que vamos utilizar neste 
livro: a linguagem de programação C. A linguagem C é uma LP bastante 
popular, criada por volta de 1970, por Dennis Ritchie. 
A linguagem C foi desenvolvida nos laboratórios Bell, onde muitas de suas 
ideias iniciais surgiram de outra linguagem, a B, que tem como antecessoras as 
linguagens BCPL e CPL. CPL foi uma linguagem desenvolvida com o propósito 
de ser uma linguagem de alto e baixo níveis. A maior desvantagem da CPL foi 
que era muito pesada para o desenvolvimento de algumas aplicações. Em 1967, 
foi desenvolvida a Basic CPL – BCPL, que mantinha as características básicas 
da CPL. Ken Thompson, que trabalhava na Bell Labs, utilizou esse projeto para 
A linguagem C – conceitos básicos2
o desenvolvimento da linguagem B. Assim, B foi uma versão de BCPL escrita 
para o desenvolvimento de sistemas. Em 1972, Dennis Ritchie, trabalhando com 
Ken Thompson, desenvolveu uma linguagem também baseada na linguagem 
BCPL, mas que mantinha parte da especificação para acesso a hardware, ou 
seja, a parte das características de baixo nível da linguagem, conhecida como C.
A linguagem C é usada por programadores há muito tempo e poderosa no 
desenvolvimento dos mais diversos tipos de sistema, desde sistemas operacio-
nais, passando por compiladores, editores de texto, etc. Além da diversidade de 
sistemas, é importante ressaltar que C é uma linguagem que pode ser utilizada 
em máquinas com um alto poder de processamento, bem como em máquinas 
mais simples e com baixo poder de processamento.
Dentre as características de C, podemos destacar:
 � Portabilidade: os programas em C são compilados, gerando um único 
executável. Assim, é possível compilar um programa escrito em C para 
qualquer máquina, desde que exista compilador C para ela. Na prática, 
existem compiladores C para quase todos os computadores.
 � Poder e variedade dos operadores: é possível trabalhar com funções 
matemáticas, criação e manipulação de arquivos de Dos, dentre outras 
possibilidades. Isso tudo pode ser feito de forma simplificada, com 
adição de bibliotecas padronizadas, presentes na própria linguagem.
 � Sintaxe elegante, estruturada e flexível: indicada para quem está co-
meçando a programar.
 � Acesso facilitado à memória e a todo o hardware, quando preciso: 
assim, é possível ir de um programa simples até o desenvolvimento de 
um sistema operacional.
 � Uso de procedimentos e funções para desenvolver sistemas desacopla-
dos: sistemas desacoplados são sistemas onde é possível isolar pequenas 
partes para, por exemplo, encontrar erros sem causar nenhum dano ao 
restante do sistema.
Pela natureza de como foi desenvolvida, C também é chamada de lingua-
gem de Médio Nível, pois possui um conjunto de instruções necessárias para 
acesso ao hardware, como as linguagens de baixo nível (Assembly). Além 
disso, C pode ser simples e amigável, como uma linguagem de alto-nível 
deve ser. Uma linguagem de médio nível pode, em alguns casos, não prover 
as estruturas necessárias a uma linguagem de alto nível, mas certamente ela 
tem ferramentas que podem ser usadas como blocos para construção dessas 
estruturas necessárias.
3A linguagem C – conceitos básicos
A primeira versão de C foi criada por Dennis Ritchie, em 1972, nos laboratórios Bell, para 
ser incluída como um dos softwares a serem distribuídos juntamente com o sistema 
operacional Unix do computador PDP-11.
Estrutura básica da linguagem C
Neste ponto, você deve estar querendo saber como é escrito um programa que 
utiliza a linguagem C. A primeira coisa que temos que entender é o processo 
da criação desse programa. 
 � Com o algoritmo em mente, você deve traduzi-lo para C em um arquivo 
e salvá-lo com a extensão C. Por exemplo, imagine que eu escrevi meu 
primeiro programa em um arquivo que irei nomear de programa1; ao 
salvá-lo, esse arquivo precisa de um nome e de uma extensão; assim, 
esse arquivo ficaria como: programa1.c
 � A segunda parte é usar um compilador para gerar o programa. O com-
pilador nada mais é do que um programa que vai fazer toda a conversa 
e tradução do seu código-fonte para a linguagem mais baixa do sistema, 
a linguagem da máquina.
 � Pronto, agora seu programa foi criado. Basta somente executá-lo.
 � A Figura 2, a seguir, demonstra, por meio de um esquema, a criação 
de um programa compilado.
Figura 2. Como um programa compilado é criado?
A linguagem C – conceitos básicos4
Agora vamos entender a estrutura básica do nosso código-fonte, escrito em 
linguagem C. Mais à frente, veremos com o uso das ferramentas precisamos, 
mas, por hora, imagine que você abriu qualquer editor de texto da sua preferên-
cia e criou um arquivo novo, salvou-o com extensão C e, agora, chegou a hora 
de preenchê-lo com seu código em C, conforme exemplificado na Figura 3.
Figura 3. Primeiro programa em C.
Durante todo este livro, vamos explicar os códigos, usando os números 
das linhas na margem à esquerda dos códigos. Vamos a elas:
 � Falamos sobre uma das características do C, o uso de bibliotecas pa-
dronizadas. A linha 1 é o comando para adicionar a biblioteca padrão 
stdio.h no seu código-fonte. Uma das possibilidades que ela traz são 
comandos de entrada e saída de dados. 
 � Na linha 2, temos a declaração da função principal, que, em C, é cha-
mada de main, e a palavra int antes dela indica que deverá “devolver” 
algo do tipo inteiro. Depois de main, temos um par de parênteses vazio, 
indicando que ela não tem nenhum argumento.
 � Nas linhas 3 e 6, temos um par de chaves, entre as quais a magia 
acontece, onde todo o seu algoritmo, agora traduzido paraC, ficará.
 � Na linha 4, temos um exemplo de instrução que escreve um texto na tela.
 � Por fim, na linha 5, temos o valor que a função main retorna, 0.
Sabemos que, a essa altura do livro, poucas dessas palavras parecem fami-
liares, mas calma: foi assim com todos os programadores profissionais — todo 
mundo, no início de aprendizado, passou por essa etapa. É preciso que neste 
início (principalmente) você estude e pratique como se estivesse aprendendo 
um novo idioma, como o inglês. Só assim tudo ficará mais familiar e, como 
os programadores dizem, “no sangue”.
5A linguagem C – conceitos básicos
No exemplo da Figura 4, o programa escreve algo na tela. Se você quiser 
escrever um programa, por exemplo, que soma 2 números, deverá substituir 
a linha 4 por toda a tradução do seu algoritmo. Então, a estrutura básica de 
um código C é a seguinte:
Figura 4. Estrutura básica de um programa em C.
Agora temos o código-fonte. Na próxima seção, vamos conhecer os am-
bientes para desenvolvimento e, assim, gerar o programa em C.
Ambientes de desenvolvimento com 
linguagem C
Existem dois caminhos a seguir em se tratando de desenvolvimento de pro-
gramas. Você pode usar um editor de texto e um compilador/interpretador da 
linguagem que escolher, ou um ambiente integrado de desenvolvido, também 
conhecido como IDE.
Muitas pessoas dizem que, no início dos estudos de programação, é me-
lhor usar um editor de texto, já que, em muitas vezes, uma IDE traz muita 
informação que ainda não é familiar ao estudante.
Neste livro, vamos dar a você sugestões de editores de texto e IDE, para que, 
assim, você possa fazer suas escolhas. Começando com os editores de texto:
 � Sublime Text, que pode ser usado em ambientes OS X, Windows ou 
Linux.
 � Atom, que também pode ser usado em OS X, Windows ou Linux.
 � Editores-padrão do seu sistema operacional.
A linguagem C – conceitos básicos6
Agora, as IDEs:
 � Dev-C++: ferramenta para desenvolvimento C e C++, para o ambiente 
Windows — essa ferramenta é bastante difundida no meio acadêmico.
 � Code::Blocks: ferramenta open-source, na qual se pode programar 
em C,C++ e Fortran. (existe versão para Windows, Linux e OS X) 
— uma das ferramentas mais flexíveis e com uma quantidade grande 
de plugins, o que pode ajudar durante o desenvolvimento de algum 
programa específico.
 � Visual Studio: ambiente de programação para o Windows e OS X — 
nessa IDE, é possível programar em várias linguagens, dentre elas a C.
 � Eclipse: uma das IDEs mais completas, na qual se pode programar 
(realizando a configuração adequada) em diversas linguagens — dis-
ponível para OS X, Windows ou Linux.
Alguns detalhes:
 � Se você escolher usar o editor de texto, é preciso instalar também o 
compilador C.
 � Se você escolher usar uma IDE, deve configurá-la para a linguagem 
C, no caso das IDEs que possuem uma vasta gama de possibilidade de 
linguagens de programação.
Escolhido o ambiente de programação, vamos criar nosso primeiro pro-
grama? Vamos usar aqui o editor de texto+compilador no ambiente Linux. No 
caso das IDEs, é preciso somente abrir um novo documento, “codar ”(termo 
da moda e moderninho pra programar!!!), e clicar no ícone responsável por 
compilar e/ou executar o programa. 
Como o editor simples foi o escolhido, é preciso, agora, ir para a linha de 
comando do Linux e digitar alguns comandos. É necessário acessar a pasta onde 
o arquivo.c esteja e, em seguida, basta digitar o seguinte: gcc nomedoarquivo.c 
-o nomedoprograma.
7A linguagem C – conceitos básicos
Linha de comando para compilação de um programa em C:
 � gcc — comando para executar o compilador C;
 � nomedoarquivo — o arquivo deve ter sido salvo com extensão C e é preciso estar 
na mesma pasta que ele;
 � -o — opção necessária para gerar o executável em C;
 � nomedoprograma — nome do programa que vai ser gerado; se não for digitado, 
o compilador gera um programa cujo nome será a.out.
Depois disso, e se tudo ocorreu bem, o compilador gera um programa com 
o nome nomedoprograma. Basta, agora, executá-lo — e você escreveu seu 
primeiro programa em C! Parabéns!
Além de IDEs, existem outras ferramentas para otimizar 
o desenvolvimento de software. Para maiores detalhes, 
acesse o link a seguir ou o código QR. 
https://goo.gl/79C11q
PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012.
Leitura Recomendada
A linguagem C – conceitos básicos8
ALGORÍTMOS DE 
PROGRAMAÇÃO
Marcela Santos
Tipos de dados e variáveis
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
  Identificar a diferença entre os tipos de dados.
  Realizar a inicialização e nomeação de variáveis.
  Aplicar a declaração de variáveis.
Introdução
Os dados que utilizamos nos programas de computadores precisam ser 
armazenados na memória do computador. A memória é como um grande 
arquivo cheio de gavetas, e, para uma melhor organização, essas gavetas 
podem estar etiquetadas. Outro detalhe desse grande arquivo é que as 
gavetas podem ter tamanhos diferentes e, de acordo com eles, guardam 
determinado tipo de objeto. Usando essa analogia, cada gaveta é uma 
variável que tem um nome (etiqueta) e um tamanho que representa o 
seu tipo.
Neste capítulo, você vai compreender o que são variáveis e como 
definimos os tipos de dados que podemos armazenar nelas.
Diferença entre os tipos de dados
Um computador é uma máquina que processa dados. Ao escrevermos um 
programa, estamos, na verdade, realizando essa tarefa com os dados que o 
usuário entrega para a máquina. Por exemplo, quando queremos que um pro-
grama realize o cálculo da média entre duas notas, é preciso que, de alguma 
forma, o programa “receba” essas duas notas.
Os dados são os insumos que entregamos aos computadores para que eles 
realizarem a tarefa, utilizando, para isso, um programa computacional. Esses 
dados são armazenados em regiões de memória que chamamos de variáveis. 
Podemos pensar na memória do computador como um grande armário cheio 
de gavetas, as variáveis são as gavetas e, para uma melhor organização, cada 
uma possui uma etiqueta indicando o tipo de material que pode ser guardado 
nela: papel, envelopes, canetas.
As variáveis também possuem etiquetas que são os nomes das variáveis, e 
a classificação do que pode ser guardado em cada variável é dada pelos tipos 
de variáveis de uma determinada linguagem de programação.
Existem cinco tipos de dados em C, e cada um representa um tipo de 
informação. Os tipos são representados por uma palavra reservada da lin-
guagem, que são:
  int: números inteiros
  char: letras, caracteres, dados alfanuméricos
  float: números reais com precisão simples, ocupa 4 bytes na memória 
do computador
  double: números reais com precisão dupla, ocupa 8 bytes na memória 
do computador
  void:vazio
Além dos tipos, existem em C os modificadores de tipo:
  short: diminui o espaço em memória reservado para uma variável
  long: aumenta o espaço em memória reservado para uma variável
  unsigned: indica que a variável será guardada sem sinal
  signed: indica que a variável será armazenada com sinal
Como a ideia desse material é focar em algoritmos de programação, mas 
com nível básico, os modificadores não serão utilizados.
Tipos de dados e variáveis2
Inicializando e nomeando variáveis
Se retomarmos ao exemplo da gaveta, os nomes que estão escritos nas etiquetas 
identifi cam os elementos que estão na gaveta. Não é conveniente identifi car a 
etiqueta como caneta, sendo que o que está sendo guardado nela seja adesivos.
Uma palavra reservada de uma linguagem é uma palavra que faz parte da sintaxe e tem 
uma funcionalidade especificada na linguagem, não podendo ser usada para outro fim.
Com as variáveis, funciona da mesma forma. É conveniente colocar o 
nome das variáveis para ajudar na leitura de um código. Lembre-se de que 
você pode ter que reler o código para encontrar erros ou, até mesmo, outras 
pessoas precisem realizar a tarefa árduade leitura de código alheio.
Escolha nomes que identifiquem as variáveis. Existem algumas regras que 
podem ajudar na hora de nomear uma variável:
  Evite começar com letra maiúscula e nunca use um número para co-
meçar uma variável.
  Não utilize caracteres especiais, como:, “, (,).
  Você não pode usar nenhuma palavra reservada como variável.
  Evite variáveis como a, b, n1,n2 , pois isso só tende a dificultar a 
leitura de código.
  Se a variável tem mais de uma palavra, a partir da segunda, coloque a 
primeira letra da palavra em maiúscula, ou utilize underline. 
  Não coloque sinais de pontuação na sua variável.
Quando criamos um programa e utilizamos o conceito de variáveis, o 
compilador associa a uma região de memória o nome desta variável. A memória 
do computador é um recurso utilizado por todos os programas que estão sendo 
executados ou que pararam de ser executados em algum momento, ou seja, 
aquela região que agora é a variável do seu programa pode ter sido utilizada 
por outro programa, o que deixou alguma informação nessa parte da memória, 
como se fosse um lixo de dados.
3Tipos de dados e variáveis
O que podemos fazer, então, para evitar erros no nosso código devido a 
valores deixados na memória? Podemos limpar essa região de memória, e 
isso pode ser feito inicializando o valor de uma variável logo em seguida à 
declaração. A Figura 1 mostra a declaração e a inicialização de uma variável.
Figura 1. Declaração e inicialização de variáveis.
Declaração de variáveis
Quando um programa está sendo executado, signifi ca que ele está na memó-
ria do computador, onde armazenamos os dados nas variáveis. Precisamos 
solicitar que o computador reserve essa região de memória que possuirá um 
nome e um tipo.
O ato de solicitar essa região deve ser feito no programa e chama-se decla-
ração de variáveis. Em C, podemos declarar uma variável da seguinte forma:
Na linha 4, realizamos a declaração de uma variável; primeiramente, é 
preciso colocar o tipo da variável, seguida do nome dela, e, por fim, o ponto-
-e-vírgula que finaliza toda e qualquer linha em C. Na linha 5, inicializamos 
a variável idade com o valor 0, para que, assim, não corramos o risco de ter 
um valor indesejado armazenado nessa variável, sendo utilizado no nosso 
programa.
Vamos a outro exemplo. Imagine que você precise calcular a média de um 
aluno. O seu usuário precisa digitar duas notas e você precisa calcular a média. 
Vamos, nessa etapa, somente declarar e inicializar as variáveis necessárias.
Tipos de dados e variáveis4
Figura 2. Declaração simultânea de variáveis.
Observe que, na linha 4, declaramos na mesma linha 3 variáveis do tipo 
double, pois a média pode ser um número com vírgula. Essa é outra forma 
de declarar variáveis de mesmo tipo de forma simultânea. Nas linhas 5,6 e 
7, inicializamos essas variáveis para evitarmos quaisquer erros causados por 
“lixo” de dados presente na memória. A Figura 2 apresenta uma declaração 
simultânea de variáveis.
A definição do tipo das variáveis, do nome e de como você faz essas 
escolhas constitui uma etapa importante do desenvolvimento de programas. 
Faça essas escolhas com calma e analisando bem o que você utilizará e como.
PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016. 
296p.
PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p.
Leituras recomendadas
5Tipos de dados e variáveis
Encerra aqui o trecho do livro disponibilizado para 
esta Unidade de Aprendizagem. Na Biblioteca Virtual 
da Instituição, você encontra a obra na íntegra.
Conteúdo:
ALGORITMOS DE 
PROGRAMAÇÃO 
Marcela Santos
Entrada e saída de dados
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
� Descrever o conceito de função.
� Aplicar as funções printf() e scanf().
� Usar códigos de formatação.
Introdução
Os programas de computador são sistemas que processam dados. A tarefa 
de um programa de computador é receber dados por meio de instruções 
de entrada, processar essas informações de acordo com a lógica criada e 
traduzida para uma determinada linguagem de programação e entregar 
esses dados processados, utilizando as instruções de saída de dados.
Neste capítulo, você estudará uma parte importante no desenvol-
vimento de sistemas: as instruções necessárias para realizar a entrada e 
saída de dados em um programa de computador.
O conceito de função
Para explicar o conceito de função, vamos começar com o seguinte código:
Figura 1. Código-fonte: o conceito de função.
Na linha 4, temos o uso de uma função existente em C, a printf. Esta
função escreve na tela o texto existente em parênteses e entre aspas. Existe 
uma complexidade gigante para que seja escrito na tela do computador um 
valor e existam instruções específicas para isso.
Uma função é um conjunto de instruções que realizam uma determinada tarefa. Para 
que fique mais fácil o uso, elas têm nome. 
Seria preciso um conjunto dessas instruções todas as vezes em que essa 
operação fosse necessária em um programa. Para facilitar esse trabalho, em 
programação, existem dois conceitos muito importantes: biblioteca e funções.
Na vida real, também temos algo parecido. Imagine que você tenha que 
fazer café. Automaticamente nós já realizamos todas as tarefas que estão en-
volvidas: colocar água para ferver, colocar o pó do café, esperar a água ferver 
e despejar a água quente sobre o pó de café (essa é a maneira que eu faço café!)
Então todas as vezes que eu vou fazer café, mando essas informações 
automaticamente para o meu cérebro. Em programação, é a mesma coisa: uma 
função é um conjunto de instruções organizadas em bloco, que possuem um 
nome e, quando for preciso, é chamada por meio deste.
As funções podem ser criadas pelos programadores ou podem estar in-
cluídas nas bibliotecas de uma determinada biblioteca — e é aqui que entra 
o nosso segundo conceito: uma biblioteca de programação é um conjunto de
funções que já foram pré-definidas por outros programadores; você precisa
simplesmente adicionar a biblioteca ao seu programa e utilizar as funções.
Esse é o caso da função printf, presente na linha 4 do código apresentado 
na Figura 1. Agora, vamos aprender mais sobre essa e outra função, que são 
as funções básicas de entrada e saída na linguagem C.
Entrada e saída de dados2
As funções printf() e scanf()
Um computador é uma máquina que faz uso de programas e dados para realizar 
tarefas. Esses programas recebem esses dados, processam e entregam-nos 
como resposta a algum tipo de problema. Os programas são compostos de 
instruções que fazem esse processamento. Essas instruções podem ser funções 
de entrada e de saída, e é sobre elas que iremos tratar.
Vale a pena ressaltar que estamos tratando da linguagem de programação 
C, e essas funções sãos funções desta linguagem.
Para usar as funções scanf e printf, é preciso incluir a biblioteca stdio.h no código-fonte, 
por meio da linha
#include <stdio.h>
A função printf é a função de saída de dados no vídeo. Todas as funções 
têm uma sintaxe, que é uma regra que mostra como ela deve ser usada e qual 
o resultado esperado. A sintaxe de printf está representada na Figura 2, 
a seguir:
Figura 2. Sintaxe da função printf.
printf(”entrada de dados”);
aqui você digita o 
texto que deseja
apresentar na tela.
3Entrada e saída de dados
Essa é a forma mais básica para utilizarmos essa função, quando queremos 
simplesmente apresentar na tela uma mensagem de texto. Mas pode haver 
situações em que queremos apresentar o valor de uma variável. Quando isso 
for necessário, basta que, em vez do texto, coloquemos somente a variável 
sem as aspas. 
Mas ainda pode existir a situação em que queremos apresentar um texto 
e uma variável na mesma saída de dados. Para entendermos como isso pode 
ser feito, vamos analisar o seguinte código, na Figura 3:
Figura 3. O uso de printf com código de formatação.
Esse código mostra o ano que a pessoa nasceu,usando, para isso, uma 
variável que contém a idade da pessoa. Foram definidas 3 variáveis do tipo 
inteiro: idade, anoAtual e anoNascimento. 
As variáveis idade e anoAtual possuem valores iniciais, ou seja, não temos 
uma entrada de dados por parte do usuário que executa o programa criado 
com esse código-fonte. A variável anoNascimento é calculada usando-se dois 
operadores: o de atribuição e o de subtração — esses operadores serão vistos 
em capítulos posteriores. 
Entrada e saída de dados4
Nesse primeiro momento, vamos entender o que a linha 6 faz, conforme 
representação na Figura 4:
Figura 4. Expressão usando operadores e uma variável.
Depois de realizar a operação, que �ca à
esquerda dessa expressão, o valor é
armazenado dentro da variável
anoNascimento
Essa operação subtrai
do valor 2018 o valor
armazenado na variável
idade
Com o valor armazenado na variável anoNascimento, falta realizarmos 
a saída de dados, ou seja, escrever esse valor na tela. Isso é feito na linha 7, 
utilizando-se a função printf, só que desta vez essa função é usada com 
um código de formatação e a concatenação de uma variável.
Concatenar uma variável é unir variáveis e/ou textos na mesma saída de 
dados, por exemplo. Para isso, adicionamos, ao final do texto que deverá 
aparecer na tela, uma vírgula (,), seguida das variáveis. Cada variável que é 
adicionada tem um tipo, e é preciso “avisar” ao printf que tipo é esse, para 
tal, o C tem o conceito de códigos de formatação. Mas antes de entendermos o 
que sãos os códigos de formatação, vamos à nossa função de entrada de dados.
Bom, agora vamos para a próxima função, a scanf. Da mesma forma 
que a função printf é uma função que está em uma biblioteca padrão do 
C, scanf também está; a diferença é que scanf é uma função de entrada 
de dados.
5Entrada e saída de dados
Vamos usar um exemplo de uso, apresentado na Figura 5, a seguir:
Figura 5. Código-fonte com o uso de printf e scanf.
Esse programa pede ao usuário que ele digite sua idade e o ano atual e, 
com esses dados, ele calcula o ano do nascimento. Na linha 6, temos o uso 
da função printf, que mostra na tela o texto, informando ao usuário a 
solicitação do dado.
Em seguida, aparece o uso da função scanf. Quando o usuário digitar um 
valor e teclar enter, a linha 7 pode ser traduzida para: “armazene na variável 
idade o valor inteiro que foi digitado”. A sintaxe básica da função scanf é 
a que está representada na Figura 6:
Figura 6. Sintaxe da função scanf.
O primeiro valor da função
scanf é o código de
formatação entre aspas
Já o segundo valor,
também chamado
de parâmetro, é a
variável, precedida 
de &
Entrada e saída de dados6
Podemos, também, receber mais de um número no mesmo scanf, con-
forme pode ser visto no exemplo da Figura 7, a seguir:
Figura 7. Código-fonte de um programa que soma dois valores, recebidos no mesmo scanf.
Códigos de formatação
Os códigos de formatação em C começam com % e permitem que as funções de 
entrada (scanf) e saída (printf) expressem os tipos de dados armazenados 
nas variáveis. Indicam o tipo do dado. 
 � %c: imprime o conteúdo da variável com representação ASCII.
 � %d: imprime o conteúdo da variável com representação decimal com 
sinal.
 � %u: imprime o conteúdo da variável com representação decimal sem 
sinal.
 � %o: imprime o conteúdo da variável com representação octal sem sinal.
 � %x: imprime o conteúdo da variável com representação hexadecimal 
sem sinal.
 � %f: imprime o conteúdo da variável com representação com ponto 
decimal.
 � %e: imprime o conteúdo da variável com representação em notação 
científica (exponencial).
 � %g: formato geral, escolhe a representação mais curta entre %f e %e.
Além desses códigos de formatação em C, nós temos as sequências de 
escape que podem auxiliar para impressão de texto na tela de forma formatada. 
Dentre elas, os mais usados são.
7Entrada e saída de dados
 � \n: quebra de linha
 � \t: realiza uma tabulação horizontal
 � \b: adiciona um “backspace” ao texto
 � \r: volta o cursor para o começo da linha sem mudar de linha
 � \a: emite um sinal sonoro
 � \”: quando você precisa, no seu texto, do uso de aspas duplas
 � \’: quando você , no seu texto, do uso de aspas simples
 � \\: quando você precisa, no seu texto, do uso de barra invertida
 � \0: caractere nulo
No código da Figura 8, a seguir, você pode ver o uso de códigos de for-
matação e sequências de escape.
Figura 8. Uso de código de formatação, sequência de escape e funções de entrada e saída.
PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016. 
296p.
PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p.
Leituras recomendadas
Entrada e saída de dados8
ALGORITMOS DE
PROGRAMAÇÃO
Marcela Santos
Operadores
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
 � Reconhecer o uso dos operadores de atribuição, aritméticos, rela-
cionais e lógicos.
 � Construir expressões com vários operadores e precedência.
 � Desenvolver expressões que utilizem operadores de pré e 
pós-incremento/decremento.
Introdução
Os operadores são símbolos que são utilizados para escrevermos expres-
sões, as quais podem ser de atribuição, aritméticas, lógicas e relacionais. 
Além de tipos diferentes, as expressões podem conter vários operadores, 
o que implica entendermos qual a precedência entre estes.
Neste capítulo, você vai compreender como funcionam os operadores 
e quais são eles em C. Além disso, você será apresentado aos conceitos 
de incremento, como ele pode ser feito e seu papel importante na arte 
da programação de computadores.
Operadores de atribuição, aritméticos, 
relacionais e lógicos
Como foi visto anteriormente, uma variável é um espaço de memória de 
um determinado tipo, que vai guardar um valor seja do tipo inteiro, real ou 
caractere. Existe uma função predefinida em uma biblioteca padrão do C, 
que nos permite guardar um valor digitado pelo usuário em uma variável 
declarada, a função scanf. 
Mas como podemos armazenar um valor em uma variável, sendo que 
ele não foi digitado pelo usuário — como, por exemplo, no momento que 
inicializamos uma variável? Observe a Figura 1.
Identificação interna do documento H2KELUIHE5-1PZKMF1
Figura 1. Código para exemplificar o operador de atribuição.
As linhas 3 e 4 mostram a declaração e inicialização de duas variáveis; 
tomemos a linha 3 como exemplo. Essa linha pode ser traduzida como: 
“armazeno o valor 34 dentro da variável idade”. Para realizar essa operação, 
utilizamos o operando = (igual), de atribuição. A sintaxe de uso deste operando 
em uma expressão de atribuição pode ser vista na Figura 2.
Figura 2. Sintaxe do operador de atribuição.
Esse valor armazenado pode ser um valor direto (como no exemplo), ou 
uma expressão aritmética, lógica ou relacional.
Todas as operações aritméticas, já conhecidas da nossa matemática clássica, 
podem ser usadas em programação. Cada linguagem de programação tem 
seus operandos para representar essas operações — em alguns casos, são 
os mesmos que já conhecemos em outros, existindo uma pequena diferença.
Operadores2
Identificação interna do documento H2KELUIHE5-1PZKMF1
Para exemplificar, vamos desenvolver um programa em C que realiza as 
quatro operações básicas com dois números inteiros, conforme representado 
na Figura 3.
Figura 3. Código de uma calculadora com as quatro operações aritméticas.
Ao executar esse programa e digitando os valores 5 e 2 para as variáveis 
numero1 e numero2, respectivamente, teremos a seguinte resposta, na Figura 4: 
Figura 4. Saída da calculadora com as quatro operações aritméticas.
3Operadores
Identificação interna do documento H2KELUIHE5-1PZKMF1
Um ponto interessante a se avaliar essa saída de dados é a resposta à 
operação de divisão. Em C, ao se dividir dois números inteiros, o resultado 
também é um número inteiro, mesmo que a resposta da divisão seja um número 
real, como no caso de 5 divididopor 2. Assim, a resposta aparece truncada, 
que quer dizer somente com a parte inteira.
Para resolvermos isso, podemos declarar as variáveis como do tipo float e 
delimitar o número de casas decimais depois da vírgula. Isso pode ser visto, 
a seguir, na Figura 5 e na Figura 6.
Figura 5. Código de uma calculadora com as quatro operações aritméticas usando o tipo 
float.
Operadores4
Identificação interna do documento H2KELUIHE5-1PZKMF1
Figura 6. Saída da calculadora com as quatro operações aritméticas usando o tipo float.
Além disso, existe um operando que permite que se armazene o resto da 
divisão, também chamado de operação módulo. Esta operação é realizada com 
o operando % (por cento). Para exemplificarmos, vamos mostrar o resto da 
divisão de um número digitado pelo usuário, por 2, conforme Figura 7. Como 
sabemos, se o resto for 0, o número é par. Vamos ao código em C!
Figura 7. Uso do operador módulo.
5Operadores
Identificação interna do documento H2KELUIHE5-1PZKMF1
Como nós estamos utilizando a linguagem C, a seguir, você pode ver, na 
Tabela 1, a operação aritmética e o seu operando, bem como um exemplo de ex-
pressão de utilização em um programa de computador escrito na linguagem C.
Operação Operador Expressão
Soma + a= b+1;
Subtração - a= b-25 ;
Multiplicação * a= a*2 ;
Divisão / a=a/2 ;
Módulo % a= 4%2
Tabela 1. Operadores aritméticos.
Além dos operadores de atribuição e aritméticos, existem os operadores 
lógico-relacionais. Os operadores relacionais (Tabela 2, a seguir) são utiliza-
dos quando se precisa comparar variáveis e/ou valores do mesmo tipo. Uma 
operação relacional tem como resultado os valores lógicos verdadeiro ou falso.
Variáveis que podem ter somente dois tipos, como verdadeiro ou falso, 
são conhecidas em programação como variáveis do tipo booleano. Booleano 
vem da álgebra que usa esses valores, criada pelo matemático George Boole. 
O detalhe é que, em C até o compilador de 1999, nós não tínhamos esse 
tipo, sendo necessário que os programadores simulassem. Atualmente, basta 
que seja adicionada a biblioteca stdbool.h. Vamos usar bastante os operadores 
relacionais e o tipo bool que pode ter o valor 1 ou 0, quando estivermos uti-
lizando as estruturas de seleção. Por agora, vale a pena conhecer o operando 
e a sua função.
Operadores6
Identificação interna do documento H2KELUIHE5-1PZKMF1
Para saber mais sobre o tipo bool e a biblioteca stdbool, acesse: 
https://goo.gl/5g1xr2
Operador 
relacional
Exemplo : 
sejam a e b 
duas variáveis 
do mesmo 
tipo, como, 
por exemplo, 
a = 10 e b =5
Descrição Resultado
== a == b Avalie se a 
é igual b
0
> a > b Avalie se a é 
maior que b
1
< a < b Avalie se a é 
menor que b
0
>= a > = b Avalie se a 
é maior ou 
menor que b
1
<= a <= b Avalie se a 
é menor ou 
igual a b
0
!= a ! = b Avalie se a é 
diferente de b
1
Tabela 2. Operadores relacionais.
7Operadores
Identificação interna do documento H2KELUIHE5-1PZKMF1
Para mais detalhes da Álgebra Booleana, leia Scheinerman (2003), e o tipo bool em 
C. Acesse: 
https://goo.gl/3gSrrh
Por fim, temos os operadores lógicos que nos proporcionam escrever 
expressões lógicas, as quais realizam funções lógicas, dentre as quais temos: 
e, ou e não. Além de um operador lógico, também conhecido como conectivo, 
uma expressão lógica é formada por duas proposições. 
Uma proposição é uma afirmação que pode ser verdadeira ou falsa. Assim, 
uma expressão lógica é formada pela conexão de duas ou mais proposições por 
meio de um conector. Existe uma maneira de mapear todas as possibilidades 
de valores dessas proposições, bem como o valor da expressão — essa forma 
de mapeamento é denominada tabela-verdade.
Cada operador tem uma tabela-verdade. A seguir, você pode ver esse 
mapeamento com os 3 operadores, bem como os símbolos que os representam: 
e (&&), ou (||) e não (!). Vamos nomear uma das proposições de P e a outra 
de T, e, neste primeiro momento, ter true(1) ou false(0) como valores dessas 
proposições. Observe as Tabelas 3, 4 e 5.
P T P && T
True True True
True False False
False True False
False False False
Tabela 3. Tabela-verdade da operação E Lógico.
Operadores8
Identificação interna do documento H2KELUIHE5-1PZKMF1
P T P || T
True True True 
True False True
False True True
False False False
Tabela 4. Tabela-verdade da operação Ou Lógico.
P ! P
True False
Fale True
Tabela 5. Tabela-verdade da operação Não Lógico.
Da mesma forma do caso das operações e expressões relacionais, vamos 
usar bastante as tabelas-verdade e operadores lógicos quando estivermos 
tratando das estruturas de seleção.
Como mencionado anteriormente, existe um tipo de variável em C que 
representa o tipo booleano. Veja alguns detalhes, a seguir.
Para utilizá-la, é preciso a adição da biblioteca stdbool com a seguinte 
linha de código: # include <stdbool.h>
A declaração das variáveis é feita da seguinte forma: bool a.
A inicialização e atribuição podem ser feitas usando-se true/false ou 1/0.
Atribuir o valor verdadeiro para a variável a: a=true ; (a=1).
A resposta das operações lógicas será SEMPRE 0 e 1.
Para exemplificar, nas Figuras 8 e 9, segue um código-fonte e a execução 
de um programa que mostra o uso dos operadores lógicos: E, Ou e Não.
9Operadores
Identificação interna do documento H2KELUIHE5-1PZKMF1
Figuras 8 e 9. Operadores lógicos.
Para finalizar, observe a Tabela 6, com operadores lógicos em C.
Operação Operador
E &&
Ou ||
Não !
Tabela 6. Operadores lógicos.
Assim podemos fazer uma tabela-resumo (Tabela 7) com todos os opera-
dores que foram vistos até agora:
Operadores10
Identificação interna do documento H2KELUIHE5-1PZKMF1
Tipo Operação Operador
Aritmético Multiplicação *
Aritmético Divisão /
Aritmético Soma +
Aritmético Subtração -
Aritmético Módulo %
Relacional Menor que <
Relacional Menor que ou igual a <=
Relacional Maior que >
Relacional Maior que ou igual a >=
Relacional Igual a ==
Relacional Diferente de != 
Lógico E &&
Lógico Ou ||
Lógico Não !
Tabela 7. Resumo de todos os operadores: aritméticos, relacionais e lógicos.
Expressões com vários operadores e 
precedência
As expressões aritméticas, relacionais e lógicas podem ter vários operadores, 
e, para isso, existe uma ordem de precedência entre os operadores do mesmo 
tipo. A primeira regra e mais importante é: se existir, em uma expressão, uma 
subexpressão dentro de um parênteses, essa expressão deve ser a primeira a ser 
resolvida, ou seja, os parênteses, quando existentes, são sempre os primeiros 
a serem resolvidos.
Antes de avaliarmos uma expressão com vários tipos de operadores, vamos 
avaliar expressões com vários operadores, porém do mesmo tipo. Para isso, 
vamos usar a ordem de precedência respeitada pelo compilador da linguagem 
C. Entre esses operadores, começamos com os aritméticos. Observe a Tabela 8.
11Operadores
Identificação interna do documento H2KELUIHE5-1PZKMF1
Ordem de execução Operação Operador
1 Multiplicação *
2 Divisão /
3 Soma +
4 Subtração -
5 Módulo %
Tabela 8. Ordem de precedência dos operadores aritméticos.
O que isso quer dizer? Isso significa que, se em uma expressão existir 
uma multiplicação, uma divisão e uma soma, a ordem deve ser a seguinte: 
multiplicação, divisão e soma. Veja um exemplo na Figura 10.
Figura 10. Expressão com operadores aritméticos.
Nessa expressão, a multiplicação deve ser feita antes da subtração — basta 
seguir a regra de precedência da tabela mostrada anteriormente. Da mesma 
forma, existe uma ordem de precedência respeitada pelo compilador C, entre 
os operadores relacionais. Essa ordem pode ser observada na Tabela 9, a seguir.
Operadores12
Identificação interna do documento H2KELUIHE5-1PZKMF1
Ordem de execução Operação Operador
1 Menor que <
2 Menor que ou igual a <=
3 Maior que >
4 Maior que ou igual a >=
5 Igual a ==
6 Diferente de != 
Tabela 9. Ordem de precedência dos operadores relacionais.
Vamos a um exemplo. Observe a Figura 11.
Figura 11. Expressãocom operadores relacionais.
Nessa expressão, as operações relacionais de maior e menor de cada lado da 
operação igual a devem ser feitas primeiro. Logo, em seguida, comparam-se 
os valores obtidos entre essas operações e, dependendo do valor de a, b, c e 
d, teremos um valor verdadeiro (true,1) ou falso (false,0).
13Operadores
Identificação interna do documento H2KELUIHE5-1PZKMF1
Para finalizar, temos a ordem de precedência dos nossos operadores lógicos. 
Observe a Tabela 10.
Ordem de execução Operação Operador
1 E &&
2 Ou ||
3 Não !
Tabela 10. Ordem de precedência dos operadores lógicos.
Para exemplificar, vamos usar a seguinte expressão, conforme a Figura 12. 
Figura 12. Expressão com operadores lógicos.
Seguindo as regras, a operação E é feita antes, para só em seguida a operação 
Ou ser executada. Agora, vamos colocar todos os operadores — aritméticos, 
relacionais e lógicos — em uma única tabela e reorganizar a ordem de pre-
cedência. Veja na Tabela 11.
Operadores14
Identificação interna do documento H2KELUIHE5-1PZKMF1
Ordem de execução Operação Operador
1 Multiplicação *
2 Divisão /
3 Soma +
4 Subtração -
5 Módulo %
6 Menor que <
7 Menor que ou igual a <=
8 Maior que >
9 Maior que ou igual a >=
10 Igual a ==
11 Diferente de != 
12 E &&
13 Ou ||
14 Não !
Tabela 11. Ordem de precedência de todos os operadores.
A ordem de precedência é a seguinte:
 � As operações aritméticas são realizadas primeiramente.
 � Em seguida, são realizadas as operações relacionais.
 � O próximo passo é realizar operações lógicas, na seguinte ordem (ver 
Figura 13).
Exemplificamos, descobrindo o valor da expressão: (y + z < x) OU (x>15) 
E (y < 55), sendo x igual a 15, y igual a 70 e z igual a 5.
15Operadores
Identificação interna do documento H2KELUIHE5-1PZKMF1
Figura 13. Expressão com operadores aritméticos, rela-
cionais e lógicos.
 � Primeiro, precisamos avaliar todas as operações que estão em parênteses.
 � O primeiro passo é realizar a operação y+z, que é igual a 75.
 � Agora, é preciso avaliar as operações relacionais.
 ■ (y+z<x) : (75<15), que é falso.
 ■ (x>15): (15>15), que é falso.
 ■ (y<55): (70<55) que é falso.
 � Se colocarmos os valores lógicos na expressão inicial, temos:
 ■ (falso) ou (falso) e (falso)
 � A operação e é realizada primeiro e, pela tabela-verdade, é possível ver 
que, quando temos dois valores falsos, o resultado é falso.
 � Assim, a expressão fica: falso ou falso, resultando em falso, e esse é o 
valor final dessa expressão.
Uma dica para evitar confusão é definir as precedências usando parên-
teses. As expressões dentro dos parênteses mais internos são resolvidas 
primeiramente.
Operadores de pré e pós-incremento/
decremento
Por fim e não menos importante, nós temos, neste capítulo, operadores de 
incremento e decremento. Estas operações são utilizadas para acelerar o 
processo de aumentar ou diminuir unidades de variáveis.
Operadores16
Identificação interna do documento H2KELUIHE5-1PZKMF1
O operador de incremento ++ adiciona a 1 a variável que utiliza esse 
operador. Já o operador de decremento -- subtrai 1 da variável. 
Essas operações podem ser feitas antes ou depois do uso da variável, ou seja, 
um pré ou pós-incremento e um pré ou pós-decremento. No pré-incremento 
(decremento), o valor será modificado na instrução que a variável está sendo 
avaliada. Já, no caso de pós, o valor da variável será modificado na próxima 
instrução.
 Para exemplificarmos, temos o seguinte código e sua saída de execução. 
Veja as Figuras 14 e 15.
Figura 14. Código-fonte para exemplificar o uso dos operadores de incremento e decre-
mento e suas formas de uso.
Figura 15. Saída da execução do código-fonte para exemplificar o uso 
dos operadores de incremento e decremento e suas formas de uso.
17Operadores
Identificação interna do documento H2KELUIHE5-1PZKMF1
Uma das grandes utilidades dos operadores de incremento ou decremento 
é no uso de variáveis contadoras. Imagine que você tenha que desenvolver 
um sistema de fichas para uma central de atendimento. Os números de ficha 
entregues para os usuários nada mais são do que valores que, a cada solicitação, 
aumenta-se 1, ou seja, vamos contando de 1 em 1.
Vamos criar um programa que conte de 1 até 5 de duas formas: como a 
operação de soma, usando o operador +, e com a operação de incremento, 
usando o operador ++. Veja as duas formas nos códigos da Figura 16, a seguir.
Figura 16. Contadores: uso do incremento.
Os dois programas realizam a mesma tarefa: contam de 1 a 5 e mostram esta 
contagem na tela. A diferença está na forma que isso pode ser feito. A forma 
reduzida é bastante utilizada em programação, e outro detalhe interessante é 
que podemos também incrementar valores diferentes de 1. Imagine contar de 
1 a 10, somente os números pares. A seguir, na Figura 17, serão mostradas as 
duas formas de se realizar essa tarefa: forma convencional e forma reduzida.
Operadores18
Identificação interna do documento H2KELUIHE5-1PZKMF1
Figura 17. Contadores: uso do incremento, para um contador de números pares.
BOOLEAN type support library. Cppreference.com, 2017. Disponível em: <http://
en.cppreference.com/w/c/types/boolean>. Acesso em: 22 fev. 2018.
SCHEINERMAN, E. R. Matemática Discreta: uma introdução. São Paulo: Thomson Pio-
neira, 2003.
Leituras recomendadas
PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016. 
296p.
PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p.
19Operadores
Identificação interna do documento H2KELUIHE5-1PZKMF1
ALGORITMOS DE 
PROGRAMAÇÃO 
Marcela Santos
Estruturas de seleção
Introdução
Ao final deste texto, você deve apresentar os seguintes aprendizados:
� Usar as estruturas de seleção if-else e switch.
� Criar programas que usam as estruturas de seleção simples, composta
e encadeada.
� Resolver problemas computacionais com a estrutura de seleção
ternária.
Objetivos de aprendizagem
Em programação, podemos construir programas sequenciais, ou seja, 
que possuem somente um fluxo de execução. Todavia, existem casos 
que isso não é o suficiente para resolver um determinado problema. Uma 
estrutura de decisão é uma ferramenta utilizada para modificarmos o fluxo 
de execução de um programa. Com esse tipo de estrutura, é possível 
escolher um grupo de ações a serem executadas de acordo com o valor 
lógico de alguma expressão lógica e/ou relacional. 
Neste capítulo, você estudará a construção de um algoritmo, os con-
ceitos básicos envolvidos, os tipos e o funcionamento da estrutura de 
seleção.
As estruturas de seleção if-else e switch
Quando criamos um programa de computador, utilizamos a seguinte sequência 
de operações na grande maioria das vezes: entrada de dados, processamento 
e saída. Para que essas operações sejam executadas de forma a resolver o 
problema ou a realizar uma determinada tarefa, é importante que ele siga um 
fluxo de execução que faça sentido, ou seja, que tenha uma determinada lógica.
Quando existe somente um fluxo de execução, ou seja, não há a necessidade 
de escolha entre dois ou mais caminhos, chamamos a execução de sequencial. 
Ela segue do início do código-fonte ao final e, toda vez que for executada, terá 
a mesma ordem de execução das instruções que compõem o código-fonte. 
Mas existem situações onde é preciso que o programa tenha mais de um 
fluxo de execução. Imagine que você esteja escrevendo um programa que 
calcule a média de um aluno e mostre, ao final, a situação dele de acordo 
com essa média.
Para exemplificar, vamos usar as seguintes regras:
 � Se a média for menor que 5, o aluno está reprovado.
 � Se a média for maior que 5 e menor que 7, ele estará em recuperação.
 � Acima de 7, ele será aprovado.
Não é possível que o aluno esteja em recuperação, aprovado e reprovado 
ao mesmo tempo. Então, o programa precisará ter mais de um fluxo de exe-
cução, e isso é obtido por meio da utilização de uma estrutura conhecida 
como estrutura deseleção. Esta permite que decisões sejam tomadas e ações 
diferentes sejam executadas.
Existem dois tipos de estrutura de seleção em C: if-else e switch — cada 
uma tem sua sintaxe e podem ser utilizadas em situações diferentes. Tomemos 
como exemplo um programa que, dado um número inteiro, tem como saída 
um texto mostrando se o número é maior que 0. Observe a Figura 1, a seguir.
Figura 1. Uso do if-simples.
Estruturas de seleção2
As linhas em destaque (6,7 e 8) mostram o uso da estrutura if. Nesse caso, 
o programa só vai ter um caminho diferente para seguir: quando o número 
for maior que zero. Por isso, foi usado somente o if (sem o else) e seu funcio-
namento pode ser visto no seguinte fluxograma, representado pela Figura 2.
Figura 2. Fluxograma do if-simples.
Os testes lógicos são construídos com os operadores relacionais somente, 
ou pode-se unir expressões relacionais com operadores lógicos. A sintaxe do 
if segue a seguinte regra, apresentada na Figura 3. 
Figura 3. Sintaxe do if-simples.
3Estruturas de seleção
Usando o mesmo exemplo, imagine agora que o programa deve, ao final 
da execução, dizer se o número é maior que zero ou se o número digitado é 
menor ou igual a zero. Diferentemente do primeiro exemplo, esse problema 
requer o desenvolvimento de dois fluxos de execução. Vamos dar uma olhada 
no código-fonte que resolve essa questão, na Figura 4.
Figura 4. Uso do if-else-composto.
Nas linhas em destaque, podemos ver o uso da estrutura if-else. Nesse caso, 
temos dois caminhos a tomar (por enquanto): escrever o texto referente ao número 
maior que zero; e, no caso contrário, se o número for menor ou igual a zero.
Estruturas de seleção4
A sintaxe e o funcionamento da estrutura if-else podem ser vistos a seguir, 
nas Figuras 5 e 6.
Figura 5. Sintaxe if-else-composta.
Figura 6. Fluxograma if-else-composto.
5Estruturas de seleção
O nosso segundo tipo de estrutura de seleção é o switch. Para exemplificar, 
imagine um programa que você digite o mês em formato numérico e ele retorne 
o mês em forma de texto. Na Figura 7, está representado o código-fonte que 
realiza essa tarefa.
Figura 7. Uso do switch.
Estruturas de seleção6
O switch acaba sendo uma alternativa mais simples para o if. Seu uso é 
bastante simples: quando comparamos uma variável com valores diferentes 
e temos ações específicas, caso essa variável seja igual a um dos valores 
comparados. Sua sintaxe segue as seguintes regras:
 � Você precisa definir qual variável o switch irá avaliar.
 � Em seguida, você tem uma sequência de casos, onde a variável é com-
parada com um valor.
 � Cada caso é feito usando-se a palavra reservada case, seguida do valor 
e dois pontos.
Um detalhe importante em cada caso é o fato de termos, como última linha, 
a palavra reservada break, que faz com que somente um caso seja avaliado 
por vez. Essa palavra quebra a execução do switch e faz com que o fluxo siga 
para a primeira linha após o switch.
O switch é bastante utilizado quando se deseja implementar um menu. 
Imagine que você esteja desenvolvendo um jogo que tenha níveis. Um possível 
menu pode ser feito da seguinte forma, conforme Figura 8.
Figura 8. Uso do switch, implementando menu.
7Estruturas de seleção
Um detalhe importante é o uso do default. Já percebeu para que ele serve? Caso a 
variável testada não seja igual a nenhum valor presente nos cases, o switch executa 
as instruções presentes no default. 
O case só serve quando o teste que queremos fazer é por meio da utilização 
do operador igual a (==). Se for preciso fazer vários testes, mas com outros 
operadores, precisamos encadear if-elses, como será visto a seguir.
As estruturas de seleção if-else e switch
Uma estrutura de seleção simples é aquela formada por um único if. Como 
vimos anteriormente, o if sozinho é usado quando temos somente um caminho 
para seguir no fluxo de execução do programa. 
Já, quando usamos somente um if-else, estamos usando uma estrutura de 
seleção composta. Ela é usada quando é preciso tomar uma decisão e existe um 
conjunto de instruções a ser executado, caso o teste seja verdadeiro ou falso. 
Porém, existem casos onde é preciso mais que dois caminhos a seguir no 
fluxo de execução do programa. Tomemos como exemplo o programa que 
diz se um número é maior, menor ou igual a zero. Do jeito que escrevemos o 
código anteriormente, é impossível saber se o número é 0 ou menor que zero. 
Precisamos, nesse caso, implementar um programa que tenha 3 caminhos a 
seguir:
 � maior que zero;
 � menor que zero;
 � igual a zero.
Estruturas de seleção8
Nesses casos, utilizamos estrutura de seleção encadeada, ou seja, uma 
dentro da outra. Segue o código do nosso problema, representado pela Figura 9, 
agora com estrutura de seleção encadeada.
Figura 9. Código para exemplificar o uso da estrutura de seleção encadeada.
Seguem algumas dicas para a escrita da estrutura de seleção composta:
 � Quem tem teste lógico é sempre o if, o else nunca testa variável.
 � Cada if tem o teste lógico e o conjunto de chaves para delimitar o que 
será executado dentro do if.
 � Cada else tem seu conjunto de chaves para delimitar o que será exe-
cutado dentro do else.
 � Fica mais fácil se o que estiver dentro do if ou do else for indentado, 
ou seja, aplicamos um recuo (com o uso da tecla tab), para indicar a 
hierarquia do código.
9Estruturas de seleção
Lembra do exemplo da situação do aluno, lá do início do nosso capítulo? 
Vamos escrever o código para resolver esse problema. Observe a Figura 10.
Figura 10. Código para exemplificar o uso da estrutura de 
seleção encadeada (situação aluno).
A estrutura de seleção ternária
O operador ternário é uma maneira que a linguagem C tem de escrever uma 
estrutura if-else de forma compactada. Como exemplo, vamos escrever um 
programa que, dados dois números, mostra o maior deles.
Vamos implementar esse programa, primeiro somente com if-else e, depois, 
substituindo um destes pela estrutura ternária. Veja a Figura 11, a seguir.
Estruturas de seleção10
Figura 11. Comparação entre estrutura de seleção composta e estrutura de seleção ternária.
Do lado esquerdo, temos o código com o uso do if-else interno, para avaliar 
qual o maior número. Esse if-else pode ser substituído pelas linhas 9 e 10 do 
código à direita e, especificamente, pela linha 9, onde usamos a estrutura de 
seleção ternária. A sintaxe da estrutura de seleção ternária é representada em 
seguida, na Figura 12.
Figura 12. Sintaxe da estrutura de seleção ternária.
A variável de atribuição vai receber o valor de:
 � expressão 1, se a condição for verdadeira;
 � expressão 2, se a condição for falsa.
Lembre-se de que a condição pode ser feita por meio do uso de operadores relacionais 
e/ou lógicos.
11Estruturas de seleção
BOOLEAN type support library. Cppreference.com, 2017. Disponível em: <http://
en.cppreference.com/w/c/types/boolean>. Acesso em: 22 fev. 2018.
PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016. 
296p.
PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p.
SCHEINERMAN, E. R. Matemática Discreta: uma introdução. São Paulo: Thomson 
Pioneira, 2003.
Leituras recomendadas
Estruturas de seleção12
ALGORÍTMO DE 
PROGRAMAÇÃO
Marcela Santos
Estruturas de repetição
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
 � Compreender o funcionamento da estrutura while.
 � Implementar programas de computador usando o for.
 � Entender como a estrutura do-while funciona.
Introdução
Em muitas situações, não basta que tenhamos somente uma estrutura 
de seleção em um programa de computador, tão pouco somente a 
forma sequencial de implementação. Em resolução de problemas reais, 
é comum a necessidade do uso de estrutura de repetição, que seleciona, 
de certa forma, um trecho de código e faz com que ele seja executo um 
determinado número de vezes ou quando alguma operação acontecer.
Neste capítulo,você estudará a construção de um algoritmo, usando 
praticamente todos os conceitos de programação, dando destaque aos 
tipos de estrutura de repetição existentes.
A estrutura while
Existem algumas situações em programação que precisamos repetir o mesmo 
trecho de código com valores diferentes para as nossas variáveis. Um programa 
que calcula a média de uma turma de 40 alunos vai repetir a mesma operação 
40 vezes: leitura da matrícula do aluno, leituras das notas, cálculo da média 
e, por fim, mostrar para o usuário o resultado desse processamento de dados.
Da mesma forma que as estruturas de seleção fazem um controle do fluxo 
de execução, as estruturas de repetição vão mudar o fluxo, repetindo um trecho 
de código um determinado número de vezes ou quando alguma operação for 
executada.
Podemos pensar a estrutura de repetição como o loop da montanha-russa, 
onde o carrinho vem em seu fluxo e faz um giro. Em programação, esse loop 
é conhecido como repetição.
O loop pode ficar repetindo um número X de vezes. Esse número pode ser 
determinado pelo programador ou pode ser um valor digitado pelo usuário. 
Em todos os casos, esse valor ficará armazenado em uma variável que é co-
nhecida como contadora. Um detalhe: você pode dar o nome que quiser para 
essa variável, mas lembre-se de que é legal o nome da variável ter relação 
com o significado do que ela armazena.
Além disso, o loop também pode ser controlado por algo que o usuário 
digita ou alguma operação interna a ele. Imagine que o cálculo da média seja 
digitado até que seja zero para a matrícula do aluno. O loop, então, encerraria 
como resultado de uma operação. Esse tipo de loop é obtido por meio de um 
teste condicional com uma variável, que é conhecida como variável de controle.
Em C, existem os seguintes loops: while, for e do-while. Vamos começar 
com o while. Para isso, vamos a um código simples, que mostre os números 
de 1 a 5, primeiro sem estrutura de repetição. Veja na Figura 1, a seguir.
Figura 1. Código simples sem estrutura de repetição.
Estruturas de repetição2
Como pode ser visto na Figura 1, repetimos as linha 5 e 6 por 5 vezes, 
que é a escrita na tela da variável contador. Nesse exemplo, inicializamos 
a variável contador com 0. Portanto, para que a contagem seja de 1 a 5, é 
necessário realizar primeiro um incremento de 1 nessa variável para depois 
exibirmos na tela.
Agora, vamos usar a estrutura de repetição while para realizar a mesma 
tarefa. Veja na Figura 2, a seguir.
Figura 2. Estrutura de repetição while. 
As linhas 5 a 8 mostram o uso da estrutura de repetição while. Sua sintaxe 
é a demonstrada na Figura 3:
Figura 3. Sintaxe da estrutura de repetição while.
3Estruturas de repetição
Alguns detalhes:
 � A condição é uma expressão relacional e/ou lógica com a variável de 
controle.
 � A variável de controle deve ser inicializada antes do loop.
 � A variável de controle precisa ser modificada dentro do loop de repetição.
Esses detalhes são importantes, pois, se eles não estiverem presentes no 
código, o loop pode ou não funcionar ou funcionar de forma errada. Para 
exemplificar, vamos a dois erros bastante comuns que podem acontecer, ou 
melhor, acontecem com todos que estão aprendendo a programar.
Veja este exemplo, na Figura 4.
Figura 4. Exemplo de problema de semântica.
Esse programa compila, mas, ao executar, nada acontece — trata-se de 
um problema de semântica. A linha em destaque é a que inicializa a variável 
de controle, contador. Ela foi inicializada com o valor 6, e na linha 5 temos 
a estrutura while.
Estruturas de repetição4
No while, é feito um teste condicional, o qual, na primeira rodada, é falso. 
O fluxo do programa não passa pelo loop (delimitado pelo conjunto de chaves) 
e vai direto para a linha 9, finalizando o código. 
Com esse código, deu para perceber que o bloco de operações dentro do 
while só será executado caso, ou melhor, enquanto o teste condicional for 
verdadeiro. Por isso, cuidado com o valor inicial de sua variável de controle. 
Vamos melhorar a sintaxe do while, na Figura 5.
Figura 5. Sintaxe do while.
Esse é o nosso primeiro problema comum em estrutura de repetição. Vamos 
ao segundo. Veja o código a seguir, na Figura 6.
Figura 6. Exemplo de problema de loop infinito.
5Estruturas de repetição
Dessa vez, o código compila, mas tem uma saída diferente: ele fica impri-
mindo na tela o valor 0, e isso vai ficar acontecendo para sempre ou, melhor 
dizendo, infinitas vezes. Esse problema é conhecido como loop infinito e 
acontece porque não houve modificação do valor da variável de controle dentro 
do loop, ou seja, o teste condicional vai dar sempre verdadeiro e a linha 6 vai 
ser executada para sempre.
Então, duas dicas valiosas, ao escrever uma estrutura de repetição no seu 
programa, são:
 � inicializar a variável de controle de forma conveniente.
 � ter uma linha dentro do loop, que realiza a modificação do valor da 
variável de controle.
Outro detalhe do uso do while é quando não tivermos a quantidade de vezes 
que a repetição irá acontecer. Veja o seguinte código da Figura 7.
Figura 7. Exemplo uso do while — não há quantidade de vezes da repetição. 
Ele soma todos os valores que são digitados. Não temos como saber quantas 
vezes a pessoa vai digitar um valor válido, mas sabemos que o loop irá parar 
quando o valor digitado, que será armazenado na variável número, for zero, 
pois o teste condicional é a expressão numero!=0, ou seja, o código irá repetir 
enquanto o número for diferente de zero.
Estruturas de repetição6
Outro detalhe para esse código é o uso da variável soma. Esse tipo de uso 
é o que chamamos de variável, que vai acumulando os valores, bastante útil 
em programação, como, por exemplo, para calcularmos média de valores. É 
como se a variável soma fosse uma grande caixa que, na primeira vez que 
passa pelo código, contém valor 0; depois, todos os números que são colocados 
lá dentro são somados com o valor que já existia. Veja a Figura 8, a seguir. 
Figura 8. Exemplo de variável soma.
45 10 9
0
soma soma soma soma
Cada passagem pelo loop
45 55 64
Então, o superpoder do while é que podemos usá-lo quando não sabemos 
a quantidade de vezes que o laço vai acontecer — e não se esqueça: o teste 
condicional do while é feito logo do início da sua execução. Vamos agora para 
o segundo tipo de estrutura de repetição: o for.
A estrutura de repetição for
A estrutura de repetição for também nos auxilia quando precisamos repetir 
um trecho de código. Sua principal diferença, quando comparada com o while 
e o do-while — que veremos a seguir —, é que só pode ser usado quando se 
sabe a quantidade de vezes que o loop vai acontecer.
7Estruturas de repetição
Vamos avaliar o seguinte código da Figura 9.
Figura 9. Exemplo de código com estrutura de repetição for.
Esse código também acumula, somando todos os valores que são digitados 
pelo usuário. A diferença está no uso da estrutura de repetição for. Para que 
ela seja usada, precisamos definir quantas vezes a repetição irá acontecer — 
nesse caso, isso é definido com a variável count.
A sintaxe da estrutura de repetição for é a seguinte:
Figura 10. Sintaxe do for.
O primeiro valor dentro dos parênteses é a variável de controle — nesse 
caso, declarada, dentro do próprio for, uma prática bastante comum em lin-
guagem C. O segundo termo é o teste condicional, que pode ser traduzido 
para o seguinte: enquanto o teste for verdadeiro, o loop continua; enquanto a 
variável i for menor que a variável count e o último termo, e como a variável 
i vai ser modificada, ou seja, a instrução que muda o valor da variável de 
controle, nesse caso, o i será incrementado de um em um.
Estruturas de repetição8
Os seguintes detalhes devem ser observados: 
 � A variável de controle não precisa ser declarada no for, mas deve levar 
ao seguinte: quando acabar o loop, a variável deixa de existir.
 � O teste condicional pode ser feito usando-se qualquer operador lógico 
e/ou relacional.� O último termo, também chamado de passo do loop, pode ser de in-
cremento, de decremento e do tamanho que for conveniente para o 
programa.
 � O for é delimitado por um conjunto de chaves, assim como o while.
 � O loop fica executando enquanto o teste condicional for verdadeiro, ou 
seja, ao chegar na última linha , o fluxo de execução volta para o teste 
e verifica se ele é verdadeiro ou falso.
Podemos ver o funcionamento do loop for com o seguinte fluxograma, 
representado na Figura 11:
Figura 11. Fluxograma com loop for.
9Estruturas de repetição
Vamos a mais um exemplo, veja o seguinte código, na Figura 12.
Figura 12. Código com loop for.
Muito parecido com o anterior, exceto pelo valor de count ser pedido 
ao usuário e não atribuído dentro do código. O programa continua sabendo 
quantas vezes o loop vai acontecer, só que agora foi o usuário do programa 
que definiu. Em ambos os casos, podemos usar o for, pois sabemos esse limite. 
E o while? Pode ser usado nesses casos também? A resposta é sim, o while é 
multiuso nesse aspecto. Vamos finalizar nossas estruturas de repetição com 
o último tipo: o do-while.
A estrutura de repetição do-while
Para finalizar, vamos à terceira estrutura de repetição: do-while. Como vimos 
anteriormente, existe uma diferença no uso de while e for, mas ambos têm 
algo em comum: o teste condicional é feito no início da estrutura. O do-while 
é uma estrutura de repetição onde o teste condicional é feito no fim, ou seja, o 
bloco de operações será executado pelo menos uma vez, independentemente 
do valor lógico do teste condicional.
Estruturas de repetição10
Vamos refazer o exemplo do acumulador de valores, agora usando o do-
-while. Observe a Figura 13.
Figura 13. Exemplo de acumulador de valores com do-while.
O do-while também funciona quando não sabemos quantas vezes a repetição 
vai acontecer, assim como o while. Um detalhe importante é que o bloco de 
código que está dentro da estrutura de repetição será executado pelo menos 
uma vez, visto que o teste condicional é feito somente no fim.
Também é preciso tomar os mesmos cuidados quanto ao loop infinito, ou 
seja, para que o loop aconteça de forma conveniente à resolução de um deter-
minando, é preciso que a variável de controle seja modificada dentro do loop.
A sintaxe de do-while pode ser vista na Figura 14.
Figura 14. Sintaxe de do-while.
11Estruturas de repetição
Para finalizarmos, observe o Quadro 1, com uma comparativa entre as 3 
estruturas de repetição existentes na linguagem C.
Nome da estrutura
Teste condicional 
é feito no início ou 
no fim do loop?
Necessidade de se 
saber quantas vezes 
o loop vai acontecer?
While Início Não
For Início Sim
Do-while Fim Não
Quadro 1. Síntese das três estruturas de repetição da linguagem C.
Ao se escolher qual estrutura usar, precisa-se analisar o problema e como se deseja 
resolvê-lo computacionalmente. A prática vai de ajudar sempre nessa escolha. Portanto, 
programe sempre. 
BOOLEAN type support library. Cppreference.com, 2017. Disponível em: <http://
en.cppreference.com/w/c/types/boolean>. Acesso em: 22 fev 2018. 
MIZRAHI, V. V. Treinamento em Linguagem C: curso completo em um volume. 2. ed. 
São Paulo: Pearson, 2008.
PAES, R. B. Introdução à Programação com a Linguagem C. São Paulo: Novatec, 2016.
PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012. 548p.
SCHEINERMAN, E. R. Matemática Discreta: uma introdução. São Paulo: Thomson 
Pioneira, 2003.
Leituras recomendadas
Estruturas de repetição12
LINGUAGEM DE 
PROGRAMAÇÃO
Maurício de Oliveira Saraiva 
Funções e procedimentos
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
 � Definir funções e procedimentos.
 � Criar a chamada de funções e procedimentos.
 � Usar variáveis locais e globais.
Introdução
Escrever programas legíveis e de fácil manutenção está entre os prin-
cipais objetivos de qualquer programador de computador. Na prática, 
não raras vezes, encontra-se programas grandes, os quais geralmente 
repetem trechos de código, e a experiência tem mostrado que eles são 
difíceis de entender e que dividi-los em módulos menores pode facilitar 
a legibilidade e o entendimento, bem como aumentar a produtividade 
por meio do reuso de código.
Neste capítulo, você estudará a declaração e a chamada de funções, 
bem como o uso de variáveis locais e globais.
Funções e procedimentos
Ao longo dos anos, analistas e programadores têm percebido que dividir 
programas em blocos menores facilita o entendimento e a manutenção dos 
códigos escritos, uma vez que resolver os problemas de pequenos módulos é 
mais fácil que de programas inteiros (DEITEL; DEITEL, 2011).
No âmbito das linguagens de programação, como C e C++, os programas 
são divididos em módulos ou subprogramas por meio de funções ou procedi-
mentos, que proporcionam diversas vantagens a eles, sendo uma das principais 
a reutilização de código, pois pode ser aproveitado em várias partes de um ou 
outros programas, evitando a repetição de comandos e instruções (VOTRE, 
2016). Com isso, os programadores escrevem blocos de comandos que realizam 
determinadas atividades de forma independente, como um cálculo matemático.
A função deve ser concisa, objetiva e executar apenas uma atividade ou funcionalidade. 
Assim, caso haja dificuldade de nomeá-la, significa que ela poderá ser subdividida em 
outras funções mais especializadas (DEITEL; DEITEL, 2011).
De modo geral, o procedimento e a função podem ser conceituados da 
seguinte forma (SILVA FILHO, 2010).
 � Procedimento: é um conjunto de instruções que desviam o fluxo de 
sequência de um programa, podendo ou não receber parâmetros, po-
rém, não retorna nenhum valor. Por exemplo, uma rotina que inclui o 
cabeçalho e o rodapé com dados da empresa em uma tela do sistema.
 � Função: é um conjunto de instruções que desviam o fluxo de execução 
de um programa, podendo ou não receber parâmetros. No entanto, uma 
função deve, obrigatoriamente, retornar um valor após a sua execução. 
Por exemplo, calcular o imposto de cada produto de uma nota fiscal.
Com a linguagem C++, é comum os programadores referenciarem as 
funções e os procedimentos como se fossem funções, porém, a diferença 
entre eles está no tipo do valor do retorno, pois o primeiro retorna um valor, 
já o segundo não retorna nada.
A declaração de uma função é realizada da mesma forma, tanto na lingua-
gem C como na C++ e segue o seguinte modelo, conforme explicam Deitel 
e Deitel (2011):
tipo de valor de retorno + nome da função + (lista de parâmetros)
Em que:
 � Tipo de valor de retorno: especifica o tipo do retorno. Para função, 
ele geralmente é um tipo primitivo, como int, float, char, etc., mas 
pode ser uma estrutura, um ponteiro, um objeto ou algum outro. Já 
para procedimento, ele se define pela palavra reservada void, que não 
possui retorno.
Funções e procedimentos2
 � Nome da função: define o nome pelo qual a função pode ser invocada 
ou chamada.
 � Lista de parâmetros: compreende os dados que são transferidos e 
podem ser utilizados e modificados dentro da função. Esse item é 
opcional, uma vez que a função não precisa ter parâmetros, por isso, 
nesse caso, pode-se usar a palavra reservada void para indicar que não 
existem parâmetros ou, simplesmente, deixar vazio.
Escolher os nomes de funções e parâmetros significativos torna os programas mais 
legíveis e ajuda a evitar o uso excessivo de comentários (DEITEL; DEITEL, 2011).
Veja o exemplo de uma função que recebe dois números do tipo double 
por parâmetro, efetua sua soma e retorna um valor, cujo tipo é double e se 
define pela palavra reserva return, que devolve a variável soma no final da 
execução. Já as variáveis n1 e n2 são passadas por parâmetro juntamente ao 
seu tipo de dados (double). Note que essa função define o tipo do seu retorno, 
assim, a instrução return deve, obrigatoriamente, devolver um valor do mesmo 
tipo de dados.
Em um exemplo semelhante, vê-seuma função que não retorna valor (um 
procedimento) e, nesse caso, deseja-se imprimir a subtração na tela, em vez 
de retornar o valor da soma. Na declaração da função, as diferenças estão na 
troca do tipo double por void e, na ausência da instrução, return.
3Funções e procedimentos
O terceiro exemplo apresenta uma função que não recebe parâmetros, 
nem devolve algum retorno. Por isso, ela imprime na tela o valor da cons-
tante matemática PI (M_PI), que está disponível na biblioteca <cmath> da 
linguagem C++.
Na linguagem C++, as funções e os procedimentos podem passar parâ-
metros de duas formas distintas, por valor e referência, sendo que, em uma 
mesma função, é possível passa-los apenas por um ou por outro, ou ambos 
simultaneamente (SILVA FILHO, 2010).
A passagem de parâmetros por valor se trata do modo mais usual, no qual 
uma cópia das variáveis é passada para a função e qualquer modificação 
nelas não produz alteração nas que foram passadas como parâmetro, porque a 
linguagem C++ cria outro endereço de memória para alocar, temporariamente, 
esses parâmetros usados apenas durante a execução da função. Quando a 
função se encerra, essas variáveis são liberadas da memória.
Já na passagem de parâmetros por referência, a função recebe o endereço 
de memória das variáveis que são passadas. Assim, qualquer modificação 
nelas produz alteração no seu conteúdo original, pois, em vez de alocar outra 
área na memória para os parâmetros, ela utiliza a mesma área da variável.
Para receber o endereço de memória das variáveis passadas como parâmetro 
por referência, é preciso que a função utilize ponteiros, pois, por meio deles, 
ela consegue acessar o endereço e modificar o valor original dessas variáveis. 
Você pode ver exemplos de passagem de parâmetros por valor e referência no 
tópico de chamadas de funções.
Chamada de funções e procedimentos
Você já viu como declarar funções e procedimentos, porém, ainda não apren-
deu como são realizadas as chamadas desses elementos. Para entender como 
isso funciona, deve-se rever a execução de um programa na linguagem C++.
A execução de um programa em C++ se inicia pelo método main, que é o 
primeiro a ser executado. Já o seu fluxo se realiza comando por comando, até 
que a última instrução seja executada e o programa se encerre (AGUILAR, 
2008). No entanto, quando se executa uma função, o fluxo de sequência pula 
Funções e procedimentos4
para as suas instruções e, ao final, retorna ao método principal ou ao que 
realizou a chamada para dar seguimento ao fluxo de execução do programa 
(AGUILAR, 2008).
Para realizar a chamada de uma função, é preciso conhecer o seu funciona-
mento, identificar se possui ou não retorno e quais os parâmetros requeridos, 
bem como conhecer os tipos de dados desses itens. Essa chamada é realizada 
pelo seu nome, e se a função retorna um valor, este pode ser atribuído a uma 
variável ou diretamente à outra função, como cout. O exemplo a seguir realiza 
a chamada das funções mostradas anteriormente.
Veja no método main que a chamada da função somar se realiza por meio 
da instrução que recebe dois parâmetros do tipo double (1.3 e 1.4) e retorna 
a soma à variável resultado, cujo valor é 2.7, conforme apresentado a seguir. 
Na sequência, o programa realiza a chamada da função imprimePI, a qual 
não possui parâmetros, nem fornece nenhum retorno.
No exemplo apresentado, as funções estão implementadas acima do método 
main e, portanto, quando a main é executada, essas funções já são conhecidas. 
5Funções e procedimentos
Contudo, deve-se inserir anteriormente o seu protótipo quando uma função é 
implementada depois do método que realiza a sua chamada.
O protótipo de uma função deve ser utilizado quando ela está implementada 
abaixo do método que realiza a sua chamada. Nesse caso, ele é colocado acima 
desse método para indicar o comportamento da função, o seu tipo de valor 
de retorno e os seus parâmetros — podendo indicar apenas o tipo de dado ou 
também as variáveis, conforme o seguinte exemplo.
Como mencionado anteriormente, existem duas formas de passar parâ-
metros para uma função: valor e referência. Para explicar as diferenças entre 
elas, serão apresentadas duas funções que recebem dois números inteiros e 
invertem seus valores.
Funções e procedimentos6
A função invertePorValor recebe os números 2 e 3 pelas variáveis a e b, 
respectivamente, e inverte os valores com o auxílio de uma variável auxiliar. 
No entanto, a mudança dos valores de a e b, por meio das variáveis n1 e n2, é 
refletiva apenas dentro da função e deixa os valores originais de a e b como 
2 e 3.
Já a função invertePorReferencia, que recebe os números 2 e 3 pelo caractere 
&, utiliza ponteiros para referenciar o endereço de memória das variáveis a e 
b por meio das variáveis *n1 e *n2. Assim, quando inverte os valores dentro 
da função, reflete essa modificação nas variáveis que estão fora dela, no mé-
todo main. Na Figura 1, você pode ver o resultado da execução do algoritmo 
apresentado.
Figura 1. Resultado da execução do algoritmo.
Em um programa C++, é possível fazer uma função reali-
zar sua própria chamada, esse recurso se chama função 
recursiva ou recursividade. Para saber mais sobre isso, veja 
o link ou o código a seguir.
https://goo.gl/iBYuAS
7Funções e procedimentos
Uso de variáveis locais e globais
As variáveis são expressões que podem armazenar valores temporariamente 
na memória, e seu conteúdo deve estar de acordo com o tipo de dado de sua 
declaração, por exemplo, uma variável do tipo int precisa armazenar um número 
inteiro. Além do tipo de dado, uma variável segue uma regra de escopo, na qual 
sua visibilidade varia conforme o local do programa em que foi declarada. Na 
linguagem C++, existem dois tipos, locais e globais (VOTRE, 2016).
Variáveis locais
As variáveis locais são declaradas dentro de uma função ou de um bloco de 
comandos e, por isso, apenas as instruções que estão na estrutura possuem 
acesso a elas. Assim, declarar e usar uma variável dentro de uma função ou 
de um bloco faz parte das melhores práticas, pois economizam recursos ao 
utilizar dados temporários de curta duração (VOTRE, 2016).
Para ilustrar que uma variável local e declarada não pode ser acessada fora 
do escopo, apresenta-se o seguinte exemplo, o qual tenta imprimir o conteúdo 
de uma variável declarada dentro de uma função.
Note que a variável x foi declarada dentro da função acessaVariavel e não 
pode ser acessada fora do seu escopo — da função apresentada. Nesse caso, ao 
tentar acessar o conteúdo de x pela instrução cout no método main, o seguinte 
erro será apresentado: ‘x’ was not declared in this scope.
Ainda em relação ao escopo, é possível declarar uma variável local com 
o mesmo nome de outra, desde que elas pertençam a escopos diferentes. 
Assim, ao utilizar uma delas, o programa usará sempre aquela que pertence 
ao escopo atual.
Funções e procedimentos8
No próximo exemplo, tem-se a criação de uma variável local chamada x, 
do tipo int, dentro da função escopo, com valor 10. Na sequência, verifica-se 
se ela é par e, caso seja positivo, atribui-se 3 a ela e cria-se outra variável 
com o mesmo nome, porém, do tipo float. Por fim, imprime-se o valor das 
variáveis, cujo resultado é 1.2 e 3.
Na linguagem C++, também se conhece uma variável local como automá-
tica. A instrução auto pode ser inserida antes do seu tipo de dado, porém, é 
opcional e, geralmente, a maioria dos programadores não a utiliza. Um exemplo 
de declaração de variável local automática está apresentado a seguir, em que 
ambas as declarações possuem o mesmo significado (DEITEL; DEITEL, 2011).
O armazenamento automático se trata de um meio de economizar memória, pois 
as variáveis automáticas existem somente quando necessárias. Elas são criadas ao se 
acionar a função na qual foram declaradas, e destruídas quando a função é encerrada 
(DEITEL; DEITEL, 2011).
Portanto, uma variável local armazena seus dados apenas durante a exe-
cução das instruções

Outros materiais