Você está na página 1de 78

Lilissanne Marcelly de Sousa

Lógica de
Programação
1ª edição

Palmas - TO
IFTO
2009
Governo Federal

Luis Inácio da Silva


Presidente da República Federativa do Brasil

Fernando Hadad
Ministro da Educação

Carlos Eduardo Bilschowsky


Secretário de Educação a Distância

© 2009 INSTITUTO FEDERAL DE EDUCAÇÃO,


CIÊNCIA E TECNOLOGIA DO TOCANTINS –
CAMPUS PALMAS
Todos os direitos reservados. É permitida a reprodução
parcial ou total desta obra, desde que citada a fonte e
que não seja para venda ou qualquer fim comercial.

Professor-Autor
Lilissanne Marcelly de Sousa

Equipe Técnica
Gislene Magali da Silva
Liliane Carvalho Félix Cavalcante
Madson Teles de Souza
Paulo da Silva Paz Neto

Revisor
Domênico Sturialle

Projeto Gráfico e Diagramação


Márcio da Silva Araújo

Ilustrador
Kemuel Alves e Alves

Normalização
Rosana Maria Santos de Oliveira

Ficha Catalográfica elaborada por: Rosana Maria Santos de Oliveira


Bibliotecária CRB2-810
2
Sumário
Conceitos iniciais 5
1.1 As tecnologias e o computador 5
1.2 O sistema computacional 6
1.2.1 Peopleware 6
1.2.2 Hardware 6
1.2.3 Software 7
1.2.3.1 Softwares básicos 7
1.2.3.2 Softwares aplicativos 7
1.2.3.3 Softwares aplicativos específicos 7
Introdução à lógica de programação 11
2.1 A lógica no nosso dia-a-dia 11
2.2 Algoritmos 12
2.2.1 Algumas formas de representação de um algoritmo 13
Introdução à Linguagem C 17
3.1 Breve histórico da linguagem C 17
3.2 Estrutura básica de um programa em linguagem C 17
3.3 A função principal main() 17
3.4 Palavras-chave 18
3.5 Diretivas de compilação 18
3.6 Comentários 19
Variáveis, constantes, tipos de dados e expressões 21
4.1 Variável 21
4.1.1 Regras para identificadores 21
4.2 Tipos de dados 22
4.3 Declaração de variáveis 23
4.3.1 Escopo de uma variável 24
4.4 Constante 24
4.4.1 Constante string 24
4.4.2 Constantes de barra invertida 25
4.5 Expressões aritméticas 25
4.6 Expressões relacionais 26
4.7 Expressões lógicas 26
4.7.1 Operador lógico da conjunção 27
4.7.2 Operador lógico da disjunção 27
4.7.3 Operador lógico da negação 27
Atribuição 31
5.1 Atribuição 31
5.2 Atribuição composta 33
5.3 Atribuição múltipla 33
5.4 Modificador de tipo (cast) 33
Comandos de entrada e saída de dados 37
6.1 Comandos de saída de dados 37
3
6.1.1 printf 37
6.1.2 puts 38
6.1.3 putchar 38
6.2 Comandos de entrada de dados 39
6.2.1 scanf 39
6.2.2 fgets 39
6.2.3 getchar 40
6.3 Aplicando os conceitos estudados 40
Instruções de seleção if e switch 43
7.1 Instrução de seleção if 43
7.2 Instrução de seleção switch 46
Instruções de repetição 51
8.1 Instrução de repetição while 51
8.3 Instrução de repetição for 54
Vetor e Matriz 59
9.1 Vetores 59
9.2 Matriz 60
9.3 Strings 62
Estruturas 67
10.1 Estruturas 67
10.2 Estruturas contendo estruturas 68
10.3 Vetores de estrutura 69
Modularização 73
11.1 Funções 73
11.2 Estrutura básica de uma função 73
11.3 Variáveis em funções 74
11.4 Parâmetros 74
11.5 Argumentos 75
11.6 Localização das funções no programa 75

4
1
CAPÍTULO

Conceitos iniciais

Introdução
Sabemos que o computador está cada vez mais presente em nossas vidas. Es-
tamos em contato com ele no trabalho, na escola, em casa. Por isso precisamos
decodificá-lo. Neste capítulo, vamos conhecer os elementos que constituem um
sistema computacional e compreender o conceito e a importância de cada um
deles. Com isso, o objetivo do capítulo é identificar os componentes básicos que
constituem um sistema computacional.

1.1 As tecnologias e o computador


Você faz uso de alguma tecnologia no seu dia-a-dia? Com certeza a sua resposta
é sim!!! Estamos em uma época onde nos tornamos dependentes da tecnologia.
Pela manhã, utilizamos o celular como despertador. Além do seu uso fim, que é o
de fazer e receber ligações, o celular serve ainda para enviar e receber mensagens
e e-mails, acessar a internet, tirar fotos, gravar vídeos e outras funcionalidades
que integram esse aparelho. Você tem um? Acredito que tenha, mas se não tem,
certamente utiliza outras tecnologias, como uma televisão com controle remoto,
que pode ser programada para ser desligada automaticamente após certo período
de tempo, ou talvez um forno de microondas ou uma sanduicheira elétrica ou
qualquer ferramenta que venha facilitar a nossa vida.
As últimas décadas foram marcadas por um avanço exponencial na evolução da
tecnologia em diversas áreas. Entre elas podemos destacar a eletrônica e as tele-
comunicações. E neste contexto está inserida uma ferramenta cada vez mais uti-
lizada: o computador. Desde o primeiro criado na década de 40, o ENIAC (Elec-
tronic Numeral Integrator and Calculator), o computador passou (e ainda continua
passando) por uma rápida evolução. Hoje, ele está cada vez mais rápido, menor e
mais acessível.
Vamos ver algumas características básicas do computador. Segundo Carboni
(2003, p. 1),

1. altíssima velocidade de processamento;


2. enorme capacidade de armazenamento;
3. alta velocidade de cálculos;
4. capacidade de executar longa sequência de instruções;
5. capacidade [e paciência] de executar tarefas repetitivas.

Espero que ele não seja considerado por você como um bicho-papão. for
bicho-papão Se for,
vamos quebrar o tabu! Na próxima seção, vamos conhecer um pouco do sistema
computacional, sem entrarmos em detalhes da parte eletrônica do computador, já
que esse não é o foco da nossa componente curricular.

5
IFTO - EaD / Informática
Lógica de Programação

1.2 O sistema computacional


O sistema computacional é formado por três componentes: peopleware, o har-
dware e o software. Calma, vamos explicar cada um deles.
Peopleware são as pessoas que fazem uso do computador, tanto como usuários
em geral ou como programadores. O hardware é composto pelas peças do com-
putador, o que podemos identificar visualmente, como monitor, mouse, teclado,
caixas de som, as placas que estão dentro do gabinete etc. E o software são os pro-
gramas do computador e é utilizado como interface entre o usuário (peopleware)
e a máquina (hardware). Resumindo, podemos dizer que:

Peopleware Hardware Software


Pessoa que utiliza o computa- A parte física do computa-
A parte lógica do computador
dor dor

Em outras palavras:

Peopleware Hardware Software


É você É o que você chuta! É o que você xinga!

Ainda não foi suficiente para entender? Então detalharemos mais um pouco.

1.2.1 Peopleware
Quando falamos de peopleware, referimo-nos às pessoas que utilizam o com-
putador. E no contexto da nossa disciplina, devemos entender que há dois tipos
de pessoas: o usuário comum, que faz uso das ferramentas do computador para
auxiliá-lo nas tarefas do dia-a-dia; e o programador, aquele que “define e codifi-
ca os comandos em um programa que ensine algo à máquina” (VILARIM, 2004,
p. 6), é ele quem desenvolve os programas utilizados pelos usuários comuns.

1.2.2 Hardware
O hardware, conforme já mencionamos, está relacionado com a parte física do
computador. É constituído por elementos básicos que formam a estrutura clássica
do funcionamento de um computador. Observe a figura a seguir.

Entrada UCP Saída

Memória
Principal
Figura 1: Estrutura básica de funcionamento do computador

Vamos entender cada uma das partes!


Unidades de entrada: são as partes do computador para as quais pode-
mos fornecer os dados que serão utilizados em algum cálculo. Exemplo:

6
IFTO - EaD / Informática
Lógica de Programação

teclado, mouse, leitora óptica, scanner e outras.


Unidade central de processamento (UCP): também chamada de CPU
- Central Processing Unit -, é a parte do computador que executa o proces-
samento dos dados de entrada e controla os componentes do sistema.
Memória principal: é responsável por armazenar os dados e os progra-
mas que irão processar esses dados.
Unidades de saída: são as partes do computador as quais apresentam os
resultados. Exemplo: monitor, impressora, caixa de som.

1.2.3 Software
Como vimos anteriormente, é a parte lógica do computador. Pode ser classifi-
cado em básico, aplicativo e aplicativo específico.

1.2.3.1 Softwares básicos


Carboni (2003, p. 6) explica que os softwares básicos “são os que fazem a inter-
face do usuário com a máquina, gerenciam o uso de aplicativos e periféricos em
geral”. Através deles, podemos utilizar a máquina de uma forma mais amigável.
Um exemplo muito importante de software básico é o sistema operacional.

Os sistemas operacionais são imprescindíveis, pois gerenciam computador e periféricos e


ainda fornecem uma interface entre hardware/aplicativos/ periféricos/usuário. Como exem-
plo, podemos citar o Windows XP, o Windows Vista, o Linux.

11.2.3.2
232S Softwares
ft aplicativos
li ti
São os programas que nos auxiliam nas tarefas diárias, tais como editores de
textos, desenhos, planilhas eletrônicas. Exemplo: Word, Excel, PowerPoint.

1.2.3.3 Softwares aplicativos específicos


São programas desenvolvidos por profissionais da área de desenvolvimento de
sistemas para atender uma demanda específica de um usuário, normalmente uma
empresa. São exemplos: programas para uma videolocadora, para um supermer-
cado e outros.
Para finalizar o capítulo, é importante que você tenha compreendido a com-
posição de um sistema computacional, fazendo uma interligação entre os com-
ponentes que o constituem. Observe que conhecer essa estrutura é fundamental
para quem pretende seguir profissionalmente na área da informática ou mesmo
utilizar-se dela no dia-a-dia, o que hoje é quase que inevitável.

Resumo
Neste capítulo, estudamos os componentes que formam um sistema computa-
cional: peopleware, as pessoas que utilizam o computador; hardware, a parte
física do computador; e software, os programas do computador. Vimos que as
pessoas que utilizam o computador podem ser classificadas em usuários ou pro-
gramadores. Vimos também que o hardware é constituído por quatro elemen-
tos básicos, que formam a estrutura básica de funcionamento do computador: a
7
IFTO - EaD / Informática
Lógica de Programação

entrada de dados (teclado, mouse, leitora óptica); o processamento de dados


(processa os dados de entrada); a memória principal (armazena os dados e os
programas); e a saída de dados (monitor, impressora, caixa de som). Além disso,
estudamos que os softwares podem ser classificados em básicos, sendo o sistema
operacional o principal deles; aplicativos tais como o word, excel e powerpoint;
e aplicativos específicos, desenvolvidos para atenderem uma demanda específi-
ca, como software para supermercado, videolocadora, almoxarifado e outros.

Atividades
As atividades aqui propostas deverão sedimentar os conhecimentos que você ad-
quiriu ao longo do texto, de forma que você consiga identificar os componentes
básicos que constituem um sistema computacional, o objetivo deste capítulo.

1. Sobre o sistema computacional, analise as proposições a seguir:


I. Peopleware é um componente do sistema computacional e está relacionado com
as pessoas que utilizam o computador, podendo ser classificadas em usuários ou
programadores.
II. O hardware é a parte física do computador, ou seja, é o que nós podemos ver.
III. Os softwares podem ser classificados em básicos, aplicativos e aplicativos
específicos.

Agora marque a alternativa correta.


Todas as proposições estão corretas.
Todas as proposições estão erradas.
Apenas a proposição II está correta.
Apenas as proposições I e III estão corretas.

2. Explique os quatro elementos básicos que formam a estrutura básica do funcio-


namento do computador.

Comentário sobre as atividades


Na atividade 1, se você marcou a alternativa (a), acertou. Todas as proposições
estão corretas. Isso porque o sistema computacional é constituído pelos seguintes
componentes: peopleware (pessoas que utilizam o computador); hardware (parte
física do computador - o que podemos ver e/ou tocar); e software (parte lógica do
computador, ou seja, os programas que utilizamos).
Na atividade 2, você explicou os elementos básicos que formam a estrutura
básica do funcionamento do computador. Lembrou-se de que os quatro elementos
básicos são: unidades de entrada, unidade central de processamento, memória
principal e unidades de saída. Explicou que as unidades de entrada são as partes
do computador, as quais podem fornecer os dados utilizados em algum cálculo
como, por exemplo, teclado, mouse, leitora óptica e scanner. Já a unidade central
de processamento (UCP) é a parte do computador que executa o processamento
dos dados de entrada e controla os componentes do sistema. A memória principal
é responsável por armazenar os dados e os programas que irão processar esses
dados. E, por fim, comentou que as unidades de saída são as partes do computador
8
IFTO - EaD / Informática
Lógica de Programação

onde os resultados são apresentados como, por exemplo, monitor, impressora e


caixa de som.

Bibliografia Consultada
CARBONI, Irenice de Fátima. Lógica de programação. São Paulo: Pioneira
Thomson Learning, 2003.
VILARIM, Gilvan de Oliveira. Algoritmos: Programação Para Iniciantes. Rio de
Janeiro: Ciência Moderna Ltda, 2004.

No próximo capítulo
Após você ter conhecido a estrutura de um sistema computacional e os elemen-
tos envolvidos, veremos como utilizá-lo no desenvolvimento de soluções para
os nossos problemas. Iremos dar ênfase à lógica de programação, que ensina o
computador a resolver as nossas questões. Até lá!

9
IFTO - EaD / Informática
Lógica de Programação

10
IFTO - EaD / Informática
2
CAPÍTULO Lógica de Programação

Introdução à lógica de programação

Neste capítulo, iremos tratar de assuntos relacionados ao pensamento lógico.


Por isso é importante que você faça uma reflexão sobre o uso da lógica em sua
vida cotidiana, sobre como você organiza o seu pensamento para realizar as di-
versas tarefas no seu dia-a-dia. Além disso, faça uma leitura do Capítulo 1, pois
poderá ajudá-lo(a) a compreender as fases de construção de um algoritmo. Sendo
assim, o objetivo do capítulo é conceituar algoritmos.

Introdução
Muitas tarefas hoje são executadas pelo computador. Ele tornou-se uma ferra-
menta importante para nos auxiliar em nosso trabalho. Cabe ressaltar, entretanto,
que o computador é programado para executar as tarefas que desejamos. Através
dos programas de computador, nós podemos dar ordens a ele e, assim, irá cumprir
o que lhe é designado. Por isso, quando designamos uma tarefa, esta deve estar
clara e bem definida para que o computador consiga executá-la corretamente.
Vemos, então, o uso da lógica em tudo o que fazemos, inclusive na programação.
Neste capítulo, veremos como utilizar a lógica na construção de algoritmos, pois
são como uma receita de bolo que devemos seguir para a solução de um proble-
ma.

2.1 A lógica no nosso dia-a-dia


Você já parou para pensar que, em tudo o que fazemos ou pensamos, utiliza-
mos a lógica (ou a ilógica)? Quando falamos, por exemplo, expressamos o nosso
pensamento e é necessário estabelecermos uma ordem de raciocínio, ou seja, pre-
cisamos organizar o nosso pensamento. É muito comum dizermos ou ouvirmos
as pessoas dizerem “Isso é lógico!” ou “Isso não tem lógica!”. Podemos dizer que
lógico é o que é evidente, coeso, correto. Observe o que fazemos quando quere-
mos “chupar uma bala”:

Pegar a bala;
Descascar a bala;
Colocar a bala na boca;
Jogar o papel da bala no lixo.

Observe que seguimos uma sequência lógica. É óbvio que não conseguiremos
chupar a bala sem antes retirarmos o papel que a envolve. Essa situação deixa
claro que utilizamos a lógica o dia inteiro. Mas, muitas vezes, temos dificuldade
em formalizar nosso raciocínio lógico. Um exemplo é quando pedimos a alguém
11
IFTO - EaD / Informática
Lógica de Programação

para executar uma tarefa que já estamos acostumados a realizar. Mesmo que exe-
cutar essa tarefa seja um processo natural para nós, quando queremos explicá-la a
alguém, deparamo-nos com uma dificuldade em descrever os passos que deverão
ser realizados. É necessário frisar a importância da sequência correta das ações
para que a tarefa seja executada corretamente, especialmente quando falamos da
lógica computacional, ou seja, quando descrevemos um conjunto de ações que
deverão ser executadas por um computador. Esse é o assunto da próxima seção.

2.2 Algoritmos
A construção de algoritmos é um passo importante na programação de compu-
tadores. Mas o que é um algoritmo? Podemos encontrar diversos conceitos na li-
teratura, sendo que todos nos fazem entender que o algoritmo é uma sequência de
instruções bem definidas com o objetivo de resolver um determinado problema. É
um caminho que traçamos para a solução de um problema.
Sabemos que, para um problema, podem existir diversas soluções. Por isso,
para um mesmo problema, podem ser gerados diferentes algoritmos. No entanto,
devemos procurar aquela solução que seja a mais rápida possível, que dá origem
a um algoritmo que nos leve a alcançar o nosso objetivo no menor espaço de
tempo.
É importante que as instruções sejam especificadas de forma clara para que,
segundo Forbellone e Eberspächer (2000, p. 3), a partir de um estado inicial, após
um período de tempo finito, produzam um estado final previsível e bem definido.
Se não definirmos com clareza as instruções, não conseguiremos alcançar o resul-
tado esperado.

Quando precisamos construir um algoritmo para resolver um determinado pro-


blema, devemos:
a) compreender o problema proposto;
b) verificar qual(is) a(s) forma(s) de resolvê-lo (fase de estudo);
c) descrever o algoritmo que deverá resolver o problema;
d) testar a solução junto aos usuários para sabermos se o algoritmo está ge-
rando os resultados esperados. Se não conseguir alcançar o seu objetivo,
reveja os passos mencionados para descobrir onde está a falha.

Vejamos um algoritmo para efetuar a troca de um pneu furado:


Posicione o carro em local adequado, puxe o freio de mão e engate a primeira
marcha;
Pegue o triângulo de sinalização e posicione-o;
Pegue o macaco, a chave de roda e o estepe;
Afrouxe os parafusos com a chave de roda;
Posicione o macaco e levante o carro;
Retire os parafusos;
Retire a roda com o pneu furado;
Coloque o estepe;
Coloque os parafusos e aperte-os um pouco com a chave de roda;
12
IFTO - EaD / Informática
Lógica de Programação

Abaixe o carro utilizando o macaco;


Dê o aperto final nos parafusos com a chave de roda;
Guarde o macaco, a chave de roda e o pneu furado;
Pegue o triângulo e guarde-o.
Observe que, neste algoritmo, descrevemos os passos que devemos seguir para
resolvermos o nosso problema: trocar um pneu furado. Se você analisá-lo, prova-
velmente conseguirá melhorá-lo.
Após ter definido o problema e antes de construir um algoritmo, ou seja, na
fase de estudo, devemos identificar três passos importantes para a formalização
do algoritmo, descritos também por Carboni (2003 p. 14): a entrada de dados,
isto é, o que eu preciso para resolver o problema; o processamento de dados,
como chegar ao que eu quero; e a saída de dados, isto é, o que eu quero ou o meu
objetivo.

Entrada de Processamento Saída de


dados de dados dados

Fazendo uma analogia com o algoritmo da troca do pneu furado, podemos iden-
tificar os três passos a seguir:

As ferramentas que você utilizou:


Entrada de dados triângulo, macaco, chave de roda
e estepe.

Processamento de dados Como você utilizou as ferramentas.

Saída de dados O pneu trocado.

Cabe ressaltar que, para aprender algoritmos, você deve praticar muito, cons-
truir e testar algoritmos. Não é possível aprender de outra forma. Na próxima
seção, veremos algumas formas de representar um algoritmo.

2.2.1 Algumas formas de representação de um algoritmo


Existem várias formas de se representar um algoritmo. Podemos citar a Des-
crição Narrativa, o Fluxograma e o Português Estruturado. A Descrição Narrativa
utiliza a linguagem natural (por exemplo, o português) para expressar o algorit-
mo. O Fluxograma representa as ações por meio de formas geométricas padro-
nizadas. Já o Português Estruturado, também conhecido como Pseudocódigo ou
Portugol, emprega uma linguagem intermediária entre a linguagem natural e uma
linguagem de programação para descrever os algoritmos. Vejamos um algoritmo
para somar dois números inteiros sendo representado pelas três formas:
13
IFTO - EaD / Informática
Lógica de Programação

Linguagem Natural Fluxograma Português Estruturado


Início do Programa Início
Leia os valores N1 e N2 Início Variáveis
Calcula o valor da soma Inteiro N1, N2, Soma
a partir da fórmula Leia (N1, N2)
(Soma=N1+N2) N1 Soma = N1 + N2
Imprime o valor da soma Imprime (Soma)
Fim
N2

Soma = N1 + N2

Soma

Fim

Quando convertemos os algoritmos para uma linguagem de programação, eles


passam a ser chamados de programas. No decorrer dos nossos estudos, iremos
representar nossos algoritmos na Linguagem de Programação C. Sendo assim,
iremos fazer mais referência à palavra programa.
Para finalizar este capítulo, é importante que você tenha compreendido o que é
um algoritmo e sua importância na descrição das instruções que levam à solução
de um determinado problema. Observe que o uso da lógica e a ordem do pensa-
mento são fundamentais para quem pretende seguir profissionalmente na área da
informática, especialmente para quem pretende seguir na área de desenvolvimen-
to de sistemas.

Resumo
Neste capítulo, estudamos como a lógica está presente em nossa vida e que
ela pode ser entendida como a organização do pensamento ou a ordem de ra-
ciocínio. Vimos a aplicação da lógica para a construção de algoritmos, um dos
conceitos mais importantes na programação de computadores. É por meio do
algoritmo que informamos ao computador o que ele deverá executar, através da
descrição detalhada de uma sequência de instruções que levam à solução de um
determinado problema. Vimos também três passos importantes que devem ser
identificados para a construção de um algoritmo: a entrada de dados, o pro-
cessamento de dados, e a saída de dados. Conhecemos também três formas de
representação de um algoritmo: a descrição narrativa, o fluxograma e o portu-
guês estruturado.

Atividades
14
IFTO - EaD / Informática
Lógica de Programação

As atividades aqui propostas deverão sedimentar os conhecimentos que você ad-


quiriu ao longo do texto, de forma que você consiga conceituar um algoritmo, o
objetivo deste capítulo.

1. Sobre algoritmo, analise as proposições a seguir:


I. Podemos dizer que algoritmo é uma sequência finita de instruções que levam à
solução de um determinado problema.
II. A construção de um algoritmo é formada por três fases: a entrada de dados,
o que você precisa para resolver o problema; o processamento de dados, o que
fazer com os dados de entrada; e a saída de dados, o seu objetivo final.
III. Uma vez criado o algoritmo, este não poderá mais ser modificado.
IV. Para cada problema é possível criar somente um algoritmo correto.

Agora marque a alternativa correta:


a) Apenas a proposição II está correta.
b) Apenas as proposições I, III e IV estão corretas.
c) Apenas as proposições I e II estão corretas.
d) Todas as proposições estão corretas.

2. Elabore um algoritmo detalhado para fazer uma ligação telefônica.

Comentário sobre as atividades


Na atividade 1, se você escolheu a alternativa (c), acertou. Somente as propo-
sições I e II estão corretas. Podemos, pois, conceituar algoritmo como sendo uma
sequência finita de instruções ou comandos que levam à solução de um determina-
do problema. Ele é constituído por três fases: a entrada de dados, o processamento
de dados e a saída de dados, conforme afirma a proposição II. Já as proposições
III e IV estão incorretas já que, uma vez construído um algoritmo, este poderá ser
modificado a qualquer tempo, especialmente se for detectado algum erro ou uma
situação inesperada na fase de teste. Além disso, sabemos que para um determina-
do problema pode haver diferentes soluções que geram diferentes algoritmos.
Na atividade 2, você construiu detalhadamente um algoritmo para fazer uma
ligação telefônica. Lembrou-se de que para elaborar um algoritmo você deve en-
tender o problema proposto, isto é, fazer uma ligação telefônica e identificar as
ferramentas (entrada de dados) necessárias para a solução do problema, neste
caso é o aparelho telefônico e o número que deseja discar. A partir disso, você
poderá estabelecer a sequência de passos que devemos seguir para conseguirmos
resolver o nosso problema, tendo em vista o uso correto das ferramentas que você
identificou.

Bibliografia Consultada
CARBONI, Irenice de Fátima. Lógica de programação. São Paulo: Pioneira
15
IFTO - EaD / Informática
Lógica de Programação

Thomson Learning, 2003.


FORBELLONE, André Luiz Villar; EBERSPÄCHER, Henri Frederico. Lógica
de Programação. 2 ed. São Paulo: Makron Books, 2000.

No próximo capítulo
Após você ter conhecido o conceito de um algoritmo e como ele pode ser re-
presentado, vamos conhecer um pouco da linguagem de programação C, utiliza-
da para representar os algoritmos que iremos construir. Dessa forma, poderemos
conversar com o computador, pois entenderemos um pouco de uma de suas lin-
guagens. Vamos nos encontrar lá!

16
IFTO - EaD / Informática
3
CAPÍTULO Lógica de Programação

Introdução à Linguagem C

Introdução
Neste capítulo, serão abordados alguns conceitos básicos da linguagem de pro-
gramação C. E a leitura dele é essencial para começarmos a programar usando
tal linguagem. Iremos estudar um pouco da história da C, a sua estrutura básica,
além de aspectos fundamentais da linguagem. O objetivo do capítulo é conhecer
os aspectos principais da linguagem C. Com isso, para um melhor entendimento
dele, é importante que você tenha estudado e compreendido os capítulos 1 e 2.

3.1 Breve histórico da linguagem C


O mentor e desenvolvedor da linguagem C foi Dennis Ritchie. Ela foi imple-
mentada inicialmente para o sistema operacional UNIX e tem suas origens na
linguagem BCPL (desenvolvida por Martin Richards), que influenciou a criação
da linguagem B (inventada por Ken Thompson). A linguagem B levou ao desen-
volvimento de C na década de 1970.
Embora implementada inicialmente para o UNIX, a linguagem C é independen-
te de sistema operacional ou de hardware. Possui como característica marcante o
alto grau de portabilidade, além de uma sintaxe estruturada e flexível, o que torna
sua programação simples. Isso facilitou a sua difusão entre os programadores.
Diante da rápida expansão, o American National Standard Institute padronizou
a linguagem em meados de 1980, surgindo o padrão C ANSI. Neste e nos demais
capítulos, procurou-se manter o padrão para a linguagem C.
Outras características importantes da linguagem: modularidade, recursos de
baixo nível, possibilidade de compilação separada de funções, geração de código
eficiente e confiabilidade.
Na próxima seção, veremos a estrutura básica de um programa em C.

3.2 Estrutura básica de um programa em linguagem C


Um programa em C é constituído de:
• o cabeçalho contendo as diretivas de compilador, onde é feita a inclusão
de bibliotecas, definidas constantes simbólicas e rotinas, declaração de
variáveis;
• o bloco principal de instruções, constituído da função main() e outros blo-
cos de rotinas;
• comentários, que constituem a documentação do programa.

3.3 A função principal main()


17
IFTO - EaD / Informática
Lógica de Programação

A função main deve estar presente em qualquer programa em C, pois é a partir


dela que nosso programa é executado. É também a partir dela que outras funções
são acionadas. Veja a sintaxe básica da main():

int main ()
{
<comandos>
return 0;
}
em que:
int – é o tipo de retorno da função main
main() – é a função principal do programa
{ - indica o início do corpo da função, onde encontram-se os comandos
} – indica o fim do corpo da função.
Seguindo o padrão ANSI, a função main retorna um inteiro ao sistema opera-
cional, que é o programa chamador. Utiliza-se, assim, o comando return 0 ao final
da main para realizar esse retorno. O valor 0 (zero) é utilizado pela maioria dos
compiladores de linguagem C.
Na declaração da função main(), podemos incluir parâmetros formais entre os
parênteses, sendo que a definição desses parâmetros pode ser omitida, mas não
pode ser alterada, pois é determinada pela linguagem.

3.4 Palavras-chave
As palavras-chave são identificadoras reservadas da linguagem e só podem ser
utilizadas para o fim a que se propõem. Não podem ser usadas, por exemplo,
como identificadoras de variável ou de função.

auto double int struct


break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
Fonte: (SCHILDT, 1996)

É importante ressaltar que as palavras reservadas da linguagem devem ser es-


critas da forma apresentada, ou seja, em letras minúsculas, pois o C é sensível a
maiúsculas e minúsculas. Assim, o identificador float é uma palavra chave, en-
quanto que Float não o é.
3.5 Diretivas de compilação
As diretivas de compilação não constituem instruções ou comandos. Elas são
processadas somente na compilação. Um exemplo comum é a inclusão de arquivo
através da diretiva #include. Esses arquivos geralmente contêm bibliotecas de
funções ou rotinas do usuário. Exemplo: #include<stdio.h>
18
IFTO - EaD / Informática
Lógica de Programação

Nesse exemplo, nós informamos ao compilador para incluir o arquivo de cabe-


çalho (biblioteca padrão externa de funções) stdio.h. No arquivo, estão declaradas
algumas funções para entrada e saída de dados. Sempre que precisarmos utilizar
uma dessas funções, devemos incluir esse comando.
Outra diretiva importante é a #define. Através dela podemos informar ao com-
pilador que constantes simbólicas serão usadas no programa.

3.6 Comentários
Os comentários são utilizados para explicarmos determinados trechos de códi-
go com o intuito de facilitar o entendimento desses trechos. As empresas de de-
senvolvimento de sistemas normalmente utilizam uma equipe para a implemen-
tação de seus programas. Por isso os comentários são importantes, já que outro
programador pode assumir o desenvolvimento ou a manutenção do seu código.
Quanto melhor explicado o seu código, maior facilidade de entendimento dele por
outros programadores.
Em linguagem C, os comentários devem vir entre os símbolos /* e */. Veja o
exemplo: /* Isso é um comentário */.
O compilador C++ permite que se comente somente uma linha utilizando o
símbolo // no início da linha, como no exemplo: //. Esse é um comentário de uma
linha apenas.
Os comentários podem ser feitos durante todo o desenvolvimento do seu pro-
grama.

Resumo
Neste capítulo, conhecemos um pouco da história da linguagem C, que foi
criada por Dennis Ritchie na década de 1970 e padronizada pelo American Na-
tional Standard Institute com o padrão C ANSI ou ANSI C. Vimos algumas das
principais características dessa linguagem, tais como: portabilidade, simplicida-
de, modularidade, recursos de baixo nível, possibilidade de compilação separada
de funções, geração de código eficiente e confiabilidade. Conhecemos a estrutu-
ra básica de um programa em C, algumas palavras reservadas, a função main
(que deve existir em qualquer programa). Vimos também algumas diretivas de
compilação e ressaltamos a importância de documentar nossos programas através
dos comentários.

Atividades
As atividades aqui propostas deverão reforçar seus estudos de forma que você
reconheça alguns aspectos fundamentais da linguagem C.
1. Comente sobre a função main() presente na linguagem de programação C.

2. Sobre a linguagem C, analise as proposições:


I. Todo programa em linguagem C inicia sua execução chamando a função main(),
sendo obrigatória a sua declaração no programa principal.
II. A linguagem C possui um grande problema de portabilidade, já que foi criada
somente para o sistema operacional UNIX.
III. Os comentários são utilizados para a documentação do programa, de forma
19
IFTO - EaD / Informática
Lógica de Programação

que possamos explicar determinados trechos de código, com o intuito de facilitar


o entendimento dos mesmos.
Agora marque a alternativa correta:
a) Todas as proposições estão corretas.
b) Apenas as proposições I e II estão corretas.
c) Apenas as proposições I e III estão corretas.
d) Todas as proposições estão erradas.

Comentário sobre as atividades


Na atividade 1, você descreveu que a função main deve estar presente em
qualquer programa em C, pois é a partir dela que nosso programa é executado.
Falou sobre sua sintaxe básica, definida pelo padrão C ANSI, e que podem ser
incluídos parâmetros formais entre os parênteses, sendo que a definição desses
parâmetros pode ser omitida, mas não pode ser alterada, pois é determinada pela
linguagem.
Na atividade 2, se você marcou a alternativa c, acertou. A afirmativa I é ver-
dadeira, uma vez que a função main é a principal dentro do programa, sendo sua
declaração obrigatória. A partir dela o programa é executado. Já a afirmativa II é
falsa, pois vimos que uma das características mais marcantes da linguagem C é a
sua portabilidade. E por fim, a afirmativa III é verdadeira, visto que os comentá-
rios são importantes para a documentação do programa por facilitarem a compre-
ensão do código para outros programadores.

Bibliografia Consultada
KERNIGHAN, Brian W.; RITCHIE, Dennis M. C: a linguagem de programa-
ção. Tradução sob a responsabilidade da EDISA – Eletrônica Digital S.A. Rio de
Janeiro: Ed. Campus. Porto Alegre: Edisa, 1986.
MANZANO, José Augusto Navarro Garcia. Estudo Dirigido de Linguagem C.
2. ed. São Paulo: Érica, 2002.
SCHILDT, Herbert. C, completo e total – 3 ed. Trad. Roberto Carlos Mayer. São
Paulo: Makron Books, 1996.

No próximo capítulo
Após você ter conhecido um pouco sobre a linguagem C, veremos alguns con-
ceitos básicos muito importantes no processo de desenvolvimento de programas
nessa linguagem. Vamos estudar o conceito de variável, constantes, tipos de da-
dos e expressões. Encontramo-nos lá!

20
IFTO - EaD / Informática
4
CAPÍTULO Lógica de Programação

Variáveis, constantes, tipos de dados e expressões

Introdução
Quando estudamos algoritmos, falamos das três fases ou passos que constituem
um algoritmo, quais sejam: entrada de dados, processamento de dados e saída de
dados. Agora vamos estudar onde esses dados são armazenados, de que tipos eles
podem ser e quais operações podemos fazer com esses dados.
Neste capítulo, objetivamos aprender o conceito de variáveis e constantes,
os tipos básicos de dados que podem ser armazenados em uma variável e como
construir expressões aritméticas, relacionais e lógicas utilizando variáveis e cons-
tantes. Para compreendê-lo, é importante que você tenha aprendido os conceitos
apresentados nos capítulos anteriores.

4.1 Variável
Quando falamos de variável, do ponto de vista da programação de compu-
tadores, referimo-nos a uma “região de memória previamente identificada que
tem por finalidade armazenar os dados ou informações de um programa por um
determinado espaço de tempo” (MANZANO, 2002, p. 44). A memória citada é a
do computador. Para entendermos como se organiza a memória do computador,
imagine que ela seja um armário com várias gavetas. Cada gaveta é identificada
por um endereço distinto em um formato que o computador entende.
O computador armazena os dados nas gavetas, sendo que em cada gaveta só é
possível armazenar um dado apenas. Sempre que o computador for armazenar um
dado em uma gaveta, o dado que estava armazenado anteriormente é perdido. O
conteúdo pode ser alterado, mas somente um dado por vez pode ser armazenado
naquele endereço (gaveta).
Como já falamos, o computador identifica cada gaveta através de um endereço
em um formato específico, qual seja, o hexadecimal. Para nós mortais é bastante
complicado trabalharmos com o endereço em tal formato. As linguagens de pro-
gramação permitem darmos um nome para cada endereço ou posição de memória.
Dessa forma, fica mais fácil nos referirmos a um endereço de memória através de
um nome.
Podemos dizer que uma variável é composta por dois elementos básicos. Con-
forme Carboni (2003, p.30):
a) conteúdo – valor atual da variável;
b) identificador – nome dado à variável para possibilitar sua manipulação.
Recapitulando: variável é um endereço de memória, representado por um nome,
cujo conteúdo pode ser alterado no decorrer do programa.
Vejamos como podemos dar um nome para uma variável.

4.1.1 Regras para identificadores


21
IFTO - EaD / Informática
Lógica de Programação

Para nomearmos uma variável, devemos seguir algumas regras importantes:


• O primeiro caractere deve ser uma letra ou o underline (Exemplo:
Nome).
• Pode conter letras e números (Exemplo: nota1).
• Não utilizar acentuação ou cedilha.
• Não pode conter símbolos especiais, com exceção do underline “_”, que
pode ser utilizado para simular um espaço em branco, pois este é consi-
derado um símbolo especial. Além do espaço em branco, outros símbolos
não são permitidos, por exemplo, “@”, “.”, “!”, “(“. (Exemplo: Nome_
pessoa).
• Não utilizar palavras reservadas da linguagem.
• Escolher nomes que explicam o seu conteúdo (Exemplo: Salario_funcio-
nario, idade_pessoa, numero).
• A linguagem C é sensível a maiúsculas e minúsculas. Portanto:
NOME ≠nome≠Nome≠NoMe, ou seja, são quatro identificadores distintos.
Com base nessas informações, vejamos alguns exemplos de identificadores vá-
lidos e não válidos.
Identificadores válidos Identificadores inválidos

Nome Nome.pessoa (o ponto é um símbolo especial)

Sexo_pessoa 1nota (começou com número)

Salário (não pode conter acento, pois é um símbolo espe-


matricula_aluno
cial)
QTDE pessoas (o espaço em branco é considerado um sím-
nota1
bolo especial)

nota2 (x) (os parênteses são símbolos especiais)

Bom, sabemos que uma variável é um endereço de memória identificado por


um nome. Nessa variável, podemos armazenar somente um dado por vez e o con-
teúdo pode ser mudado no decorrer do programa. Mas que tipo de dados podemos
armazenar em uma variável? Esse é o assunto da próxima seção.

4.2 Tipos de dados


Quando falamos de tipos de dados, referimo-nos à classificação dos valores
que poderão ser armazenados na variável. Conforme Manzano (2002, p.43), “os
dados são representados por elementos brutos a serem processados por um com-
putador, a fim de transformarem em informação”. Vejamos alguns tipos de dados
básicos predefinidos na linguagem C.
Inteiros: são os números positivos ou negativos, com exceção dos números
fracionários (números reais). Em linguagem C, chamamos o tipo de dado inteiro
de int. Exemplo: -5; 0; 46.
Reais: são os números positivos e negativos, incluindo os fracionários e intei-
ros. Na linguagem C, os números reais são conhecidos como ponto flutuante e
são chamados de float e double. É usado o ponto (.) e não a vírgula para separar a
parte inteira da parte decimal. Portanto, não se utiliza o ponto para separar a casa
22
IFTO - EaD / Informática
Lógica de Programação

do milhar. Exemplo: -8.6; -7; 0; 25; 7200.30.


Caracteres: são as sequências constituídas por letras, números e/ou símbolos
especiais, podendo ser constituídas por um único caractere. Ao conjunto de ca-
racteres chamamos de string. Os dados do tipo caractere devem ser delimitados
por aspas “ ”. Em C, o tipo de dado caractere é referenciado por char. Exemplo:
“Ana”, “João Pedro”, “X”, “#$”.
Não existe o tipo de dado lógico ou booleano na linguagem C para representar
os valores verdadeiro ou falso. Schildt (1996, p. 44) informa que, em C, verdadei-
ro é qualquer valor diferente de zero e falso é zero. Por padrão, iremos considerar
o valor zero (0) para falso e o valor um (1) para verdadeiro, especialmente quan-
do tratarmos mais à frente de expressões relacionais e lógicas.
É possível alterar a precisão dos valores utilizando modificadores, criando va-
riações dos tipos básicos. A seguir, são listados os modificadores de tipo usados
na Linguagem C.

Tamanho aproximado Faixa mínima [capacidade de representa-


Tipo de dado
em bits ção]
char 8 -127 a 127
unsigned char 8 0 a 255
signed char 8 -127 a 127
int 16 -32767 a 32767
unsigned int 16 0 a 65.535
signed int 16 -32767 a 32767
short int 16 -32767 a 32767
unsigned short int 16 0 a 65535
signed short int 16 -32767 a 32767
long int 32 -2.147.483.647 a 2.147.483.647
signed long int 32 -2.147.483.647 a 2.147.483.647
unsigned long int 32 0 a 4.294.967.295
float 32 seis dígitos de precisão
double 64 dez dígitos de precisão
long double 80 dez dígitos de precisão
Fonte: (Schildt, 1996)

Até este ponto, já vimos o que é uma variável e quais tipos de dados ela pode
armazenar. Na próxima seção, veremos como declarar uma variável no programa,
ou seja, como solicitar ao computador a reserva de uma área de memória (uma
gaveta!), que será previamente identificada.

4.3 Declaração de variáveis


Em linguagem C, todas as variáveis devem ser declaradas antes de serem utili-
zadas. É na declaração de variável, indicamos ao computador para reservar uma
área de memória onde será armazenado um dado de um tipo especificado.
A sintaxe de declaração de uma variável é a seguinte: tipo_de_dado identificador;
onde:
tipo_de_dado é um dos tipos básicos de dados vistos anteriormente;
23
IFTO - EaD / Informática
Lógica de Programação

identificador é o nome da variável, conforme as regras já vistas;


; é o finalizador da declaração.
Exemplos de declaração de variáveis em linguagem C:
int a;
float x, y;
Observe que podemos declarar mais de uma variável de um mesmo tipo. Neste
caso, separamos os identificadores por vírgula.
Quando declaramos uma variável a do tipo int (como no exemplo), na realida-
de, informamos ao computador para reservar uma área de memória que iremos
referenciar por a, onde poderemos armazenar dados do tipo int (lembrando que
será armazenado somente um dado por vez).
É importante ressaltar que no programa só podemos utilizar variáveis previa-
mente declaradas.
4.3.1 Escopo de uma variável
O escopo de uma variável está relacionado com a visibilidade da variável, ou
seja, onde ela pode ser referenciada e manipulada em seu programa. Uma variável
pode ser local ou global.
Variável local: uma variável é dita local quando sua declaração é feita dentro
de um bloco de código, sendo apenas visível dentro dele.
Variável global: uma variável é dita global quando é declarada fora de todas as
funções, podendo ser referenciada e manipulada em todo o programa.

Vejamos um exemplo de declaração de variáveis na função main():


int main ()
{
float numero;
int n1, n2;
.....
return 0;
}
No exemplo, as variáveis numero, n1 e n2 poderão ser manipuladas somente
pela função main().

4.4 Constante
É um valor que permanecerá inalterável durante a execução do programa. Ela
pode ser de qualquer um dos tipos básicos. Constantes do tipo caractere devem vir
entre aspas simples. Veja alguns exemplos:

Tipo de Dado Exemplos


char ‘a’, ‘1’, ‘x’
int 5, 2543, -15
float 23.8, -3.5, 65

4.4.1 Constante string


Uma string é um conjunto de caracteres. Esse tipo de constante deve vir delimi-
tado por um par de aspas. Por exemplo, “Brasil” é uma constante string.
24
IFTO - EaD / Informática
Lógica de Programação

4.4.2 Constantes de barra invertida


Também conhecidas como constantes de formatação, servem para imprimir al-
guns caracteres específicos. Veja a lista dessas constantes:
Código Significado
\b Retrocesso
\f Alimentação de formulário
\n Nova linha
\r Retorno de carro
\t Tabulação horizontal
\” Aspas dupla
\’ Aspas simples
\0 Nulo
\\ Barra invertida
\v Tabulação vertical
\a Alerta (beep)
\N Constante octal (N é o valor da constante)
\xN Constante hexadecimal (N é o valor da constante)

4.5 Expressões aritméticas


São aquelas cujos operadores são aritméticos e cujos operandos são variáveis
do tipo inteiro ou real. Isso envolve a utilização de cálculos matemáticos. A tabela
seguinte apresenta um resumo dos operadores aritméticos:

Operador Operação Exemplo


+ Adição 2+3

- Subtração 4-1

* Multiplicação A*B

/ Divisão A/3

% Resto da divisão inteira (mod) 9 % 2 resulta em 1

++ Incremento i++ incrementa o valor de i em uma unidade

-- Decremento x-- decrementa o valor de x em uma unidade

É importante ressaltar que o operador de divisão, quando aplicado a variáveis


inteiras, retornará um valor também inteiro; mas se pelo menos uma das variáveis
for em ponto flutuante, retornará um valor em ponto flutuante, mesmo que uma
das variáveis seja do tipo inteiro.
A precedência entre os operadores aritméticos é a seguinte:
1º: parênteses
2º: ++ --

25
IFTO - EaD / Informática
Lógica de Programação

3º: * / %
4º: + -

Em operações de mesma prioridade, primeiro resolvemos os operadores mais à


esquerda e, depois, os mais à direita da expressão. Veja alguns exemplos:
a) 2 * 5 % 4 +8
10 % 4 + 8
2+8
10

b) 1 – 4 * 3 / 6
1 – 12 / 6
1–2
-1

4.6 Expressões relacionais


São aquelas que estabelecem uma relação entre dois valores numéricos. Tais
valores podem ser constantes, variáveis ou expressões aritméticas. Os operadores
relacionais são os seguintes:

Operador Significado Exemplo


== Igual a 3 == 2 resulta em 0 (falso)

!= Diferente de 5 != 7 resulta em 1 (verdadeiro)


> Maior que 3 > 5 resulta em 0 (falso)
< Menor que 2 < 9 resulta em 1 (verdadeiro)
>= Maior ou igual a 7 >= 3+4 resulta em1 (verdadeiro)
<= Menor ou igual a 4+2 <= 10 resulta em1 (verdadeiro)

O resultado de uma expressão relacional é sempre um valor lógico: 1 para verda-


deiro ou 0 para falso. Quando em uma expressão relacional houver uma expressão
aritmética, resolve-se primeiro a aritmética para, depois, resolver a relacional.
Veja alguns exemplos:

a) 2 * 4 == 24 / 3
8 == 8
1

b) 2 + 8 % 7 >= 3 * 6 – 12
2 + 1 >= 18 – 12
3 >= 6
0

4.7 Expressões lógicas


Referem-se à maneira como as relações (expressões relacionais) podem ser co-
26
IFTO - EaD / Informática
Lógica de Programação

nectadas. Para isso, precisamos conhecer os operadores lógicos e a tabela-verdade


de cada um. É importante frisar que o resultado de uma expressão lógica é sempre
um valor lógico. Numa expressão lógica, os operandos podem ser valores lógicos
(0 ou 1) e expressões relacionais.

4.7.1 Operador lógico da conjunção


O operador da conjunção, também chamado de operador lógico E (AND), é
representado pelo símbolo &&. Para que uma conjunção seja verdadeira, é neces-
sário que os dois operandos sejam verdadeiros. Veja a tabela-verdade, consideran-
do P como o primeiro operando e Q como o segundo operando:

P Q P && Q (lê-se: P e Q)

1 1 1

1 0 0
0 1 0
0 0 0

4.7.2 Operador lógico da disjunção


O operador da disjunção, também chamado de operador lógico OU (OR), é
representado pelo símbolo ||. Para que uma disjunção seja verdadeira, é necessário
que pelo menos um dos operandos seja verdadeiro. Portanto, a disjunção só será
falsa quando os dois operandos forem falsos. Veja a tabela-verdade, considerando
P como o primeiro operando e Q como o segundo operando:

P Q P || Q (lê-se: P ou Q)
1 1 1
1 0 1
0 1 1
0 0 0

4.7.3 Operador lógico da negação


O símbolo ! representa o operador da negação, também chamado de operador
lógico NÃO (NOT). Caracteriza-se por inverter o estado lógico de um operando.
Em seguida é apresentada a tabela-verdade desse operador, considerando P como
operando:

P !P (lê-se: não P)

1 0

0 1

A precedência entre os operadores lógicos é a seguinte:


1º: parênteses
2º: !
27
IFTO - EaD / Informática
Lógica de Programação

3º: &&
4º: ||

Como uma expressão lógica pode conter expressões relacionais como operan-
dos, consequentemente, pode haver também expressões aritméticas. Neste caso,
resolvem-se primeiro as aritméticas, depois as relacionais e em seguida as lógi-
cas.
Veja alguns exemplos:
a) 2 < 5 || !(15 / 3 == 5)
2 < 5 || !(5 == 5)
1 || !1
1 || 0
1

b) 5 != 5 || (4 < 3+2 && 5 > -5)


5 != 5 || (4 < 5 && 5 > -5)
0 || (1 && 1)
0 || 1
1

Para finalizar esse capítulo, é importante que você tenha compreendido o con-
ceito de variável e dos tipos de dados que podemos armazenar nela e o conceito
de constantes, além de ter aprendido como usar os operadores na composição e
resolução de expressões aritméticas, relacionais e lógicas. Esses conceitos iniciais
são muito importantes para a construção de programas em linguagem C.

Resumo
Neste capítulo, vimos que variável é um identificador de área de memória pre-
viamente reservada, onde armazenamos um dado apenas e de um tipo especifi-
cado. Aprendemos que uma variável pode armazenar dados dos tipos caracteres
(char), inteiro (int) e real (float ou double) e que esse dado pode ser modificado
no decorrer da execução do programa. Vimos também como é feita a declaração
de variáveis e o conceito de constantes, cujos valores não podem ser modifica-
dos ao longo do programa. E, por fim, estudamos as expressões lógicas, relacio-
nais e lógicas e conhecemos os operadores que compõem cada um dos tipos de
expressões.

Atividades
As atividades aqui propostas deverão sedimentar os conhecimentos que você ad-
quiriu ao longo do texto, de forma que você consiga entender o conceito de variá-
vel, constante, tipos de dados; e utilizar os principais operadores da linguagem C
na construção de expressões.

1. Sobre variáveis, analise as proposições a seguir:

28
IFTO - EaD / Informática
Lógica de Programação

I. Podemos dizer que variável é um endereço de memória identificado por um


nome, onde armazenamos um dado.
II. Uma variável é composta por dois elementos básicos: conteúdo, que é o valor
armazenado na variável; e identificador, que é o nome dado à variável.
III. Uma constante pode ter seu valor modificado no decorrer da execução do
programa.
IV. Os tipos de dados que podemos armazenar numa variável são: caractere (char),
inteiro (int) ou real (float ou double).
Agora marque a alternativa correta:
a) Todas as proposições estão corretas.
b) Todas as proposições estão erradas.
c) Apenas a proposição II está correta.
d) Apenas as proposições I, II e IV estão corretas.

2. Descreva a sintaxe de uma declaração de variável.

3. Fale sobre as expressões relacionais.

4. Sabendo que A=5, B=4 e C=3 e D=6, resolva as expressões seguintes.


I. (A > C) && (C <= D) ( )
II. (A+B) > 10 || (A+B) == (C+D) ( )
III. (A>=C) && (D >= C) ( )
Agora marque a alternativa com a sequência correta das respostas.
a) I=1; II=0; III=1
b) I=1; II=1; III=1
c) I=1; II=0; III=0
d) I=0; II=0; III=1

Comentário sobre as atividades


Na atividade 1, se você marcou a alternativa d, acertou. Somente as proposi-
ções I, II e IV estão corretas. A afirmação III - uma constante pode ter seu valor
modificado no decorrer do programa - está errada, pois o seu conteúdo permanece
fixo e inalterado durante todo o programa. Já as afirmações I, II e IV estão cor-
retas, pois variável é um endereço de memória identificado por um nome, onde
armazenamos um dado, sendo composta por dois elementos básicos: conteúdo,
que é o valor armazenado na variável; e identificador, que é o nome dado à variá-
vel. Além disso, podemos armazenar numa variável os seguintes tipos básicos de
dados: caractere (char), inteiro (int) ou real (float ou double).
Na atividade 2, você descreveu a sintaxe de declaração de uma variável, que é
<tipo_de_dado identificador;>, onde <tipo_de_dado> é um dos tipos básicos
de dados vistos anteriormente; <identificador> é o nome da variável, conforme
29
IFTO - EaD / Informática
Lógica de Programação

as regras já vistas;<;> é o finalizador da declaração.


Na atividade 3, você falou sobre as expressões relacionais que estabelecem
uma relação entre dois valores numéricos e podem ser, por exemplo, de igualdade
ou de diferença, entre outros. Explicou que os operandos de uma relação podem
ser constantes, variáveis ou expressões aritméticas. Também frisou que o resulta-
do de uma expressão relacional é sempre um valor lógico: 1 para verdadeiro ou
0 para falso.
Na atividade 4, você deve ter marcado a alternativa b. Aplicando os conheci-
mentos adquiridos, você resolveu primeiro as expressões aritméticas, seguidas
das expressões relacionais e depois as lógicas. Deve ter observado que, quando
temos variáveis nas expressões, na realidade, utilizamos os valores armazenados
nelas. Na expressão I, por exemplo, os dois operandos da expressão lógica são
expressões relacionais. A primeira relação (A > C) resulta em 1 (verdadeiro) e a
segunda relação (C <= D) resulta em 1 (verdadeiro). Portanto, o resultado da ex-
pressão lógica 1 && 1 é 1, conforme a tabela-verdade da conjunção. A expressão
III segue a mesma lógica. Na expressão II, resolvemos primeiro as expressões
aritméticas entre parênteses (A+B) que resulta 9 e (C+D) que resulta 9. Dessa
forma, a expressão foi simplificada para 9>10 || 9==9. Então você resolveu as
relações que resultam 0 e 1, respectivamente. E por fim, resolveu a disjunção 0||1
que resulta 1.

Bibliografia Consultada
CARBONI, Irenice de Fátima. Lógica de programação. São Paulo: Pioneira
Thomson Learning, 2003.
MANZANO, José Augusto Navarro Garcia. Estudo Dirigido de Linguagem C.
2 ed. São Paulo: Érica, 2002.
SCHILDT, Herbert. C, completo e total. Trad. Roberto Carlos Mayer. 3 ed. São
Paulo: Makron Books, 1996.

No próximo capítulo
Após você ter conhecido o conceito de variável, constante, tipos de dados e
expressões, veremos um operador muito importante para o desenvolvimento de
programas: o operador de atribuição. Até lá!

30
IFTO - EaD / Informática
5
CAPÍTULO Lógica de Programação

Atribuição

Introdução
Após ter aprendido que podemos armazenar determinados tipos de dados em
uma variável e quais operações podemos fazer com uma variável, neste capítulo,
estudaremos uma das formas utilizadas para armazenarmos um dado em uma
variável, ou seja, como atribuímos um valor a uma variável. Para isso, vamos
conhecer o operador de atribuição, uma peça fundamental na construção de pro-
gramas em linguagem C.
Com isso, o objetivo do capítulo é ensinar você utilizar corretamente o opera-
dor de atribuição. E para o entendimento do capítulo é necessário que você tenha
compreendido os conceitos discutidos nos capítulos anteriores, pois o estudo da
programação é um processo sequencial, gradativo e acumulativo.

5.1 Atribuição
Em muitas linguagens de programação, a atribuição é considerada um coman-
do. Na linguagem C, a atribuição é considerada um operador. O operador de atri-
buição permite que seja atribuído um valor para uma variável especificada. Cabe
ressaltar que só é possível atribuir valor a uma variável que foi previamente de-
clarada.
O operador de atribuição é representado pelo símbolo “=” (igual) e sua sintaxe
geral é:

Nome_da_variavel = expressão;

Dessa forma, o valor da expressão localizada à direita do operador é transferido


para o endereço de memória indicado pela variável especificada à esquerda do
operador.
A expressão à direita pode ser uma constante somente, uma variável ou uma
expressão, conforme já estudamos em capítulo anterior.
Ao utilizar esse operador, você deve observar se o resultado da expressão irá
retornar o mesmo tipo de dado, ou equivalente, ao tipo da variável que irá receber
esse valor.
Vejamos um exemplo de um programa que utiliza o operador de atribuição:

1 int main ()
2 {
3 int a, b;
4 float x;
5 a= 5;
6 b=2;
7 x= a+b;
31
IFTO - EaD / Informática
Lógica de Programação

8 b= a;
9 return 0;
10 }

Vamos entender cada linha de comando desse programa.


Linha de comando Valor das variáveis
Na linha 1, descrevemos o cabeçalho da função main().

Na linha 2, marcamos o início do bloco principal da função main().


Na linha 3, declaramos duas variáveis (a e b) como sendo do tipo int,
a ->?
ou seja, foram reservadas áreas de memória para as variáveis a e b onde
b ->?
serão armazenados dados do tipo int.
Na linha 4, declaramos uma variável x como sendo do tipo float, ou a ->?
seja, foi reservada área de memória para a variável x onde será armaze- b ->?
nado dado do tipo float. x ->?
a ->5
Na linha 5, atribuímos o valor 5 ao endereço de memória reservado
b ->?
para a.
x ->?
a ->5
Na linha 6, atribuímos o valor 2 ao endereço de memória reservado
b ->2
para b.
x ->?
a ->5
Na linha 7, atribuímos o resultado da expressão a+b, isto é, o valor 7 ao
b ->2
endereço de memória reservado para x.
x ->7
Na linha 8, atribuímos o valor da variável a, ou seja, o valor 5 ao en- a ->5
dereço de memória reservado para b. Neste ponto, o valor antigo de b b ->5
é perdido. x ->7
a ->5
Na linha 9, indicamos o retorno da função main() para o sistema ope-
b ->5
racional.
x ->7
a ->5
Na linha 10, marcamos o fim do bloco principal. b ->5
x ->7

É importante lembrar que o programa é executado de forma sequencial (Lem-


bra-se do conceito de algoritmo?). Portanto, quando o valor da variável b foi
alterado na linha 8, não há alteração do valor de x na linha 7.
O operador de atribuição pode ser usado no momento da declaração de uma
variável. Isso significa que é possível inicializar uma variável no instante da sua
criação. Veja um exemplo:
int main ()
{
int numero = 0;
....
return 0;
}
32
IFTO - EaD / Informática
Lógica de Programação

Neste trecho, no momento da declaração, é reservada área de memória para a


variável numero e já se atribui o valor 0 (zero) a tal variável.

Uma observação importante:


Não confunda o operador de atribuição (=) com o operador relacional de igualdade
(==)!

5.2 Atribuição composta


A linguagem C permite combinar o operador de atribuição com um operador
aritmético para simplificar os comandos. Observe os exemplos de atribuição com-
posta:
A += 3; // o mesmo que A = A + 3;
num *= a+2; // o mesmo que num = num * (a + 2);

5.3 Atribuição múltipla


Quando falamos em atribuição múltipla, referimo-nos ao fato da linguagem C
permitir atribuir um valor a muitas variáveis em uma única linha de comando.
Veja um exemplo de atribuição múltipla:
V1 = V2 = V3 = 0;
Neste caso, o valor 0 é atribuído à variável V3, em seguida o valor de V3 é atri-
buído à V2 e depois o valor de V2 é atribuído à V1. Dessa forma, as três variáveis
terão o mesmo valor.

5.4 Modificador de tipo (cast)


Podemos forçar uma expressão a ser de um determinado tipo usando o operador
cast, que utiliza a sintaxe:
(tipo)expressão
Nela, o tipo é o nome do tipo o qual queremos converter o dado resultante de
expressão. Uma aplicação prática seria para a solução do problema da divisão
inteira.
Exemplo:
int main()
{
int i=10;
float x;
x=(float) i/7;
return 0;
}

No exemplo acima, a variável i foi declarada como sendo do tipo int, sendo
atribuído a ela o valor inicial 10. Também foi declarada uma variável do tipo float,
chamada x. Em seguida, vemos uma atribuição em que x recebe o resultado de
divisão entre uma variável do tipo inteira (i) por uma constante também inteira
(o valor 7). Conforme estudamos, uma divisão entre dois valores inteiros na lin-
33
IFTO - EaD / Informática
Lógica de Programação

guagem C sempre retorna um valor inteiro. Utilizamos, por isso, o modificador


(float) para informar ao compilador que o resultado da expressão deverá ser do
tipo float.
A expressão pode ser somente uma variável. Neste caso, é importante salientar
que a conversão de tipo é feita com o dado armazenado em uma variável, mas a
variável continua sendo do seu tipo original (o tipo declarado).

Resumo
Nesse capítulo, vimos como podemos armazenar um valor em uma variável
através do operador de atribuição. Aprendemos que é possível fazer uma atribui-
ção no momento da declaração de variáveis e que podemos atribuir um mesmo
valor a muitas variáveis, em uma mesma linha de comando, através da atribui-
ção múltipla. Além disso, a atribuição composta permite associar o comando
de atribuição a um operador aritmético de forma a simplificar o comando, como
por exemplo <N+=3;>, que é semelhante ao comando <N=N+3>. Vimos também
como forçar o resultado de uma expressão a ser do tipo desejado, conhecendo o
conceito de modificador de tipo (cast).

Atividades
As atividades aqui propostas deverão sedimentar os conhecimentos que você ad-
quiriu ao longo do texto de forma que você consiga utilizar corretamente o opera-
dor de atribuição, que é o objetivo deste capítulo.

1. Observe o programa a seguir e analise as proposições:

1 int main ()
2 {
3 float x, y;
4 int z;
5 x= 7.5;
6 z=10;
7 y= x+z;
8 z= z+ 5;
9 return 0;
10 }
I. Na linha 7, temos um erro, pois não é possível efetuar a soma de uma variável
do tipo int com uma variável do tipo float e atribuir o resultado a uma variável do
tipo float.
II. Ao final do programa, as variáveis x, y e z terão os valores 7.5, 17.5 e 15, res-
pectivamente.
III. Na linha 8, o valor da variável z é somado a 5. Consequentemente, o valor de
y na linha 7 também é alterado, sendo atualizado para 22.5.
Agora marque a alternativa correta:
a) Todas as proposições estão corretas.

34
IFTO - EaD / Informática
Lógica de Programação

b) Todas as proposições estão erradas.


c) Apenas a proposição II está correta.
d) Apenas as proposições II e III estão corretas.

2. Comente sobre o modificador de tipo (cast) presente na linguagem C

Comentário sobre as atividades


Na atividade 1, se você marcou a alternativa b, acertou. A afirmativa I está in-
correta, pois é possível realizar uma operação entre uma variável do tipo int com
uma variável do tipo float. Nesse caso, o resultado será do tipo float e poderá ser
armazenado em y, que é do tipo float. A afirmativa II está correta, pois se fizermos
o teste desse programa, veremos que ao final as variáveis terão os valores x=7.5,
y=17.5 e z=15. A afirmativa III está incorreta, pois na estrutura de seqüência, uma
vez executado um comando, o comando seguinte não interfere no comando exe-
cutado anteriormente.
Na atividade 2, você descreveu que o modificador de tipo é usado para forçar o
resultado de uma expressão a ser do tipo desejado. É comumente utilizado para se
resolver o problema da divisão inteira. Possui a sintaxe (float) expressão.

Bibliografia Consultada
MANZANO, José Augusto Navarro Garcia. Estudo Dirigido de Linguagem C.
2 ed. São Paulo: Érica, 2002.
SCHILDT, Herbert. C, completo e total. Trad. Roberto Carlos Mayer. 3 ed. São
Paulo: Makron Books, 1996.

No próximo capítulo
Após você ter aprendido a armazenar um determinado valor em uma variável
através do operador de atribuição, veremos alguns comandos que permitem a in-
teração com o usuário - os comandos de entrada e saída.

35
IFTO - EaD / Informática
Lógica de Programação

36
IFTO - EaD / Informática
6
CAPÍTULO Lógica de Programação

Comandos de entrada e saída de dados

Introdução
Neste capítulo, iremos tratar da interação entre programa e usuário, isto é, de
que forma o usuário que utiliza um programa poderá fornecer dados para o pro-
grama e como o programa dará informações ao usuário. A linguagem C oferece
diversas funções que permitem ler dados dos dispositivos de entrada e exibir da-
dos nos dispositivos de saída. Para isso, iremos estudar os comandos de entrada
e saída de dados.
Sendo assim, o objetivo do capítulo é utilizar corretamente os comandos de en-
trada e saída. Para tanto, é necessário que você tenha compreendido os conceitos
discutidos nos capítulos anteriores.

6.1 Comandos de saída de dados


Os comandos de saída possibilitam ao programa exibir dados para o usuário.
A saída padrão, onde os dados serão mostrados, será o monitor (vídeo). Vejamos
alguns comandos de saída que a linguagem C oferece.

6.1.1 printf
A função printf mostra dados formatados no vídeo. Ela faz parte do arquivo de
cabeçalho stdio.h. Sua sintaxe mais geral é:
printf (“especificador de formato”, argumento);
onde:
especificador de formato – especifica o formato para o tipo de dado a ser exi-
bido. Deve vir sempre entre aspas duplas. Veja alguns especificadores de formato
em C:

Código Formato
%c Um único caractere
%d Inteiro
%e Float em notação científica
%f Float
%g Float. C escolhe o melhor formato: normal ou notação científica
%o Números octais
%s String
%u Inteiro sem sinal
%x Número hexadecimal

argumento – é a variável (ou expressão), cujo valor será mostrado de acordo


com o formato especificado. É possível exibir uma lista de variáveis e estas deve-
rão vir separadas por vírgula e deve haver um especificador de formato para cada
37
IFTO - EaD / Informática
Lógica de Programação

variável.
Veja alguns exemplos da utilização do printf:
Exemplo 1:
printf (“Digite um numero: ”);
Será mostrado na tela Digite um numero:
Exemplo 2:
#include <stdio.h>
int main()
{
int num;
num = 10;
printf(“O valor é : %d “, num);
return 0;
}
Será mostrado na tela O valor é: 10

Exemplo 3:
#include <stdio.h>
int main()
{
int num;
num = 10;
printf(“O valor é %d e seu sucessor é %d “, num, num+1);
return 0;
}
Será mostrado na tela O valor é 10 e seu sucessor é 11

6.1.2 puts
Para exibir uma string, você pode utilizar a função puts do arquivo de cabeça-
lho stdio.h. Veja sua sintaxe:
puts (variavel)
Variavel é onde está armazenada a string.
Observe o exemplo:
#include <stdio.h>
int main()
{
char string[50];
printf(“Digite uma frase :”);
fgets(string,50,stdin);
printf(“A frase digitada foi : \n”);
puts(string);
return 0;
}
A função fgets é utilizada para entrada de dados e será explicada mais adiante.

6.1.3 putchar
A função putchar é utilizada para exibir um caractere na tela e faz parte do ar-
38
IFTO - EaD / Informática
Lógica de Programação

quivo de cabeçalho stdio.h. Sua sintaxe é:


putchar(variavel);
Veja um exemplo de sua utilização:
#include <stdio.h>
int main()
{
char ch;
printf(“Entre com um caracter :”);
ch = getchar();
printf(“\nExibindo o caracter com putchar: “);
putchar(ch);
return 0;
}

6.2 Comandos de entrada de dados


Os comandos de entrada possibilitam ao usuário entrar com dados no progra-
ma. Utilizaremos como entrada padrão o teclado. Vejamos alguns comandos de
entrada que a linguagem C oferece.

6.2.1 scanf
A função scanf é utilizada para entrada de dados formatada. Ela faz parte do
arquivo de cabeçalho stdio.h. Sua sintaxe é:
scanf(“especificador de formato”,&variavel);
O especificador de formato segue a mesma sintaxe da função printf.
Através desse comando, o usuário poderá fornecer um valor que será armaze-
nado no formato especificado no endereço de memória da variável explicitada.
Por isso antes da variável é colocado o operador de endereçamento &.
Para a leitura de uma string, não é necessário o operador &.
Exemplo:
#include <stdio.h>
int main()
{
int num;
printf(“Digite um numero inteiro :”);
scanf(“%d”,&num);
printf(“\n O antecessor do número é %d e seu sucessor é %d “,num-1,
num+1);
return 0;
}
Observe no exemplo que, como a variável num é do tipo int, o especificador
de formato utilizado na função scanf é o %d. Através dessa linha de comando, o
valor fornecido pelo usuário será armazenado no endereço de memória reservado
para a variável num.

6.2.2 fgets
A função fgets é utilizada para ler uma string do teclado e está vinculada ao
39
IFTO - EaD / Informática
Lógica de Programação

arquivo de cabeçalho stdio.h. Veja sua sintaxe:


fgets(VARIAVEL,TAMANHO,STREAM);
onde:
VARIAVEL é a variável onde a string será armazenada
TAMANHO é o tamanho máximo da string
STREAM é a origem de onde a string será lida. Utilize o valor stdin para ler do
teclado.
Veja um exemplo:
#include <stdio.h>
int main()
{
char string[30];
printf(“Digite uma string :”);
fgets(string,30,stdin);
printf(“A string digitada foi : \n”);
puts(string);
return 0;
}

6.2.3 getchar
A função getchar() é utilizada para receber um único caractere do usuário. Ela
está implementada no arquivo de cabeçalho stdio.h e possui a seguinte sintaxe:
var1 = getchar ();
A var1 é a variável onde será armazenado o caractere lido. O caractere é envia-
do quando é pressionada a tecla ENTER, que indica o caractere de controle \n.
Na descrição da função, a variável que irá armazenar o valor é do tipo int, mas
pode ser também do tipo char. A função getchar retorna o valor inteiro referente
ao código ASCII do caractere lido. Caso ocorra um erro durante a leitura, a função
retorna o valor EOF.
Veja um exemplo:
int main()
{
char ch;
ch=getchar();
putchar (ch);
return 0;
}

6.3 Aplicando os conceitos estudados


Problema 1: Faça um programa que leia as duas notas de um aluno. Calcule e
mostre a sua média.
Solução:
#include <stdio.h>
int main()
{
float nota1, nota2, media;

40
IFTO - EaD / Informática
Lógica de Programação

printf(“Digite a primeira nota do aluno :”);


scanf(“%f”,&nota1);
printf(“Digite a segunda nota do aluno :”);
scanf(“%f”,&nota2);
media = (nota1+nota2)/2;
printf(“\n A média do aluno é %f “, media);
return 0;
}

Problema 2: Faça um programa que leia a altura e a base de um triângulo.


Calcule e mostre a sua área.
Solução:
#include <stdio.h>
int main()
{
float altura, base, area;
printf(“Digite a altura do triângulo :”);
scanf(“%f”,&altura);
printf(“Digite a base do triângulo:”);
scanf(“%f”,&base);
area = (base * altura)/2;
printf(“\n A área do triângulo é %f “, area);
return 0;
}

Resumo
Neste capítulo, vimos os comandos de entrada e saída de dados. Para a saída
de dados, estudamos as funções printf (formata a saída apresentada), puts (exibe
uma string) e putchar (exibe um único caractere). Para a entrada de dados, co-
nhecemos as funções scanf (para entrada formatada), fgets (para a leitura de uma
string) e getchar (para a leitura de um único caractere).

Atividades
As atividades aqui propostas deverão sedimentar os conhecimentos que você ad-
quiriu ao longo do texto de forma que você consiga utilizar corretamente os co-
mandos de entrada e saída.

1. Sobre comandos de entrada e saída de dados, analise as proposições a seguir:


I. Os comandos de entrada possibilitam ao usuário fornecer dados ao programa.
II. Os comandos de saída permitem ao programa exibir dados para o usuário atra-
vés do monitor, por exemplo.
III. As funções getchar e putchar são utilizadas, respectivamente, para ler um ca-
ractere do teclado e para exibir um caractere no monitor.
Agora marque a alternativa correta:
a) Apenas a proposição II está correta.
b) Apenas as proposições I e III estão corretas.
41
IFTO - EaD / Informática
Lógica de Programação

c) Apenas as proposições I e II estão corretas.


d) Todas as proposições estão corretas.

2. Faça um programa que leia uma temperatura em graus Celsius e apresente-a


convertida para graus Fahrenheit. A fórmula de conversão é: F = (9 * C + 160) /
5, onde C é a temperatura em graus Celsius e F é a temperatura em graus Fahre-
nheit.

Comentário sobre as atividades


Na atividade 1, se você marcou a alternativa d, acertou. Todas as alternativas
estão corretas. Os comandos de entrada são utilizados para que o usuário possa
fornecer dados ao programa. Já os comandos de saída são utilizados para que o
computador exiba informações para o usuário, por exemplo, através do monitor,
que é um dispositivo de saída padrão. As funções getchar e putchar são comandos
de entrada e saída, respectivamente, de um caractere apenas.
Na atividade 2, você elaborou um programa para converter uma temperatura
em graus Celsius, fornecida pelo usuário, para uma temperatura em graus Fahre-
nheit. Para isso, você utilizou comandos de entrada e saída de dados. Uma possí-
vel solução seria:
#include <stdio.h>
int main()
{
float TempC, TempF;
printf(“Digite a temperatura em graus Celsisus :”);
scanf(“%f”,& TempC);
TempF = (9 * TempC + 160) / 5;
printf(“ A temperatura em graus Fahrenheit é %f “, TempF);
return 0;
}

Referências bibliográficas
MANZANO, José Augusto Navarro Garcia. Estudo Dirigido de Linguagem C.
2 ed. São Paulo: Érica, 2002.
SCHILDT, Herbert. C, completo e total. Trad. Roberto Carlos Mayer. 3 ed. São
Paulo: Makron Books, 1996.

No próximo capítulo
Após você ter conhecido alguns comandos de entrada e saída, vamos estudar
como alguns trechos de comandos poderão ou não ser executados, dependendo do
resultado de uma condição a ser analisada. Veremos as instruções (ou comandos)
de seleção. Até lá!

42
IFTO - EaD / Informática
7
CAPÍTULO Lógica de Programação

Instruções de seleção if e switch

Introdução
Em nossos programas até agora tratamos apenas de algoritmos lineares. Al-
goritmos executados passo a passo do início ao fim, sem pular linha alguma de
comando ou sem tipo de controle de execução algum. È o que chamamos de estru-
tura de sequência. Iremos introduzir aqui o conceito de instruções de seleção.
Através da instrução de seleção, será possível encontrar trechos de comandos
(ou instruções) que poderão ser ou não executados no programa, dependendo do
resultado de uma condição.
O objetivo do capítulo, com isso, é entender as instruções de seleção if e switch.
Portanto, como pré-requisito para o entendimento do capítulo, é necessário que
você tenha compreendido os conceitos discutidos nos capítulos anteriores.

7.1 Instrução de seleção if


A instrução if (que significa “se”) analisa uma condição e executa uma instru-
ção se a condição for verdadeira ou outra instrução (opcional) se a condição for
falsa. Vamos supor que queiramos saber qual é o maior número entre dois valores
fornecidos pelo usuário. Estes números ficarão armazenados nas variáveis “a” e
“b”. Para saber qual é o maior valor entre as duas variáveis, devemos compará-las
fazendo a seguinte pergunta: “a é maior que b?”. Sabendo disso, podemos impri-
mir o valor do maior elemento executando o seguinte comando: “se a é maior que
b, então imprima a, senão imprima b”.
Vamos ver a sintaxe da instrução if e logo em seguida utilizaremos um exemplo
para melhor entendermos a instrução.

if (condição)
instrução1;
else
instrução2;

Neste caso, se a condição for verdadeira, a instrução 1 será executada. Caso a


condição seja falsa, a instrução 2 será executada. O bloco de comandos ou ins-
truções vinculados ao else (que significa senão) só será executado se a condição
for falsa.
È importante observar que as instruções 1 e 2 nunca poderão ser executadas
ao mesmo tempo, pois nunca a condição poderá ser verdadeira e falsa ao mesmo
tempo. Portanto, somente uma delas será executada.
Se houver várias instruções, elas devem vir entre chaves { }, que delimitam o
bloco de instruções vinculados à verdade ou à falsidade da condição.

43
IFTO - EaD / Informática
Lógica de Programação

if (condição)
{
Instrução 1;
Instrução 2; // Chamamos este bloco de bloco-verdade, pois ele
será
... //executado se a condição for verdadeira.
Instrução n;
}
else
{
Instrução 1;
Instrução 2; // Chamamos este bloco de bloco-falsidade, pois ele
será
... //executado se a condição for falsa.

Instrução m;
}

Vamos agora verificar qual variável é maior.

#include <stdio.h>
int main()
{
int a,b; //declarando as variáveis
printf (“Digite um valor para a: ”);
scanf (“%d”,&a);
printf (“Digite um valor para b: ”);
scanf (“%d”,&b);
if( a > b) // se o valor de a for maior que o valor
de b faça
{
printf(“ a é maior”); // imprima: a é maior
}
else // senão
{
printf(“ b é maior”); // imprima: b é maior
}
return 0;
}

A instrução else não é obrigatória. Se desejarmos apenas saber se a é maior que


b, podemos fazer:

#include <stdio.h>
int main()
{
int a,b; //declarando as variáveis
44
IFTO - EaD / Informática
Lógica de Programação

printf (“Digite um valor para a: ”);


scanf (“%d”,&a);
printf (“Digite um valor para b: ”);
scanf (“%d”,&b);
if( a > b) // se a é maior que b faça
printf (“a é maior”); // imprima: a é maior
return 0;
}
Observe que foram omitidas as chaves, pois temos apenas uma instrução para
ser executada quando a condição for satisfeita. Eu, particularmente, gosto de co-
locar as chaves, uma vez que o código fica mais legível.
Se prestarmos atenção no primeiro código, vamos observar que ele tem um
erro. Se você o já descobriu, parabéns!
Caso o usuário entre com valores iguais, por exemplo, 5 para “a” e para “b”,
o programa irá imprimir “b é maior”. Mas por que será? É fácil, pois o progra-
ma verifica se 5 é maior que 5, e a resposta é falsa: 5 é igual a 5. Uma possível
alternativa para corrigir este programa é utilizar uma instrução if dentro de outra
instrução if, o que chamamos de ifs aninhados. Veja:

#include <stdio.h>
int main()
{
int a,b; //declarando as variáveis
printf (“Digite um valor para a: ”);
scanf (“%d”,&a);
printf (“Digite um valor para b: ”);
scanf (“%d”,&b);
if( a > b) // se a é maior que b faça
{
printf (“a é maior”); // imprima: a é maior
}
else // senão
if (b < a)
{
printf (“b é maior”); // imprima: b é maior
}
else
{
printf (“a e b são iguais”);
}
return 0;
}

Na condição, nós podemos usar qualquer um dos operadores relacionais e tam-


bém os operadores lógicos. Consequentemente, podemos ter também operadores
aritméticos. Se tivéssemos três valores fornecidos pelo usuário (armazenados em
a,b,c) e quiséssemos saber quem é a maior entre eles, por exemplo, usaríamos o if
45
IFTO - EaD / Informática
Lógica de Programação

aninhado. Vamos ver o exemplo e assim as coisas ficarão mais claras.

#include <stdio.h>
int main()
{
int a,b,c; //declarando as variáveis
printf (“Digite um valor para a: ”);
scanf (“%d”,&a);
printf (“Digite um valor para b: ”);
scanf (“%d”,&b);
printf (“Digite um valor para c: ”);
scanf (“%d”,&c);
if (a > b && a > c) // se a é maior que b e a é
maior que c
{
printf(“a e maior”); // imprima: a é maior
}
else // senão
{
if( b > a && b > c) // se b é maior que a e b é
maior que c
{
printf(“b e maior”); // imprima: b é maior
}
else // senão , se nem a nem b é
maior
//que c então é
{ // obvio que o c é o maior.
printf(“c e maior”); // imprima: c é maior
}
}
return 0;
}

A instrução if verifica se a expressão condicional (condição) é verdadeira ou


falsa, mas um ponto interessante da linguagem C/C++ é que uma instrução do tipo
if(1) sempre será verdadeira assim como uma instrução do tipo if(0) sempre será
falsa. Tudo que for diferente de 0 é verdadeiro, e 0 ou NULL é falso, conforme
vimos no capítulo 4.

7.2 Instrução de seleção switch


A estrutura de seleção switch pode ser utilizada somente em situações em que
precisamos estabelecer uma relação de igualdade entre uma variável inteira ou
caracter e um valor constante. Um bom exemplo é um menu do tipo: digite 1 para
somar, 2 para subtrair, 3 para multiplicar, 4 para dividir. Tal tipo de algoritmo
é melhor implementado com a instrução switch, que verifica se o valor de uma
46
IFTO - EaD / Informática
Lógica de Programação

variável é igual a alguma daquelas constantes (relação de igualdade). A sintaxe é


a seguinte:
switch (variável)
{
case constante_1: instruções; break;
case constante_2: instruções; break;
...
case constante_n: instruções; break;
default: instruções;
}
A instrução switch irá verificar se o valor da variável especificada é igual a uma
das constantes. Se for, as instruções são executadas até encontrar o comando bre-
ak, que força a saída do bloco de comando switch. Caso o valor da variável não
seja igual a nenhuma das constantes, então as instruções do bloco default serão
executadas (default é opcional).
É importante ressaltar que o switch só pode ser utilizado quando há a necessi-
dade de se estabelecer uma relação de igualdade entre uma variável do tipo int ou
char e um valor constante.
Vamos ao nosso exemplo de menu:

#include <stdio.h>
int main()
{
int op,a,b,c;
a=10;b=5; //inicializa as variáveis a e b
printf (“Digite 1 para somar\n”); //imprime o menu na
tela
printf (“Digite 2 para subtrair\n”);
printf (“Digite 3 para multiplicar\n”);
printf (“Digite 4 para dividir\n”);
scanf(“%d”,&op); //Lê um valor para a variável
op
switch(op) // caso op
{
case 1: c = a + b; break; //seja 1 então c=a+b
case 2: c = a - b; break; //seja 2 então c=a-b
case 3: c = a * b; break; //seja 3 então c=a*b
case 4: c = a / b; break; //seja 4 então c=a/b
default: printf(“Digite um número valido”);// caso contra-
rio imprima
}
printf(“\n%d”, c); // imprima c
return 0;
}

O programa anterior declarou quatro variáveis, sendo uma variável op (opera-


ção) e as variáveis a, b para receberem os valores, e c para guardar o valor com-
47
IFTO - EaD / Informática
Lógica de Programação

putado. Em seguida, são impressos na tela as opções para que o usuário escolha
uma delas. A opção escolhida será armazenada na variável op, cujo valor será ana-
lisado pelo comando switch. Caso o valor da variável op seja 1, então é realizado
a soma; caso seja 2, é realizado a subtração e assim sucessivamente. Se o usuário
entrar com um valor que não esteja constando, a opção default será executada,
imprimindo na tela a mensagem “Digite um número valido”.
Tratamos aqui de duas instruções de seleção que são de grande importância
para os futuros programas que você desenvolverá. Dificilmente você escreverá
um programa que não tenha uma instrução de seleção. Você pode escrever algo-
ritmos muito complexos aninhando ifs e colocando-os dentro de switch ou vice-
versa, mas para a completa compreensão das instruções de seleção, é necessário
que você pratique bastante.

Resumo
Neste capítulo, estudamos as instruções de seleção if e switch, aprendemos so-
bre a sintaxe das instruções, como utilizar operadores lógicos em instruções if e,
por meio de exemplos, conseguimos entender um pouco melhor cada uma dessas
instruções.

Atividades
1. Crie um programa escrito na linguagem C que leia um número digitado pelo
usuário, e diga se este número é par ou impar.

2. O que o trecho de programa seguinte irá imprimir na tela do computador?

#include <stdio.h>
int main()
{
int a=3;
switch(a)
{
case 1: printf(“número 1”);
case 2: printf(“número 2”);
case 3: printf(“número 3”);
case 4: printf(“número 4”);
case 5: printf(“número 5”);
}
return 0;
}

3. Qual será o valor da variável “a” ao término do seguinte trecho de programa?


Somente uma alternativa está correta.

48
IFTO - EaD / Informática
Lógica de Programação

#include <stdio.h> if(a<5)


int main() a=a-1;
{ else
a=a+2;
int a=5;
}
if(a>5)
switch(a)
{
{
if(a==5)
case 1: a=a*3;
a=a+3;
case 4: a=a/2;
else
case 7: a=a*a;
a=a-4;
case 8: a=a-3;
}
}
else
printf(“%d”,a);
{

a) O valor da variável a é: 49.


b) O valor da variável a é: 5.
c) O valor da variável a é: 7.
d) O valor da variável a é: 8.
e) O valor da variável a é: 46.

Comentário sobre as atividades


Na atividade 1, você declarou uma variável do tipo int que irá armazenar um
número fornecido pelo usuário. Para verificar se um número é par ou impar, é ne-
cessário a utilização do comando de seleção if. Um número é par quando o resto
da divisão dele por 2 (dois) é igual a 0 (zero), caso contrário, o número é impar.
Por isso, você utilizou o operado aritmético % (mod – resto da divisão inteira).
Dessa forma, você verificou se o resto da divisão do número fornecido pelo usu-
ário por 2 (dois) é igual a zero. Se for, imprima a mensagem “número par”, caso
contrário, imprima a mensagem “número impar”.
Na atividade 2, uma observação que você deve ter feito é que não foi coloca-
do o comando break ao final de cada case. O comando break finaliza a instrução
switch. Quando não colocado, o programa não finaliza a execução do switch e
continua executando as demais possibilidades. Sendo assim o programa imprimiu
não somente “número 3” como também imprimiu “número 4” e “número 5”, pois
vieram depois da instrução contida em “case 3:”.
Na atividade 3, temos uma pequena bagunça seletiva, que pode ter sido confuso
para você, mas não difícil. Vou comentá-la de forma que, se você não conseguiu
resolver ou ficou muito confuso(a), irá entender agora. Observe que a variável “a”
recebeu 5. Sendo assim, “a>5” é falso, pois 5 não pode ser maior que 5. Então o
nosso programa seguiu para a instrução “else” e foi verificado “a<5”, que também
é falso. O nosso programa outra vez foi para a instrução else e nela a=a+2, o que
fez nossa variável conter o valor 7. No comando switch, o programa foi para a
linha “case 7: a=a*a” e a variável “a” passou a ser 49. No entanto, não existe a
49
IFTO - EaD / Informática
Lógica de Programação

instrução break e o nosso programa executou a linha debaixo “a=a-3”. A nossa


variável passou a conter o valor 46 e alternativa correta é a letra (e).

Bibliografia Consultada
CARBONI, Irenice de Fátima. Lógica de programação. São Paulo: Pioneira
Thomson Learning, 2003.
MANZANO, José Augusto Navarro Garcia. Estudo Dirigido de Linguagem C.
2 ed. São Paulo: Érica, 2002.
SCHILDT, Herbert. C, completo e total. Trad. Roberto Carlos Mayer. 3 ed. São
Paulo: Makron Books, 1996.

No próximo capítulo
Na sequência, iremos ver as estruturas de repetição, que permitem fazer com
que uma linha de código (ou um bloco de comandos) seja executada quantas ve-
zes forem necessárias. Assim, deixamos os trabalhos repetitivos para a máquina
executar. Até lá!

50
IFTO - EaD / Informática
8
CAPÍTULO Lógica de Programação

Instruções de repetição

Introdução
Vamos supor que queiramos escrever um programa que imprima na tela do
computador os números de um a dez. Com o que sabemos até agora sobre pro-
gramação, o que iríamos fazer é repetir o comando printf dez vezes, uma para
cada valor. Isso, porém, torna-se inviável, pois imagine se quiséssemos imprimir
não somente os números de um a dez, mas de um a mil. Felizmente a linguagem
C oferece instruções que permitem repetir um bloco de comandos quantas vezes
forem necessárias.
Com isso, o objetivo do capítulo é compreender as instruções de repetição whi-
le, do...while, for. Além do mais, para o entendimento do capítulo, é necessário
que você tenha compreendido os conceitos discutidos nos capítulos anteriores.

8.1 Instrução de repetição while


A instrução while repete uma instrução ou conjunto de instruções enquanto
uma condição for verdadeira. Essa instrução analisa a expressão condicional antes
de executar a instrução ou conjunto de instruções que depende dela. O bloco de
instruções será executado enquanto a condição for verdadeira e quando a condi-
ção se tornar falsa, o fluxo de execução passa para a próxima linha após o fim do
bloco. A sintaxe da instrução while é:

while(expressão condicional)
{
Instrução_1;
Instrução_2;
...
Instrução_n;
{
Se quisermos repetir apenas uma instrução, as chaves são opcionais.
Um exemplo simples para entendermos a instrução while é o exemplo que se
encontra na introdução deste capítulo: imprimir os números de 1 a 10.

#include <stdio.h>
int main()
{
int i=1; //declara uma variável inteira de nome i
while(i<=10) //enquanto i menor ou igual a 10 faça
{
printf(“%d\n”,i); // imprima i e quebre para a próxima linha
i++; // incrementa o valor da variável i

51
IFTO - EaD / Informática
Lógica de Programação

}
return 0;
}
Este código ira verificar a variável i e executará as instruções entre chaves en-
quanto i for menor ou igual a 10. Observe que dentro do bloco de instruções existe
uma instrução “i++”, pois essa instrução incrementa a variável que a instrução
while analisa. Sem o incremento teríamos um laço infinito - um laço que nunca
termina -, já que a condição é sempre verdadeira. Por isso, preste muita atenção
ao criar um laço para saber se ele tem um fim.
Um erro comum entre os iniciantes é criar um laço que necessite da entrada
do usuário para sair do laço e esquecer de colocar a instrução de leitura dentro
do laço. Observe o exemplo seguinte que permanece no laço enquanto o usuário
digitar valores menores que 10:

#include <stdio.h>
int main()
{
int i;
scanf(“%d”,&i);
while(i<10)
{
printf(“Digite valores grandes para sair\n”);
scanf(“%d”,&i);
}
return 0;
}

No código anterior, é declarada uma variável “i” e é feita a leitura do valor di-
gitado pelo usuário, sendo colocado na variável “i”. Se o usuário digitar um valor
maior ou igual a 10, o código do bloco while não será executado vez alguma, mas
se o usuário digitar um valor menor do que 10, o código dentro do bloco while
será executado. Dentro do bloco, inicialmente, é impresso a mensagem na tela
(Digite valores grandes para sair), logo após é feita a leitura da entrada do usuário
e colocado esse valor na variável “i”. É aqui que, muitas vezes, os iniciantes em
programação falham, pois esquecem de fazer a leitura, ficando em um laço infi-
nito (variável “i” nunca se altera). Então, tome cuidado para que você não caia
neste erro.
Agora suponha que o usuário tenha digitado um valor menor do que 10. Dessa
forma, o laço irá executar novamente, imprimindo a mensagem e fazendo a leitura
do usuário novamente. Assim, somente haverá saída do laço no momento que o
usuário digitar um valor que não satisfaça a expressão condicional, ou seja, quan-
do o usuário digitar um valor maior ou igual a 10.
Vejamos um exemplo um pouco mais prático. No capítulo 7, vimos como uti-
lizar a instrução switch para montar um menu. Agora iremos utilizar também a
instrução while e criar um menu mais elaborado. Observe:
#include <stdio.h>
int main()
52
IFTO - EaD / Informática
Lógica de Programação

{
int op=0,a=10,b=5,c;
while(!op) //enquanto op não 0 faça
{
printf (“Digite 1 para somar\n”); //imprime o menu na tela
printf (“Digite 2 para subtrair\n”);
printf (“Digite 3 para multiplicar\n”);
printf (“Digite 4 para dividir\n”);
scanf(“%d”,&op); //Le a variável opção
switch(op) // caso op
{
case 1: c = a + b; break; //seja 1 então c=a+b
case 2: c = a - b; break; //seja 2 então c=a-b
case 3: c = a * b; break; //seja 3 então c=a*b
case 4: c = a / b; break; //seja 4 então c=a/b
default: // caso o valor de op não seja nenhum dos an-
teriores
printf(“Digite um numero valido\n”);
op=0; // op recebe 0
}
}
printf(“\n%d”, c); // imprima c
return 0;
}
Vamos entender o que está acontecendo no código anterior. Na primeira linha,
declaramos e inicializamos as variáveis. Observe que a variável op recebeu 0.
Logo em seguida, temos a instrução “while(!op)” e ela está dizendo: enquanto
não op. Sim, mas o que isso quer dizer? A instrução while, assim como qualquer
outra instrução que analisa expressões condicionais, irá verificar se a expressão
é verdadeira ou falsa. Além disso, nós sabemos que 0 é falso e que o operador
“!” é um operador lógico de negação (capítulo 4), ou seja, !verdade==falso e
!falso==verdade. Esse operador inverte o valor lógico. Isso quer dizer que, se 0 é
falso, então !0 é verdade. Sendo assim, enquanto a variável op for 0, a instrução
while continua no laço. O usuário terá que digitar um valor válido para sair do
laço, pois se digitar um valor inválido (que não está nas opções do menu) na ins-
trução default, será atribuído à variável op o valor 0.
8.2 Instrução de repetição do...while
A instrução de repetição do...while é semelhante à instrução while, porém o tes-
te condicional é feito no final, depois que a instrução é executada (ou instruções).
Isso garante que a instrução dentro do bloco do...while seja executada pelo menos
uma vez. A sintaxe é:
do
{
instruções;
}while(expressão condicional);

Se o bloco contiver apenas uma instrução, as chaves serão opcionais.


53
IFTO - EaD / Informática
Lógica de Programação

Vamos ver o mesmo exemplo da instrução while, mas agora para do...while.

#include <stdio.h>
int main()
{
int op,a=10,b=5,c;
do //ira executar uma vez o bloco de co-
mando
{ // independente do valor da expressão
condicional
printf (“Digite 1 para somar\n”); //imprime o menu na tela
printf (“Digite 2 para subtrair\n”);
printf (“Digite 3 para multiplicar\n”);
printf (“Digite 4 para dividir\n”);
scanf(“%d”,&op); //Le a variável opção
switch(op) // caso op
{
case 1: c = a + b; break; //seja 1 então c=a+b
case 2: c = a - b; break; //seja 2 então c=a-b
case 3: c = a * b; break; //seja 3 então c=a*b
case 4: c = a / b; break; //seja 4 então c=a/b
default: printf(“Digite um numero valido\n”);// caso contrario im-
prima
op=0; // op recebe 0
}
} while(!op); //enquanto op não 0 faça
printf(“\n%d”, c); // imprima c
return 0;
}
Observe que agora não precisamos iniciar a variável op com 0, pois indepen-
dente do valor de op o programa irá executar o bloco de comandos. A variável op
será uma entrada do usuário. Se o valor de op não estiver em nenhuma das alter-
nativas da instrução switch, a instrução default irá executar fazendo com que op
receba 0. Assim, o laço só será encerrado se o usuário digitar um valor válido.
Observe que em uma aplicação o usuário deve ter uma opção para não executar
nada e sair do programa, mas isso será deixado como exercício para você.

8.3 Instrução de repetição for


Nós utilizamos a instrução while ou do...while, especialmente, quando não sa-
bemos quantas iterações serão feitas, por exemplo, quando depende de uma entra-
da do usuário. O uso de for é mais adequado quando sabemos exatamente quantas
iterações nós teremos. Mesmo assim, ainda é possível se utilizar while, porém a
instrução for é mais apropriada para se trabalhar nestes casos, por ser mais fácil
para o entendimento. A sintaxe da instrução for é:
for (inicialização;expressão condicional; incremento)
{

54
IFTO - EaD / Informática
Lógica de Programação

Instruções;
}

Onde:
“inicialização” é a inicialização da variável de controle, é aqui que indicamos o
valor que a variável de controle irá começar o laço;
“expressão” é a condição de saída do for, a variável de controle a cada iteração
é comparada aqui;
“incremento” a cada iteração a variável de controle é incrementada ou decre-
mentada aqui.

Um exemplo vai ajudar a entender melhor.

#include <stdio.h>
int main()
{
int i;
for(i=1;i<=10;i++)// para i igual a 1, i menor ou igual a 10, i recebe i mais
1 faça
printf(“%d\n”,i); // imprima i e vá para próxima linha
return 0;
}

No exemplo, primeiro a variável i é inicializada em 1, o bloco de comando irá


se repetir enquanto i for menor ou igual a 10, e a cada laço o valor de i é somado
com 1 (incrementado em uma unidade). Outro exemplo que pode ajudar a enten-
dermos o laço for é um programa de exponenciação. Vamos supor que queiramos
saber o valor de “a” elevado a “b” (ab).

#include <stdio.h>
int main()
{
int a=2,b=3,i,result=1;
for(i=1;i<=b;i++) // para i igual a 1, i menor ou igual a b, incrementa i
{
result=result*a; // result recebe result vezes a
}
printf(“%d”,result);
return 0;
}

O laço começa dizendo que a variável i recebe 1. O laço será executado en-
quanto i for menor ou igual a b e em cada iteração o valor de i será incrementado,
isto é, somado com 1 (um). Quando o laço começa, a variável result contém o
valor 1 e a variável a o valor 2. Sendo assim, “result*a” produz o resultado 2, que
é colocado na variável result. Na próxima iteração, o valor de i é incrementado e
agora passa a ser 2, a comparação é feita “i<=b” (é o mesmo que “2<=3”) e pro-
55
IFTO - EaD / Informática
Lógica de Programação

duz resultado verdadeiro. Então, o laço continua e result (com o valor 2) agora
recebe “result*a”, que resulta em 4. Na próxima iteração, o valor de i é incremen-
tado e agora passa a ser 3, a comparação é feita “i<=b” (é o mesmo que “3<=3”),
sendo a expressão verdadeira. O laço continua e result (com o valor 4) agora re-
cebe “result*a”, que é 8. Na próxima iteração, o valor de i é incrementado e agora
passa a ser 4, a comparação é feita “i<=b” (é o mesmo que “4<=3”). Sendo assim,
a expressão é falsa e o laço termina. O valor da variável result é 8, que é ab.
Os exemplos deste capítulo nos deram uma noção do que se pode fazer com
instruções de repetição. Podemos utilizá-las para situações em que sabemos a
quantidade de iterações e para situações em que essa quantidade é indeterminada.
É possível criar códigos mais refinados com o que aprendemos neste capítulo

Resumo
Durante o capítulo foi explanado sobre os laços while, do...while e for. Esses
comandos ou instruções permitem que uma instrução ou um bloco de instruções
seja repetido várias vezes. Vimos a importância de um controle para saída do laço.
Também foi possível compreender as facilidades que os laços trazem, reduzindo
o trabalho repetitivo por parte do programador.

Atividades
1. Crie um programa, utilizando laço while, que faça a leitura de um inteiro digi-
tado pelo usuário e o armazene na variável “num”. Em seguida, imprima todos os
números divisíveis por num no intervalo de 0 a num, isto é, todos os números que
dividem “num” e têm resto zero.

2. Resolva a atividade 1, utilizando um laço for.

3. Qual será a saída do programa seguinte se, no momento anterior ao laço, a va-
riável “i” tiver o valor 0? E se a variável “i” tiver o valor 1?
#include <stdio.h>
int main()
{

int i=var; // assuma para “var” o valor 0 e depois o valor 1.


do
{
printf(“%d”,i);
i--;
}while(i>=0);
return 0;
}

4. Observe o código seguinte e marque a alternativa que representa o valor da


variável “i” após a execução do programa.
56
IFTO - EaD / Informática
Lógica de Programação

#include <stdio.h>
int main()
{
int i=0,a=5;
while(a)
{
a--;
i=a+a-i;
}
return 0;
}
a) -6
b) 6
c) -4
d) 4
e) 2

5. Observe o código seguinte e marque a alternativa que representa o valor da


variável “i” após a execução do programa.
#include <stdio.h>
int main()
{
int i=0,a=5;
do
{
i=a+a-i;
a--;
} while(a);
return 0;
}
a) -6
b) 6
c) -4
d) 4
e) 2

6. Observe o código seguinte e marque a alternativa que representa o valor da


variável “i” após a execução do programa.
#include <stdio.h>
int main()
{
int a,i=0;
for(a=0;a<5;a++)
{
57
IFTO - EaD / Informática
Lógica de Programação

i=a+a-i;
}
return 0;
}
a) -6
b) 6
c) -4
d) 4
e) 2

Comentário sobre as atividades


Na atividade 1, você declarou uma variável do tipo int (inteiro) chamada num.
Essa variável irá armazenar um valor fornecido pelo usuário, que representa
quantas vezes o laço deverá ser executado. Também declarou uma outra variável
inteira que será usada como auxiliar para controlar o número de execuções do
laço. Por isso, tal variável deve ser inicializada com o valor 0 (zero) e incremen-
tada antes do final do bloco do while. Essa mesma variável auxiliar foi utilizada
para verificar se o seu valor é divisível por num (isto é, o número fornecido pelo
usuário). Para isso, você utilizou o operador % (mod – resto da divisão inteira),
fazendo a comparação se o resto da divisão da variável num pela variável auxiliar
é igual a zero. Caso seja, mostre o valor da variável auxiliar.
A atividade 2 foi resolvida de forma semelhante a 1, porém foi usada a ins-
trução for. Só que neste caso, a variável auxiliar é inicializada e incrementada na
linha de comando da instrução for.
Na atividade 3, você pode perceber que, independente do teste condicional, o
bloco de instruções foi executado pelo menos uma vez.
Nas atividades 4, 5 e 6, às vezes, a cabeça ficou um pouco confusa com as
variáveis e iterações. Para facilitar, você poderia ter escrito o valor das variáveis
em um rascunho, atualizando a cada instrução e iteração. Assim, a mente trabalha
de forma mais tranquila. As respostas para essas atividades são, respectivamente,
(d), (b) e (d).

Bibliografia Consultada
CARBONI, Irenice de Fátima. Lógica de programação. São Paulo: Pioneira
Thomson Learning, 2003.
MANZANO, José Augusto Navarro Garcia. Estudo Dirigido de Linguagem C.
2. ed. São Paulo: Érica, 2002.
SCHILDT, Herbert. C, completo e total. 3 ed. Trad. Roberto Carlos Mayer. São
Paulo: Makron Books, 1996.
No próximo capítulo
Estudaremos os vetores e matrizes, que são conjunto de variáveis de um mes-
mo tipo. Veremos também de que forma podemos utilizar os laços para percorrer
vetores e matrizes.

58
IFTO - EaD / Informática
9
CAPÍTULO Lógica de Programação

Vetor e Matriz

Introdução
Muitas vezes nós temos que trabalhar com uma grande quantidade de variáveis.
Se quiséssemos armazenar a idade de dez pessoas, por exemplo, teríamos que
declarar uma variável para cada pessoa. Para evitar esse grandioso número de va-
riáveis que nos deixariam confusos, podemos declarar apenas uma variável vetor,
que tem espaço para armazenar vários valores.
Sendo assim, objetivamos neste capítulo compreender, criar e manipular veto-
res e matrizes. Lembramos novamente a importância da compreensão dos concei-
tos discutidos nos capítulos anteriores para o entendimento satisfatório deste.

9.1 Vetores
Os vetores são também chamados de array, um conjunto de variáveis de mesmo
tipo, armazenadas juntas e acessadas através do nome da variável mais seu índice.
Observe a figura 9.1.

vet
0 1 2 3 4 5 6 7 8 9
Figura 9.1 - Um vetor de nome vet com seus índices

Aqui temos uma variável chamada vet, que contém espaço para armazenar dez
valores acessados pelos índices (ou posições) e indicados na parte inferior da ima-
gem. A primeira posição de um vetor em C é sempre a posição 0 e o último índice
é sempre o tamanho do vetor -1. Para declararmos um vetor use:
tipo_de_dado nome_da_variavel_vetor[tamanho_do_vetor];
Onde:
● tipo_de_dado é um tipo de dado da linguagem C ou um tipo criado pelo usuário
(struct);
● nome_da_variavel_vetor é um nome qualquer (que respeite as regras para de-
claração de variáveis), que será usado para acessar o conteúdo da variável vetor;
● tamanho_do_vetor é o tamanho que o vetor terá. É essa instrução que indica ao
compilador o quanto de espaço ele terá que reservar para armazenar o vetor. Se
quisermos, por exemplo, criar uma variável chamada vet que possa armazenar 10
inteiros, faremos da seguinte forma:
int vet[10];
Depois de declarada a variável, podemos acessar seus elementos através do
índice do vetor e a sintaxe é:
nome_da_variavel_vetor[índice];
Para acessarmos o primeiro elemento do vetor vet faremos:
59
IFTO - EaD / Informática
Lógica de Programação

vet[0]
Para acessarmos o último elemento do vetor vet faremos:
vet[9]
Com a utilização das instruções de repetição, podemos percorrer todo o vetor
com poucas linhas de código, independente do tamanho do vetor. Por exemplo,
vamos percorrer um vetor de 10 posições e, de acordo com as entradas do usuá-
rio, vamos preencher esse vetor. Em seguida, vamos correr o vetor e imprimir os
valores que o usuário digitou.
#include <stdio.h>
int main()
{
int vet[10];
int i;
for(i=0;i<10;i++)
{
scanf(“%d”, &vet[i]);
}
for(i=0;i<10;i++)
{
printf(“%d\n”,vet[i]);
}
return 0;
}
As duas instruções “for” fazem com que a variável “i” seja inicializada em 0
e depois vá sendo incrementada até 9, que são os índices da matriz. No primeiro
for, é feita a leitura dos dados com a instrução “scanf(“%d”,&vet[i])”. Já que a
variável i vai sendo incrementada, a cada iteração nós conseguimos acessar a va-
riável vet em todos os seus elementos. Na segunda instrução for, são impressos os
valores do vetor, “printf(“%d\n”,vet[i])”.
Uma consideração importante é que C não verifica se você está acessando um
elemento a mais que o tamanho da matriz. No vetor vet, por exemplo, se o ele-
mento vet[10] fosse acessado, a linguagem nos permitiria. Isso, porém, é um erro
gravíssimo, pois estamos tentando acessar um endereço de memória que não está
reservado para nós, é invasão de memória, pode travar nosso programa. E se
tentarmos vet[10000], talvez este endereço seja de um outro programa, podendo
causar erro.
Os sistemas operacionais modernos não nos permitem acessar memória de ou-
tros programas, mas podemos causar grandes estragos em nossos programas aces-
sando algo que não sabemos o que é. Por isso preste bastante atenção em qual é o
tamanho do seu vetor para não acessar memória não alocada para você.

9.2 Matriz
As matrizes são vetores com mais de uma dimensão, assim como as matrizes
que vimos em matemática no colégio. Cada elemento da matriz é acessado pelo
nome da matriz e seus índices, sendo um índice para cada dimensão. Por exem-
plo, uma matriz com duas dimensões tem dois índices (um para linha outro para
60
IFTO - EaD / Informática
Lógica de Programação

coluna); uma matriz com três dimensões tem três índices (linha, coluna e profun-
didade). Em C podemos trabalhar com matrizes com diversas dimensões, o que
torna o código cada vez mais complexo. Dificilmente, no entanto, você precisará
escrever um código para uma matriz com mais de três dimensões. Observe a ima-
gem 9.2 que nos mostra uma matriz de duas dimensões com seus índices.

mat 0 1 2

0
1
2 5

Figura 9.2 – Matriz de duas dimensões com seus índices

Para declarar uma matriz ou um vetor de duas dimensões, utilize a seguinte


sintaxe:
tipo_de_dado nome_da_variavel_matriz[numero_de_linhas] [numero_de_colu-
nas];
Para declararmos uma matriz de quatro linhas (horizontal) e três colunas (ver-
tical), conforme a imagem 9.2, faça:
int mat[4][3];
Se quisermos colocar o número 5 na terceira linha e segunda coluna da matriz
mat (conforme a figura 9.2), faça:
mat[2][1]=5;
E da mesma forma como conseguimos acessar os elementos de um vetor utili-
zando a instrução for também acessaremos a matriz utilizando “for”. Neste caso,
teremos que ter dois laços, um dentro do outro, pois temos dois índices para cada
elemento. Vamos analisar como isso irá acontecer antes de mostrar o exemplo.
Para cada linha, iniciando no índice 0, teremos que variar a coluna de 0 a 2. As-
sim, conseguiremos acessar os elementos mat[0][0], mat[0][1], mat[0][2]; depois,
para a linha igual a 1, teremos mat[1][0], mat[1][1], mat[1][2]; e assim por diante
até a ultima linha. Vamos ver como podemos preencher a matriz com os valores
digitados pelo usuário.
#include <stdio.h>
int main()
{
int mat[4][3];
int l,c; // l para linha e c para coluna
for(l=0;l<4;l++) // corre todas as linhas
{
for(c=0;c<3;c++) // corre todas as colunas
{
scanf(“%d”, &mat[ l ][ c ]);// preenche a matriz
nos índices l
//e c com o valor digitado pelo
usuário
61
IFTO - EaD / Informática
Lógica de Programação

}
}
return 0;
}
O “for” mais externo incrementa o índice da linha e o for mais interno incre-
menta o índice da coluna. Dessa forma, para cada linha são percorridas todas as
colunas; e com a instrução “scanf(“%d”, &mat[ l ][ c ]);”, é possível ler os valores
e colocá-los na posição correta. Observe que, quando o for mais interno está sen-
do executado, a variável “l” (linha) não muda. Ela só será incrementada depois
que o laço mais interno terminar e o controle do programa passar para o laço mais
externo. Quando o controle voltar para o laço mais interno, a variável “c” (coluna)
recebe 0 novamente. Assim, o laço mais interno acontece, é executado mais uma
vez e assim por diante.

9.3 Strings
Strings nada mais são do que vetores de caracteres. Quando se deseja arma-
zenar uma sequência de caracteres, essa sequência deve ser armazenada em um
vetor de char. O compilador e as funções de manipulação de string entendem
como fim da string um caractere \0 (é o mesmo que NULL). Observe a figura 9.3,
pois temos um vetor de char chamado “str” de tamanho 10 e nele foram inseridos
alguns caracteres, sendo o último o caractere \0, que indica o fim da string.
Se utilizássemos a função printf para imprimir essa string, ela seria impressa
até um caractere antes do \0 . Sendo assim, se for declarado um vetor de caractere
de tamanho 20, nós só poderemos colocar 19 caracteres, pois o ultimo é o \0 ou
caractere nulo.

str a s d f g h \0

0 1 2 3 4 5 6 7 8 9

Figura 9.3 – Vetor de char de nome str com alguns caracteres e terminado com \0.

Como exemplo, vamos pedir para que o usuário digite seu nome. Em seguida,
o nome do usuário será impresso na tela.
#include <stdio.h>
int main()
{
char nome[20];
printf(“Digite seu nome: “);
scanf(“%s”,nome);
printf(“\nO nome do usuario e: %s”,nome);
return 0;
}
Lembre-se de que você deve cuidar para não invadir memória, isso quer dizer
que, se o usuário digitar mais caracteres do que o que foi reservado inicialmente,
os caracteres irão ser escritos em uma área de memória que podem estar outros
dados, podendo prejudicar todo seu programa.
Os caracteres da string são acessados normalmente, da mesma forma como se
62
IFTO - EaD / Informática
Lógica de Programação

trabalha com vetores de outros tipos de dados.


Existem algumas funções (falaremos sobre funções no capítulo 11) que podem
nos ajudar com o trabalho com strings. Três importantes funções são:
• strlen( ): retorna o tamanho da string. Essa função recebe como parâmetro
um string e retorna a quantidade de caracteres na string antes do \0.
• strcmp( ): compara a ordenação alfabética de duas strings. Recebe como
parâmetro duas strings e retorna zero se as duas forem iguais, um valor
negativo se a primeira string for menor que a segunda, e um valor positivo
maior que zero se a primeira string for maior que a segunda string.
• strcpy( ): recebe como parâmetro duas strings e copia a última string para
primeira string.
Para a utilização das funções de manipulação de strings, devemos incluir a bi-
blioteca “string.h”. Observe no exemplo seguinte a utilização das funções strlen,
strcmp e strcpy:
#include <stdio.h>
#include <string.h>
int main()
{
char texto1[10],texto2[10]; //declara duas strings
strcpy(texto1,”asdfg”); //copia asdfg para a variável texto1
scanf(“%s”,texto2); //coloca o texto digitado pelo usuário
//na variável texto 2
printf(“o tamanho do texto2 e: %d\n”,strlen(texto2)); //imprime o ta-
manho do
//texto digitado
pelo usuário
if(strcmp(texto1,texto2)==0) //se texto1 for igual a texto 2 a função
strcmp
//retorna 0 que é comparado com o 0
printf(“Os textos sao iguais”); //se a expressão for verdadeira
imprime.
else
printf(“Os textos sao diferentes”);//se a expressão for falsa im-
prime.
}
Observando os comentários, podemos entender o que acontece nesse código
e compreender o que as funções fazem. Se você não entendeu muito bem o que
acontece aqui, não se preocupe. Depois que você aprender funções no capitulo 11,
volte aqui e leia novamente. Você verá que essas funções podem ajudar bastante.
Na maioria das vezes, você ira trabalhar com conjunto de variáveis e não ape-
nas com uma variável isolada, daí a importância dos vetores ou matrizes, já que
se torna inviável declarar muitas variáveis para o mesmo propósito.

Resumo
Durante o capítulo falamos sobre os vetores, como declará-los e acessar seus
63
IFTO - EaD / Informática
Lógica de Programação

elementos, como utilizar um laço para correr cada elemento de um vetor com o
auxílio de uma variável para o índice. Falamos também sobre as matrizes, que
nada mais são do que vetores com mais de uma dimensão. Por fim, vimos as strin-
gs - vetores de caracteres terminados com caractere \0.

Atividades
1. Crie um programa que leia dez números digitados pelo usuário e calcule sua
média.

2. Crie um programa que leia os valores digitados pelo usuário e coloque em


uma matriz 3X3. Depois multiplique essa matriz por um inteiro que o usuário ira
digitar.

3. O que é uma string?


a) Um vetor de duas dimensões.
b) Um caractere isolado.
c) Um vetor de caracteres.
d) Uma matriz.

4. Uma matriz de inteiros de 4 linhas por 3 colunas deve ser declarada como:
a) int mat[3][4]
b) char mat[3][4]
c) int mat[4][3]
d) char mat[4][3]
e) int mat[3][3]

Comentário sobre as atividades


No desenvolvimento da atividade 1, você deve ter feito o uso de laços para ler
o vetor. Em um outro laço deve ter somado os valores do vetor em uma variável
auxiliar para, no final, dividi-la por 10 e assim você achou o valor da média dos
elementos. Este exercício é considerado um exercício fácil, pois a complexidade
maior do programa inclui apenas em um laço, atribuindo a soma dos elementos
a uma variável. Talvez você tenha tido um pouco de dificuldade na atividade 2,
pois aqui temos um laço dentro de outro para ler e calcular a multiplicação de
cada elemento da matriz por uma variável. O segredo maior desta atividade é co-
locar um for dentro de outro for, um para linha e outro para coluna. Se você leu a
seção 9.3, você não deve ter tido dificuldades com a atividade 3, que tem como
alternativa correta a letra (c). A alternativa correta da atividade 4 é a letra (c) e
dispensa comentários já que se pretende um vetor inteiro 4x3.

Bibliografia Consultada
CARBONI, Irenice de Fátima. Lógica de programação. São Paulo: Pioneira Thomson Learning,
64
IFTO - EaD / Informática
Lógica de Programação

2003.
MANZANO, José Augusto Navarro Garcia. Estudo Dirigido de Linguagem C. 2. ed. São Paulo:
Érica, 2002.
SCHILDT, Herbert. C, completo e total. 3 ed. Trad. Roberto Carlos Mayer. São Paulo: Makron Books,
1996.

No próximo capítulo
Os vetores permitem agrupar muitas variáveis, porém todas de apenas um úni-
co tipo de dado. No próximo capítulo, estudaremos as estruturas ou registros que
permitem agrupar dados de tipos diferentes. As estruturas não substituem os veto-
res, pelo contrário, em alguns casos, até complementam, por exemplo, os vetores
de estruturas.

65
IFTO - EaD / Informática
Lógica de Programação

66
IFTO - EaD / Informática
10
CAPÍTULO
LO Lógica de Programação

Estruturas

Introdução
Suponha que queiramos armazenar o nome e a idade de uma pessoa. Para isso,
criaríamos duas variáveis - a variável nome e a variável idade. Suponha agora
que queiramos armazenar cinco nomes e idades de cinco pessoas, então teríamos
um vetor idade e um vetor nome, pois vetores permitem agrupar apenas variáveis
de um mesmo tipo. Mas a linguagem C nos permite a criação de structs (estru-
turas capazes de agrupar variáveis de tipos diferentes em uma mesma variável).
Para armazenar nome e idade basta criar uma estrutura que contenha campos para
nome e idade.
Para tanto, o objetivo deste capítulo é definir e utilizar estruturas (ou registros).
E como pré-requisito para o entendimento dele, é importante que você tenha assi-
milado os conceitos apresentados nos capítulos anteriores.

10.1 Estruturas
Vetores e matrizes armazenam vários elementos de um tipo apenas, já as estru-
turas (ou registros) permitem armazenar elementos de tipos de dados diferentes.
Sua sintaxe é:
struct nome_da_struct
{
tipo elementos_da_struct;
};
Imagine o exemplo da introdução! Queremos armazenar dados de uma pessoa
e vamos ver como fica:

struct pessoa
{
char nome[20];
int idade;
};
Observe que os elementos da struct são declarados como na declaração de va-
riáveis.
O trecho de código acima não está declarando uma variável, apenas o tipo de
dado. A partir do tipo de dado definido, poderemos criar quantas variáveis quiser-
mos daquele tipo. Para declararmos uma variável do tipo pessoa, declare-a como
se fosse um tipo de dado primitivo, precedido pela instrução struct, conforme o
exemplo seguinte.
struct pessoa fulano;
Com essa instrução, o compilador reserva espaço suficiente para guardar o tipo
de dado da pessoa com seus dois campos (nome e idade).
67
IFTO - EaD / Informática
Lógica de Programação

Para acessarmos um campo da estrutura, devemos utilizar o operador “.” (pon-


to). Coloque o nome da variável, o operador ponto e o campo que se quer acessar.
Observe:
pessoa.idade=30;
Assim como podemos declarar muitas variáveis int, por exemplo, podemos
também declarar muitas variáveis do tipo pessoa.
struct pessoa fulano;
struct pessoa sicrano;
struct pessoa beltrano;
Podemos fazer também:
struct pessoa fulano,sicrano,beltrano;
Torna-se cansativo ter que escrever struct antes de cada variável do tipo pessoa
que declaramos. Para resolver esse problema, podemos utilizar a instrução type-
def da seguinte forma:
typedef struct pessoa
{
char nome[20];
int idade;
}pessoa;
pessoa fulano;
pessoa sicrano;
pessoa beltrano,deltrano;

10.2 Estruturas contendo estruturas


Uma estrutura permite armazenar variáveis de diferentes tipos de dados, e es-
ses tipos podem ser outras estruturas. Por exemplo, vamos acrescentar no tipo de
dado pessoa o endereço da pessoa, sendo que o endereço é uma estrutura. De-
monstramos a seguir.

typedef struct endereco


{
char rua[20];
int lote;
char cidade[20];
}endereco;

Com a estrutura endereço definida, vamos agora definir a estrutura pessoa.

typedef struct pessoa


{
char nome[20];
int idade;
endereco end;
}pessoa;

Para acessar os campos da estrutura, utilizamos o operador “.” (ponto) normal-


68
IFTO - EaD / Informática
Lógica de Programação

mente:

pessoa fulano;
fulano.end.lote=30;
printf(“%s”, fulano.end.cidade);

Podemos ter inclusive estruturas em que todos os campos sejam outras estru-
turas.

10.3 Vetores de estrutura


No capítulo 9, vimos como trabalhar com vetores e agora veremos como criar e
manipular um vetor de estruturas. Vamos declarar, por exemplo, um vetor de dez
posições da estrutura pessoa que descrevemos na seção anterior.
pessoa fulanos[10];
Para acessarmos os membros, utilizaremos uma mistura da sintaxe de vetores
com a sintaxe de estruturas.
fulanos[1].idade=20;
fulanos[3].end.lote=15;
Agora que conhecemos vetores, estruturas e instrução “for” podemos criar uma
pequena agenda. Criaremos uma agenda para vinte posições da estrutura pessoa,
faremos a leitura dos dados e em seguida imprimiremos os dados das pessoas.
Utilizaremos a estrutura pessoa e o endereço já definidos em seções anteriores.

#include <stdio.h>
typedef struct endereco
{
char rua[20];
int lote;
char cidade[20];
}endereco;

typedef struct pessoa


{
char nome[20];
int idade;
endereco end;
}pessoa;

int main()
{
pessoa agenda[3];
int i;
for(i=0;i<3;i++)
{
printf(“Digite os dados da pessoa %d \n”, i);
scanf(“%s”,&agenda[i].nome);

69
IFTO - EaD / Informática
Lógica de Programação

scanf(“%d”,&agenda[i].idade);
scanf(“%s”,&agenda[i].end.rua);
scanf(“%d”,&agenda[i].end.lote);
scanf(“%s”,&agenda[i].end.cidade);
}
for(i=0;i<3;i++)
{
printf(“\nOs dados da pessoa %d são:\n”, i);
printf(“%s\n”,agenda[i].nome);
printf (“%d\n”,agenda[i].idade);
printf (“%s\n”,agenda[i].end.rua);
printf (“%d\n”,agenda[i].end.lote);
printf (“%s\n”,agenda[i].end.cidade);
}
return 0;
}

Vamos analisar o código anterior! Na primeira linha, temos a declaração de


uma variável vetor de 20 posições do tipo pessoa. Aqui o compilador reserva o
espaço necessário para 20 estruturas do tipo pessoa com todos os seus campos.
É declarada, na segunda linha, uma variável inteira para controle dos laços for.
No primeiro laço, é feita a leitura dos dados e colocados na posição de memória
corretos, já que o laço incrementa i de 0 até 19. Cada campo é acessado individu-
almente enquanto o laço acontece. No segundo for, é hora de imprimir os dados
da agenda e isso ocorre de forma semelhante ao primeiro laço. Vamos correr a
matriz agenda em cada um de seus índices, i vai de 0 a 19. E para cada iteração os
campos da variável agenda[i] são impressos na tela de forma adequada.
Vamos pensar um pouco na variedade de programas que podemos executar
utilizando estruturas para concluir este capítulo. Há desde pequenas agendas até
sistemas complexos de matrizes de estruturas dentro de estruturas. Pensando nos
conceitos de matrizes de estrutura, podemos criar até mesmo bancos de dados,
sendo cada matriz de estrutura uma tabela do banco de dados com seus registros
(cada elemento do vetor) e com seus campos (os campos da estrutura).

Resumo
O capítulo tratou de estruturas, como defini-las, como criar variáveis de tipo
estruturas e como acessar e manipular seus campos. Vimos também que é possível
uma estrutura ter outra estrutura dentro dela, uma estrutura sendo o campo de ou-
tra estrutura. E, por fim, foi visto matrizes de estrutura e como criar uma simples
agenda.

Atividades
1. Crie uma estrutura para cadastrar livros que tenha como campos: título, subtítu-
lo, autor, isbn e valor. Depois declare um vetor do tipo livros e calcule a soma do
preço de todos os livros. Assim, o usuário saberá o valor de sua biblioteca.
70
IFTO - EaD / Informática
Lógica de Programação

2. Suponha que temos um vetor “vet” de uma estrutura “est” e um dos campos
desta estrutura é uma matriz “mat”. Qual é a forma correta para se acessar o ele-
mento que está na segunda linha e na primeira coluna da matriz “mat”, da “est”,
que está na quinta posição do vetor “vet”?
a) vet.est.mat[1][0]
b) vet[4].est[1][0]
c) vet[4].mat[1][0]
d) vet.est[4].mat[1][0]
e) vet[4].est.mat[1][0]

Comentário sobre as atividades


Durante a atividade 1 você estudou vetores e estruturas; correu o vetor dentro
de um for e acessou os dados da estrutura; acumulou o preço dos livros em uma
variável auxiliar e apresentou o resultado ao usuário. É um exercício que, com
algumas melhorias, pode se tornar um programa prático. Na atividade 2, a alter-
nativa correta é a letra (c). Se você acertou, parabéns; se errou, analise um pouco
mais. Veja que, se tenho um vetor de estrutura, devo acessar a matriz em certo
campo, no caso do exercício o campo 4, já que se trata do quinto elemento. Então,
vet[4] é a estrutura que eu procuro. Assim, basta acessar a matriz (vet[4].mat[1]
[0]), já que se trata da segunda linha e primeira coluna da matriz.

Bibliografia Consultada
CARBONI, Irenice de Fátima. Lógica de programação. São Paulo: Pioneira
Thomson Learning, 2003.
MANZANO, José Augusto Navarro Garcia. Estudo Dirigido de Linguagem C.
2. ed. São Paulo: Érica, 2002.
SCHILDT, Herbert. C, completo e total. 3 ed. Trad. Roberto Carlos Mayer. São
Paulo: Makron Books, 1996.

No próximo capítulo
Na sequência, iremos ver como dividir um programa em pedaços, uma vez
que muitas vezes o programa é grande o suficiente para que fiquemos perdidos
no código. Então, com o programa dividido em partes menores, fica mais fácil
organizar o código. Outra vantagem de se dividir o programa é aproveitar o có-
digo, pois se um mesmo código existe em locais diferentes no meu programa, é
possível aproveitá-lo. Para se dividir o programa, usaremos as funções, assunto
do próximo capítulo.

71
IFTO - EaD / Informática
Lógica de Programação

72
IFTO - EaD / Informática
11
CAPÍTULO
LO Lógica de Programação

Modularização

Introdução
Quando falamos em modularização, referimo-nos ao fato de podermos dividir
problemas grandes em partes menores, com atribuições específicas e bem defi-
nidas, a fim de diminuir custos e facilitar o entendimento e manutenção do seu
programa. A técnica da modularização é um dos princípios básicos da análise es-
truturada. É o que chamamos de “dividir para conquistar”. Quando dividimos um
problema grande em partes menores, damos a essas partes o nome de módulos ou
funções. As funções são uma das características mais importantes da linguagem
C.
Neste capítulo, iremos abordar sobre esse tema com objetivo de compreender e
elaborar funções em linguagem C. Para compreender o assunto, porém, é neces-
sário que você tenha entendido o conceito de variável e saiba utilizar as principais
estruturas de controle da linguagem C.

11.1 Funções
Na linguagem C, todo comando a ser executado deve estar em uma função.
Podemos dizer que função é um conjunto de instruções agrupadas em um bloco
identificado por um nome e através deste pode ser acionada. Manzano (2002, p.
149) explica que a função “caracteriza-se por ser um trecho independente de pro-
grama com atribuições bem definidas”. A função deve ser o mais independente
possível do resto do programa.
O uso de funções apresenta muitas vantagens, entre as quais podemos desta-
car:
• Facilita a elaboração e permite uma melhor documentação.
• A independência dos módulos permite o trabalho em equipe, pois cada
função pode ser feita em época diferente e por pessoas diferentes.
• Facilita a manutenção do programa, pois é permitido testar módulo a mó-
dulo individualmente. Dessa forma, é possível realizar a correção de erros
e fazer melhoramentos de forma mais simples. Isso também reduz a pro-
babilidade dessa manutenção produzir efeitos colaterais em outras partes
do programa.
• Possibilita o aproveitamento de código desenvolvido, ou seja, a reutiliza-
ção de funções em outros programas.
Na próxima seção, iremos conhecer a sintaxe de uma função em linguagem C.

11.2 Estrutura básica de uma função


Toda função em linguagem C possui a seguinte sintaxe:
73
IFTO - EaD / Informática
Lógica de Programação

tipo NomeDaFuncao (Lista_de_Parametros)


{
corpo da função
}
onde:
tipo – é o tipo de dado que a função retorna. Quando não especificado, será
retornado um valor inteiro;
NomeDaFuncao – é o nome da função. Através dele, a função é acionada;
Lista_de_Parametros – são as variáveis que recebem os argumentos quando a
função é chamada. Sua sintaxe é: (tipo var1, tipo var2, ..., tipo varN);
corpo da função – onde encontram-se as instruções (ou comandos) da fun-
ção.
A lista de parâmetros pode não existir, ou seja, a função pode não utilizar parâ-
metros. Entretanto, os parênteses são indispensáveis.
Veja um exemplo de função:

float calc_soma (float a, int b)


{
float resultado;
resultado = a + b;
return resultado;
}

Neste exemplo, a função calc_soma, para ser executada, deve receber dois ar-
gumentos: um float e outro int, nessa ordem. Além disso, ela deverá retornar um
float.
Para encerrar a função e retornar um valor para a função que a chamou, é utili-
zado o comando return. Deve-se observar se o valor retornado é compatível com o
tipo declarado na função. Caso a função não retorne valor, ela deve ser declarada
como do tipo void.

11.3 Variáveis em funções


As variáveis declaradas dentro das funções são chamadas de locais. Isso signi-
fica que somente aquela função pode manipular a variável. As variáveis locais são
criadas quando a função é acionada e são destruídas após o término da execução
da função. É sempre recomendado o uso de variáveis locais em funções e passa-
gem de parâmetros.

11.4 Parâmetros
Os parâmetros têm o mesmo comportamento das variáveis locais declaradas
dentro da função. Isso significa que são criados na entrada e destruídos na saída.
Eles definem sobre quais dados a função irá operar. Devem ser listados entre pa-
rênteses na linha de cabeçalho da função e separados por vírgula, caso haja mais
de um. São também conhecidos como parâmetros formais. Eles são inicializados
com os argumentos passados na chamada à função.

74
IFTO - EaD / Informática
Lógica de Programação

11.5 Argumentos
Argumentos são expressões listadas entre parênteses na chamada a uma função.
O seu valor serve para inicializar os parâmetros da função acionada. Quando fala-
mos em expressões, referimo-nos também a uma variável ou também a um valor
constante.
Conforme Schildt (1996, p.140), “você deve assegurar-se de que os argumentos
usados para chamar a função sejam compatíveis com o tipo de seus parâmetros”.
Sendo assim, a lista de parâmetros no cabeçalho da função define, nesta ordem,
um float e um int como parâmetros. Então os argumentos passados na chamada
à função deverão ser do mesmo tipo e informados na mesma ordem dos parâme-
tros.

11.6 Localização das funções no programa


Podemos definir uma função antes de usá-la. Isso significa implementar as fun-
ções antes da função main(). Veja um exemplo:

1 #include<stdio.h>
2 float calc_soma (float a, int b) // definição da função
3 {
4 float resultado;
5 resultado = a + b;
6 return resultado;
7 }
8 int main()
9 {
1 float x, result;
11 int y;
12 x=5.2;
13 y=3;
14 result = calc_soma(x,y);
15 printf(“A soma é %f \n”, result);
16 return 0;
17 }

Observe na linha 14 como é feita a chamada a função calc_soma. Existe uma


variável chamada result, que recebe o retorno da função, por isso ela é do tipo
float. A função calc_soma é acionada (ou chamada) através do seu nome. Entre
parênteses, separados por vírgula, estão os argumentos x e y passados para calc_
soma. Eles são do mesmo tipo e ordem que os parâmetros declarados na função
calc_soma.
A outra forma seria declarar a função antes de usá-la, ou seja, antes da função
main() e defini-la após o bloco principal (função main). Declarar uma função é
descrever seu protótipo ou o cabeçalho da função: o tipo de retorno, o nome da
função e a lista de parâmetros. Veja o exemplo.

1 #include<stdio.h>
2 float calc_soma (float a, int b); //declaração ou protótipo da função
75
IFTO - EaD / Informática
Lógica de Programação

3
4 int main()
5 {
6 float x, result;
7 int y;
8 x=5.2;
9 y=3;
10 result = calc_soma(x,y);
11 printf(“A soma é %f \n”, result);
12 return 0;
13 }
14
15 float calc_soma (float a, int b) // definição da função
16 {
17 float resultado;
18 resultado = a + b;
19 return resultado;
20 }

Vale salientar que, conforme Manzano (2002, p. 150), “quando uma função é
chamada por um programa principal [ou por uma função chamadora], ela é exe-
cutada e ao seu término, o controle de processamento retorna automaticamente
para a primeira linha de instrução após a linha que a chamou”. Como sabemos, a
primeira função a ser executada em um programa é a main().
Observe no último exemplo que na linha 10 é feita uma chamada à função
calc_soma, passando como argumentos os valores das variáveis x e y. Quem rece-
be o retorno da função é a variável result. Na função calc_soma, os parâmetros a
e b recebem os valores de x e y, respectivamente. Ressalto que os argumentos x e
y passados na chamada à função calc_soma (linha 10) são do mesmo tipo e ordem
que os parâmetros da função.
A execução da função main é paralisada e a função calc_soma é executada.
Através do comando return, esta é encerrada e o valor armazenado em resultado
é retornado (linha 19) para a função main. Dessa forma, a função main continua
a execução a partir da linha 11, mostrando o resultado retornado por calc_soma e
armazenado em result.

Resumo
Vimos, neste capítulo, a importância de se aplicar a técnica da modularização
na construção de programas. Através dessa técnica, dividimos um problema em
partes menores, chamadas funções ou módulos, com atribuições bem definidas.
Dessa forma, os programas ficam mais fáceis de serem elaborados e documen-
tados. Além disso, viabiliza o trabalho em equipe, já que os módulos são inde-
pendentes; facilita a manutenção do programa; permite o aproveitamento de
código e de inúmeras outras vantagens. Vimos a estrutura sintática básica de
uma função, que ela pode ou não retornar um valor para a função chamadora,
76
IFTO - EaD / Informática
Lógica de Programação

além de poder ou não possuir parâmetros. Cada parâmetro funciona como uma
variável local, sendo criado quando a função é chamada e sendo destruído quando
a função é finalizada. Os parâmetros são inicializados com os argumentos passa-
dos no momento da chamada à função e devem ser de tipos compatíveis. Alem do
tipo, devem ser observadas a ordem e a quantidade dos argumentos e parâmetros.
Ainda aprendemos que, quando uma função é acionada, o fluxo de execução da
função chamadora é paralisado e a função acionada é executada. Ao seu término,
o fluxo de execução retorna automaticamente para a primeira linha de comando
após a linha que a chamou.

Atividades
As atividades aqui propostas deverão sedimentar os conhecimentos que você ad-
quiriu ao longo do texto de forma que consiga compreender e elaborar funções
em linguagem C.

1. Sobre funções, analise as proposições a seguir:


I. Podemos dizer que função é um módulo independente de comandos, com atri-
buições específicas e bem definidas, identificado por um nome.
II. Uma função pode ou não retornar um valor, cujo tipo deverá ser especificado
em sua linha de cabeçalho. Caso não retorne, deverá ser especificado o tipo void
para a função.
III. Os parâmetros são variáveis locais à função e definem sobre quais dados a
função deverá operar. Devem ser listados entre parênteses na linha de cabeçalho
da função e separados por vírgula, caso haja mais de um.
Agora marque a alternativa correta:
a) Todas as proposições estão corretas.
b) Todas as proposições estão erradas.
c) Apenas a proposição I está correta.
d) Apenas as proposições II e III estão corretas.

2. Elabore uma função que receba dois números como parâmetro e retorne o maior
deles.

Comentário sobre as atividades


Na atividade 1, se você marcou a alternativa a, acertou. Isso porque uma fun-
ção é um módulo independente de comandos, com atribuições específicas e bem
definidas, identificado por um nome. Além disso, ela pode ou não retornar um va-
lor de um tipo especificado e, caso não retorne, deverá ser especificado o tipo void
para a função. E, por fim, vimos que os parâmetros são variáveis locais à função e
definem que dados são necessários para que a função seja executada. São sempre
especificados entre parênteses na linha de cabeçalho da função e separados por
vírgula, caso haja mais de um.
Na atividade 2, você elaborou uma função que recebe dois números e retorna
o maior deles. Verificou que são necessários dois parâmetros e podem ser do tipo
float, já que podem ser repassados quaisquer números. E como a função deverá
retornar o maior valor entre eles, o tipo de retorno da função também é do tipo flo-
77
IFTO - EaD / Informática
Lógica de Programação

at. No corpo da função, você utilizou a instrução de seleção if para verificar qual é
o maior número, e através do comando return, realizou o retorno do número.

Bibliografia Consultada
MANZANO, José Augusto Navarro Garcia. Estudo Dirigido de Linguagem C.
2. ed. São Paulo: Érica, 2002.
SCHILDT, Herbert. C, completo e total. Trad. Roberto Carlos Mayer. 3 ed. São
Paulo: Makron Books, 1996.

78
IFTO - EaD / Informática

Você também pode gostar