Escolar Documentos
Profissional Documentos
Cultura Documentos
Mestre em Educação pela Universidade Interamericana (2019) com dissertação sobre a utilização dos jogos digitais
no ensino superior, especialista em Negócios e Mídias Digitais pelas Faculdades Metropolitanas Unidas (FMU, 2018),
possui MBA na área de Marketing em Vendas pela também pela FMU (2016), além de ser especialista na área de
Games: Produção e Programação pelo Centro Universitário Senac (2011) e bacharel em Sistemas de Informação pela
Universidade de Mogi das Cruzes (UMC, 2008).
Possui, ainda, experiência no âmbito da Educação, com ênfase no desenvolvimento de games e hipermídia,
atuando principalmente nos campos de fundamentação e desenvolvimento de metodologias e protótipos. É também
autor de diversos livros técnicos na área de Computação e Jogos Digitais.
CDU 519.67
U511.43 – 21
© Todos os direitos reservados. Nenhuma parte desta obra pode ser reproduzida ou transmitida por qualquer forma e/ou
quaisquer meios (eletrônico, incluindo fotocópia e gravação) ou arquivada em qualquer sistema ou banco de dados sem
permissão escrita da Universidade Paulista.
Prof. Dr. João Carlos Di Genio
Reitor
Comissão editorial:
Dra. Angélica L. Carlini (UNIP)
Dr. Ivan Dias da Motta (CESUMAR)
Dra. Kátia Mosorov Alonso (UFMT)
Apoio:
Profa. Cláudia Regina Baptista – EaD
Profa. Deise Alcantara Carreiro – Comissão de Qualificação e Avaliação de Cursos
Projeto gráfico:
Prof. Alexandre Ponzetto
Revisão:
Talita Lo Ré
Bruno Barros
Sumário
Algoritmos
APRESENTAÇÃO.......................................................................................................................................................9
INTRODUÇÃO............................................................................................................................................................9
Unidade I
1 INTRODUÇÃO À PROGRAMAÇÃO.............................................................................................................. 11
1.1 Programando um computador........................................................................................................ 12
1.1.1 Arquitetura de computador................................................................................................................ 12
1.1.2 O que impulsiona o trabalho de um projetista de computadores....................................... 16
1.2 Código fonte e código objeto.......................................................................................................... 17
1.2.1 O que é o código fonte?....................................................................................................................... 17
1.2.2 O que é código de objeto?................................................................................................................... 19
1.2.3 Qual é a diferença entre código fonte e código do objeto?.................................................. 19
1.3 Linguagens formais e ambiente de programação................................................................... 20
1.3.1 Visão geral sobre os ambientes de desenvolvimento de software...................................... 21
1.3.2 Programação em geral........................................................................................................................... 22
1.4 Algoritmos e fluxogramas................................................................................................................. 23
1.4.1 Algoritmo.................................................................................................................................................... 24
1.4.2 Fluxograma................................................................................................................................................. 26
2 TÉCNICAS BÁSICAS DE PROGRAMAÇÃO................................................................................................ 36
2.1 Tipos de dados........................................................................................................................................ 36
2.1.1 Tipos primitivos (primitive types)...................................................................................................... 39
2.2 Operadores............................................................................................................................................... 41
2.2.1 Operadores aritméticos......................................................................................................................... 41
2.2.2 Operadores relacionais........................................................................................................................... 43
2.2.3 Operadores lógicos.................................................................................................................................. 43
2.3 Expressões................................................................................................................................................ 44
2.4 Variáveis.................................................................................................................................................... 46
Unidade II
3 ESTRUTURA DE DADOS.................................................................................................................................. 54
3.1 Dados homogêneos.............................................................................................................................. 54
3.1.1 Variáveis indexadas unidimensionais.............................................................................................. 55
3.1.2 Matriz bidimencional............................................................................................................................. 62
3.2 Dados heterogêneos............................................................................................................................ 65
3.2.1 Tipo de dado derivado: estrutura de registro............................................................................... 66
3.2.2 Estrutura de matriz de registros........................................................................................................ 68
4 LINGUAGEM C................................................................................................................................................... 70
4.1 Noções de ambiente de desenvolvimento de programas em C......................................... 71
4.1.1 Linha de comentário.............................................................................................................................. 71
4.1.2 Directiva do pré-processador (preprocessor directive)............................................................. 72
4.1.3 Declaração global (global declaration)........................................................................................... 72
4.1.4 A função main........................................................................................................................................... 72
4.1.5 Etapas para compilar e executar os programas em C.............................................................. 73
4.1.6 Nomenclatura dos identificadores (nome das variáveis)........................................................ 76
4.2 Estrutura e estilo de programas em linguagem C................................................................... 76
4.2.1 Palavra-chave (keyword)....................................................................................................................... 76
4.2.2 Sequências de escape............................................................................................................................ 77
4.2.3 Especificadores de formato................................................................................................................. 77
4.3 Tipos e variáveis primitivos............................................................................................................... 78
4.3.1 Tipos de dados (data types)................................................................................................................. 78
4.3.2 Variáveis (variables)................................................................................................................................. 78
4.4 Operadores matemáticos e lógicos................................................................................................ 80
4.4.1 Expressões................................................................................................................................................... 80
4.4.2 Operadores.................................................................................................................................................. 80
4.5 Estrutura de decisão e laços de repetição................................................................................... 83
4.5.1 Estrutura de decisão............................................................................................................................... 83
4.5.2 Laços de repetição................................................................................................................................... 99
Unidade III
5 FUNÇÕES...........................................................................................................................................................118
5.1 Objetos e classes..................................................................................................................................122
5.1.1 Introdução à programação orientada a objetos...................................................................... 122
5.1.2 Objetos...................................................................................................................................................... 123
5.1.3 Classes....................................................................................................................................................... 124
5.1.4 Storage classes....................................................................................................................................... 124
5.2 Atributos e associações.....................................................................................................................126
5.2.1 Atributos................................................................................................................................................... 126
5.2.2 Associações.............................................................................................................................................. 127
5.3 Métodos..................................................................................................................................................127
6 UTILIZAÇÃO DE ARQUIVOS, DIRETÓRIOS E DISCOS.........................................................................129
6.1 Formatação de impressão................................................................................................................129
6.1.1 Entrada e saída de dados................................................................................................................... 129
6.1.2 Arquivos.................................................................................................................................................... 133
Unidade IV
7 VETORES, MATRIZES E ESTRUTURAS......................................................................................................144
7.1 Matrizes...................................................................................................................................................144
7.1.1 Matriz unidimensional........................................................................................................................ 144
7.1.2 Matriz bidimensional........................................................................................................................... 147
7.1.3 Matriz interna........................................................................................................................................ 150
7.2 Estruturas...............................................................................................................................................152
7.2.1 Estruturas e typedef............................................................................................................................ 152
8 ALGORITMOS DE BUSCA E ORDENAÇÃO..............................................................................................155
8.1 Algoritmos de ordenação.................................................................................................................156
8.2 Algoritmos de busca..........................................................................................................................163
8.2.1 Pesquisa sequencial............................................................................................................................. 164
8.2.2 Pesquisa binária..................................................................................................................................... 167
APRESENTAÇÃO
Ao longo de sua leitura, será discutido que o algoritmo é usado para fornecer uma solução para
um problema específico na forma de etapas bem definidas. Sempre que utilizamos um dispositivo
como o computador para resolver um problema específico, as etapas que levam à solução devem
ser adequadamente comunicadas e planejadas. Durante a execução de um algoritmo em um
computador, várias operações, como adições e subtrações, são combinadas para executar operações
matemáticas mais complexas. Os algoritmos podem ser expressos usando linguagem natural,
fluxogramas etc.
Ao ler este livro-texto, espera-se que você compreenda as noções mais básicas de programação
de computadores através do ensino de algoritmos com o uso de uma linguagem e de um ambiente de
programação. Detalhando de forma melhor, os objetivos da disciplina são: desenvolver as habilidades
de programação com estruturas de controle e modularização a partir do uso da linguagem de
programação C.
Este livro-texto foi divido em quatro unidades e cada unidade foi subdividida em dois capítulos.
Na primeira unidade, o foco é apresentar a importância da definição do algoritmo a partir da construção
do Portugol e Fluxograma, compreendendo as técnicas básicas de programação. Na segunda unidade, são
apresentas a aplicação dos princípios da estrutura de dados e a linguagem C. Aborda-se, ainda, a
programação como o processo de criação de um conjunto de instruções que informam ao computador
como executar uma tarefa. A terceira unidade volta-se ao uso das funções e à utilização de arquivos,
diretórios e discos. Para finalizar, a quarta unidade tem como objetivo apresentar a utilização dos vetores
e matrizes no trabalho com os dados, sendo tratados também a aplicação do conceito de estruturas, os
algoritmos de busca e algoritmos de ordenação.
Esperamos que você tenha uma boa leitura e se sinta motivado a ler e conhecer mais sobre o
desenvolvimento de algoritmo e a sua implementação na linguagem C.
INTRODUÇÃO
Para usar um computador com a finalidade de executar processos, é necessário realizar algumas
tarefas, como:
9
Para isso, é importante entender que os algoritmos são independentes da linguagem de programação
usada e que cada algoritmo pode ser expresso em diferentes linguagens de programação, executadas em
computadores diferentes. Essa é a razão pela qual o design de algoritmos é um aspecto fundamental da
ciência da computação: o design de um algoritmo é uma atividade intelectual, significativamente
mais difícil do que expressar o algoritmo como um programa. Entre as habilidades necessárias para
projetar algoritmos, estão a criatividade e o raciocínio lógico.
A linguagem de máquina refere-se ao comando específico que você deseja que o computador
execute. Cada comando tem o seu significado específico, que pode representar, por exemplo,
um comando de entrada ou de saída dados. Existem três elementos fundamentais da linguagem
que contribuem para o sucesso ou falha do ciclo de comunicação: a semântica, a sintaxe e os
participantes desse processo.
10
ALGORITMOS
Unidade I
1 INTRODUÇÃO À PROGRAMAÇÃO
Pense em algumas das maneiras diferentes pelas quais as pessoas usam computadores. Na
escola, os alunos usam computadores para desenvolver tarefas como escrever, pesquisar artigos,
enviar e-mail e participar de aulas on-line. No trabalho, as pessoas utilizam computadores para
analisar dados, fazer apresentações, realizar transações comerciais, comunicar-se com clientes e
colegas de trabalho, controlar máquinas nas instalações da fábrica e fazer muitas outras coisas.
Em casa, as pessoas usam computadores para desenvolver tarefas como efetuar o pagamento de
contas, realizar compras on-line, falar com amigos e familiares e jogar.
Este tópico criará uma base sólida de conhecimento que você utilizará continuamente
ao estudar ciência da computação. Primeiro, discutiremos os componentes físicos dos quais
os computadores geralmente são feitos. Em seguida, examinaremos como os computadores
armazenam dados e executam programas. Finalmente, vamos discutir o processo de documentação
a partir da construção dos fluxogramas.
11
Unidade I
Lembrete
Muitas pessoas pensam que a programação de computadores é uma arte misteriosa, mas,
quando lhe perguntam como chegar a um local específico, você responde com um programa,
mesmo que você provavelmente o chame de “instruções”. Suas instruções podem não funcionar
porque você se esqueceu de uma curva ou não se deu conta de um beco que a pessoa iria encontrar
no meio do caminho, algo que seria denominado pelos programadores de computador como bug.
Uma partitura musical é outra forma de programa com símbolos especiais que devem ser
colocados corretamente dentro de duas dimensões. Um programa de música (partitura) também
pode ser convertido para algum formato mecânico ou eletrônico para que dispositivos, como
teclados modernos, possam tocá-lo automaticamente (o que vale também para rolos de piano,
dispositivos que já existiam há muito tempo antes de os primeiros computadores eletrônicos serem
inventados). Tenho certeza de que você seguiu e forneceu diversas instruções ao longo de sua vida,
e a programação de computadores é apenas outra maneira de fornecer um conjunto exato de
instruções para alcançar um determinado objetivo.
12
ALGORITMOS
• a tecnologia de computador subjacente que manipula essas instruções (por vezes, chamadas de
microarquitetura).
Stallings (2010) apresenta que a arquitetura de Von Neumann descreve a estrutura na qual os
computadores de hoje são construídos, e sua ideia original está associada ao computador ENIAC.
Embora o computador ENIAC pudesse ser programado, entrar nos programas ou alterá-los era
um procedimento difícil, pois era necessário programar de forma manual, girando interruptores
e cabos de conexão e desconexão. O matemático John von Neumann (1903-1957) é geralmente
creditado com a ideia de que armazenar o código do programa junto com os dados armazenados
é a melhor alternativa para superar os inconvenientes da programação externa (de forma manual,
como acontecia com o ENIAC).
Observação
Em 1945, o conceito de “programa armazenado” foi sugerido pela primeira vez como base
nesse escopo para a construção do projeto do EDVAC (Electronic Discrete Variable Computer), e,
em 1946, o computador IAS foi desenvolvido no Princeton Institute for Advanced Studies. Essa
máquina foi concluída apenas em 1952, mas sua estrutura ainda pode ser considerada a base
original das arquiteturas dos computadores de hoje. Você pode pensar que isso é óbvio: é claro
que os programas são armazenados com os dados “restantes”. No entanto, tente entender que
nos primeiros anos da computação, foi feita uma distinção rigorosa entre os dados que estavam
armazenados e os métodos de processamento (programas) aplicados para manipular os dados. A
percepção de que as instruções podem ser codificadas e armazenadas como dados “comuns” foi
uma grande inovação (BROOKSHEAR, 2009).
Com a primeira versão do EDVAC, surgiram ideias muito importantes que representaram um
dos marcos dos computadores mais importantes da história. Entre elas, podemos relacionar:
• um armazenamento no qual os dados podem ser lidos/gravados (instruções são como os dados,
eles residem na mesma memória);
13
Unidade I
• a unidade lógica aritmética (que executa operações como adição e subtração nos dados);
• Mainframes: computadores grandes que podem suportar muitos usuários enquanto oferecem
um grande poder de computação. A maioria das inovações, tanto na arquitetura quanto na
organização, foram feitas principalmente nos mainframes.
• Minicomputadores: adotaram muitas das técnicas do mainframe, projetadas para vender por
um valor mais acessível e satisfazendo as necessidades de computação para grupos menores de
usuários. Trata-se do grupo de minicomputadores que apresentou um ritmo mais rápido de evolução
(desde 1965, quando a DEC introduziu o primeiro minicomputador, o PDP-8), principalmente
devido à evolução da tecnologia de circuitos integrados (o primeiro circuito integrado, CI,
apareceu em 1958).
avanços tecnológicos: CPUs mais rápidas, semicondutores, memórias etc. Ao longo do tempo,
muitos dos conceitos anteriormente usados em
mainframes e minicomputadores tornaram-se
comuns e foram aplicados nos microcomputadores.
Observação
Por muitos anos, a evolução dos computadores preocupou-se com o problema de compatibilidade
de código de objeto. Uma nova arquitetura tinha que ser alterada, pelo menos em parte, tornando‑se
compatível com os mais antigos, da mesma forma que programas mais antigos deveriam continuar
funcionando (sendo executados) sem alterações nas novas máquinas. Um exemplo dramático é a
arquitetura IBM-PC, lançada em 1981, a qual se mostrou tão bem-sucedida que os desenvolvimentos
tiveram que estar em conformidade com o primeiro lançamento, apesar das falhas que se tornaram
evidentes alguns anos depois.
Segundo Manzano, “o computador eletrônico, não importando seu tamanho, é uma coleção de
componentes interligados com o objetivo de efetuar (processar) operações aritméticas e lógicas
de grandes quantidades de dados” (2019, p. 17). A figura a seguir mostra, de forma esquemática, os
componentes de um computador eletrônico.
Memória principal
Memória secundária
15
Unidade I
Saiba mais
Projetar um computador é uma tarefa desafiadora. Envolve o software (pelo menos quanto ao
design do conjunto de instruções) e o hardware (em todos os seus níveis: organização funcional,
projeto lógico e implementação). A própria implementação lida com o design/especificação de
ICS (Integrated Computer Systems), embalagens, ruídos, energia, refrigeração etc. Seria um erro
terrível desconsiderar um aspecto ou outro do design do computador, pois o designer dessa área
precisa projetar uma máquina ideal em todos os níveis mencionados. Você não pode encontrar um
aspecto que não esteja familiarizado com uma ampla gama de tecnologias, desde o compilador e
o projeto do sistema operacional para o projeto lógico e a embalagem.
16
ALGORITMOS
A implementação de uma máquina refere-se à lógica e às técnicas de design que são usadas
para implementar uma instância da arquitetura. É possível ter diferentes implementações para
alguma arquitetura, da mesma forma que existem possibilidades diferentes para construir uma
casa usando os mesmos planos, mas com materiais e técnicas distintos. A implementação tem
dois aspectos:
• a organização refere-se a aspectos lógicos de uma implementação (em outras palavras, refere-se
ao alto nível dos aspectos do design: design da CPU, sistema de memória, barramento etc.);
De acordo com Difference between source code and object code (2018), um software é uma
coleção de programas. Um programa é um conjunto de instruções fornecidas a um computador
para executar uma tarefa específica. Suas instruções são escritas por um programador utilizando
uma linguagem de programação. Portanto, desenvolver um software significa desenvolver um
conjunto de programas. A atividade de escrever programas é conhecida como programação. O
processo seguido para desenvolver um software completo é chamado de Software Development
Life Cycle (SDLC).
Observação
As etapas envolvidas no SDLC fornecem uma compreensão do código fonte e do código do objeto.
A diferença entre o código fonte e o código objeto é que o primeiro é uma coleção de instruções
de computador escritas usando um manual legível por humanos a partir de uma linguagem de
programação, enquanto o código do objeto (object code) representa uma sequência de instruções
em uma linguagem de máquina e é a saída após o compilador converter o código fonte.
Segundo Difference between source code and object code (2018), antes de desenvolver o software,
deve haver uma compreensão dos requisitos (funcionais e não funcionais). Os analistas obtêm as
funcionalidades necessárias do usuário e as documentam. Esse documento contém justamente a
17
Unidade I
O projeto do sistema pode ser feito usando fluxogramas, diagramas de fluxo de dados (Data
Flow Diagrams – DFD). As saídas da fase de design podem ser a produção do design de banco
de dados, design de processo etc. Após a fase de design ser concluída, esses projetos podem ser
implementados usando uma linguagem de programação relevante por um programador.
As linguagens de baixo nível possibilitam uma comunicação mais natural com a máquina. É uma
maneira de codificação considerada por muitos como de grande dificuldade para uso. Destacam-se
nessa categoria as linguagens de máquina e Assembly. A linguagem Assembly (e não assembler) é
mais fácil de usar do que uma linguagem de máquina, por ser baseada em comandos de instruções
em formato mnemônico (siglas com significado definido de suas ações) (MANZANO, 2019, p. 24).
A linguagem Assembly não é mais a linguagem na qual novos aplicativos são escritos, embora as
partes mais sensíveis continuem sendo escritas nela, e isso se deve aos avanços nas linguagens de
programação e na tecnologia dos compiladores. A obsolescência da programação em linguagem Assembly,
bem como a criação de sistemas operacionais portáteis (como UNIX) reduziram os riscos de introduzir
novas arquiteturas. Novas famílias de computadores estão surgindo, muitos deles híbridos de famílias
“clássicas”: supercomputadores gráficos, multiprocessadores, Massively Parallel Processors (MPP),
minisupercomputadores etc.
Observação
Existem muitas linguagens de programação. Algumas delas são C, C++, C#, Python, Java
etc. O programador pode selecionar a linguagem de programação de acordo com o projeto do
software e converter os diagramas e a documentação em programas de computador. As instruções
foram escritas para alcançar as funcionalidades do software necessário usando a linguagem de
programação. As instruções têm uma sintaxe semelhante ao idioma inglês e legível por um ser humano.
Essa coleção de instruções escritas usando uma linguagem de programação legível por humanos é
chamada de código fonte.
18
ALGORITMOS
tela, codificado nas linguagens de alto nível (Pascal, C++ e C), e observe que elas são mais fáceis de
expressar uma ideia do que suas equivalentes em baixo nível (MANZANO, 2019).
Difference between source code and object code (2018) apresenta que o código-fonte é
compreensível por humanos porque possui uma sintaxe semelhante à do inglês. Não é compreensível
por um computador ou uma máquina. Os computadores ou máquinas compreendem uma linguagem
binária que consiste em zeros e um. Portanto, é necessário converter o código-fonte em um formato
compreensível pela máquina. O compilador converte o código-fonte em uma linguagem binária ou
linguagem de máquina.
Esse código convertido é conhecido como código do objeto, o qual é compreensível pelo
computador (ou seja, as instruções dadas pelo ser humano são compreensíveis pelo computador a
partir dessa conversão).
Observação
Os programas de computador são úteis para fornecer instruções ao computador para executar
uma tarefa específica. Esses programas são escritos usando linguagens de programação. Existem
diversas linguagens de programação e o programador pode selecionar uma linguagem para
desenvolver os seus programas ou software. “Código fonte” e “código objeto” são dois termos
associados à área de programação, e, como vimos, a diferença entre eles é que o código fonte é
uma coleção de instruções de computador escritas usando um código legível por humanos a partir
de uma linguagem de programação, enquanto o código do objeto é uma sequência de instruções
na linguagem de máquina, a saída após o compilador converter o código fonte. O quadro a seguir
detalha melhor a comparação entre o código fonte e o código do objeto.
19
Unidade I
Saiba mais
De acordo com Slonneger e Kurtz (1995), a linguagem fornece um meio de comunicação sonora
e escrita. Os seres humanos aprendem uma língua como consequência de suas experiências de vida,
mas na linguística (a ciência das línguas) as formas e os significados das línguas são submetidos a
um exame mais rigoroso. Essa ciência também pode ser aplicada no processo de desenvolvimento de
programas computacionais. Em contraste com as linguagens naturais, com as quais comunicamos
nossos pensamentos e sentimentos, as linguagens de programação podem ser vistas como linguagens
artificiais definidas por homens e mulheres inicialmente para fins de comunicação com computadores,
e, o que é mais importante, para comunicar algoritmos entre as pessoas.
Slonneger e Kurtz (1995) mostram que muitos dos métodos e grande parte da terminologia
da linguística se aplicam às linguagens de programação. Por exemplo, as definições de idioma
consistem em dois componentes:
• Sintaxe: refere-se à maneira como os símbolos podem ser combinados para criar frases (ou programas)
no idioma relacionado. Ela define as relações formais entre os constituintes de uma linguagem,
fornecendo, assim, uma descrição estrutural das várias expressões que a compõem. A sintaxe lida
apenas com a forma e a estrutura dos símbolos em um idioma, sem se deter ao seu significado.
Exemplo de aplicação
A evolução dos ambientes também exige a distinção dos recursos básicos do sistema operacional
(serviços fundamentais como memória, dados e o gerenciamento de vários programas) a partir da
funcionalidade aprimorada que caracteriza os ambientes de última geração. Essa funcionalidade
aprimorada é normalmente obtida por meio de ferramentas como navegadores, gerenciadores de
janelas, gerenciadores de configuração e gerenciadores de tarefas. Em certo sentido, os ambientes
têm evoluído de acordo com o entendimento da comunidade de engenharia de software sobre as
tarefas envolvidas no desenvolvimento de sistemas de software.
21
Unidade I
Dart et al. (1992) citam em sua obra uma taxonomia dessas tendências. Segundo os autores, a
taxonomia compreende quatro categorias, cada uma representando tendências com um impacto
significativo nos ambientes (em suas ferramentas, interfaces de usuário e arquiteturas). Tais
categorias são:
• Ambientes do kit de ferramentas: fornecem uma coleção de ferramentas que incluem o suporte
independente da linguagem para tarefas de programação de forma ampla, como o gerenciamento
de configuração e o controle de versão.
• Ambientes baseados em métodos: incorporam suporte para uma ampla gama de atividades
no processo de desenvolvimento de software, incluindo tarefas como gerenciamento de equipe
e projeto. Esses ambientes também incorporam ferramentas para o desenvolvimento de métodos
específicos e design.
ser bastante eficazes para a manutenção de grandes sistemas de software. Devido às técnicas
especializadas usadas para implementá-las, esses ambientes geralmente não oferecem suporte
a várias linguagens e, em alguns casos, não facilitam a portabilidade de programas e aplicativos.
Além disso, os ambientes centrados na linguagem podem se tornar grandes demais para uma
pessoa compreender e expandir.
Dart et al. (1992) afirmam que a motivação inicial para ambientes orientados para a estrutura
era dar aos usuários uma ferramenta interativa. Esse recurso foi estendido para fornecer aos
ambientes de programação de usuário um suporte quanto à semântica interativa, processo de
execução de programa e sua depuração. O editor é o componente central de tais ambientes, é a
interface pela qual o usuário interage e pela qual todas as estruturas são manipuladas. Os esforços
foram continuados para possibilitar o suporte à programação, pois os ambientes orientados à
estrutura fizeram várias contribuições para a tecnologia do ambiente, como o fornecimento
da manipulação direta do programa, a verificação incremental da semântica estática e diversas
informações acessíveis ao usuário; além disso, e talvez o mais importante, a capacidade de
descrever formalmente a sintaxe e a semântica de uma linguagem a partir da qual uma instância
de um editor de estrutura pode ser gerada.
Saiba mais
23
Unidade I
O primeiro e o último passo estão atrelados às tarefas que os programadores devem realizar,
porém a segunda etapa está relacionada com uma demanda do complier (compilador). A maioria
dos programadores investe muito tempo na primeira etapa, pois converter a ideia (problema)
em um código fonte é muito difícil quando estamos diante de algoritmos complexos; às vezes,
é possível inclusive finalizar a codificação do projeto, porém, depara-se com diversos erros de
compilação. Encontrar esses erros e corrigi-los é uma tarefa muito árdua.
Por esse motivo, uma das possibilidades que temos disponíveis é desenvolver os algoritmos a
partir da criação dos fluxogramas, que nada mais são do que a base do modelo que os desenvolvedores
podem utilizar para redigir suas ideias em papéis (de forma manual). Dessa forma, é fácil encontrar
os erros no processo de criação sem ao menos implementar uma linha de código.
1.4.1 Algoritmo
Olhe à sua volta, os computadores e as redes estão por toda parte, permitindo diversas atividades
humanas complexas, como a educação, o comércio, o entretenimento, a pesquisa, a fabricação, a
gestão da saúde, a comunicação e até a guerra. Dos dois principais fundamentos tecnológicos dessa
incrível proliferação, um é o ritmo veloz com o qual avança a microeletrônica, que possibilitou um
hardware cada vez mais rápido, o outro é a possibilidade de construir algoritmos eficientes que
estão alimentando a revolução do computador.
Observação
O termo algoritmo normalmente causa certa estranheza a algumas pessoas, pois muitas
acreditam que está escrito ou pronunciado de forma incorreta. A palavra algoritmos vem do latim,
dos termos algorismos ou algorithmos, que estão associados à ideia de algarismos por influência
do idioma grego a partir do termo arithmós, que remete a números. A palavra algoritmo é aplicada e
empregada, segundo o dicionário Houaiss, em matemática e computação. Na esfera matemática, está
associada a um processo de cálculo; encadeamento das ações necessárias ao cumprimento de uma
tarefa; processo efetivo, que produz uma solução para um problema em um número finito de etapas.
Na ciência da computação (informática), está associada a um conjunto das regras e procedimentos
lógicos perfeitamente definidos que levam à solução de um problema em um número finito de etapas
(MANZANO, 2019, p. 30).
Walia (2020) afirma que a palavra algorithm (algoritmo) refere-se ao nome do matemático
Al‑khowarizmi, que significa um procedimento ou uma técnica. O engenheiro de software geralmente
usa um algoritmo para planejar e resolver os problemas, isso ocorre porque um algoritmo é uma
sequência de etapas para resolver um problema específico ou um conjunto ordenado de etapas
inequívocas que produz um resultado e termina em um tempo finito.
25
Unidade I
• Output (saída): espera-se que cada algoritmo produza pelo menos um resultado (processo).
• Definir a entrada de seus algoritmos: muitos algoritmos recebem dados para serem
processados, por exemplo, para calcular a área de entrada do retângulo, podem ser a altura e a
largura do retângulo.
• Definir as variáveis: as variáveis do algoritmo permitem que você as utilize em mais de um lugar.
Podemos definir duas variáveis p ara altura e largura do retângulo como height e width (ou H & W).
• Descrever as operações do algoritmo: use a variável de entrada para fins de cálculo, por
exemplo. Para encontrar a área do retângulo, multiplique as variáveis height
e width e armazene
o valor em uma nova variável que poderíamos nomear como area. As operações de um algoritmo
podem assumir a forma de várias etapas e depender do valor das variáveis de entrada.
• Saída dos resultados das operações do seu algoritmo: no caso da área do retângulo, a saída
será o valor armazenado na variável area. Caso as variáveis de
entrada descrevam um retângulo
com uma altura de 5 e uma largura de 2, o algoritmo produzirá o valor 10.
Lembrete
1.4.2 Fluxograma
De acordo com Walia (2020), o primeiro design do fluxograma foi desenvolvido em 1945, por
John Von Neumann. Diferentemente de um algoritmo, o fluxograma utiliza símbolos para projetar
uma solução para um problema. Ao olhar para um fluxograma, você pode entender as operações e
a sequência de operações que serão executadas em um sistema. O fluxograma é frequentemente
considerado como a planta de um projeto usado para resolver um problema específico.
26
ALGORITMOS
Os símbolos devem ser conectados uns aos outros por linhas de setas que mostrem explicitamente
a direção do fluxo a ser executado pelo programa.
A estrutura visual do diagrama deve, a princípio, estar orientada no sentido de cima para baixo,
da direita para a esquerda e ser desenhada no centro da folha de papel. No entanto, dependendo da
situação, esse critério pode ser alterado, o que leva à necessidade de manter o uso das linhas de seta
indicando a direção do fluxo.
Observação
De acordo com Soffner (2013), os algoritmos podem ser representados de forma gráfica por
meio de símbolos padronizados; são os fluxogramas, também chamados de diagramas de blocos. A
seguir, temos uma imagem mostrando como os algoritmos são representados.
27
Unidade I
A definição das variáveis nas operações de entrada e saída será feita nos
símbolos apropriados. Quando houver mais de uma variável a ser utilizada,
serão separadas por vírgulas.
28
ALGORITMOS
A figura a seguir apresenta a estrutura lógica de operação computacional mais trivial e comum,
a estrutura de operação computacional de sequência. Sendo definidas três variáveis (A, B e R),
pede-se para realizar a soma das variáveis A e B e exibir o resultado (R).
Início
A, B
R←A+B
Fim
Complementa Soffner:
A decisão simples testa uma condição e realiza uma ação caso esta seja
verdadeira, sem se preocupar em realizar uma ação no caso de verificação da
condição oposta. Por exemplo, se um número digitado for menor que zero,
29
Unidade I
Start Start
( ) ( )
T F T
Stop Stop
( ) ( )
Figura 4 – Decisão (ou seleção) simples e composta, em que “start” indica o início do
fluxograma e “stop” indica o fim (conclusão) do fluxograma
A repetição com teste no início avalia uma condição antes de executar as ações previstas e repetitivas;
se válida, o processamento entra em iteração (loop), até que tal condição não seja mais verdadeira,
quando o programa seguirá normalmente para o restante das rotinas programadas. Essa repetição é
perfeita para testes de senhas antes do acesso a funções repetitivas do programa. Já a repetição com
teste no fim executará uma ação pelo menos uma vez antes de decidir se ela continuará. É muito
utilizada em validações de entradas de dados, antes que se dê a sequência ao programa (SOFFNER,
2013, p. 24).
30
ALGORITMOS
T
Contador
=1
Contador T
<=10
T F
F
Ação
Stop Stop
( ) ( )
Contador
++
Stop
( )
A seguir, temos uma estrutura de operação computacional de decisão simples. Sendo definidas
três variáveis (A, B e R), pede-se para realizar a soma das variáveis A e B e exibir o resultado (R),
mas isso apenas caso o valor atribuído para a variável A seja maior do que o valor da variável B.
Início
A, B
N S
A>B
R←A+B
Fim
31
Unidade I
Exemplo de aplicação
Crie um fluxograma que solicite para o usuário digitar dois números (numA e numB). Caso o dobro
do primeiro número (numA) seja maior do que o segundo número (numB), o programa deve exibir a
seguinte mensagem: “O dobro do primeiro número é maior do que o segundo número que foi digitado”.
A seguir temos uma estrutura de operação computacional de decisão composta com três
variáveis (A, B e R). Se o valor de A for maior do que o valor de B (A>B), pede-se para realizar a
soma das variáveis A e B e exibir o resultado (R); já se o valor de A for menor ou igual ao valor de B,
pede-se para realizar a subtração das variáveis A e B e exibir o resultado (R).
Início
A, B
N S
A>B
R←A-B R←A+B
Fim
Exemplo de aplicação
Crie um fluxograma no qual é possível solicitar ao usuário que digite seu sexo utilizando as seguintes
siglas: M (sexo masculino) ou F (sexo feminino). Ao final do fluxograma, o programa deve exibir qual é
o sexo que o usuário digitou por extenso.
32
ALGORITMOS
Início
I←1
N
I <= 10
S
I
I←I+1
Fim
Exemplo de aplicação
Crie um fluxograma que solicite ao usuário digitar o nome de 15 frutas utilizando a estrutura de
operação computacional de laço de repetição condicional pré-teste.
33
Unidade I
Início
I←1
I←I+1
N
I > 10
S
Fim
Exemplo de aplicação
Crie um fluxograma que solicite ao usuário digitar o CPF dos cem funcionários que trabalham na filial
de uma empresa de confecção utilizando a estrutura de operação computacional de laço de repetição
condicional pós-teste.
Início
I ← 1, 10, 1
Fim
34
ALGORITMOS
Exemplo de aplicação
Crie um fluxograma que exiba todos os números pares do intervalo de 1 a 100 utilizando a estrutura
de operação computacional de laço de repetição incondicional.
• Sequence (sequência): na estrutura de sequência, as instruções são colocadas uma após a outra
e a execução ocorre de cima para baixo.
• Loop (repetição): a estrutura de repetição permite que uma instrução seja executada
repetidamente com base em certas condições de loop.
35
Unidade I
Saiba mais
O computador digital moderno foi inventado e planejado como um dispositivo que deve
facilitar e acelerar cálculos complicados e demorados. Na maioria dos aplicativos, a capacidade de
armazenar e acessar grandes quantidades de informação desempenha um papel preponderante,
sendo considerada sua principal característica. Já a capacidade de calcular (ou seja, executar
aritmética) em muitos casos se tornou quase irrelevante.
36
ALGORITMOS
Nesse contexto, o significado das linguagens de programação torna-se aparente. Uma linguagem
de programação representa um computador abstrato capaz de interpretar os termos usados nesse
idioma, que podem incorporar um certo nível de abstração dos objetos usados pela máquina
real. A importância de usar uma linguagem que ofereça um conjunto conveniente de abstrações
básicas comuns à maioria dos problemas do processamento de dados está principalmente na
área de confiabilidade dos programas resultantes. É mais fácil projetar um programa baseado no
raciocínio com noções familiares de números, conjuntos, sequências e repetições do que em bits e
unidades de armazenamento. Obviamente, um computador real representa todos os dados, sejam
números, conjuntos ou sequências, como uma grande massa de bits. Mas isso é irrelevante para
o programador, uma vez que não é necessário se preocupar com os detalhes de representação
das abstrações escolhidas e podemos utilizar a representação correspondente escolhida pelo
computador (ou compilador) para o desenvolvimento dos fins declarados.
De acordo com Yang (s.d.), um tipo de dados define uma coleção de valores de dados e um
conjunto de operações predefinidas nesses valores. A partir desse princípio, é possível afirmar que:
• esses descritores são criados pelo compilador, geralmente como parte da tabela de símbolos, e são
usados durante a compilação;
37
Unidade I
• para atributos dinâmicos, parte ou todo o descritor deve ser mantido durante a execução;
• os descritores são usados para verificação de tipo e por operações de alocação e desalocação.
Wirth (1985) afirma que, na Matemática, é costume classificar variáveis de acordo com certas
características importantes. Claro que são feitas distinções entre variáveis reais,
complexas e
lógicas ou entre variáveis que representam os valores individuais, conjuntos de valores, conjuntos
de conjuntos, ou, ainda, entre funções ou conjuntos de funções. Essa noção de classificação é
igualmente (se não mais) importante no processamento de dados. A partir do princípio de que
toda constante, variável, expressão ou função é de um certo tipo, esse tipo caracteriza o conjunto
de valores aos quais uma constante pertence, que pode ser assumida por uma variável ou
expressão ou que pode ser gerada por uma função. Em textos matemáticos, o tipo de uma variável
é geralmente dedutível do tipo de letra sem consideração de contexto, o que não é viável em
programas de computador. Geralmente, há um tipo de letra disponível no computador, portanto,
a regra amplamente aceita é a de que o tipo associado deve ser feito de maneira explícita em
uma declaração da constante, variável ou função, e que essa declaração precede textualmente a
aplicação dessa constante, variável ou função.
Observação
primeiramente ser abstraídos para serem, então, processados. Eles podem ser classificados em
três tipos primitivos ou tipos básicos: numéricos (representados por valores numéricos inteiros ou
reais), caracteres (representados por valores alfabéticos ou alfanuméricos) e lógicos (valores dos
tipos falso e verdadeiro) (MANZANO, 2019, p. 51).
Segundo Wirth (1985), os tipos primitivos padrão são aqueles que estão disponíveis na maioria
dos computadores como recursos internos. Eles incluem os números inteiros, os valores lógicos
(verdadeiro ou falso) e um conjunto de caracteres (texto). Em muitos computadores, números
fracionários também são incorporados, juntamente com as operações aritméticas padrão dos
números reais. Nós classificamos esses identificadores a partir da seguinte nomenclatura: integer
(números inteiros), real (números fracionários), boolean (valores lógicos: verdadeiro e falso) e
char (caracter).
Lógico: são lógicos os dados com valores binários do tipo sim e não,
verdadeiro e falso, 1 e 0, entre outros, em que apenas um dos valores
pode ser escolhido. Para que um dado do tipo lógico seja devidamente
usado, é necessário estabelecer a forma de sua representação, que, nesse
caso, será feita com os valores .F. (para representar falso, pode-se também
fazer referência como .FALSO.) e .V. (para representar verdadeiro, pode-se
também fazer referência como .VERDADEIRO.) (MANZANO, 2019, p. 51-52,
grifo do autor).
39
Unidade I
Observação
Tipos básicos Eles são tipos aritméticos e podem ser calssificados como tipos inteiros (integer) ou
(basic Types) tipos de ponto flutuante/números reais (floatingpoint)
Tipos enumerados São tipos aritméticos usados para definir as variáveis a que só podem ser
(enumerated types) atribuídos certos valores inteiros discretos (discrete integer) ao longo do programa
Tipo nulo
(the type void) O especificador de tipo void indica que nenhum valor está disponível
Tipos derivados Eles incluem os seguintes tipos: ponteiro (Pointer), matriz (Array), estrutura
(derived types) (Structure types), Union e função (Function)
40
ALGORITMOS
Saiba mais
2.2 Operadores
• operadores aritméticos;
• operadores relacionais;
• operadores lógicos;
Segundo Manzano:
Você pode usar um operador aritmético com um ou dois argumentos para adicionar, subtrair,
multiplicar e dividir os valores numéricos. Os operadores aritméticos podem ser definidos nos
seguintes itens:
41
Unidade I
+ (adição)
- (subtração)
* (multiplicação)
/ (divisão)
% (MOD/divisão do módulo)
Por exemplo:
a-b
a+b
a*b
a/b
p% q
A divisão do módulo produz o restante de uma divisão inteira. O operador de divisão de módulo
não pode ser usado em dados de ponto flutuante.
Quando ambos os operandos em uma única expressão aritmética são inteiros, a expressão é
chamada de expressão inteira e a operação é chamada aritmética inteira. Durante a divisão do
módulo, o sinal do resultado é sempre o sinal do primeiro operando.
-14% 3 = -2
-14% -3 = -2
14% -3 = 2
Uma operação aritmética envolvendo apenas operandos reais é chamada aritmética real. Se x e y
são números reais, teremos:
As comparações podem ser feitas com a ajuda de operadores relacionais. A expressão contendo
um operador relacional é denominada expressão relacional. O valor de um relacionamento dessa
expressão são os valores um ou zero.
== (igual a)
!= (não é igual a)
43
Unidade I
• se ! (número <0).
2.3 Expressões
Diz-se que um algoritmo está correto se, ao receber uma entrada, conforme descrito em suas
especificações (de entrada):
Essas expressões aritméticas e algébricas são formadas pela montagem de modos familiares
de números e operadores aritméticos. A seguir, temos um modelo dessas expressões aritméticas
e matemáticas.
1+ 1
2+ 1
( x − y ) ( x + y ) (x2 + y2 ) (x 4 + y 4 )
3+ 1
x8 − y8
1
4+
5
1 1 2 1 3
(x – 1, x + 1, x2 + x + 1, x2 + 1) 0, 1, , , , ,
2 3 3 4 4
Expressões em programação são como fórmulas em matemática: ambas usam valores para
calcular um resultado. Mas, diferentemente do que se dá na matemática, as expressões que criamos
através das linguagens de programação podem calcular resultados a partir de uma ampla variedade
de tipos (por exemplo, booleano e string), não apenas resultados matemáticos. Em outras palavras,
as expressões são como as moléculas: construídas a partir de literais e nomes, que possuem valores
(os “átomos”), e operadores e chamadas de função (as “ligações químicas” que mantêm os átomos
no lugar).
44
ALGORITMOS
A programação matemática prática em larga escala envolve mais do que apenas a minimização
ou maximização de uma função. Antes que qualquer algoritmo de otimização possa ser aplicado,
é necessário algum esforço para formular o modelo subjacente e gerar as estruturas de dados
computacionais necessárias. Se os algoritmos podem lidar com problemas de otimização como as
pessoas, então a formulação e as fases de geração e de modelagem podem ser relativamente fáceis.
Na realidade, porém, existem algumas diferenças entre a forma como matemáticos e programadores
entendem um problema e a maneira como são implementados os algoritmos e a sua codificação.
A princípio, o trabalho é dividido entre o humano e o computador. O primeiro passo que podemos
relacionar seria um profissional que entenderá a dinâmica da tarefa que deve ser automatizada
e convertida em uma linguagem de programação. Após a codificação, o computador deve compilar e
executar o programa para criar a forma do algoritmo. Esse arranjo geralmente é caro e propenso a
erros, por isso, o programa deve ser depurado por um modelador humano, mesmo que a sua saída
(a forma do algoritmo) não tenha como fim ser lida por pessoas. Na programação linear, a maior
parte do algoritmo e a forma de representação da matriz são formadas por linhas e colunas que
são numeradas em centenas ou milhares e cujo elementos que são diferentes de zero aparecem
em padrões complexos.
Saiba mais
45
Unidade I
2.4 Variáveis
Na concepção de Soffner:
Figura 12 – Representação gráfica da memória de um computador com variáveis. Imagine a memória de um computador como um
grande arquivo, com várias gavetas, nas quais é possível guardar apenas um valor por vez, e, como em um arquivo, essas gavetas
devem estar identificadas por uma etiqueta com um nome
Uma variável é um nome simbólico atribuído a um item de dados pelo programador. Em qualquer
momento, uma variável representará um dado específico, chamado de valor de uma variável, que
pode mudar de tempos em tempos durante um processo de computação. O valor de uma variável
46
ALGORITMOS
pode mudar muitas vezes durante a execução de um programa. Uma variável geralmente deve
receber um nome atrelado ao conteúdo que será armazenado e processado pelo processo.
- Jamais uma variável pode ser definida com o mesmo nome de uma
palavra que represente um dos comandos ou instruções de uma
linguagem de programação de computadores.
- Não pode ser utilizado como nome de variável algum rótulo que já
tenha sido usado para identificar o nome de um programa ou mesmo
de outra variável. Um nome torna-se exclusivo no programa em que
foi definido (MANZANO, 2019, p. 52).
A operação de atribuição é usada para atribuir um nome a um valor. Assim, é usada sempre que
for necessário acompanhar um valor necessário de forma posterior. Alguns usos típicos incluem:
47
Unidade I
Resumo
48
ALGORITMOS
Exercícios
Assinale a alternativa que indica um algoritmo que escreve corretamente o nome, a categoria
e o salário reajustado do funcionário.
A)
programa salario
var
categoria : caractere
sal, novo_sal : real
escreva (“Digite o nome do funcionário:”)
leia (nome)
escreva (“Digite a categoria do funcionário:”)
leia (categoria)
escreva (“Digite o salário do funcionário:”)
leia (sal)
escolha
caso (categoria = “C1”)
novo_sal ← sal + (sal * 5/100)
caso (categoria = “C2”)
novo_sal ← sal + (sal * 6/100)
caso (categoria = “C3”)
novo_sal ← sal + (sal * 7/100)
caso (categoria = “C4”)
novo_sal ← sal + (sal * 8/100)
senão
novo_sal ← sal + (sal * 9/100)
fim_escolha
escreva (“O salário reajustado do funcionário”, nome, “da categoria”, categoria, “é:”, novo_sal)
fim
49
Unidade I
B)
programa salario
var
nome, categoria : real
sal, novo_sal : real
escreva (“Digite o nome do funcionário:”)
leia (nome)
escreva (“Digite a categoria do funcionário:”)
leia (categoria)
escreva (“Digite o salário do funcionário:”)
leia (sal)
escolha
caso (categoria = “C1”)
novo_sal ← sal + (sal * 5/100)
caso (categoria = “C2”)
novo_sal ← sal + (sal * 6/100)
caso (categoria = “C3”)
novo_sal ← sal + (sal * 7/100)
caso (categoria = “C4”)
novo_sal ← sal + (sal * 8/100)
senão
novo_sal ← sal + (sal * 9/100)
fim_escolha
escreva (“O salário reajustado do funcionário”, nome, “da categoria”, categoria, “é:”, novo_sal)
fim
C)
programa salario
var
nome, categoria : caractere
sal, novo_sal : real
escreva (“Digite o nome do funcionário:”)
leia (nome)
escreva (“Digite a categoria do funcionário:”)
leia (categoria)
escreva (“Digite o salário do funcionário:”)
leia (sal)
escolha
caso (categoria = “C1”)
novo_sal ← sal + (sal * 5/100)
caso (categoria = “C2”)
novo_sal ← sal + (sal * 6/100)
caso (categoria = “C3”)
novo_sal ← sal + (sal * 7/100)
caso (categoria = “C4”)
novo_sal ← sal + (sal * 8/100)
senão
novo_sal ← sal + (sal * 9/100)
fim_escolha
fim
50
ALGORITMOS
D)
programa salario
var
nome, categoria : caractere
sal, novo_sal : real
escreva (“Digite o nome do funcionário:”)
leia (nome)
escreva (“Digite a categoria do funcionário:”)
leia (categoria)
escreva (“Digite o salário do funcionário:”)
leia ( )
escolha
caso (categoria = “C1”)
novo_sal ← sal + (sal * 5/100)
caso (categoria = “C2”)
novo_sal ← sal + (sal * 6/100)
caso (categoria = “C3”)
novo_sal ← sal + (sal * 7/100)
caso (categoria = “C4”)
novo_sal ← sal + (sal * 8/100)
senão
novo_sal ← sal + (sal * 9/100)
fim_escolha
escreva (“O salário reajustado do funcionário”, nome, “da categoria”, categoria, “é:”, novo_sal)
fim
E)
programa salario
var
nome, categoria : caractere
sal, novo_sal : real
escreva (“Digite o nome do funcionário:”)
leia (nome)
escreva (“Digite a categoria do funcionário:”)
leia (categoria)
escreva (“Digite o salário do funcionário:”)
leia (sal)
escolha
caso (categoria = “C1”)
novo_sal ← sal + (sal * 5/100)
caso (categoria = “C2”)
novo_sal ← sal + (sal * 6/100)
caso (categoria = “C3”)
novo_sal ← sal + (sal *7/100)
caso (categoria = “C4”)
novo_sal ← sal + (sal * 8/100)
senão
novo_sal ← sal + (sal * 9/100)
fim_escolha
escreva (“O salário reajustado do funcionário”, nome, “da categoria”, categoria, “é:”, novo_sal)
fim
Análise da questão
2) Declarar as variáveis (nome, categoria, sal e novo_sal) e seus tipos (nome e categoria são do
tipo caractere e sal e novo_sal são do tipo real).
4) Usar o comando “escolha” e realizar o cálculo do novo salário (novo_sal) de acordo com a
categoria do funcionário.
Início
F N mod 2 = 0
V
(I) (II)
Fim
Figura 13
II – Podemos substituir (I) por “é múltiplo de 2” e (II) por “não é múltiplo de 2”.
52
ALGORITMOS
A) I.
B) II e IV.
C) III.
D) I e II.
Análise da questão
I – Afirmativa incorreta.
II – Afirmativa incorreta.
IV – Afirmativa incorreta.
Justificativa: a estrutura de saída do diagrama de blocos representa uma saída na tela, e não
uma saída impressa.
53