Escolar Documentos
Profissional Documentos
Cultura Documentos
LÓGICA DE PROGRAMAÇÃO
3
Unidade 1 – INTRODUÇÃO À LÓGICA DE PROGRAMAÇÃO
1.1 Histórico
Ábaco
O ábaco é um antigo instrumento de cálculo, formado por uma moldura com bastões ou
arames paralelos, dispostos no sentido vertical, correspondentes cada um a uma posição digital
(unidades, dezenas,...) e nos quais estão os elementos de contagem (fichas, bolas, contas,...) que podem
fazer-se deslizar livremente.
Teve origem provavelmente na mesopotâmia, há mais de 5.500 anos. O ábaco pode ser considerado
como uma extensão do ato natural de se contar nos dedos. Emprega um processo de cálculo
com sistema decimal, atribuindo a cada haste um múltiplo de dez. Ele é utilizado ainda hoje para
ensinar às crianças as operações de somas e subtrair.
La Pascaline (a pascalina)
Foi a primeira calculadora mecânica do mundo, planejada por Blaise Pascal em 1642.
Originalmente, ele pretendia construir uma máquina que realizasse as quatro operações fundamentais,
4
mas apenas conseguia fazer diretamente operações de adição e subtração.
As operações de multiplicação e divisão podiam ser feitas por repetição. Blaise Pascal se motivou a
criar esta máquina porque seu pai era contador e precisava de ajuda com cálculos mais
avançados..Pascal então, com seu conhecimento em física e em matemática criou uma máquina com
um engenhoso sistema de engrenagens que fazia contas de adição e subtração.
Quando a engrenagem virasse à direita era feita a adição, quando virasse à esquerda era feito a
subtração dos valores armazenados em 2 ou 3 engrenagens anteriores.
5
Calculadora de Leibniz
Construído por Gottfried Leibniz e muitas vezes visto como uma evolução da Calculadora de Pascal,
este mecanismo era uma calculadora mecânica que permitia não só realizar somas e subtrações, mas
também multiplicações e divisões e ainda extrair a raiz quadrada.
O modelo era assim muito parecido com o de Pascal, mas com componentes extras que aceleravam os
cálculos e se moviam dentro da máquina, melhorando o seu funcionamento.
Esta calculadora remonta a 1672, após uma visita de Leibniz a Paris, onde este tomou conhecimento
dos intermináveis cálculos astronômicos através de Christian Huygens.
Leibniz empenhou-se então em melhorar a Calculadora de Pascal, tendo terminado no ano seguinte.
Máquina de Babage
A máquina diferencial foi um invento de Charles Babbage, para cálculos com polinômios.
Em meados do século XIX, em plena segunda fase da Revolução Industrial, estavam em progresso
muitas tentativas de automação de processos, com destaque para aqueles envolvendo cálculos para a
composição de tabelas trigonométricas e de logaritmos quer para o emprego na navegação, na pesquisa
científica ou na engenharia.
Algumas pessoas tentavam conceber máquinas que executassem este tipo de cálculo, tendo sido
construídos vários modelos.
A máquina mais avançada, entretanto, jamais entrou em produção: a chamada máquina diferencial de
Babbage.
Foi a primeira tentativa de se construir uma máquina de computação que fosse automática e
adaptável;
Diminuíram-se os erros nas leituras dos resultados, pois ela imprimia-os em cartões perfurados;
Foi um dos pontos de partida para a indústria de máquinas.
Este cilindro de impressão de três polegadas e meia pertence à primeira máquina que produziu
comercialmente a alta velocidade cartões perfurados - a impressora Carroll desenvolvida pela IBM em
1924.
A impressora rotativa rápida foi a resposta às necessidades da indústria para o fornecimento anual de
bilhões de cartões perfurados.
7
Impressora Carroll desenvolvida pela IBM em 1924.
8
Perfuradora IBM 026
9
Perfuradoras
Impressora de impacto
10
MARK I
O MARK I foi construido na sequência da celebração, em 1939, de um contrato entre a Marinha dos
Estados Unidos da América (US Navy ) e a Universidade de Harvard para construção de um
calculador de tabelas para uso na navegação. A ibm financiava a construção do calculador em 2/3 e o
restante era financiado pela Marinha dos Estados Unidos da América.
O MARK I tinha cerca de 17 metros de comprimento por 2,5 metros de altura e uma massa de cerca de
5 toneladas. Quando em funcionamento, diz-se que reproduzia o ruido de uma grande sala cheia de de
velhinhas todas a tricotar ao mesmo tempo.
Era um calculador lento demorando 3 a 5 segundos para efectuar uma multiplicação, mas era
totalmente automático e podia realizar cálculos extensos sem intervenção humana.
Após a construção do Mark I, Aiken considerou que o envolvimento da ibm tinha sido nulo o que deu
origem a uma polémica entre Aiken e a ibm.
Ao MARK I seguiu-se uma versão totalmente electrónica denominada MARK II, também construida
pelo professor Aiken, que começou a funcionar em 1947.
11
Classificação por Geração
1ª Geração (1945-1956)
2ª Geração (1956-1960)
3ª Geração (1960-1971)
4ª Geração (1971-presente)
5ª Geração (presente-futuro)
1ª Geração (1945-1956)
Howard Aiken, engenheiro da IBM, cria em 1944 um calculador totalmente eletrônico (Harvard-IBM
Automatic Sequence Controlled Calculator ou MARK I). A finalidade deste era a criação de cartas
balísticas para a US Navy. Tinha metade do comprimento de um campo de futebol e cerca de 800 km
de fios
Grace Hopper em 1945, enquanto trabalhava no MARK II, encontrou o primeiro bug de computador
no sentido literal do termo (uma barata morta num relé). Daí para diante ela e os colegas, sempre que o
computador parava, diziam a Howard Aiken que estavam fazendo debugging ao computador.
Outro computador resultante dos esforços de guerra da 2ª Guerra Mundial surge em 1946, o ENIAC
(Electronic Numerical Integrator and Computer). Este computador resulta de uma parceria entre o
governo dos EUA e a Universidade da Pensilvânia.
O ENIAC (Electronic Numerical Integrator Analyzer and Computer), tinha 18000 tubos de vácuo,
17.468 válvulas, 70000 resistências e 5 milhões de juntas soldadas. Consumia 160 kw de energia
eléctrica. Ocupava um galpão imenso. Porém, apesar do tamanho, o poder de processamento do
ENIAC é ridículo para os padrões atuais, suficiente para processar apenas 5.000 adições, 357
multiplicações e 38 divisões por segundo, bem menos até do que uma calculadora de bolso atual, das
mais simples.
12
computador para armazenamento de programas e dados bem como a transferência de controlo
condicional. Estes coneitos perdurariam nos próximos 40 anos. Neumann e a sua equipa criam o
EDVAC (Electronic Discrte Variable Automatic Computer).
A 1ª geração de computadores era caracterizada por cada computador ser programado para uma tarefa
específica. Cada computador tinha uma linguagem binária diferente (código máquina).
Outras características destes computadores eram a utilização de tubos de vácuo (responsáveis pelas
enormes dimensões) e os tambores magnéticos para armazenamento de dados.
Válvulas
2ª Geração (1956-1960)
Em 1948, a invenção do transistor contribui para uma significativa mudança nos computadores. Desde
esta data que os computadores vêm decrescendo em dimensão. Em 1956 o transistor começa a ser
montado nos computadores.
A segunda geração de computadores substitui a linguagem máquina com o assembly, que já permitia a
utilização de códigos abreviados em substituição dos longos e difíceis códigos binários.
No início dos anos 60 surgem os primeiros computadores comercializados (Burroughs, Control Data,
IBM,…) com sucesso em áreas como as universidades, negócios e governos.
Estes computadores continham transistores em substituição dos tubos de vácuo. Também possuíam os
componentes que hoje associamos aos computadores modernos: impressoras, fitas e discos magnéticos
para armazenamento, memória e programas armazenados.
Um importante exemplo destes computadores era o IBM 1401 que foi o mais popular no mundo dos
negócios. Este computador, e o IBM 1620 (para escolas e universidades), foram os primeiros com a
fugir á tendência da época para os supercomputadores.
É durante este período que surgem as linguagens de alto nível, muito parecidas com a linguagem
humana, Fortran (Formula Translator), 1957, e Cobol (Common Business-Oriented Language), 1960.
É com estas linguagens que começa toda a indústria de software.
13
O Burroughs B-200, lançado em 1962, um computador de segunda geração
3ª Geração (1960-1971)
Mas o transistor aquecia o que provocava muitas avarias. É então que surge o quartzo e o silício. Jack
Kilby da Texas Instruments desenvolve o conceito de circuito integrado em 1958 e a partir daí começa
a miniaturização de componentes em chips.
14
Como resultado, os computadores são cada vez mais pequenos. Também marca esta geração o
desenvolvimento do chamado sistema operativo (programa central que controla as tarefas mais básicas
do computador deixando aos programas o trabalho mais específico).
Em 1963 é criado o ASCII (American Standard Code for Information Interchange) com o objetivo de
normalizar e tornar possível a comunicação entre computadores.
Em 1964 é criada por John Kemeny e Tom Kurtz a linguagem de programação BASIC , que teve uma
extraordinária aceitação pelos jovens, e a IBM anuncia o System/360 como a sua primeira família de
computadores compatíveis .
Em 1968 Edsger Dijkstra lança a primeira pedra na fundação do que viria a ser a Programação
Estruturada ao escrever uma carta ao editor entitulada “GOTO statement considered harmful”. O início
da criação de programas mais fiáveis e de mais fácil manutenção estava lançado.
15
IBM 360 introduzido em 1966 (primeiro) e um CDC 6600 de 1964 (segundo).
4ª Geração (1971-presente)
Primeiro apareceram circuitos integrados com centenas de componentes num chip. Nos anos 80 já se
conseguiam centenas de milhares e agora já vão em milhões de componentes num chip.
O Altair 8800, o primeiro microcomputador, 1974. O teclado não tinha teclas, só botões e chaves.
Em 1975 a IBM lança o seu primeiro Personal Computer, o 5100, para uso em casa, escritório e
escola. Aparecem então no mercado os clones do IBM PC cuja garantia de qualidade era anunciada
pela frase “IBM compatível”.
Em competição direta com a IBM aparece em 1976 o Apple II que revoluciona o mercado ao
16
introduzir pela primeira vez um sistema operativo com um interface amigável baseado no conceito do
rato e das janelas (windows). Neste mesmo ano a Microsoft e a Apple são fundadas.
Em 1981 a IBM lança no mercado o IBM “PC” com um sistema operativo, DOS, completamente
diferente do até então usado por todos, o CP/M.
17
Em 1982 a Times elege o computador o Homem do Ano. Desde esse ano o computador passa a ser
ferramenta indispensável na indústria do cinema.
A utilização dos computadores pessoais tem um crescimento notável, não mais parando até hoje:
O tamanho também não parou de diminuir, primeiro os desktop e os tower, depois os laptop e agora os
palmtop.
Os anos 90 marcam o aparecimento da Internet como rede global. A web, o e-mail, o protocolo de
transferência de ficheiros, o acesso remoto por telnet, os newsgroups e a comunicação de
computadores por TCP/IP são alguns dos muitos serviços que passam a ter utilização mundial e que
revolucionam a forma de comunicação, de comércio, de educação e de informação.
5ª Geração (presente-futuro)
18
(supercondutores, fibra óptica).
O computador, provavelmente, deixará de se chamar computador uma vez que cada vez mais integra
funções que antes eram desempenhadas por diferentes equipamentos (fax, televisão, vídeo, telefone)
passando a ser mais uma consola de comunicações, de trabalho e de lazer.
Von Neumann sugeriu que as instruções fossem armazenadas na memória do computador. Até então
elas eram lidas de cartões perfurados e executadas, uma a uma. Armazená-las na memória, para então
executá-las, tornaria o computador mais rápido, já que, no momento da execução, as instruções seriam
obtidas com rapidez eletrônica.
A maioria dos computadores de hoje em dia segue ainda o modelo proposto por von Neumann.
Esse modelo define um computador sequencial digital em que o processamento das informações é feito
passo a passo, caracterizando um comportamento determinístico (ou seja, os mesmos dados de entrada
produzem sempre a mesma resposta).
O modelo lógico de computador proposto por von Neumann pode ser descrito resumidamente da
seguinte forma.
Unidade Central de Processamento - UCP (em inglês, Central Processor Unit - CPU)
constituída por uma Unidade de Controle e uma Unidade de Lógica Aritmética.
Unidade de controle - A unidade de controle controla o funcionamento da unidade lógica e
aritmética e da memória. Além disso, ela distribui e organiza tarefas, transfere informações da
entrada para a memória e da memória para a saída.
Unidade de lógica aritmética (em inglês, arithmetic logic unit - ALU) - Realiza todas as
operações lógicas e aritméticas do computador.
Memória - A memória é o dispositivo de armazenamento de informação do computador. Nela
são armazenados tanto as instruções de um programa quanto os dados necessários para a sua
execução. A memória é dividida em espaços com endereços.
19
Barramentos (em inglês, Buses) - O barramento é um conjunto de linhas de comunicação que
permitem a interligação entre dispositivos, como o CPU, a memória e outros periféricos.
Unidade de Entrada - Esta unidade traduz informação (por exemplo, letras, números,
imagens, marcas magnéticas) de uma variedade de dispositivos de entrada em impulsos
elétricos que a CPU entenda.
Unidade de Saída - Esta unidade converte os dados processados, enviados pela CPU em forma
de impulsos elétricos, em palavras ou números, que são impressos por impressoras ou
mostrados em monitores de vídeo.
Os símbolos matemáticos utilizados para representar um número no sistema decimal são chamados de
algarismos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, que são utilizados para contar unidades, dezenas e centenas. Esses
algarismos são chamados de indo-arábico porque tiveram origem nos trabalhos iniciados pelos hindus
e pelos árabes.
Base 2: também conhecido como sistema binário. É um sistema posicional composto pelos
numerais 0 e 1 e, além da Informática, é utilizado na Eletrônica Digital na implementação de circuitos
de portas lógicas. Uma de suas primeiras aplicações na informática surgiu quando da utilização de
cartões perfurados para representar informações e programas.
Base 8: o sistema octal também é um sistema posicional e foi utilizado na Informática como
alternativa ao sistema binário. É composto pelos numerais 0, 1, 2,3, 4, 5, 6 e 7.
Base 16: o sistema hexadecimal é, talvez, um dos mais conhecidos da atualidade. É composto de 16
algarismos, representados por 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A,B, C, D, E e F. Trabalha-se com ele como
qualquer outro sistema, mas deve-se prestar atenção ao valor dos caracteres alfabético na hora de fazer
operações e conversões.
É atualmente a maior alternativa ao sistema binário por ser extremamente compacto e é utilizado para
representar portas, interrupções e endereços de memória, além de cores no desenvolvimento web, em
substituição ao sistema RGB.
Para representar as cores, é utilizada uma notação de seis dígitos, onde cada dupla, da esquerda para a
direita, representa o valor da intensidade do vermelho, do verde e do azul, respectivamente, variando
de 00 até FF, que representa o valor decimal 255. Assim, as cores variam de 000000, que representa o
preto, até FFFFFF, que corresponde ao branco. Os tons de cinza são representados por valores iguais
nas três posições, como por exemplo 666666, DEDEDE ou CCCCCC. Quanto mais próximo
de FFFFFF, mais clara é a tonalidade de cinza.
20
Ao todo, essa notação hexadecimal permite a representação de mais de 16 milhões e meio de cores.
Alguns programas de desenho vetorial e de tratamento de imagem incluem, ainda, uma quarta dupla de
valores na notação para representar o nível de transparência da cor selecionada.
Graças à base hexadecimal, as rotinas de tratamento de imagem foram em muito facilitadas, Por
exemplo: para fazer o efeito de negativo em uma foto, isto é, inverter suas cores, basta subtrair
de FF cada valor da tripla que representa a cor de cada pixel.
Base 62: Talvez você nunca tenha ouvido falar deste sistema, mas acredite: você já o utilizou. O
sistema de base 62 está se tornando cada vez mais popular porque seus 62 algarismos são
representados pelos numerais de 0 a 9 e pelas letras de A a Z e de a a z. Uma de suas aplicações mais
recorrentes está nos famosos encurtadores de URL: o código gerado pelo encurtador nada mais é do
que a conversão de um número decimal - geralmente o número de identificação único para cada URL
no banco de dados - nesta base. Assim, quanto mais caracteres um encurtador de URLs utilizar para
gerar sua URL curta, mais URLs ele terá cadastradas.
Base 64: É um sistema numérico utilizado para codificação de dados binários que precisam ser
armazenados e transferidos em meios que foram desenhados originalmente para lidar com dados
textuais. É composto pelos algarismos de 0 a 9, pelas letras de A a Z e de a a z e pelos símbolos / e +.
O caractere = é utilizado como sufixo especial.
Introdução
Os computadores trabalham com um sistema que utiliza apenas dois valores para manipular qualquer
informação. Isso quer dizer que todas as operações que o computador faz, desde permitir-nos a
escrever um simples texto até jogar jogos 3D são realizados utilizando apenas dois valores, que por
convenção são os dígitos “0” (zero) e “1” (um).
Mas como isso é possível? Como o computador consegue dar andamento a todos os seus processos
utilizando apenas os dígitos “0” e “1”?
O que é binário?
De forma geral, binário é um sistema que utiliza apenas dois valores para representar suas quantias. É
um sistema de base dois. Esses dois valores são o “0” e o “1”.
Daí podemos concluir que para 0 temos desligado, sem sinal, e para 1 temos ligado ou com sinal.
Vale ressaltar que o sistema que utilizamos diariamente é o sistema de base dez, chamado também
por base decimal. Esse sistema utiliza os algarismos indo-arábicos, que são: 0, 1, 2, 3, 4, 5, 6, 7, 8, e 9.
Nós seres humanos fomos “treinados” para trabalhar com a base decimal. Ela é a ideal para nós. Mas,
para os computadores a base binária é a ideal.
Nos computadores esses zeros (“0s”) e uns (“1s”) são chamados de dígitos binários ou
somente bit (conjunção de duas palavras da língua inglesa binary digit), que é a menor unidade de
informação dos computadores. Dessa forma, tanto faz dizer dígito “0” e dígito “1”, ou, bit “0” e bit
“1”.
21
Formação de informações / O caractere.
São esses bits que formam qualquer informação, porém, um bit sozinho não faz nada, é apenas um
sinal qualquer. Para que os bits possam realmente formar uma informação, precisam ser agrupados.
Esses grupos podem ser de 8, 16, 32 ou 64 bits.
8 bits - 10100110
Apesar de parecer ser um sistema limitado, agrupando bits é possível fazer uma infinidade de
representações. Vamos pegar como exemplo um grupo de 8 bits (tabela a seguir), onde é possível
fazer as seguintes representações para os números decimais:
Na tabela 01 os números decimais estão representados em grupos de oito bits. Mas, acontece que,
como ocorre no sistema decimal, todo zero que estiver a esquerda de dígitos binários não valem nada.
Por exemplo: o decimal 14 é 1110 em binário, o mesmo que 00001110 ou 000000001110 ou ainda
...0000000000001110.
O computador reune grupos predefinidos de bits (8, 16, 32 ou 64) para formar uma informação, ou
seja, um caracter. Um caracter é qualquer letra, número ou símbolo.
Quanto é 1 + 1?
Não foi dito qual é a base (decimal ou binária). Se for decimal dará 2. E se for binária dará 10.
Palavra
Na terminologia dos computadores, palavra é um grupo de algarismos binário (bits) que podem ocupar
uma localização na memória, e, que podem ser processados de uma só vez, podendo ser um número
binário que é para ser manuseado como um dado, ou, uma instrução que diz ao computador que
operação deve ser executada. Pode ser também um caractere ASCII representando uma letra do
alfabeto, ou ainda, um endereço que diz ao processador onde se localiza um dado.
Para entender melhor, imagine que com palavras de 8 bits, as instruções, os endereços, os números e
dados são representados por números binários de 8 bits. Dessa forma o menor número binário é
00000000 (ou 00 em hexadecimal), e, o maior número é 11111111 (ou FF em hexadecimal), o que
corresponde de 0 a 256 valores diferentes (variações).
22
Por exemplo:
Com palavras de 16 bits pode-se trabalhar com números decimais até 65.536. É preciso frisar aqui que
apesar de um determinado PC usar palavras de 8 bits, por exemplo, não significa que o processador
desse PC ficará restringido a números decimais inferiores a 256. Simplesmente significa que será
necessário usar duas ou mais palavras para representar números maiores.
Dessa forma é certo dizer que um processador de 32 bits é mais rápido que um de 16 bits, pois, este
último será obrigado a dividir números maiores (acima de 65.536) em números menores que sejam
possíveis de se manipular com 16 bits, o que levará mais tempo.
Atualmente os processadores acessam a memória a 64 bits por vez, porém, continuamos a usar o nome
BYTE para referir ao tamanho de uma memória.
O correto seria usar “BYTE” para designar o tamanho de uma memória de 8 bits, e, QUAD WORD
para memórias de 64 bits.
Mas, qual seria o lado prático disso? Nenhum, e pior, acaba confundindo, pois, imagine ter que usar
BYTE para memórias de 8 bits (SIMM/30), WORD para memórias de 16 bits, e assim sucessivamente.
Por isso até hoje o usual é o BYTE para designar o tamanho de uma memória.
Na prática
Agora um ponto importante. Como que isso tudo funciona na prática? Será que dentro de um
processador ou em um CD/DVD veremos, literalmente, uma fileira de “0s” e “1s”? Não é assim que
funciona.
Por exemplo:
O bit 0 pode ser representado por valores entre 0 e 0,3 volts. Já o bit 1 pode ser representado por
valores entre 2 e 5 volts. Esses números são apenas exemplos, não está se afirmando que são
exatamente esses valores.
De forma geral, qualquer valor pode ser usado para representar os bits, depende do projeto, da
aplicação e da tecnologia empregada. Com o avanço da tecnologia dos computadores, passou a se usar
tensões cada vez menores, pois, os dispositivos eletrônicos passaram a trabalhar com tensões menores.
Nos computadores são usados valores muito baixos, tais como esses que acabamos de mencionar.
A Tabela ASCII (American Standard Code for Information Interchange, que em português significa
“Código Padrão Americano para o Intercâmbio de Informação”) não é nenhuma novidade para quem
já trabalha com informática, principalmente com desenvolvimento de software.
ASCII é uma codificação de caracteres de oito bits baseada no alfabeto inglês. Os códigos ASCII
representam texto em computadores, equipamentos de comunicação, entre outros dispositivos que
trabalham com texto. Desenvolvida a partir de 1960, grande parte das codificações de caracteres
modernas a herdaram como base.
23
A codificação define 128 caracteres, preenchendo completamente os sete bits disponíveis. Desses, 33
não são imprimíveis, como caracteres de controle atualmente não utilizáveis para edição de texto,
porém amplamente utilizados em dispositivos de comunicação, que afetam o processamento do texto.
Exceto pelo caractere de espaço, o restante é composto por caracteres imprimíveis.
A minha intenção em publicar esta tabela é adicionar várias informações em uma única tabela, já que a
maioria disponível na internet apresenta poucos dados.
Esta tabela é a junção da tabela ASCII Normal (32 a 127), tabela dos Caracteres de Controle (0 a 31) e
a tabela ASCII Estendida (128 a 255).
Basicamente, computadores armazenam números e para armazenar texto na sua memória, é preciso
converter os grafemas em números. Por exemplo: a memória do computador, não armazena a letra A,
mas o número 65. No início do desenvolvimento dos computadores, as soluções para tratar texto
privilegiavam o idioma inglês. A primeira tabela ASCII (American standard code for information
interchange) fazia uma correspondência entre números e os grafemas básicos da ortografia inglesa.
Essa tabela alcançava até o número 127, o que corresponde a um código de 7 bits, pois computadores
operam com o sistema binário de contagem, e convertido em notação binária, 127 equivale a um
número de 7 dígitos.
A primeira tabela ASCII funcionava bem para tratar textos em inglês, mas deixava a desejar na
representação de textos em português, por exemplo, pois não considerava os grafemas com diacríticos
da nossa ortografia como: á, é, ô, ç, u, etc.
Com o tempo, a tabela ASCII foi expandida até o número 255. Em notação binária, isso corresponde a
um número com 8 dígitos e, por isso, ela é considerada um código de 8 bits. Uma tabela ASCII
estendida tem todos os caracteres considerados pela tabela anterior de 7 bits, mais uma expansão que
resolveu vários problemas de representação como, por exemplo, os grafemas com diacríticos da língua
portuguesa.
Embora a tabela ASCII de 8 bits seja mais ampla que sua antecessora e atenda às necessidades de
representação em computador de um idioma como o português, ainda assim, alguns problemas
persistem. A tabela ASCII estendida não permite acomodar ao mesmo tempo os grafemas do sistema
latino e de outros sistemas como o cirílico, grego, hebraico, etc. Em função disso, foram criadas várias
tabelas ASCII de 8 bits, cada uma delas adaptada às necessidades de uma ortografia específica.
24
11 00001011 0B
12 00001100 0C
13 00001101 0D
14 00001110 0E
a 01100001 61
b 01100010 62
c 01100011 63
d 01100100 64
e 01100101 65
f 01100110 66
g 01100111 67
h 01101000 68
i 01101001 69
j 01101010 6A
k 01101011 6B
l 01101100 6C
m 01101101 6D
n 01101110 6E
o 01101111 6F
p 01110000 70
q 01110001 71
r 01110010 72
s 01110011 73
t 01110100 74
u 01110101 75
v 01110110 76
w 01110111 77
x 01111000 78
y 01111001 79
z 01111010 7A
Tabela 01: Caracteres alfanuméricos e seus equivalentes em binário
Lógica de Programação
A linguagem de programação é como uma língua normal, um grupo de palavras com significados. No
caso da programação, a maioria das linguagens é escrita em Inglês. Estas linguagens fazem o
computador assimilar cada comando e função de um algoritmo, depois executar cada função.
A linguagem de programação é somente como se escreve o algoritmo. O grande problema para muitos
é o que “dizer” para o computador fazer o que é desejado. Para o aprendizado foi desenvolvido o
Software VisualG, que auxilia a programação totalmente em português. Com este software, não é
necessário pensar em linguagem de programação, pois todos os comandos são em Português, ficando
assim o foco na Lógica.
25
Na hora de programar alguns passos são indispensáveis, como declarar variáveis.
Variáveis podem ser escritas por letras ou números, que representam um valor que pode ser mudado a
qualquer momento.
Saber lógica de programação é saber o melhor jeito de escrever um código, para o computador
interpretar corretamente. É saber se comunicar com a máquina a partir de uma linguagem seja lá qual
for.
Algoritmo "soma"
Var Num1, num2, num3, soma:inteiro
Inicio
Escreva (“programa para digitar e somar três números inteiros”)
escreva("digite o primeiro numero:")
leia(num1)
escreva("digite o segundo numero:")
leia (num2)
escreva("digite o terceiro numero:")
leia (num3)
soma <- num1 + num2 + num3
escreva("O resultado é: " soma)
fimalgoritmo
#include <iostream>
using namespace std;
int num1, num2, num3, soma;
int main (){
cout<< "programa para digitar e somar tres números inteiros";
cout<< "\n"; // pular linha antes de imprimir a próxima linha
cout<< "digite o primeiro numero: ";
cin>> num1;
cout<< "digite o segundo numero: ";
cin>> num2;
cout<< "digite o terceiro numero: ";
cin>> num3;
soma = num1 + num2 + num3;
cout<< "O resultado e: " << soma;
cout<< "\n"; // pular linha antes de imprimir a próxima linha
system("pause"); // congelar tela para vermos resultado do processamento
}
Estes comandos têm funções especificas, e um dos objetivos da lógica de programação é entender
como eles funcionam.
Cada linguagem tem um correspondente a estes comandos, com a mesma função, porém escrito de
modo diferente (sintaxe): cout, cin, =, <<, >>, int.
26
1.3.1 Software
No mercado existem diversas marcas de computador, cada uma produzindo computadores com
características variadas, desde a capacidade de armazenamento de dados à estética do gabinete.
Dentro de um mercado tão diversificado, nada mais natural que encontrarmos diversos tipos de
processadores que não variam somente o poder de processamento, mas também de arquitetura.
Essa variedade acontece também no mundo dos sistemas operacionais. Hoje temos o Windows, Linux
e o Mac OS X entre os mais populares, mas ao longo dos últimos 20 anos tivemos também o OS/2,
QNX, DOS, BeOS, entre outros.
E o que isso tem a ver com o programa que executamos em nossos computadores?
Tudo. No momento em que um programa é gerado, é dito à ele em qual sistema operacional e em qual
arquitetura de processador ele será executado. Ou seja, nele estará contido instruções específicas para
um determinado tipo de processador, além de instruções específicas para um determinado sistema
operacional.
Desta forma, pode-se caracterizar as linguagens de programação como Linguagem de Alto Nível e
Linguagem de Baixo Nível.
As linguagens de baixo nível que utiliza a linguagem Binária (0’s e 1’s). As linguagens ditas de alto
nível são as linguagens mais utilizadas atualmente, e por motivos óbvios, sendo tais linguagens
consideradas mais próximas às linguagens naturais ou ao domínio de aplicação em questão. Para
operacionalizar os programas, considerando o que foi dito acima, é necessário um processo de
conversão (alto nível para baixo nível), para que o computador “compreenda” o que deverá ser
executado.
Tais linguagens permitem a comunicação direta com o computador em termos de bits, registradores e
operações de máquina bastante primitivas. Os seus programas são sequências de 0’s e 1’s, o que os
tornam muito complexos, cansativos e sujeitos a muitos erros.
27
2ª Geração (Linguagens Simbólicas - Assembly)
São as linguagens simbólicas ou de montagem, que foram projetadas para minimizar as dificuldades da
programação binária. Códigos de operação e endereços binários foram substituídos por mnemônicos. O
seu processamento requer uma tradução para a linguagem de máquina, antes de sua execução.
Algumas são orientadas à solução de problemas científicos, tais como: FORTRA N, PASCAL e
ALGOL; e outras, para aplicações comerciais, tais como:
COBOL. E outras contém as duas finalidades, como PL/I e ADA. São classificadas como linguagens
procedimentais (procedurais ou imperativas), baseadas em procedimentos que apresentam como o
problema deve ser solucionado; e as linguagens declarativas, que podem ser funcionais e lógicas. Tais
linguagens foram projetadas para profissionais de computação e não para usuários finais.
São linguagens capazes de gerar código por si só, são os chamados RAD (Desenvolvimento Rápido de
Aplicativos), com o qual pode-se realizar aplicações sem ser um expert na linguagem. Aqui também se
encontram as linguagens orientadas a objetos, tornando possível a reutilização de partes do código para
outros programas.
Facilitar a programação de computadores de tal forma que os usuários finais possam resolver
seus problemas;
Acelerar o processo de desenvolvimento de aplicações;
Facilitar e reduzir o custo de manutenção de aplicações;
Minimizar problemas de depuração;
Gerar código sem erros a partir de requisitos de expressões de alto nível.
o Exemplo:
Oracle PL/SQL;
NATURAL;
Oracle Reports;
ABAP;
XML;
Delphi programming language;
MATLAB's GUIDE;
Visual Basic's form editor;
Windows Forms (part of the .NET Framework).
A WEB utiliza algumas linguagens de quinta geração e outras adaptadas para esse novo paradigma.
Exemplo:
Java, JavaScript, XML, HTML, etc.
28
1.3.2 Algumas Linguagens de Programação
Assembly
No assembly, cada uma destas instruções, equivale a uma instrução do processador. Ao invés de usar
instruções como 10101011 você pode usar outras bem mais fáceis de entender e de memorizar, como
add, div, mul, and, or, not, etc. Você também pode criar variáveis, que são pequenos espaços na
memória RAM reservados para guardar algum tipo de dado, que o programa precisará mais tarde.
Você pode usar aquelas instruções que citei para lidar com elas.
Por exemplo, a instrução "add" faz com que o processador some duas variáveis; "add x, y" por
exemplo, soma os valores de x e y.
Por causa desta característica de permitir trabalhar diretamente com as instruções do processador, o
assembly é chamado de linguagem de baixo nível.
Fortran
Fortran é a contração de "Formula Translator". O Fortran foi uma das primeiras linguagens de alto
nível da história A primeira versão do Fortran foi criada no final da década de 50, mas a linguagem
começou a ser usada em larga escala a partir da metade da década de 60, quando surgiram várias
versões diferentes. Atualmente o Fortran é pouco usado.
Pascal
O Pascal é outra linguagem de alto nível, criada durante a década de 60. O Pascal é uma linguagem
bastante estruturada, com regras bastante rígidas, o que a torna difícil de usar. Hoje em dia o Pascal
original é pouco usado, mas seus descendentes diretos como o Free Pascal evoluíram muito. O Delphi
é uma evolução do Pascal.
Cobol
Cobol significa "Common Business Oriented Language". Esta linguagem foi desenvolvida no final da
década de 50, com o objetivo de ser uma plataforma de desenvolvimento para aplicações bancárias e
financeiras em geral. Comparado com o Pascal e o Assembly, comuns na época, o Cobol é uma
linguagem bastante amigável, o que garantiu uma grande aceitação. Até hoje esta linguagem é usada
em muitos sistemas bancários, o que explica a grande procura por programadores experientes nesta
29
linguagem na época do bug do ano 2000.
O C foi desenvolvido durante a década de 70, mas ainda é largamente utilizado. A grande vantagem do
C é permitir escrever tanto programas extremamente otimizados para a máquina, como seria possível
apenas em assembly, e ao mesmo tempo vir com várias funções prontas, como uma linguagem de alto
nível, que podem ser utilizadas quando não for necessário gerar um código tão otimizado.
A maior parte dos programas Linux e o Kernel quase todo foram escritos em C, o que explica o porque
do sistema ser tão rápido em algumas tarefas.
C++
O C++ mantém os recursos do C original, mas possue muitos recursos novos, como orientados a
objetos e sendo também bem mais fácil de utilizar. O C++ é bastante usado atualmente para
desenvolver muitos programas para várias plataformas.
Java
O Java é uma linguagem de programação multiplataforma, com uma sintaxe até certo ponto parecida
com o C++, porém com bibliotecas diferentes. Os programas em Java podem ser executados em
qualquer sistema operacional, desde que o interpretador esteja instalado.
A JVM é um programa que converte o código Java em comandos que o sistema operacional possa
executar. Existem máquinas virtuais para vários sistemas operacionais, o problema é que devido ao
processamento executado pela máquina virtual, o programa torna-se mais pesado do que seria caso
escrito diretamente para a plataforma.
Embora o trabalho inicial seja maior, a vantagem desta abordagem é que o desempenho é o melhor
possível, já que sempre teremos um programa binário otimizado para a plataforma.
Mas o Java utiliza um conceito diferente. Ao invés de gerar um binário diferente para cada plataforma,
é gerado um binário que pode ser executado em qualquer plataforma, dentro de uma máquina virtual.
Este binário "universal" é chamado de bytecode.
A idéia é criar aplicativos que possam ser escritos uma vez e executados em qualquer plataforma,
reduzindo os custos de desenvolvimento. Apenas o software da máquina virtual é que precisa ser
reescrita para cada plataforma, mas isso é problema dos desenvolvedores da linguagem, não do
programador.
Existe ainda a opção de abrir mão da flexibilidade do bytecode em troca de um maior desempenho,
passando a compilar os programas com otimizações para uma determinada plataforma. Isso é muito
útil quando o programa será executado apenas dentro de computadores de uma determinada
plataforma, como PCs rodando Linux por exemplo.
30
No caso do Java, a máquina virtual que executa os programas é chamada de Java Virtual Machine.
Muitas páginas Web utilizam applets1 Java, por isso a maioria das pessoas acaba instalando o suporte a
Java. Hoje em dia, além do Java da Sun temos versões alternativas, como o Blackdown e o Kofee, que
possuem conjuntos de recursos variados, mas são a princípio compatíveis com o código gerado para o
Java da Sun.
Embora tenha ganhado relevância com o Java, este conceito não é exatamente novo. Linguagens mais
antigas como o LISP e o Prolog já utilizam bytecode e máquinas virtuais.
1.3.3 Tradutor
No contexto de linguagens de programação, é o sistema que recebe como entrada um programa escrito
em linguagem de programação (linguagem fonte) e produz como resultado um programa equivalente
em outra linguagem (linguagem Objeto).
1.3.4 Compilador
São tradutores que mapeiam programas escritos em linguagem de alto nível para programas
equivalentes em linguagem simbólica ou de máquina. Tal processo ocorre normalmente em dois
passos:
O intervalo de tempo que ocorre a conversão do programa fonte para um programa objeto é chamado
de Tempo de Compilação, enquanto que o programa objeto é executado no Tempo de Execução. O
programa fonte e os dados são processados em momentos distintos, que são respectivamente, tempo de
compilação e tempo de execução.
1.3.5 Interpretador
São processadores que recebem como entrada o código intermediário de um programa anteriormente
traduzido e produzem o “efeito de execução” do algoritmo original sem mapeá-lo em linguagem de
máquina. Eles processam uma forma intermediária do programa fonte e dados ao mesmo tempo, ou
seja, a interpretação do fonte ocorre em tempo de execução, não gerando assim um programa objeto.
1
As aplets são pequenos programas Java que podem ser inseridos dentro de páginas HTML. Um applet pode ainda executar tarefas
complexas, como realizar cálculos e apresentar gráficos, sons e imagens em movimento.
31
execução de um programa interpretado é maior que o tempo de execução de um programa objeto
(compilado) equivalente, devido ao tempo necessário para realizar a tradução virtual para o código de
máquina cada vez que a instrução em código intermediário deve ser operada. Este código pode ser
visto como o código de máquina de um computador virtual.
Os interpretadores são normalmente mais amigáveis do que os compiladores, pois estão mais próximos
do código fonte do que programas completamente traduzidos. As mensagens de erro e as facilidades de
teste e depuração em relação à interpretação são mais claras e objetivas, e principalmente quando se
refere ao código fonte. Uma grande vantagem dos sistemas interpretados está na implementação de
novas linguagens para diferentes equipamentos, pois a partir do momento em que um código
intermediário é produzido, e este é padrão, ele independe de máquina, onde para cada máquina é
programado um interpretador específico.
32
1.4 Algoritmos e as Formas de Representação
1.4.1 Algoritmos
Conceito de Algoritmo
Informalmente, um algoritmo é qualquer procedimento computacional bem definido que toma algum
valor ou conjunto de valores como entrada e produz algum valor ou conjunto de valores como saída.
Um algoritmo deve sempre possuir pelo menos um resultado, normalmente chamado de saída, e
satisfazer a propriedade da efetividade, isto é, todas as operações especificadas no algoritmo devem ser
suficientemente básicas para que possam ser executadas de maneira exata e num tempo finito.
Algoritmos só se aprendem:
– Construindo algoritmos
– Testando algoritmos
33
Função dos Algoritmos na Computação
Um algoritmo tem por objetivo representar mais fielmente o raciocínio envolvido na lógica de
programação e, dessa forma, permite-nos abstrair de uma série de detalhes computacionais, que podem
ser acrescentados mais tarde. Assim, podemos focalizar nossa atenção naquilo que é importante: a
lógica na construção de algoritmos.
Outra importância da construção de algoritmos é que, uma vez concebida uma solução algorítmica
para um problema, esta pode ser traduzida para qualquer linguagem de programação e ser agregada das
funcionalidades disponíveis nos diversos ambientes. Esse processo é chamado de codificação.
Uma linguagem permite que um programador especifique precisamente sobre quais dados um
computador vai atuar, como estes dados serão armazenados ou transmitidos e quais ações devem ser
tomadas sob várias circunstâncias.
Ou seja, Lógica de Programação (algoritmo) é a ideia, o passo-a-passo de como executar uma tarefa. A
linguagem de programação é a forma que o computador vai entender para executar a lógica
estabelecida pelo programador.
Existem diversas formas de representação de algoritmos, mas não há um consenso com relação à
melhor delas.
Algumas formas de representação de algoritmos tratam dos 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 obscurescer a idéia principal, o algoritmo,
dificultando seu entendimento.
Fluxograma Convencional;
Pseudocódigo, também conhecido como Linguagem Estruturada ou Portugol;
Descrição Narrativa;
Diagrama de Chapin.
34
1.4.2 Fluxograma
É uma representação gráfica de algoritmos onde formas geométricas diferentes implicam ações
(instruções, comandos) distintos. Tal propriedade facilita o entendimento das idéias contidas nos
algoritmos.
Fluxogramas têm o mesmo objetivo dos pseudocódigos, a única diferença é que os fluxogramas são
representações gráficas.
A vantagem principal dos fluxogramas é que, diferentemente dos pseudocódigos, eles são
padronizados. Ou seja, cada símbolo representa uma ação específica e sempre representará.
Um fluxograma usa linhas para ligar seus elementos, criando assim, um caminho que deve ser seguido.
Apesar do número de representações assustar a princípio, a maior parte das representações são
utilizadas raramente ou não são utilizadas.
Por exemplo, raramente ou nunca utilizaremos o símbolo fita perfurada, porque não são mais utilizadas
35
aplicações que realmente necessitem de entrada de dados por fita perfurada como ocorria há 20 ou 30
anos atrás. Porém, outros são utilizados com muito mais frequência como o exibir, entrada manual,
processo e assim por diante.
Outra vantagem que os fluxogramas têm em relação aos pseudocódigos é que existem programas que
reproduzem essas representações de forma simples e intuitiva como, por exemplo, o Microsoft Visio,
o BizAgi Modeler e o open source Star UML.
= Decisão
36
Início
N1, N2
Média
(N1+N2)/2
Média “Aprovado”
>=7
“Reprovado” Fim
37
A figura 2.2 e 2.3 mostra a representação do algoritmo de cálculo da média de um aluno sob a forma
de um fluxograma.
Na verdade, esta representação é suficientemente geral para permitir que a tradução de um algoritmo
nela representado para uma linguagem de programação específica seja praticamente direta.
Algoritmo <nome_do_algoritmo>
<declaração_de_variáveis>
<subalgoritmos>
Início
<corpo_do_algoritmo>
Fim.
onde:
Algoritmo é uma palavra que indica o início da definição de um algoritmo em forma de pseudocódigo.
<declaração_de_variáveis> consiste em uma porção opcional onde são declaradas as variáveis globais
usadas no algoritmo principal e, eventualmente, nos subalgoritmos.
Início 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.
Algoritmo Média
Var N1, N2, Média
Início
Leia N1, N2
Média := (N1+N2)/2
Se Média >= 7 Então
Escreva “Aprovado”
Senão
Escreva “Reprovado”
Fim.
38
1.4.4 Descrição Narrativa
Esta representação é pouco usada na prática porque o uso de linguagem natural muitas vezes dá
oportunidade a más interpretações, ambiguidades 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:
O diagrama foi criado por Ned Chapin a partir de trabalhos de Nassi-Shneiderman, os quais
resolveram substituir o fluxograma tradicional por um diagrama que apresenta uma visão hierárquica e
estruturada da lógica do programa. A grande vantagem de usar este tipo de diagrama é a representação
das estruturas que tem um ponto de entrada e um ponto de saída e são compostas pelas estruturas
básicas de controle de sequência, seleção e repartição. Enquanto é difícil mostrar o embutimento e a
recursividade com o fluxograma tradicional, torna-se mais simples mostrá-lo com o diagrama de
Chapin, bem como codificá-lo futuramente na conversão de código português estruturado ou
pseudocódigos. A figura 2.3 apresenta um exemplo do tipo de diagrama de Chapin para o algoritmo de
cálculo da média de um aluno.
Início
Leia N1, N2
Média (N1+N2)/2
Média >= 7
Sim Não
Escreva Escreva
“Aprovado” “Reprovado”
Fim
39
Figura 2.3 Diagrama de Chapin para o algoritmo do cálculo da média de um aluno
Unidade 2 – ESTRUTURA SEQUENCIAL
2.1 – Recursos para composição dos blocos lógicos
Todo o trabalho realizado por um computador é baseado na manipulação das informações contidas em
sua memória. Estas informações podem ser classificadas em dois tipos:
Tipos Inteiros
São caracterizados como tipos inteiros, os dados numéricos positivos ou negativos. Excluindo-se
destes qualquer número fracionário.
Como exemplo deste tipo de dado, tem-se os valores: 35, 0, -56, 1024 entre outros.
Tipos Reais
São caracterizados como tipos reais, os dados numéricos positivos e negativos e números fracionários
(com decimal).
Como exemplo deste tipo de dado, tem-se os valores: 35, 0, -56, 1.2, -45.987 entre outros.
Tipos Caracteres
São caracterizados como tipos caracteres, as sequências contendo letras, números e símbolos especiais.
Uma sequência de caracteres deve ser indicada entre aspas (“ ”). Este tipo de dado também é
conhecido como alfanumérico, string, literal ou cadeia.
Como exemplo deste tipo de dado, tem-se os valores: “Programação”, “Rua Alfa, 52 Apto 1”, “Fone
574-9988”, “04387-030”, “ ”, “7” entre outros.
São caracterizados como tipos lógicos os dados com valor verdadeiro e falso, sendo que este tipo de
dado poderá representar apenas um dos dois valores. Ele é chamado por alguns de tipo booleano,
devido à contribuição do filósofo e matemático inglês George Boole na área da lógica matemática.
Os tipos de dados booleanos são cruciais em qualquer algoritmo. Os dados booleanos baseiam-se no
bit para determinar uma condição, no qual, bit 1 é true ou verdadeiro e bit 0 é false ou falso.
40
tem-se dois estados com pulso (1, ligado, verdadeiro) ou sem pulso (0, desligado, falso).
Variáveis Numéricas
Variáveis alfanuméricas:
Variáveis lógicas:
• boolean - Assume apenas valores booleanos, que são: true (verdadeiro) ou false (falso).
2.1.3 Identificadores
São os nomes que podem ser dados para variáveis e funções. Para representarmos um valor que pode
variar como por exemplo os índices que medem a inflação, precisamos criar parâmetros para
representar esses valores. Os identificadores são os nomes das informações de caráter variável.
Seguem as seguintes regras de formação:
41
Exemplo:
Variáveis e funções.
float calculaMMC(){
........
}
2.1.4 Variáveis
Um dado é classificado como variável quando tem a possibilidade de ser alterado em algum instante
no decorrer do tempo, ou seja, durante a execução do algoritmo em que é utilizado, o valor do dado
sofre alteração ou o dado é dependente da execução em um certo momento ou circunstância.
Uma variável corresponde a uma posição na memória principal, isto é, um endereço que armazena um
conteúdo. Recebe valor de uma constante ou de uma outra variável ou o resultado de uma expressão. O
conteúdo de uma variável pode ser de vários tipos: inteiro, real, caracter, lógico entre outros.
Declaração de Variáveis
Todas as variáveis tem que ser declaradas antes de serem usadas;
Não há uma inicialização implícita na declaração
Exemplo:
Declaração
float salario;
int numero;
string nome;
Uso da variável
numero = numero + 1;
2.1.5 Constantes
Um dado é considerado como constante quando não sofre nenhuma variação no decorrer do tempo, ou
seja, seu valor é constante desde o início até o fim da execução do algoritmo.
Exemplo:
2.1.6 Operadores
Operadores são símbolos que executam várias operações sobre seus argumentos. Os operadores podem
ser aritméticos, relacionais, lógicos e de atribuição conforme demonstrado abaixo:
42
Operadores Aritméticos
• Adição ( + )
• Subtração ( - )
• Multiplicação ( * )
• Divisão ( / )
• Resto da divisão ( % )
Operadores Relacionais
• Maior ( > )
• Maior ou igual ( >= )
• Menor ( < )
• Menor ou igual ( <= )
• Igual ( = ) - Algoritmo
• Igual ( == ) – C++
• Diferente ( <> ) - Algoritmo
• Diferente ( != ) – C++
Operadores de Atribuição
• Atribuição ( = ) – Algoritmo/C++
• Atribuição ( := ) – Algoritmo
• Atribuição ( <- ) - Algoritmo
Operadores de incremento
• Incremento ( ++ )
• Decremento ( -- )
43
Operadores lógicos
• not ( ! )
• and ( && )
• or ( ll )
Expressões lógicas
Denominamos expressão lógica aquela cujos operadores são lógicos ou relacionais e cujos operandos
são relações ou variáveis ou constantes do tipo lógico. O resultado obtido de uma relação é sempre um
valor lógico.
Os operadores lógicos são de suma importância para muitas estruturas algorítmicas, principalmente, as
estruturas base de programação como são as estruturas seletivas e as estruturas de repetição.
Basicamente, os operadores lógicos se baseiam em tabelas chamadas de tabelas verdade que mostram
o resultado booleano (verdadeiro ou falso) de acordo com as comparações ou combinações.
Os símbolos de comparações variam um pouco de linguagem para linguagem, mas podemos destacar
dois grandes grupos - as linguagens baseadas em C e as linguagens baseadas em Visual Basic - embora
suas funções são sempre as mesmas.
Tabelas
Maior (>) - C/C++: >; VB: >;
20 > 10 verdadeiro
20 > 20 falso
10 > 20 falso
44
Diferente de (≠) – C/C++: !=; VB: <>;
20 ≠ 10 Verdadeiro
20 ≠ 20 Falso
10 ≠ 20 Verdadeiro
Exemplo em C++:
Os operadores lógicos de sentença servem para comparar uma combinação de outras comparações.
Isso é muito rotineiro em scripts SQL no qual temos que validar muitos critérios na cláusula WHERE
do comando SELECT.
Aqui, novamente podemos destacar os dois grupos de linguagens baseadas em C e Visual Basic.
45
Tabelas-Verdade
Exemplo:
46
Endentação
A endentação está diretamente ligada a formatação de programas e tem como finalidades principais:
A endentação deve ser utilizada para indicar que as instruções endentadas estão sob controle da
instrução anterior não-endentada. O uso consistente de endentação é essencial para legibilidade do
programa.
Exemplo:
#include <stdio.h>
#include <conio.h>
int main(){
int a;
printf (“Digite um numero: “);
scanf (“%i”,&a);
}
a) X + A / B
b) (X + A) / B
c) D – B * A + C
d) D – B * (A + C)
e)(D – B) * (A + C)
f) X + D / B + A * C * B – A
g)((X + D) / B) + (A * (C * B – A))
Algoritmo
num := 5
salario = 880.00
a 100
C++
valor = 10.5
b = 300
nome = “Maria”
Include e as Bibliotecas
Uma vez que a função já está pronta dentro da biblioteca, basta importar tal biblioteca e utilizar a
função que queremos.
47
Por exemplo, se você quiser mostrar uma mensagem na tela, você não tem que produzir uma função
inteira ou criar um comando novo, basta importar uma biblioteca de I/O (entrada e saída) e utilizar
uma função dela. Quando for compilar, o compilador vai buscar nas bibliotecas tais funções para saber
como utilizá-las.
O papel do pré-processamento é indicar, antes mesmo de compilar, os parâmetros necessários para ser
criado o arquivo executável.
O pré-processamento é indicado pelo caracter sharp no início da linha e deve ser usado no início da
programação.
A importação de uma biblioteca é dada pelo comando include (incluir) seguido da biblioteca entre os
sinais de menor (<) e maior (>).
Porém, devemos notar que existem diferenças entre a importação de bibliotecas de C e de C++.
Em C, a importação de bibliotecas são mais simples, bastando acrescentar para cada biblioteca um
include em uma linha diferente e o nome da biblioteca seguido de ponto H (.h) - .h é a extensão do
arquivo da biblioteca que vem da palavra inglesa HEADER (cabeçalho) - se você esquecer de colocá-
lo o programa não será compilado.
#include <stdio.h>
#include <stdlib.h>
Muitos compiladores aceitam formas híbridas de inclusão de bibliotecas, podendo misturar bibliotecas
de C e de C++.
Após importarmos uma biblioteca por linha, no final dessa lista devemos demonstrar que tipo de
funções usaremos. Na grande maioria dos casos usaremos as funções padrões de cada biblioteca.
Podemos fazer isso facilmente digitando a palavra reservada USING indicando o espaço de nome
(namespace) standard (std), que quer dizer padrão em inglês.
Não se esqueça que a palavra reservada USING necessita terminar a linha com ponto e vírgula(;).
Além disso, um programa em C++ deve definir pelo menos uma função chamada main.
#include <iostream>
using namespace std;
declaração de constantes
declaração de varáveis globais
definição de funções
int main(){
declaração de variáveis locais
sentenças (instruções)
}
Cada instrução em C++ é chamada de sentença. Sentenças simples são terminadas com um ponto e
vírgula. Usando chaves, podemos agrupar sentenças em blocos, chamados de sentenças compostas.
Simples:
x = 3;
Composta:
{
i = 3;
cout<< i << endl;
i = i + 1;
}
A linguagem C e C++ não possui nenhum comando de entrada e saída predefinido na linguagem.
Todas as operações de E/S são realizadas por funções que se encontram nas mais diversas bibliotecas.
49
2.1.9 Entrada e Saída de dados
2.1.9.1 C
A expressão de controle pode conter tanto códigos de formatação precedidos pelo sinal "%", que
indicam o tipo dos dados a serem lidos, como caracteres de espaçamento.
a) Códigos de formato:
%c lê um caracter
%d lê um inteiro decimal
%e lê um número em notação científica
%f lê um número de ponto flutuante
%s lê uma string
%u lê um decimal sem sinal
%l lê um inteiro longo
%lf lê um double
Exemplo:
scanf("%f",&anos);
Toda entrada correspondente um comando "scanf" deve sempre ser finalizado por <ENTER>.
A função "printf()" é a função para saída formatada de dados e funciona da seguinte forma:
Sintaxe
O primeiro argumento é uma string entre aspas (chamada de string de controle) que pode conter tanto
caracteres normais como códigos de formato que começam pelo caracter de porcentagem.
Caracteres normais são apresentados na tela na ordem em que são encontrados. Um código de formato
informa a função "printf" que um item não caracter deve ser mostrado. Os valores correspondentes
encontram-se no segundo argumento (lista de argumentos).
Além de códigos de formato e caracteres normais a string de controle pode conter ainda caracteres
especiais iniciados pelo símbolo "\".
Exemplos:
50
printf("São %d horas e %d minutos.", hora, minuto);
printf("O nome é %s.",nome);
printf("%d dividido por %d é igual a %f", n1, n2, (float)n1/n2);
printf("O código de %c é %d", letra, letra);
Códigos de formato:
%c - caracter simples
%d - decimal
%ld - inteiro "longo"
%f - ponto flutuante
%o - octal
%s - cadeia de caracteres
%x - hexadecima
%f - double
Obs.:
Deve haver uma variável ou constante para cada código de formato! O tipo das variáveis ou
constantes também deve coincidir com os códigos de formato.
int a;
float b;
char c;
double d;
printf("%d %f %c %lf",a,b,c,d);
Obs.:
Por enquanto vamos assumir que todas as variáveis da lista de argumentos, com exceção das variáveis
string, deverão ser antecedidas do operador "&". Mais adiante vamos entender a razão do operador
"&" e quando o mesmo deve ser utilizado.
Como a linguagem C não possui nenhum comando de entrada e saída incorporado à linguagem, todas
essas operações são realizadas através de funções que encontram-se nas bibliotecas da linguagem.
Para utilizar essas funções dentro do programa é necessário incluir o cabeçalho das funções no início
do programa através da diretiva de compilação #include:
2.1.9.2 C++
iostream
A linguagem C++ não possui nenhum comando de entrada e saída predefinido na linguagem. Todas as
operações de E/S são realizadas por funções que se encontram nas mais diversas bibliotecas.
A <iostream> fornece o objeto std::cout, que é usado para enviar uma mensagem para a tela.
51
Sintaxe:
#include <iostream>
Objeto “cout<<”
O objeto cout representa o stream de saída no C++. Este stream é uma espécie de sequência (fluxo)
de dados a serem impressos na tela.
Para realizar a impressão, usa-se o Operador de Inserção (<<). Esse operador executa a saída (imprime
na tela) com streams em C++. O objeto cout é usado em conjunto com ele para a impressão de dados
(cout<<).
Objeto “cin>>”
O objeto cin representa o stream de entrada no C++. Ele realiza a leitura de um sequência de dados
vindas do teclado. Para coletar estes dados armazenados, usa-se o Operador de Extração (>>) que
"extrai" dados do stream (cin>>).
system("pause")
A função system funciona como se tivéssemos digitado o que está entre aspas duplas na janela de
console. Nesse caso, pause.
system é uma função da linguagem C. Isso vai gerar uma mensagem: "pressione uma tecla
para continuar..." na tela do console.
Incluímos esta função para que o programa não encerre imediatamente após ser executado (se não
tivéssemos a incluído, o programa apareceria na tela e em segundos encerraria, logo não
conseguiriamos ler a tempo "A mensagem" gerado na janela do console.
Exemplo:
#include <iostream>
using namespace std;
int main(){
int n;
cout << "Digite um numero: "; //escreve na tela " Digite um numero: "
//espera o usuário digite o valor de n
//e um enter.
cin >> n; //armazena o valor digitado no objeto n
cout << "Numero digitado: " << n; //escreve na tela o numero digitado
system("pause"); // aguarda pressionar alguma tecla para
// encerrar o programa }
52
Caracteres de Espaçamento:
São considerados caracteres de espaçamento o espaço em branco, o caracter "\t" e o "\n". Sempre que
um destes surgir na string de controle de um comando "scanf" ele indicará que o mesmo deve ser
considerado como separador dos valores a serem digitados. Esses caracteres serão então lidos pelo
"scanf", porém, não armazenados.
Normalmente quando o usuário está entrando com valores atendendo a um "scanf", quando o mesmo
digita um destes caracteres de espaçamento, o mesmo é lido e não armazenado.
A diferença é que se o caracter de espaçamento aparece na string de controle, então o scanf não é
encerrado enquanto o mesmo não for digitado.
2.1.10 Comentários
Comentários são linhas ou trechos de um programa que não é analisado pelo compilador. São
utilizados para escrever observações sobre trechos do programa ou documentar alterações feitas pelos
programadores.
Em C++, quando queremos comentar uma linha usamos duas barras ( // ). Quando queremos comentar
um bloco maior usamos uma barra e um asterisco no início do bloco e asterisco barra no final do
bloco.
Exemplo:
// Para uma linha por exemplo:
/*
Para varias linhas por exemplo
usamos barras e asteriscos
*/
Resolução em C++
#include <iostream> // Para o uso de cout e cin - c++
using namespace std;
int main(){
cout<< ("ALGORITMO SO SE APRENDE PRATICANDO");
system("pause");
}
Resolução em C
#include <conio.h> // Ativa getch
#include <stdio.h> // Controla monitor e teclado
int main(){
printf ("ALGORITMO SO SE APRENDE PRATICANDO");
getch();
}
53
Alguns de Compiladores de C e C++
Módulo é uma operação matemática que utilizamos para obter o resto de uma divisão.
Mas, a questão é: Para que necessitamos saber o resto de uma divisão?
Por mais que seja estranho ter que obter o resto de uma divisão, no mundo algorítmico da computação,
isso faz muito sentido.
Existem muitos números que podem ser descobertos por meio do resto de divisão como números
primos, pares, ímpares, etc.
Só para dar um exemplo, um número sempre será par se ele for divisível por 2. Ou seja, se dividirmos
um número por 2 e o resto for 0, este número com certeza será par.
Veja em fluxograma:
55
Exercícios
#include <iostream>
#include <string>
using namespace std;
int numero;
string nome;
int main(){
cout<< "Digite um numero: " ;
cin>> numero;
cout<< "Digite o nome ..: " ;
cin>> nome;
cout<< "\nNumero digitado: " << numero;
cout<< "\nNome digitado .: " << nome;
cout<<("\n");
system("pause");
}
6) Ler três números inteiros do teclado e imprimir a soma. Antes do resultado, imprimir a mensagem
: SOMA.
7) Ler dois números inteiros do teclado e imprimir o produto. Mudar o tipo para decimal e fazer o
cálculo.
10) Entrar com dois números inteiros e imprimir a média aritmética com a mensagem : MÉDIA: antes
do resultado.
11) Ler dois valores para as variáveis A e B, efetuar a troca dos valores de forma que a variável A passe
a possuir o valor da variável B e que a variável B passe a possuir o valor da variável A. Apresentar os
valores trocados.
12) Entrar com quatro números e imprimir a média ponderada, sabendo-se que os pesos são
respectivamente: 1,2,3 e 4.
56
13) Se a poupança rende 20% ao mês e você deposita mensalmente a quantia de R$ 100,00 , após 12
meses, quanto terá acumulado ? Imprimir o valor acumulado.
Onde :
P - aplicação mensal
i – taxa
n - número de meses.
14) Construir um algoritmo que efetue o cálculo do salário líquido de um professor. Sabendo os
dados: valor da hora aula, n° de aulas dadas no mês e percentual de desconto do INSS.
15) Ler uma temperatura em graus Centígrados e apresentá-la convertida em graus Fahrenheit. A
fórmula de conversão é: F ¨ (9 * C + 160) / 5. Onde F é a temperatura em Fahrenheit e C é a
temperatura em Centígrados.
16) Faça um algoritmo que leia um valor de conta de restaurante, representando o gasto realizado pelo
cliente e imprima o valor total a ser pago, considerando que o restaurante cobra 10% para o garçom.
17) Faça um algortimo que leia o valor do salário mínimo e o valor do salário de um funcionário.
Calcule e imprima quantos salários mínimos ganha o funcionário.
18) Sabendo-se que o Kilowatt de energia custa um quinto do salário mínimo, faça um algoritmo que
receba o valor do salário mínimo e a quantidade de kilowatts gasta por uma residência e calcule e
imprima:
19) Escrever um algoritmo que receba um número inteiro do teclado. Esse número deve ser multiplicado por 5,
diminuído de 10, adicionado 30 e no final dividi-lo por 2.
57
Unidade 3 – ESTRUTURAS DE TOMADA DE DECISÃO
A estrutura if...else é a mais simples estrutura de controle do C. Esta estrutura permite executar um
entre vários blocos de instruções. O controle de qual bloco será executado será dado por uma condição
(expressão lógica ou numérica). Esta estrutura pode se apresentar de modos ligeiramente diferentes.
A estrutura de decisão de um bloco permite que se execute (ou não) um bloco de instruções conforme
o valor de uma condição seja verdadeiro ou falso. O fluxograma desta estrutura é mostrada na figura
5.3.
condição V
F bloco
if (condição){
bloco
}
onde:
Exemplo:
#include <iostream>
using namespace std;
int main(){
float media = 7;
if(media >= 7){
cout<< "O aluno esta aprovado. Sua media e: " << media << endl;
}
}
58
3.1.2 Estrutura de seleção composta (if...else)
Também é possível escrever uma estrutura que execute um entre dois blocos de instruções. A figura
5.4 mostra o fluxograma correspondente a esta estrutura de decisão.
condição?
bloco 1 bloco 2
if (condição){
bloco 1;
}
else{
bloco 2;
}
onde:
Exemplo:
Selecionar o aluno aprovado com média maior ou igual a 7 ou reprovado se a media for menor que 7
#include <iostream>
using namespace std;
int main(){
float media = 7;
if(media >= 7){
cout<< "O aluno esta aprovado. Sua media e: " << media << endl;
else
if(media < 7){
cout<< "O aluno esta reprovado. Sua media e: " << media << endl;
}
}
59
3.1.3 Estruturas de seleção aninhadas (if...else if...)
Também é possível escrever uma estrutura que execute um entre múltiplos blocos de instruções.
if(condição 1){
bloco 1;
}
else
if(condição N){
bloco N;
}
else{
bloco P
}
onde:
Se a condição 2 for verdadeira o bloco 2 é executado. Caso contrario, a condição 3 é avaliada e assim
sucessivamente. Se nenhuma condição é verdadeira bloco P é executado.
Exemplo:
Selecionar o aluno aprovado com média maior ou igual a 7, selecionar o aluno que está em
recuperação se a média estiver entre 4 (inclusive) e menor que 7 ou se o aluno aluno está reprovado
se a média é menor que 4.
#include <iostream>
using namespace std;
int main(){
float media = 7;
if(media >= 7){
cout<< "O aluno esta aprovado. Sua media e: " << media << endl;
else
if(media < 4){
cout<< "O aluno esta reprovado. Sua media e: " << media << endl;
else
if(media >= 4) && (media < 7 ){
cout<< "O aluno esta em recuperacao. Sua media e: " << media
<< endl;
}
}
60
Exercícios Estrutura de Seleção
1) Faça um programa em C++ que leia duas notas, calcule a média e imprima a seguinte mensagem:
#include "iostream"
#include "string"
using namespace std;
int main(){
float nota1,nota2,media;
string nome;
cout<< ("Digite o nome do aluno: ");
cin>> nome; fflush (stdin);
cout<< ("Digite a primeira nota: ");
fflush (stdin);
cin>> nota1;
cout<< ("Digite a segunda nota : ");
cin>> nota2;
media = (nota1 + nota2) / 2;
cout<< "Media: " << media << endl;
if (media < 5)
cout<< ("Reprovado");
else
if (media >= 7)
cout<< "Aprovado" << endl;
else
cout<< "Recuperacao" << endl;
system("pause");
}
#include "iostream"
#include "string"
using namespace std;
void main(){
int i,anof; float vlrveic,vlrmulta;
cout<< ("Digite o ano de fabricacao do veiculo: ");
cin>> anof; fflush (stdin);
cout<< ("Digite o valor do veiculo ...........: ");
cin>> vlrveic;
if (anof < 2000)
vlrmulta = vlrveic * 0.015;
else
vlrmulta = vlrveic * 0.035;
cout<< "\n";
cout<< "========= Multa Calculada ==========" << endl;
cout<< "Ano fabricacao do veiculo: " << anof << endl;
cout<< "Valor do veiculo ........: " << vlrveic << endl;
cout<< "Valor da multa ..........: " << vlrmulta << endl;
system("pause");
}
61
1) Com base nos dados informados: vlrsal e tabela do inss faça um algoritmo para calcular o salário
líquido de um trabalhador:
Tabela do INSS
Obs.
Salário líquido = valor do salário – inss
2) Com base no exercício anterior (4) incluir cálculo do imposto de renda (irrf).
Obs.
Percentual do imposto de renda: 10%
Valor do desconto padrão: 100.00
Irrf = (valor do salário – valor do inss) * percentual – desconto padrão
Salário líquido = valor do salário – inss - irrf
5) Ler três números, somá-los e imprimir o resultado caso seja maior que 10.
6) Faça um algoritmo que calcule a subtração de dois números inteiros positivos. Se o resultado for
positivo, imprima-o.
7) Desenvolver um algoritmo para ler dois números inteiros e verificar se o resto da divisão entre eles
é maior que 12. Se isto ocorrer imprimir o resto.
8) Faça um algoritmo que leia dois números inteiros e identifique se os mesmos são iguais ou
diferentes. Caso eles sejam iguais imprima uma mensagem dizendo que eles são iguais. Caso
contrário, diga qual dos dois números é o maior.
11) Desenvolver um algoritmo para ler um número, verificar e imprimir se o mesmo é nulo, positivo
ou negativo.
12) Se considerarmos que o numero 1 representa DOMINGO e que 7 representa SÁBADO,
desenvolva um algoritmo para ler um determinado número e imprimir qual o dia correspondente da
semana.
13) Desenvolva um algoritmo para ler o nome e as quatro notas bimestrais de um aluno e imprimir se o
mesmo foi aprovado, considerando-se que a media para aprovação deve ser no mínimo igual a 6.
62
14) O preço de uma transportadora é composto por duas parcelas: Distância e peso. Baseado nas
tabelas abaixo, faça um algoritmo que leia uma relação de distância e peso e forneça o valor do frete
para cada caso. Encerre a leitura quando a distância for igual a zero.
15) Com base nos dados informados: vlrsal, percentual do imposto de renda e o desconto padrão e
tabela do inss.
De 0,00 a 500,00 – 8%
De 500,01 a 1000,00 – 9%
De 1000.01 a 2400,00 - 11%
Acima de 2400,00 – valor fixo 264.00
16) faça um algoritmo para calcular o salário de um trabalhador: Ao final imprimir na tela o vlr-
salário, inss, irrf e salário líquido.
17) Um determinado material radioativo perde metade da sua massa a cada 50 segundos. Dada a massa
inicial em gramas, faça um algoritmo que determine o tempo necessário para que essa massa se torne
menor do que 0,5 grama. Escreva a massa inicial, a massa final e o tempo calculado em horas, minutos
e segundos.
aprovado: media > = 7 prova final: media > = 4 e media < 7 reprovado: media < 4
20) Considere que uma empresa queira dar um aumento salarial a um funcionário. Deste funcionário, a
empresa possui as seguintes informações: seu nome, idade e salário base. O procedimento adotado
para o cálculo de aumento do salário é o seguinte:
1) Reajustar o salário base do funcionário em 30% se ele tem mais de 30 anos ou 20% caso
contrário;
2) Conceder uma gratificação de 20% sobre o salário já reajustado;
21) Efetuar descontos de 15% sobre o salário já reajustado e sem a concessão da gratificação. Deverão
ser impressos o nome e o novo salário do funcionário na sua forma bruta (aumento + gratificação) e
líquida (aumento + gratificação - descontos).
63
22) Fazer um algoritmo que leia o valor máximo em dólares que um turista pode comprar no exterior e
o valor das compras apurado pela receita federal quando de sua chegada ao Brasil. Informar se o turista
está liberado ou se o valor comprado excedeu o valor permitido.
23) Suponha que a Universidade possua a seguinte tabela de valores de créditos por curso;
24) Faça um algoritmo que leia o nome de um aluno, curso que o mesmo está matriculado e o número
de créditos que ele está cursando e calcule a mensalidade a ser paga pelo aluno. Deverão ser impressos
o nome do aluno, seu curso e o valor da mensalidade a pagar.
25) Faça um algoritmo que leia o código do departamento em que um funcionário trabalha (1-
secretaria, 2-tesouraria, 3-depto pessoal, 4-almoxarifado), seu nome, salário base e o tempo de serviço.
O algoritmo deverá então calcular e imprimir o novo salário base do funcionário conforme as
condições abaixo:
Deverão ser impressos o nome do funcionário, seu salário antigo e o novo salário.
26) Fazer um algoritmo que leia duas notas do teclado. Calcular a média e imprimir a situação do aluno.
27) Faça um algoritmo que imprima o nome do aluno, seu conceito e o resultado final.. O programa
deve ler o nome do aluno, suas 3 notas, juntamente com seus 3 pesos e calcular a média ponderada do
aluno de acordo com a fórmula abaixo:
Após o cálculo da média, o algoritmo deverá verificar o conceito final do aluno e indicar sua
aprovação ou não, conforme a tabela abaixo:
64
7.50 - 8.99 B Aprovado
6.00 - 7.49 C Aprovado
5.00 - 5.99 D Reprovado
0.00 - 4.99 E Reprovado
Switch e Case
Uma outra forma de estrutura seletiva é o SWITCH. Dentro dos switch há o case (que significa caso).
Ou seja, é quase que um if com várias possibilidades, mas com algumas diferenças importantes.
1a diferença: Os cases não aceitam operadores lógicos. Portanto, não é possível fazer uma
comparação. Isso limita o case a apenas valores definidos.
2a diferença: O switch executa seu bloco em cascata. Ou seja, se a variável indicar para o primeiro
case e dentro do switch tiver 5 cases, o switch executará todos os outros 4 cases a não ser que
utilizemos o comando para sair do switch. (Nos referimos ao BREAK).
Agora, que conhecemos diferenças importantes, vamos ver como proceder com o switch / case.
Primeiro o comando SWITCH e entre parênteses a váriavel na qual está guardado o valor que será
avaliado pelo case. Então, abre-se o bloco de dados. Dentro do bloco de dados colocamos o comando
CASE e logo após um valor terminando a linha com dois pontos (:). Preste atenção no tipo de dado que
será colocado, pois há diferenças entre um dado e outro. Por exemplo: 1 não é a mesma coisa que '1' e
'a' não é a mesma coisa que 'A'...
switch (variável){
case valor1: dados a serem executados
break;
case valor2: dados a serem executados
break;
default: cout<< "Opçao invalida!" << endl;
break;
}
O valor de expressão é avaliado e o fluxo lógico será desviado para o conjunto cujo rótulo é igual ao
resultado da expressão e todas as instruções abaixo deste rótulo serão executadas. Caso o resultado da
expressão for diferente de todos os valores dos rótulos então conjunto d é executado. Os rótulos devem
ser expressões constantes inteiras diferentes entre si. O rótulo default é opcional.
Esta estrutura é particularmente útil quando se tem um conjunto de instruções que se deve executar em
ordem, porém se pode começar em pontos diferentes.
65
Em fluxograma:
expr essão
r otulo 1
c onjunt o 1
r ot ulo 2
c onjunto 2
.. .
r otulo N
c onjunt o N
r otulo D
c onjunt o D
A expressão ou variável no comando case deve ser do tipo simples, normalmente char ou int.
Após a avaliação da expressão, seu valor ou o valor da variável é comparado com os diversos valores
discriminados. Se houver algum que satisfaça, o comando subsequente será executado.
Exemplo1:
#include "iostream"
using namespace std;
int main(){
int opcao;
cout<< "************* Menu de Opcoes **************" << endl << endl;
cout<< "1 - Inclusao " << endl;
cout<< "2 - Alteracao" << endl;
cout<< "3 - Consulta " << endl;
cout<< "4 - Exclusao " << endl;
cout<< "Digite a Opcao: ";
cin>> opcao;
switch (opcao){
case 1:
cout<< "Inclusao" << endl;
break;
case 2:
cout<< "Alteracao" << endl;
break;
default: cout<< "Opçao invalida!" << endl;
break;
}
system("pause");
}
66
Exemplo2:
Calcular a soma, ou a subtração, ou a multiplicação, ou a divisão entre dois números lidos do teclado.
#include "iostream"
#include "string"
using namespace std;
int main(){
char operador;
int num1,num2;
switch(operador){
case '+': cout<< "num1 + num2 = " << (num1 + num2) << endl;
break;
case '-': cout<< "num1 - num2 = " << (num1 - num2) << endl;
break;
case '*': cout<< "num1 * num2 = " << (num1 * num2) << endl;
break;
case '/': cout<< "num1 / num2 = " << (num1 / num2) << endl;
break;
default: cout<< "Nao e operador!" << endl;
}
system("pause");
}
As instruções vistas anteriormente podem sofrer desvios e interrupções em sua sequência lógica
normal através do uso certas instruções. As instruções que veremos a seguir devem ser usadas com
muita parcimônia, pois fogem da lógica estruturada tem a tendência de tornar um programa
incompreensível.
A Instrução break
Esta instrução serve para terminar a execução das instruções de um laço de repetição (for, do...while,
while) ou para terminar um conjunto switch...case.
Exemplo:
No trecho abaixo um laço de repetição lê valores para o cálculo de uma média. O laço possui uma
condição de controle sempre verdadeira o que, a princípio, é um erro: laço infinito.
Porém, a saída do laço se dá pela instrução break que é executada quando um valor negativo é lido.
67
cout<< "digite valores: ";
do{
cout<< "valor:";
cin>> val;
if(val < 0.0){
break; // saída do laço
}
num++;
soma += val;
}while(1); // sempre verdadeiro
Exemplo: No exemplo acima, o uso da instrução break poderia ter sido evitado, como segue:
A Instrução continue
Esta instrução opera de modo semelhante a instrução break dentro de um laço de repetição.
Quando executada, ela pula as instruções de um laço de repetição sem sair do laço. Isto é, a instrução
força a avaliação da condição de controle do laço.
Exemplo:
No trecho abaixo revemos um laço de repetição lê valores para o cálculo de uma média. Se (val < 0.0)
então o programa salta diretamente para a condição de controle, sem executar o resto das instruções.
68
A Instrução goto
Esta instrução é chamada de desvio de fluxo. A instrução desvia o programa para um rótulo (posição
identificada) no programa. São raros os casos onde a instrução goto é necessária, no entanto, há certas
circunstâncias, onde usada com prudência, ela pode ser útil.
goto rótulo;
...
rótulo:
onde rótulo é um identificador válido.
Exemplo:
No trecho abaixo revemos um laço de repetição lê valores para o cálculo de uma média. Foram usadas
duas instruções goto.
A Função exit()
Esta função (não instrução) exit() , da biblioteca stdlib.h, é uma função que termina a execução de um
programa. Normalmente um programa é terminado quando se executa a última sua instrução, porém
pode-se terminar a execução do programa a qualquer momento com o uso desta função.
A função exit() tem a seguinte declaração: void exit(int status). Onde o argumento da função é um
valor inteiro que será passado para o Sistema Operacional: (variável de sistema errorlevel no DOS).
Exemplo: No trecho abaixo revemos um laço de repetição lê valores para o cálculo de uma média. Foi
usado a função exit para terminar a execução do programa.
69
Exercícios - switch...case
1 – Cadastramento de Aluno;
2 – Lancamento de Notas;
3 – Inclusao de Plano de Estudos;
4 – Alteracao de Plano de Estudos;
5 – Alteracao de Dados Cadastrais
6 – Encerra;
Escolha a Opcao:
Pede-se:
1 – Usar a instrução case para testar e executar as opções;
2 – Criar rotina para calcular a média de duas notas;
3 – Criar rotina para somar o salário de 2 funcionários.
70
Unidade 4 – ESTRUTURAS DE REPETIÇÃO
As estruturas de repetição permitem executar mais de uma vez um mesmo trecho de código.
Trata-se de uma forma de executar blocos de comandos somente sob determinadas condições, mas
com a opção de repetir o mesmo bloco quantas vezes for necessário.
As estruturas de repetição são úteis, por exemplo, para repetir uma série de operações semelhantes que
são executadas para todos os elementos de uma lista ou de uma tabela de dados, ou simplesmente para
repetir um mesmo processamento até que uma certa condição seja satisfeita.
Este comando permite que um grupo de operações ou comandos sejam repetidos um certo número de
vezes.
Sintaxe geral:
onde:
A variável de controle deverá ser, obrigatoriamente, do tipo int. A variação, o valor inicial e valor final
será crescente e de um em um, quando utilizamos o operador de incremento ++, e decrescente de um
em um, quando utilizamos o operado de decremento --.
Então o bloco é executado e depois de cada iteração, o contador é incrementado de acordo com a
expressão de incremento.
Exemplo: No trecho abaixo, o contador i é inicializado com o valor 1. O bloco é repetido enquanto a
condição i <= 10 for verdadeira. O contador é incrementado com a instrução i++.
71
Esta estrutura, deste modo, imprime os números 1, 2, ..., 9, 10.
Em fluxograma:
Exemplos:
Programa que calcula e imprime números pares e impares. Ele exemplifica o uso da estrutura for.
#include <iostream>
using namespace std;
int main(){
int i; // contador de iteracao
int num; // numero de valores lidos
cout<< "Digitacao de numeros reais..." << endl;
cout<< "Repetir quantas vezes? ";
cin>> num;
for(i = 1; i <= num; i++){
if(i % 2 == 0)
cout<< "Numero par .: " << i << endl;
else
cout<< "Numero impar: " << i << endl;
}
system("pause");
}
72
2) Leia 20 valores reais e escreva o seu somatório.
#include <iostream>
using namespace std;
int main(){
int i, num; int somatorio = 0;
for(i=0; i < 20; i++){
cout<< "Digite um numero: ";
cin>> num;
somatorio = somatorio + num;
}
cout<< "Somatorio dos numeros: " << somatorio << endl;
system("pause");
}
#include <iostream>
using namespace std;
int main(){
int i, num, resto; int totresto = 0;
for(i=0; i < 3; i++){
cout<< "Digite um numero: ";
cin>> num;
resto = num % 3;
totresto = totresto + resto;
}
cout<< "Somatorio do resto: " << totresto << endl;
system("pause");
}
73
4.1.1 Exercícios - for
4) Ler nome e duas notas de 5 alunos. Calcular a média ponderada e imprimir o nome, a média e a
seguinte mensagem:
Se nota < 4
“Reprovado”
se nota >= 7
“Aprovado”
se >= 4 e < 7
“Prova Final”
Obs.
Os pesos são: Pr1 = 2 e Pr2 = 3
5) Em uma turma com 15 alunos deseja-se saber o valor total de bolsas concedidas. Faça um algoritmo
que leia a matricula, o nome e o valor da mensalidade. O percentual da bolsa corresponde a 16% do
valor da mensalidade.
6) Considerando que 10 carros foram rebocados pela prefeitura e que todos foram multados, calcular o
valor das multas. Carros com data de fabricação anterior a 2000 o percentual da multa será de 1,5% de
seu valor, os outros 3,5%. Calcular e imprimir o valor das multas.
Obs.
Ao final informar o valor total das multas aplicadas.
7) Com base no exercício anterior, imprimir a chapa, o ano e a multa do veículo com multa superior a
3000.00.
8) Para cada nota de compra, tem-se o Nome do produto comprado, o valor e o imposto. Faça um
algoritmo que escreva o valor total do produto, o valor total do imposto e o valor total cobrado de
todas as notas. Considere 10 notas fiscais.
9) Um comerciante deseja fazer um levantamento do estoque de 100 das suas mercadorias. Para isto
fez uma lista onde cada linha possui o nome e o preço de venda das mercadorias. Faça um algoritmo
que leia estas informações e escreva quantas mercadorias apresentam:
10) Considerando uma turma de 60 alunos, faça um algoritmo que, dados o nome e a nota de cada
aluno, informe o nome dos alunos que tiraram respectivamente a maior e a menor nota.
12) Faça um algoritmo ler 12 números e verificar se o número inteiro lido é par ou ímpar.
74
13) Fazer um algoritmo para ajudar no cálculo do salário de 5 funcionários. Deve ser informado: nome
do funcionário, salário bruto, número de dependentes. Deve ser impresso: nome do funcionário e
salário líquido
14) Faça um algoritmo que leia dois números inteiros e identifique se os mesmos são iguais ou
diferentes. Caso eles sejam iguais imprima uma mensagem dizendo que eles são iguais. Caso
contrário, diga qual dos dois números é o maior. Processar essa rotina 10 vezes.
15) Fazer um algoritmo que leia o valor máximo em dólares que 30 turistas podem comprar no exterior
e o valor das compras apurado pela receita federal quando de sua chegada ao Brasil. Informar se o
turista está liberado ou se o valor comprado excedeu o valor permitido.
16) Faça um algoritmo que leia um valor de conta de restaurante, representando o gasto realizado pelos
90 clientes e imprima o valor total a ser pago considerando que o restaurante cobra 10% para o
garçom.
17) Faça um algoritmo que leia o valor de um depósito e o valor da taxa de juros de 30 correntistas de
um banco. Calcule e imprima o valor do rendimento e o valor total depois do rendimento.
18) Faça um algoritmo que leia uma série de 5 números e imprima a média aritmética dos ímpares e a
soma dos pares.
19) Uma loja recebeu pagamentos de 15 clientes e deseja organizar estes dados. Faça um algoritmo que leia o
código do cliente, o sexo do cliente, produto comprado, qtde vendida e preço por cada um destes clientes. O
algoritmo deve apresentar as seguintes informações:
1 – Valor total do faturamento da loja;
2 – Valor do faturamento pago por homens;
3 – Valor do faturamento pago por mulheres;
20) Considerando uma turma de 60 alunos, faça um algoritmo que, dados o nome e a nota de cada
aluno, informe o nome dos alunos que tiraram respectivamente a maior e a menor nota.
21) Um comerciante deseja fazer um levantamento do lucro de 100 das suas mercadorias. Para isto fez
uma lista onde cada linha possui o nome, o preço de compra e o preço de venda das mercadorias. Faça
um algoritmo que leia estas informações e escreva quantas mercadorias apresentam:
75
Informar também o valor total de compra e de venda das mercadorias.
22) Em uma turma com 55 alunos deseja-se saber o valor total de bolsas concedidas. Faça um
algoritmo que leia a matricula, o nome e o valor da mensalidade. O percentual da bolsa corresponde a
16% do valor da mensalidade.
23) Considerando que 50 carros foram rebocados pela prefeitura e que todos foram multados, calcular
o valor das multas. Carros com data de fabricação anterior a 2000 o percentual da multa será de 1,5%
de seu valor, os outros 3,5%. Calcular e imprimir o valor das multas.
Obs.
O valor da multa é diário.
24) Com base no exercício anterior, imprimir a chapa, o ano e a multa do veículo com multa superior a
3000.00.
76
4.2 – Repetição com Teste no Início (while)
A estrutura while permite controlar o número de vezes que uma instrução ou bloco de instruções será
executado. A expressão lógica é avaliada antes da primeira interação, isto significa que,
eventualmente, pode não ocorrer sequer a primeira interação.
A sintaxe de while é:
while(expressão_lógica){
instruçoes;
}
O loop "enquanto" (while) executa um comando (ou vários) enquanto uma condição for verdadeira.
Em fluxograma:
Exemplos:
1) Fazer um algoritmo para ler N números inteiros do teclado, diferentes de 999. A leitura termina com
a leitura do número 999.
#include <iostream>
using namespace std;
int main(){
int num;
cout<< "Digite um numero (999-Encerra): ";
cin>> num;
while ( num != 999) {
cout<< "Digite um numero (999-Encerra): ";
cin>> num;
}
system("pause");
}
77
2) Fazer um algoritmo para ler números inteiros positivos do teclado e informar se o número é par ou
impar, a quantidade de números pares, a quantidade de números impares e a quantidade total de
números digitados. A digitação se encerra quanto for digitado o número -1.
#include <iostream>
using namespace std;
int main(){
int num, resto;
int qtdepar = 0; int qtdeimpar = 0; int qtdetotal = 0;
cout<< "Digite um numero (-1-Encerra): ";
cin>> num;
while ( num != -1){
resto = num % 2;
if (resto == 0){
cout<< "O numero digitado e par" << endl;
qtdepar++;
}
else{
cout<< "O numero digitado e impar" << endl;
qtdeimpar++;
}
qtdetotal++;
cout<< "Digite um numero (-1-Encerra): ";
cin>> num;
}
cout<< endl;
cout<< "Qtde numeros pares .: " << qtdepar << endl;
cout<< "Qtde numeros impares: " << qtdeimpar << endl;
cout<< "Qtde total .........: " << qtdetotal << endl;
cout<< endl;
system("pause");
}
3) Faça um algoritmo para ler e escrever o Nome, idade e sexo de um número indeterminado de
alunos. Ao final escreva o total de alunos lidos.
#include <iostream>
#include <string>
using namespace std;
int main(){
int qtdelidos = 0; string nome, sexo; int idade;
cout<< "Digite o nome do aluno (fim-Encerra): ";
getline (cin,nome);
while (nome != "fim"){
cout<< "Digite o sexo do aluno .............: ";
getline (cin,sexo);
cout<< "Digite a idade do aluno ............: ";
cin>> idade;
fflush (stdin);
qtdelidos++;
cout<< "Digite o nome do aluno (fim-Encerra): ";
getline (cin,nome);
}
cout<< endl;
cout<< "qtde de alunos lidos: " << qtdelidos << endl;
system("pause");
}
78
4.2.1 Exercícios - while
1) Fazer um algoritmo para ler nome e duas notas do teclado. Calcular a media a e imprimir a
mensagem abaixo. A leitura termina com a leitura do nome igual a “fim” ou “FIM”.
Nota < 4
“Reprovado”
Nota >= 7
“Aprovado”
Nota > 4 e <= 7
“Prova final”
2) Ler a média dos alunos de uma turma. Imprimir a maior média. A leitura termina com a leitura da
média = –1.0.
3) Ler a média dos alunos de uma turma. Imprimir a menor média. A leitura termina com a leitura da
média = –1.0.
4) Fazer um algoritmo que leia o valor máximo em dólares que um número indefinido de turistas
podem comprar no exterior e o valor das compras apurado pela receita federal quando de sua chegada
ao Brasil. Informar se o turista está liberado ou se o valor comprado excedeu o valor permitido, total
das compras e a quantidade de turistas.
6) Dado um conjunto de n registros cada registro contendo um valor real, faça um algoritmo que
calcule a média dos valores maiores que 4.
a) Para cada pessoa tem-se: Nome, Número de Dependentes, Renda Bruta Anual;
b) O imposto é calculado segundo a tabela abaixo:
9) O Departamento de trânsito do estado anotou dados de acidentes de trânsito no ultimo ano. Para
cada motorista envolvido no acidente, têm-se as seguintes informações:
79
- Ano de nascimento;
- Sexo (M - Masculino, F - Feminino);
- Procedência (0 - Capital, 1 - Interior, 2 - Outro estado);
c) Calcule quantos motoristas do interior do estado tem idade maior que 60 anos;
10) Um comerciante deseja fazer um levantamento do estoque de suas mercadorias. Para isto fez uma
lista onde cada linha possui o nome e o preço de venda das mercadorias. Faça um algoritmo que leia
estas informações e escreva quantas mercadorias apresentam:
preço de até 10.00
preço entre 10.01 e 20.00
preço acima 20.00
Obs
A leitura termina com nome da mercadoria igual a “fim”.
12) Faça um algoritmo ler n números e verificar se o número inteiro lido é par ou ímpar.
13) Fazer um algoritmo para ajudar no cálculo do salário de vários funcionários. Deve ser informado:
nome do funcionário, salário bruto, número de dependentes. Deve ser impresso: nome do funcionário e
salário líquido
14) Faça um algoritmo que leia dois números inteiros positivos e identifique se os mesmos são iguais
ou diferentes. Caso eles sejam iguais imprima uma mensagem dizendo que eles são iguais. Caso
contrário, diga qual dos dois números é o maior. O Algoritmo pára quando for digitado –1.
15) Fazer um algoritmo que leia o valor máximo em dólares que vários turistas podem comprar no
exterior e o valor das compras apurado pela receita federal quando de sua chegada ao Brasil. Informar
se o turista está liberado ou se o valor comprado excedeu o valor permitido.
80
16) Faça um algoritmo que leia um valor de conta de restaurante, representando o gasto realizado pelos
clientes e imprima o valor total a ser pago considerando que o restaurante cobra 10% para o garçom.
17) Faça um algoritmo que leia o valor de um depósito e o valor da taxa de juros dos correntistas de
um banco. Calcule e imprima o valor do rendimento e o valor total depois do rendimento.
18) Faça um algoritmo que leia uma série de números e imprima a média aritmética dos ímpares e a
soma dos pares.
19) Uma loja recebeu pagamentos dos clientes e deseja organizar estes dados. Faça um algoritmo que leia o
código do cliente, o sexo do cliente, produto comprado, qtde vendida e preço por cada um destes clientes. O
algoritmo deve apresentar as seguintes informações:
1 – Valor total do faturamento da loja;
2 – Valor do faturamento pago por homens;
3 – Valor do faturamento pago por mulheres;
20) Um comerciante deseja fazer um levantamento do lucro de suas mercadorias. Para isto fez uma
lista onde cada linha possui o nome, o preço de compra e o preço de venda das mercadorias.
Faça um algoritmo que leia estas informações e escreva quantas mercadorias apresentam:
21) Considerando que vários carros foram rebocados pela prefeitura e que todos foram multados,
calcular o valor das multas. Carros com data de fabricação anterior a 2000 o percentual da multa será
de 1,5% de seu valor, os outros 3,5%. Calcular e imprimir o valor das multas.
Obs.
O valor da multa é diário.
22) Com base no exercício anterior, imprimir a chapa, o ano e a multa do veículo com multa superior a
3000.00.
81
4.3 – Repetição com Teste no Final (do...while)
Repete um bloco de instruções até que uma certa condição seja satisfeita.
Sua sintaxe é:
do{
instruções;
}
while (expressão_lógica);
Neste caso, todos os comandos entre as palavras reservadas do e while serão executadas, até que a
expressão lógica seja verdadeira.
Exemplo:
#include <iostream>
using namespace std;
int main(){
int opcao;
do {
system("cls");
cout<< "1 - Executar" << endl;
cout<< "2 - Sair" << endl;
cout<< endl;
cout<< "Escolha a opcao: ";
cin>> opcao;
if (opcao == 1){
cout<< "Executar uma determinada rotina" << endl;
cout<< endl;
system("pause");
}
else
if (opcao == 2){
cout<< "Sair..." << endl;
cout<< endl;
system("pause");
}
else{
cout<< "Opcao invalida. Digite 1 ou 2." << endl;
system("pause");
}
}
while (opcao != 2);
}
82
4.3.1 Exercícios – do while
1 – Cadastramento de Aluno;
2 – Lancamento de Notas;
3 – Inclusao de Plano de Estudos;
4 – Alteracao de Plano de Estudos;
5 – Alteracao de Dados Cadastrais
6 – Encerra;
Escolha a Opcao:
83
Unidade 5 – MODULARIZAÇÃO
A estrutura de uma função de usuário é muito semelhante a estrutura dos programas que escrevemos
até agora. Uma função de usuário constitui-se de um bloco de instruções que definem os
procedimentos efetuados pela função, um nome pelo qual a chamamos e uma lista de argumentos
passados a função. Chamamos este conjunto de elementos de definição da função.
Exemplo: o código mostrado abaixo é uma função definida pelo usuário para calcular a média
aritmética de dois números reais:
No exemplo acima definimos uma função chamada media2 que recebe dois argumentos tipo float: a e
b. A média destes dois valores é calculada e armazenada na variável med declarada internamente. A
função retorna, para o programa que a chamou, um valor também do tipo float: o valor da variável
med. Este retorno de valor é feito pela função return() que termina a execução da função e retorna o
valor de med para o programa que a chamou.
Depois de definimos uma função, podemos usá-la dentro de um programa qualquer. Dizemos que
estamos fazendo uma chamada a função.
void main(){
float num_1, num_2, med;
cout<< ”Digite dois números: ”;
cin>> num_1, num_2;
med = media2(num_1, num_2); // chamada a função
cout<< ”\nA media destes números e: ” << med;
}
A primeira linha da função contém a declaração da função. Na declaração de uma função se define o
nome da função, seu tipo de retorno e a lista de argumentos que recebe. Em seguida, dentro de
chaves {}, definimos o bloco de instruções da função.
O tipo de retorno da função especifica qual o tipo de dado retornado pela função, podendo ser
qualquer tipo de dado mostrado na seção 2.3: int, float, etc. Se a função não retorna nenhum valor para
o programa que a chamou devemos definir o retorno como void, ou seja um retorno ausente. Se
nenhum tipo de retorno for especificado o compilador entenderá que o retorno será tipo int.
84
Vale notar que existe apenas um valor de retorno para funções em C. Não podemos fazer o retorno de
dois ou mais valores como em algumas linguagens (no MatLab: [media,desvio] = estat(a, b, c, d, e)).
Porém isto não é um limitação séria pois o uso de ponteiros (cap. ?) contorna o problema.
Por ser um identificador, o nome da função segue as mesmas regras de definição de identificadores.
A lista de argumentos da função especifica quais são os valores que a função recebe. As variáveis da
lista de argumentos são manipuladas normalmente no corpo da função.
A chamada de uma função termina com a instrução return() que transfere o controle para o programa
chamador da função. Esta instrução tem duas finalidades: determina o fim lógico da rotina e o valor
de retorno da função. O argumento de return() será retornado como valor da função.
Existem basicamente duas posições possíveis para escrevermos o corpo de uma função: ou antes ou
depois do programa principal. Podemos ainda escrever uma função no mesmo arquivo do programa
principal ou em arquivo separado.
Quando escrevemos a definição de uma função antes do programa principal e no mesmo arquivo
deste, nenhuma outra instrução é necessária. A sintaxe geral para isto é a seguinte:
As variáveis que aparecem na lista de parâmetros da função são chamadas de parâmetros formais da
função. Eles são criados no início da execução da função e destruídos no final.
85
Parâmetros são valores que as funções recebem da função que a chamou. Portanto, os parâmetros
permitem que uma função passe valores para outra. Normalmente os parâmetros são inicializados
durante a chamada da função, pois para isto que foram criadas. No entanto, as variáveis que atuam
como parâmetros são iguais a todas as outras e podem ser modificadas, operadas, etc, sem nenhuma
restrição.
Parâmetros podem ser passados para funções de três maneiras: passagem por valor, por referência e
por ponteiro.
Forma mais comum de passagem de parâmetro. É passado um valor ou o nome do objeto. Uma cópia
do objeto é criada e os valores iniciais permanecem inalterados.
#include <iostream>
using namespace std;
int calcula(int fnum1, int fnum2){ // Recebe por valor/copia
int resultado;
cout<< "Numero de fnum1 : " << fnum1 << endl;
cout<< "Numero de fnum2 : " << fnum2 << endl<<endl;
resultado=fnum1+fnum2;
return resultado;
}
int main(){
int num1, num2;
cout<< "======== Main ========" << endl << endl;
cout<< "Digite o primeiro numero: ";
cin>> num1;
cout<< "Digite o segundo numero : ";
cin>> num2;
cout<< endl;
cout<< "======== Funcao ========" << endl << endl;
cout<< "Soma dos numeros: " <<(calcula(num1,num2)) << endl;
cout<< endl;
system("pause");
return 0;
}
O operador de referência cria outro nome para uma variável já existente. Toda operação em qualquer
dos nomes tem o mesmo resultado. A referência não é uma cópia da variável à que se refere. É a
mesma variável sob diferentes nomes.
86
Quando argumentos são passados por valor, a função não tem acesso às variáveis originais da função
chamadora, portanto não poderá modificar seus conteúdos.
Quando argumentos são passados por referência, a função recebe um outro nome para as variáveis
originais e poderá modificar os seus conteúdos. Esse mecanismo possibilita que uma função retorne
mais de um valor para a função chamadora. Os valores a serem retornados são colocados em
referências de variáveis da função chamadora.
O operador de referência cria outro nome para uma variável já existente. Toda operação em qualquer
dos nomes tem o mesmo resultado. A referência não é uma cópia da variável à que se refere. É a
mesma variável sob diferentes nomes.
#include <iostream>
using namespace std;
int calcula(int &fnum1, int &fnum2){ // Recebe por referencia
int resultado;
resultado=fnum1+fnum2;
return resultado;
}
int main(){
int num1, num2;
cout<< endl;
cout<< "Endereco de num1 : " << &num1 << endl;
cout<< "Endereco de num2 : " << &num2 << endl;
cout<< endl;
cout<< "======== Funcao ========" << endl << endl;
cout<< "Soma dos numeros: " <<(calcula(num1,num2)) << endl;
cout<< endl;
system("pause");
}
87
Exemplo 2:
O programa solicita ao usuário que insira o preço atual de uma certa mercadoria. Em seguida, modifica
o preço para um valor reajustado em 20% e calcula o valor do aumento.
#include<iostream>
using namespace std;
void reajusta(float &fpreco, float &freajuste){ // Recebe por referencia
cout<< "Valor de fpreco .....: " << fpreco << endl;
cout<< "Valor de freajuste ..: " << freajuste << endl<<endl;
cout<< "Endereco de fpreco ..: " << &fpreco << endl;
cout<< "Endereco de freajuste: " << &freajuste << endl << endl;
freajuste = fpreco * 0.2;
fpreco = fpreco * 1.2;
}
int main(){
float valpreco=0, valreaj=0;
cout<< "======== Main ========" << endl << endl;
cout << "Insira o preco atual: ";
cin >> valpreco;
cout << "Endereco do preco ..: " << &valpreco << endl;
cout << "Endereco do reajuste: " << &valreaj << endl;
cout<< endl;
cout<< "======== Funcao ========" << endl << endl;
reajusta(valpreco, valreaj);
cout << "O preco novo e ......: " << valpreco << endl;
cout << "O aumento foi de ....: " << valreaj << endl;
system("pause");
}
Funções que recebem argumentos por referência utilizam o operador & somente na declaração do tipo
do argumento.
Observe que a chamada a uma função que recebe uma referência é idêntica à chamada às funções em
que os argumentos são passados por valor.
A declaração
Indica que preco e reajuste são outros nomes para as variáveis passadas como argumentos pela função
main(). Em outra palavras, quando usamos fpreco e freajuste, estamos realmente usando valpreco e
valreaj de main().
Se uma função deseja alterar variáveis da função chamadora, as variáveis não podem ser passadas por
valor.
Em situações como essa, podemos usar referências ou ponteiros. Para usarmos ponteiros como
argumentos, devemos seguir dois passos. Primeiro, a função chamadora, em vez de passar valores para
a função chamada, passa endereços, usando o operador de endereços. Os endereços são de variáveis
que poderão ser alteradas, onde queremos colocar novos valores.
88
Segundo, a função chamada deverá criar variáveis para armazenar os endereços que estiver recebendo,
enviados pela função chamadora. Essas variáveis são ponteiros.
É passado um ponteiro para o objeto. Declara-se como parâmetro um ponteiro, que é utilizado
dentro da função para acessar o objeto. O objeto passado através do ponteiro pode sofrer
alterações.
#include <iostream>
using namespace std;
int calcula(int *fnum1, int *fnum2){ // Recebe por ponteiro
int resultado;
cout<< "Numero de fnum1 : " << fnum1 << endl;
cout<< "Numero de fnum2 : " << fnum2 << endl<<endl;
cout<< "Endereco de fnum1: " << &fnum1 << endl;
cout<< "Endereco de fnum2: " << &fnum2 << endl << endl;
resultado = *fnum1 + *fnum2;
return resultado;
};
int main(){
int num1, num2;
cout<< "======== Main ========" << endl << endl;
cout<< "Digite o primeiro numero: ";
cin>> num1;
cout<< "Digite o segundo numero : ";
cin>> num2;
cout<< endl;
cout<< "Endereco de num1 : " << &num1 << endl;
cout<< "Endereco de num2 : " << &num2 << endl;
cout<< endl;
cout<< "======== Funcao ========" << endl << endl;
cout<< "Soma dos numeros: " << (calcula(&num1,&num2)) << endl;
cout<< endl;
system("pause");
}
Exemplo 2:
O programa solicita ao usuário que insira o preço atual de uma certa mercadoria. Em seguida, modifica
o preço para um valor reajustado em 20% e calcula o valor do aumento.
#include<iostream>
using namespace std;
void reajusta(float *fpreco, float *freajuste){ // Recebe por ponteiro
cout<< "Valor de fpreco .....: " << fpreco << endl;
cout<< "Valor de freajuste ..: " << freajuste << endl<<endl;
cout<< "Endereco de fpreco ..: " << &fpreco << endl;
cout<< "Endereco de freajuste: " << &freajuste << endl << endl;
*freajuste = *fpreco * 0.2;
*fpreco = *fpreco * 1.2;
}
89
int main(){
float valpreco=0, valreaj=0;
cout<< "======== Main ========" << endl << endl;
cout << "Insira o preco atual: ";
cin >> valpreco;
cout << "Endereco do preco ..: " << &valpreco << endl;
cout << "Endereco do reajuste: " << &valreaj << endl;
cout<< endl;
cout<< "======== Funcao ========" << endl << endl;
reajusta(&valpreco, &valreaj);
cout << "O preco novo e ......: " << valpreco << endl;
cout << "O aumento foi de ....: " << valreaj << endl;
system("pause");
}
Exemplo3:
Construir um algoritmo que leia dois números do teclado. Criar funções que façam a soma, subtração,
multiplicação e a divisão desses números.
#include "iostream"
using namespace std;
int main(){
int num1,num2,res,i;
for (i=1; i <=2; i++){
cout<< "Digite o primeiro numero: ";
cin>> num1;
cout<< "Digite o segundo numero: ";
cin>> num2;
soma(num1,num2);
90
subtrai(num1,num2);
multiplica(num1,num2);
divide(num1,num2);
}
system("pause");
}
Sem modularização:
#include "iostream"
using namespace std;
int main(){
int num1,num2,res,i;
for (i=1; i <=2; i++){
cout<< "Digite o primeiro numero: ";
cin>> num1;
cout<< "Digite o segundo numero: ";
cin>> num2;
Exemplo4:
Construir um algoritmo para receber o valor do salário do teclado. Calcular o inss e o salário líquido e
ao final imprimir o inss e o salário líquido.
#include "iostream"
#include "string"
using namespace std;
int main(){
float vlrsal,salliqdo, vlrinss;
cout<< "Digite o salario: ";
91
cin>> vlrsal;
vlrinss = calcinss(vlrsal);
salliqdo = vlrsal - vlrinss;
cout<< endl;
cout<< "========== Salario Calculado ==========" << endl << endl;
92
Unidade 6 – FUNÇÕES C++
6.1 – Potência
Potências
A função pow() retorna o valor da base elevada ao expoente. Recebe dois argumentos do tipo double,
o primeiro é a base e o segundo o expoente.
#include <math.h;
pow(x, y);
X = numero base;
Y = numero expoente, 2 por exemplo(quadrado);
Sintaxe:
#include <math.h;
float base, expoente, resultado;
resultado = pow(base, expoente);
Exemplo1:
#include <iostream>
#include <math.h>
using namespace std;
int main(){
float resultado;
cout<< "\n\n";
system("pause");
}
93
Exemplo2:
#include <iostream>
#include <math.h>
using namespace std;
int main(){
float base, expoente, resultado;
cout<< "\n\n";
system("pause");
}
http://www.tiexpert.net/programacao/c/math.php
pow(x, y);
X = numero base;
Y = numero expoente, 2 por exemplo(quadrado);
#include <math.h;
Exemplo1:
94
#include <iostream>
#include <math.h>
using namespace std;
int main(){
float num, resultado;
resultado = sqrt(num);
cout<< "\nA Raiz Quadrada do Numero " << num << " e igual a " <<
resultado;
cout<< "\n\n";
system("pause");
}
95
Exemplos scanf/printf
printf ("\n");
system("pause");
}
printf ("\n");
system("pause");
}
int main(){
double num1,num2,num3,soma; // Declaração de variáveis
printf ("Digite tres numeros com ponto flutuante");
printf ("\n Primeiro numero: ");
scanf ("%lf",&num1); // Leitura de variável
96
printf (" Segundo numero : ");
scanf ("%lf",&num2);
printf (" Terceiro numero: ");
scanf ("%lf",&num3);
printf ("\nSoma ............: %.2f",(num1 + num2 + num3));
printf ("\n");
system("pause");
}
int main(){
char letra1,letra2,letra3; // Declaração de variáveis
printf ("Digite tres letras"); // Imprime mensagem na tela
printf ("\n Primeira letra: ");
scanf ("%c",&letra1); // Leitura de variável
fflush(stdin);
printf (" Segunda letra : ");
scanf ("%c",&letra2);
fflush(stdin);
printf (" Terceira letra: ");
scanf ("%c",&letra3);
printf ("\nLetras ............: %c %c %c", letra1, letra2,
letra3);
printf ("\n");
system("pause");
}
int main(){
char nome1[20];
char nome2[30];
printf ("Digite dois nomes"); // Imprime mensagem na tela
printf ("\n Primeira nome: ");
scanf ("%s",&nome1); // Leitura de variável
fflush(stdin);
printf (" Segunda nome : ");
gets(nome2);
printf ("\nNomes ............: %s", nome1);
printf ("\nNomes ............: %s", nome2);
printf ("\n");
system("pause");
}
97
Outros Exemplos
int main(){
char nome[40] = "Maria da Silva";
char sexo = 'M';
int idade = 25;
float peso = 6.5;
double mensalidade = 1000.65;
printf("Nome: %s",nome);
printf("\nSexo: %c", sexo);
printf("\nIdade: %i",idade);
printf("\nPeso: %.1f",peso);
printf("\nMensalidade: R$ %.2f",mensalidade);
getch();
}
int main(){
printf("Digite um nome .....: ");
gets(nome);
printf("Digite o sexo ......: ");
scanf("%s",&sexo);
printf("Digite a idade .....: ");
scanf("%i",&idade);
printf("Digite o peso ......: ");
scanf("%f",&peso);
printf("Digite a mensalidade: ");
scanf("%lf",&mensalidade);
printf("Nome: %s",nome);
printf("\nSexo: %c", sexo);
printf("\nIdade: %i",idade);
printf("\nPeso: %.1f",peso);
printf("\nMensalidade: R$ %.2f",mensalidade);
getch();
}
char nome[40];
char sexo;
int idade;
float peso;
double mensalidade;
int main(){
printf("Digite um nome .....: ");
gets(nome);
printf("Digite o sexo ......: ");
scanf("%s",&sexo);
printf("Digite a idade .....: ");
scanf("%i",&idade);
printf("Digite o peso ......: ");
scanf("%f",&peso);
printf("Digite a mensalidade: ");
scanf("%lf",&mensalidade);
printf("Nome: %s",nome);
printf("\nSexo: %c", sexo);
printf("\nIdade: %i",idade);
printf("\nPeso: %.1f",peso);
printf("\nMensalidade: R$ %.2f",mensalidade);
printf("\n");
system("pause");
}
99
Anexo
100
101
102
103