Professional Documents
Culture Documents
Técnicas de Programação I
Algoritmos
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.
Problema
Solução
Algoritmo
7
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.
i) Descrição Narrativa;
ii) Fluxogramas;
iii) Pseudocódigo, também conhecido como Português Estruturado.
8
1.2.1 Descrição narrativa
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.
9
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.
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?
1.2.2 Fluxogramas
10
Exemplo 1.2 – Fluxograma para calcular o triplo de um número qualquer, fornecido
pelo usuário.
Início
Num
Triplo = Num * 3
Triplo
Fim
11
#incluir biblioteca
/* 1. Declaração das bibliotecas utilizadas */
/* 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 */
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.
12
Situação 1: Visto como algoritmo presente em vários livros de estrutura de dados
e algoritmos:
Algoritmo Calculo_Media
Inicio
Leia(nota1, nota2);
Se (media >= 7)
Então
Escreva (‘Aprovado‘)
Senão
Escreva (‘Reprovado‘);
Fim
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
leia("%d",¬a1);
leia("%d",¬a2);
retorno (0);
fim
13
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.
14
2 Variáveis, expressões, funções, atribuições, entrada e saída
2.1 Variáveis
tipo_da_variavel nome_da_variavel ;
inteiro a;
real x;
char letra;
char nome[40]; /* Armazena até 40 caracteres */
15
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.
Numéricas
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:
16
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
char
Lógicos
Também conhecido como tipo booleano. Pode representar apenas dois valores:
Verdadeiro ou Falso. Pode ser utilizado em algumas linguagens de programação com
17
outras denominações, tais como Sim/Não, True/False, 1/0, Verdadeiro/Falso.
Constante simbólica
#definir TAMANHO 50
#definir MAX 100
#definir VERDADEIRO 1
#definir FALSO 0
e/ou
#definir TRUE 1
#definir FALSE 0
#incluir <stdio.h>
#incluir <conio.h>
#definir MEDIA_APROVADO 7
principal ()
inicio
inteiro nota1, nota2;
real media;
leia("%d",¬a1);
leia("%d",¬a2);
18
se (media >= MEDIA_APROVADO)
inicio
imprima ("Voce foi Aprovado\n");
fim
senao
inicio
imprima ("Voce foi Reprovado\n");
fim
retorno (0);
fim
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
dobro = num * 2;
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 ( ) ( )
19
2.3 Expressões
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.
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;
r = a + b;
imprima ("A soma de %d e %d = %d\n",a,b,r);
20
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);
retorno (0);
fim
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
21
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro idade;
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.
22
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.
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.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro idade;
char sexo;
23
se (idade >= 18 && sexo == 'M')
inicio
imprima ("Voce precisa alistar-se!\n");
fim
24
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
Q1 = potencia(ladoA,2);
Q2 = ladoB * ladoB;
hipotenusa = raiz(Q1 + Q2);
retorno (0);
fim
2.5 Atribuições
y = 6;
25
Lê-se da seguinte forma:
y
6
x = 3;
z = y * x;
y x z
6 3 18
26
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; /* Passo 1 */
temp = a;
a = b; /* Passo 2 */
b = temp; /* Passo 3 */
a = 5;
b = 7; /* Passo 1 */
a++; /* Passo 2 */
b--; /* Passo 3 */
a b a b a b
5 7 6 7 6 6
27
2.6 Saída de dados
imprima ("texto");
ou
imprima ("texto %caractere",variavel);
ou
imprima ("texto %caractere",constante);
ou
imprima ("texto %caractere",expressao);
28
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
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro a, b;
a = 5;
b = 10;
retorno (0);
fim
29
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro a, b;
real m;
a = 5;
b = 10;
m = (a + b)/2.0;
retorno (0);
fim
Memória (RAM)
a b m
5 10 7.5
Vídeo
A = 5 e B = 10
Media = 7.50000e+00
Media = 7.500000
Media = 7.50
pressione qualquer tecla...
30
2.7 Entrada de dados
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).
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
31
leia ("%f%f%f",¬a1,¬a2,¬a3);
retorno (0);
fim
Vídeo
Assim, valor 3.5 será armazenado na variável nota1, o valor 7.8 em nota2
e o valor 8.4 em nota3.
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
32
imprima ("\nMedia Final = %.2f\n",media);
retorno (0);
fim
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)
Vídeo
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
33
inteiro ano, mes, dias, total;
retorno (0);
fim
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.
34
Exercício 2.9 – Em qual dos seguintes pares é importante a ordem dos comandos?
Supor: x ≠ y ≠ z.
a) x = y; b) x = y; c) x = z; d) z = y;
y = z; z = x; x = y; x = y;
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
retorno (0);
fim
Exercício 2.11 – Escreva um algoritmo que leia um número inteiro positivo e exiba o
dobro do mesmo.
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.
35
ax2 + bx + c = 0
b2 – 4ac
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))
a) abs (-4)
b) abs (5.2)
c) potencia (1.0,4)
d) potencia (10,2)
e) raiz (25)
f) raiz (9.0)
a b a && b a || b !a !b
TRUE TRUE
TRUE FALSE
FALSE TRUE
FALSE FALSE
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))
36
c) A || B && !A || !B
d) (A || B) && (!A || !B)
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 r3) Repare que, em C, a divisão de 4
por 3 dá um valor inteiro se não tomar medidas adequadas.
37
3 Comandos de controle de fluxo
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
suc = num + 1;
ant = num - 1;
38
imprima ("Antecessor = %d\n",ant);
retorno (0);
fim
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
q = valor1 / valor2;
r = valor1 resto valor2;
retorno (0);
fim
#incluir <stdio.h>
#incluir <conio.h>
#incluir <math.h>
#definir PI 3.1415926
39
principal()
inicio
real angulo, rang;
imprima ("Entre com um ângulo em graus: ");
leia ("%f",&angulo);
retorno (0);
fim
3.2 Seleção
Sintaxe:
40
se (condicao)
inicio
comando ;
[ou sequencia1 ;]
fim
Fluxo
se
Sintaxe:
se (condicao)
inicio
comando ;
[ou sequencia1 ;]
fim
senao
inicio
comando ;
[ou sequencia2 ;]
fim
Exemplo 3.4 – Desenvolver um algoritmo para ler um número inteiro e exibi-lo se for
positivo.
#incluir <stdio.h>
41
#incluir <conio.h>
principal ()
inicio
real n;
se (n > 0.0)
inicio
imprima ("%f eh positivo!\n",n);
fim
retorno (0);
fim
Fluxo
se
#incluir <stdio.h>
#incluir <conio.h>
principal ()
42
inicio
real 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
retorno (0);
fim
Neste exemplo (ex. 3.5), a mensagem que será exibida dependerá do resultado
da expressão lógica (n > 0.0). Se ela for verdadeira, será executado o comando
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.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
43
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
retorno (0);
fim
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.
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 ;
44
pare;
caso <constante2> : comando ;
comando ;
pare;
...
[padrao : comando ;
comando ;
pare ;]
fim
#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;
45
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
retorno (0);
fim
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.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
char op;
inteiro x,y;
46
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
retorno (0);
fim
47
‘9’ mostrando-os na tela. Utilize o comando escolha caso.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
char digito;
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
retorno (0);
fim
escolha
•
caso :
pare;
caso :
caso :
pare;
48
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...
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro 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;
49
fim
retorno (0);
fim
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;
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
retorno (0);
fim
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.
50
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.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:
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
51
Peso/Altura2) seguindo a tabela abaixo:
52
Exercício 3.12 – Deseja-se calcular o imposto de renda* de um contribuinte. Para isto,
escreva um algoritmo que:
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”.
...
se (L1)
inicio
imprima ('A')
fim
53
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:
54
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
Sintaxe:
enquanto (expressao)
inicio
comando;
[ou seqüência;]
fim
enquanto
F V
55
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.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
enquanto (num != 0)
inicio
dobro = num * 2;
retorno (0);
fim
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro m, n, r;
56
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
retorno (0);
fim
Uma outra maneira de fazer com que um conjunto de instruções seja executado
uma ou mais vezes, é utilizar a estrutura faca enquanto, conhecido também como
repita até, em pseudocódigo. Sua forma geral é mostrada a seguir.
Sintaxe:
faca
inicio
comando;
[ou seqüência;]
fim
enquanto (expressao) ;
57
faca
enquanto
V
F
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro m, n, r;
r = 0;
faca
inicio
r = r + m;
n = n - 1;
fim
enquanto (n != 0);
58
imprima ("\nResultado = %d\n",r);
retorno (0);
fim
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
faca
inicio
imprima ("Digite um numero inteiro: ");
leia ("%d",&num);
dobro = num * 2;
retorno (0);
fim
3.5.3 Para
A estrutura para (fig. 3.6) executa uma seqüência ou um bloco, de uma ou mais
declarações, um certo número de vezes. Em pseudocódigo, o comando para
corresponde à estrutura de repetição para faça.
Sintaxe:
59
Quando uma declaração para é encontrada durante a execução de um
programa, ocorrem os seguintes eventos:
para inicializacao
teste
V
F
bloco
incremento
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro contador;
60
imprima ("\npressione qualquer tecla...");
getch(); /* Aguarda uma tecla para finalizar */
retorno (0);
fim
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro turma, i;
real nota, soma, media;
soma = 0;
media = soma/turma;
retorno (0);
fim
...
61
inicio
...
fim
...
...
...
Exemplo 3.18 – Criar um algoritmo que a cada número digitado pelo usuário seja
calculado o seu fatorial e exibido na tela o resultado.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro n, i, fatorial;
fatorial = 1;
62
imprima ("Fatorial de %d e = %d\n",n,fatorial);
imprima ("\npressione qualquer tecla...");
getch(); /* Aguarda uma tecla para finalizar */
retorno (0);
fim
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro base, expoente, resultado, i;
resultado = base;
se (expoente == 0)
inicio
resultado = 1;
fim
senao
inicio
se (base == 0)
inicio
resultado = 0;
fim
senao
inicio
para (i = 1; i < expoente; i++)
inicio
resultado = resultado * base;
fim
fim
fim
63
retorno (0);
fim
O trecho do código acima poderia ser substituído pelo trecho abaixo com a
seguinte construção:
inicializacao;
enquanto (condicao)
inicio
comando;
[ou seqüência;]
incremento;
fim
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro contador;
64
retorno (0);
fim
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro contador;
contador = 1;
retorno (0);
fim
Exercício 3.16 – Faça um algoritmo para ver se um número é primo ou não (um
número só é primo se apenas for divisível por 1 e por si próprio).
Exemplo do algoritmo ao ser executado:
Digite o raio: 3
65
A area é 28.27
Digite o raio: 2.5
A area é 19.63
Digite o raio: -2
Esse raio é inválido
Digite o raio: 1
A area é 3.14
Digite o raio: 0
A area é 0.00
Ate logo.
Celcius Fahrenheit
0.0 32.0
2.0 35.6
4.0 39.2
6.0 42.8
... ...
40.0 104.0
Digite um numero: _9
9 x 1 = 9
9 x 2 = 18
9 x 3 = 27
9 x 4 = 36
9 x 5 = 45
9 x 6 = 54
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81
9 x 10 = 90
Exercício 3.20 – Escreva um algoritmo que leia dois números e exiba o maior deles.
Exercício 3.21 – Escreva um algoritmo que leia dois números e exiba-os em ordem
crescente.
Exercício 3.22 – Faça um algoritmo que mostre todos os números inteiros pares de 2 à
100.
Exercício 3.23 – Faça um algoritmo para gerar e exibir os números inteiros de 20 até
10, decrescendo de 1 em 1.
66
Exercício 3.24 – Faça um algoritmo que leia um número N, some todos os números
inteiros de 1 à N, e mostre o resultado obtido.
Exercício 3.26 – Faça um algoritmo que leia 3 números inteiros (N, X, Y) e mostre
todos os números múltiplos de N entre X e Y.
Exercício 3.27 – Faça um algoritmo que leia dois valores inteiros (X e Y) e mostre
todos os números primos entre X e Y.
Exercício 3.30 – Em um frigorífico existem 90 bois. Cada boi traz preso em seu
pescoço um cartão contendo seu número de identificação e seu peso.
Faça um algoritmo que escreva o número e o peso do boi mais gordo e
do boi mais magro (supondo que não haja empates).
Exercício 3.31 – Foi feita uma pesquisa de audiência de canal de TV em várias casas de
uma certa cidade, num determinado dia. Para cada casa visitada é
fornecido o número do canal (5, 7, 10 ou 12) e o número de pessoas
que estavam assistindo o canal naquela casa. Fazer um algoritmo que:
Leia um número indeterminado de dados, sendo que o flag
corresponde ao canal igual a 0 (zero);
67
H Hamburger 3,50
C Cheeseburger 3,00
Q QueijoQuente 2,40
Exercício 3.34 – Uma certa firma fez uma pesquisa de mercado para saber se as pessoas
gostaram ou não de um novo produto lançado no mercado. Para isto,
forneceu o sexo do entrevistado (M-masculino ou F-feminino) e sua
resposta (S-sim ou N-não). Sabendo-se que foram entrevistadas 2.000
pessoas, fazer um algoritmo que calcule e escreva:
Exercício 3.36 – Faça um algoritmo que leia vários códigos do jogador (1 ou 2) que
ganhou o ponto em uma partida de pingue-pongue, e responda quem
ganha a partida. A partida chega ao final se um dos jogadores chega a
68
21 pontos e a diferença de pontos entre os jogadores é maior ou igual a
dois. Caso contrário, ganha aquele que, com mais de 21 pontos,
consiga colocar uma vantagem de dois pontos sobre o adversário.
69
4 Modularização
4.1 Funções
Sintaxe:
Comandos;
retorno (expressao);
fim
70
nenhum valor, sendo considerada de retorno vazio. Em algumas linguagens de
programação, tal como a linguagem Pascal este método é implementado na forma de
procedimentos.
O nome da função é dado pelo programador e precisa seguir as mesmas regras
utilizadas para nomear as variáveis e as constantes.
Na lista de parâmetros encontram-se as variáveis que devem ser passadas a
função no momento de sua chamada ou invocação. Esta lista apresenta-se da seguinte
maneira.
#incluir biblioteca
/* Declaração das bibliotecas utilizadas */
Comandos;
retorno (expressao);
fim
...
71
variavel = nome_da_funcao (variaveis) ;
/* Retorno de erro ou Ok */
Exemplo 4.1 - Criar um algoritmo com uma função capaz de calcular o quadrado de um
número.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro num,q;
q = quadrado (num);
Exemplo 4.2 - Tomando o exemplo anterior (ex. 4.1), crie um algoritmo que utilize uma
outra função para calcular o cubo de um número.
#incluir <stdio.h>
#incluir <conio.h>
72
principal ()
inicio
inteiro num,c;
c = cubo (num);
Exemplo 4.3 - Tomando os exemplos anteriores (ex. 4.1 e 4.2), crie um algoritmo que
utilize duas funções para calcular o cubo de um número. Se possível
também calcule o quadrado no mesmo algoritmo.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro num,r;
r = quadrado (num);
imprima ("\nQuadrado do numero %d e = %d",num,r);
r = cubo (num);
imprima ("\nCubo do numero %d e = %d\n",num,r);
73
O comando retorno presente em cada função é a maneira que a função tem para
devolver um valor ao algoritmo ou a outra função que a tenha invocado. O comando
returno aparece nas funções da seguinte forma.
retorno(valor_de_retorno);
ou
retorno();
Suponha que uma função está sendo executada. Quando se chega a uma
declaração retorno a função é encerrada imediatamente e, se o valor de retorno é
informado, a função devolve este valor. É importante lembrar que o valor de retorno
fornecido tem que ser compatível com o tipo de retorno declarado para a função. Assim
como a variável ou a expressão onde a função está inserida deve ser capaz de armazenar
ou utilizar corretamente o valor recebido da função.
Uma função pode ter mais de uma declaração retorno. Uma vez que a função
é terminada quando o algoritmo chega à primeira declaração retorno, podem-se ter
várias declarações de retorno em uma mesma função sem no entanto comprometer
seu funcionamento lógico.
A seguir outro exemplo de uso do comando retorno.
Exemplo 4.4 - Criar um algoritmo que utilize uma função para determinar se um
número fornecido pelo usuário é par ou ímpar.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro num;
se (ePar(num))
inicio
74
imprima ("\nNumero %d e Par",num);
fim
senao
inicio
imprima ("\nNumero %d e Impar",num);
fim
imprima ("\npressione qualquer tecla...");
getch(); /* Aguarda uma tecla para finalizar */
retorno (0);
fim
Exemplo 4.5 - Este algoritmo que executa as 4 operações aritméticas (adição, subtração,
divisão e multiplicação). Por questões de legibilidade do código, o
algoritmo foi subdivido em quatro funções. Estas funções retornam o
valor calculado para a função principal no algoritmo.
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
75
inteiro vlr1, vlr2, opcao;
real resultado;
faca
inicio
resultado = 0;
imprima ("Entre com um valor: ");
leia ("%d",&vlr1);
imprima ("Entre com outro valor: ");
leia ("%d",&vlr2);
escolha (opcao)
inicio
caso 1 : resultado = Soma(vlr1, vlr2);
pare;
caso 2 : resultado = Subtracao(vlr1, vlr2);
pare;
caso 3 : resultado = Multi(vlr1, vlr2);
pare;
caso 4 : se (vlr2 != 0)
inicio
resultado = Divide(vlr1, vlr2);
fim
senao
inicio
imprima ("Divisao por zero!\n");
fim
pare;
caso 5 : imprima ("Até logo\n");
pare;
padrao : imprima ("Opcao invalida!\n");
pare;
fim
imprima ("\nResultado = %.2f\n", resultado);
fim
enquanto (opcao != 5);
Exemplo 4.6 - Criar um algoritmo que utilize funções para calcular a seguinte
seqüência. S(x,n) = x/1! + x2/2! + x3/3! + ... +
xn/n!
#incluir <stdio.h>
76
#incluir <conio.h>
retorno (f);
fim
se (expo == 1)
inicio
retorno (base);
fim
retorno (p);
fim
inteiro i;
real s = 0.0;
retorno (s);
fim
principal ()
inicio
real x;
inteiro termos;
77
leia ("%d",&termos);
imprima ("Entre com o valor de x: ");
leia ("%f",&x);
Exercício 4.2 – Faça um algoritmo que leia um número inteiro e crie uma função que
devolva o seu módulo sem usar nenhuma função disponível em C para
essa finalidade.
Exercício 4.3 – Faça um algoritmo que possua uma função 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. A função deve
retornar 1 se o ano é bissexto e 0 (zero) caso contrário.
Exercício 4.4 - Criar um algoritmo com uma função que verifica se um número
fornecido pelo usuário é ímpar.
Exercício 4.5 - Desenvolver um algoritmo com uma função que calcule a Hipotenusa
de um triângulo retângulo a partir da leitura de seus Catetos na parte
principal do algoritmo. Estes serão passados a função por meio de
parâmetros.
Exercício 4.6 - Faça um algoritmo com uma função que devolverá 1 se o número
passado por parâmetro for primo e 0 (zero) se não for.
Exercício 4.7 – Faça um algoritmo com uma função 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.
78
Exercício 4.9 – Escreva um algoritmo para ler três números inteiros distintos e com
uma função para determinar o menor deles.
Exercício 4.10 – Faça um algoritmo que, dado as três notas de um aluno, determine e
exiba a sua média final (uma função) e o seu conceito (outra função),
sabendo-se que: a média final é calculada pela média aritmética das 3
notas; o conceito é determinado de com base na tabela abaixo:
Exercício 4.11 - Desenvolver um algoritmo que leia dois valores e chame uma sub-
rotina (função) que receba estas duas variáveis e troque o seu
conteúdo, ou seja, esta rotina é chamada passando duas variáveis A e
B por exemplo, e após a execução da rotina A conterá o valor de B e B
conterá o valor de A. Lembre-se de utilizar a passagem de parâmetros
por referência.
Exercício 4.12 - Crie uma função fatorial, como dado em aula anterior. Testar essa
função fazendo um algoritmo que calcule o fatorial de um número
fornecido pelo usuário.
Exercício 4.13 - Utilizando a função criada no exemplo anterior (ex. 4.4) faça um
programa que irá solicitar números inteiros ao usuário até que este
introduza um número negativo. Para cada valor introduzido, o
programa deve indicar se o número é par ou ímpar.
Exercício 4.14 - Faça uma função que devolva números aleatórios inteiros. A função
deverá receber um parâmetro n que indique a gama de valores
pretendidos e, a cada vez que for chamada, devolva um número
aleatório inteiro no intervalo [0 .. n-1].
Por exemplo, se a função for chamada com o parâmetro 6, deverá devolver um número
aleatório compreendido entre 0 e 5 (inclusive).
Exercício 4.15 - Utilizar a função que acabastes de criar no exercício anterior para
fazer um programa que simule atirar uma moeda ao ar 1000 vezes. O
programa deve contar quantas vezes saíram "cara" e quantas vezes
saíram "coroa".
Exercício 4.16 - Faça um algoritmo que gere 1000 números reais aleatórios no
intervalo [0,1]. O programa deve contar quantos números caem no
intervalo [0.0, 0.5], quantos caem no intervalo [0.5, 0.8] e
quantos caem no intervalo [0.8, 1.0].
79
Dicas para gerar números aleatórios:
Sintaxe:
Comandos;
fim
nome_da_funcao (variaveis) ;
80
tipo variavel1, tipo variavel2, ... , tipo variavelN
#incluir biblioteca
/* Declaração das bibliotecas utilizadas */
Comandos;
fim
...
nome_da_funcao (variaveis) ;
/* Retorno de erro ou Ok */
Exemplo 4.7 - Faça um algoritmo que possua uma função para mostrar mensagem
“Aprendendo a programar com VAZIO” na tela.
81
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
mensagem();
#incluir <stdio.h>
#incluir <conio.h>
principal ()
inicio
inteiro num, r;
saudacao ();
despedida ();
82
getch(); /* Aguarda uma tecla para finalizar */
retorno (0);
fim
Vê-se acima uma função sem retorno e sem parâmetros. Para que uma função
retorne algo, deve-se usar a comando retorno, bem como especificar o seu tipo de
retorno. Para funções sem retorno, basta declarar a função como tendo tipo de retorno
vazio.
Deve-se lembrar que a função principal( ) é uma função e como tal deve-
se tratá-la. O C Quietly e por conseqüência o compilador C assume que a função
principal( ) deve retornar um valor inteiro. Isto dá ao sistema operacional um
valor de retorno da função principal( ). Deve-se lembrar da seguinte convenção:
se o algoritmo retornar 0 (zero), significa que ele terminou normalmente, e, se o
algoritmo retornar um valor diferente de zero, significa que o algoritmo teve um término
anormal. Há ainda a possibilidade de a função principal( ) não devolver nada ao
SO (Sistema Operacional) se este for o seu desejo, veja como proceder a seguir.
vazio principal(vazio)
inicio
/* Comandos */
fim
ou
principal(vazio)
inicio
/* Comandos */
retorno (0);
fim
Exercício 4.17 - Criar uma função sem parâmetros que exiba na tela um menu com as
seguintes opções: Incluir, Remover, Alterar e Sair. Cada opção deve
estar em uma linha separada.
Exercício 4.18 - Criar uma função sem parâmetros que desenhe uma moldura na tela
do microcomputador. Faça no algoritmo principal uma chamada a esta
função, desenhando a moldura e após escrevendo "Hello World"
da tela. Para desenhar a moldura use os caracteres especiais da tabela
ASCII estendida.
83
Exemplos:
Pressione a tecla ALT e ao mesmo tempo um dos seguintes números
no teclado numérico - ALT + 200, ALT + 201, ALT + 205, ALT +
186, ALT + 187, ALT + 188.
Exercício 4.20 - Altere o algoritmo anterior de maneira que quando o usuário apertar
uma tecla (tecla = getch()), seja escrito "Bye-Bye World”
na tela. O programa deve terminar automaticamente após um atraso
(sleep ou delay) de 5 segundos.
84
5 Estruturas e classes
5.1 Estruturas
estrutura nome
inicio
/* declaracao de componentes */
...
85
5.1.1 Definindo e declarando estruturas
#incluir <stdio.h>
#incluir <conio.h>
principal ( )
inicio
/* definição da estrutura */
estrutura coord
inicio
inteiro x;
inteiro y;
fim ;
retorno (0);
fim
#incluir <stdio.h>
#incluir <conio.h>
86
principal()
inicio
estrutura coord
inicio
inteiro x;
inteiro y;
fim primeira, segunda;
#incluir <stdio.h>
#incluir <conio.h>
principal()
inicio
/* definição da estrutura */
estrutura coord
inicio
inteiro x;
inteiro y;
fim ;
87
5.1.2 Acessando os membros de estruturas
Cada membro da estrutura pode ser utilizado como outras variáveis do mesmo
tipo. Os membros da estrutura são acessados através do operador (.), também chamado
de operador ponto, entre o nome da variável da estrutura e o nome de cada membro.
Para atribuir a variável primeira as coordenadas x = 2 e y = 3, deve-se escrever o
código a seguir.
primeira.x = 2;
primeira.y = 3;
segunda = primeira;
é equivalente a
segunda.x = primeira.x;
segunda.y = primeira.y;
Exemplo 5.4 – Criando as estruturas data e hora e definindo as variáveis para sua
utilização no algoritmo.
#incluir <stdio.h>
#incluir <conio.h>
principal()
inicio
estrutura data
inicio
inteiro mes;
inteiro dia;
inteiro ano;
fim data_atual ;
88
estrutura hora
inicio
inteiro h;
inteiro min;
inteiro seg;
fim hora_do_nascimento = { 22, 20, 0 } ;
São estruturas que contém outras estruturas como membros e estruturas que
contém vetores como membros. Assim, além dos tipos primitivos uma estrutura pode
conter outras estruturas, como demonstra o próximo exemplo (ex. 5.5). O exemplo
anterior (ex. 5.3) foi estendido para ilustrar está uma estrutura complexa.
Imagine que você deseje representar um retângulo. Um retângulo pode ser
representado pelas duas coordenadas diagonais dos cantos opostos. Têm-se até este
momento uma forma de representar um ponto por meio de duas coordenadas (x,y). O
exemplo (ex. 5.5) a seguir define a estrutura para representar estruturas de retângulos. A
estrutura de coordenadas de ponto também se faz presente neste exemplo, uma vez que
sua definição é imprescindível.
Exemplo 5.5 – Criando as estruturas mais complexas e definindo as variáveis para sua
utilização no algoritmo.
#incluir <stdio.h>
#incluir <conio.h>
principal( )
inicio
estrutura coord
inicio
inteiro x;
inteiro y;
fim ;
estrutura retangulo
inicio
estrutura coord infEsquerdo;
estrutura coord supDireito;
fim ;
89
estrutura retangulo caixa ;
estrutura retangulo
inicio
estrutura coord infEsquerdo;
estrutura coord supDireito;
fim caixa ;
caixa.infEsquerdo.x
caixa.infEsquerdo.x = 5;
caixa.infEsquerdo.y = 10;
caixa.supDireito.x = 50;
caixa.supDireito.y = 30
90
um retângulo a partir da solicitação de coordenadas ao usuário.
#incluir <stdio.h>
#incluir <conio.h>
principal()
inicio
inteiro compto, largura;
real area;
estrutura coord
inicio
inteiro x;
inteiro y;
fim ;
estrutura retangulo
inicio
estrutura coord infEsquerdo;
estrutura coord supDireito;
fim ;
91
5.1.4 Exercícios propostos
Exercício 5.1 – Faça um algoritmo que calcule a hipotenusa entre dois pontos a partir
das coordenadas da diagonal de triângulo retângulo.
Exercício 5.2 – Faça um algoritmo que calcule a área de triângulo retângulo a partir
das coordenadas da diagonal de dois pontos.
5.2 Classes
Algoritmo
principal(){
dados
}
92
Uma vez que o código de uma função e os seus parâmetros foram testados e
estando estes livres de erros, eles estarão corretos para cada invocação da função. Agora
o algoritmo consiste de uma seqüência (fig. 5.3) de chamadas às funções e que facilita a
reutilização do código inclusive em outros algoritmos e a localização e identificação de
erros em cada módulo em separado. Cada módulo pode possuir seus próprios dados,
também.
Algoritmo
principal () {
dados
}
Algoritmo
Obejto1 Obejto3
dados1 dados3
Obejto2
dados2
93
5.2.4 Declarando classes
classe nome_da_classe
inicio
/* declarações de variáveis e métodos privados */;
publico:
/* declarações de variáveis e métodos publicos */;
fim
Uma classe se parece com uma estrutura em termos de atributos ou dados, assim
como uma estrutura é construída para agrupar algumas variáveis em um mesmo local de
fácil acesso, também as classes permitem a abstração de dados, por meio de variáveis de
diversos tipos.
Em um programa que utiliza uma interface controladora de um motor elétrico
provavelmente definiria-se uma classe chamada motor. Os atributos desta classe
seriam: temperatura, velocidade, tensão_aplicada. Estes provavelmente
seriam representados na classe por tipos como real ou inteiro. As funções membro
ou métodos desta classe seriam funções para alterar a velocidade, ler a temperatura, etc.
Outro programa de contas a pagar e contas a receber definiria-se a classe
conta_bancaria. Os atributos seriam: saldo, limite_de_saque,
taxa_de_juros, etc, representados como variáveis do tipo real. Dentre as funções
membros desta classe estariam às funções para: efetuar saques, depósitos e computar
juros. Estes são alguns exemplos de abstrações de situações encontradas no mundo real
por meio da definição classes para representá-los.
Objetos são instâncias de uma classe. Quando um objeto é criado ele precisa ser
inicializado, ou seja, para uma única classe. A classe Estudante de graduação
pode ter vários objetos em um mesmo algoritmo. Estudante de graduação João,
Matrícula 567418, Curso Engenharia Mecânica; Estudante de graduação
Márcia, Matrícula 982349, Curso Engenharia Elétrica... A classe representa
somente o molde para a criação dos objetos, estes sim contém a informação.
#incluir <iostream.h>
classe Ponto
inicio
94
inteiro x, y;
publico:
vazio setaX (inteiro vx);
vazio setaY (inteiro vy);
inteiro obtemX ( );
inteiro obtemY ( );
fim;
principal ( )
inicio
retorno (0);
fim
Comandos;
retorno (expressao);
fim
Exemplo 5.8 – Definir a classe Ponto e sua interface. Declare ainda dois objetos para
esta classe.
#incluir <iostream.h>
#incluir <conio.h>
classe Ponto
inicio
inteiro x, y;
publico:
vazio setaX (inteiro vx);
vazio setaY (inteiro vy);
inteiro obtemX ( ) inicio retorno (x); fim
inteiro obtemY ( ) inicio retorno (y); fim
fim;
95
vazio Ponto::setaX (inteiro vx)
inicio
x = vx;
fim
vazio Ponto::setaY (inteiro vy)
inicio
y = vy;
fim
principal ()
inicio
retorno (0);
fim
A diferença é que como a função membro está definida na classe, ela ganha
acesso direto aos dados membros ou atributos, sem precisar usar o "ponto", exemplo:
um_objeto.dadomembro
Ponto p; /* instanciacao */
p.x = 2; /* Erro! */
Exemplo 5.9 – Definir a classe Ponto e sua interface. Declare ainda dois objetos para
esta classe. Represente as coordenadas de um retângulo.
96
#incluir <iostream.h>
#incluir <conio.h>
classe Ponto
inicio
privado:
inteiro x;
inteiro y;
publico:
vazio setaX (inteiro vx) inicio x = vx; fim;
vazio setaY (inteiro vy) inicio y = vy; fim;
vazio coordXY (inteiro vx, inteiro vy);
inteiro obtemX( ) inicio retorno (x); fim
inteiro obtemY( ) inicio retorno (y); fim
vazio mostraXY ( );
fim;
vazio Ponto::mostraXY ( )
inicio
csaida << "X = " << x <<" , Y: " << y << "\n";
fim
principal ()
inicio
p1.setaX(2);
p1.setaY(3);
p2.coordXY (10,12);
p1.mostraXY();
p2.mostraXY();
getch();
retorno(0);
fim
Exemplo 5.10 – Definir a classe Ponto e sua interface. Declare ainda dois objetos para
esta classe. Represente as coordenadas de um retângulo e calcule sua
área.
#incluir <iostream.h>
#incluir <conio.h>
97
classe Ponto
inicio
privado:
inteiro x;
inteiro y;
publico:
Ponto (inteiro vx, inteiro vy); /* construtor */
inteiro obtemX( ) inicio retorno (x); fim
inteiro obtemY( ) inicio retorno (y); fim
vazio mostraXY ( );
privado:
vazio setaX (inteiro vx) inicio x = vx; fim
vazio setaY (inteiro vy) inicio y = vy; fim
fim;
vazio Ponto::mostraXY ( )
inicio
csaida <<"X = "<< obtemX()<<",Y: "<<obtemY()<<"\n";
fim
principal()
inicio
inteiro area, comprimento, largura;
getch();
retorno(0);
fim
Exercício 5.3 – Definir a classe Ponto e sua interface. Declare ainda dois objetos para
98
esta classe. Represente as coordenadas de um retângulo e a medida da
diagonal do mesmo a partir da origem (0,0).
Exercício 5.4 – Definir a classe Ponto e sua interface. Declare ainda dois objetos para
esta classe. Represente as coordenadas de um retângulo e a medida da
diagonal do mesmo.
99
6 Mini Manual do C Quietly
100
Figura 6.2 – Novo código-fonte em linguagem C.
101
Figura 6.3 – Compilando um código-fonte.
102
Figura 6.5 – Executando o programa.
103
Figura 6.7 – Inserindo novas palavras-chave.
104
Bibliografia
105