Escolar Documentos
Profissional Documentos
Cultura Documentos
CDD 378
22. ed.
Direitos desta edição reservados à UNITINS.
É proibida a reprodução total ou parcial desta obra sem autorização expressa da UNITINS.
Algorítmos e Programação...........................................................................93
Lógica de Programação...............................................................................175
equipe Fael
Coordenação Editorial
Leociléa Aparecida Vieira
Assessoria Editorial
William Marlos da Costa
Revisão
Juliana Camargo Horning
Lisiane Marcele dos Santos
Programação Visual e Diagramação
Denise Pires Pierin
Kátia Cristina Oliveira dos Santos
Rodrigo Santos
Sandro Niemicz
William Marlos da Costa
Você está recebendo o material da disciplina de Computação Básica. O
conteúdo está apresentado em sete aulas. Na primeira, veremos a história
da computação; na segunda, os componentes básicos do computador; e, na
terceira, você conhecerá os sistemas posicionais de numeração.
Apresentação
profissões na área de Informática.
OBJETIVOS
Plano de Ensino
CONTEÚDO PROGRAMÁTICO
• História da Computação
• Classificação de software
Aula 1
História da computação
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Como esta aula é a primeira de uma série e esta disciplina é a encarre-
gada de introduzir o estudo do conhecimento dos computadores e afins, não
há necessidade de que você tenha algum conhecimento específico da área
computacional. Recomenda-se, porém, que estude atentamente, procurando
traçar um paralelo de cada assunto abordado com a realidade atual da tecno-
logia computacional, a fim de visualizar as semelhanças existentes daquelas
com os padrões da atualidade. As informações históricas aqui contidas servirão
de base primordial para a compreensão de aspectos tecnológicos computacio-
nais conhecidos e, até mesmo, as emergentes facetas que a comunidade cien-
tífica da computação venha a apresentar.
Introdução
Você visualizará, nesta primeira aula, a linha do tempo da evolução dos
computadores, seus cientistas e povos que contribuíram para sua formação.
Vale a pena lembrar que tal linha não será vista exaustivamente, uma vez
que é inviável discorrer sobre milhares de inventos e povos que contribuíram
de alguma forma para tal evolução, mas, sim, sobre aqueles que serviram de
1.1 Dados
O ser humano sempre processou dados. Desde o momento em que um
cidadão antigo coletava pedras para representar a quantidade de ovelhas de
seu rebanho, ou escrevia nas paredes das cavernas, em cartões perfurados para
controlar o posicionamento e o movimento de agulhas do tear, ou até o tempo
em que grandes transações bancárias são efetuadas entre duas mega empresas
situadas em continentes distintos, deparamo-nos com a definição de dados.
sempre foram uma forma especial, usada pela humanidade, para exercer
controle do meio à sua volta.
Até aqui, podemos dizer que chegamos ao fim da era mecânica. Veja
como ela trouxe a base sem a qual não teríamos chegado onde estamos hoje,
e as malhas de nossas roupas não poderiam ter lindos e detalhados enfeites
intrínsecos e costurados. Vamos prosseguir para verificar como as máquinas
e descobertas daquela era influenciaram na continuidade desse processo
evolutivo.
Pai do computador, uma vez que seu invento muito se aproximava do conceito
de computador que temos na atualidade.
Tal máquina, que fora financiada por algum tempo pelo governo britânico,
era puramente mecânica, sendo composta por um engenho central (olha só,
uma CPU!), uma memória, engrenagens e alavancas. Utilizava cartões perfu-
rados e possuía dispositivos de entrada e saída de dados.
1924 – Bem, se foi difícil saber que empresa era essa que fora citada ante-
riormente, saiba que neste ano ela muda seu nome para International Business
Machine, ou a famosa IBM.
somas, no mesmo período de tempo). O ENIAC foi projetado para fins bélicos
(iniciou no apogeu da Segunda Guerra Mundial) porém somente após vários
meses o término da guerra, em 1946, esse teve sua construção concluída.
A partir dessa parte da história, você irá notar (se já não tiver notado) que
convive com boa parte da tecnologia. Estamos nos aproximando da geração
atual com a qual convivemos.
uma vez que, para cada computador vendido, mesmo de arquitetura aberta,
era quase que provável que uma licença de uso do MS-DOS seria vendida
para uso juntamente com a máquina.
Síntese da aula
Nesta primeira aula, você aprendeu detalhes esclarecedores sobre dados
analógicos e digitais. Principalmente, viajou no tempo da história da compu-
tação, aprendendo as características dos computadores de cada geração
que a tecnologia nos trouxe, incluindo a geração atual, sendo capaz de se
posicionar quanto às previsões sobre os rumos a serem tomados pela tecno-
logia vigente.
Atividades
1. Como diferenciar dado de informação?
Referências
MARÇULA, Marcelo; BENINI FILHO, Pio Armando. Informática: conceitos e
aplicações. São Paulo: Érica, 2005.
TANENBAUM, Andrew S. Organização estruturada de computadores. São
Paulo: Prentice Hall, 2007.
Na próxima aula
Agora que você já visualizou a linha do tempo da evolução dos compu-
tadores, na próxima aula, você irá estudar sobre a estrutura física (hardware)
básica dos computadores da atualidade. Conhecer as facetas internas dos
computadores modernos lhe dará maior embasamento e autoridade tanto
para discutir sobre os mesmos quanto para desenvolver programas que sejam
executados nessas plataformas.
Anotações
Aula 2
Componentes básicos
do computador
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
• conhecer os principais componentes formadores do computador
moderno;
• compreender, conceitualmente, o modo de execução de instruções de
um computador.
Pré-requisitos
Chegamos à segunda aula, que abordará um tema conceitual, porém não
menos importante para o curso, que recomenda fortemente o estudo da aula ante-
rior. O estudo da aula anterior se faz importante devido ao fato de ser a base
teórica para uma melhor compreensão dos componentes atuais formadores do
computador moderno, que serão estudados nesta aula. Ter conhecimentos sobre,
por exemplo, a máquina Von Neumann, o armazenamento de dados e outros impor-
tantes conceitos é condição necessária para que você possa ter o melhor proveito
desta e de outras aulas de nossa disciplina e, conseqüentemente, do curso.
Introdução
Você conhecerá, nesta segunda aula, os componentes internos e externos
que formam o computador contemporâneo de nossa época. Veremos como
esses componentes se relacionam entre si para que o conceito de computador se
torne uma realidade prática e, portanto, útil para a resolução de problemas.
2.3.3 Registradores
Os Registradores são pequenas memórias que servem para auxiliar o
processador, armazenando resultados temporários, durante o processo de
cálculo. Pense que o processador teria de se esforçar muito mais para realizar
operações sem esses registradores internos, pois, se assim fosse, teria de utilizar
a memória principal, que está mais longe, externa ao processador.
Existem registradores com funções genéricas e específicas que são muito
mais rápidos do que aqueles, porém são preparados para responder a
apenas um tipo fixo de operação, enquanto os genéricos, diversas, tal qual
a memória principal. Os registradores são memórias internas para uso geral,
usados pela ULA para armazenar dados (caracteres, números binários) que
estão sendo processados.
Exemplo de registradores gerais: AX, BX, usados para armazenar números
binários. Exemplo de registrador específico: IP, Instruction Pointer, armazena
a referência do endereço da memória principal (RAM) que contém a próxima
instrução a ser executada.
Síntese da aula
Nesta segunda aula, você conheceu os componentes fundamentais do
computador moderno e aprendeu detalhes conceituais sobre os mesmos, além
de entender diferenças entre arquiteturas de processadores e o modo como um
computador executa instruções.
Atividades
1. Cites os três componentes principais de um computador moderno.
2. Associe um verbo chave para cada um dos componentes que você citou na
primeira questão.
3. Cites os componentes que compõem a CPU.
4. Descreva as funções da ULA.
5. Qual o papel da UC?
6. O que é RAM e qual a sua função?
7. Qual a diferença entre os registradores da CPU e a memória principal
(RAM)?
8. Qual a função do IP (Instruction Pointer) no processo de se executar uma
instrução?
9. Explique a frase: “Para o RISC, quanto menor, melhor”.
10. Se o RISC é mais rápido que o CISC, qual o motivo da Intel, típica fabri-
cante de processadores CISC, ser líder de mercado?
projeto do menor número de micro instruções possível para alcançar, com isso,
maior performance (velocidade) de execução.
Na atividade 10, embora o padrão RISC seja mais rápido do que o padrão
CISC, os processadores CISC da Intel facilitam a vida dos desenvolvedores de
software devido ao grande leque de instruções disponíveis, bem como ao prin-
cípio a retro compatibilidade empregado pela empresa, que preza pelo fato
de um programa, construído uma única vez, poder executar em futuras versões
de seu processador CISC.
Referência
Tanenbaum, Andrew S. Organização estruturada de computadores. São
Paulo: Prentice Hall, 2007.
Na próxima aula
Agora que você já compreendeu detalhes importantes sobre a arquitetura
de computadores modernos (sua estrutura física) e conheceu detalhes de seus
componentes internos, você está pronto para se aprofundar na maneira como
o computador armazena suas informações, ou seja, utilizando-se do sistema de
numeração binário. Também verá a importância da conversão inter-sistemas
numéricos, principalmente entre o sistema binário (usado pelo computador) e
o sistema decimal (usado pelo homem).
Anotações
Aula 3
Sistemas posicionais
de numeração
Objetivo
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Para iniciar os estudos desta aula, é importante conhecer a história da
computação, estudado na primeira aula deste caderno, para que fique mais
clara a necessidade e a importância dos sistemas posicionais de numeração.
Também se faz necessário ter noções dos componentes básicos do compu-
tador, conteúdos vistos na aula dois, uma vez que são eles que fazem uso de
uma das representações que será estudada nesta aula: o sistema binário.
Introdução
Ao longo da evolução humana, desde os primórdios, quantificar coisas,
objetos, rebanhos, entre outros, emergiu como uma necessidade. Assim, os
números se tornaram presentes, desde cedo, na civilização.
Entretanto a representação numérica da forma como a conhecemos hoje
não é uma invenção que apareceu de um dia para o outro e nem conseqüência
de uma única mente inventiva. A utilização dos dedos da mão para representar
quantidade, ou seja, alguma grandeza numérica, talvez seja a primeira forma
que apareceu. Hoje em dia parece natural essa forma de representação, afinal
é comum vermos crianças indicarem suas idades com os dedos da mão.
Pedras, nós em cordas, marcas em um osso e símbolos unitários pintados
nas paredes de cavernas também são outras formas de representação numérica.
Imagine-se nas cavernas representando o número quinze nas paredes desta forma:
| | | | | | | | | | | | | | |. É fácil perceber que é uma tarefa exaustiva.
Romana Representação
I Um
II Dois
III Três
IV Quatro
V Cinco
IX Nove
X Dez
C Cem
CXVI Cento e dezesseis
D Quinhentos
DCXX Seiscentos e vinte
M Mil
MMVIII Dois mil e oito
٠, ٩, ٨, ٧, ٦, ٥, ٤, ٣, ٢, ١
Note que nessa representação (ao contrário da romana) aparece o número
zero, uma invenção indo-arábica das mais importantes da humanidade. Nessa
forma de representação numérica, dez símbolos diferentes são utilizados para
se representar qualquer número natural. Esse sistema numérico é o mais ampla-
mente conhecido e utilizado atualmente e é conhecido como sistema decimal
ou sistema numérico posicional de base 10.
em que:
n = quantidade de algarismos - 1
Exemplo
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
Note que A=10, B=11, C=12, D=13, E=14 e F=15. Lourenço e outros
(1996, p. 7) dizem que “outros símbolos poderiam ser utilizados para repre-
sentar as quantidades maiores que 9, porém, as letras foram escolhidas pela
facilidade de manuseio”.
A lei de formação também rege o sistema hexadecimal, uma vez que ele
também é um sistema de representação posicional.
Exemplo
O número A29F no sistema hexadecimal, de acordo com a lei de formação, é
composto da seguinte forma:
Exemplos
Exemplos
(11011)2:
b = 2 (base do número)
n = 5 – 1 = 5 (quantidade de algarismos – 1)
1x24 + 1x23 + 0x22 + 1x21 + 1x20
16 + 8 + 0 + 2 + 1 = (27)10
(3D9)16:
b = 16 (base do número)
n = 3 – 1 = 2 (quantidade de algarismos – 1)
3x162 + Dx161 + 9x160
3x162 + 13x161 + 9x160
768 + 208 + 9 = (985)10
Exemplo
(125)10 : ( ? )2
125 ÷ 2 = 62 e resto = 1
62 ÷ 2 = 31 e resto = 0
31 ÷ 2 = 15 e resto = 1
15 ÷ 2 = 7 e resto = 1
7 ÷ 2 = 3 e resto = 1
3 ÷ 2 = 1 e resto = 1
125 2
1 62 2
0 31 2
1 15 2
1 7 2
sentido da leitura
1 3 2
1 1
(125)10 = (1111101)2
Figura 3 – Exemplo de múltiplas divisões na conversão do número (125)10 para a base 2
Fonte: Lourenço e outros (1996).
(1010011011)2
0010 1001 1011
2 9 B
(54B)16
5 4 B
Exemplo
(1010011011)2
001 010 011 011
1 2 3 3
(543)8
5 4 3
(543)8
5 4 3
1 6 3
Exemplo
(1F4B)16
1 F 4 B
1 7 5 1 3
Número = anbn + an–1bn–1 + an–2bn–2 + ... + a0b0 + a–1b–1 + a–2b–2 + ... + a–mb–m
em que:
0,2 x 8 = 1,6 1
0, 6 x 8 = 4,8 4
0,8 x 8 = 6,4 6
0,4 x 8 = 3,2 3
0,2 x 8 = 1,6 1
Síntese da aula
O ser humano desde sempre teve a necessidade de quantificar coisas, por
isso a importância de sistemas numéricos. Além disso, com as representações
numéricas torna-se possível realizar tarefas antes complexas de forma trivial.
Dentre as várias formas de representações, destacam-se a decimal (com dez
símbolos de representações), a binária (com dois símbolos) – amplamente
utilizada nos computadores, a octal (com oito símbolos) e a hexadecimal (com
dezesseis símbolos).
Atividades
1. Realize a conversão dos números a seguir de acordo com as bases
indicadas.
a) (F46A)16 = ( ? )10 c) (1001101)2 = ( ? )16
b) (295)10 = ( ? )2 d) (1A42)16 = ( ? )8
e) (765)8 = ( ? )10 g) (101,001)2 = ( ? )10
f) (1024)10 = ( ? )16 h) (B1,5)16 = ( ? )10
Referências
GATES, Bill. A estrada do futuro. São Paulo: Companhia das Letras, 1995.
IDOETA, Ivan V.; CAPUANO, Francisco G. Elementos de eletrônica digital.
28. ed. São Paulo: Érica, 1998.
LOURENÇO, Antonio C.; CRUZ, Eduardo C. A.; FERREIRA, Sabrina R.;
CHOUERI JÚNIOR, Salomão. Circuitos digitais. São Paulo: Érica, 1996.
WEBER, Raul F. Fundamentos de arquitetura de computadores. 3. ed. Porto
Alegre: Sagra Luzzatto, 2004.
Na próxima aula
Estudaremos as operações aritméticas no sistema binário e, assim, daremos
continuidade ao que foi visto nesta aula, mas em uma abordagem de opera-
ções matemáticas.
Anotações
Aula 4
Operações aritméticas no
sistema binário de numeração
Objetivo
Esperamos que, ao final desta aula, você seja capaz de:
• realizar as operações aritméticas no sistema binário de numeração
utilizando números inteiros e de ponto flutuante.
Pré-requisitos
Para iniciarmos os estudos sobre operações aritméticas no sistema binário
de numeração, é de suma importância o conhecimento dos sistemas posicio-
nais de numeração, vistos na aula 3. O sistema binário é um dos sistemas
posicionais de numeração, por isso a necessidade de estar familiarizado com
esse tipo de sistema numérico.
Introdução
O sistema binário é um sistema de numeração posicional representado, em
que todos os número são representados pelo conjunto de caracteres formados
apenas por dois símbolos, 0 (zero) e 1 (um).
Os computadores digitais trabalham internamente com esse tipo de sistema,
que também são denominamos como bits e podem representar qualquer tipo de
número armazenado na memória. Esses números podem representar inteiros,
ponto flutuante, negativos ou positivos.
A manipulação desses números por meio de aritmética simples e por meio
de aritmética de ponto-flutuante é realizada utilizando algoritmos diversos, os
quais serão apresentados durante esta aula.
Tabela 1 – Complementos de 1 e de 2
Binário Complemento de 1 Complemento de 2
11100110 00011001 00011010
10100010 01011101 01011110
00100100 11011011 11011100
(vai um) 1 1
6= 0 1 1 0
+7= 0 1 1 1
13 = 1 1 0 1
Figura 1: Operação de adição com carries ocorrendo antes do bit mais significativo
(vai um) 1 1 1
10 = 0 1 0 1 0
+7= 0 0 1 1 1
17 = 1 0 0 0 1
Figura 2: Operação de adição com carry ocorrendo no bit mais significativo
(vai um) 1 1 1 1 1 1
15 = 0 0 0 0 1 1 1 1
-6= 1 1 1 1 1 0 1 0
9= 1* 0 0 0 0 1 0 0 1
Figura 3: Soma de números binários em complemento de 2 (*Carry descartado)
* * *
14 = 1 1 1 0
–7 = 0 1 1 1
7= 0 1 1 1
Figura 4: Operação de subtração entre dois números
7 = 00111
2 = 00010
1 0 1 1 Multiplicando
X 1 0 1 0 Multiplicador
0 0 0 0
+ 1 0 1 1
+ 0 0 0 0
+ 1 0 1 1
1 1 0 1 1 1 0
Figura 6: Exemplo de multiplicação com binários
1 1 0 1 0
– 1 0 1 1
0 1 0
– 1 0
0 0
Figura 7: Exemplo de divisão com binários
Mano (1998) descreve os algoritmos que podem ser utilizados nas opera-
ções aritméticas de ponto flutuante, pois como muitos computadores não
possuem a aritmética de ponto-flutuante implementada em hardware, é preciso
tratá-la via software. Os algoritmos são os a seguir.
• se for uma soma e uma das parcelas for zero – o resultado é igual a
outra parcela;
4.7.2 Multiplicação
Verifica-se se uma das mantissas a operar é zero; caso afirmativo, o resul-
tado é zero.
Se não houver zeros:
• somar os expoentes;
• multiplicar as mantissas;
• normalizar o resultado.
4.7.3 Divisão
Verifica-se se uma das mantissas a operar é zero; caso afirmativo:
• se o divisor é zero, é impossível e dispara uma exceção de divisão
por zero;
• se o dividendo é zero, o resultado é igual a zero.
Se não houver zeros:
• subtrair os expoentes;
• dividir as mantissas;
• normalizar o resultado.
Para se padronizar a implementação de aritmética de ponto-flutuante em
CPUs, foi criado em 1985 o padrão IEEE 754, o qual está implementado
atualmente na grande maioria das CPUs. O padrão IEEE 754 dita algumas
características citadas em Viana (2005), que são:
• a base de representação é a binária;
• as operações devem ser executadas em precisão estendida com uso
de dígitos de guarda e expoente deslocado;
Além dos erros que podem ser ocasionados por arredondamento, alguns
efeitos afetam a qualidade dos cálculos, como cancelamento, propagação de
erros, instabilidade numérica e mau condicionamento. Esses quatro tipos de
erros são relatados da seguinte forma:
Síntese da aula
Nesta aula, vimos que as operações aritméticas sobre números binários
obedecem sempre aos mesmos princípios das operações em outras bases.
Pudemos conhecer também alguns algoritmos que possibilitam que as opera-
ções fiquem mais velozes quando implementadas em hardware. Também
vimos, na aula 4, que a aritmética de ponto flutuante é bem mais complicada
e ajuda a entender melhor as dificuldades de desenvolvimento de circuitos
que suportam aritmética de ponto-flutuante. As operações aritméticas sobre
números binários são de extrema importância para os computadores digitais
atuais, pois somente com uma aritmética simples e eficiente podemos chegar a
unidades lógicas e aritméticas aceitáveis.
Atividade
1. Desenvolva as operações aritméticas envolvendo os seguintes números
binários:
a) 01110011 + 01110101
b) 11010001 – 00101111
c) 11011010 * 11010
d) 11011000 / 10
Comentário da atividade
Na atividade 1, trabalharemos a capacidade de o aluno desenvolver as opera-
ções aritméticas básicas utilizando números binários. Os resultados das operações
são os seguintes, utilizando o método de resolução proposto na lição 4:
a) (vai um) 1 1 1 1 1 1
0 1 1 1 0 0 1 1
+ 0 1 1 1 0 1 0 1
1 1 1 0 1 0 0 0
b) (empresta) * * * * *
1 1 0 1 0 0 0 1
– 0 0 1 0 1 1 1 1
1 0 1 0 0 0 1 0
c) 1 1 0 1 1 0 1 0
x 1 1 0 1 0
0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 1 0
+ 0 0 0 0 0 0 0 0
1 1 0 1 1 0 1 0
+ 1 1 0 1 1 0 1 0
1 0 1 1 0 0 0 1 0 0 1 0 0
d) 1 1 0 1 1 0 0 0 1 0
1 0 1 1 0 1 1 0 0
0 1 0
1 0
0 0 1 1
1 0
0 1 0
1 0
0 0 0 0
Referências
CASTRO, F. C. C. Eletrônica digital. Porto Alegre: PUC-RS, 2002.
CASTRO, M. C. S. Organização de computadores I. Rio de Janeiro: Universidade
do Estado do Rio de Janeiro, 2005.
Mano, R. Representação de dados. Disponível em: <http://wwwusers.rdc.
puc-rio.br/rmano/rd6aritr.html>. Acesso em: 20 dez. 2007.
VIANA, G. V. R. Padrão IEEE 754 para aritmética binária de ponto flutuante.
Fortaleza: Universidade Estadual do Ceará, 2005.
Na próxima aula
Veremos as classificações de software que podem servir para diversos fins.
Anotações
Aula 5
Classificação de software
Objetivo
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Para iniciarmos os estudos sobre as classificações de software, é interes-
sante que tenha sido absorvido todo o conteúdo das aulas anteriores. Isso dará
embasamento teórico para que possam ser interpretados todos os conceitos
e características que serão considerados nesta aula e são de extrema impor-
tância para o mercado.
Introdução
A criação de software, ou como conhecido popularmente programa
para computador, consiste em uma área da ciência da computação muito
importante, em que é considerada a criação de produtos de software por
meio da utilização de ferramentas de desenvolvimento, pagas ou não, além
de considerar todo um patrimônio intelectual e ideológico de seus criadores
(MOLINARI, 2007).
Esse tema, por sua vez, apresenta diversas vertentes e discussões que
devem ser consideradas quanto à distribuição e comercialização de um
produto de software. Entre tais vertentes, temos a criação de software
proprietário ou livre, que consiste no ponto central de muitas discussões.
Assim, nesta aula, serão apresentados os principais conceitos e caracte-
rísticas que o auxiliarão a compreender tais classificações de software.
Bons estudos!
Isso define com clareza a intenção por trás de um software livre, em que a
caracterização como livre ou não, não consiste necessariamente em sua gratui-
dade. Mas você deve estar se perguntando: “mas não é gratuito? Onde está
a liberdade nisso então?” Fique calmo, iremos trabalhar com mais detalhes as
subdivisões dessa interessante classificação de software.
Agora você deve estar se questionando: “mas como trabalhar para torná-lo
melhor se foi outra pessoa que o criou, o que posso fazer?” Aí entra uma
característica importantíssima de um software livre, que consiste na disponibili-
zação de seu código fonte para que outras pessoas possam utilizar, alterar ou
mesmo re-distribuir o software com suas alterações. Isso contribui sensivelmente
para que diversas pessoas tenham acesso à informação, difundindo conheci-
mento e incentivando a pesquisa científica (FSF, 2007).
A (FSF, 2007) menciona que, para que um software seja considerado livre,
ele deve necessariamente possuir os quatro princípios da liberdade. São elas:
Saiba mais
Como pode ser visto, o acesso ao código fonte é um dos pilares para a
caracterização de um software livre. Isso não significa que o mesmo não seja
comercial, muito pelo contrário. A idéia de se ganhar dinheiro com software
livre não está na venda de produtos fechados, mas sim na venda de serviços
de qualidade que estão, a todo momento, expostos, sendo colocados à prova
e ao julgamento da comunidade (MOLINARI, 2007).
Esse tipo de software segue todos os preceitos citados até aqui nesta aula,
no qual o código fonte é distribuído e é permitido que esse seja modificado e
redistribuído, levando em consideração os princípios de liberdade do software
original. Isso auxilia na prevenção de sua utilização sem fins comerciais, estando
sujeitos aos termos da licença GPL. Alguns exemplos de softwares open source
são o kernel do sistema operacional Linux e o projeto Web Apache TomCat,
que podem ser alterados e redistribuídos (FSF, 2007).
Saiba mais
Isso provoca discussões que mostram como é difícil definir qual a melhor
forma de distribuição de software. As classificações apresentadas nesta aula
apontam para diversos pontos que devem ser considerados e que influen-
ciam diretamente na contextualização e, por conseqüência, classificação dos
softwares, como valores culturais e contribuições sociais. São vertentes comple-
tamente diferentes que apresentam prós e contras, mas que, com certeza,
contribuem para um melhor modelo de produção de conhecimento e dissemi-
nação da informação, cada uma à sua maneira.
Síntese da aula
Nesta aula, apresentamos as características e conceitos relacionados a
classificação de software. Esses podem ser divididos em duas vertentes: a
livre e a considerada proprietário. Além disso, conhecemos nomenclaturas
comuns a classificação dos softwares como: freeware, adware, shareware,
demo e trial. Cada uma destas distribuições caracteriza o software quanto às
suas limitações e tempo de utilização. Finalizando, são apresentadas algumas
classificações menos conhecidas, como a Shared Source.
Atividades
1. Diversos aspectos e características podem ser utilizados para que um
software seja considerado livre. Porém, com certeza, os quatro princípios
de liberdades exigidos pela GPL (General Public Lincense) são os mais
conceituados. Quais são eles e em que consistem? Justifique sua resposta.
2. Quanto aos softwares proprietários, podem ser distribuídos como versões
de teste. Dessa forma, qual a diferença entre as versões shareware e trial?
Referências
FSF, Free Software Foundation. Free Software. Disponível em: <http://www.
gnu.org>. Acesso em: 20 dez. 2007.
MOLINARI, Leonardo. Gerência de configuração: técnicas e práticas no desen-
volvimento do software. Florianópolis: Visual Books, 2007.
OSI, Open Source Iniciative. Open Source. Disponível em: <http://www.open-
source.org>. Acesso em: 20 dez. 2007.
Na próxima aula
Veremos os conceitos relacionados a noções básicas tanto de redes de
computadores quanto de banco de dados.
Aula 6
Noções básicas de redes de
computadores e banco de dados
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Para o aprendizado desta aula, não há necessidade de conhecimentos
anteriores, apenas que você tenha força de vontade para conhecer novas
tecnologias e procure saber mais sobre o que será falado aqui em sites e livros
relacionados com essas duas áreas.
Introdução
A interligação de computadores ou uma rede de computadores se faz
necessário pelo fato de que há uma grande facilidade em trocar informações
sem a necessidade de mídias como disquete, CD ou DVD, como também
compartilhar informações e aplicativos. Os bancos de dados têm como finali-
dade gerar uma determinada informação por meio de um agrupamento logi-
camente coerente de dados.
• redes locais (LAN – Local Área Network): são interligações entre compu-
tadores em uma área geralmente menor que 10km, de alta velocidade
e de baixas taxas de erro;
Saiba mais
Tanto na ligação ponto-a-ponto como na multiponto podemos ter três tipos de comuni-
cações usadas no enlace dos dados, que são: simplex, usa apenas um dos sentidos
do enlace; a half-duplex, que utiliza os dois sentidos do enlace, mas um por vez; e a
full-duplex, que utiliza os dois sentidos do enlace simultaneamente.
Podemos observar que o meio de transmissão entre cada uma dessas inter-
ligações de computadores é diferenciado, como veremos na seção a seguir.
• cabo de fibra óptica: são cabos que transmitem dados por meio
de feixes de luz e que podem chegar a grandes distâncias. Seu
revestimento é feito de uma mistura de vidro, plástico e outros
componentes.
Saiba mais
Outro meio físico de comunicação é o ar, as chamadas redes wi-fi ou wireless como,
por exemplo, ondas de rádio digital, satélites e espectro de difusão, que também
podem transmitir dados a grandes distâncias e em grandes velocidades.
Saiba mais
Na comunicação entre esses dispositivos, temos quatro tipos de envio de dados, que
são: anycast, em que a transmissão da informação é enviada e distribuída ao receptor
mais próximo definido pelo roteador; broadcast, em que a transmissão da informação
é enviada a muitos receptores ao mesmo tempo; multicast, em que a informação é
enviada a vários receptores simultaneamente, utilizando a melhor estratégia de rotea-
mento; e unicast, em que a transmissão da informação é feita a um único receptor.
Saiba mais
Síntese da aula
Nesta aula, vimos conceitos e características de uma rede de computadores e
banco de dados em que podemos enviar informações de um computador para o
outro por meio de conexões de variados tipos e a longas distâncias. Além disso,
podemos guardar essas informações e manipulá-las de acordo com as permissões
de cada usuário por meio de um SGBD.
Atividades
1. Em que consiste uma rede de computadores?
2. Qual a finalidade de um SGBD (Sistema de Gerenciamento de Banco de
Dados)?
Referências
RAMALHO, J. A. SQL: a linguagem dos bancos de dados. 2. ed. São Paulo:
Berkeley, 1999.
SOUSA, L. B. Redes de computadores: dados, voz e imagem. São Paulo: Érica.
1999.
TANENBAUM, A. S. Redes de computadores. 4. ed. Rio de Janeiro: LTC, 2004.
WIKIPEDIA. Banco de Dados. Disponível em: <http://pt.wikipedia.org/wiki/
Banco_de_dados>. Acesso em: 20 dez. 2007.
______. Broadcast. Disponível em: <http://pt.wikipedia.org/wiki/Broadcast>.
Acesso em: 20 dez. 2007.
______. Rede de computadores. Disponível em: <http://pt.wikipedia.org/wiki/
Rede_de_computadores>. Acesso em: 20 dez. 2007.
Na próxima aula
Veremos os tipos de profissões, as definições e como é o profissional de
cada uma delas.
Anotações
Aula 7
Profissões na área
de Informática
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
O entendimento das aulas anteriores o tornará capaz de identificar os diversos
segmentos atuais da área de Informática, tais como: comunicação de dados, cons-
trução de softwares, arquitetura física de componentes de informática, entre outros.
Introdução
Atualmente, com o avanço diário dos recursos computacionais, a informá-
tica está inserida nos mais diversos segmentos produtivos da sociedade. Junto
a essa realidade, soma-se o fato de os computadores terem se tornado, hoje,
um acessório tão comum quanto uma TV ou geladeira nos lares, estabeleci-
mentos comerciais e industriais.
a) Engenharia da Computação
c) Analista de Sistemas
Saiba mais
Nos Estados Unidos, não existe diferença entre Engenharia da Computação e Ciência
da Computação, diferentemente do Brasil, onde a diferença básica é que Ciência da
Computação é um curso mais prático, enquanto Engenharia de Computação é um
pouco mais amplo, com conteúdos de Engenharia Elétrica, Engenharia de Sistemas e
mesmo de Ciência da Computação.
b) Administrador de Redes
c) Analista de Segurança
d) Analista de Sistemas
f) Analista de Suporte
g) Auditor de Sistemas
h) Engenheiro de Hardware
i) Engenheiro de Software
j) Engenheiro de Telecomunicações
k) Programador Web
l) Técnico em Hardware
m) Webdesigner
n) Webdeveloper
o) Webmaster
As profissões de Informática são, hoje, umas das poucas que ainda não
possuem um órgão regulamentador. Ao contrário do que ocorre com as profis-
sões da área de Direito, Medicina, Odontologia, Contabilidade, Jornalismo,
Administração, entre outras, qualquer pessoa que acredite possuir conhe-
cimento e competência suficientes para atuar na área e disponibilizar seus
serviços ao mercado pode atuar como profissional da área de Informática.
Várias tentativas foram feitas para solidificar esta profissão como algo inde-
pendente e bem definido, com seu espaço próprio no mercado de trabalho.
Sindicatos e associações profissionais e empresariais foram fundados.
Entretanto, esta consolidação não se dá.
A seguir, estão listados alguns Projetos de Lei (PL) com tentativas de regu-
lamentar a profissão:
• PL815/1995;
• PL 2194/1996 em 01/agosto/1996;
• PL 981/1999 em 20/maio/1999;
• PL 6639/2002 em 24/abril/2002;
• PL 1561/2003 em 29/julho/2003;
• PL 1746/2003 em 08/agosto/2003;
• PL 1947/2003 em 09/setembro/2003;
• PL 7109/2006.
Síntese da aula
Nesta aula, você aprendeu que a formação acadêmica na área de Informática
possui diversos nomes, com currículos similares e também com formações diferen-
ciadas, devido ao fato de não possuir um órgão que regulamente as atividades
dos profissionais na área de informática. Como exemplo disso, temos os cursos
de Informática, Análise de Sistemas, Ciência da Computação, Engenharia de
Computação, Engenharia de Informação, Sistemas de Informação entre outros.
Atividades
1. Analise as assertivas e destaque, entre as atribuições de um profissional que
obteve a formação em Engenharia da Computação, qual(is) podemos citar.
a) V, V, F, V
b) F, V, F, V
c) F, F, V, V
d) V, V, V, F
Referências
ALMEIDA, Marcus Garcia de. Fundamentos de Informática. 2. ed. Rio de
Janeiro: Brasport, 2002.
BROOKSHEAR, J. Glenn. Ciência da Computação: uma visão abrangente.
7. ed. Porto Alegre: Bookman, 2004.
MARÇULA, Marcelo; BENINI FILHO, Pio Armando. Informática: conceitos e
aplicações. São Paulo: Érica, 2005.
POLLONI. Enrico G. F.; FEDELI, Ricardo Daniel; PERES, Fernando Eduardo.
Introdução à Ciência da Computação. São Paulo: Thomson, 2003.
VELLOSO, Fernando de Castro. Informática: conceitos básicos. 7. ed. Rio de
Janeiro: Campus, 2004.
Anotações
Coordenação Editorial
Maria Lourdes F. G. Aires
Assessoria Editorial
Darlene Teixeira Castro
Revisão Didático-Pedagógica
Sibele Letícia Rodrigues de Oliveira Biazotto
Revisão Lingüístico-Textual
Sibele Letícia Rodrigues de Oliveira Biazotto
Revisão Digital
Sibele Letícia Rodrigues de Oliveira Biazotto
Projeto Gráfico
Douglas Donizeti Soares
Irenides Teixeira
Katia Gomes da Silva
Ilustração
Geuvar S. de Oliveira
Capa
Igor Flávio Souza
Equipe Fael
Coordenação Editorial
Leociléa Aparecida Vieira
Créditos
Assessoria Editorial
William Marlos da Costa
Revisão
Juliana Camargo Horning
Lisiane Marcele dos Santos
Apresentação
necessário estudar a sua sintaxe, ou seja, as formas como os comandos e expres-
sões devem ser escritos. Felizmente, a C é uma linguagem de sintaxe simples e
elegante que permite rápido entendimento pelo programador, mesmo iniciante.
Bons estudos!
OBJETIVOS
Plano de Ensino
CONTEÚDO PROGRAMÁTICO
• Introdução à Programação em Linguagem C
• Operadores
• Estruturas de controle
• Arquivos
BIBLIOGRAFIA
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi
de. Fundamentos da programação de computadores: Algoritmos, Pascal e C/
C++. São Paulo: Pearson Prentice Hall, 2003.
DEITEL, H. M.; DEITEL, P. J. Como programar em C. Rio de Janeiro: LTC, 1999.
MIZRAHI, V. V. Treinamento em Linguagem C: Módulos 1 e 2. São Paulo:
Makron Books do Brasil, 1993.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
ZIVIANI, Nivio. Projeto de Algoritmos: com implementações em Pascal e C.
2. ed. São Paulo: Thomson, 2004.
Aula 1
Introdução à programação em
Linguagem C
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Para atingir os objetivos desta aula, você deve possuir conhecimento prévio
de técnicas de criação de algoritmos, particularmente de pseudocódigo. Isso é
necessário, na verdade, para todas as aulas que compõem este caderno, pois
ao longo do texto são feitas referências aos conceitos estudados nas aulas de
Lógica para Programação. Procure sempre relacionar os conteúdos estudados
nesta disciplina com as outras.
Introdução
O histórico da Linguagem C tem início em 1970, quando o programador
Denis Ritchie desenha uma linguagem, nos laboratórios da Bell Telephones,
Inc., chamada simplesmente de B. No ano de 1978, Brian Kerningham
junta-se a Ritchie para aprimorar a Linguagem B e acabam gerando uma
nova versão. À nova versão foi dado o nome de C. Por suas características
de portabilidade e estruturação mais compacta, a Linguagem C se torna
popular entre os programadores.
As idéias por trás de C são tão simplificadoras e naturais que ela serve de
base para outras linguagens. Muitos compiladores e ambientes de desenvolvi-
mento (IDE) de outras linguagens são implementados em Linguagem C.
Caracteres válidos:
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
1234567890
+-*/\=|&!?#%(){}[]_‘“.,:<>
1.1.2 Palavras-chave
São identificadores que não podem ser usados pelo usuário – para
identificar uma variável ou função, por exemplo, e também são ou consti-
tuem partes de comandos ou declarações da linguagem.
1.1.3 Comentários
/*
Fulano de Tal
*/
Cabe ainda sugerir que você utilize identificadores com sentido explí-
cito. Por exemplo, se você tiver de criar uma variável para armazenar a
soma total de produtos, deve utilizar um identificador como soma_total_
produtos, ao invés de usar soma ou apenas n.
É importante lembrar também que você não poderá usar como iden-
tificador de variável nem o mesmo identificador de uma palavra-chave
nem o de uma função já definida em uma biblioteca ou no próprio
programa.
Tamanho
Tipo de dado Capacidade de representação
(em bits)
Char 8 -127 a 127
unsigned char 8 0 a 255
signed char 8 -127 a 127
Int 16 -32767 a 32767
unsigned int 16 0 a 65.535
signed int 16 -32767 a 32767
short int 16 -32767 a 32767
unsigned short int 16 0 a 65.535
signed short int 16 -32767 a 32767
long int 32 -2.147.483.647 a 2.147.483.647
signed long int 32 -2.147.483.647 a 2.147.483.647
unsigned long int 32 0 a 4.294.967.295
Float 32 seis dígitos de precisão
Double 64 dez dígitos de precisão
long double 80 dez dígitos de precisão
Fonte: Feitosa (2004).
1.1.5.3 Constantes
Constantes são valores que são mantidos fixos pelo compilador. Para o C,
uma constante pode ter quatro classificações. Vejamos.
Código Significado
\b Retrocesso (back)
\f Alimentação de formulário (form feed)
\n Nova linha (new line)
\r Retorno de carro (carriage return)
\t Tabulação horizontal (tab)
\” Aspas
\’ Apóstrofo
\0 Nulo (0 em decimal)
\\ Barra invertida
\v Tabulação vertical
Para ler um caractere do teclado, utilize a função getchar(). Ela faz parte
do arquivo de cabeçalho stdio.h. Sua utilização é:
variavel = getchar();
Para exibir um caractere, você pode usar a função putchar(), que está no
arquivo de cabeçalho stdio.h. Sua sintaxe é:
putchar(variavel)
em que variável é um número inteiro, porém você pode passar variável como um
caractere. putchar retorna o caractere exibido ou EOF, caso ocorra algum erro.
Você pode ler uma string do teclado usando as funções gets() e fgets(). Elas
fazem parte do arquivo de cabeçalho stdio.h.
fgets (STRING,TAMANHO,STREAM),
em que:
Você pode exibir uma string usando a função printf ou a função puts(). Elas
fazem parte do arquivo de cabeçalho stdio.h.
printf(“%s”,STRING);
A sintaxe de puts é:
puts(string)
em que:
Especificador Formato
%g float. C escolhe melhor maneira de exibição
%G entre normal e exponencial
%s string
%p endereço de um ponteiro
%n quantos caracteres a função printf exibiu
Fonte: Dias Neto ([200-]).
#include <stdio.h>
/* Programa exemplo */
int main()
{
int n = 0;
int x;
printf (“Digite um valor inteiro: “);
scanf (“%d”, x);
}
Nesse exemplo, você pode reconhecer os principais elementos de um
programa em C:
• um cabeçalho contendo as diretivas de compilador: nesse caso, a diretiva
#include <stdio.h> diz ao compilador para incluir a biblioteca stdio;
Síntese da aula
Nesta aula, apresentamos os conceitos fundamentais da programação
em Linguagem C. Abordamos os componentes principais de um programa
nessa linguagem, como a declaração de variáveis, os tipos de dados, entre
outros. A partir do conteúdo estudado nesta aula, já é possível codificar
programas simples usando a Linguagem C.
Atividades
1. Com base em seus conhecimentos sobre a Linguagem C, indique a
alternativa incorreta.
#include <stdio.h>
int main()
{
int var1;
float var2;
printf (“\nInforme o valor inteiro: “);
scanf (“%d”, &var1);
printf (“\nInforme o valor real: “);
scanf (“%f”, &var2);
printf (“\nValor inteiro: %d”, var1);
printf (“\Valor real: %f”, var2);
}
Referências
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi
de. Fundamentos da programação de computadores: algoritmos, Pascal e C/
C++. São Paulo: Pearson Prentice Hall, 2003.
DEITEL, H. M.; DEITEL, P. J. Como programar em C. Rio de Janeiro: LTC, 1999.
DIAS NETO, Samuel. Linguagem C: intermediário. [S.l.: s.n.]: [200-]. Disponível em:
<http://br.geocities.com/sdiasneto/c_int/printf.htm>. Acesso em: 20 dez. 2007.
FEITOSA, Eduardo Luzeiro. Introdução aos Algoritmos. Manaus: Instituto de Ciências
Exatas. Departamento de Ciência da Computação, 2004. Disponível em: <http://
www.dcc.fua.br/~efeitosa/Ensino/AED_2004_2/Apostila_C.doc>. Acesso em:
20 dez. 2007.
MIZRAHI, V. V. Treinamento em Linguagem C: Módulos 1 e 2. São Paulo: Makron
Books do Brasil, 1993.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
Na próxima aula
Estudaremos os operadores disponíveis na Linguagem C. O conhecimento
dos operadores de uma linguagem permite a construção de expressões nessa
linguagem. E as expressões representam a maior parte das instruções em um
programa de computador.
Anotações
Aula 2
Operadores
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Como principal pré-requisito para esta aula, é fundamental que você tenha
entendido os conceitos apresentados na aula anterior, principalmente o que
diz respeito à declaração e uso de variáveis e constantes. Se houver dúvidas,
retomes seus estudos e consulte a web-tutoria.
Introdução
Operadores são elementos funcionais que atuam sobre termos e produzem
um determinado resultado.
2.1 Aritméticos
Os operadores aritméticos são usados para desenvolver operações mate-
máticas. Observe, na listagem a seguir, os operadores aritméticos permitidos
na Linguagem C.
Operador Ação
+ Soma (inteira e ponto flutuante)
– Subtração ou troca de sinal (inteira e ponto flutuante)
* Multiplicação (inteira e ponto flutuante)
/ Divisão (inteira e ponto flutuante)
% Resto de divisão (de inteiros)
++ Incremento (inteiro e ponto flutuante)
-- Decremento (inteiro e ponto flutuante)
Fonte: UFMG. Centro de Pesquisa e Desenvolvimento em Engenharia Elétrica (CPDEE)
(1996-1999).
2.2 Lógicos
Na Linguagem C, não há definição do tipo de dado lógico, assim a inter-
pretação do verdadeiro lógico é dada por qualquer valor maior do que zero.
Obviamente, o falso lógico é qualquer valor menor ou igual a zero. Portanto, os
operadores lógicos irão operar sobre quaisquer variáveis, dando uma resposta
correspondente à condição examinada.
Operador Ação
&& E lógico (do inglês AND)
|| OU lógico (do inglês OR)
! NÃO lógico (do inglês NOT)
2.3 Relacionais
Os operadores relacionais são utilizados para comparar os valores de
duas expressões em um programa, retornando um valor “lógico”.
Operador Ação
> Maior que
< Menor que
>= Maior ou igual a
<= Menor ou igual a
== Igual a
!= Diferente de ou “não igual a”
É importante lembrar que você não deve confundir o operador de igualdade
“==” com o operador de atribuição “=”, que será estudado a seguir.
Para que você entenda melhor esse procedimento, vamos considerar o trecho
de código a seguir.
int x;
x = 5;
printf (“%d”, x++); // Imprime o valor atual de x (“5”) e incrementa x (“6”)
printf (“%d”, ++x); // Incrementa o valor atual de x (“7”) e imprime o x (“7”)
printf (“%d”, x--); // Imprime o valor atual de x (“7”) e decrementa x (“6”)
printf (“%d”, --x); // Decrementa o valor atual de x (“5”) e imprime x (“5”)
Em termos e nomenclatura, dizemos que uma operação do tipo x++ é um
pós-incremento; ++x é um pré-incremento; x-- é um pós-decremento; e --x é um
pré-decremento.
2.5 Atribuição
O operador de atribuição serve para, como o próprio nome já sugere, atribuir
um valor para a variável. No C, é utilizado o caractere igual (=) para representar
Quando você for utilizar esse operador, deve garantir que o resultado da
expressão retorne um tipo de dado do mesmo tipo, ou equivalente, ao tipo da
variável que irá receber esse valor.
2.6 Expressões
Expressões são combinações de variáveis, constantes e operadores.
Quando montamos expressões, temos de levar em consideração a ordem com
que os operadores são executados. O C define a seguinte hierarquia entre os
seus operadores:
Operador Ação
& E lógico (do inglês AND)
| OU lógico (do inglês OR)
~ NÃO lógico (do inglês NOT)
^ OU-exclusivo lógico (no inglês XOR)
>> Deslocamento de bits à direita
<< Deslocamento de bits à esquerda
Esses operadores bit-a-bit só podem ser usados nos tipos char, int e
long int.
#include <stdio.h>
int main ( )
{
int valor;
float resultado;
valor=10;
resultado=(float)num/3;
printf (“%f”,resultado);
}
Nesse exemplo, vemos uma divisão entre uma variável do tipo inteira
(valor) por uma constante também inteira (o valor 3). Como visto ante-
riormente, uma divisão entre dois valores inteiros no C sempre retorna
outro valor inteiro. Isso faria com que o programa dê o resultado incor-
reto igual a 3.00, ainda que a saída esteja formatada para imprimir
um tipo float (“%f”). Para resolver esse caso, foi utilizado o modificador
(float) para dizer ao compilador que o resultado da expressão deverá
ser retornado como um float. Com isso, o programa irá imprimir o valor
correto igual a 3.3333....
Operador Ação
& “o endereço de”
Ex.: na instrução x = &y, a variável x irá receber o
endereço da variável y. Esse operador será discutido na
aula sobre Ponteiros.
* “o conteúdo de”
Ex.: na instrução x = *y, a variável x irá receber o
conteúdo do endereço de memória apontado pela
variável y. Esse operador será discutido na aula sobre
Ponteiros.
. (operador ponto)
“elemento da estrutura” ou “campo”.
Esse operador será discutido na aula sobre Estruturas.
Síntese da aula
Nesta aula, foram apresentados os principais operadores disponíveis
na Linguagem C. É muito importante que você conheça e saiba utilizar esses
operadores na construção de expressões nessa linguagem.
Atividades
1. Supondo o seguinte trecho de código:
int x, y;
x = 35;
y = x/2;
É incorreto afirmar que, após a execução desse trecho:
a) a expressão (x+y) retorna um valor inteiro;
Referências
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi
de. Fundamentos da programação de computadores: Algoritmos, Pascal e
C/C++. São Paulo: Pearson Prentice Hall, 2003.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
Na próxima aula
Dando continuidade ao estudo da estrutura de um programa em Linguagem
C, na próxima aula vamos estudar as principais estruturas de controle dessa
linguagem. Essa aula será de fundamental importância para você entender
como o fluxo de instruções pode ser controlado em um programa em C.
Anotações
Aula 3
Estruturas de controle
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Pelo fato de o estudo da programação ser um processo acumulativo, como
pré-requisito para esta aula é necessário que você tenha realmente entendido
os conceitos discutidos nas aulas anteriores. Lembre-se de que a web-tutoria
está sempre à sua disposição!
Introdução
As estruturas de controle são a essência de qualquer linguagem de progra-
mação, uma vez que determinam a seqüência pela qual as instruções de um
programa são executadas.
• um conjunto de instruções;
{
declarações (opcional)
instruções
}
switch (variável)
{
case exp_1 : instr_1; break;
case exp_2 : instr_2; break;
...
default : instr_n; break;
}
switch (variável)
{
case exp_1 :
case exp_2 : instr_2; break;
...
default : ... break;
}
void menu()
{
char ch;
printf(“ Ler ficheiro - 1\n ”);
printf(“ Gravar ficheiro - 2\n ”);
printf(“ Eliminar ficha - 3\n ”);
printf(“ Adicionar ficha - 4\n ”);
printf(“Escolha opção: ”);
scanf(“%d”,&ch);
switch (ch)
{
case ‘1’ : ler_fich(); break;
case ‘2’ : grava_fich(); break;
case ‘3’ : apaga_ficha(); break;
case ‘4’ : adiciona_ficha(); break;
default :
printf(“Opção inválida!”);break;
}
}
Como exemplo desse tipo de ciclo, temos a seguinte função, que simples-
mente espera até que se introduza o carácter ‘A’:
void espera()
{
char c;
c = ‘\0’;
while (c!=’A’)
scanf(“%c”,&c);
}
Um ciclo infinito pode ser interrompido se no seu corpo existir uma instrução
break ou return.
#include <stdio.h>
void main()
{
int x;
for(x=1; x<=100; x++)
printf(“%d\n”,x);
}
#include <stdio.h>
void main()
{
int x;
for(x=5; x<100; x=x+5)
printf(“%d\n”,x);
}
do
{
<bloco de instruções>;
}
while (expressão);
A instrução é executada e depois é avaliada a expressão. Se for verdadeira, a instrução é
executada novamente, e assim sucessivamente, até que a expressão seja falsa (valor nulo).
O ciclo do..while é análogo ao ciclo REPITA..ATE estudado em Lógica para
Programação.
O programa seguinte lê inteiros do teclado até que seja introduzido um número não
superior a 100.
#include <stdio.h>
void main( )
{
int n;
do {
scanf(“%d”,&n);
} while (n>100);
}
Síntese da aula
Nesta aula, foram discutidas as principais estruturas de controle da Linguagem C,
tanto as estruturas que permitem desvio condicional quanto aquelas que permitem
laços repetitivos.
Atividades
1. Indique a opção que apresenta um trecho de código equivalente ao mostrado a
seguir.
if (tecla == ‘1’) {
Funcao1 ( );
} else if (tecla == ‘2’) {
Funcao2 ( );
} else if (tecla == ‘3’) {
Funcao3 ( );
} else {
printf (“\nOpção invalida!”);
}
a) c)
if (tecla == ‘1’) { switch (tecla) {
Funcao1 ( ); case ‘1’: Funcao1 ( );
} break;
if (tecla == ‘2’) { case ‘2’: Funcao2 ( );
Funcao2 ( ); break;
} case ‘3’: Funcao3 ( );
if (tecla == ‘3’) { break;
Funcao3 ( ); default: printf (“\nOpção invalida!”);
} }
printf (“\nOpção invalida!”);
b) d)
if (tecla == ‘1’) { switch (tecla) {
Funcao1 ( ); case ‘1’: Funcao1 ( );
if (tecla == ‘2’) { case ‘2’: Funcao2 ( );
Funcao2 ( ); case ‘3’: Funcao3 ( );
if (tecla == ‘3’) { default: printf (“\nOpção invalida!”);
Funcao3 ( ); }
}
}
}
printf (“\nOpção invalida!”);
e) Nenhuma das alternativas anteriores apresenta um código equivalente.
opções (a) e (b), que apresentam soluções com if’s. Com isso, você deveria ter
avaliado as opções restantes e ter percebido que a opção correta é a opção (c),
pois esta apresenta a construção correta de múltipla escolha usando o comando
switch..case; a opção (d), apesar de usar esse comando, possui uma construção
sem o uso do comando break e, como você estudou nesta aula, isso faz com
que, independentemente do caso para o qual a condição de teste seja idêntica,
serão executados TODOS os comandos a seguir dessa opção; e, como você
encontrou uma alternativa correta, a opção (e) é, naturalmente, incorreta.
Na atividade 2, usando as estruturas que foram estudadas nesta aula,
você deveria estar apto a responder a essa atividade de diferentes formas.
Deveria ter notado que a solução envolve estruturas de seleção e repetição.
Uma solução possível é mostrada a seguir com uso da estrutura de repetição
do..while. Cabe ressaltar que essa solução pode ser reescrita com o uso da
estrutura while. Assim como no teste da operação escolhida, você poderia usar
tanto o aninhamento de if’s quanto a estrutura switch..case.
#include <stdio.h>
int main( )
{
float valor1, valor2;
char operacao;
do {
printf (“\nDigite o primeiro valor: “);
scanf (“%f”, &valor1);
if (valor1 != 0)
{
printf (“\nDigite o segundo valor: “);
scanf (“%f”, &valor2);
printf (“\nEscolha a operacao [+, -, * ou / ]: “);
scanf (“%c”, &operacao);
if (operacao == ‘+’) {
printf (“\Resultado: %f”, (valor1+valor2));
} else if (operacao == ‘-‘) {
printf (“\Resultado: %f”, (valor1+valor2));
} else if (operacao == ‘*‘) {
printf (“\Resultado: %f”, (valor1+valor2));
} else if (operacao == ‘/‘) {
printf (“\Resultado: %f”, (valor1+valor2));
}
}
} while (valor1 > 0);
}
Referências
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi
de. Fundamentos da programação de computadores: Algoritmos, Pascal e C/
C++. São Paulo: Pearson Prentice Hall, 2003.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
SIMÕES, Carlos. Programação em Linguagem C. [S.l.]: Escola Superior de
Tecnologia de Viseu. Instituto Politécnico de Viseu, 2004. Disponível em:
<http://www.estv.ipv.pt/PaginasPessoais/fmorgado/EDados/Sebenta_C.
pdf>. Acesso em: 20 dez. 2007.
ZIVIANI, Nivio. Projeto de algoritmos: com implementações em Pascal e C.
2. ed. São Paulo: Thomson, 2004.
Na próxima aula
Em C tudo é implementado na forma de função. Assim, podemos dizer que
a linguagem C nos força a modularizar o código. Na próxima aula, estuda-
remos esse elemento principal programação em C: as funções.
Anotações
Aula 4
Modularização em C: uso de
Funções
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Para atingir os objetivos declarados para esta aula, é fundamental que
você já saiba codificar um programa em C usando variáveis e as principais
estruturas de controle. Isso é muito importante para que você possa entender
os exemplos discutidos nesta aula.
Introdução
Em C, qualquer instrução a ser executada deve ser parte de uma
função. Entre os programadores é comum ouvir a frase em C tudo é
função. Assim, para que você possa programar com propriedade em C é
imperativo que você conheça essa estrutura e seus detalhes. Nesta aula,
abordaremos esse tema.
4.1 Funções
Uma função em C é declarada usando a seguinte sintaxe geral:
Onde:
Caso em uma variável local a função tenha o mesmo nome de uma vari-
ável global, a variável local será usada, e não a global. Recomendamos
que as variáveis globais sejam evitadas na programação em C. Ao invés
disso, você deve trabalhar sempre com a passagem de parâmetros entre
as funções.
/* Argumentos e parâmetros */
#include <stdio.h>
int soma(int a, int b) /* “a” e “b” são os parâmetros da função “soma” */
{
int resultado;
resultado = a + b;
return(resultado);
}
int main()
{
printf(“A soma entre 5 e 2 é %d\n”,soma(5,2));
/* No comando printf a função “soma” é chamada com os argumentos 5 e 2 */
return(0);
}
Os tipos dos argumentos devem ser compatíveis com os tipos dos parâmetros.
int resultado;
resultado = a + b;
return(resultado);
Síntese da aula
Nesta aula, você estudou o principal conceito da Linguagem C – as
Funções. O domínio desse conceito garante uma programação otimizada.
Foram discutidos também os aspectos básicos da declaração e uso de funções,
como os parâmetros e os argumentos.
Atividades
1. Suponha que você precise criar uma função calculaAreaTrapezio para
calcular a área de um trapézio. A área A do trapézio é o produto da
média aritmética entre as medidas das bases pela medida da altura, isto
é, A=((base1+base2)*h)/2. Nessas condições, indique a alternativa que
apresenta a declaração correta para essa função.
Assim, para esta atividade, reescreva essa solução de modo que cada
operação aritmética seja realizada por uma função diferente.
Na atividade 3, você deveria ter criado no código uma função para cada
operação aritmética (soma, subtração, multiplicação e divisão) que recebe dois
parâmetros do tipo float e retorne o resultado da operação – o que implica
em definir a função como sendo também do tipo float. E, na impressão do
resultado, você deveria invocar cada função correspondente à sua operação,
passando como argumentos os valores das variáveis valor1 e valor2. O código
resultante é mostrado a seguir.
#include <stdio.h>
float soma (float a, float b) {
return (a+b);
}
float subtrai (float a, float b) {
return (a-b);
}
float multiplica (float a, float b) {
return (a*b);
}
float divide (float a, float b) {
return (a/b);
}
int main()
{
float valor1, valor2;
char operacao;
do {
printf (“\nDigite o primeiro valor: “);
scanf (“%f”, &valor1);
if (valor1 != 0)
{
printf (“\nDigite o segundo valor: “);
scanf (“%f”, &valor2);
printf (“\nEscolha a operacao [+, -, * ou / ]: “);
scanf (“%c”, &operacao);
if (operacao == ‘+’) {
printf (“\Resultado: %f”, soma (valor1,valor2));
} else if (operacao == ‘-‘) {
printf (“\Resultado: %f”, subtrai (valor1,valor2));
} else if (operacao == ‘*‘) {
printf (“\Resultado: %f”, multiplica (valor1,valor2));
} else if (operacao == ‘/‘) {
printf (“\Resultado: %f”, divide (valor1,valor2));
}
}
} while (valor1 > 0);
}
Referências
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi
de. Fundamentos da programação de computadores: Algoritmos, Pascal e C/
C++. São Paulo: Pearson Prentice Hall, 2003.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
Na próxima aula
Estudaremos as estruturas de dados, que permitem manipular grandes
conjuntos de dados de maneira mais fácil, vetores, matrizes e estruturas (structs).
Anotações
Aula 5
Estruturas de dados homogêneas
(vetores e matrizes) e
heterogêneas (estruturas)
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Para esta aula, é fundamental que você conheça os conceitos que envolvem
o uso de variáveis e tipos de dados na Linguagem C. Se você ainda tem dúvidas
sobre esse assunto, recorra ao seu caderno e reveja o conteúdo estudado. Não
fique com dúvidas!
Introdução
Em C, existem tipos especiais de variáveis que permitem manipular mais
de um tipo de dados ao mesmo tempo. O uso dessas estruturas permite a mani-
pulação de grandes conjuntos de dados, além de diminuir a complexidade do
programa e as possibilidades de erros.
float x1, x2, x3, x4, x5, x6, x7, x8, x9, x10;
float d1, d2, d3, d4, d5, d6, d7, d8, d9, d10;
float media;
...
d1 = x1 - media;
d2 = x2 - media;
...
x[7] = 54;
a = x[7].
tipo nome[dimensão].
int notas[5]
Ao trabalhar com array, você deve ter cuidado e não acessar uma posição
fora dos limites do array. Por exemplo, se for definido o array:
float x[10];
5.1.2 Matrizes
int a[3][4];
• código
• nome do produto
• quantidade estocada
• valor de compra
• valor de venda
• margem de lucro
• observações sobre o produto
Esse seria um caso para o uso de estruturas, pois todos os dados estão
relacionados a cada produto. Cada dado possui um tipo diferente, como:
struct NOME_DA_ESTRUTURA
{
TIPO CAMPO1;
TIPO CAMPO2;
...........
...........
TIPO CAMPOn;
};
struct produto
{
int codigo;
char nome[50];
int quantidade;
float valor_compra;
float valor_venda;
float margem_lucro;
char observacao[200];
};
Exemplo:
struct produto
{
int codigo;
char nome[50];
int quantidade;
float valor_compra;
float valor_venda;
float lucro;
char obs[200];
} item;
#include <stdio.h>
/* criando um novo tipo de dado “produto” */
struct produto
{
int codigo;
char nome[50];
int quantidade;
float valor_compra;
float valor_venda;
};
int main()
{
struct produto item; /* declarando uma variável “item” do tipo “struct
produto” */
printf(“Preenchendo a variável \”item\”\n”);
printf(“Item............:”);
fgets(item.nome,50,stdin);
printf(“Código..........:”);
scanf(“%d”,&item.codigo);
printf(“Quantidade......:”);
scanf(“%d”,&item.quantidade);
printf(“Valor de compra.:”);
scanf(“%f”,&item.valor_compra);
printf(“Valor de revenda:”);
scanf(“%f”,&item.valor_venda);
printf(“\n”);
printf(“Exibindo os dados\n”);
printf(“Código..........:%d\n”,item.codigo);
printf(“Item............:%s”,item.nome);
printf(“Quantidade......:%d\n”,item.quantidade);
printf(“Valor de compra.:%.2f\n”,item.valor_compra);
printf(“Valor de revenda:%.2f\n”,item.valor_venda);
return(0);
}
Para acessar uma estrutura usando ponteiros, você pode usar duas
sintaxes:
(*NOME_DA_ESTRUTURA).CAMPO
ou
NOME_DA_ESTRUTURA->CAMPO
#include <stdio.h>
struct registro
{
char nome[30];
int idade;
};
altera_estrutura1(struct registro *ficha)
{
(*ficha).idade -= 10;
}
altera_estrutura2(struct registro *ficha)
{
ficha->idade += 20;
}
int main()
{
struct registro ficha;
printf(“Entre com seu nome:”);
fgets(ficha.nome,30,stdin);
printf(“Qual sua idade?”);
scanf(“%d”,&ficha.idade);
printf(“\nExibindo os dados iniciais\n”);
printf(“Nome: %s”,ficha.nome);
printf(“Idade: %d.\n”,ficha.idade);
altera_estrutura1(&ficha);
printf(“\nExibindo os dados após a primeira alteração\n”);
printf(“Nome: %s”,ficha.nome);
printf(“Idade: %d.\n”,ficha.idade);
altera_estrutura2(&ficha);
printf(“\nExibindo os dados após a segunda alteração\n”);
printf(“Nome: %s”,ficha.nome);
printf(“Idade: %d.\n”,ficha.idade);
return(0);
}
Síntese da aula
Nesta aula, você estudou os elementos da Linguagem C que permitem
manipular grandes conjuntos de dados, nomeadamente: vetores, matrizes e
estruturas (structs). A diferença básica entre eles está na possibilidade ou não
de agrupar dados de diferentes tipos. Vetores e matrizes, por exemplo, só
permitem manipular dados de um mesmo tipo. Já as estruturas permitem mani-
pular, ao mesmo tempo, dados de diferentes tipos.
Atividades
1. Sobre o trecho de código a seguir:
#include <stdio.h>
int main()
{
int numeros[10];
int i;
numeros[0] = 1;
for (i=1; i<10; i++) {
numeros[i] = numeros[i-1]*2;
}
for (i=0; i<10; i++) {
printf (“%d, ”, numeros[i]);
}
}
c) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
e) 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
#include <stdio.h>
struct TAluno {
char nome[80];
float nota1;
float nota2;
};
int main()
{
struct TAlunos alunos[5];
int i;
for (i=0; i<5; i++)
{
printf (“\Nome do aluno: “);
scanf (“%s”, &alunos[i].nome);
printf (“\Nota do primeiro bimestre: “);
scanf (“%s”, &alunos[i].nota1);
printf (“\Nota do segundo bimestre: “);
scanf (“%s”, &alunos[i].nota2);
}
Referências
MIZRAHI, V. V. Treinamento em Linguagem C: Módulos 1 e 2. São Paulo:
Makron Books do Brasil, 1993.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
ZIVIANI, Nivio. Projeto de Algoritmos: com implementações em Pascal e C.
2. ed. São Paulo: Thomson, 2004.
Na próxima aula
Estudaremos uma das características mais poderosas da Linguagem C – o uso
de ponteiros. Os ponteiros permitem que o programador manipule as posições de
memória de modo mais controlado do que com o simples uso de variáveis.
Anotações
Aula 6
Ponteiros e alocação dinâmica
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Além do conhecimento sobre variáveis e tipos de dados em linguagem C,
para esta aula é desejável que você conheça, ainda que um pouco, sobre a
organização de memória de um computador. Caso tenha dúvidas quanto a
esse assunto, procure a web-tutoria!
Introdução
Um ponteiro é uma variável que permite guardar o endereço de outra
variável. Assim, quando uma variável contém o endereço de memória de outra
variável, diz-se que a primeira aponta para a segunda. A figura 1 demonstra
como uma variável desse tipo é manipulada.
tipo *nome_variável;
Para iniciar uma variável do tipo ponteiro, é usado o operador &. Esse
operador é um operador unário que retorna o endereço da variável sobre a
qual opera. Assim, o comando ptr = &x fará com que ptr receba como valor
o endereço da variável x.
Para que você possa entender melhor essas operações sobre variáveis
do tipo ponteiro, vamos considerar o seguinte exemplo:
px = &x;
y = *px +1;
*px += 1;
A segunda instrução toma o valor apontado por px, adiciona a ele uma
unidade e atribui o resultado à variável y, enquanto a instrução *px += 1;
incrementa o valor no endereço px, tal como ++*px e (*px)++. No último
caso, são necessários os parênteses, pois sem eles a instrução incrementa o
ponteiro e não o valor por ele apontado, dado que os operadores unários
* e ++ são associativos da direita para a esquerda.
p = &st[0];
p = st;
Síntese da aula
Nesta aula, foram discutidos os principais conceitos relacionados ao
uso de ponteiros na Linguagem C. Foi estudado também como os ponteiros
podem ser utilizados para melhorar o desempenho de programas que
precisam realizar muitos acessos à memória principal.
Atividades
1. Com base no programa a seguir,
#include <stdio.h>
int main( ) {
int numero;
int *ptr_numero;
scanf (“%d”, &numero);
prt_numero = №
numero++;
numero = ++(*prt_numero);
printf (“%d”, numero);
}
é possível afirmar que:
Referências
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi
de. Fundamentos da programação de computadores: algoritmos, Pascal e C/
C++. São Paulo: Pearson Prentice Hall, 2003.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
Na próxima aula
Na última aula, estudaremos as principais funções disponibilizadas pela
Linguagem C para a manipulação de arquivos.
Anotações
Aula 7
Arquivos
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Para esta aula, é importante que você já seja capaz de codificar algoritmos
mais complexos na Linguagem C, usando as estruturas e conceitos discutidos
nas aulas anteriores. Isso você conseguirá se tiver resolvido todas as atividades
propostas nas aulas anteriores.
Introdução
O sistema de E/S de C utiliza o conceito de streams e arquivos. Uma stream
é um dispositivo lógico que representa um arquivo ou dispositivo. A stream é
independente do arquivo ou dispositivo. Devido a isso, a função que manipula
uma stream pode escrever tanto em um arquivo no disco quanto em algum
outro dispositivo, como o monitor.
Do que foi discutido até aqui, concluímos que todas as streams são iguais,
mas não todos os arquivos.
Função Funcionalidade
fprintf( ) É para o arquivo o que printf é para o console
fscanf( ) É para o arquivo o que scanf é para o console
feof( ) Devolve verdadeiro se o fim do arquivo foi atingido
ferror( ) Devolve verdadeiro se ocorreu um erro
rewind( ) Posicionar o ponteiro de arquivo no início desse
remove( ) Apagar um arquivo
fflush( ) Descarregar um arquivo
fread( ) Lê um conjunto de bytes de um arquivo
fwrite( ) Escreve um conjunto de bytes em arquivo
Esse arquivo de cabeçalho define ainda três tipos de dados: size_t, fpos_t
e FILE. Os dois primeiros são o mesmo que unsigned int (inteiro sem sinal), e o
terceiro será discutido mais a seguir.
FILE *arquivo.
fopen(ARQUIVO,MODO)
Para abrir um arquivo texto chamado “teste” para escrita, você poderia
escrever assim:
FILE *arquivo;
arquivo = fopen(“teste”,”w”);
FILE *arquivo;
if((arquivo = fopen(“teste”,”w”)) == NULL)
{
printf(“Erro ao abrir arquivo!!!\n”);
exit(1);
}
Esse tipo de teste detectará algum problema, tipo disco cheio ou protegido
contra gravação, antes que seu programa tente gravar nele.
A sintaxe de fclose é:
fclose(ARQUIVO);
putc(CARACTER,ARQUIVO);
getc(ARQUIVO);
feof(ARQUIVO);
fputs(STRING,ARQUIVO);
fgets(STRING,TAMANHO,ARQUIVO);
Essa função lê STRING até que um caractere de nova linha seja lido ou que
TAMANHO - 1 caracteres tenham sido lidos. Se uma nova linha é lida, ela será
parte da string. A string resultante terminará em nulo. Caso ocorra tudo bem,
essa função retornará um ponteiro para STRING; caso contrário, retornará um
ponteiro nulo.
rewind(ARQUIVO);
ferror(ARQUIVO);
remove(ARQUIVO);
• fflush(ARQUIVO);
A sintaxe de fread() é:
• fread(VARIÁVEL,TAMANHO,QUANTIDADE,ARQUIVO);
TAMANHO é o número de bytes a ser lido. Para calcular esse valor você
deve usar o operador sizeof(TIPO ou VARIÁVEL), que retorna o tamanho de um
tipo ou expressão passado como parâmetro.
A função fread devolve o número de itens lidos. Esse valor poderá ser menor
que QUANTIDADE se o final do arquivo for atingido ou ocorrer um erro.
A função fwrite devolve o número de itens escritos. Esse valor será igual à
QUANTIDADE, a menos que ocorra um erro.
Obs.: esta aula foi baseada nos escritos do autor Samuel Dias Neto que se encontra
disponível no site: <http://br.geocities.com/sdiasneto/c_int/arquivos.htm>.
Síntese da aula
Nesta aula, foram discutidos os principais conceitos relacionados com o uso
de arquivos na linguagem C.
Atividades
1. Com base nos conceitos estudados nesta aula, é incorreto afirmar que:
(a) está correta, pois a instrução FILE *fp realmente é usada para declarar uma
variável do tipo ponteiro para arquivo; a opção (b) também está correta, pois
o modo “rw+” indica ao computador que o arquivo deve ser aberto em modo
texto e para leitura/escrita. O sinal de + indica que, se o arquivo não existir,
ele deverá ser criado; a opção (c) também está correta, pois o modo “rb” indica
ao computador que o arquivo deve ser aberto em modo binário e somente para
leitura; e a opção (e), por sua vez, também está correta, pois a função feof( )
é usada em arquivos binários para evitar que durante a leitura de algum valor,
esse seja confundido com a constante EOF, que indica o final do arquivo.
Na atividade 2, você deveria ter usado a seguinte abordagem: ler o nome do
arquivo, abrir o arquivo indicado com a função fopen( ), ler o arquivo caractere a
caractere até que seja alcançado o final do arquivo. Como será necessário indicar
o total de caracteres lidos do arquivo, você deveria ter criado uma variável para
fazer o papel de acumulador. A solução aqui comentada é mostrada a seguir.
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *arq;
char nome_arquivo[80];
char caracter;
int total=0;
printf (“\nDigite o nome do arquivo: ”);
scanf (“%s”,nome_arquivo);
if((arq = fopen(nome_arquivo,”rb”)) == NULL)
{
printf(“\nErro ao abrir o arquivo original.\n\n”);
exit(1);
}
while(!feof(arq))
{
caracter = getc(arq);
if(!feof(arq))
total++;
}
fclose(arq);
printf(“\nForam contados %d no arquivo %s”, total,nome_arquivo);
return(0);
}
Referências
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi
de. Fundamentos da programação de computadores: Algoritmos, Pascal e C/
C++. São Paulo: Pearson Prentice Hall, 2003.
DIAS NETO, Samuel. Linguagem C: intermediário. [S.l.: s.n.]: [200-]. Disponível
em: <http://br.geocities.com/sdiasneto/c_int/arquivos.htm>. Acesso em: 20
dez. 2007.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
Anotações
Coordenação Editorial
Maria Lourdes F. G. Aires
Assessoria Editorial
Darlene Teixeira Castro
Revisão Didático-Pedagógica
Marilda Piccolo
Revisão Lingüístico-Textual
Sibele Letícia Rodrigues de Oliveira Biazotto
Revisão Digital
Sibele Letícia Rodrigues de Oliveira Biazotto
Projeto Gráfico
Douglas Donizeti Soares
Irenides Teixeira
Katia Gomes da Silva
Ilustração
Geuvar S. de Oliveira
Capa
Igor Flávio Souza
EQUIPE FAEL
Coordenação Editorial
Leociléa Aparecida Vieira
Créditos
Assessoria Editorial
William Marlos da Costa
Revisão
Juliana Camargo Horning
Lisiane Marcele dos Santos
Apresentação
tadas de maneira a solucionar o problema definido.
OBJETIVOS
• Compreender os fundamentos da Lógica para Programação e os
Plano de Ensino
CONTEÚDO PROGRAMÁTICO
• Fundamentos da Lógica para Programação
• Representação de Algoritmo
• Operadores e expressões
• Arquivos
• Estrutura de controle
• Modularização
BIBLIOGRAFIA BÁSICA
CARBONI, Irenice de Fátima. Lógica de Programação. São Paulo: Thomson,
2003.
FORBELLONE, André Luiz Villar; EBERSPACHER, Henri Frederico. Lógica de
programação: a construção de algoritmos e estruturas de dados. 3. ed. São
Paulo: Makron Books, 2005.
LOPES, Anita; GARCIA, Guto. Introdução à Programação: 500 algoritmos
resolvidos. Rio de Janeiro: Campus, 2002.
MANZANO, José Augusto N. G.; OLIVEIRA, Jayr Figueiredo de. Algoritmos:
lógica para desenvolvimento de Programação de Computadores. 16. ed. São
Paulo: Érica, 2005.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
SOUZA, Marco Antonio Furlan de; GOMES, Marcelo Marques; SOARES,
Marcio Vieira. Algoritmos e Lógica de Programação. São Paulo: Thomson,
2005.
BIBLIOGRAFIA COMPLEMENTAR
ASCENCIO, Ana Fernanda Gomes. Lógica de Programação com Pascal. São
Paulo: Makron Books, 1999.
Aula 1
Fundamentos da
Lógica para Programação
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
• entender como a lógica formal e matemática é aplicada na Programação
de Computadores;
• compreender a importância da construção de algoritmos computacionais.
Pré-requisitos
Por tratar de questões relacionadas ao raciocínio natural do ser humano,
esta aula não apresenta pré-requisitos formais, entretanto cabe ressaltar que
será pré-requisito para as demais aulas deste caderno. Para você alcançar o
objetivo proposto, será necessário apenas disciplinar o seu modo de pensar,
evitando extrapolar os limites de abstração, ou seja, focar apenas o problema
a ser resolvido, uma vez que esse material dará a você embasamento teórico
para compreender como o pensamento lógico pode ser representado e repro-
duzido em um algoritmo computacional.
Introdução
Sem dúvida, o computador é uma das maiores invenções do homem e tem
se mostrado uma ferramenta versátil, rápida e segura para a manipulação de
informações.
Para muitos essa invenção é responsável pela intensificação da meca-
nização e descobertas científicas na vida moderna. Esta afirmação dá um
caráter autônomo ao computador, como se o mesmo fizesse tudo sozinho.
Entretanto cabe esclarecer que o computador é uma grande ferramenta de
trabalho, servindo de auxílio para as mais diversas atividades. Porém esta
máquina não é criativa e nem inteligente, na verdade, apenas reproduz o que
lhe é ordenado por meio de seus programas de computador.
Este raciocínio é formalmente correto, uma vez que a conclusão está corre-
tamente deduzida. Mas a conclusão é falsa, uma vez que é falsa a primeira
proposição (“Nenhum homem sabe dançar”). Estamos perante um raciocínio
que tem validade formal, mas não tem validade material. Logo temos que
concluir que é falso.
I. a pele humana não suporta altas temperaturas (ou algo mais simples
como “queimei minha pele no último contato com uma superfície quente”);
Isso deixa claro que nós pensamos de forma lógica o tempo todo.
No entanto, temos uma grande dificuldade em formalizar este raciocínio
lógico. Um exemplo disso são aquelas situações nas quais temos de
explicar a alguém algo a ser feito. Muitas vezes, já fizemos essa mesma
tarefa inúmeras vezes e, para nós, ela é extremamente lógica. Porém
encontramos dificuldades em organizar e relatar o conjunto de passos que
deverão ser realizados. Isso acontece porque não somos acostumados a
formalizar nosso pensamento.
Nesse momento de nossos estudos, você já deve ter percebido que a Lógica
para Programação não é algo difícil ou impossível, uma vez que é apenas uma
técnica para dizer ao computador o que deve ser feito para atingir a solução
de um determinado problema.
1.3 Algoritmos
A construção de algoritmos é o primeiro passo para a Programação de
Computadores. É uma das tarefas mais complexas da programação de compu-
tadores, mas também uma das mais desafiadoras e empolgantes.
Um algoritmo pode ser definido como uma seqüência de passos que visa
a atingir um objetivo definido. Assim podemos dizer que um algoritmo é a
organização do pensamento para a solução de um problema, portanto é uma
representação da lógica.
a) definir o problema;
a) suba na escada;
d) suba na escada;
sário repetir os passos e e f. Daí surge a seguinte questão: pode ser que a outra
lâmpada também não funcione, sendo necessário repetir mais uma vez esta
seqüência de passos. Então, quando deveremos parar de repetir?
Para toda repetição em um algoritmo devemos estabelecer uma condição
de parada, ou seja, um limite para a quantidade de vezes em que os passos
deverão ser repetidos. Caso não seja estabelecido esta condição de parada
ocorre o que chamamos de laço infinito – mais conhecido por sua designação
em inglês loop infinito – no qual os passos se repetem indefinidamente.
No caso do nosso algoritmo, uma condição de parada adequada seria repetir
enquanto a lâmpada não acender. Assim o algoritmo ficaria da seguinte forma:
Síntese da aula
Nesta aula, foram discutidos os princípios da programação para compu-
tadores. Foi apresentado o conceito de Lógica para Programação que é, em
essência, uma extensão da lógica matemática.
Um dos conceitos mais importantes discutidos é o conceito de algoritmo. É
por meio do algoritmo que informamos ao computador o que deverá ser feito.
Vale lembrar que o encadeamento das instruções que compõem o algoritmo é
de fundamental importância para seu correto funcionamento.
Atividades
1. Leve em consideração os estudos que realizamos nesta aula e marque com
V (Verdadeiro) ou F (Falso) as alternativas a seguir.
( ) A lógica para programação torna o computador capaz de realizar
tarefas de forma autônoma e criativa, sem a necessidade da inter-
ferência humana.
( ) Um algoritmo representa uma seqüência lógica de instruções.
( ) Cada instrução em um algoritmo faz com que o computador
execute uma ou um conjunto de tarefas específicas.
( ) Para todo problema somente é possível criar um único algoritmo
correto.
( ) Uma vez que um algoritmo é criado, não deve mais ser modificado.
( ) Antes de iniciar a construção de um algoritmo, é preciso definir a
linguagem de programação a ser usada.
Na próxima aula
Dando continuidade ao estudo da Lógica para Programação, estudaremos
como a lógica de programação, em sua forma algorítmica, pode ser represen-
tada. Estudaremos os métodos mais utilizados na prática: Descrição Narrativa,
Fluxograma e Pseudocódigo.
Anotações
Aula 2
Formas de representação
de um algoritmo
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Uma vez que esta aula trata da representação de um algoritmo é necessário
que você tenha entendido o conceito de algoritmo apresentado na aula anterior.
Caso haja dúvidas, recorra ao material e entre em contato com a web-tutoria.
Introdução
Com o passar do tempo e de estudos dos algoritmos, foram desenvolvidas
inúmeras formas de se representar um algoritmo de modo a facilitar o seu
entendimento e, mais tarde, a sua tradução para uma linguagem de progra-
mação específica. Entre as formas de representação de algoritmos mais conhe-
cidas, podemos citar a Descrição Narrativa, o Fluxograma Convencional e o
Pseudocódigo - também conhecido como Linguagem Estruturada ou “Portugol”.
Essas três formas serão objeto de estudo desta aula.
Uma representação clara e fácil de ser seguida facilita o desenvolvimento,
depuração (correção de erros) e subseqüente transformação do algoritmo em
um programa de computador.
O domínio dessas formas de representação de algoritmos é de funda-
mental importância tanto para Analistas de Sistemas que são responsáveis por
mapear as necessidades dos clientes para a forma algorítmica, quanto para
Programadores, que irão transformar os algoritmos em programas.
Fim
Fluxograma
Figura 1. Exemplo de algoritmo representado nas três formas mais comuns
• ser objetivo;
3. se a média for maior ou igual que 7,00, o aluno foi aprovado, senão,
foi reprovado.
2.2 Fluxograma
Essa é a forma gráfica de representar um algoritmo mais conhecida e
utilizada. O fluxograma nos permite mostrar graficamente a lógica de um algo-
ritmo, enfatizando passos individuais e o fluxo de execução.
Seta de
Dados Exibição
orientação do fluxo
Estes são alguns dos símbolos mais conhecidos e utilizados ao longo dos
anos pelos profissionais da área de informática para a descrição de algoritmos
usando fluxograma e são descritos na norma internacional ISO 5807/1985.
Inicio
Fim
Inicio
nota1
nota2
nota3
Fim
Inicio
nota1
nota2
nota3
média (nota1+nota2+nota3)/3
Fim
Agora que o valor da média já foi calculado, é hora de testar o seu valor a
fim de definir se o aluno foi aprovado ou reprovado. Nesse momento, sentimos
a necessidade de controlar o fluxo de instruções, pois caso o valor da média
seja superior a 7,00, devemos executar a instrução de impressão da mensagem
“Aprovado”; senão devemos apresentar a mensagem “Reprovado”. Para fazer
isso é necessário utilizar o símbolo de decisão, como mostrado na figura 6.
Inicio
nota1
nota2
nota3
média (nota1+nota2+nota3)/3
SIM
“Aprovado” “Reprovado”
Fim
Inicio
N>0
SIM
N%2>0
SIM
N
NÃO
NÃO
N N-1
Fim
2.3 Pseudocódigo
Esse nome é uma alusão à posterior implementação em uma Linguagem
de Programação, ou seja, quando formos programar em uma linguagem de
programação específica.
2.3.1 Primitivas
Síntese da aula
Nesta aula, foram discutidos conceitos sobre as formas mais comuns de
representação de um algoritmo computacional.
Esperamos que, a partir do que foi estudado nesta aula, você seja
capaz de concluir que há diversas formas de representação de algoritmos
que diferem entre si pela quantidade de detalhes de implementação que
fornecem ou, inversamente, pelo grau de abstração que possibilitam em
relação à implementação do algoritmo em termos de uma linguagem de
programação específica.
Atividades
Para as atividades 1, 2 e 3, considere a seguinte questão: elabore um algo-
ritmo para um programa que permita ler vários números inteiros a partir do
teclado e, após a leitura de cada número individual, deverá ser apresentada
uma mensagem indicando se o número informado é positivo, negativo ou nulo.
O programa deverá encerrar quando o valor nulo for informado.
ALGORITIMO A6;
VAR X: Inteiro;
INICIO
REPITA
LEIA (X);
SE (X < 0) ENTAO
IMPRIMA (“O valor informado deve ser positivo”)
SENAO
IMPRIMA (X*X);
FIM SE
ATE (X <= 0)
FIM
a) o pseudocódigo é a forma de representação menos utilizada na prática;
b) para esse algoritmo, caso o usuário informe um valor negativo, será
emitida a mensagem “O valor informado deve ser positivo” e um novo
valor será lido;
c) esse algoritmo não utiliza uma estrutura de decisão;
d) esse algoritmo não utiliza uma estrutura de repetição;
e) esse algoritmo imprime o quadrado de vários números informados
pelo usuário até que seja informado um valor negativo ou nulo.
N>0 NÃO
“Positivo” SIM
“Positivo” “Nulo”
N=0
SIM
Fim
ALGORITIMO A3;
VAR N: Inteiro;
INICIO
REPITA
LEIA (N);
SE (N > 0) ENTAO
IMPRIMA (“Positivo”)
SENAO
SE (N < 0) ENTAO
IMPRIMA (“Negativo”)
SENAO
IMPRIMA (“Nulo”)
FIM SE
FIM SE
ATE (N = 0)
FIM
Considerando o que foi estudado nesta aula sobre fluxograma, você deve
ter reconhecido como opção incorreta para a atividade 5 a opção (c), pois a
interpretação de um fluxograma deve ser sempre realizada de cima para baixo
e da esquerda para a direita. Você deveria ter reconhecido ainda a opção (a)
como correta, pois o fluxograma é exatamente uma representação gráfica dos
passos de um algoritmo. A opção (b) também está correta, pois a norma inter-
nacional ISO 5807/1985 define a simbologia a ser adotada na construção
de um fluxograma e, com isso, um mesmo fluxograma será corretamente inter-
pretado, não importa onde tenha sido criado. A opção (d) é correta, uma vez
que o algoritmo representado só pode ter um início e um fim no fluxograma.
E, por fim, a opção (e) também deveria ser considerada correta, pois o maior
problema com o uso de fluxograma ou de qualquer ferramenta de represen-
tação gráfica é que não são adequadas para situações mais complexas que
gerem algoritmos com uma elevada quantidade de passos.
De acordo com o que você estudou sobre Pseudocódigo, deve ter ficado
claro que a opção correta para a atividade 6 é a opção (e), pois, seguindo o
fluxo do pseudocódigo, percebemos que a leitura e teste da variável X encon-
tram-se no bloco de instruções do comando REPITA. Assim esses passos deverão
ser executados até que a condição (X <= 0) seja verdadeira. Deveria ter ficado
claro também que a opção (a) está incorreta, pois esse tipo de representação é
o mais usado na prática, pois é a forma que mais se aproxima da codificação
final em uma linguagem de programação. A opção (b) está incorreta e sua
avaliação depende da atenção ao teste condicional para a instrução REPITA...
ATÉ. Nela, caso o valor seja negativo ou nulo, o fluxo é desviado para o final
do algoritmo. As opções (c) e (d) são obviamente incorretas, uma vez que o
algoritmo apresenta as instruções SE..ENTAO e REPITA..ATÉ que são estruturas
de decisão e repetição, respectivamente.
Na próxima aula
Estudaremos como os dados são armazenados e representados pelo
computador. Esse conhecimento é de fundamental importância para a ativi-
dade de Programação de Computadores.
Anotações
Aula 3
Tipos de dados:
variáveis e constantes
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
• entender os conceitos de variável e de constante e suas utilizações;
• utilizar adequadamente cada tipo de dado disponível.
Pré-requisitos
Para atingir os objetivos desta aula, é desejável que você possua conheci-
mento, ainda que básico, sobre arquitetura de computadores – principalmente
no que diz respeito à memória RAM. Pesquise sobre o assunto!
Introdução
Para a execução de qualquer tipo de programa, o computador neces-
sita armazenar dados de natureza diversa. Esses dados são armazenados na
memória do computador.
Existem alguns dados que não sofrem alteração em seu valor do início
ao fim do programa. A esse tipo de informação convencionou-se chamar
de constante.
• inteiro – os números inteiros são aqueles que não possuem casas deci-
mais nem são números fracionários, e podem ser positivos, negativos
ou zero. Exemplos de números inteiros são 55 (inteiro positivo), 0
(zero inteiro) e -98 (inteiro negativo);
• real – os dados do tipo real são aqueles que possuem parte decimal
ou são números fracionários, e podem ser positivos, negativos ou zero.
Exemplos de dados do tipo real são 3.2 (real positivo), 0.00 (zero
real) e -19.76 (real negativo).
Esse tipo de variável contém vários valores do mesmo tipo básico. Assim é
possível utilizar um vetor ou matriz de inteiros, por exemplo.
Já uma variável do tipo matriz pode ser vista como um vetor de vetores,
em que cada vetor representa uma dimensão. Por isso essa estrutura é dita
multidimensional.
O tipo de matriz mais utilizado é o bidimensional, em que são decla-
radas apenas duas dimensões. Porém a maioria das linguagens não impõem
qualquer tipo de restrição à quantidade de dimensões. Assim é possível criar
matrizes tridimensionais ou até n-dimensionais.
Um exemplo de declaração de matriz em C seria int notas[2][5]. Nesse caso,
é declarada uma matriz bidimensional, em que a primeira dimensão possui dois
elementos, e a segunda possui cinco elementos. No total, serão reservados em
memória espaço suficiente para representar 2x5=10 valores inteiros.
De forma similar aos vetores, o acesso a cada elemento da matriz deve ser
realizado a partir do nome da variável seguida de um valor inteiro para servir
de índice para cada dimensão.
3.2.2 Registros
Síntese da aula
Nesta aula, discutimos como o computador armazena e manipula as infor-
mações na memória do computador.
A memória dos computadores é composta por posições numeradas e orde-
nadamente organizadas em bytes. Cada tipo de dado requer uma quantidade
diferente de bytes para armazenar a sua informação na memória. Essa quanti-
dade pode também variar em função do tipo de computador ou Linguagem de
Programação considerada.
Uma variável é uma entidade dotada de um nome para diferenciá-la das
demais e permitir encontrar a sua posição da memória, e um tipo de dado, que
define o tipo de informação que ela é capaz de guardar.
Uma vez definidos, o nome e o tipo de uma variável não podem ser alte-
rados no decorrer de um programa. Por outro lado, a informação útil da vari-
ável é passível de modificação durante o decorrer do programa, de acordo
com o fluxo de execução do mesmo.
Atividades
1. Sobre o uso de variáveis e constantes em um algoritmo é incorreto
afirmar que:
a) toda informação manipulada diretamente pelo computador é armaze-
nada na memória principal (RAM) e as variáveis representam referên-
cias a posições dessa memória;
b) o valor de uma variável não pode ser alterado ao longo do programa,
mantendo o mesmo valor até o encerramento do programa;
c) o tipo de dado implica na forma como os dados são representados
na memória;
d) os vetores e matrizes só podem manipular dados de um mesmo tipo
de dado;
e) um dado constante não sofre alteração no seu valor durante a execução
do programa.
2. Com base no que foi estudado nesta aula, escolha a alternativa que apre-
senta, respectivamente, os tipos de dados mais adequados para variáveis
que deverão armazenar os seguintes conteúdos: idade, temperatura, nome
da cidade, número da carteira de identidade, notas de um aluno.
a) Inteiro, real, caractere, caractere, vetor de real.
b) Inteiro, inteiro, caractere, caractere, vetor de inteiro.
c) Inteiro, real, inteiro, caractere, vetor de real.
d) Inteiro, real, real, caractere, vetor de inteiro.
e) Inteiro, real, caractere, real, vetor de real.
3. Comente o uso de variáveis e constantes em um algoritmo.
4. Comente as vantagens do uso do tipo de dados Registro.
Na próxima aula
Estudaremos os principais operadores e como podem ser usados na compo-
sição de expressões. Serão estudados os operadores mais gerais e que são
implementados na maioria das Linguagens de Programação, nomeadamente:
aritméticos, lógicos, de atribuição e de concatenação.
Anotações
Aula 4
Operadores e expressões
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Não há pré-requisitos formais para esta aula, uma vez que trata de opera-
ções básicas, pois pressupomos que você possua conhecimentos sobre Teoria
de Conjuntos e Matemática Fundamental. Tire suas dúvidas no caderno de
Matemática para Computação!
Introdução
Operadores são elementos funcionais que atuam sobre termos e produzem
um determinado resultado.
• operadores aritméticos;
• operadores relacionais;
• operadores lógicos.
Vale ressaltar que não é eficaz comparar valores do tipo real com os
operadores de igualdade em virtude de a representação em ponto flutuante ser
inexata em alguns casos.
• NÃO (do inglês NOT) – uma expressão desse tipo inverte o valor da
expressão ou condição, se verdadeira inverte para falsa e vice-versa.
O resultado de uma operação lógica vai depender dos valores dos termos
submetidos. A seguir é apresentada uma listagem com os tipos de dados resul-
tantes de cada operador.
OPERADOR Tipo de Dado de A Tipo de Dado de B Tipo Resultante
AeB verdadeiro verdadeiro verdadeiro
AeB verdadeiro falso falso
AeB falso verdadeiro falso
AeB falso falso falso
A ou B verdadeiro verdadeiro verdadeiro
A ou B verdadeiro falso verdadeiro
A ou B falso verdadeiro verdadeiro
A ou B falso falso verdadeiro
não A verdadeiro ----- falso
não A falso ----- verdadeiro
4.6 Expressões
O conceito de expressão, em termos computacionais, está intimamente
ligado ao conceito de expressão (ou fórmula) usado na matemática, na qual
um conjunto de variáveis e constantes numéricas relaciona-se por meio de
operadores aritméticos compondo uma fórmula que, uma vez avaliada, resulta
em um valor final.
Síntese da aula
Nesta aula, foram apresentados e discutidos os principais Operadores
Aritméticos, Relacionais e Lógicos usados na Programação para Computadores.
Foi discutida ainda a construção e a avaliação de expressões que utilizam
esses operadores.
Atividades
1. Das alternativas apresentadas a seguir, indique aquela que representa um
operador unário.
c) Negação [NOT ]
d) Multiplicação [ * ]
e) OU lógico [ OU ]
c) (((Media*2)-1) MOD 2)
ALGORITMO A3;
A, B: real;
INICIO
A ← 25;
B ← 3;
RESULTADO ← (A / B) * 5;
IMPRIMA (RESULTADO);
FIM
4. Considere a seguinte expressão ((((A MOD 5) > 5) OU (B/C >= 1)) E ((NAO
((A<50) E (B <> C))) OU (C=5))) e determine o valor para essa expressão
lógica, tendo os valores 23, 5 e 5 como valores das variáveis A, B e C,
respectivamente.
Na próxima aula
Estudaremos, na próxima aula, a Estrutura de Arquivo. Na prática, esse
tipo de estrutura é muito utilizado para o armazenamento e manipulação de
grandes conjuntos de dados.
Anotações
Aula 5
Arquivos
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Por tratar de uma estrutura que é armazenada em dispositivos de memória secun-
dária (discos rígidos, fitas, pen drivers, etc.), é desejável um conhecimento básico
sobre esses dispositivos e sobre sistemas operacionais. Caso ainda não conheça
esses dispositivos, procure conhecê-los por meio de seus colegas e web-tutoria.
Introdução
Até aqui discutimos a manipulação de dados em um programa exclusiva-
mente em memória principal – memória RAM – e vimos como as variáveis são
utilizadas para esse fim. Entretanto nos limitamos a problemas que exigiam
poucos dados a serem processados e, com isso, estruturas mais simples
puderam ser usadas normalmente. Mas na prática existem inúmeros casos
que exigem uma grande quantidade de dados de entrada ou saída. E nestes
casos as variáveis ou até mesmo os vetores já não são suficientes ou tornam o
algoritmo muito complexo. Em casos assim, devemos utilizar uma estrutura de
arquivo para a manipulação desses dados.
5.1 Declaração
Um arquivo é, em sua essência, um conjunto de registros e, portanto não
possui um tamanho fixo. Na prática, os arquivos são utilizados para manter
uma grande quantidade de dados como, por exemplo, os dados de todos os
alunos de uma escola.
5.2 Manipulação
Para manipular um arquivo em um algoritmo é preciso que possamos refe-
renciá-lo. Para isso precisamos definir uma variável tendo como tipo de dado
o tipo do arquivo.
Ao trabalharmos com arquivos, devemos ter como prática que sempre que
um arquivo não estiver sendo mais usado ele deve ser fechado para garantir
a integridade dos dados nele armazenados. Para fechar um arquivo devemos
usar a operação FECHA (<variável do tipo arquivo >).
nome: CARACTERE;
idade: INTEIRO;
cpf: CARACTERE;
FIM REGISTRO
aux: TAluno;
INICIO
ABRE(alunos);
COPIA(alunos, aux);
IMPRIMA(“Nome: ” + aux.nome);
IMPRIMA(“Idade: ” + aux.idade);
IMPRIMA(“CPF: ” + aux.cpf);
FECHA(alunos);
FIM
ALGORITMO arquivos;
TIPO TAluno = REGISTRO
nome: CARACTERE;
idade: INTEIRO;
cpf: CARACTERE;
FIM REGISTRO
TIPO TArqAluno = ARQUIVO DE TAluno;
VAR alunos: TArqAluno;
aux: TAluno;
resposta: CARACTERE;
INICIO
ABRE (alunos);
IMPRIMA “INSERIR NOVO REGISTRO? (S/N)”
LEIA (resposta);
ENQUANTO (resposta = ‘S’) FACA
LEIA (aux.nome);
LEIA (aux.idade);
LEIA (aux.cpf);
GRAVA (alunos, aux);
IMPRIMA “INSERIR NOVO REGISTRO? (S/N)”
LEIA (resposta);
FIM ENQUANTO
FECHA (alunos);
IMPRIME (“Conteúdo do arquivo: ”);
ABRE (alunos);
ENQUANTO (NÃO FIMDEARQUIVO (alunos)) FACA
COPIA (alunos,aux);
IMPRIMA(“Nome: ” + aux.nome);
IMPRIMA(“Idade: ” + aux.idade);
IMPRIMA(“CPF: ” + aux.cpf);
PROXIMO (alunos);
FIM ENQUANTO
FECHA (alunos);
FIM
Síntese da aula
Nesta aula, você estudou os principais conceitos relacionados à defi-
nição e à manipulação da Estrutura de Arquivo. Essa estrutura é fundamental
na programação, pois permite manipular uma grande quantidade de infor-
mações ao mesmo tempo. Além disso permite armazenar, de forma defini-
tiva, dados que podem ser usados em outros programas ou em uma próxima
execução do mesmo.
Atividades
1. Após analisar as afirmações a seguir, indique a alternativa que apresenta
a opção correta.
Na próxima aula
Estudaremos as principais estruturas que permitem controlar o fluxo de
instruções em um algoritmo. O domínio dessas estruturas é de grande impor-
tância para a atividade de programação.
Anotações
Aula 6
Estruturas de controle
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Como nesta aula são utilizados exemplos de algoritmos na forma de fluxo-
grama e pseudocódigo, é necessário que você já esteja familiarizado com
essas formas de representação de algoritmos, discutidas na aula 2. Retome
seus estudos! Você deve ter percebido que, conforme dissemos na apresen-
tação desse caderno, os conceitos aqui discutidos serão utilizados tanto nessa
disciplina quanto ao longo de todo curso.
Introdução
Quando estivermos criando algoritmos, muitas vezes será necessário
controlar a ordem em que as instruções deverão ser executadas pelo compu-
tador de modo a solucionar o problema. Na maioria das vezes, dispomos
os comandos de forma seqüencial, na qual as instruções são executadas
em série, ou seja, uma após a outra. Porém são comuns casos nos quais é
necessário executar um conjunto de comandos somente mediante a acei-
tação de uma condição específica. Em outros casos, será necessário repetir
um conjunto de comandos até que outra condição seja satisfeita.
NÃO
N
Fim
ALGORITMO Selecao_Composta;
Inicio
VAR N: Inteiro;
INICIO
N LEIA N;
SE N>0 ENTAO
4IMPRIMA N;
N>0
SENAO
SIM NÃO IMPRIMA “O valor de N deve
ser positivo”;
“O valor FIM SE
N de N deve FIM
ser positivo”
Fim
testar se o resto da divisão por dois é igual a zero – e, caso seja verdadeiro, o
fluxo é desviado para a instrução que imprime a mensagem “Este valor é par” e,
no caso de ser retornado um valor falso, é apresentada a mensagem “Este valor
é impar”. No caso de ser retornado um valor falso no primeiro teste condicional
(mais externo), a mensagem “O valor de N deve ser positivo” é mostrada.
ALGORITMO Selecao_Encadeada;
Inicio
VAR N: Inteiro;
INICIO
LEIA N;
N
SE N>0 ENTAO
SE N MOD 2 = 0 ENTAO
IMPRIMA “Este valor é par”;
N>0
SIM SENAO
IMPRIMA “Este valor é ímpar”
FIM SE
N MOD 2=0 SENAO
IMPRIMA “O valor de N deve ser
NÃO SIM
positivo”;
NÃO
FIM SE
“Este valor “Este valor FIM
é ímpar” é par”
“O valor
de N deve
ser positivo”
Fim
Inicio
OPÇÃO
OPÇÃO
NÃO
1 2 3
Fim
ALGORITMO Selecao_Multipla;
VAR OPCAO: Inteiro;
INICIO
LEIA OPCAO;
ESCOLHA (OPCAO)
CASO 1: IMPRIMA “Você escolheu a opção 1”;
CASO 2: IMPRIMA “Você escolheu a opção 2”;
CASO 3: IMPRIMA “Você escolheu a opção 3”;
CASOCONTRARIO: IMPRIMA “Opção inválida”;
FIM ESCOLHA
FIM
Agora imaginemos que esse algoritmo deva ser usado para qualquer
veículo com qualquer que seja a quantidade de pneus. Nessa nova situação,
fica impossível utilizar apenas a repetição do bloco de instruções, principal-
mente por não sabermos exatamente quantas vezes deveremos repetir. Em
casos como esses - e são bem comuns – temos de lançar mão de uma estrutura
de repetição que permita repetir um bloco de instruções de forma controlada.
As estruturas de repetição se diferenciam principalmente pelo modo como
a expressão condicional é avaliada. Basicamente, temos três tipos de estruturas
de repetição que são comumente conhecidas, como: ENQUANTO, PARA...
FAÇA e REPITA... ATÉ.
NÃO N
NÃO
N←N+1
Fim
Inicio
N ←1
N <= 10
SIM
N MOD 2 = 0
SIM
NÃO
NÃO
N←N+1
Fim
A partir da análise desse exemplo, fica claro que, enquanto o teste condi-
cional N<=10 retornar verdadeiro, o mesmo conjunto de instruções será execu-
tado. Somente quando o teste condicional retornar falso é que o fluxo será
desviado para a instrução imediatamente após o bloco de repetição.
N <= 10
SIM
N MOD 2 = 0
SIM
NÃO
NÃO
N←N+1
Fim
N
NÃO
NÃO
N←N+1
N <= 10
SIM
Fim
Síntese da aula
Nesta aula, foram discutidas as principais estruturas de controle usadas na
construção de algoritmos. Vimos que grande parte das instruções em um algo-
ritmo são dispostas em uma estrutura chamada seqüencial ou bloco. Entretanto
existem casos em que o fluxo de instruções não deve ser executado linearmente,
Atividades
1. Sobre as estruturas de controle estudadas nesta aula, é incorreto afirmar que:
a) uma estrutura seqüencial ou bloco apresenta instruções que são execu-
tadas uma após a outra, seqüencialmente;
b) uma estrutura de seleção permite desviar o fluxo de instruções de
acordo com a avaliação de um teste condicional;
c) antes de utilizar uma estrutura de repetição do tipo PARA..FACA precisamos
conhecer o número exato de repetições que deverão ser realizadas;
d) um teste condicional deve ser uma expressão aritmética;
e) na estrutura de seleção múltipla, o teste condicional não é uma
expressão lógica.
2. Considerando o algoritmo a seguir, indique a alternativa que apresenta
o resultado da execução desse algoritmo, no caso de ser lido o valor “9”
como valor para a variável N.
ALGORITMO A1;
VAR N: inteiro;
INICIO
LEIA (N);
ENQUANTO (N > 0) FAÇA
SE (N MOD 2 <> 0) ENTAO
IMPRIMA N;
FIM SE
N ← N - 1;
FIM ENQUANTO
FIM
a) 9, 8, 7, 6, 5, 4, 3, 2, 1
b) 8, 6, 4, 2
c) 9, 7, 5, 3, 1
d) 9, 7, 5, 3, 1, 0
e) 8, 6, 4, 2, 0
Para esse algoritmo, na atividade 3, você deve ter escolhido como estrutura
de repetição a estrutura do tipo PARA..FACA, afinal foi declarado o intervalo
de números a serem testados e, por conseqüência, o número de repetições. A
seguir é mostrada uma solução algorítmica para esse problema.
ALGORITMO A3;
VAR
N: inteiro;
INICIO
PARA N ← 50 ATE 500 FACA
SE ( N MOD 11 = 5) ENTAO
IMPRIMA (N):
FIM SE
FIM PARA
FIM
Solução 01:
ALGORITMO FIBONACCI;
VAR N, I: inteiro;
anterior: inteiro;
atual: inteiro;
próximo: inteiro;
INICIO
LEIA (N);
anterior ← 1;
atual ← 1;
IMPRIMA (anterior);
IMPRIMA (atual);
PARA I ← 3 ATE N FACA
proximo ← anterior + atual;
IMPRIMA (proximo);
anterior ← atual;
atual ← proximo;
FIM PARA
FIM
Solução 02:
ALGORITMO FIBONACCI;
VAR anterior: inteiro;
atual: inteiro;
proximo: inteiro;
N: inteiro;
INICIO
LEIA (N);
atual ← 1;
anterior ← 1;
IMPRIMA (anterior);
ENQUANTO atual <= N FACA
IMPRIMA (atual);
proximo ← anterior + atual;
anterior ← atual;
atual ← próximo;
FIM ENQUANTO
FIM
Na próxima aula
Estudaremos a Técnica de Modularização, que permite dividir um problema
complexo em problemas menores e, com isso, diminuir o tempo de criação do
algoritmo e otimizar a sua solução. Nessa aula, será apresentado o conceito de
função e procedimento e como essas instruções especiais devem ser utilizadas.
Anotações
Aula 7
Modularização
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Nesta aula, é fundamental que você já domine a criação de algoritmos
e como representá-los na forma de pseudocódigo, pois nesta aula são apre-
sentados e comentados exemplos nessa forma. Além disso, é necessário que
você tenha apreendido o conceito de variáveis. Portanto retome o conteúdo já
estudado nas aulas anteriores se ainda houver dúvidas!
Introdução
Até aqui temos discutido a construção de algoritmos como uma solução
linear que aborda um problema na sua forma geral e define um conjunto
de instruções a serem executadas para alcançar uma solução. Todavia, até
o momento, não consideramos a complexidade do problema ou o tamanho
(quantidade de instruções) que um algoritmo pode ter.
ALGORITMO Funcao_Procedimento;
CONST MAX = 99;
VAR Valor1, Valor2: Inteiro;
INICIO
LEIA Valor1;
LEIA Valor2;
SE MAIOR(Valor1, Valor2) ENTAO
IMPRIMA (Valor1 + “ é maior do que “ + Valor2);
VERIFICA (Valor1);
SENAO
IMPRIMA (Valor2 + “ é maior do que “ + Valor1);
VERIFICA (Valor2);
FIM SE
FIM
7.2 Parâmetros
Parâmetros são as variáveis listadas entre parênteses no cabeçalho da
definição de uma função ou procedimento. São variáveis locais, sendo visí-
veis apenas dentro da função ou rotina, embora com uma particularidade:
são automaticamente inicializadas com o valor dos argumentos respectivos em
cada chamada da função ou procedimento.
7.3 Argumentos
Argumentos são as expressões listadas entre parênteses em uma invocação
ou chamada de uma função ou procedimento. O seu valor é utilizado para
inicializar os parâmetros da função ou procedimento invocado.
Cabe ressaltar que um argumento de uma função não necessita ser uma
variável, podendo ser passado um valor constante. Por exemplo, podemos
invocar a função maior usando instruções como: MAIOR (5, 7), MAIOR (Valor1,
89) ou MAIOR (5, Valor2).
Síntese da aula
Nesta aula, estudamos o conceito de Modularização. Esse conceito é de
fundamental importância no desenvolvimento de programas de grande escala.
Foram apresentados e discutidos ainda os principais conceitos relacionados
ao uso de funções e procedimentos.
Atividades
1. Sobre o uso da técnica de modularização, com o uso de funções e proce-
dimentos, em um algoritmo, é incorreto afirmar que:
b) dificulta os testes do programa, uma vez que cada módulo foi progra-
mado por uma equipe diferente;
INICIO
LEIA (numero);
SE E_PAR(numero) ENTAO
argumentos a serem passados para essa função. Um argumento, por sua vez,
é qualquer expressão passada entre os parênteses da invocação (chamada)
de uma função ou procedimento. Esse conhecimento é imprescindível para a
realização da atividade 3.
ALGORITMO A4;
VAR numero: inteiro;
FUNCAO LERINTEIRO
VAR N: inteiro;
LEIA (N);
RETORNE (N);
FIM FUNCAO
INICIO
numero ← LERINTEIRO;
IMPRIMA (“O quadrado do numero “ + numero + “ é “ +
QUADRADO(numero));
FIM
Anotações
Coordenação Editorial
Maria Lourdes F. G. Aires
Assessoria Editorial
Darlene Teixeira Castro
Revisão Didático-Pedagógica
Marilda Piccolo
Revisão Lingüístico-Textual
Sibele Letícia Rodrigues de Oliveira Biazotto
Revisão Digital
Sibele Letícia Rodrigues de Oliveira Biazotto
Projeto Gráfico
Douglas Donizeti Soares
Irenides Teixeira
Katia Gomes da Silva
Ilustração
Geuvar S. de Oliveira
Capa
Igor Flávio Souza
Equipe Fael
Coordenação Editorial
Leociléa Aparecida Vieira
Créditos
Assessoria Editorial
William Marlos da Costa
Revisão
Juliana Camargo Horning
Lisiane Marcele dos Santos
Apresentação
Predicados e teremos uma introdução à Álgebra de Boole. A sexta aula será
uma continuidade da quinta aula, pois trataremos das Funções Booleanas.
Esperamos que, por meio dos conteúdos aqui apresentados, você compre-
enda melhor esta disciplina e dê continuidade aos seus estudos.
OBJETIVOS
Plano de Ensino
CONTEÚDO PROGRAMÁTICO
• Representação e notação de conjunto
• Tabela-verdade
• Relações de Equivalência
• Predicados
• Sistemas algébricos
• Álgebra de Boole
• Funções Booleanas
• Forma canônica
• Método Algébrico
BIBLIOGRAFIA BÁSICA
DAGHLIAN, Jacob. Lógica e Álgebra de Boole. 4. ed. São Paulo: Atlas, 1995.
Gersting, Judith L. Fundamentos Matemáticos para Ciência da Computação.
São Paulo: LTC, 1995.
RANGEL, Kléber Albanêz; BENZECRY, Vera Syme Jacob. Como desenvolver
o raciocínio lógico: soluções criativas na teoria dos conjuntos. 2. ed. Rio de
Janeiro: Universidade Estácio de Sá, 2005.
BIBLIOGRAFIA COMPLEMENTAR
ALENCAR FILHO, Edgar. Iniciação à Lógica Matemática. São Paulo: Nobel,
2003.
SOUZA, J. N. Lógica para Ciência da Computação: fundamentos de linguagem,
semântica e sistemas de duração. Rio de Janeiro: Campus, 2002.
Aula 1
Teoria dos Conjuntos
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
Os conteúdos sobre a Teoria dos Conjuntos, já estudados nos Ensinos
Fundamental e Médio, são suficientes para que você consiga acompanhar a
aula e alcançar seus objetivos. Caso não se recorde dos mesmos, sugerimos
sua recapitulação.
Introdução
A Teoria dos Conjuntos é fundamentada em entes ou conceitos primitivos
tais como conjunto, elemento, pertinência. Por entes ou conceitos primitivos
entendemos aqueles que aceitamos sem definição e que, por sua vez, servem
de base para a definição de outros entes. Por exemplo, ao tentarmos escla-
recer o que é um conjunto, poderemos dizer que se trata de uma coleção,
o que na verdade é um sinônimo de conjunto e não uma definição propria-
mente dita.
Nesta aula, veremos que os conjuntos podem ser subdivididos; que união,
interseção e diferença são operações entre conjuntos e que os Diagramas de
Euler-Venn são utilizados para a representação de operações entre conjuntos.
1.2 Pertinência
Nos exemplos anteriores, pode-se afirmar que:
• o elemento 2 pertence ao conjunto A, simbolicamente 2 ∈ A;
• o elemento 3 não pertence ao conjunto A, simbolicamente 3 ∉ A;
• a ∈ B;
• b ∉ B.
φ={}
1.4 Subconjuntos
Quando todos os elementos de um conjunto A qualquer pertencem a outro
conjunto B, diz-se então que A é subconjunto de B, simbolicamente,
Saiba mais
Exemplo
Considerando: A = {1, 2, 3, 4}
B = {1, 3, 5, 7, 9}
C = {1, 2}
C⊂A
A⊄B
A ∪ B = {1, 2, 3, 4, 5, 7, 9}
A ∪ C = {1, 2, 3, 4}
A∪C=A
A ∩ B = {1, 3}
A ∩ C = {1, 2}
A∩C=C
A ∩ B ∩ C = {1}
A – B = {2, 4}
B – A = {5, 7, 9}
Exemplo: seja o conjunto A = {2, 4, 8}, o qual possui três elementos (n = 3).
O número de subconjuntos de A é igual a 23 = 8 e eles correspondem a:
Observações:
Exemplo
Considerando: A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8, 9}
C = {2, 4, 6, 8, 10}
A
1 3
5 2
7
6 8
9 10
B C
tem-se, entre muitas igualdades possíveis, que:
A ∪ B ∪ C = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
A ∪ B = {1, 2, 3, 4, 5, 6, 7, 8, 9}
A ∪ C = {1, 2, 3, 4, 5, 6, 8, 10}
B ∪ C = {2, 4, 5, 6, 7, 8, 9, 10}
A ∩ B ∩ C = {4}
A ∩ B = {4, 5}
A ∩ C = {2, 4}
B ∩ C = {4, 6, 8}
A – B ∪ C = {1, 3}
B – A ∪ C = {7, 9}
C – A ∪ B = {10}
Síntese da aula
Nesta aula, utilizando como base os conceitos primitivos de conjunto,
elemento e pertinência, estudamos a Teoria dos Conjuntos. Vimos que os
conjuntos podem ser subdivididos em partes, os subconjuntos, e que entre
eles há o conjunto vazio, subconjunto de qualquer conjunto. Os símbolos de
está contido, (⊂), e não está contido, (⊄), determinam as relações entre um
conjunto e seus possíveis subconjuntos. Vimos também as operações de união,
interseção e diferença entre conjuntos e que estas operações podem ser repre-
sentadas por meio dos Diagramas de Euler-Venn.
Atividades
1. Sendo A = {x|x é número inteiro positivo e par}, B = {1, 2, 3, 4, 5, 6, 7,
8, 9} e C = {x|x é número inteiro positivo e múltiplo de 3}, obter o conjunto
D, sendo D = B – A ∪ C.
B D
5
2
9 1
3
8
4
6
7 10
B C
a) A ∩ B – C = {1, 6}
b) A ∪ B ∩ C = {3}
c) A ∪ C ∩ B = {3, 6, 9}
d) B – A ∩ B ∩ C = {4, 7}
e) C – A ∪ B = {1, 6, 8, 9}
D=B–A∪C
Como:
B = {1, 2, 3, 4, 5, 6, 7, 8, 9}
Portanto:
Logo:
D = {1, 5, 7}
Pois:
A ∩ B = {1, 2, 3, 4, 5, 6, 7} ∩ {2, 3, 4, 5, 6, 7, 8}
A ∩ B = {2, 3, 4, 5, 6, 7}
C ∪ D = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
C ∪ D − {0, 1, 8, 9, 10} = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}− {0, 1, 8, 9, 10}
Logo:
A ∩ B = C ∪ D − {0, 1, 8, 9, 10}
A ∪ D = {1, 2, 3, 4, 5, 6, 7, 9}
C ∪ B = {0, 2, 3, 4, 5, 6, 7, 8, 10}
A ∪ B − C = {1, 3, 5, 7}
D = {1, 3, 5, 7, 9}
A ∩ B = {2, 3, 4, 5, 6, 7}
Pois, sendo:
tem-se que:
A ∩ B ∩ C ∩ D = {2}
A ∩ B ∩ C = {1, 2}
A ∩ D = {–2, 2}
B ∩ C = {1, 2, 4}
C ∩ D = {−1, 2}
A∪C=
2 5
9 1
3
8
6
10
B C
A∪C∩B=
B C
B C
6
B C
4
6
B 7 C
10
B C
Ao realizar as atividades propostas, você alcançou os objetivos desta aula
de realizar operações que envolvam conjuntos e representar operações por
meio de Diagramas de Euler-Venn.
Na próxima aula
Começaremos a substituir os conjuntos com os quais trabalhamos nesta aula
por proposições, que podem até mesmo envolver situações de nosso cotidiano,
e passaremos a interligá-las de forma similar ao que fizemos com os conjuntos.
Tanto as proposições quanto suas interligações, que também chamamos de
operações lógicas sobre proposições, poderão resultar em verdades ou falsi-
dades. Estas verdades e falsidades compõem o valor lógico das operações,
que será foco do nosso estudo.
Anotações
Aula 2
Análise e Simbolização
de Proposições
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
• identificar proposições simples e compostas;
• reconhecer o valor lógico de uma proposição.
Pré-requisitos
Para determinar valores lógicos e para efetuar operações lógicas sobre
proposições é importante que se tenha um conhecimento prévio, mesmo que
mínimo, sobre o que são proposições. Por serem entes ou conceitos primi-
tivos, proposições não se definem, mas facilmente as identificamos por serem
sentenças que exprimem um pensamento de sentido completo, podendo ser
expressas tanto na linguagem usual quanto na forma simbólica.
Exemplos:
a) Manaus é a capital do Amazonas;
b) 2 < 2.
Observe nas suas leituras, observe à sua volta o quanto as proposições
estão presentes no dia-a-dia.
Também é importante que os conteúdos vistos na aula anterior tenham
sido assimilados, principalmente as operações envolvendo conjuntos. Se ainda
permaneceram dúvidas, retome sua leitura e refaça as atividades.
Introdução
Nesta aula, veremos que as proposições podem ser simples ou compostas, que
todas atendem aos princípios fundamentais da Lógica Matemática e que é possível
realizar operações lógicas sobre duas ou mais proposições utilizando conectivos
lógicos, tais como: conjunção, disjunção, condicional, bicondicional e negação.
2.1 Proposições
As proposições são conjuntos de palavras ou símbolos que exprimem um
pensamento de sentido completo. Podem ser simples ou compostas.
c) r: 2 + 3 = 5;
d) s: 12 > 11 ;
1 1
e) t: > .
3 2
Seus valores lógicos são:
a) V(p) = F ou V(p) = 0
b) V(q) = V ou V(q) = 1
c) V(r) = V ou V(r) = 1
d) V(s) = V ou V(s) = 1
e) V(t) = F ou V(t) = 0
2.4 Negação
Se p é uma proposição, sua negação será representada por p' e lê-se “não
p”. Logo, se V(p) = V, V(p') = F e se V(p) = F, V(p') = V. A Tabela-verdade a
seguir resume os valores lógicos.
p p'
V F
F V
Exemplos:
a) q: 5 – 1 = 3 F
q': 5 – 1 ≠ 3 V
2.5 Conjunção
A conjunção de duas proposições p e q é uma proposição verdadeira se
V(p) = V(q) = V. Nos demais casos, é falsa. Logo, para que a proposição
composta de uma conjunção seja verdadeira, as proposições componentes
precisam ser verdadeiras. A Tabela-verdade a seguir resume os valores
lógicos.
p q p e q ou p ∧ q
V V V
V F F
F V F
F F F
Exemplos:
a) p : 4 = 2 V
π
q : sen = 1 V
2
V (p, q) = p ∧ q V
b) r : 2 + 10 = 12 V
s :102 = 20 F
V (r, s) = r ∧ s F
2.6 Disjunção
A disjunção de duas proposições p e q é uma proposição falsa se
V(p) = V(q) = F. Nos demais casos, é verdadeira. Logo, para que a proposição
composta de uma disjunção seja verdadeira, pelo menos uma das componentes
deve ser verdadeira. A Tabela-verdade a seguir resume os valores lógicos.
p q p ou q ou p ∨ a
V V V
V F V
F V V
F F F
Exemplos:
a) p : 8 = 4 F
π
q : sen = 1,5 F
2
V (p, q) = p ∨ q F
b) r : 2 − 12 = −10 V
s :10 −2 = −100 F
V (r, s) = r ∨ s V
2.7 Condicional
O condicional de duas proposições p e q é uma proposição falsa se V(p) = V
e V(q) = F. Nos demais casos, é verdadeira. A primeira proposição é denomi-
nada antecedente e a segunda conseqüente do condicional. A Tabela-verdade
a seguir resume os valores lógicos.
p q Se p, então q ou p → q
V V V
V F F
F V V
F F V
Exemplos:
2
a) p : (2 + 1) = 9 V
4 4
q: < F
5 7
V (p, q) = p → q F
2.8 Bicondicional
O bicondicional de duas proposições p e q é uma proposição verdadeira,
se V(p) = V(q), e falsa quando V(p) ≠ V(q). O bicondicional é uma dupla apli-
cação do condicional. A Tabela-verdade a seguir resume os valores lógicos.
Exemplos:
2 2
a) p : sen x + cos x = 1 V
sen x
q : tan x = V
cos x
V (p, q) = p ↔ q V
b) r : log2 8 = 3 V
9 3
s: = F
16 8
V (r, s) = r ↔ s F
Síntese da aula
Nesta aula, vimos que o valor lógico de uma proposição composta é
decorrente das proposições componentes e do conectivo lógico que as uniu. A
seguir, um resumo das opções.
p q p' q' p∧q p∨q p→q p↔q
V V F F V V V V
V F F V F V F F
F V V F F V V F
F F V V F F V V
Atividades
1. Entre as sentenças a seguir, identifique as proposições e escreva sua
negação.
2 2 2
a) p : (a + b) = a + 2ab + b .
b) q : o sol é azul.
π
c) r : 90° = rad.
2
d) s : ela é eleitora.
P (p,q) = p → q;
r: 2 é raiz da equação x2 – 7x + 10 = 0;
R (r, s) = r ↔ s;
Na próxima aula
Ampliaremos nossos estudos sobre o valor lógico das proposições. Veremos
como proceder quando, em uma mesma proposição, figuram mais do que um
conectivo lógico.
Anotações
Aula 3
Tabela-verdade
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
O domínio dos conectivos lógicos: conjunção, disjunção, condicional,
bicondicional e negação, vistos na aula anterior, são fundamentais para o
entendimento e assimilação desta aula. Caso julgue necessário, relei e refaça
as atividades correspondentes. Permanecendo dúvidas, entre em contato com
a web-tutoria.
Introdução
Nesta aula, aprenderemos a identificar a ordem de precedência entre os
vários conectivos lógicos que podem estar presentes em uma mesma propo-
sição composta, bem como praticar a montagem de Tabelas-verdade, muito
úteis na determinação do valor lógico das proposições.
2. Negação ( ' ).
3. Conjunção ( ∧ ) e disjunção ( ∨ ).
4. Condicional ( → ).
5. Bicondicional ( ↔ ).
3.2 Tabela-verdade
A elaboração da Tabela-verdade de uma fbf disciplina e facilita a obtenção
do valor lógico da proposição, já que sua montagem é feita passo-a-passo. A
Tabela-verdade tem um número de colunas que depende dos conectivos, e um
número de linhas que depende das letras que figuram na proposição.
Exemplos:
Construir a Tabela-verdade da fbf: p ∨ q' → (p ∨ q)'
p q q' p ∨ q' p∨q (p ∨ q)' p ∨ q' → (p ∨ q)'
V V F V V F F
V F V V V F F
F V F F V F V
F F V V F V V
Exemplo:
Exemplo:
Construir a Tabela-verdade da fbf: (p ∨ p') → (q ∧ q')
p q p' p ∨ p' q' q ∧ q' (p ∨ p') → (q → q')
V V F V F F F
V F F V V F F
F V V V F F F
F F V V V F F
Síntese da aula
Nesta aula, tivemos contato com as precedências entre os conectivos
lógicos. Vimos que, respeitados os parênteses, iniciamos pela negação,
passamos pelas conjunções e disjunções para, posteriormente, executarmos o
condicional e o bicondicional. Deixamos por último o conectivo principal.
Atividades
1. Construir a Tabela-verdade da proposição P(p, q) = (p ∧ q)' ∨ (q ↔ p)'.
c) P(p, q, r) = (p → q) ∧ (q → r) → (p → r)
b) P(p, q) = p' ∨ q → p
c) P(p, q) = (p ∨ q) ∧ (p ∧ q)'
A atividade 2 deve ter lhe mostrado que a proposição P(p, q, r) = p ∨ r' → q ∧ r'
possui a Tabela-verdade a seguir.
p q r p → q q → r (p → q) ∧ (q → r) p → r (p → q) ∧ (q → r) → (p → r)
V V V V V V V V
V V F V F F F V
V F V F V F V V
V F F F V F F V
F V V V V V V V
F V F V F F V V
F F V V V V V V
F F F V V V V V
Na próxima aula
Veremos as relações de implicação e de equivalência entre proposições.
Aula 4
Relações de Implicação
e Equivalência
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
São pré-requisitos para esta aula os estudos anteriores referentes aos conectivos
lógicos e às Tabelas-verdade. Releia as últimas duas aulas e, se julgar necessário,
refaça as atividades. Você deve perceber que os conteúdos vistos anteriormente
sempre serão a base dos estudos posteriores. Por isso não fique com dúvidas.
Introdução
Nesta aula, aprenderemos quando duas proposições são ditas indepen-
dentes e quando são ditas dependentes. Também veremos que a dependência
corresponde à existência de relação entre as proposições que podem ser de
implicação ou equivalência.
p q q→p
V V V
V F V
F V F
F F V
Exemplo:
Tabela-verdade
p q p∧q p' q' p' ∨ q' (p' ∨ q')'
V V V F F F V
V F F F V V F
F V F V F V F
F F F V V V F
É fácil concluir que duas proposições são equivalentes quando suas Tabelas-
verdade são iguais, pois teremos em uma mesma linha somente VV e FF.
p∧q⇔q∧p
• Leis associativas: p ∨ (q ∨ r) ⇔ (p ∨ q) ∨ r
p ∧ (q ∧ r) ⇔ (p ∧ q) ∧ r
• Leis distributivas: p ∧ (q ∨ r) ⇔ (p ∧ q) ∨ (p ∧ r)
p ∨ (q ∧ r) ⇔ (p ∨ q) ∧ (p ∨ r)
• Bicondicional: p ↔ q ⇔ (p → q) ∧ (q → p)
Síntese da aula
Nesta aula, vimos que proposições independentes são aquelas em que as
Tabelas-verdade contêm todas as quatro alternativas. A falta da alternativa VF
indica que uma proposição implica a outra. A falta das alternativas VF e FV
(tabelas-verdade iguais) indica que as proposições são equivalentes.
Atividades
Confirmar, por meio das Tabelas-verdade, que as proposições a seguir não
correspondem a implicações e sim a equivalências notáveis.
2. Leis distributivas: p ∧ (q ∨ r) ⇔ (p ∧ q) ∨ (p ∧ r)
p ∨ (q ∧ r) ⇔ (p ∨ q) ∧ (p ∨ r)
3. Bicondicional: p ↔ q ⇔ (p → q) ∧ (q → p)
(q → p) ⇔ (p' → q')
p ∨ (q ∧ r) ⇔ (p ∨ q) ∧ (p ∨ r)
(q → p) ⇔ (p' → q')
Na próxima aula
Tomaremos contato com os predicados, propriedades das variáveis e, na
seqüência, daremos início ao estudo da Álgebra Booleana, que é um modelo
matemático tanto da Lógica Proposicional como da Teoria dos Conjuntos. A
denominação Álgebra Booleana é devida ao matemático George Boole que,
em torno de 1850, preocupado com a solução de certos problemas eletrônicos,
estava interessado em regras algébricas para o raciocínio lógico, semelhante
às regras algébricas para o raciocínio numérico.
Anotações
Aula 5
Predicados e introdução
à Álgebra de Boole
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
São pré-requisitos para esta aula os conteúdos referentes à Teoria dos
Conjuntos que estudamos em nossa primeira aula, bem como os conhecimentos
sobre álgebra que trazemos conosco dos Ensinos Fundamental e Médio.
Releia a primeira aula e, se julgar necessário, refaça as atividades e relembre
conceitos em material de apoio referente ao Ensino Fundamental e Médio.
Introdução
Nesta aula, veremos que algumas proposições apresentam, além de quan-
tificadores, características das variáveis, que se denominam predicados.
5.1 Predicados
As sentenças ou as proposições matemáticas podem ser expressas, de
forma genérica, por meio de um quantificador e de um predicado.
• “∃” que se lê “existe”, “há pelo menos um”, “existe algum” ou “para
algum”.
A1) a + b ∈ B
A2) a ∙ b ∈ B
A3) a + b = b + a
A4) a ∙ b = b ∙ a
A5) a + (b ∙ c) = (a + b) ∙ (a + c)
A6) a ∙ (b + c) = (a ∙ b) + (a ∙ c)
A7) ∃0 ∈ B, tal que para cada a ∈ B, a + 0 = 0 + a = a
A8) ∃1 ∈ B, tal que para cada a ∈ B, a ∙ 1 = 1 ∙ a = a
A9) Para cada a ∈ B, ∃a' ∈ B, tal que a + a' = 0 e a ∙ a' = 1
Síntese da aula
Vimos, nesta aula, que as proposições podem ser compostas por quantifi-
cadores e predicados.
Atividades
1. Considere o conjunto P de todas as proposições. E que, se p ∈ P e se
q ∈ P, então p ∨ q ∈ P e p ∧ q ∈ P. Verifique que (P, ∨, ∧) atende às
propriedades comutativa, associativa e distributiva.
2. Dados os operadores aritméticos +, –, ∙, ÷, diga quais entre eles são opera-
dores binários no conjunto N dos números naturais.
3. Verifique se o conjunto B2 = {0, 1} e os operadores correspondem a uma
Álgebra de Boole.
∙ 0 1
0 0 0
1 0 1
+ 0 1
0 0 1
1 1 1
+ 0 a b 1
0 0 a b 1
a a a 1 1
b b 1 b 1
1 1 1 1 1
Associativa
p q r q∨r p ∨ (q ∨ r) p∨q (p ∨ q) ∨ r
V V V V V V V
V V F V V V V
V F V V V V V
V F F F V V V
F V V V V V V
F V F V V V V
F F V V V F V
F F F F F F F
p q r q∧r p ∧ (q ∧ r) p∧q (p ∧ q) ∧ r
V V V V V V V
V V F F F V F
V F V F F F F
V F F F F F F
F V V V F F F
F V F F F F F
F F V F F F F
F F F F F F F
Distributiva
p q r q∧r p ∨ (q ∧ r) p∨q p∨r (p ∨ q) ∧ (p ∨ r)
V V V V V V V V
V V F F V V V V
V F V F V V V V
V F F F V V V V
F V V V V V V V
F V F F F V F F
F F V F F F V F
F F F F F F F F
A1) a + b ∈ B
A2) a ∙ b ∈ B
A3) a + b = b + a
A4) a ∙ b = b ∙ a
A5) a + (b ∙ c) = (a + b) ∙ (a + c)
A6) a ∙ (b + c) = (a ∙ b) + (a ∙ c)
A1) a + b ∈ B
A2) a ∙ b ∈ B
A3) a + b = b + a
A4) a ∙ b = b ∙ a
A5) a + (b ∙ c) = (a + b) ∙ (a + c)
A6) a ∙ (b + c) = (a ∙ b) + (a ∙ c)
Na próxima aula
Daremos seguimento aos estudos ora iniciados conhecendo as Funções
Booleanas, as quais são definidas nas Álgebras de Boole.
Anotações
Aula 6
Funções Booleanas
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
Pré-requisitos
A aula anterior constitui-se em um pré-requisito para esta aula, na qual
mantivemos o primeiro contato com as Álgebras de Boole. Será importante
revê-la e, se necessário, refazer as atividades.
Introdução
As Funções Booleanas ocorrem nas Álgebras de Boole, satisfazem a
regras específicas e são construídas a partir de funções constantes e proje-
ções mediante um número finito de operações. As Funções Booleanas podem
assumir várias formas e, por conta disso, veremos uma forma canônica ou
padrão na qual possam ser transformadas.
• se para quaisquer valores de x1, ..., xn, ƒ(x1, ..., xn) = a, a ∈ B, então
ƒ é uma função booleana. É a função constante;
• se para quaisquer valores de x1, ..., xn , ƒ(x1, ..., xn) = xi para qualquer
i(i = 1, ..., n), então ƒ é uma função booleana. É a função projeção;
Exemplos:
ƒ(x) = x + x' a
ƒ(x, y) = x' y'
h(x, y) = x' y + xy' + y'
g(x, y) = (x + y)'
ƒ(x, y, z) = axy'z + yz' + a + xy
Síntese da aula
Vimos, nesta aula, que nas Álgebras de Boole podem se definidas funções,
denominadas funções booleanas, as quais ficam determinadas mediante o
cumprimento de algumas regras. Entre elas, a que determina a construção de
uma função booleana a partir de funções constantes e de projeção.
Vimos também que existe uma forma canônica para expressão das funções
booleanas, evitando-se assim que duas funções que resultam valores iguais
para os mesmos valores das variáveis sejam consideradas funções distintas.
Atividades
1. Suponha que ƒ é uma função booleana de uma variável sobre uma
Álgebra de Boole de quatro elementos, ƒ(0) = a' e ƒ(1) = a. Determine
uma expressão para ƒ.
Na próxima aula
Concluiremos esta etapa das Funções Booleanas estudando métodos de
minimização ou simplificação destas funções com ênfase para os Mapas de
Karnaugh.
Anotações
Aula 7
Simplificações de Funções
e Mapas de Karnaugh
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
• minimizar uma Função Booleana;
• representar funções booleanas pelo método do Mapa de Karnaugh.
Pré-requisitos
Álgebra de Boole e Funções Booleanas, estudas nas aulas anteriores,
constituem-se nos principais pré-requisitos para esta aula. Releia as duas aulas
anteriores e, se as dúvidas persistirem, entre em contato conosco!
Introdução
Minimizar ou simplificar uma função booleana é uma operação para
se reduzir ao mínimo o número de seus termos, resultando em economia do
circuito a que ela corresponde.
Veremos dois métodos: o Algébrico e o do Mapa de Karnaugh.
Teorema 1: (a')' = a
Teorema 2: ab + ab' = a
Teorema 3: 0'=1 e 1'=0
Teorema 4: (a ∙ b)' = a' + b' e (a + b)' = a' ∙ b' (Teorema de Morgan)
Teorema 5: ab + a'c + bc = ab + a'c
Teorema 6: (a + b)(a' + c)(b + c) = ac + a'b
Teorema 7: (a + b)(a' + c) = ac + a'b
Síntese da aula
Vimos, nesta aula, que minimizar ou simplificar funções booleanas é
útil e pode ser realizado de formas diferentes. Analisamos dois métodos, o
método algébrico e o método do Mapa de Karnaugh.
Atividades
1. Minimizar a função y = a((b' + c')(b' + c)) + ab + (a' + b')(b + c') pelo
método algébrico.
Anotações