Está en la página 1de 55

Algoritmos e Estruturas de Dados I

01/2013

Estruturas Condicionais e de
Repetio
(parte 2)

Pedro O.S. Vaz de Melo


Problema 1
Suponha que soma (+) e subtrao (-) so as nicas
operaes disponveis em C. Dados dois nmeros
inteiros positivos A e B, determine o quociente e o resto
da diviso de A por B.
Algoritmos Estruturados
Para resolver o Problema 1, precisamos de um
algoritmo:
Sequncia finita de instrues que, ao ser executada,
chega a uma soluo de um problema.
Algoritmos Estruturados
Para resolver o Problema 1, precisamos de um
algoritmo:
Sequncia finita de instrues que, ao ser executada,
chega a uma soluo de um problema.

Para escrever este algoritmo, podemos usar a


seguinte ideia:
Representar os nmeros A e B por retngulos de
larguras proporcionais aos seus valores;
Verificar quantas vezes B cabe em A.
Algoritmos Estruturados
Suponha que soma (+) e subtrao (-) so as nicas
operaes disponveis em C. Dados dois nmeros
inteiros positivos A e B, determine o quociente e o resto
da diviso de A por B.

A
B
Quociente de A/B: no de
O que sobra em A
A = 7, B = 2 vezes que B cabe em A.
o resto da diviso.
Algoritmos Estruturados
Pode-se escrever este algoritmo como:

Sejam A e B os valores dados;


Atribuir o valor 0 ao quociente (q);
Enquanto B couber em A:
{
Somar 1 ao valor de q;
Subtrair B do valor de A;
}
Atribuir o valor final de A ao resto (r).
Algoritmos Estruturados
Pode-se escrever este algoritmo como:

Sejam A e B os valores dados;


Atribuir o valor 0 ao quociente (q);
Enquanto B <= A:
{
Somar 1 ao valor de q;
Subtrair B do valor de A;
}
Atribuir o valor final de A ao resto (r).
Fluxograma
conveniente representar algoritmos por meio
de fluxogramas (diagrama de blocos).
Em um fluxograma, as operaes possveis so
representadas por meio de figuras:
Figura Usada para representar
Incio ou fim.
Atribuio.
Condio.
Leitura de dados.
Apresentao de resultados.
Fluxo de execuo.
Fluxograma
Exemplo: o algoritmo para o Problema 1 pode
ser representado pelo seguinte fluxograma.
Incio

A, B

q = 0 Ateno: observe que um algoritmo no


inclui detalhes, tais como declarao de
variveis, mensagens a serem exibidas, etc.
No
B <= A r = A

Sim
q = q + 1 q, r
A = A - B

Fim
Programao Estruturada
Um algoritmo tem sempre um nico bloco incio
e deve conter, pelo menos, um bloco fim. A
execuo segue setas

Em geral, construir um algoritmo mais difcil


do que codificar em uma linguagem

Porm, a construo de algoritmos pode se


beneficiar de tcnicas, como a Programao
Estruturada
Programao Estruturada
Na Programao Estruturada, usa-se apenas
trs estruturas: sequncia, seleo e repetio.
Cada estrutura tem apenas um nico ponto de
entrada e um nico ponto de sada (crculos).

Sequncia Seleo (duas formas) Repetio (duas formas)

V V

F F
... V

F
F V
Programao Estruturada
Ateno!
Os retngulos indicam qualquer ao, incluindo
leitura de dados ou exibio de resultados
Construir programas estruturados corresponde
a combinar estas estruturas de duas maneiras:
Regra do empilhamento: o ponto de sada de uma
estrutura pode ser conectado ao ponto de entrada
de outra estrutura.
Regra do aninhamento: um retngulo de uma
estrutura pode ser substitudo por uma outra
estrutura qualquer.
Programao Estruturada
Estas regras podem ser aplicadas quantas
vezes forem necessrias e em qualquer ordem.

Na construo de fluxogramas, pode-se


substituir o primeiro ponto de entrada e os
ltimos pontos de sada por ovais (incio e fim).

Os demais pontos de entrada e sada podem


ser removidos.
Programao Estruturada
Exemplo: aplicao da regra de empilhamento.

Incio

Empilhamento Simplificao Fluxograma

Fim
Programao Estruturada
Suponha que soma (+) e subtrao (-) so as nicas
operaes disponveis em C. Dados dois nmeros
inteiros positivos A e B, determine o quociente e o resto
da diviso de A por B.

Incio

Aninhamento e V V
Simplificao F
F

Fluxograma
Fim
Problema 2
Dados dois nmeros inteiros A e B, determinar
o mximo divisor comum (MDC) destes dois
nmeros.
Problema 2
Como calcular o MDC entre dois nmeros A e
B, representado por mdc(A,B)?

Mtodo das divises sucessivas: efetua-se


vrias divises at chegar em uma diviso
exata.
Problema 2
Suponha que se deseje calcular mdc(48,30).
Divide-se o nmero maior pelo menor:
48/30 = 1 (resto 18).
Divide-se o divisor anterior pelo resto anterior e,
assim sucessivamente:
30/18 = 1 (resto 12)
18/12 = 1 (resto 6)
12/6 = 2 (resto 0 diviso exata)
MDC = 6
Soluo - Algoritmo
Um algoritmo para este problema pode ser escrito
como:

Enquanto B for diferente de zero:


{
r = resto da diviso de A por B;
A = B;
B = r;
}
mdc = A;
Soluo - Fluxograma
O algoritmo para calcular o mximo divisor
comum pode ser representado pelo seguinte
fluxograma:
Incio

A, B

No
B != 0 m = A

Sim
r = A % B m
A = B
B = r
Fim
Soluo - Fluxograma
O algoritmo para calcular o mximo divisor
comum pode ser representado pelo seguinte
fluxograma:
Incio

A, B

Sim
B == 0 m = A

No
r = A % B m
A = B
B = r
Fim
Soluo - Cdigo
Problema 3
Escrever um programa para ler dois inteiros do
teclado, calcular o MDC entre eles e, caso o
usurio deseje, repetir o processo.
Soluo
Soluo

Aps exibir o valor do mdc, o


programa exibe a mensagem:

Continua? (S/N)

Espera-se que o usurio


digite S ou N, caracteres que
sero lidos pela funo getche.

A funo getche retorna o cdigo


ASCII do caractere lido.

25

O loop ser executado enquanto c for igual a S ou a s.


Soluo
Para evitar a comparao com letras maisculas e
minsculas, pode-se usar a funo toupper:

Verifica se o valor de seu


parmetro corresponde ao
cdigo ASCII de uma letra
minscula.

Caso afirmativo, retorna o


cdigo da letra maiscula
correspondente.

Caso negativo, retorna o


prprio valor do parmetro.
Soluo
Um sinal sonoro (\a) pode ser usado para avisar o
usurio que a tecla pressionada no uma resposta
vlida.

Sinal sonoro
Problema 4

Escreva um programa que permita ao usurio escolher


dentre as seguintes opes:

Exibir o contedo da pasta;

Modificar a hora do sistema;

Modificar a data do sistema;

Terminar a execuo do programa.

28
Problema 4

29
Funo system

O programa desenvolvido para o Problema 4 mostra


diversas possibilidades de uso da funo system:

Parmetro Usado para

CLS Limpar a tela de execuo.

DIR Exibir o contedo da pasta em uso.

TIME Exibir e permitir modificar a hora atual do sistema.

DATE Exibir e permitir modificar a data atual do sistema.

PAUSE Interromper a execuo do programa.

30
Funo system

Os parmetros possveis para a funo system


dependem do sistema operacional sob o qual os
programas sero executados.

Assim, os parmetros CLS, DIR, TIME, DATE,


PAUSE, correspondem a comandos do sistema DOS.

31
Comandos if-else interrelacionados

Exemplo: imagine uma funo que recebe como


parmetro um inteiro representando o nmero de um
ms e retorna o nmero de dias deste ms (considere
que fevereiro tem sempre 28 dias).

32
Comandos if-else interrelacionados

33
Comandos if-else interrelacionados

Uma outra forma de escrever esta funo, mas ainda


com comandos if-else interrelacionados :

34
Comando switch

A demanda por comandos if-else interrelacionados


muito comum em programao.

Assim, a linguagem C disponibiliza um comando


especial para tais situaes: switch. A sintaxe deste
comando a seguinte:

switch (expresso)
{
case constante-1:
comandos-1;
case constante-2:
comandos-2;
...
default:
comandos-n;
} 35
Comando switch

Com o comando switch, a


funo dias_do_mes pode
ser reescrita como:

36
Comando switch

Este comando permite que, de acordo com o valor de


uma expresso, seja executado um ou mais comandos
dentre uma srie de alternativas.

O caso cuja constante for igual ao valor da expresso


ser selecionado para execuo.

Ateno!

Os comandos associados a este caso e todos os comandos
seguintes sero executados em sequncia at o final do
comando switch.

Para evitar a execuo de todos os comandos seguintes, usa-
se o comando break.

37
Comando switch

Como assim?

Para mes = 2:

Com o uso de break:

dias = 28;

Para mes = 2:

Sem o uso de break:

dias = 28;
dias = 30;
dias = 0;

38
Comandos break e continue

Em alguns programas, durante um processamento


iterativo, pode ser necessrio:

Encerrar o processamento iterativo independentemente do
valor da condio do lao;

Executar apenas parcialmente uma iterao, ou seja, executar
somente algumas das instrues do lao da repetio.

Para encerrar um processamento iterativo,


independentemente do valor da condio do lao, deve-
se usar o comando break.

39
Comandos break e continue

Exemplo: dados os valores N (int) e A (float), determine a


partir de qual termo o valor de:

1 1 1 maior do que A.
s = 1 + + + ... +
2 3 N
Suponha N = 10 e A = 2.

Instante Valor de s

10 termo 1.000000

20 termo 1.500000

30 termo 1.833333

40 termo 2.083333 A partir do quarto


termo s > A.
40
Comandos break e continue

Um programa para resolver este problema pode ser


escrito como:

Neste caso, a condio do lao controla apenas o


nmero de termos do somatrio.

O lao pode ser encerrado quando s > A, usando-se o


comando break.
41
Comandos break e continue

Para executar somente algumas das instrues do lao, mas


sem encerrar a repetio: comando continue.

Exemplo: ler a idade e o peso de N pessoas e determinar a


soma dos pesos das pessoas com mais de 30 anos.

O comando continue faz


com que a instruo
s = s + peso no seja
executada quando
idade <= 30.

Ou seja, ele volta a execuo


para o incio do lao.

42
Comandos break e continue

Resultado da execuo:

Peso total = 35 + 40 + 48 + 60 + 85 = 193

43
Problema 5

Uma empresa quer transmitir mensagens sigilosas a seus


diretores e precisa de um programa para codificar suas
mensagens.

A regra de criptografia deve substituir o cdigo ASCII de


cada caractere que compe a mensagem por:
(5*cdigo_ASCII + 100) % 256.

As mensagens devero terminar com . (ponto).

44
Representao de strings
Strings so conjuntos de caracteres e cada caractere
codificado como um inteiro de 8 bits (cdigo ASCII).

Se imaginarmos que o bit de sinal no utilizado, cada


caractere que compe uma string pode ser representado
por um inteiro no intervalo [0, 255].

Os inteiros de [0, 127] representam os caracteres do


cdigo ASCII padro. Os inteiros de [128, 255]
representam os caracteres do cdigo ASCII estendido.

45
Representao de strings
Uma string armazenada em bytes consecutivos de
memria.

Para identificar o final de uma string, a linguagem C


utiliza um caractere especial: \0 (cd. ASCII zero).

Exemplo: seja a string Linguagem C. Imagine a


representao desta string na memria como:

L i n g u a g e m C \0

String Posies seguintes


no usadas
Cada quadrado representa uma posio de memria de 8 bits.
46
Representao de strings

Imagine a declarao da varivel texto como:

char texto[100];

Se n uma constante inteira, ento os smbolos [n] aps


o nome da varivel indicam que ela poder ocupar at n
posies de memria consecutivas.

Logo, a varivel texto poder ocupar at 100 posies do


tipo char (ou seja, 100 bytes).

Como as posies de memria so consecutivas, cada


uma delas pode ser identificada por um ndice.

47
Representao de strings

Na linguagem C, os valores dos ndices comeam sempre


em zero.

Exemplo: considere a seguinte declarao:

char S[20] = Linguagem C;

A representao de S pode ser imaginada como:

L i n g u a g e m C \0
S[0] S[1] S[2] S[3] S[4] S[5] S[6] S[7] S[8] S[9] S[10] S[11] ... S[19]

Observe que S pode ocupar at 20 posies (numeradas


de 0 a 19).
48
Representao de strings

A memria alocada para uma varivel dada por:

(nmero de posies de memria) * (tamanho do tipo, em bytes)

Exemplo: int a;
short int b[15];
float c[20];
char d[100] = dcc-aeds1;

Varivel Tipo N de posies Memria alocada

a int (4 bytes) 1 4 bytes


b short int (2 bytes) 15 30 bytes
c float (4 bytes) 20 80 bytes
d char (1 byte) 100 100 bytes
49
Representao de strings
Ateno!

Uma varivel pode ocupar menos memria do que o total de
posies alocadas.

Exemplo:
char d[100] = dcc-aeds1;

Dos 100 bytes alocados, a varivel est ocupando apenas 10
(lembre-se do caractere \0).

Uma varivel jamais poder ocupar mais memria do


que o total de memria alocada! Exemplo:
double v[50]; Memria alocada: 50*8 bytes = 400 bytes.
Posies variam de 0 a 49
v[50] = 7.9; representa invaso de memria!!
50
Anlise do programa

51
Anlise do programa

52
Comando for

No programa p14.c preciso ler cada um dos caracteres


que compe a mensagem a ser cifrada.

Para se executar esta ao, o programa pode utilizar


qualquer um dos seguintes trechos de cdigo:

Ou seja, os comandos for e while so equivalentes.


53
Endereos de Strings
Endereos de Strings

También podría gustarte