Buscar

Introdução à Programação

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 53 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 53 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 53 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Autor: Prof. Marcelo Henrique dos Santos
Colaboradores: Prof. Antônio Palmeira de Araújo Neto
 Profa. Fabiola Mariana Aguiar Ribeiro
Algoritmos
Professor conteudista: Marcelo Henrique dos Santos
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).
Atualmente é microempreendedor na área de jogos digitais e professor universitário na área de tecnologia na 
UNIP e na Universidade Estácio de Sá. Tem experiência na área de Computação, com ênfase em desenvolvimento de 
aplicativos, jogos digitais e desenvolvimento web, além de TV digital e sistemas interativos.
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.
© 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.
Dados Internacionais de Catalogação na Publicação (CIP)
S237a Santos, Marcelo Henrique dos.
Algoritmos / Marcelo Henrique dos Santos. – São Paulo: Editora 
Sol, 2021.
180 p., il.
Nota: este volume está publicado nos Cadernos de Estudos e 
Pesquisas da UNIP, Série Didática, ISSN 1517-9230.
1. Programação. 2. Dados. 3. Algoritmos. I. Título. 
CDU 519.67
U511.43 – 21
Prof. Dr. João Carlos Di Genio
Reitor
Prof. Fábio Romeu de Carvalho
Vice-Reitor de Planejamento, Administração e Finanças
Profa. Melânia Dalla Torre
Vice-Reitora de Unidades Universitárias
Profa. Dra. Marília Ancona-Lopez
Vice-Reitora de Pós-Graduação e Pesquisa
Profa. Dra. Marília Ancona-Lopez
Vice-Reitora de Graduação
Unip Interativa – EaD
Profa. Elisabete Brihy 
Prof. Marcello Vannini
Prof. Dr. Luiz Felipe Scabar
Prof. Ivan Daliberto Frugoli
 Material Didático – EaD
 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
9
APRESENTAÇÃO
O objetivo desta disciplina é trazer os principais conceitos envolvidos na área a partir da 
introdução da linguagem de programação C para desenvolvimento de softwares básicos e 
de controle.
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ípiosda 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:
• projetar o algoritmo para descrever como o processo será executado;
• usar uma linguagem de programação para expressar o algoritmo em um programa;
• executar o programa no computador ou no dispositivo.
10
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.
As linguagens de programação preenchem a lacuna entre o pensamento humano e os processos 
e circuitos binários de computador. Elas correspondem a uma série de comandos definidos 
especificamente e projetados por programadores humanos para dar instruções aos computadores 
digitais. Os comandos são escritos como conjuntos de instruções (chamados programas). Todas 
as instruções da linguagem de programação devem ser expressas em código binário para que o 
computador possa executá-los.
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.
Neste livro-texto, discutiremos a integração de tais estruturas a partir da construção de 
fluxogramas que ilustram como essa integração ajuda o programador na resolução de problemas. 
Finalmente, a partir da compreensão da lógica de programação, implementaremos a solução dos 
problemas matemáticos em uma linguagem de programação.
Uma linguagem de programação é mais do que um veículo para instruir os computadores 
existentes, ela auxilia principalmente o programador nos aspectos mais difíceis de sua arte, no 
design de programas e na depuração. Em outras palavras, uma boa linguagem de programação 
deve ajudar a expressar como o programa será executado e o que se pretende realizar. Isso deve 
ser alcançado em vários níveis, desde a estratégia geral até os detalhes da codificação e da 
representação de dados. Em um sentido mais amplo, uma linguagem de programação transforma 
a máquina subjacente em uma máquina virtual.
11
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.
O uso de um computador é quase ilimitado em nossa vida cotidiana. Os computadores podem 
fazer uma variedade tão grande de coisas porque podem ser programados. Isso significa que 
os computadores não foram projetados para executar apenas um trabalho, mas para executar 
qualquer trabalho que seus programas estabeleçam. Um programa é um conjunto de instruções 
escritas em um idioma (como o C, C#, Java, .NET, BASIC etc.) compreensível pelo computador para 
executar uma função específica. Um programa bem escrito pode formar um pacote de aplicativos 
personalizado para resolver tipos específicos de problemas. Assim, um programador de computador 
é um cientista da computação especializado no uso de construções de linguagens de programação 
para desenvolver programas de computador executáveis . Os programadores geralmente trabalham 
lado a lado com analistas de sistemas em diversos tipos de projetos.
As linguagens de programação são linguagens de notação artificial criadas ou desenvolvidas 
para serem usadas para executar instruções codificadas no computador. São, geralmente, compostas 
de uma série de regras de uso (sintaxe) que determinam o significado (semântica) das expressões 
(conforme a linguagem/idioma). Programação é a arte de desenvolver programas de computador 
com a ajuda de programas selecionados a partir de uma linguagem de programação. É uma 
habilidade especial cuja qualidade é testada pela qualidade do programa ou software resultante. 
Na programação, as etapas devem ser seguidas adequadamente, ou seja, da definição do problema 
à manutenção e à revisão.
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.
12
Unidade I
 Lembrete
Programação é a arte de desenvolver programas de computador 
com a ajuda de programas selecionados a partir de uma linguagem 
de programação.
1.1 Programando um computador
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.
1.1.1 Arquitetura de computador
Se você consultar a literatura da área da ciência da computação, parecerá complexo encontrar 
uma definição aceita universalmente para a expressão “arquitetura de computadores”. De acordo 
com Stallings (2010), os especialistas muitas vezes discordam sobre a diferenciação exata entre as 
expressões “arquitetura de computadores” e “organização de computadores”.
O termo “arquitetura” é usado para incluir a arquitetura do conjunto de instruções (a abstração 
do programador de computador), organização ou microarquitetura (a estrutura interna e a 
implementação de um computador noregistro e na unidade funcional) e arquitetura do sistema 
(a organização do computador a partir da memória cache e no nível do barramento). Com base 
nessa proposta, a expressão “arquitetura de computadores” abrange todos os aspectos de um 
computador que você deve conhecer para entender como um computador executa um programa. 
Portanto, a arquitetura de computador inclui os seguintes elementos:
• os componentes físicos fundamentais que constituem um computador e o seu sistema 
(o hardware);
• o tipo de instruções/idioma que o computador pode entender;
13
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
O ENIAC (Electronic Numerical Integrator And Computer), projetado 
e construído na Universidade da Pensilvânia, foi o primeiro computador 
digital eletrônico de uso geral do mundo. A máquina era enorme, pesando 
30 toneladas, ocupando 1.500 pés quadrados de espaço e contendo 
mais de 18 mil tubos de vácuo. Era também substancialmente mais 
rápido que qualquer computador eletromecânico, realizando 5 mil adições 
por segundo.
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 dispositivo de entrada através do qual dados e instruções podem ser inseridos;
• um armazenamento no qual os dados podem ser lidos/gravados (instruções são como os dados, 
eles residem na mesma memória);
• uma unidade aritmética para processar dados;
14
Unidade I
• uma unidade de controle que busca instruções, as decodifica e executa;
• dispositivos de saída para o usuário acessar os resultados.
Os computadores baseados no conceito de programa armazenado ou na arquitetura de 
Neumann armazenam seu código de programa (ou seja, as instruções) e os dados necessários 
para que possam ser executados na memória do computador. Durante o cálculo do programa, 
as instruções são recuperadas da memória e executadas uma após a outra. O componente que 
controla esse cálculo é conhecido como unidade central de processamento (a CPU, hoje em dia 
frequentemente referida apenas como processador). Compõem a CPU:
• a unidade lógica aritmética (que executa operações como adição e subtração nos dados);
• a unidade de controle (que coordena as atividades do computador);
• os registros (células de armazenamento de dados usadas para o armazenamento temporário de 
dados – por exemplo, os dados necessários em um cálculo a ser realizado).
As melhorias na tecnologia de computadores têm sido tremendas desde que as primeiras 
máquinas apareceram. Um computador pessoal, que pode ser comprado hoje por um valor acessível, 
tem mais desempenho (em termos de, digamos, multiplicações de ponto flutuante por segundo), 
mais memória principal e mais capacidade de disco do que uma máquina que custava milhões 
nas décadas de 1950 e 1960. Com relação a tal evolução, podemos relacionar quatro linhas que 
surgiram dos primeiros computadores.
• 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).
• Supercomputadores: projetados para aplicações científicas, apresentam o custo mais caro 
(mais de um milhão de dólares), e o processamento geralmente é feito no modo batch, por 
razões de desempenho.
• Microcomputadores: apareceram na era do microprocessador (o primeiro microprocessador, 
Intel 4004, foi lançado em 1971). O termo “micro” refere-se apenas às dimensões físicas, não ao 
desempenho computacional – um microcomputador típico (um PC ou uma estação de trabalho) 
pode ser bem acomodado em uma mesa. Os microcomputadores são diretamente o produto dos 
15
ALGORITMOS
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
A CPU determina a disponibilidade das linguagens de programação e 
pacotes de programas.
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
Unidade central de processamento
Memória secundária
Memória RAM
Unidade lógica 
e aritmética Registradores
Unidade de 
controle
Unidade de 
saída
Unidade de 
entrada
Memória ROM
Figura 1 – Estrutura dos componentes de um computador eletrônico
Ainda segundo Manzano:
 
O componente denominado unidade de entrada é responsável pela entrada 
de dados no computador. Os dados inseridos em um computador podem 
ser armazenados no componente memória secundária ou processados 
no componente memória principal, mais precisamente na memória RAM 
(Random Access Memory – Memória de Acesso Randômico). Esse tipo 
de componente pode ser representado pelos periféricos teclado, scanner, 
16
Unidade I
mouse, câmeras de vídeo, arquivos, sensores de movimento, entre 
outros componentes.
O componente unidade de saída é responsável pelaapresentação de dados 
e/ou informações que tenham sido processados na memória principal ou 
que estejam armazenados na memória secundária do computador. Esse tipo 
de componente pode ser representado pelos periféricos monitores de vídeo, 
impressoras, arquivos, entre outros.
O componente denominado unidade central de processamento é responsável 
pelo controle das operações de entrada e de saída de um computador. 
Além disso, esse componente é também responsável por todo o controle 
operacional, sendo o “cérebro” e o “sistema nervoso” de um computador 
(MANZANO, 2019, p. 18).
 Saiba mais
Para conhecer um pouco mais sobre a arquitetura de computadores, 
leia o livro indicado a seguir.
STALLINGS, W. Arquitetura e organização de computadores. São Paulo: 
Pearson, 2017.
1.1.2 O que impulsiona o trabalho de um projetista de computadores
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.
Um arquiteto de computador deve especificar os requisitos de desempenho de várias partes 
de um sistema (de computador) a fim de definir as interconexões necessárias para mantê-lo 
harmoniosamente equilibrado. O trabalho do arquiteto de computadores é mais do que projetar o 
conjunto de instruções, como tem sido entendido por muitos anos; aliás, quanto mais um arquiteto 
é exposto a todos os aspectos do design de computadores, mais eficiente ele será. A arquitetura 
do conjunto de instruções refere-se ao que o programador vê como o conjunto de instruções 
da máquina. O conjunto de instruções é o limite entre o hardware e o software, e a maioria das 
decisões relativas ao conjunto de instruções afeta o hardware, da mesma forma como o inverso 
17
ALGORITMOS
é verdadeiro, pois muitas decisões de hardware podem afetar de maneira benéfica/adversa o 
conjunto de instruções.
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.);
• o hardware refere-se às especificidades de uma implementação.
1.2 Código fonte e código objeto
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
O SDLC é uma estrutura ou processo conceitual que considera a 
estrutura dos estágios envolvidos no desenvolvimento de uma aplicação 
desde o estudo inicial de viabilidade até a implantação no campo e a 
manutenção. Um SDLC geralmente é usado para descrever as etapas que 
são seguidas dentro da estrutura do ciclo de vida do software.
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.
1.2.1 O que é 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 
18
Unidade I
especificação dos requisitos do sistema (System Requirement Specification – SRS), fornecendo a 
documentação descritiva das funcionalidades necessárias. Com base nesse documento, o sistema 
poderá ser projetado.
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
A linguagem Assembly é uma linguagem de programação de baixo nível 
que tem uma correspondência de 1 para 1 para o código de máquina.
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.
As linguagens de alto nível possibilitam maior facilidade de comunicação com um computador 
pelo fato de serem expressadas de maneira mais próxima à comunicação humana, pois baseiam-se 
em palavras do idioma inglês. Destacam-se, nessa categoria, linguagens de programação como 
FORTRAN, COBOL, BASIC, PASCAL, C, JAVA, Lua, C++, entre outras. Esse tipo de linguagem é mais 
facilmente assimilado por seres humanos. Assim, o número de pessoas que as conhece é bastante 
grande. Nesse sentido, considere o exemplo de um programa que apresenta a palavra mundo na 
19
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).
1.2.2 O que é código de objeto?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
A semelhança entre o código fonte e o código do objeto é o fato de 
ambos estarem relacionados à programação de computadores.
1.2.3 Qual é a diferença entre código fonte e código do objeto?
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.
Quadro 1 – Código fonte versus código do objeto
Característica Código fonte Código do objeto
Definição
É uma coleção de instruções do computador 
escritas a partir de uma linguagem de 
programação legível por humanos
É uma sequência de instruções escritos em 
linguagem de máquina ou binário e é a saída 
após o compilador converter o código-fonte
Compreensibilidade É legível pelo programador de sistema É legível pelo computador (linguagem de máquina)
Geração Gerado pelo ser humano Gerado por compilador
20
Unidade I
Característica Código fonte Código do objeto
Formato Está na forma textual (a partir da linguagem de programação)
Está na forma de números binários (linguagem 
de máquina)
Definição
É uma coleção de instruções do computador 
escritas a partir de uma linguagem de 
programação legível por humanos
É uma sequência de instruções escritos em 
linguagem de máquina ou binário e é a saída 
após o compilador converter o código fonte
Compreensibilidade É legível pelo programador de sistema É legível pelo computador (linguagem de máquina)
Geração Gerado pelo ser humano Gerado por compilador
Formato Está na forma textual (a partir da linguagem de programação)
Está na forma de números binários (linguagem 
de máquina)
Adaptado de: Difference... (2018, p. 3).
 Saiba mais
Para conhecer um pouco mais sobre o código fonte e o código do 
objeto, você pode ler a obra sugerida a seguir.
ZHIRKOV, I. Programação em baixo nível: C, Assembly e execução de 
programas na arquitetura Intel 64. São Paulo: Novatec, 2018.
1.3 Linguagens formais e ambiente de programação
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.
• Semântica: revela o significado das cadeias sintaticamente válidas em um idioma. Para as 
linguagens naturais, isso significa correlacionar sentenças e frases com os objetos, pensamentos 
21
ALGORITMOS
e sentimentos de nossas experiências. Para as linguagens de programação, a semântica descreve 
o comportamento que um computador segue ao executar um programa em sua linguagem. 
Podemos divulgar esse comportamento descrevendo o relacionamento entre a entrada e a saída 
de um programa ou uma explicação passo a passo de como um programa será executado em uma 
máquina real ou abstrata.
Na programação, as linguagens incluem questões como a facilidade de implementação, a 
eficiência na aplicação e a metodologia de programação. A sintaxe deve ser especificada antes 
da semântica, pois o significado pode ser dado apenas para as expressões que são formadas em 
uma linguagem específica. Da mesma forma, a semântica precisa, antes, considerar as questões 
pragmáticas, uma vez que a interação com os usuários pode ser considerada apenas para expressões 
cujo significado é entendido.
1.3.1 Visão geral sobre os ambientes de desenvolvimento de software
De acordo com Dart et al. (1992), os ambientes de desenvolvimento de software referem-se à 
coleção de ferramentas de hardware e software que um sistema desenvolvedor utiliza para construir 
sistemas de software. À medida que a tecnologia melhora e as expectativas do usuário aumentam, 
a funcionalidade de um ambiente tende a mudar. Ao longo dos últimos anos, o conjunto de 
ferramentas de software disponíveis para desenvolvedores está expandido de forma considerável. 
Podemos ilustrar essa mudança observando algumas distinções na terminologia: o ambiente de 
programação e o ambiente de desenvolvimento de software são frequentemente usados como 
sinônimos, porém, faremos uma distinção entre esses dois termos. Por “ambiente de programação”, 
entendemos um ambiente que suporta apenas a fase de codificação do ciclo de desenvolvimento 
de software, ou seja, apenas as tarefas pequenas de programação, como edição e compilação. 
Já por “ambiente de desenvolvimento de software” entendemos um ambiente que aumenta ou 
automatiza as atividades que compreendem o ciclo de desenvolvimento de software (incluindo 
as grandes tarefas de programação, como o gerenciamento de configuração, e a programação de 
diversas tarefas, como o gerenciamento de projetos e equipes) e que suporta uma manutenção em 
larga escala e a longo prazo.
Exemplo de aplicação
Pesquise os ambientes de desenvolvimento de software disponíveis no mercado e observe as 
vantagens e desvantagens de cada um desses ambientes.
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.
22
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 centrados na linguagem: são criados em torno de um idioma, fornecendo um 
conjunto de ferramentas adequadas para esse idioma. Esses ambientes são altamente interativos 
e oferecem recursos limitados e um suporte para programação em geral.
• Ambientes orientados à estrutura: incorporam técnicas que permitem ao usuário manipular 
estruturas de forma direta. A independência linguística das técnicas levou à noção dos geradores 
para os ambientes.
• 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.
Os requisitos do usuário para ambientes abrangem um amplo espectro. A funcionalidade dos 
ambientes inclui o suporte para um único usuário, a coordenação e o gerenciamento de vários usuários 
e o gerenciamento do ciclo de desenvolvimento de software. A natureza da interface do usuário é de 
considerável importância. Sem dúvida, o usuário de um ambiente precisa personalizá-lo, adaptando ou 
estendendo uma ferramenta específica ou criando ferramentas especializadas por meio da configuração 
de suas funcionalidades. Para apoiar isso, o ambiente deve ser implementado de modo a permitir que 
ferramentas sejam facilmente integradas a ele.
O usuário precisa de instalações para oferecer suporte ao desenvolvimento incremental de 
software para auxiliar na criação de protótipos. Em essência, o usuário requer o suporte para todo 
o ciclo do desenvolvimento de software (desde a especificação, passando pela codificação até a 
manutenção), incluindo a capacidade de rastrear informações entre fases.
1.3.2 Programação em geral
Conforme Dart et.al. (1992), os ambientes centrados na linguagem oferecem ao usuário 
um universo de diversas linguagens de programação. Esses ambientes são adequados para a 
fase de codificação do ciclo de desenvolvimento de software e fornecem técnicas incrementais 
de compilação ou interpretação para ajudar a reduzir o impacto de pequenas alterações de 
código durante a manutenção. O estilo exploratório de programação que eles suportam ajuda o 
usuário a experimentar protótipos de software. Ferramentas como navegadores, além de serem 
extremamente úteis para o usuário durante o desenvolvimento do programa exploratório, podem 
23
ALGORITMOS
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.
Os ambientes para linguagens imperativas suportam recursos de programação, como o controle 
de versão, mas eles atualmente não suportam o processo de implementar muitas tarefas, como 
o gerenciamento de projetos, nem fornecem suporte para as tarefas de desenvolvimento que 
não sejam a codificação. Não está claro se esses ambientes podem ampliar suas instalações para 
atender a esses requisitos, mas provavelmente formarão um componente de ambientes futuros 
que dará suporte a todo o ciclo de vida do software. Os desenvolvedores de sistemas comerciais 
de software estão tentando refinar suas técnicas de implementação para melhorar o desempenho. 
Eles estão construindo ambientes centrados na linguagem para linguagens imperativas como C e 
estão tentando ampliar esses ambientes para dar suporte à fase de design e incorporar algumas 
técnicas de gerenciamento de projetos.
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
Para conhecer um pouco mais sobre as principais construções das 
linguagens de programação, você pode consultar a obra indicada a seguir.
SEBESTA, R. W. Conceitos de linguagens de programação. Porto Alegre: 
Bookman, 2011.
1.4 Algoritmos e fluxogramas
Charntaweekhun e Wangsiripitak (2006) afirmam que o processo de programar centrado apenas 
na linguagem de programação é o caminho que muitos programadores utilizam para desenvolver 
programas e softwares. O processo para a programação, usando uma linguagem de computador, 
possui três etapas centrais:
24
Unidade I
• digitar o código de acordo com o algoritmo;
• utilizar um código fonte de compilação;
• verificar e validar a partir de um programa de teste e depuração.
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
Em termos de ciência da computação, um algoritmo é um resumo, uma 
descrição formalizada de um procedimento computacional. Os algoritmos 
se dividem em tipos diferentes, de acordo com as suas propriedades ou 
domínios (por exemplo, o processo de lidar com algoritmos combinatórios 
com contagem e enumeração), além de poder variar em termos de critérios 
analíticos (por exemplo, características generalizadas de desempenho ou 
desempenho médio).
Em matemática, ciência da computação e assuntos relacionados, um algoritmo é uma 
sequência finita de etapas expressa para resolver um problema. Um algoritmo pode ser definido 
como um processo que executaalgumas sequências de operações para resolver um problema. 
Os algoritmos são usados para a execução de cálculo, processamento de dados e muitos outros 
campos. Na computação, os algoritmos são essenciais porque servem como o procedimento 
sistemático exigido pelos computadores.
25
ALGORITMOS
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).
De acordo com Charntaweekhun e Wangsiripitak (2006), na programação de computadores, 
muitas vezes existem diferentes algoritmos para realizar qualquer tarefa. Cada algoritmo possui 
diversas vantagens e desvantagens em diferentes situações. É possível incentivar a utilização da 
construção dos algoritmos a partir de três razões: eficiência, abstração e reutilização.
A eficiência é um dos elementos fundamentais para auxiliar no processo de resolução de 
problemas. Os algoritmos eficientes devem ser usados para resolver tais problemas considerando 
o tempo e o fator de custo envolvidos em cada algoritmo. A abstração é a análise sistemática 
dos algoritmos que podem fornecer um nível de abstração para resolver problemas. Alguns 
elementos/problemas são aparentemente complicados e, quando são abstraídos (divididos em 
partes menores), podem ser destilados em outros mais simples, para os quais existem algoritmos 
conhecidos. Por exemplo, imagine tentar encontrar o caminho mais curto para rotear um pacote 
entre dois gateways em uma internet. Uma vez que percebemos que esse problema é apenas 
uma variação do problema que apresenta o caminho mais curto, podemos resolvê-lo usando a 
abordagem generalizada. Já a reutilização é a aplicação das soluções que foram implementadas 
anteriormente em diferentes situações.
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.
Muitos profissionais da área de programação de computadores (principalmente os mais 
experientes, cautelosos e cuidadosos) preferem elaborar seus programas com base em um projeto 
que aborde todos os aspectos técnicos do desenvolvimento, com atenção especial sempre à 
parte do projeto lógico. O projeto de desenvolvimento de sistemas (conjunto de programas 
de computador com o mesmo propósito e interligados) segue diversas etapas de um processo 
normalmente conhecido como análise de sistemas. O foco desta obra é o projeto lógico, a parte 
do desenvolvimento do programa de um sistema em si. Assim, apenas os aspectos relacionados ao 
desenvolvimento e à escrita de rotinas de programas e seu projeto serão abordados (MANZANO, 
2019, p. 34).
26
Unidade I
A partir desse princípio, o algoritmo possui as seguintes características:
• Input (entrada): um algoritmo pode ou não exigir a entrada de dados.
• Output (saída): espera-se que cada algoritmo produza pelo menos um resultado (processo).
• Definiteness (definitividade): cada instrução deve ser clara e inequívoca.
• Finiteness (finitude): caso as instruções de um algoritmo sejam executadas, o algoritmo deve 
terminar após um número finito de etapas.
A seguir, são apresentadas as quatro etapas para se escrever algoritmos.
• 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 para 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
O algoritmo é uma representação passo a passo de uma solução para 
um determinado problema. Ele utiliza um procedimento definido e não 
depende de nenhuma linguagem de programação, por esse motivo é fácil 
de compreender, mesmo sem um conhecimento prévio de programação.
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.
27
ALGORITMOS
Os símbolos de identificação gráfica representam sempre uma operação ou conjunto de 
operações similares, podendo ser identificados por um rótulo relacionado à própria ação do símbolo 
em uso, somente quando necessário.
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.
A definição de inicialização e finalização de um diagrama ocorre com o uso do símbolo 
“terminal” devidamente identificado com um dos rótulos: início, fim, retorno ou a definição de um 
nome particular, quando for necessário, desde que seguidas as regras de utilização de sub-rotinas 
(a serem apresentadas em momento oportuno) (MANZANO, 2019, p. 38).
 Observação
O fluxograma é muito importante para desenvolver a compreensão de 
como um processo será realizado, além de melhorar a comunicação com 
os membros da equipe (todas as pessoas envolvidas no mesmo processo) e 
documentar os processos que serão implementados.
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.
Direção do fluxo de 
dados Conexão
Início ou fim do 
algoritmo
Entrada ou saída de 
dados
Processamento Decisão Saída na tela Saída impressa
Função, procedimento 
ou sub-rotina
Repetição com variável 
de controle
Figura 2 – Simbologia para diagramas de blocos
28
Unidade I
Manzano apresenta os símbolos normatizados que devem ser utilizados na construção do 
fluxograma, alémde suas respectivas descrições.
Quadro 2 – Símbolos normatizados (ISO 5807)
Símbolo Significado Descrição
Terminal/terminator
O símbolo representa a definição de início e fim do 
fluxo lógico de um programa. Também é utilizado 
na definição de sub-rotinas de procedimento ou de 
função
Entrada manual/
manual input
Representa a entrada manual de dados, normalmente 
efetuada em um teclado conectado diretamente ao 
console do computador
Processamento/
process
Representa a execução de uma operação (ou grupo 
de operações) que estabelece(m) o resultado de uma 
operação lógica ou matemática
Exibição/display
Representa a execução da operação de saída visual de 
dados em um monitor de vídeo conectado ao console 
do computador
Decisão/decision
O símbolo representa o uso de desvios condicionais 
para outros pontos do programa de acordo com 
situações variáveis 
Preparação/
preparation
Representa a modificação de instruções (ou grupo 
de instruções) existente(s) em relação à ação de sua 
atividade subsequencial
Processo predefinido/
predefined process
Definição de um grupo de operações estabelecidas 
como uma sub-rotina de processamento anexa ao 
diagrama de blocos
Conector/connector
Representa a entrada ou a saída em outra parte do 
diagrama de blocos. Pode ser usado na definição de 
quebras de linha e na continuação da execução de 
decisões
Linha/line
O símbolo representa a ação de vínculo existente 
entre os vários símbolos de um diagrama de blocos. 
Possui a ponta de uma seta indicando a direção do 
fluxo de ação
Fonte: Manzano (2019, p. 36).
Vejamos o que diz Manzano:
As operações de entrada de dados para esta obra serão genericamente 
representadas com o uso do símbolo de “entrada manual”, uma vez que o 
teclado será utilizado como periférico genérico dessa ação. As operações 
de saída de dados serão genericamente definidas com o símbolo “exibição”, 
considerando o fato de um monitor de vídeo estar sempre em uso.
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.
29
ALGORITMOS
As operações de processamento matemático e lógico estarão definidas com 
o símbolo “processamento”. Quando houver mais de uma operação a ser 
definida em um mesmo símbolo, devem estar separadas por linhas de ação 
sem o uso de vírgulas ou serem escritas em símbolos distintos.
As operações de tomada de decisão para condições simples, compostas, 
sequenciais, encadeadas ou de execução de laços interativos (condicionais) 
serão representadas pelo símbolo de “decisão”, que conterá a condição a 
ser avaliada logicamente. Cada símbolo de decisão pode possuir apenas 
uma condição lógica. É considerada lógica uma condição isolada ou de um 
conjunto de condições vinculadas com o uso de um operador lógico de 
conjunção, disjunção ou disjunção exclusiva.
As operações de laços interativos e interativos (incondicionais) serão 
representadas com o símbolo “preparação”, que permite a realização de um 
grupo de tarefas predefinidas e relacionadas (MANZANO, 2019, p. 38).
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).
A, B
R
R ← A + B
Início
Fim
Figura 3 – Estrutura de operação computacional de sequência
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, 
30
Unidade I
solicito uma nova digitação; se não for, o programa simplesmente continua 
na próxima linha abaixo da decisão. A decisão composta, ao contrário, tem 
uma ação prevista em caso de verificação da condição oposta. Por exemplo, 
se a média de um aluno for maior ou igual a seis, vou imprimir na tela 
“Aprovado”. Se não for (ou seja, se a média for menor que seis), imprimirei 
“Reprovado” (SOFFNER, 2013, p. 24).
A seguir, temos a representação da estrutura de operação computacional de decisão simples e 
a estrutura de operação computacional de decisão composta.
Start
( )
Start
( )
Stop
( )
Stop
( )
F
T TF
Simples Composta
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).
31
ALGORITMOS
F
F
F
T
T
T
Stop
( )
Stop
( )
Stop
( )
Start
( )
Start
( )
Start
( )
Ação
Contador
++
Contador
= 1
Contador
<=10
A) Com teste no início B) Com teste no fim C) Com variável de controle
Figura 5 – Estrutura de repetição
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.
Fim
A, B
R
R ← A + B
Início
A > B
N S
Figura 6 – Estrutura de operação computacional de decisão simples
32
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).
Fim
A, B
R
Início
A > B
N S
R ← A + BR ← A - B
Figura 7 – Estrutura de operação computacional de decisão composta
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.
33
ALGORITMOS
A seguir temos uma estrutura de operação computacional de laço de repetição condicional 
pré-teste. Sendo definida a variável I e atribuído um valor inicial de 1 (um), a instrução será 
repetida até que a variável I seja menor ou igual a 10 (observe que o teste acontece no início do 
processamento). Em caso afirmativo, será apresentado o valor da variável I e incrementado 1 (um) 
no valor dessa mesma variável.
Fim
I ← 1
I
Início
N
S
I ← I + 1
I <= 10
Figura 8 – Estrutura de operação computacional de laço de repetição condicional pré-teste
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.
A seguir temos uma estrutura de operação computacional de laço de repetição condicional 
pós-teste. Sendo definida a variável I e atribuído um valor inicial de 1 (um), a instrução será 
repetida até que a variável I seja menor ou igual a 10 (observe que o teste acontece no final do 
processamento). Em caso afirmativo, será apresentado o valor da variável I e incrementado1 (um) 
no valor dessa mesma variável.
34
Unidade I
Fim
I
Início
N
S
I ← I + 1
I ← 1
I > 10
Figura 9 – Estrutura de operação computacional de laço de repetição condicional pós-teste
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.
A seguir, temos uma estrutura de operação computacional de laço de repetição incondicional. 
O laço de repetição é composto da declaração dos três argumentos necessários (inicialização, 
validação/verificação e incremento/decremento). No caso do exemplo, será exibido o valor da 
variável I até que o contator seja menor ou igual a 10.
Fim
I
Início
I ← 1, 10, 1
Figura 10 – Estrutura de operação computacional de laço de repetição incondicional
35
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.
Vejamos algumas vantagens do fluxograma:
• é uma excelente maneira de comunicar a lógica de um programa;
• é uma maneira fácil e eficiente para analisar os problemas;
• durante o ciclo de desenvolvimento do programa, desempenha o papel de um blueprint, o que 
facilita esse processo;
• após o desenvolvimento bem-sucedido de um programa, é necessária uma manutenção contínua 
e oportuna durante todo o seu funcionamento (e vida útil); o fluxograma facilita o processo de 
alterações e manutenção do sistema;
• é fácil de ser convertido em qualquer linguagem de programação.
Ao usar ferramentas gráficas para representar a linha lógica de raciocínio a ser 
implementada em um computador eletrônico, como é o caso dos diagramas 
de blocos ou dos diagramas de quadros, torna-se necessário diferenciar 
quatro subcategorias entre esses diagramas (MANZANO, 2019, p. 41).
O algoritmo e o fluxograma incluem os seguintes tipos de estruturas de controle:
• 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.
• Branching (ramificação/seleção): no controle de ramificação, existe uma condição e, de acordo 
com uma condição, uma decisão de verdadeiro ou falso é alcançada. No caso de true, um dos dois 
ramos é explorado; mas, no caso de condição false, a outra alternativa é tomada. Geralmente, o 
if-then é usado para representar o controle de ramificação.
• Loop (repetição): a estrutura de repetição permite que uma instrução seja executada 
repetidamente com base em certas condições de loop.
36
Unidade I
 Saiba mais
Para conhecer um pouco mais sobre a construção de algoritmos e 
fluxogramas, sugere-se a leitura da obra indicada a seguir.
CORMEN, T. Algoritmos: teoria e prática. São Paulo: LTC, 2012.
2 TÉCNICAS BÁSICAS DE PROGRAMAÇÃO
2.1 Tipos de dados
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.
Em todos esses casos, a grande quantidade de informações a serem processadas em algum 
sentido representa uma abstração de uma parte da realidade. As informações disponíveis para 
o computador consistem em um conjunto selecionado de dados sobre o problema real, ou seja, 
os dados representam uma abstração da realidade no sentido de que certas propriedades e 
características dos objetos reais são ignoradas por serem periféricas e irrelevantes para o problema 
em particular. Uma abstração é, portanto, também uma simplificação dos fatos.
Consideremos um arquivo pessoal de um empregador como exemplo. Todo funcionário é 
representado nesse arquivo por um conjunto de dados relevantes para o empregador ou para os 
seus procedimentos contábeis. Esse conjunto pode incluir alguma identificação do funcionário 
(por exemplo, nome e salário), mas provavelmente não incluirá dados irrelevantes para a situação, 
como cor do cabelo, peso e altura.
Ao resolver um problema, com ou sem um computador, é necessário escolher uma abstração 
da realidade, ou seja, definir um conjunto de dados que representa a situação real. Essa escolha 
deve ser guiada pelo problema a ser resolvido. Em seguida, há uma escolha de representação dessas 
informações. Essa escolha é guiada pela ferramenta que será utilizada para resolver o problema, isto 
é, pelas facilidades oferecidas pelo computador. Na maioria dos casos, essas duas etapas não são 
totalmente separadas. A escolha da representação dos dados geralmente é bastante difícil e não é 
determinada exclusivamente pelas instalações disponíveis, cabendo sempre levar em consideração 
as operações que devem ser executadas a partir desses dados. Um bom exemplo é a representação 
de números, que são abstrações de propriedades de objetos a serem caracterizados.
37
ALGORITMOS
Os computadores usam uma representação interna baseada em dígitos binários (bits), 
representação essa inadequada para os seres humanos devido ao número geralmente grande de 
dígitos envolvidos, mas bastante adequada para circuitos eletrônicos, uma vez que os dois valores, 
0 e 1, podem ser representados convenientemente e de forma confiável pela presença ou ausência 
de correntes elétricas, carga elétrica ou campos magnéticos.
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.
Um tipo de dado é um conjunto de valores (os dados) e um conjunto de operações definidas 
nos dados. Uma implementação de um tipo de dados é uma expressão dos dados e operações 
em termos de uma programação específica, como as linguagens Java, C, C++, C# etc. Um tipo de 
dado abstrato (abstract data type – ADT) é uma especificação de um tipo de dado, sem levar em 
consideração nenhuma linguagem de implementação ou programação específica. Finalmente, a 
realização de um ADT envolve duas partes: interface, especificação ou documentação do ADT (qual 
é o objetivo de cada operação e qual é a sintaxe para usá-la) e a implementação do ADT (como 
cada operação é expressa usando as estruturas de dados e as declarações de uma linguagem de 
programação) (UNIVERSITY OF CRETE, 2020).
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:
• programas de computador produzem resultados manipulando dados;
• um descritor é a coleção dos atributos de uma variável;
• em uma implementação, um descritor é uma coleção de células de memória que armazenam as 
variáveis e os atributos;
• se os atributos forem estáticos, o descritor será necessário apenas no momento da compilação;

Outros materiais