Você está na página 1de 105

Faculdade SATC

Técnicas de Programação I

Algoritmos

Engenharias Elétrica e Mecânica

Profº.: Giovani Martins Cascaes

giovani.cascaes@satc.edu.br

http://www.satc.edu.br/gcascaes/

versão 1.06.105

2010/2011

Acontece que é muito difícil inventar uma teoria que descreva o universo de uma só vez. Pelo contrário, decompomos o problema em pedaços e inventamos várias teorias parciais. Cada uma dessas teorias parciais descreve e prevê uma determinada e limitada classe de observações, desconsiderando os efeitos de outras quantidades, ou representando-os por simples conjuntos de números. É possível que este enfoque esteja inteiramente errado. Se tudo no universo depender de tudo o mais de uma maneira fundamental, poderia ser impossível chegar mais perto de uma solução completa através da investigação de partes isoladas do problema. Ainda assim, foi desta maneira que fizemos progresso no passado.

HAWKING e MLODINOW – Uma nova história do tempo

Sumário

Listas de figuras

5

Lista de tabelas

6

1 Introdução

7

1.1 Definições de algoritmos

8

1.2 Formas de representações de algoritmos

8

 

1.2.1 Descrição narrativa

9

1.2.2 Fluxogramas

10

1.2.3 Português estruturado ou pseudocódigo

11

2 Variáveis, expressões, funções, atribuições, entrada e saída

15

2.1

Variáveis

15

2.1.1

Tipos de variáveis

16

2.2

Exercícios propostos

19

2.3

Expressões

20

2.3.1 Expressões Aritméticas

20

2.3.2 Expressões Relacionais

21

2.3.3 Expressões Lógicas

22

2.3.4 Prioridade de operadores

24

2.4

Funções primitivas

24

2.5

Atribuições

25

2.6 Saída de dados

28

2.7 Entrada de dados

31

2.8 Exercícios propostos

34

3 Comandos de controle de fluxo

38

3.1 Seqüência ou bloco

38

3.2 Seleção

40

3.3 Seleção entre múltiplas escolhas

44

3.4 Exercícios propostos

50

3.5 Estruturas de repetições

55

 

3.5.1 Enquanto

55

3.5.2 Faca enquanto

57

3.5.3 Para

59

3.6

Exercícios propostos

65

4 Modularização

70

4.1

Funções

70

4.1.1

Exercícios propostos

78

4.2

Funções sem retorno

80

4.2.1

Exercícios propostos

83

5 Estruturas e classes

85

5.1.1

Definindo e declarando estruturas

86

5.1.2 Acessando os membros de estruturas

88

5.1.3 Estruturas mais complexas

89

5.1.4 Exercícios propostos

92

5.2 Classes

92

5.2.1 Programas desestruturados

92

5.2.2 Programas estruturados

92

5.2.3 Programas orientados a objetos

93

5.2.4 Declarando classes

94

5.2.5 Permitindo o acesso aos membros da classe

96

5.2.6 Exercícios propostos

98

6 Mini Manual do C Quietly

100

Bibliografia

105

Obs.: Os exercícios presentes nas listas em cada capítulo desta, foram retirados ou adaptados de livros e páginas da internet e pertencem a seus respectivos donos.

Listas de figuras

Figura 1.1 – Etapas que antecedem o desenvolvimento de

7

Figura 1.2 – Fluxograma cálculo do Triplo de um

11

Figura 3.1 – Fluxograma para estrutura SE

41

Figura 3.2 – Fluxograma para estrutura SE

42

Figura 3.3 – Fluxograma para estrutura ESCOLHA

48

Figura 3.4 – Fluxograma para estrutura ENQUANTO

55

Figura 3.5 – Fluxograma para estrutura FACA ENQUANTO

58

Figura 3.6 – Fluxograma para estrutura PARA

60

Figura 5.1 – Um retângulo representado no plano

90

Figura 5.2 – Algoritmo

92

Figura 5.3 – Algoritmo modular

93

Figura 5.4 – Algoritmo orientados a objetos

93

Figura 6.1 – Iniciando o C Quietly com um novo

100

Figura 6.2 – Novo código-fonte em linguagem C

101

Figura 6.3 – Compilando um código-fonte

102

Figura 6.4 – Término da compilação do

102

Figura 6.5 – Executando o

103

Figura 6.6 – Saída de execução do

103

Figura 6.7 – Inserindo novas palavras-chave

104

Lista de tabelas

Tabela 2.1 – Exemplos de nomes de variáveis

16

Tabela 2.2 – Operadores aritméticos

20

Tabela 2.3 – Operadores relacionais

21

Tabela 2.4 – Operadores lógicos

22

Tabela 2.5 – Conjunção

22

Tabela 2.6 – Disjunção

23

Tabela 2.7 – Negação

23

Tabela 2.9 – Caracteres de conversão para função imprima

28

Tabela 2.10 – Caracteres de controle

29

Tabela 2.11 – Caracteres de conversão para função leia

31

1 Introdução

A automatização de tarefas é um aspecto marcante da sociedade moderna. O aperfeiçoamento tecnológico alcançado, com respeito a isto, teve como elementos fundamentais a análise e a obtenção de descrições da execução de tarefas em termos de ações simples o suficiente, tal que pudessem ser automatizadas por uma máquina especialmente desenvolvida para este fim, o Computador. Em ciência da computação houve um processo de desenvolvimento simultâneo e interativo de máquinas (hardware) e dos elementos que gerenciam a execução automática (software) de uma dada tarefa. E essa descrição da execução de uma tarefa, como considerada acima, é chamada Algoritmo. Lógica de programação é a técnica de encadear pensamentos para atingir determinado objetivo. Quando há um problema e o objetivo é solucioná-lo, é necessário ordenar o pensamento de forma lógica durante a elaboração das ações a serem seguidas para solucionar o problema. Sendo assim, algoritmo não é a solução do problema (fig. 1.1), mais a maneira de representar a solução do problema criada por cada indivíduo. Os caminhos que levam a solução de um determinado problema podem ser inúmeros, estando, assim, a cargo de cada pessoa desenvolver seu raciocínio lógico na elaboração de soluções criativas e inovadoras.

Problema Solução Algoritmo
Problema
Solução
Algoritmo

Figura 1.1 – Etapas que antecedem o desenvolvimento de programas.

O programa escrito em uma linguagem de programação não é nada mais do que a representação, obedecendo à sintaxe e semântica da linguagem, do algoritmo que representa a solução do problema proposta pelo programador.

O objetivo desse curso é a Lógica de Programação dando uma base teórica e prática, suficientemente boa, para que, o aluno domine os algoritmos e esteja habilitado a aprender uma linguagem de programação.

1.1 Definições de algoritmos

“O conceito central da programação é o conceito de algoritmos, isto é, programar é basicamente construir algoritmos”.

É a descrição, de forma lógica, dos passos a serem executados no cumprimento

de determinada tarefa. “O algoritmo pode ser usado como uma ferramenta genérica para representar a solução de tarefas independente do desejo de automatizá-las, mas em geral está associado ao processamento eletrônico de dados, onde representa o rascunho para programas (Software)”.

“Serve como modelo para programas, pois sua linguagem é intermediária à

linguagem humana e às linguagens de programação, sendo então, uma boa ferramenta na validação da lógica de tarefas a serem automatizadas”. “Um algoritmo é uma receita para um processo computacional e consiste de uma série de operações primitivas, interconectadas devidamente, sobre um conjunto de objetos. Os objetos manipulados por essas receitas são as variáveis”.

É a forma pela qual se descreve soluções de problemas do mundo real, a fim de

serem implementadas utilizando os recursos do mundo computacional. Como este possui severas limitações em relação ao mundo real, exige-se que, sejam impostas algumas regras básicas na forma de solucionar os problemas, para que, possamos utilizar os recursos de hardware e software disponíveis. Pois, os algoritmos, apesar de servirem para representar a solução de qualquer problema, no caso do Processamento de Dados, eles devem seguir as regras básicas de programação para que sejam compatíveis com as linguagens de programação.

1.2 Formas de representações de algoritmos

Existem diversas formas de representação de algoritmos, mas não há um consenso com relação a melhor delas. O critério usado para classificar hierarquicamente estas formas está diretamente ligado ao nível de detalhe ou, inversamente, ao grau de abstração oferecido. Algumas formas de representação de algoritmos tratam os problemas apenas em nível lógico, abstraindo-se de detalhes de implementação muitas vezes relacionados com alguma linguagem de programação específica. Por outro lado existem formas de representação de algoritmos que possuem uma maior riqueza de detalhes e muitas vezes acabam por obscurecer as idéias principais do algoritmo, dificultando seu entendimento.

Dentre as formas de representação de algoritmos mais conhecidas pode-se citar:

i) Descrição Narrativa;

ii) Fluxogramas;

iii) Pseudocódigo, também conhecido como Português Estruturado.

1.2.1 Descrição narrativa

Nesta forma de representação os algoritmos são expressos diretamente em linguagem natural. Como exemplo, têm-se os algoritmos a seguir:

Exemplo 1.1 – Algoritmos em linguagem natural.

Algoritmo 1 - Troca de um pneu furado

Afrouxar ligeiramente as porcas Suspender o carro Retirar as porcas e o pneu Colocar o pneu reserva Apertar as porcas Abaixar o carro Dar o aperto final nas porcas

Algoritmo 2 - Cálculo da média de um aluno

Obter as suas três notas de provas Calcular a média aritmética Se (média for maior que 7) Aluno foi aprovado

Senão

ele foi reprovado

Algoritmo 3 - Troca de lâmpadas queimadas

Se (lâmpada estiver fora de alcance) Pegar escada; Pegar lâmpada; Tirar lâmpada queimada; Colocar lâmpada nova;

Algoritmo 4 – Realizar uma prova

Ler a prova; Pegar a caneta; Enquanto ((houver questão em branco) e (tempo não terminou)) faça Se (souber a questão) Resolvê-la;

Senão

Pular para próxima; Entregar a prova.

Exercícios propostos

Exercício 1.1 – Um homem precisa atravessar um rio com um barco que possui capacidade de carregar apenas ele mesmo e mais uma de suas três cargas, que são: um lobo, um bode e um fardo de capim. O que o homem deve fazer para conseguir atravessar o rio sem perder suas cargas?

Exercício 1.2 – Construa a seqüência/solução que mova três discos de uma Torre de Hanói, que consiste em três hastes (a-b-c), uma das quais serve de suporte para três discos de tamanhos diferentes (1-2-3), os menores sobre os maiores. Pode-se mover um disco de cada vez para qualquer haste, contanto que nunca seja colocado um disco maior sobre um menor. O objetivo é transferir os três discos para outra haste.

1 2 3 a b c
1
2
3
a
b
c

Exercício 1.3 – Três jesuítas e três canibais precisam atravessar um rio; para tal, dispõem de um barco com capacidade para duas pessoas. Por medidas de segurança não se permite que em alguma margem a quantidade de jesuítas seja inferior à de canibais. Qual a seqüência de passos que permitiria a travessia com segurança?

Esta representação é pouco usada na prática porque o uso da linguagem natural muitas vezes dá oportunidade a más interpretações, ambigüidades e imprecisões. Por exemplo, a instrução “afrouxar ligeiramente as porcas” no algoritmo da troca de pneus está sujeita a interpretações diferentes por pessoas distintas. Uma instrução mais precisa seria: “afrouxar a porca, girando-a 30º no sentido anti-horário”.

1.2.2 Fluxogramas

É a utilização de símbolos gráficos para representar algoritmos. Nos fluxogramas existem símbolos padronizados para início, entrada de dados, cálculos, saída de dados, fim, etc.

Exemplo 1.2 – Fluxograma para calcular o triplo de um número qualquer, fornecido pelo usuário.

Início Num
Início
Num
um número qualquer, fornecido pelo usuário. Início Num Triplo = Num * 3 Triplo Fim Figura
Triplo = Num * 3

Triplo = Num * 3

Triplo = Num * 3
Triplo = Num * 3
fornecido pelo usuário. Início Num Triplo = Num * 3 Triplo Fim Figura 1.2 – Fluxograma
Triplo Fim
Triplo
Fim

Figura 1.2 – Fluxograma cálculo do Triplo de um Número.

1.2.3 Português estruturado ou pseudocódigo

Esta forma de representação de algoritmos é rica em detalhes, como a definição dos tipos das variáveis usadas no algoritmo. Por assemelhar-se bastante à forma em que os programas são escritos, encontra muita aceitação no meio acadêmico. Na verdade, esta representação é suficientemente geral para permitir a tradução de um algoritmo nela representado para uma linguagem de programação específica, praticamente de maneira direta.

Após a criação do algoritmo que representa a solução do problema, o mesmo deverá ser testado em papel ou em uma ferramenta que interprete as ações do algoritmo, com a finalidade de validar a solução descrita no algoritmo. Cada ação contida nas linhas do algoritmo pode ser chamada de instrução. Desta maneira, pode-se dizer que um algoritmo é formado por um conjunto finito de instruções. E um programa o que é? Um programa de computador nada mais é do que a representação do algoritmo numa linguagem de programação, seja ela C, Pascal, Delphi, Cobol, etc. Como a maioria das linguagens de computadores está escrita em inglês, a tarefa dos programadores consiste em traduzir os algoritmos escritos em português para a linguagem de programação, em inglês.

A forma geral da representação de um algoritmo na forma de pseudocódigo adotada nesta apostila é a seguinte:

#incluir biblioteca /* 1. Declaração das bibliotecas utilizadas */

#definir constantes ou macros /* 2. Declaração de constantes, entre outras */ principal () /* 3. Função principal do algoritmo */ inicio /* 4. Início do escopo / bloco principal */

/* 5. Declaração e classificação de variáveis */

/* 6. Iniciar as variáveis */ /* 7. Solicitar a entrada de dados ao usuário */ /* 8. Entrada de dados */ /* 9. Processamento / Cálculos */ /* 10. Saída de informações */ /* 11. Retorno de erro ou Ok */

fim /* 12. Final do escopo / bloco principal */

incluir é uma palavra que indica a inclusão de bibliotecas no algoritmo;

definir consiste em uma porção opcional onde são declaradas as constantes globais usadas no algoritmo;

principal é uma palavra que indica o início da execução de um algoritmo em forma de pseudocódigo, com a sintaxe próxima da linguagem de programação C;

variáveis consistem em uma porção “opcional” onde são declaradas as variáveis usadas no algoritmo;

inicio e fim são respectivamente as palavras que delimitam o início e o término do conjunto de instruções do corpo do algoritmo e em todas as demais estruturas composta por uma seqüência ou bloco de instruções.

utilizados ao longo do algoritmo, servem como

informações adicionas e que facilitam o entendimento da solução proposta. Não são analisados pelas ferramentas de desenvolvimento de programas, como o C. O C Quietly também ignora comentários durante o processamento.

Comentários /*

*/

O algoritmo do cálculo da média de um aluno, na forma de um pseudocódigo, é apresentado a seguir (ex. 1.3).

Exemplo 1.3 – Algoritmo para calcular a média aritmética simples de duas notas. Inicialmente será mostrado como algoritmo generalizado e em seguida, como deverá estar ao longo desta apostila. Usando a sintaxe da linguagem C e o C Quietly.

Situação 1:

Visto como algoritmo presente em vários livros de estrutura de dados e algoritmos:

Algoritmo Calculo_Media

inteiro nota1, nota2; real media;

Inicio Leia(nota1, nota2);

media <- (nota1 + nota2)/2;

Se (media >= 7) Então

Escreva (‘Aprovado‘)

Senão Escreva (‘Reprovado‘);

Fim

Situação 2:

Visto como algoritmo com a sintaxe da linguagem C e podendo ser utilizado no C Quietly:

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

inteiro nota1, nota2; real media;

leia("%d",&nota1);

leia("%d",&nota2);

media = (nota1 + nota2)/2.0;

se (media >= 7.0) inicio imprima ("Aprovado\n"); fim senao inicio imprima ("Reprovado\n"); fim

getch(); /* Aguarda uma tecla para finalizar */

retorno (0);

fim

Para escrever algoritmos é preciso uma linguagem clara e que não deixe margem a ambigüidades, para isto, deve-se definir uma sintaxe e uma semântica, de forma a permitir uma única interpretação das instruções em um algoritmo. A sintaxe aqui proposta, tende a uma maior proximidade com a linguagem C, mas ainda assim poderá ser “convertida” para outras linguagens como exemplo a linguagem Pascal.

2 Variáveis, expressões, funções, atribuições, entrada e saída

Desenvolver algoritmos requer o conhecimento do conceito de alguns itens indispensáveis na representação da solução de um problema qualquer. A compreensão ou entendimento destes conceitos e das possibilidades de utilização de cada um dos elementos acima, permite a precisa definição de quais elementos farão parte da solução proposta durante a elaboração da mesma. Na seqüência, é apresentado além dos conceitos de cada um dos itens anteriores também, as formas de sua aplicação e uso em determinadas situações.

2.1 Variáveis

Toda variável é identificada por um nome ou identificador. Assim, por exemplo, em um algoritmo para calcular a hipotenusa de um triângulo retângulo pelo teorema de Pitágoras (a 2 = b 2 + c 2 ), os identificadores a, b e c podem representar as posições na memória (RAM ou memória principal) que armazenam o valor da hipotenusa e dos catetos. O conteúdo de uma variável pode ser de vários tipos: inteiro, real, caractere e lógico, entre outros. Trabalharemos inicialmente com estes quatro tipos no C Quietly. No C Quietly as variáveis serão definidas na parte inicial do algoritmo da seguinte forma:

tipo_da_variavel

nome_da_variavel

;

Exemplo 2.1 - Declarações de variáveis.

inteiro a;

real x;

char letra;

char nome[40];

/* Armazena até 40 caracteres */

Os identificadores representam os nomes escolhidos para rotular as variáveis, as constantes e as funções, obedecendo as seguintes regras:

i) O primeiro caractere deve ser uma letra;

ii) Se houver outros caracteres, estes só poderão ser letra, algarismo e o _ (sublinha);

iii)

Os nomes das variáveis escritas com letras maiúsculas são diferentes das letras minúsculas. Assim, nota1 é diferente de NOTA1.

iv) Palavras chaves ou reservadas de cada linguagem também não podem ser utilizadas, facilitando a conversão do algoritmo para o código fonte da linguagem a ser utilizada.

A seguir (tab. 2.1), alguns exemplos de nomes de variáveis permitidos, além de alguns dos erros que poderiam ser cometidos durante a escolha do nome de um identificador, seja ele, uma variável, uma constante ou de funções.

Tabela 2.1 – Exemplos de nomes de variáveis

Nomes Válidos

Nomes Não-Válidos

valor, IDADE, nota1, Nome a, X, x

4mes

/* inválido */

main

/* inválido */

 

fim

/* inválido para o C Quietly, pois este o traduziria para } */

Declarar uma variável consiste em reservar espaço na memória principal (RAM) do computador. Desta forma, um endereço de memória é alocado e pode-se ter acesso a este endereço por meio do nome da variável. Esta é uma característica das linguagens de alto nível como a linguagem C e Pascal. Nos algoritmos destinados a resolver um problema no computador, cada variável corresponde a uma posição de memória, cujo conteúdo pode variar ao longo do tempo durante a execução do algoritmo/programa. Embora a variável possa assumir diferentes valores, ela só pode armazenar um único valor a cada instante.

2.1.1 Tipos de variáveis

Os tipos de variáveis utilizados no algoritmo (representação da solução do problema) dependem da finalidade do mesmo, mas, podem-se definir alguns tipos de variáveis pelo fato de serem largamente utilizados e implementados na maioria das linguagens de programação, sendo estes:

Numéricas

São variáveis que armazenam dados numéricos e estão divididas em duas classes. A classe das variáveis inteiras é representada pelo tipo inteiro e a classe das variáveis fracionárias pelo tipo real.

inteiro

Os números inteiros são aqueles que não possuem casas decimais, somente a parte inteira é considerada. Estes podem ser positivos ou negativos. As variáveis declaradas como inteiro não poderão receber valores fracionários, somente valores inteiros. Ex.: 15, 56, -67, 0, para declarar uma variável numérica do tipo inteiro, utilize:

inteiro a;

inteiro b;

ou

inteiro a,b;

real

Os números reais são aqueles que possuem além da parte inteira do número, também a parte fracionária deste. Podendo ser positivo ou negativo. Uma variável declarada como sendo do tipo real tem a capacidade de armazenar o número completo, ou seja, parte inteira e fracionária deste. Ex.: 34.97, 6.5067, -56.0, 10.1, para declarar uma variável numérica do tipo real, utilize:

real x;

real y;

ou

real x,y;

Caracteres

Os caracteres podem armazenar letras (‘a’

‘z’;

).

‘A’

ou

Eles podem aparecer isolados

números (‘0’

‘Z’),

’9’)

outros caracteres especiais (‘@’,’#’, ‘$’, ‘%’, ‘*’, ‘\’,

(tipo char), ou agrupados formando palavras/frases (tipo char[]).

char

Uma variável do tipo char, pode armazenar um único caractere e o mesmo necessita estar entre ‘‘ (apóstrofo). E quando for necessário armazenar vários caracteres? Há um outro tipo (string) tal qual outras linguagens? Em C ANSI, não. A linguagem C, assim como o C Quietly, utilizam um arranjo ou vetor de caracteres, definido como char [ ]. Para definir uma variável capaz de armazenar um caractere ou outra para vários caracteres, proceda da seguinte maneira:

char ch;

char

endereco[40];

char disciplina[TAMANHO];

Lógicos

/* ch pode armazenar um único caractere */ /* endereco pode armazenar até 40 caracteres */ /* disciplina pode armazenar até TAMANHO caracteres, veja definição de TAMANHO a seguir */

Também conhecido como tipo booleano. Pode representar apenas dois valores:

Verdadeiro ou Falso. Pode ser utilizado em algumas linguagens de programação com

outras denominações, tais como Sim/Não, True/False, 1/0, Verdadeiro/Falso.

Ao utilizarmos o C Quietly, e indiretamente a linguagem C, buscaremos outro conceito antes de continuarmos com o tipo lógico: o conceito de constante simbólica.

Constante simbólica

A declaração de constantes nos algoritmos dá ao programador a facilidade de utilizar o nome da constante como valor substituível em qualquer parte do algoritmo, com a vantagem de defini-la em um único local. Seu valor permanece inalterado durante toda execução do algoritmo/programa. Para se definir constantes, deve-se declará-las de acordo com a sintaxe:

#definir

nome_da_constante

valor

Exemplo 2.2 – Definindo constantes simbólicas.

#definir TAMANHO

50

#definir MAX

100

#definir VERDADEIRO

1

#definir FALSO

0

e/ou

#definir TRUE

1

#definir FALSE

0

Utilizando a instrução #definir, pode-se representar um tipo de variável lógica tratando-a como variável do tipo inteiro.

Exemplo 2.3 - Algoritmo com o uso de constantes simbólicas.

#incluir <stdio.h> #incluir <conio.h>

#definir MEDIA_APROVADO

7

principal () inicio inteiro nota1, nota2; real media;

leia("%d",&nota1);

leia("%d",&nota2);

media = (nota1 + nota2)/2.0;

se (media >= MEDIA_APROVADO) inicio imprima ("Voce foi Aprovado\n"); fim senao inicio imprima ("Voce foi Reprovado\n"); fim

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Exemplo 2.4 - Algoritmo com o uso de Variáveis inteiras.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

inteiro num, dobro;

imprima("Entre com um numero: "); leia("%d",&num);

dobro = num * 2;

imprima("%d, e seu dobro = %d\n",num,dobro);

fim

imprima("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

retorno(0);

");

2.2 Exercícios propostos

Exercício 2.1 - Quais as palavras abaixo possuem nomes válidos para identificadores? Válido/Inválido

Salario_Real

(

)

(

)

TotalEmDolares

(

)

(

)

Real

(

)

(

)

Nota GrauA

(

)

(

)

@Home

(

)

(

)

Web@Home

(

)

(

)

web

(

)

(

)

Salário2010

(

)

(

)

Opção_Inicial

(

)

(

)

Last

(

)

(

)

4Ever

(

)

(

)

2.3 Expressões

Um algoritmo tem como característica fundamental a capacidade de processar dados. Processar dados significa realizar operações com estes dados. O uso de operadores permite a realização de tais operações. Por exemplo, o símbolo + é um operador que representa a operação aritmética de adição. Uma expressão é um arranjo de operadores e operandos. A cada expressão válida é atribuído um valor numérico. Como exemplo têm-se, 4 + 6 que é uma expressão cujo valor resultante é 10. Os operandos podem ser variáveis, constantes ou valores gerados por funções. Os operadores identificam as operações a serem efetuadas sobre os operandos. Cada tipo de dados possui um conjunto de operadores relacionados. Os operadores classificam-se em unários e binários, conforme tenham um ou dois operandos, respectivamente. Na solução da grande maioria dos problemas é necessário que as variáveis tenham seus valores consultados ou alterados e, para isto, deve-se definir um conjunto de operações a serem utilizadas nas expressões, sendo eles:

2.3.1 Expressões Aritméticas

São aquelas cujo resultado da avaliação é do tipo numérico, seja ele inteiro ou fracionário (real). Somente o uso de operadores aritméticos (tab. 2.2) e variáveis numéricas é permitido em expressões aritméticas.

Tabela 2.2 – Operadores aritméticos

Símbolo

Significado

Matemática

+

Adição

+

*

Multiplicação

x

-

Subtração ou inversor do sinal

-

/

Divisão

÷÷÷÷

resto

Resto da divisão de inteiros

 

Exemplo 2.5 - Algoritmo para obter e realizar diversas operações com dois números.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio inteiro a, b, r; real r2;

imprima ("Digite o primeiro numero: "); leia ("%d",&a); imprima ("Digite o segundo numero: "); leia ("%d",&b);

r =

imprima ("A soma de %d e %d = %d\n",a,b,r);

a + b;

r2 = (real) a / b; imprima ("A Divisao de %d e %d = %0.2f\n",a,b,r2);

r = a - b;

imprima ("A subtracao de %d e %d = %d\n",a,b,r);

r = a * b;

imprima ("A multiplic de %d e %d = %d\n",a,b,r);

r = a / b;

imprima ("A Divisao int %d e %d = %d\n",a,b,r);

r = a resto b;

imprima ("O Resto Div de %d e %d = %d\n",a,b,r);

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Obs.: A divisão de um número inteiro por outro, também inteiro, é sempre um número inteiro; se o resultado for fracionário, este será truncado.

2.3.2 Expressões Relacionais

Os operadores relacionais (tab. 2.3) são utilizados para efetuar a comparação entre dados de mesmo tipo, relacionando variáveis ou expressões, resultando em um valor lógico (Verdadeiro ou Falso).

Exemplos:

A

==

B;

A é igual a

B

C

!=

D;

C é diferente de D

F

>=

E;

F é maior ou igual a E

J

< H;

J é menor que H

X

<= 5;

X é menor ou igual a 5

3

> W;

3 é maior que o valor da variável W

Tabela 2.3 – Operadores relacionais

Operador

Operação

Matemática

= =

Igual

=

! =

Diferente

 

< Menor que

<

 

> Maior que

>

< =

Menor ou Igual

> =

Maior ou Igual

Exemplo 2.6 - Algoritmo com o uso de operadores relacionais.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

inteiro idade;

imprima("Entre com sua idade: "); leia("%d",&idade);

se (idade >= 18) inicio imprima ("Voce já pode fazer sua CNH\n"); fim

fim

imprima("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

retorno(0);

");

2.3.3 Expressões Lógicas

São utilizadas para avaliar expressões lógicas. Os operadores lógicos fundamentais estão relacionados na tabela seguinte (tab. 2.4). As tabelas verdade de cada um dos operadores lógicos são apresentadas logo a seguir.

Tabela 2.4 – Operadores lógicos

Operador

Operação

Matemática

&&

conjunção

e

||

disjunção

ou

!

negação

nao

Tabela verdade do operador &&

Suponha que uma empresa da região esta fazendo uma entrevista com quatro pessoas, para o preenchimento de uma vaga de programador sênior. Cada pessoa irá responder 1 se domina a linguagem e 0 caso não seja de seu domínio.

Tabela 2.5 – Conjunção

Você conhece a linguagem C?

Você conhece a linguagem Pascal?

Saída

1

1

1

1

0

0

0

1

0

0

0

0

Irá conseguir o trabalho o candidato que dominar ambas as linguagens exigidas para o preenchimento da vaga. O operador && (tab. 2.5) somente considera válida a expressão em que todas as respostas são verdadeiras.

Tabela verdade do operador ||

Suponha que a mesma empresa disponha de uma outra vaga de programador júnior e exige que o candidato conheça pelo menos uma linguagem de computador. Cada pessoa irá responder 1 se domina a linguagem e 0 caso não seja de seu domínio.

Tabela 2.6 – Disjunção

Você conhece a linguagem C++?

Você conhece a linguagem PHP?

Saída

1

1

1

1

0

1

0

1

1

0

0

0

Irá conseguir o trabalho o candidato que dominar ao menos uma das linguagens exigidas para o preenchimento da vaga. O operador || (tab. 2.6) considera válida a expressão em que pelo menos uma resposta seja verdadeira.

Tabela verdade do operador !

Tabela 2.7 – Negação

Você conhece

Algoritmos?

Saída

1

0

0

1

O operador ! (tab. 2.7) inverte a saída.

Exemplo 2.7 - Algoritmo com o uso de operadores lógicos e relacionais.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

inteiro idade; char sexo;

imprima("Qual o seu sexo: "); leia("%c",&sexo); imprima("Qual a sua idade: "); leia("%d",&idade);

se (idade >= 18 && sexo == 'M') inicio imprima ("Voce precisa alistar-se!\n"); fim

fim

imprima("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

retorno(0);

");

2.3.4 Prioridade de operadores

Durante a execução de uma expressão que envolve vários operadores, é necessário existir certas prioridades, caso contrário pode-se obter valores que não representam o resultado esperado. A maioria das linguagens de programação utiliza as seguintes prioridades de operadores:

i) Efetuar operações embutidas em parênteses “mais internos”

ii) Efetuar funções

iii) Efetuar resto, multiplicação e/ou divisão

iv) Efetuar adição e/ou subtração

v) Operadores relacionais

vi) Operadores lógicos

Obs.: O programador tem plena liberdade para incluir novas variáveis, operadores ou funções para adaptar o algoritmo as suas necessidades, lembrando sempre, de que, estes devem ser compatíveis com a linguagem de programação a ser utilizada.

2.4 Funções primitivas

Uma linguagem de programação oferece um conjunto de funções pré-definidas, que são usadas com vários tipos de dados simples. As funções estão intimamente ligadas ao conceito de função (ou fórmula) matemática, na maioria das vezes, necessitam de dados como parâmetro (dados de entrada). Em algoritmos utilizam-se as funções facilmente encontradas nas principais linguagens de programação. Veja (tab. 2.8) algumas dessas funções a seguir.

Tabela 2.8 – Funções Primitivas

Função

Finalidade

sen (x);

Seno do ângulo x

cos (x);

Co-seno do ângulo x

tan (x);

Tangente do ângulo x

abs (x);

Valor absoluto de x

potencia (y,x);

Eleva y a x

raiz (x);

Raiz quadrada de x

log (x)

Logaritmo Natural de x

Exemplo 2.8 – Usando funções pré-definidas, para determinar o valor da hipotenusa.

#incluir <stdio.h> #incluir <conio.h> #incluir <math.h>

principal () inicio

inteiro ladoA, ladoB; real Q1, Q2, hipotenusa;

imprima ("Entre com o cateto A: "); leia ("%d",&ladoA); imprima ("Entre com o cateto B: "); leia ("%d",&ladoB);

Q1 = potencia(ladoA,2); Q2 = ladoB * ladoB; hipotenusa = raiz(Q1 + Q2);

imprima ("CA = %d e CB = %d\n",ladoA,ladoB); imprima ("Hipo = %0.4f\n",hipotenusa);

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Obs.: O teorema de Pitágoras foi citado anteriormente (seção 2.1).

2.5 Atribuições

Um comando de atribuição altera o conteúdo de um identificador (lado esquerdo) pelo valor resultante da expressão (lado direito). A variável e a expressão devem ser do mesmo tipo, exceto no caso em que a variável é do tipo real e o resultado da expressão é do tipo inteiro, quando o valor inteiro da expressão é transformado em real.

A operação de atribuição permite que se forneça um valor a uma certa variável. Caso seja atribuída uma expressão à variável, será armazenado o resultado daquela expressão. Se for atribuída uma outra variável, será armazenado o conteúdo daquela variável. Para a operação de atribuição, utiliza-se a seguinte sintaxe:

variavel

=

valor ou expressão

;

Exemplo 2.9 – Atribuição de um valor a uma variável inteira.

y = 6;

Lê-se da seguinte forma:

A variável y recebe o valor 6 ou o valor 6 é atribuído a variável y.

O computador por sua vez:

Assume que o valor 6 deve ser armazenado (guardado, alocado) na memória, em um local previamente reservado por meio da declaração da variável y.

Memória principal (RAM)

y

6
6

Exemplo 2.10 –

Atribuição de um valor e de uma expressão envolvendo operandos inteiros a uma variável do mesmo tipo.

x

= 3;

z

= y * x;

Lê-se da seguinte forma:

A variável z recebe o valor da multiplicação de y por x ou y multiplicado por x é atribuído a variável z.

O computador por sua vez:

O resultado da multiplicação do conteúdo das variáveis y na memória, será alocado na variável z.

Memória principal (RAM)

e

x armazenados

y

x

z

6 3 18
6
3
18

No comando de atribuição, a variável e valor/expressão devem ser do mesmo tipo, exceto nos seguintes casos:

i) A variável sendo real, a expressão ou a outra variável podem ser do tipo inteiro;

ii) A variável sendo char[], a expressão ou a outra variável podem ser do tipo char.

Exemplo 2.11 –

Trocando o conteúdo das variáveis a e b com auxílio de uma variável temporária.

a = 2;

b = 3;

temp = a;

a = b;

b = temp;

/* Passo 1 */

/* Passo 2 */

/* Passo 3 */

Memória (RAM) a b temp 2 3 2
Memória (RAM)
a b
temp
2
3
2
Passo 2 */ /* Passo 3 */ Memória (RAM) a b temp 2 3 2 Memória
Memória (RAM) a b temp 3 3 2
Memória (RAM)
a b
temp
3
3
2

Memória (RAM)

2 3 2 Memória (RAM) a b temp 3 3 2 Memória (RAM) a b 3

a

b

3 2
3
2

temp

2
2

Passo 1

Passo 2

Passo 3

Exemplo 2.12 –

Incrementando e decrementando as variáveis a e b com auxílio dos operadores ++ e --.

a = 5;

b = 7;

/* Passo 1 */

a++;

/* Passo 2 */

b--;

/* Passo 3 */

Memória (RAM)

a b 5 7
a b
5
7

Passo 1

Memória (RAM)

a b 6 7
a b
6
7

Passo 2

Memória (RAM)

a

b

6 6 Passo 3
6
6
Passo 3

No algoritmo é preciso representar a troca de informações que ocorrerá entre o mundo da máquina e o nosso mundo, para isso, deve-se utilizar comandos de entrada e

saída, sendo que, no algoritmo esses comandos representam apenas a entrada e a saída da informação, independente do dispositivo utilizado (teclado, discos, impressora,

monitor,

).

2.6 Saída de dados

Um comando de saída serve para que o algoritmo mostre ao usuário os resultados desejados. A unidade de saída padrão é o monitor de vídeo, podendo ser também a impressora ou uma memória auxiliar como o disco rígido.

imprima (“texto, conversao e controle”, variável, constante ou expressão );

imprima

imprima (“texto, conversao e controle”, variável, constante ou expressão );

(“texto, conversao e controle”, variável, constante ou expressão );

Os identificadores contidos na lista, devem estar separados por vírgula. Considerando a unidade de saída padrão, o monitor de vídeo, no algoritmo o comando seria:

imprima ("texto");

ou

 

imprima ("texto %caractere",variavel);

ou

 

imprima ("texto %caractere",constante);

ou

imprima ("texto %caractere",expressao);

Onde %caractere pode ser substituído por qualquer um dos caracteres de conversões apresentados (tab. 2.9) a seguir.

Tabela 2.9 – Caracteres de conversão para função imprima

Conversão

Finalidade

 

%c

Imprime o conteúdo da variável com representação ASCII

 

%d

Imprime o conteúdo da variável com representação decimal com sinal

%u

Imprime o conteúdo da variável com representação decimal sem sinal

%o

Imprime o conteúdo da variável com representação octal sem sinal

%x

Imprime o conteúdo da variável com representação hexadecimal sem sinal

%f

Imprime o conteúdo da variável com representação com ponto decimal

%e

Imprime

o

conteúdo

da

variável

com

representação

em

notação

científica (exponencial)

 

%g

Formato geral, escolhe a representação mais curta entre %f e %e

 

Além dos caracteres de conversão, também é possível utilizar-se caracteres de controle (tab. 2.10) por meio da \ (contra barra) seguida do caractere correspondente à ação desejada. Desta maneira, pode-se mover o cursor para a linha seguinte (\n), separar dados usando tabulações (\t) entre eles e representar caracteres utilizados na sintaxe do comando de saída, tal qual aspas ou a própria contra barra, utilizada em conjunto com os caracteres de controle.

Tabela 2.10 – Caracteres de controle

Caractere de Controle

Finalidade

\n

Nova linha

\t

Tabulação

\b

Retrocesso

\r

Retorno de carro

\f

Salto de página

\a

Sinal sonoro

\\

Contra barra

\’

Apóstrofo

\”

Aspas

\0

O caractere NUL

Com imprima o cursor permanece na mesma linha após a execução do comando, utilizando-se o caractere de controle (\n) move-se o cursor para a próxima linha.

Exemplo 2.13 – Mostrando os conteúdos das variáveis a e b após sua declaração seguida de atribuições de valores inteiros as mesmas, além de realizar e exibir a soma entre elas.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

inteiro a, b;

a = 5;

b = 10;

imprima ("A = %d e B = %d\n",a,b); imprima ("Soma = %d\n",a + b);

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Para o caso de utilizar-se de variáveis do tipo real, os valores são mostrados na notação exponencial, em um campo de 6 posições, a menos que uma formatação seja especificada, veja exemplo na seqüência.

Exemplo 2.14 –

Mostrando a média aritmética simples entre as variáveis A e B do exemplo anterior.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

inteiro a, b; real m;

a

= 5;

b

= 10;

m

= (a + b)/2.0;

imprima ("A = %d e B = %d\n",a,b); imprima ("Media = %e\n",m); imprima ("Media = %f\n",m); imprima ("Media = %.2f\n",m);

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Memória (RAM)

a

b

m

5 10 7.5
5
10
7.5
Vídeo A = 5 e B = 10 Media = 7.50000e+00 Media = 7.500000 Media
Vídeo
A =
5 e
B = 10
Media = 7.50000e+00
Media = 7.500000
Media = 7.50
pressione qualquer tecla

Na formatação, se a variável for real especifica-se o total de posições ocupadas e a quantidade de casas decimais. Se for inteira, somente total de posições.

2.7 Entrada de dados

Um comando de entrada serve para que o algoritmo solicite dados no momento em que o mesmo está sendo executado. Esses dados fornecidos serão armazenados em variáveis na memória. Em geral a unidade de entrada é o teclado, podendo também ser uma memória auxiliar como o disco rígido.

leia

(“conversao”, variavel1, variavel2,

);

Os identificadores contidos na lista, devem estar separados por vírgula. Considerando a unidade de entrada padrão, o teclado, no algoritmo o comando

seria:

leia ("%conversao",&variavel);

ou

leia ("%conversao %conversao",&var1, &var2,

);

Onde %conversao deve ser substituído por um dos caracteres de controle (tab. 2.11) a seguir. Cada variável ou lista de variáveis deve vir precedida por um caractere & (“E” comercial), que indica o fornecimento do endereço de memória representado pelo identificador (nome da variável).

Tabela 2.11 – Caracteres de conversão para função leia

Conversão

Finalidade

%c

Espera-se um único caractere na entrada

%d

Espera-se um inteiro decimal na entrada

%u

Espera-se um inteiro decimal na entrada

%o

Espera-se um inteiro octal na entrada

%x

Espera-se um inteiro hexadecimal na entrada

%f

Espera-se um número de ponto flutuante na entrada

%h

Espera-se um inteiro curto na entrada

%s

Espera-se uma cadeia de caracteres na entrada

Exemplo 2.15 – Desenvolver um algoritmo para obter as três notas de um aluno e armazená-las na memória do computador por meio das variáveis nota1, nota2 e nota3, estas devem ser capazes de guardar notas com casas decimais.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

real nota1, nota2, nota3;

leia ("%f%f%f",&nota1,&nota2,&nota3);

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

No momento da execução do algoritmo com os comandos acima, o programa mostra a tela do usuário e o cursor aparece esperando a digitação dos três valores que devem ser separados por, pelo menos, um espaço em branco. Com uma única (<enter>) confirmação ao final da digitação dos valores.

Vídeo

_ 3.5 7.8 8.4 <enter> pressione qualquer tecla
_ 3.5 7.8 8.4 <enter>
pressione qualquer tecla

Assim, valor 3.5 será armazenado na variável nota1, o valor 7.8 em nota2 e o valor 8.4 em nota3.

No instante da solicitação de dados, podemos usar junto com o leia um comando de saída (imprima) com a finalidade de emitir mensagens que orientem o usuário na digitação dos dados.

Exemplo 2.16 –

Algoritmo que calcula a média aritmética simples de três notas com mensagens indicando ao usuário quais dados fornecer.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

real nota1, nota2, nota3; real media;

imprima ("Entre com a primeira nota: "); leia ("%f",&nota1); imprima ("Entre com a segunda nota: "); leia ("%f",&nota2); imprima ("Entre com a terceira nota: "); leia ("%f",&nota3);

media = (nota1 + nota2 + nota3)/3.0;

imprima ("\nMedia Final = %.2f\n",media);

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

A seguir, vê-se como seria a entrada das notas e a exibição da média aritmética simples após seu cálculo pelo computador. Inicialmente é mostrada a primeira mensagem Entre com a primeira nota: e em seguida o programa fica aguardando até que o usuário forneça um número (fracionário ou inteiro) correspondente à primeira nota do aluno, para então prosseguir com a instrução seguinte. De maneira semelhante acontece também com a leitura das demais notas.

Memória (RAM)

nota1

nota2

nota3

media

5.0 6.0 9.0 6.67
5.0
6.0
9.0
6.67

Vídeo

Entre com a primeira nota: 5.00 Entre com a segunda nota: 6.00 Entre com a
Entre com a primeira nota: 5.00
Entre com a segunda nota: 6.00
Entre com a terceira nota: 9.00
Media Final = 6.67
pressione qualquer tecla

Cada valor lido pelo comando leia e armazenado na memória. Para realizar o cálculo da média o computador acessa as posições de memória das notas e realiza a soma das notas para então dividir o resultado pela constante 3.0. O Resultado final é exibido logo depois. Para finalizar o programa pressione uma tecla.

Exemplo 2.17 –

Algoritmo que lê a idade de uma pessoa expressa em anos, meses e dias e exibe-a expressa apenas em dias.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

inteiro ano, mes, dias, total;

imprima ("Quantos anos voce tem: "); leia ("%d",&ano); imprima ("e quantos meses: "); leia ("%d",&mes); imprima ("e quantos dias: "); leia ("%d",&dias);

total = (ano * 365 + dias * 30 + dias);

imprima ("\nTotal em dias = %d\n",total);

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

2.8 Exercícios propostos

Exercício 2.1 –

Exemplifique o uso dos comandos de Atribuição, Entrada e Saída.

 

Exercício 2.2 –

Qual a diferença entre os comandos imprima e leia?

 

Exercício 2.3 –

Como podemos imprimir a mensagem “Linha inicial”, seguida de duas linhas em branco e uma outra mensagem “Linha final”? É possível realizar esta tarefa em um único comando? Dê exemplos.

Exercício 2.4 –

Como

podemos

orientar

o

usuário

na

digitação

dos

dados?

Exemplifique.

Exercício 2.5 –

Escreva os comandos necessários para ler:

 

i) as 3 notas de um aluno ii) o peso e altura de uma pessoa

 

Exercício 2.6 –

Escreva os comandos necessários para exibir:

 

i) o conteúdo da variável x ii) o resultado da expressão 2+3

 

Exercício 2.7 –

Determine os valore finais de a, b e c após a execução do trecho do programa abaixo:

a = 0;

b = 1;

c = a + b;

a a + 1;

=

=

b a

+ b + c;

 

Exercício 2.8 –

A ordem das atribuições é importante? a

= b

e

c

=

a tem

o

mesmo efeito de c = a

e

a

=

b ?

Exercício 2.9 –

Em qual dos seguintes pares é importante a ordem dos comandos?

Supor: x

y z.

a) x = y; y = z;

b) x = y; z = x;

c) x = z; x = y;

d) z = y; x = y;

Exercício 2.10 – Fazer um algoritmo que dadas às dimensões de um retângulo, calcule a sua área e mostre na tela.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

inteiro base, altura, area;

imprima ("Digite o valor da base do retangulo: "); leia ("%d",&base); imprima ("Digite o valor da altura do retangulo: "); leia ("%d",&altura);

area = base * altura;

imprima ("Area = %d\n",area);

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Exercício 2.11 – Escreva um algoritmo que leia um número inteiro positivo e exiba o dobro do mesmo.

Exercício 2.12 – Escreva um algoritmo para calcular e exibir o comprimento de uma circunferência, sendo dado o valor de seu raio. (C = 2 ππππ R)

Exercício 2.13 – Escreva um algoritmo para ler uma temperatura dada na escala Fahrenheit e exibir o equivalente em Celsius. (C = 5 (F – 32))

9

Exercício 2.14 – Escreva um algoritmo para calcular e exibir a média ponderada de

duas notas dadas. (nota1 = peso 6 e nota2 = peso 4)

Exercício 2.15 – Escreva um algoritmo que leia duas variáveis inteiras e troque o conteúdo entre elas.

Exercício 2.16 – Escreva um algoritmo para calcular e exibir o valor de x y , sendo dados a base (x) e o expoente (y).

Exercício 2.17 – As raízes de uma equação quadrática da forma

ax 2 + bx + c = 0

são reais se e somente se o discriminante dado por

b 2 – 4ac

for maior ou igual a zero. Preparar um algoritmo para ler os valores dos coeficientes a, b e c e imprimir o valor do discriminante. Mostrar também uma mensagem se é possível encontrar as raízes reais ou não.

Exercício 2.18 -

Qual o resultado das expressões aritméticas abaixo, sabendo-se que os valores de X, Y e Z são, respectivamente, 1, 2 e 5 ?

a) Z resto Y / Y

b) X + Y + Z / 3

c) raiz( Z / Y + X * Y)

d) Z - abs (X – potencia (Y,2))

Exercício 2.19 -

Escreva o resultado das seguintes funções:

a) abs (-4)

b) abs (5.2)

c) potencia (1.0,4)

d) potencia (10,2)

e) raiz (25)

f) raiz (9.0)

Exercício 2.20 -

Preencha a Tabela Verdade abaixo:

a

b

a && b

a || b

!a

!b

TRUE

TRUE

       

TRUE

FALSE

       

FALSE

TRUE

       

FALSE

FALSE

       

Exercício 2.21 -

Escreva o resultado das seguintes comparações:

a) 1 != 1.0

b) FALSE == FALSE

c) TRUE != TRUE

d) 3 > 5.0

e) –2 <= 2

f) ‘a’ == ‘A’

Exercício 2.22 -

Qual o resultado das expressões lógicas abaixo, sabendo-se que os valores de A e B são, respectivamente, TRUE e FALSE?

a) !A && B || A && !B b) !(!(A || B) && (A || B))

c) A || B && !A || !B d) (A || B) && (!A || !B)

Exercício 2.23 -

Faça um algoritmo que calcule o perímetro de um retângulo, sendo dado o comprimento e a largura desse retângulo. P = 2 x (c + l)

Exercício 2.24 - Faça um algoritmo que leia dois valores numéricos inteiros para duas variáveis e que troque o conteúdo dessas variáveis, visualizando o valor das mesmas antes e depois da troca.

Exercício 2.25 -

Faça um algoritmo que leia dois números reais e que calcule a soma, produto e a média desses números.

Exercício 2.26 -

Faça um algoritmo que determine o volume de uma esfera, sendo dado o respectivo raio. (V = 4/3 x π x r 3 ) Repare que, em C, a divisão de 4 por 3 dá um valor inteiro se não tomar medidas adequadas.

3 Comandos de controle de fluxo

Para representar a solução de um problema deve-se escrever o conjunto de passos a serem seguidos, sendo que, a maioria dos problemas exige uma dinâmica na sua solução, impondo assim que os algoritmos executem um conjunto de instruções de acordo com as possíveis situações encontradas no problema original. Na maioria das linguagens de programação os mecanismos utilizados para esse controle são: Seqüência, Seleção e Repetição.

3.1 Seqüência ou bloco

Usada para executar comandos passo a passo, sabendo que todos eles serão executados na ordem descrita, sem nenhum desvio. Uma seqüência ou bloco pode possuir um ou vários comandos, os quais devem ser delimitados pelos identificadores de inicio e fim.

inicio

comando1;

comandon;

fim

Exemplo 3.1 –

Desenvolver um algoritmo para ler um número inteiro e escrever seu sucessor e seu antecessor.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

inteiro num, suc, ant;

imprima ("Entre com um numero: "); leia ("%d",&num);

suc = num + 1; ant = num - 1;

imprima ("Sucessor = %d\n",suc);

imprima ("Antecessor = %d\n",ant);

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Exemplo 3.2 –

Desenvolver um algoritmo para ler dois números inteiros e escrever a seguinte saída:

Dividendo:

Divisor:

Quociente:

Resto:

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

inteiro valor1, valor2, q, r;

imprima ("Entre com o dividendo: "); leia ("%d",&valor1); imprima ("Entre com o divisor: "); leia ("%d",&valor2);

q = valor1 / valor2;

r = valor1 resto valor2;

imprima ("Dividendo: %d\n",valor1);

imprima ("Divisor:

imprima ("Quociente: %d\n",q);

%d\n",r);

imprima ("Resto:

%d\n",valor2);

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Exemplo 3.3 –

Desenvolver um algoritmo para ler um ângulo em graus e escrever:

seno, co-seno, tangente, secante, co-secante e cotangente deste ângulo.

#incluir <stdio.h> #incluir <conio.h> #incluir <math.h>

#definir PI 3.1415926

principal() inicio real angulo, rang; imprima ("Entre com um ângulo em graus: "); leia ("%f",&angulo);

fim

3.2 Seleção

rang = angulo * PI / 180;

imprima ("Valor do PI:%f\n",PI);

imprima ("Seno:

imprima ("Co-seno:

imprima ("Tangente:

imprima ("Co-secante: %f\n",(1 / sen(rang)));

%f\n",(1 / cos(rang)));

imprima ("Cotangente: %f\n",(1 / tan(rang)));

imprima ("Secante:

%f\n",sen(rang));

%f\n",cos(rang));

%f\n",tan(rang));

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Usada para tomar decisões, ou seja, desviar a execução do algoritmo de acordo com uma condição (Expressão Lógica), podendo ser simples (fig. 3.1) ou composta (fig. 3.2).

Veja as afirmações a seguir:

i) Todos os alunos terão bolsas de estudos integrais;

ii) Somente alunos com renda inferior ou igual a dois salários mínimos, receberão a bolsa de estudos;

iii) Os alunos com renda superior a dois salários mínimos, portanto, sem direito à bolsa de estudo, receberão auxílio transporte, o qual não é concedido aos alunos que possuem a bolsa integral;

iv) Os alunos com renda inferior a um salário mínimo receberão bolsa integral e para os alunos com renda superior a este e de não mais que dois salários mínimos as bolsas serão de 50%. Demais alunos com renda superior a dois salários mínimos ganham somente o auxílio transporte.

O primeiro item refere-se a uma seqüência de instruções onde nenhuma decisão precisa ser tomada, pois todos os alunos irão receber a bolsa de estudos. Os primeiros exemplos deste capítulo demonstram este conceito. Já na segunda afirmação, aparece

uma situação de decisão simples (fig. 3.1), onde para estar habilitado a receber a bolsa de estudos cada aluno precisa preencher o requisito de renda mínima exigido. A seguir,

] delimitam uma

a sintaxe de uma estrutura de decisão simples. Os colchetes [ parte opcional da estrutura.

Sintaxe:

se (condicao) inicio comando ; [ou sequencia1 ;]

fim

Fluxo

se

Fluxo se V
V
V

Figura 3.1 – Fluxograma para estrutura SE.

A terceira afirmação apresenta uma situação um pouco mais complexa, o que exige uma estrutura de decisão composta (fig. 3.2). Levando em consideração que

somente os alunos com renda superior a dois salários mínimos receberão o auxílio transporte se faz necessário informar que os alunos que recebem a bolsa de estudos, não serão contemplados com este auxílio. Na seqüência a sintaxe de uma estrutura de

decisão composta. Os colchetes [

]

delimitam uma parte opcional da estrutura.

Sintaxe:

se (condicao) inicio comando ; [ou sequencia1 ;]

fim senao inicio comando ; [ou sequencia2 ;]

fim

Os exemplos seguintes demonstram a funcionabilidade de cada uma das versões da estrutura de decisão.

Exemplo 3.4 –

Desenvolver um algoritmo para ler um número inteiro e exibi-lo se for positivo.

#incluir <stdio.h>

#incluir <conio.h>

principal () inicio

real n;

imprima ("Entre com um numero: "); leia ("%f",&n);

se (n > 0.0) inicio imprima ("%f eh positivo!\n",n); fim

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Fluxo

Fluxo se V F

se

V F
V
F
Fluxo se V F
Fluxo se V F
Fluxo se V F
Fluxo se V F
Fluxo se V F
Fluxo se V F
Fluxo se V F
Fluxo se V F
Fluxo se V F
Fluxo se V F
Fluxo se V F
Fluxo se V F

Figura 3.2 – Fluxograma para estrutura SE SENAO.

No exemplo (ex. 3.4) anterior, o comando imprima só será executado se a condição (n > 0.0) for verdadeira. Caso contrário, nenhuma ação será executada.

Exemplo 3.5 –

Desenvolver um algoritmo para ler um número e determinar se ele é maior que zero ou não.

#incluir <stdio.h> #incluir <conio.h>

principal ()

inicio real n;

imprima ("Entre com um numero: "); leia ("%f",&n);

se (n > 0.0) inicio imprima ("%f eh maior que zero!\n",n); fim senao inicio imprima ("%f nao eh maior que zero!\n",n); fim

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Neste exemplo (ex. 3.5), a mensagem que será exibida dependerá do resultado

da expressão lógica (n

imprima do bloco inicio e fim que se refere à palavra se. Caso contrário, será

executado o comando imprima do bloco inicio e fim que se refere à palavra senao. Em nenhuma hipótese será executado ambos os comandos imprima.

> 0.0). Se ela for verdadeira, será executado o comando

E a quarta afirmação, como empregá-la em um algoritmo? Há uma nova estrutura para tal? Respostas a seguir.

Há casos em que é necessária a realização de mais de dois testes, como na afirmação ainda não discutida. Para satisfazer as condições da última afirmação, será preciso testar se o aluno possui renda inferior a um salário mínimo para poder receber a bolsa de estudos integral e na seqüência determinar por meio de outro teste se a renda do aluno encontra-se situada entre um e dois salários mínimos, garantindo-lhes uma bolsa de estudos de 50%. O fato do aluno não estar incluso no primeiro grupo não lhe garante a indiscriminadamente a bolsa de estudos de 50%. Por fim indicar aos alunos que se encontram fora das situações anteriores que receberão o auxílio transporte. Para estes casos empregam-se mais de uma estrutura de decisão simples e/ou composta, denominando-se de ses encaixados/aninhados (se senao se). O exemplo (ex. 3.6) a seguir ilustra este conceito.

Exemplo 3.6 –

Desenvolver um algoritmo para ler um número e determinar se ele é maior, menor ou igual a zero.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

real n; imprima ("Entre com um numero: "); leia ("%f",&n);

se (n > 0.0) inicio imprima ("%f eh maior que zero!\n",n); fim senao inicio se (n < 0.0) inicio imprima ("%f eh menor que zero!\n",n); fim senao inicio imprima ("%f eh igual a zero!\n",n); fim

fim

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Pode-se observar que diversas linhas deste algoritmo terminam sem o ponto-e- vírgula, isto porque o ponto-e-vírgula só é utilizado para separar comandos e/ou estruturas. Deve-se tomar cuidado quando da utilização de ses aninhados, pois a cláusula senao é sempre relacionada ao último se. Se, dentro de algum algoritmo, necessitar-se contornar este fato, pode-se fazê-lo com uso dos delimitadores inicio e fim. Estes também são utilizados em seqüências ou blocos.

3.3 Seleção entre múltiplas escolhas

Utilizada quando se deseja executar um entre vários comandos (ou uma entre várias seqüências de comandos) dependendo do resultado de uma expressão. Mais de um comando ou vários comandos ou seqüências podem ser executados também, veja ainda nesta seção. A estrutura de seleção (decisão múltipla) é chamada de escolha caso e em linguagem C apresenta-se como comando de nome switch case, e obedece a seguinte sintaxe.

Sintaxe:

escolha (expressao) inicio caso <constante1> : comando ; comando ;

pare; caso <constante2> : comando ; comando ; pare;

caso <constante3> : comando ; comando ; pare;

[padrao

fim

: comando ; comando ; pare ;]

O comando escolha é delimitado pelo bloco de inicio e fim. Internamente possui uma expressao e suas opções de comparação por meio de cláusulas caso. A expressao após o comando escolha é avaliada e comparada com cada uma das constantes de cada cláusula caso. Cada uma das constantes deve ser bem definida. A

seqüência a ser executada logo que uma constante seja igual à expressão pode ser um ou mais comandos. O resultado da expressao é comparado com cada constante da lista para verificar-se a igualdade entre eles. Caso esta igualdade seja encontrada, o comando correspondente é executado e a estrutura é finalizada ou não, dependendo da existência de comandos pare. Caso nenhuma igualdade entre a expressao e as constantes sejam verificadas, os comandos correspondentes à cláusula padrao serão executados.

Os colchetes [

Os próximos exemplos ilustram formas de utilização do comando de seleção entre múltiplas escolhas.

]

delimitam uma parte opcional da estrutura.

Exemplo 3.7 –

Desenvolver um algoritmo para simular uma calculadora básica de números inteiros utilizando o comando escolha caso.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

char op; inteiro x,y; imprima ("Digite o operador: "); leia ("%c",&op); imprima ("Entre com os operandos: "); leia ("%d%d",&x,&y);

escolha (op) inicio caso '+' : imprima ("Soma = %d\n",x + y); pare;

caso '-' : imprima ("Subtracao = %d\n",x - y); pare;

caso '*' :

caso 'x' :

caso 'X' : imprima ("Produto = %d\n",x * y); pare; caso '/' : imprima ("Divisao = %d\n",x / y); pare;

padrao

: imprima ("Operador invalido!\n"); pare;

fim

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Neste exemplo a mensagem que será exibida, bem como a operação executada, dependerá do conteúdo da variável op. Se for igual a uma das constantes especificadas, será executado o comando imprima correspondente. Se nenhuma constante for igual ao conteúdo de op, será executado o imprima da cláusula padrao. Pode-se também escrever o mesmo programa anterior (ex. 3.7) sem utilizar a estrutura escolha caso, apenas utilizando se's aninhados, como demonstra a algoritmo seguinte.

Exemplo 3.8 –

Desenvolver um algoritmo para simular uma calculadora básica de números inteiros sem utilizar o comando escolha caso.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

char op; inteiro x,y;

imprima ("Digite o operador: "); leia ("%c",&op); imprima ("Entre com os operandos: "); leia ("%d%d",&x,&y); se (op == '+') inicio imprima ("Soma = %d\n",x + y); fim senao inicio se (op == '-') inicio imprima ("Subtracao = %d\n",x - y); fim

senao inicio se (op == '*' || op == 'x' || op == 'X') inicio imprima ("Produto = %d\n",x * y); fim senao inicio se (op == '/') inicio imprima ("Divisao = %d\n",x / y); fim senao inicio imprima ("Operador invalido!\n"); fim

fim

fim

fim

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Para compreender melhor o comando pare em todas ou algumas cláusulas caso do comando escolha, veja a figura (fig. 3.3) a seguir.

A expressao é avaliada e o valor obtido é comparado com os valores

associados às cláusulas caso em seqüência.

Quando o valor associado a uma cláusula é igual ao valor do escolha os respectivos comandos são executados até encontrar um pare.

Se não existir um pare na cláusula selecionada, os comandos das cláusulas

seguintes são executados em ordem até encontrar um pare ou esgotarem-se as

cláusulas do escolha.

Se nenhuma das cláusulas contém o valor de seleção a cláusula padrao, se

existir, será executada. O exemplo (ex. 3.9) a seguir ilustra o que acontece quando não são utilizados comandos pare em cada uma das cláusulas caso, partindo do princípio que este não foi o desejo do programador. Mas, por que o comando escolha caso tem este comportamento? Há casos onde esta característica é importante para que não seja necessário repetir comandos a serem executados por diversas cláusulas caso. Sendo assim, agrupam-se dois ou mais casos e suas respectivas constantes e somente ao final coloca- se o comando referente aos casos anteriores, sem esquecer, se este for o desejo, o comando pare. No Exemplo (ex. 3.7) anterior é possível observar que para não repetir o mesmo comando para multiplicar os valores para as constantes ‘*’ ,’x’ ,’X’ , optou-se por não utilizar comandos pare nestes casos.

Exemplo 3.9 –

Desenvolver um algoritmo para identificar os caracteres de ‘0’ à

‘9’ mostrando-os na tela. Utilize o comando escolha caso.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

char digito;

imprima ("Digite um caractere de 0 a 9: "); leia ("%c",&digito);

fim

escolha (digito) inicio caso '0' : imprima ("0"); caso '1' : imprima ("1"); caso '2' : imprima ("2"); caso '3' : imprima ("3"); caso '4' : imprima ("4"); caso '5' : imprima ("5"); caso '6' : imprima ("6"); caso '7' : imprima ("7"); caso '8' : imprima ("8"); caso '9' : imprima ("9"); pare;

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

escolha

••••

•••• caso : pare; caso : caso : pare;
•••• caso : pare; caso : caso : pare;
•••• caso : pare; caso : caso : pare;
•••• caso : pare; caso : caso : pare;
caso : pare; caso : caso : pare;
caso :
pare;
caso :
caso :
pare;

Figura 3.3 – Fluxograma para estrutura ESCOLHA CASO.

Ao executar o algoritmo do exemplo (ex. 3.9) anterior, têm-se a tela abaixo. Supondo que o usuário forneça o valor 4 obtêm-se a seguinte saída: 456789. Uma vez

que o caractere é encontrado em uma das constantes (caso) e não há comandos pare, toda a seqüência atual é mostrada. Isto para o caso apresentado constitui-se de um erro de lógica.

Vídeo Digite um caractere de 0 a 9 _4 <enter> 456789 pressione qualquer tecla
Vídeo
Digite um caractere de 0 a 9
_4 <enter>
456789
pressione qualquer tecla

Exemplo 3.10 –

Construir um algoritmo para identificar os números arábicos de 0 à 9 mostrando os números cardinais correspondes na tela. Utilize o comando escolha caso.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

inteiro num;

imprima ("Digite um numero de 0 a 9: "); leia ("%d",&num);

escolha (num) inicio caso 0 : imprima ("zero"); pare; caso 1 : imprima ("um"); pare; caso 2 : imprima ("dois"); pare; caso 3 : imprima ("tres"); pare; caso 4 : imprima ("quatro"); pare; caso 5 : imprima ("cinco"); pare; caso 6 : imprima ("seis"); pare; caso 7 : imprima ("sete"); pare; caso 8 : imprima ("oito"); pare; caso 9 : imprima ("nove"); pare;

fim

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Exemplo 3.11 –

Construir um algoritmo para identificar qual época do ano estamos. Utilize o comando escolha caso.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

inteiro epoca;

imprima("Periodo trimestral do ano estamos: "); leia ("%d",&epoca);

escolha (epoca) inicio caso 1 : imprima ("verao\n"); pare; caso 2 : imprima ("outono\n"); pare; caso 3 : imprima ("inverno\n"); pare; caso 4 : imprima ("primavera\n"); pare; padrao : imprima ("Periodo invalido!\n"); pare;

fim

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

3.4 Exercícios propostos

Exercício 3.1 –

Faça um algoritmo que leia um número inteiro e que determine o seu módulo sem usar nenhuma função disponível em C para essa finalidade.

Exercício 3.2 –

Faça um algoritmo que determine se um ano introduzido pelo usuário é ou não bissexto. Um ano é bissexto se for múltiplo de 4 sem ser de 100 ou se for múltiplo de 400.

Exercício 3.3 –

Faça um algoritmo que calcule o salário semanal de um funcionário. Deve ser lido o número total de horas (valor inteiro) de trabalho desse funcionário durante a semana, o custo de uma hora normal e o custo de uma hora extraordinária. Para calcular o salário, deve-se considerar como horas normais as 40 primeiras e como horas extraordinárias (se existirem) as restantes horas de trabalho.

Exercício 3.4 –

Escreva um algoritmo que leia um número inteiro e determine se ele é par ou ímpar.

Exercício 3.5 – Deseja-se calcular a conta de consumo de energia elétrica de um consumidor. Para isto, escreva um algoritmo que leia o código do consumidor, o preço do Kw e a quantidade de Kw consumido, e exiba o código do consumidor e o total a pagar.

total a pagar = preco x quantidade total a pagar minimo = R$ 13,20

Exercício 3.6 –

Escreva um algoritmo para ler três números inteiros distintos e determinar o menor deles.

Exercício 3.7 –

Faça um algoritmo que, dado as três notas de um aluno, determine e exiba a sua média final e o seu conceito, sabendo-se que:

A

média final é calculada pela média aritmética simples das 3 notas;

O

conceito é determinado de com base na tabela a seguir:

 

Média Final

Conceito

 

8,0

A

 

6,0 e < 8,0

B

 

< 6,0

C

Exercício 3.8 –

Os comandos (i) e (ii) são equivalentes? Explique sua resposta.

(i)

a = b == c

 

(ii)

se a == b inicio

 

a

= TRUE;

fim

senao

inicio

 

a

= FALSE;

fim

Exercício 3.9 –

Escreva um algoritmo que determine o grau de obesidade de uma

de

obesidade é determinado pelo índice da massa corpórea (Massa =

pessoa, sendo fornecido o peso e a altura da pessoa. O grau

Peso/Altura 2 ) seguindo a tabela abaixo:

Massa Corpórea

Grau De Obesidade

< 26

Normal

26 e < 30

Obeso

30

Obeso Mórbido

Exercício 3.10 – O

Criciúma

Futebol

Clube

deseja

aumentar

o

salário

de

seus

jogadores. O reajuste deve obedecer a seguinte tabela:

Salário Atual (R$)

Aumento

0,00 a 1.000,00

20%

1.000,01 a 5.000,00

10%

acima de 5.000,00

0%

Escrever um algoritmo que leia o salário atual de um jogador, e exiba o salário atual e o salário reajustado.

Exercício 3.11 – Faça um algoritmo para calcular a conta final de um hóspede de um hotel, considerando que:

a) Serão lidos os tipos de apartamentos utilizados (A, B, C ou D), o

número de diárias utilizadas pelo hóspede e o valor do consumo interno do hóspede;

b) O valor da diária é determinado pela seguinte tabela:

Tipo Do Apto

Valor Da Diária (R$)

A

150,00

B

100,00

C

75,00

D

50,00

c) O valor total das diárias é calculado pela multiplicação do número

de diárias utilizadas pelo valor da diária;

d) O subtotal é calculado pela soma do valor total das diárias e o valor

do consumo interno;

e) O valor da taxa de serviço equivale a 10% do subtotal;

f) O total geral resulta da soma do subtotal com a taxa de serviço;

g) Escreva a conta final contendo: o tipo do apartamento, o número de

diárias utilizadas, o valor unitário da diária, o valor total das diárias, o valor do consumo interno, o subtotal, o valor da taxa de serviços e o

total geral.

Exercício 3.12 – Deseja-se calcular o imposto de renda* de um contribuinte. Para isto, escreva um algoritmo que:

a) Leia os seguintes dados do contribuinte: CPF, rendimento anual,

imposto retido na fonte, contribuição previdenciária, despesas médicas, despesas com educação ao limite individual R$ 2.708,49 e número de dependentes;

b) É deduzido o valor de R$ 1.730,40 por cada dependente;

c) Cálculo do valor total das deduções: contribuição previdenciária +

despesas médicas + dedução dos dependentes;

d) Cálculo da base de cálculo: rendimento anual – total das deduções;

e) Com base na tabela a seguir:

Base de Cálculo

Alíquota

Parcela a Deduzir

até 17.215,08

Isento

-

De 17.215,09 até 25.800,00

7,50%

1.291,13

De 25.800,01 até 34.400,40

15,00%

3.226,13

De 34.400,41 até 42.984,00

22,50%

5.806,16

acima de 42.984,00

27,50%

7.955,36

Cálculo do imposto devido: ((base de cálculo * alíquota) - parcela a

deduzir)

f) Haverá imposto a pagar se a diferença entre o imposto devido e o imposto retido na fonte for positiva; caso contrário, haverá imposto a restituir;

g) Exiba todos os dados lidos e calculados.

* Regras para a declaração do IRPF - Imposto de Renda Pessoa Física de 2010, ano-base 2009.

Exercício 3.13 – Criar um algoritmo para resolver uma equação do primeiro grau (Ax +

B = 0), onde o usuário deverá informar o valor de A e B para o sistema

calcular o resultado de “x”.

Exercício 3.14 – Observe o trecho de algoritmo abaixo, considerando L1, L2 e L3 como variáveis lógicas.

se (L1) inicio imprima ('A') fim

senao inicio se (L2) inicio se (L3) inicio imprima ('B') fim senao inicio imprima ('C'); imprima ('D'); fim fim senao inicio imprima ('E'); fim fim

Agora, responda as seguintes questões:

a) Se forem lidos V, V e V, o que será escrito pelo algoritmo?

b) Se forem lidos F, V e V, o que será escrito pelo algoritmo?

c) Se forem lidos F, V e F, o que será escrito pelo algoritmo?

d) Que valores deveriam ser lidos para que fosse escrito apenas "E"?

3.5 Estruturas de repetições

Serve para efetuar um conjunto de ações repetidas vezes. Existem três tipos básicos de repetições, sendo elas: enquanto, faca enquanto e para.

3.5.1 Enquanto

A instrução enquanto (em pseudocódigo enquanto-faça) é utilizada quando se deseja executar várias vezes o mesmo trecho de um algoritmo ou programa, enquanto a expressao for verdadeira.

Sintaxe:

enquanto (expressao) inicio comando; [ou seqüência;] fim

A

figura (fig.

enquanto.

3.4)

abaixo

mostra a seqüência de

execução

da

instrução

enquanto F V
enquanto
F
V

Figura 3.4 – Fluxograma para estrutura ENQUANTO.

O passo inicial a ser executado na instrução enquanto, é a verificação se a expressao é verdadeira ou falsa. Sendo esta verdadeira, a ação (comando ou seqüência de comandos) é executada e o controle do algoritmo ou programa retorna para o topo do ciclo (loop). Novamente a expressao é testada e se ela ainda continuar sendo verdadeira o comando ou seqüência de comandos é executado mais uma vez e, o controle do algoritmo retorna novamente para o topo do ciclo (loop). Esse processo se repete até que o teste da expressao seja falso. Quando isto acontece, a ação ou comando é saltado (não executado), e o controle do algoritmo prossegue fora do enquanto. É importante notar que a expressao só se tornará falsa se alguma ação entre o inicio e fim dos comandos do enquanto atuar sobre alguma variável da

expressao, modificando seu valor. Os colchetes [

]

delimitam uma parte

opcional da estrutura. O comando enquanto analisa a expressao e enquanto o seu resultado for verdadeiro, o comando ou a seqüência de comandos é executada. Esta estrutura é recomendada para um número de repetições desconhecidas, podendo repetir de nenhuma vez até n vezes.

Exemplo 3.12 – Desenvolver um algoritmo para calcular e mostrar o dobro de um número após solicitar do usuário este número. Utilize a estrutura de repetição enquanto. Sendo que, o algoritmo termina somente quando o usuário fornecer o valor zero (0) como número de entrada.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

inteiro num, dobro;

imprima ("Digite um numero inteiro: "); leia ("%d",&num);

enquanto (num != 0) inicio dobro = num * 2;

imprima ("%d, e seu Dobro: %d\n",num,dobro);

imprima ("Digite um numero inteiro: "); leia ("%d",&num); fim

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

Exemplo 3.13 –

Algoritmo de Euclides – Ler dois números positivos m e n e encontre seu maior divisor comum, isto é, o maior inteiro positivo que divide tanto m como n. Garanta que m é sempre maior que n e n é diferente de zero.

#incluir <stdio.h> #incluir <conio.h>

principal () inicio

inteiro m, n, r;

imprima ("Entre com valor de m: "); leia ("%d",&m); imprima ("Entre com valor de n: "); leia ("%d",&n);

se (m > n && n != 0) inicio

r = m resto n; /*resto da divisão de m por n */ enquanto (r != 0) inicio

m

= n;

n

= r;

r

= m resto n;

fim

fim

imprima ("\nMaior divisor comum = %d\n",n);

fim

imprima ("\npressione qualquer tecla

getch(); /* Aguarda uma tecla para finalizar */

");

retorno (0);

3.5.2 Faca enquanto

Uma outra maneira de fazer com que um conjunto de instruções seja executado

enquanto, conhecido também como

uma ou mais vezes, é utilizar a estrutura faca

repita até, em pseudocódigo. Sua forma geral é mostrada a seguir.

Sintaxe:

faca inicio comando; [ou seqüência;] fim enquanto (expressao) ;

A figura (fig. 3.5) a seguir mostra a seqüência de execução da instrução faca

enquanto.

A execução da estrutura faca enquanto ocorre da seguinte forma: quando o

fluxo de execução chega no início da estrutura (faca), o comando ou seqüência de comandos internos à estrutura são executados. Quando o fluxo de execução chega no enquanto, a expressao é avaliada. Se o resultado da avaliação for verdadeiro, a execução retorna ao faca e, novamente, os comandos ou seqüência de comandos são

executados. Porém se o resultado for falso, então a execução sairá do ciclo (loop) e passará para a primeira instrução imediatamente após o enquanto. Os colchetes

] [

delimitam uma parte opcional da estrutura.

faca

enquanto