• Nenhum resultado encontrado

Programação Básica em C

N/A
N/A
Protected

Academic year: 2021

Share "Programação Básica em C"

Copied!
358
0
0

Texto

(1)

Brauliro G Leal

Programação Básica em C

Quarta Edição

Juazeiro – BA

(2)

Copyright© 2012, 2018, 2019, 2020, 2021 by Brauliro Gonçalves Leal

O conteúdo deste livro eletrônico é totalmente livre para uso de qualquer natureza desde que citado a fonte. Toda e qualquer parte desta publicação pode ser reproduzida, distribuída ou transmitida de qualquer forma ou por qualquer meio, ou armazenada de qualquer forma ou em qualquer sistema desde que reconhecida a autoria.

Atribuição–CompartilhaIgual – esta licença permite que outros remixem, adaptem e criem a partir deste trabalho, mesmo para fins comerciais, desde que lhe atribuam o devido crédito e que licenciem as novas criações sob termos idênticos (creativecommons.org/licenses).

Quarta Edição Eletrônica: Abril de 2021 ISBN: a ser feito#

O autor

Brauliro Gonçalves Leal

Professor do Colegiado de Engenharia da Computação Universidade Federal do Vale do São Francisco

Avenida Antônio Carlos Magalhães, 510 Santo Antônio Juazeiro/BA – Brasil 48.902–300

e–mail: brauliro.leal@univasf.edu.br site: www.univasf.edu.br/~brauliro.leal

Sobre este documento

Este documento foi escrito em LibreOffice (www.libreoffice.org), suas imagens foram produzidas pelo Kolourpaint (www.kolourpaint.org), seus programas foram editados na IDE Code::Blocks (www.codeblocks.org) e compilados com o GNU GCC (gcc.gnu.org). O Sistema Operacional utilizado foi o GNU/Linux Mint Cinnamon.

(3)

A graduação é uma construção diária, requer tempo e dedicação, e o tempo só promove aqueles que trabalham a seu favor.

(4)

Prefácio

Aceitar a imperfeição como parte da vida nos permite aproveitar o momento se erros inesperados acontecem

Christian Busch (2020)

Este livro tem como principal objetivo o de servir de texto para a disciplina de Introdução à Programação do curso de Engenharia da Computação da Universidade Federal do Vale do São Francisco.

Considerando que um programa de computador tem fundamento na lógica, é impessoal, seus critérios são abstratos, generalizados e são dirigidos para a resolução de problemas com vista a resultados objetivos.

Considerando que nosso cérebro, em especial o córtex cerebral, é “responsável por descobrir padrões, raciocinar de modo lógico, prever o pior e preparar–se para lidar com ele, criar tecnologia e transmiti–la através da cultura” (Suzana Herculano–Houzel), este texto busca responder, para fins de aprendizagem, as questões:

• O que é algoritmo?

• O que é programa de computador?

• Como e quando usar os conceitos da Linguagem de Programação C.

• Como criar programas de computador para resolver problemas de engenharia.

Uma boa definição de Computador é máquina capaz de receber, armazenar, recuperar e processar dados usando programas mantidos em sua memória.

Fazer programas de computador é escrever códigos fontes corretos, não é um processo evidente por si só, requer consciência crítica, atenta, conhecedora daquilo que se programa e requer esforço direcionado a resultados.

Embora sejam apenas letras, o código fonte é portador de uma dinâmica que lhe é própria, que se tornará presente ao ser executado e, quem programa, deve antecipá–la em detalhe no ato da escrita, no “passo a passo” de cada comando.

(5)

Pelo exposto, pode-se estabelecer que programar envolve uma sequência de ações cognitivas que são capazes de promover o aprendizado. Segundo Sancho(2001), as vantagens oferecidas pela programação incluem:

• a promoção do pensamento rigoroso • a compreensão de conceitos gerais • a aquisição da arte da heurística

• a depuração de erros como uma atitude reconstrutiva do pensamento • a invenção de soluções

• a conscientização de que não existe um caminho certo para se chegar a uma solução Os autores esperam que tenha contribuído com o ensino destes conteúdos de modo a torná–los mais atraentes e aplicados nas diversas engenharias, quando cabível.

Será apresentada a Senhora do Hardware: a Linguagem C. Com ela, o hardware é o limite – tente fazer, se ela não fizer é porque o hardware não permite … ou talvez seja porque você não tentou direito!

Não coloque limites neste texto! Amplie suas palavras e vá além … o além cada um decide onde ele está ou é!

Este texto busca explicar melhor os conceitos da linguagem C e das boas práticas e técnicas de programação, sendo um complemento dos livros textos da disciplina, a saber:

Schildt, Herbert. C Completo e Total. 3a ed. Editora Pearson Makron Books,

2006.

Ascenio, A. F. G.; Campos, E. A. V. Fundamentos da Programação de Computadores. 2ª ed. Editora Pearson Education, 2003.

Sebesta, R. W. Conceitos de Linguagens de Programação. 9a ed. Bookman, 2011.

Schildt, Herbert. C: The Complete Reference. 4th ed. McGraw–Hill Education, 2000.

No texto, serão destacados os conceitos nele inseridos. Cada um de nós tem maneiras diferentes de entender estes conceitos, uns entendem rápido, outros mais devagar, também tem aquele que entendem de forma errada. A aplicação do conceito ajuda a sua compreensão. A medida que outros conceitos vão surgindo, o corpo de conhecimento da Programação em Linguagem C e a forma dos seus Algoritmos vai se consolidando. É o processo humano de aprendizagem.

(6)

conceito – definição científica e/ou técnica que fundamenta o

conhecimento e a aplicação de um termo

É de extrema importância a construção do vocabulário científico e termos técnicos e também desenvolver o costume de expressar com propriedade. Estas capacidades e habilidades distingue o engenheiro do leigo, pode-se dizer que é o seu verniz profissional.

vocabulário científico – conjunto de conceitos e termos de uma área

científica e sua expressividade linguística

termos técnicos – conjunto de conceitos e termos de uma área

técnico/científica e sua expressividade linguística

Muitas figuras e muito exemplos estão apresentados no texto e grande parte deles estão discutidos. Boas figuras e bons exemplos de programa de computador valem muitas palavras. Também pode ser inspiração para outros programas.

figuras – buscam explicar um recurso da Linguagem C e, as vezes, as

relações entres estes recursos

exemplos de programas – buscam mostrar como se aplica um recurso da

Linguagem C

Por fim os possíveis erros e seus cuidados.

informação sobre situação com potencial risco de erros

Deixo aqui minhas antecipadas desculpas por eventuais erros neste texto, que certamente existem, agradeço antecipadamente toda e qualquer correção ou sugestão de melhoramentos, que deverão ser enviadas para o e–mail do autor. Serão colocadas na página http://www.univasf.edu.br/~brauliro.leal/page/feedback.htm as Errata, Críticas e Sugestões recebidas.

A figura abaixo é uma visão geral básica da Linguagem C que será estudada neste texto.

(7)
(8)

Sumário

Parte A - Conceitos Gerais... 12

1 Introdução... 13

1.1 Computador... 14

1.2 Sistema Operacional... 15

1.3 Linguagem de Máquina... 16

1.4 Programação de Computadores...19

1.5 Entrada, Processamento e Saída...25

1.6 Conceito de Fluxo de Controle... 25

1.7 Elaboração de Programação de Computador...26

1.8 Elaboração do Pensamento Computacional...26

1.9 Programação Estruturada... 28

1.10 Linguagens de Programação... 28

1.11 Exercícios... 33

Parte B – Linguagem de Programação C...34

2 Compiladores da Linguagem C... 35

3 Linguagem de Programação C... 39

3.1 Programação em Linguagem C...43

3.2 A Função main... 43

3.3 Comandos do Pré-processamento (#include)...45

3.4 Comentários... 45

3.5 Comandos e Bloco de Comandos...45

3.6 Identificadores... 46

3.7 Constantes... 46

3.8 Tipos de Dados... 50

3.8.1 Modificadores de Tipo de Dados Primitivos...51

3.8.2 Tipo void... 52

3.8.3 Tipo char... 52

3.8.4 Tipo int... 53

3.8.5 Tipos float e double... 55

3.8.6 Tipos de Dados x Operações...58

3.8.7 Estrutura dos Tipos de Dados Primitivos...58

3.8.8 Tipos de Dados Primitivos x Memória...59

3.8.9 Tipos Estruturados... 61 3.8.10 Tipos Apontador... 61 3.8.11 Revisão... 61 3.8.12 Exercícios... 62 3.9 Variáveis... 63 3.9.1 Declaração de Variáveis...64

3.9.2 Funções de Entrada/Saída (E/S)...65

3.9.3 Leitura e Escrita de Variáveis...67

3.9.4 Escopo de Variáveis... 73

3.9.5 Classe de Armazenamento de Variáveis...74

3.10 Expressões... 75

3.10.1 Operadores Aritméticos e Lógicos...75

3.10.2 Precedência e Associatividade de Operadores...77

3.10.3 Expressões Lógicas... 78

3.10.4 Expressões Aritméticas... 79

3.10.5 Operador de Atribuição...80

3.10.6 Abreviaturas do Comando de Atribuição...82

3.10.7 Relação Operação x Tipo de Dado...83

3.10.8 Transbordamento de Dados...84

3.10.9 Promoção de Tipo de Dado em Expressões...85

3.10.10 Cast... 86

3.10.11 Funções Matemáticas...89

3.10.12 Gerando Dados de Entrada...90

3.10.13 Estrutura e Estilo... 90

3.10.14 Resumo... 91

3.10.15 Exercícios... 91

(9)

3.12 Estrutura Sequencial... 99 3.12.1 Exercícios... 102 3.13 Estrutura Condicional... 103 3.13.1 Comando if/else... 104 3.13.2 Comando Ternário (?:)... 110 3.13.3 Comando switch... 110 3.13.4 Resumo... 114 3.13.5 Exercícios... 114

3.14 Estrutura de Repetição for...119

3.14.1 Algoritmos Básicos... 125

3.14.2 Resumo... 132

3.14.3 Exercícios... 132

3.15 Estrutura de Repetição while... 134

3.15.1 Condições de Parada...137

3.15.2 Precisão em Aproximações de Séries Numéricas...139

3.15.3 Exercícios... 139

3.16 Estrutura de Repetição do-while...141

3.16.1 Exercícios... 146

3.17 Comandos break e continue... 146

3.17.1 Resumo... 149

3.17.2 Exercícios... 151

3.18 Linguagem C e a Memória do Computador...155

3.18.1 Tipo Apontador... 158

3.18.2 Ponteiros – Endereço x Valor...166

3.18.3 Aritmética com Ponteiros...169

3.18.4 Ponteiro void... 172

3.18.5 O conceito de NULL... 173

3.18.6 Comparação de Ponteiros...173

3.18.7 Ponteiro para Ponteiros...173

3.18.8 Cuidado com os Apontadores!...174

3.18.9 Resumo... 175 3.18.10 Exercícios... 175 3.18.11 Alocação de Memória... 176 3.18.12 Resumo... 177 3.18.13 Exercícios... 178 3.19 Programação Modular... 179 3.19.1 Função... 179 3.19.2 Protótipo de Função...182

3.19.3 Passagem de Argumentos por Valor...183

3.19.4 Passagem de Argumentos por Referência...185

3.19.5 Funções que Retornam Apontador...186

3.19.6 Apontador para Função... 187

3.19.7 Uso de Variáveis static... 188

3.19.8 Recursividade... 189

3.19.9 Recursividade x Interatividade...192

3.19.10 Escopo de Nomes e Tempo de Vida de Variáveis...193

3.19.11 Aplicações com séries numéricas...194

3.19.12 Resumo... 196

3.19.13 Exercícios... 196

Parte D – Dados Estruturados... 199

3.20 Vetores... 200

3.20.1 Algumas Operações com Vetores...201

3.20.2 Aplicações com Vetores... 202

3.20.3 Obtendo Máximo e Mínimo de Vetor...206

3.20.4 Pesquisa em Vetor... 207

3.20.5 Ordenação de Vetores... 208

3.20.6 Vetores Estático x Dinâmico...209

3.20.7 Vetor e Apontador... 211

3.20.8 Vetor de Apontadores...212

3.20.9 Vetor como Parâmetro de Função...213

3.20.10 Função que Retorna Vetor...215

(10)

3.21 Strings... 220

3.21.1 Strings e Apontadores... 222

3.21.2 String Estática x Dinâmica...222

3.21.3 String como Parâmetro de Função...223

3.21.4 Operações com Strings...223

3.21.5 A Função main... 225

3.21.6 Vetor de Strings... 226

3.21.7 Exercícios... 227

3.22 Matrizes... 229

3.22.1 Aplicações com Matrizes...229

3.22.2 Operações com Linhas, Colunas e Diagonais de Matriz...232

3.22.3 Multiplicação de Matrizes...236

3.22.4 Classificação de Matrizes...237

3.22.5 Matriz como Parâmetro de Função...237

3.22.6 Matriz e Apontador... 238

3.22.7 Função que Retorna Matriz...239

3.22.8 Apontador de Matriz como Parâmetro de Função...240

3.22.9 Exercícios... 241

3.23 Estruturas... 247

3.23.1 Struct... 247

3.23.2 Struct e Vetor... 249

3.23.3 Struct e Apontador... 250

3.23.4 Struct como Parâmetro de Função...251

3.23.5 struct tm... 253 3.23.6 Union... 253 3.23.7 Campo de bit... 254 3.23.8 Enumeração... 254 3.23.9 Typedef... 255 3.23.10 Exercícios... 256 3.24 Arquivos... 257 3.24.1 Abertura de Arquivo... 258 3.24.2 Fechamento de Arquivo...259 3.24.3 Entrada/Saída em Arquivo...259

3.24.4 Arquivos stdin, stdout e stderr...263

3.24.5 Tratamento de Erros... 263

3.24.6 Funções fseek, rewind e remove...265

3.24.7 Escrevendo/Lendo Matriz em Arquivo ##...265

3.24.8 Escrevendo/Lendo struct em Arquivo...269

3.24.9 Função feof... 274

3.24.10 Resumo... 276

3.24.11 Exercícios... 277

Parte E – Projeto de Sistemas... 278

4 Desenvolvimento de Sistemas... 279

4.1 Ambiente de Desenvolvimento Integrado (IDE)...279

4.1.1 IDE Dev-Cpp... 279

4.1.2 IDE Code::Blocks (www.codeblocks.org)...282

4.1.3 IDE OnlineGDB (www.onlinegdb.com)...283

4.1.4 C Tutor - Visualize C code execution to learn C online...283

4.2 Projeto de Sistemas... 285

4.2.1 Exemplo de Projeto em Code::Blocks...286

4.3 Debug... 292

4.4 Controle de Versões de Software...296

4.5 Projetos em Nuvem... 297

4.6 Documentação de Software... 298

4.7 Manutenção de Software... 299

4.8 Obsolescência de Software... 300

Parte F – Compilador GNU C... 301

5 O Projeto GNU C... 302

5.1 O Preprocessador C... 302

5.1.1 #include... 302

5.1.2 #define... 302

(11)

5.1.4 #ifdef... 303

5.1.5 #pragma... 303

5.1.6 #error... 303

5.2 Compilador GNU C... 306

5.3 Biblioteca Padrão C (glibc)...306

5.4 Uso do Terminal... 308

5.5 Makefile Básico... 309

Parte G – Aplicações... 311

6 Aplicações... 312

6.1 Máximo Divisor Comum MDC...312

6.2 Números Primos... 313

6.3 Aplicações com Séries... 315

6.3.1 Exercícios... 318

6.4 Recorrência em Séries... 319

6.4.1 Exercícios... 320

7 Buscando Padrões para fins de Algoritmo...322

7.1 Soma: Humanos x Computador...326

7.2 Sim e Não: Humanos x Computador...327

7.3 Comparação: Humanos x Computador...327

7.4 Humanos x Computador... 327

7.5 Notas Adicionais sobre a Linguagem C...327

7.6 Dado e Informação... 329 Parte H – Anexos... 330 8 Anexos... 331 8.1 Tabela ASCII... 332 8.2 Pseudocódigo... 334 8.3 Fluxograma... 335 8.4 Formatos de E/S... 337 8.5 Portas Lógicas... 340 8.6 Revisão de Matrizes... 346

8.7 Palavras Reservadas da Linguagem C...349

8.8 Terminologias Úteis... 350

8.9 Precedência dos Operadores da Linguagem C...352

8.10 Sintaxe C em Backus-Naur Form...354

(12)
(13)

1

Introdução

Há 100 milhões de linhas de código em um carro novo, cinco milhões de linhas de código em um dispositivo inteligente mediano, 1,2 milhão de linhas de código em um smartphone e 80 mil linhas de código em um marca-passo. O mundo está literalmente sendo reinventado com o código.

https://www.ibm.com/br-pt/cloud/learn/middleware

Desde o início de sua existência, o homem procurou criar máquinas que o auxiliassem em seu trabalho, diminuindo o esforço e economizando tempo. Dentre essas máquinas, o computador vem se mostrando uma das mais versáteis e rápidas. Eles são produzidos em vários formatos e tamanhos, todos eles possuem ao menos um processador, também conhecido como CPU.

O computador, embora, não tenha iniciativa e nenhuma independência, não seja criativo e nem tenha inteligência como a humana, pode receber instruções detalhadas e executá–las inúmeras vezes. A mesma máquina pode executar ora um editor de texto, ora um jogo, ou os dois ao mesmo tempo. Nisso reside a sua grande utilidade – ele é programável e reprogramável – é versátil.

Os computadores possuem duas partes diferentes mas que trabalham juntas: o hardware, composto pelas partes físicas, e o software, composto pelos programas. No entanto, para que o computador execute esses programas, devemos escrevê–los usando uma linguagem acessível tanto aos computadores quanto aos criadores de softwares – nós (humanos). Essa linguagem é chamada linguagem de programação, exitem muitas delas, são linguagens próximas da linguagem humana mas que podem ser traduzidas para a linguagem de máquina.

(14)

linguagem natural1 – linguagem falada pelos humanos

linguagem de alto nível – linguagem escrita de forma textual, próxima à

linguagem natural

linguagem de máquina – linguagem que o computador consegue

executar, códigos binários, usa os símbolos {0,1}

linguagem de montagem (Assembly) – próximo à linguagem de máquina,

escrita em códigos (mnemônicos)

linguagem de programação – linguagem que os humanos usam para

escrever programas de computador

1.1 Computador

Computadores são máquinas versáteis e permitem a execução de uma grande variedade de operações de acordo com suas capacidades. Por isso eles estão em todos os lugares no mundo moderno, onde as relações sociais podem ser mediadas pela tecnologia, criando um mundo digital.

computador - máquina capaz de variados tipos processamento de dados

O computador é uma máquina capaz de variados tipos processamento de dados devido à Arquitetura de von Neumann – o modelo geral de Computador da atualidade. Esta arquitetura descrever o funcionamento do computador em termos da interação entre três componentes:

1. unidade de processamento – realiza as operações matemáticas e lógicas 2. armazenamento de dados – memória de trabalho

3. dispositivos de entrada e saída – recebe e envia informações de/para o usuário

A estrutura geral de um computador é apresentado na Figura 1.1, os seus componentes principais são o processador (CPU ou Unidade Central de Processamento), a memória (RAM ou memória principal), o barramento (de dados, de endereços e de controle) e os dispositivos de entrada/saída (E/S).

Figura 1.1 Estrutura geral de um computador e seus componentes (Arquitetura de von Neumann).

1 Os termos linguagem natural, linguagem de programação e linguagem de máquina possuem definições mais rigorosas, estas aqui expressas são de ordem didática.

(15)

Estes componentes, em geral, são cartões de circuitos integrados inseridos na placa– mãe ou periféricos conectados ao gabinete do computador. Este conjunto é o hardware, os constituintes materiais do computador.

O processador é muito importante para o computador pois é ele que faz o processamento dos programas que estão na memória.

A CPU controla todo sistema, ela possui uma estrutura interna muito complexa, a seguir são descritos seus três constituintes principais:

1. Unidade de Controle (UC) – busca a instrução da memória, controla e distribui tarefas

2. Unidade Aritmética e Lógica (ULA) - realiza as operações matemáticas e lógicas

3. Registradores (R) – memória para armazenar dados e resultados intermediários

Os registradores têm grande relevância para a Linguagem C pois ela é capaz de alocar variáveis diretamente neles, como será visto adiante.

Na Figura 1.1 falta o Sistema Operacional, cuja função é carregar os programas executáveis na memória e prover alguns serviços de intermediação entre software e hardware. A carga de um programa executável na memória é o início de um intenso fluxo entre os componentes do hardware, o chamado fluxo de controle.

Os computadores modernos utilizam sistemas operacionais com interfaces gráficas amigáveis e que permitem a execução de diversas funções e a instalação de outros programas de computador tais como editores de texto, planilhas e pacotes gráficos. Este conjunto é o software, os constituintes lógicos do computador.

1.2 Sistema Operacional

Os Sistema Computacionais evoluem muito rapidamente, atualmente são constituídos de um ou mais processadores, memória principal, discos, impressoras, teclado, mouse, monitor, interfaces de rede e outros dispositivos de entrada e saída.

Os Sistema Computacionais são complexos e o Sistema Operacional (SO) é o gerente dos recursos da máquina.

Sistema Operacional (SO) é um conjunto softwares com a função de

gerenciar os recursos da máquina e fornecer uma interface entre o computador e o usuário.

A Figura 1.2 mostra o Modelo de Computador abstrato fornecido pelo Sistema Operacional, destacando sua grande simplificação, onde o usuário interage diretamente apenas com o software em uso, e o SO assumindo as demais tarefas do sistema.

(16)

Figura 1.2 Modelo de Computador fornecido pelo Sistema Operacional.

O Sistema Operacional é a camada de software de um computador destinado a controlar cada parte do hardware, fazendo-as operar em conjunto, e provendo recursos aos programas do usuário (Figura 1.2). Os sistemas operacionais mais conhecidos são o Windows e o Linux.

Os principais recursos gerenciados pelo SO são:

Processador: distribuiu a capacidade de processamento, o uso da CPU

Memória: fornece a cada aplicação um espaço próprio de memória, independente e isolada das demais aplicações

Dispositivos: gerência de entrada/saída com a interação com cada dispositivo por meio de drivers

Arquivos: atua sobre arquivos e diretórios, definindo interfaces de acesso e regras para de uso

Acesso: definição de usuários, grupos de usuários e registros de recursos e acesso por usuários, além do tratamento das interrupções de hardware

Interface Gráfica: possuem telas para informar qual a operação realizar.

Suporte de Rede: atua sobre os dispositivos físicos para comunicação em rede, como placas de redes ou modem

1.3 Linguagem de Máquina

A integração do Software com o Hardware dos computadores é feita através de programas escritos em código de máquina ou linguagem de máquina, Figura 1.3.

Figura 1.3 A linguagem de máquina é a conexão entre o Software e o Hardware dos computadores2.

(17)

A linguagem de máquina é binária, constituída de zeros (0) e uns (1). Desta forma, os softwares que são executados pelos computadores são sequências de números binários nas quais estão codificados dados, endereços de memória e instruções de máquina para que possam processar suas tarefas, Figura 1.3.

A Figura 1.4 é parte de um programa em linguagem de máquina, uma sequência de 0 e 1, que são as letras do código de máquina, denominadas bits.

Figura 1.4 Parte de um programa em linguagem de máquina, composta por uma sequência de bits.

Ler programas de computador em código de máquina não é tarefa fácil, como pode ser visto na Figura 1.4, escrever programas usando o alfabeto dos bits também não. Para facilitar a leitura bits, eles são organizados em grupos de 8 bits, denominado byte, como pode ser visto na Figura 1.5.

Figura 1.5 Código binário organizado em bytes.

Um byte é composto por 8 bits e cada bit pode ser 0 ou 1. Dessa forma pode haver 256 (28) formas de arranjar bits para formar bytes. Para facilitar ainda mais a leitura e a escrita do código de máquina foi criado o Código ASCII (American Standard Code for Information Interchange ou Código Padrão Americano para o Intercâmbio de Informação).

O Código ASCII é binário e codifica um conjunto de 256 sinais: 95 símbolos gráficos (letras do alfabeto latino, sinais de pontuação e sinais matemáticos) e 33 sinais de controle, do Anexo. Outros 128 sinais compõem a parte estendida deste código, Tabela 8.1 e Tabela 8.2 do Anexo.

(18)

A codificação ASCII é usada para representar textos em computadores, equipamentos de comunicação, entre outros dispositivos que trabalham com texto. Os sinais não– imprimíveis, conhecidos como caracteres de controle, são amplamente utilizados em dispositivos de comunicação e afetam o processamento do texto.

Exemplo 1.1 Escrever a palavra bit em código de máquina utilizando o código ASCII. Utilizando a Tabela 8.1 pode–se obter ver o equivalente binário de cada letra:

b => 01100010 i => 01101001 t => 01110100

Logo, a palavra bit em código de máquina é 01100010 01101001 01110100. bit => 011000100110100101110100

Observe na Tabela 8.1 que as letras maiúsculas precedem as minúsculas no código ASCII. Os primeiros programas de computador eram escritos utilizando letras maiúsculas. Com a evolução das linguagens de programação, as letras minúsculas foram incorporadas aos softwares.

Exemplo 1.2 Escrever a expressão C=A+B em código binário.

Utilizando a Tabela 8.1 pode–se obter o equivalente binário de cada letra: C => 01000011

= => 01011101 A => 01000001 + => 00101011 B => 01000010

Logo, C=A+B em código de máquina é 0100001101011101010000010010101101000010. C=A+B => 0100001101011101010000010010101101000010

Seguem exercícios.

Exercício 1.1 Calcular as expressões a seguir e explicar seus resultados.

1. for(i=0;i<10;i++)printf(“%d”,i); 2. x=2*y–x/5;

3. z=A*x+B;

1. int main(void){}

Exercício 1.2 Escrever as expressões correspondentes aos códigos binários:

1. 0100000101010011010000110100100101010011

2. 011101110011110100110010001010100010100001000001001011110010101101000010001011 110010100100111011

(19)

Avalie este exemplo.

Exemplo 1.3 Para representar nosso conhecimento usamos símbolos, leia este texto. 50M05 53R35 QU3 49R3ND3 3 R39R353N74M05 N05505 C0NH3C1M3N705 90R M310 D3 51M80L05. 4 M473M471C4 3 UM 6R4ND3 3X3M9L0, 70D05 C0NH3C3M 53U5 51M80L05 QU3 540 4D074D05 90R 70D45 45 CUL7UR45. 0 M35M0 V4L3 94R4 4 MU51C4, 05 51N415 D3 7R4N5170, 05 M4945, 05 1C0N35 D05 9R06R4M45 D3 C0M9U74D0R. 3 MU170 M415. 3NC0N7R3 V0C3 0U7R05 3X3M9L05. 3573 73X70 3574 35CR170 3M 51M80L05, N40 3 F4C1L D3 49R3ND3R 3 3N73D3R? 9R06R4M4R 74M83M U54 51M80L05 C0M0 3573, 3 MU170 F4C1L D3 49R3ND3R 74M83M.

Unidades de Medida

A unidade de medida da computação é o bit, seu símbolo é b. O bit é a unidade fundamental de informação, seu valor é binário: 0 (zero) ou 1 (um). A partir dele são derivadas outras unidades de medidas.

bit (binarydigit) – unidade fundamental de informação, vale 0 ou 1byte - 8 b que são processados em paralelo (ao mesmo tempo)

word (palavra) - tamanho da palavra do processador, atualmente vale 64 b ou 8 B

doubleword - 2 wordsnibble - 4 bits

1.4 Programação de Computadores

Para que o computador resolva nossos problemas, é necessário que a mente humana (de um ou mais seres humanos) transforme o problema em algoritmo, o algoritmo em programa de computador, que são escritos em uma linguagem de programação, traduzido o programa de computador para a linguagem de máquina e, por fim, resolver o problema usando um computador. É um processo constituído de muitas etapas, veja a Figura 1.6.

Figura 1.6 Relação entre Algoritmos, Programa de Computador e Linguagem de Programação Computador.

Algoritmo, Programa de Computador e Linguagem de Programação estão muito relacionados, como indica a Figura 1.6.

Os conceitos de Algoritmo são muitos, o mesmo pode ser dito sobre os conceitos de Programa de Computador e de Linguagem de Programação. Abaixo estão um conceito para cada um deles.

(20)

Algoritmo é conjunto das regras e procedimentos lógicos bem definidos

que levam à solução de um problema em um número finito de etapas.

Programa de Computador é um conjunto de instruções que descrevem

uma tarefa a ser realizada por um computador.

Linguagem de Programação é um método padronizado, formado por

um conjunto de regras sintáticas e semânticas, para implementar código fonte que pode ser convertido em programa de computador.

Há outros conceitos e definições para Algoritmo, Programa de Computador e Linguagem de Programação, procure na internet para esclarecimentos.

Programa de Computador é um produto feito na imaginação (meu

conceito).

Nem todo problema pode ser resolvido através do computador. Tem problema que não pode ser transformado em Algoritmo. Tem Algoritmo que não pode ser transformado em Programa de Computador, ou seja:

• Nem todo Algoritmo pode se tornar um Programa de Computador (Exemplo 1.4 e Exemplo 1.5)

• Todo Programa de Computador pode se tornar um Algoritmo

• Todo Programa de Computador pode ser escrito em uma Linguagem de Programação Por enquanto, os algoritmos dos Exemplo 1.4 e Exemplo 1.5 podem ser transformados em Programa de Computador mas o Exemplo 1.6 pode.

(21)

Fonte: GL BR – Manual Cadeira Eames Plus.cdr

Este manual é um exemplo de algoritmo. Pode–se observar algumas características deste algoritmo:

1. Temos duas partes, os ingredientes (peças, ferragens e ferramentas) e as instruções 2. Tanto os ingredientes quantos as instruções são em número finito; temos 7 ingredientes

e 4 instruções 3. Tem início e fim

4. É completo o suficiente para montar a cadeira a partir dos ingredientes

5. É detalhado o suficiente para montar a cadeira a partir dos ingredientes; nem mais nem menos – pelo menos para seres humanos

6. Cada instrução é bem definida

Ouso afirmar que, de posse dos ingredientes, qualquer ser humano é capaz de montar a citada cadeira a partir do algoritmo.

(22)

Exemplo 1.5 Receita para fazer Bolo Simples.

Ingredientes

• 2 xícaras (chá) de açúcar

• 3 xícaras (chá) de farinha de trigo

• 4 colheres (sopa) de margarina • 3 ovos

• 1 e 1/2 xícara (chá) de leite • 1 colher (sopa) bem cheia de

fermento em pó

Modo de Preparo

1. Bata as claras em neve e reserve 2. Misture as gemas, a margarina e

o açúcar até obter uma massa homogênea

3. Acrescente o leite e a farinha de trigo aos poucos, sem parar de bater.

4. Por último, adicione as claras em neve e o fermento

5. Despeje a massa em uma forma grande de furo central untada e enfarinhada

6. Asse em forno médio 180 °C,

preaquecido, por

aproximadamente 40 minutos ou ao furar o bolo com um garfo, este saia limpo

Fonte: https://www.tudogostoso.com.br/receita/29124–bolo–simples.html

Esta receita é um exemplo de algoritmo. Pode–se observar algumas características deste algoritmo:

1. Temos duas partes, os ingredientes e as instruções (modo de preparo)

2. Tanto os ingredientes quantos as instruções são em número finito; temos 6 ingredientes e 6 instruções

3. Tem início e fim

4. É completo o suficiente para fazer o bolo simples a partir dos ingredientes

5. É detalhado o suficiente para fazer o bolo simples a partir dos ingredientes; nem mais nem menos – pelo menos para seres humanos

6. Cada instrução é bem definida

Ouso afirmar que, de posse dos ingredientes, qualquer ser humano é capaz de fazer o citado bolo a partir do algoritmo.

Segue mais outro exemplo de algoritmo.

Exemplo 1.6 Algoritmo para somar dois números usando uma calculadora comum. 1. Digite o primeiro número com o teclado da calculadora

2. Comprimir a tecla referente à operação somar

3. Digite o segundo número com o teclado da calculadora 4. Comprimir a tecla referente ao igual

5. Leia o resultado no visor da calculadora

Segue o algoritmo para calcular os dígitos verificadores de CPF. Exemplo 1.7 Algoritmo para calcular os dígitos verificadores de CPF

O CPF é composto por 9 dígitos além de dois dígitos verificadores, que são calculados. O primeiro dígito verificador é calculado a partir dos 9 dígitos do CPF.

(23)

O segundo dígito verificador é calculado a partir dos 9 dígitos do CPF, acrescentando a ele o primeiro dígito verificador. Da seguinte forma:

1. multiplique cada um dos 9 dígitos do CPF, da direita para a esquerda, por números inteiros consecutivos a partir do número 2

2. some as parcelas do item anterior 3. tome o resto da divisão da soma por 11

4. se o resto for menor do que 2 então o primeiro dígito verificador é igual a 0 (zero) caso contrário é igual a 11 menos o resto

5. Acrescente o primeiro dígito verificador aos dígitos do CPF e repita os procedimentos anteriores para calcular o segundo dígito verificador

Este algoritmo pode ter outras redações além da apresentada.

Algoritmos envolvendo cálculos e fórmulas matemáticas são mais fáceis de desenvolver pois há muito menos ambiguidade na redação das tarefas. Elas tem a clareza da matemática. Analise o algoritmo de Euclides para obter o MDC – Máximo Divisor Comum que está no Exemplo 1.9.

Exemplo 1.8 Algoritmo de Euclides para obter o MDC de dois números 1. Dados dois números A e B, divida A por B e obtenha o resto R1 2. Se o resto R1 for zero, então o MDC de A e B é B

3. Se R1 for diferente de zero, divida B por R1 e obtenha o resto R2 4. Se o resto R2 for zero, então o MDC de A e B é R1

5. Se R2 for diferente de zero, então divida R1 por R2 e obtenha o resto R3 6. Se o resto R3 for zero, então o MDC de A e B é R2

7. Se R3 for diferente de zero, repita os dois passos anteriores até que o novo resto obtido seja igual a zero

Os algoritmos de interesse computacional podem ser representados de duas formas, semelhantes ao modo como os programas são escritos: Fluxograma e Pseudocódigo.

O Fluxograma é menos detalhista do que o Pseudocódigo. Tem a vantagem de ser gráfico e indicar com grande clareza o fluxo de controle do algoritmo.

O Pseudocódigo é textual e os algoritmos nele representados podem ser traduzidos, quase que diretamente, para uma linguagem de programação.

No Anexo são apresentados o Pseudocódigo e o Fluxograma.

E Exemplo 1.10 é um Fluxograma de um dia típico de um estudante. Neste fluxograma, pode-se ver as estruturas sequencial, condicional e de repetição. Reproduza o fluxo de controle deste exemplo usando a Regra do Dedo.

(24)

O Exemplo 1.10 é algoritmo para validar CPF em Pseudocódigo, no caso em Portugol. Neste pseudocódigo, pode-se ver as estruturas sequencia, condicional e de repetição. Observe os detalhes desta representação, há declarações e identificação de tipos. Reproduza o fluxo de controle deste exemplo usando a Regra do Dedo.

Exemplo 1.10 Algoritmo em Portugol para validação de CPF Algoritmo: ValidaCPF

var

cpf : caracter

n_cpf :vetor[1..11] de inteiro soma1 :vetor [1..9] de inteiro soma2 :vetor[1..10] de inteiro s1 :inteiro s2 :inteiro x :inteiro resto1 :inteiro resto2 :inteiro inicio

escreval("* * * * * TESTE DE VALIDAÇÃO! * * * * *") escreval("Digite o CPF:")

leia(cpf)

para x de 1 ate 11 faca

n_cpf[x] := caracpnum(copia(cpf,x,1)) fimpara

para x de 1 ate 9 faca

soma1[x] := n_cpf[x]*(11-x) s1 := s1+soma1[x] fimpara

resto1 := s1 mod 11 se( resto1 < 2 ) então resto1 := 0

senao

resto1 := 11-resto1 fimse

(25)

soma2[x] := n_cpf[x]*(12-x) s2 := s2 + soma2[x] fimpara

resto2 := s2 mod 11 se( resto2 < 2 ) então resto2 := 0

senao

resto2 := 11-resto2 fimse

se( resto1 = n_cpf[10] ) e ( resto2 = n_cpf[11] ) então escreva( cpf," Esse Cpf é Valido" )

senao

escreva( cpf," Esse Cpf não é Valido!" ) fimse

fimalgoritmo

1.5 Entrada, Processamento e Saída

De modo geral, os programas de computadores executam três processos: a entrada de dados, o processamento de dados e a saída de dados, resumidos na Figura 1.7.

Figura 1.7 Entrada-Processamento-Saída (EPS).

Estes três conceitos se aplicam, em geral, a todo programa de computador. Tendo em vista o problema a ser resolvido, é da responsabilidade do programador identificar cada um destes processos e propor os algoritmos para resolver. Os processos de entrada (E) e saída de dados (S), abreviado por E/S, são feitos por funções padronizadas.

Os dados e o seu processamento dependem do problema, requerendo conhecimento para elaborar seus algoritmos. Deve-se assegurar que a entrada seja feita de modo correto, usar os algoritmos adequados e gerar as saídas esperadas. É necessário testar os programas, identificar situações que levar a erros e evitá-los.

Enfim, pode-se redefinir o conceito de algoritmo. Algoritmo de um problema define e determina todas as trajetórias possíveis entre suas entradas possíveis e suas saídas desejadas, incluídas todas aquelas que conduzem a erros. Um algoritmo é a solução universal de um problema, aquelas trajetórias que são corretas e também as que evitam as incorretas.

A expressão “entra lixo sai lixo” é comum da nossa área. Como bons programdores é importante está outra expressão “entra lixo sai aviso que entrou lixo”.

1.6 Conceito de Fluxo de Controle

O fluxo de controle percorre o programa do início ao fim, executando seus comandos conforme definido pelo programador. O início é único mas pode haver vários comandos encerrando esses programas.

(26)

Regra do Dedo – pode-se percorrer os programas de computador

com um dedo e identificar seu fluxo de controle

1.7 Elaboração de Programação de Computador

A Engenharia de Software é uma especialidade voltada para o desenvolvimento de software, normalmente grandes projetos envolvendo programação.

Cada indivíduo possui sua forma de resolução de problema. Na área científica a solução dos problemas deve ser padronizada para facilitar o entendimento por outras pessoas e também possibilitar a reprodução das nossas soluções.

O matemático George Polya propõe um método estruturado para a resolução de problemas baseado em quatro etapas:

1. Entender – deve-se obter a melhor compreensão do problema, identificando quais são as questões e variáveis existentes e verificando se existem informações suficientes para entendê-lo, e buscar uma solução.

2. Planejar - consiste em estudar a melhor forma de resolver o problema. É basicamente identificar o melhor método a ser aplicado; geralmente o método da divisão em problemas menores auxilia nesse processo. Algumas técnicas comuns a serem utilizadas nessa etapa são: intuição, lista ordenada, eliminação de possibilidades, simetria e semelhança com outros casos, causa e efeito, análise sistêmica, estruturação de uma equação, desenhos, busca por padrões etc.

3. Executar - consiste em executar o plano realizado na etapa anterior e efetivamente solucionar o problema.

4. Verificar – deve-se verificar a solução encontrada. Para isso, necessário validar todas as entradas possíveis apresentadas no problema e identificar possíveis pontos de falhas. De forma muito simplificada, a construção de algoritmos envolve passos similares, como os abaixo relacionados:

1. Compreender o problema a ser resolvido, destacando os pontos importantes e sua composição

2. Definir os dados de entrada e os demais dados que fazem parte do problema

3. Definir o processamento, os cálculos a serem efetuados para transformar dados de entrada em dados de saída

4. Definir os dados de saída, os dados a serem gerados pelo processamento 5. Conceber testes para verificar e validar o algoritmo

1.8 Elaboração do Pensamento Computacional

O método de George pode ser aplicado ao domínio do computador. Existem quatro estágios principais para o pensamento computacional:

1. Decomposição – dividir o problema em partes menores

2. Generalização – identificar a solução que resolve o problema mas que também resolva outros problemas similares; o mesmo que propor uma solução padronizada

(27)

3. Abstração – transformar as partes do problema em conceitos gerais, aplicáveis a outros problemas de ordem mais geral

4. Algoritmos – sequência ordenada das etapas para resolver o problema e avaliar sua eficácia.

Estes passos podem ser especificados ao identificar as operações e ações a serem executadas sobre os dados para obter o resultado final esperado. Os algoritmos mais simples possuem um conjunto de ações como os da Tabela 1.1. Cada uma destas ações são desdobradas em um ou mais comandos para definir o fluxo de controle e compor os programas de computador. Além de poderem ser combinadas entre si como decisões dentro de repetições e repetições dentre de repetições em vários níveis.

Tabela 1.1 Principais ações dos algoritmos mais simples

• início

• declaração das variáveis e constantes • entradas de dados

• cálculos de expressões e atribuições • decisões através de comparações • repetições através de comparações • saídas de dados

• fim

Pode–se observar que pessoas e computadores são muito diferentes, mas eles precisamento se comunicar, o que leva a necessidade de linguagens de programação com diferentes níveis. Os processadores normalmente executam instruções simples e elementares e usam linguagens de baixo nível – aquelas mais próximas das linguagens de máquina. As linguagens de máquina são consideradas difíceis de programar e, portanto, foram criadas as linguagens de alto nível para tornar mais fácil a tarefa de programação de computadores.

Como computadores não podem fazer julgamentos e nem resolver ambiguidades, as linguagens de programação devem ser capazes de comunicar instruções de forma precisa. Em geral, elas são muito mais simples do que as linguagens humanas, denominadas linguagens naturais.

As Linguagens de Programação foram criadas para comunicar instruções para computadores. Elas possuem uma gramática e um dicionário (léxico) que formam um conjunto de regras sintáticas (forma) e semânticas (significado) usadas para escrever programas para computadores. Programas para computadores são construídos a partir de algoritmos que, por sua vez, são sequências de instruções ou operações padronizadas para resolver problemas.

Linguagens de programação são métodos padronizados para implementar códigos que podem ser transformados e processados por computadores. São constituídas de palavras, compostos de acordo com regras, para o código fonte de softwares, que depois de serem traduzidos para código de máquina, e serem executado por microprocessadores. Ou seja, elas podem ser usadas para expressar algoritmos com precisão.

Quem faz uso de linguagens de programação são serem humanos, elas servem para especificar programas com instruções para computadores agir, armazenar e transmitir dados. As linguagens de programação também evoluem e são classificadas em gerações, algumas delas são descritas abaixo:

(28)

Primeira Geração – Linguagem de Máquina, programas em código binário com instruções que o processador é capaz de executar, única para cada tipo de CPU.

Segunda Geração – Linguagens de Montagem (Assembly), programas em código mnemônico, que são símbolos em lugar dos bits, também única3 para cada tipo de CPU.Terceira Geração – Linguagens Procedurais, programas em código com suporte ao

conceito de procedimento, próximo da linguagem natural, o mesmo código pode ser usado para todo tipo de CPU.

Quarta Geração – Linguagens de Aplicação, programas em código com suporte ao conceito de domínio específico, como banco de dados.

Quinta geração – Linguagens voltadas a Inteligência Artificial.

1.9 Programação Estruturada

A programação estruturada permite elaborar códigos por meio de apenas três estruturas: sequencial, condicional e de repetição, Figura 1.8.

Estas estruturas são suficientes para gerenciar o fluxo de controle nos programas de computador, pode-se afirmar que são os ingredientes básicos de todo e qualquer programa deste livro.

Figura 1.8 Fluxogramas das estruturas sequencial, condicional e de repetição.

Estas estruturas simples são agrupadas em sub–rotinas e funções para a produção de programas de computadores.

A programação estruturada tem sido usada há décadas para produção de software grandes e pequenos, tais como sistemas operacionais, banco de dados e compiladores. A programação estruturada é uma maneira de produzir software, denominado paradigma de programação estruturada. Há outros paradigmas para a produção de software, como paradigma de programação orientado a objetos, paradigma de programação imperativa e paradigma de programação funcional.

1.10Linguagens de Programação

As linguagens de programação são criações humanas para nos ajudar na programação de computadores. Foram feitas para encapsular nossas soluções intelectuais na forma de programa de computador. Como existe uma grande diversidade de problemas, e cada dia surge um novo, existem milhares de linguagens de programação e novas são criadas sempre que necessárias.

Embora em grande número e variadas, as linguagens de programação, em geral, seus elementos constituintes podem reduzidos a:

1. palavras reservadas 2. símbolos

(29)

3. regras para dar significado aos seus elementos, seus usos e combinações

Conforme pode ser visto na Figura 1.1, qualquer que seja a linguagem de programação, ela deve ser capaz de produzir programas para gerenciar o fluxo de controle nos Barramento de Dados, de Endereços e de Controle do Computador. Para isso, elas possuem vários elementos que estão discutidos na Tabela 1.2.

Tabela 1.2 Principais elementos das Linguagens de Programação Estruturadas

Palavras Reservadas

São palavras usadas para redigir os programas de computadores, com suas sequências, decisões, repetições, sub–rotinas e funções.

Comentário

São textos explicativos colocados ao longo dos programas de computadores, são ignorados no processo de tradução para o código de máquina.

Tipos de Dados

Os tipos de dados é uma combinação envolvendo valores e operações. Cada tipo é identificado por cinco elementos básicos, quais sejam:

1. tipo de dado – nome do tipo de dado aceito pela linguagem 2. tamanho – quantidade de bytes armazenados na memória

3. estrutura – organização interna dos bits, seu significado e sua interpretação 4. faixa de variação – limite inferior, limite superior e intervalo de variação 5. operações – operações suportadas e seus operadores

De modo geral, os tipos básicos de dados são os literais, ponto fixo e ponto flutuante. Os tipos de dados literais tem tamanho reduzido, de um ou dois bytes, estrutura simples com e sem sinal, variam de 1 e 1, são partes do conjunto dos números inteiros. Possuem pequena faixa de variação. Suas operações matemáticas são muito limitadas, podem ser operados como parte de textos, são usados para representar símbolos da linguagem natural, como letra e números.

Os tipos de dados ponto fixo, com quatro ou oito bytes, possuem estrutura simples com e sem sinal, variam de 1 e 1, são partes do conjunto dos números inteiros.

Possuem grande faixa de variação. Suas principais operações matemáticas são {+ - * % / }, a divisão exclui a parte fracionária.

Os tipos de dados ponto flutuante, com quatro ou oito bytes, possuem estrutura complexa e possuem sinal, variam por frações da unidade, são partes do conjunto dos números reais. Possuem grande faixa de variação. Suas principais operações matemáticas são {+ - * / }, a divisão inclui a parte fracionária, e também as funções matemáticas usuais, como potenciação, radiciação, trigonométricas, exponenciais e logarítmicas.

Algumas linguagens possuem um tipo de dado especial capaz de representar endereços de memória e operar sobre eles, são os apontadores.

Os tipos de dados orientam também como o programa os armazena na memória do computador e também como eles são processados pela CPU.

Há também os tipos de dados estruturados, formados a partir do simples, como vetores, matrizes e registros, dentre outros.

Constantes e Variáveis

Durante o desenvolvimento do programa é necessário criar variáveis, que são compostas por quatro elementos básicos, a saber:

1. identificador – nome da variável, para possibilitar sua utilização

1. tipo de dados – tipo de dado da variável, que inclui as operações que podem ser feitas com ela

(30)

2. valor – quantidade atribuída à variável ou obtida por meio de expressões 3. endereço – região da memória alocada para a variável

Ao executar os programas, os nomes das variáveis são transformados em endereços de memória e seus valores tornam–se conteúdos de memória. Ou seja, existem dois mundos da programação, aquele do par {identificador, valor} e o outro par {endereço, conteúdo}.

O computador identifica cada variável por meio de um endereço e as linguagens de programação permitem nomear cada endereço ou posição de memória, facilitando a referência ao seu endereço.

Na programação, variáveis são capazes de reter e representar um valor ou expressão. Tecnicamente falando, variável é uma região de memória de um computador previamente identificada e cuja finalidade é armazenar dados de um programa por um determinado espaço de tempo e também as operações que podem ser feitas com ela. Vale destacar que a memória pode armazenar um conteúdo por vez e, quando o computador altera a memória, o conteúdo que antes estava armazenado é perdido ao dar lugar ao novo.

A diferença entre variáveis e constantes é que as variáveis podem ter seus dados alterados, já as constantes retém seu valor durante todo tempo de execução do programa; mas ambas possuem {identificador, tipo de dado, valor, endereço}.

Como já visto, programas representam soluções para um problema escrito em linguagem de computador e, assim, é comum dividir os problemas em partes4 e, cada

parte, ser representado por uma variável. As variáveis são elementos básicos na programação, pois são elas que armazenam os dados necessários para a sua elaboração. Dada a variedade de problemas tratados por computador, é necessário criar muitas variáveis e ter muitos tipos de dados para representar seus valores.

Como há muitas linguagens de programação, algumas exigem a declaração das variáveis do programa, outras não. Outras exigem que as variáveis tenha um tipo bem definido outras não.

Expressões Aritméticas e Lógicas

O conceito de expressão na computação é muito similar ao da matemática, elas são formadas variáveis e constantes (denominados operandos) que se relacionam por meio de operadores. Os operadores podem ser classificados em aritméticos, relacionais e lógicos, dando origem às expressões aritméticas, relacionais e lógicas respectivamente que, uma vez avaliada, produz um resultado, em geral um valor.

Pode haver expressões mistas de acordo com as necessidades do programa.

Há ainda o operador de atribuição, aqui simbolizado por =, para sentenças da forma

variável = expressão, um dos comandos ou instruções mais simples das linguagens

de programação.

Há ainda regras para avaliar expressões, que podem incluir o uso de parêntesis para estabelecer a ordem dos cálculos, além da definição da hierarquia dos operadores, que varia entre as linguagens, normalmente a mesma da matemática.

Dependendo da linguagem, há também expressões literais, similares às já mencionadas acima.

Estrutura Sequencial

Na computação, uma estrutura sequencial é um fluxo de controle presente em linguagens de programação, que realiza um conjunto predeterminado de comandos ou instruções de forma sequencial, de cima para baixo, uma a uma, na ordem em que foram postas.

O fluxo de controle das estruturas sequencial não apresenta desvios, todos os comandos são executados, de acordo com sua sequência.

4 Dividir para conquistar é uma técnica útil de resolução de problema, de origem militar; mas deve ser usada com cuidado pois há muitos problemas que possuem sinergia entre suas partes e, nestes, o todo é maior que a soma de suas partes – e esta técnica é de pouca utilidade.

(31)

Em geral, os comandos destas estruturas são separadas por algum tipo de delimitador, que varia entre as linguagens.

Estrutura Condicional

As estruturas condicionais ou de decisão permitem saltos ou desvio de comandos, fazendo com que o programa proceda de uma ou outra maneira, de acordo com os resultados de suas decisões lógicas.

Uma estrutura condicional realiza um único desvio, faz uma única escolha.

Toda estrutura condicional possui uma expressão (denominada condição) que, quando avaliada, permite decisão de fazer ou não fazer o desvio programado.

As principais comandos para estruturas condicionais são: se/então/senão e

switch/case. O formato dos comandos das estruturas condicionais variam entre as

linguagens de programação.

Estrutura de Repetição

As estruturas de repetição permitem que um grupo de comandos seja executado um número definido ou indefinido de vezes, de acordo com os resultados de suas decisões lógicas.

Uma estrutura de repetição pode executar várias vezes seu bloco de comandos.

Toda estrutura de repetição possui uma expressão (denominada condição) que, quando avaliada, permite a decisão de executar ou não executar o bloco de comandos programado.

As principais comandos para estruturas de repetição são: para e enquanto/faça e

faça/enquanto.

O comando para é usado para executar um número definido de repetições. Ele possui um contador automático para este fim.

O comando enquanto/faça avalia sua condição e pode ou não executar seu bloco de comandos, ou seja, ele pode executar seu bloco de comandos uma única vez, nenhuma vez ou várias vezes.

O comando faça/enquanto avalia sua condição e executa seu bloco de comandos ao menos uma vez, ou seja, ele pode executar seu bloco de comandos uma única vez ou várias vezes.

O formato dos comandos das estruturas de repetição varia entre as linguagens de programação.

Rotinas, Sub–Rotinas e Funções

As sub–rotinas são blocos de comandos que recebem um nome para identificá–la e permitir seu uso. Dessa forma, as sub–rotinas permitem organizar um programa em módulos, agrupando as tarefas repetitivas presentes no programa, deixa–o melhor estruturado. Os módulos que retornam valor são denominadas funções, caso contrário são denominados sub–rotinas.

Muitas linguagens possuem funções especializadas em operações de Entrada/Saída, são parte importante dos programas.

Compiladores

Um compilador é um programa de computador que traduz um programa de uma linguagem textual facilmente entendida por um ser humano para uma linguagem de máquina, específica para um processador e sistema operacional.

O código original é denominado programa–fonte ou código fonte, em geral escrito no formato texto e legível por seres humanos.

O código final é denominado programa executável ou código de máquina, em geral escrito no formato binário que pode ser executados por um processador.

Como há variados tipos de processadores e sistemas operacionais, também há vários compiladores para uma mesma linguagem de programação, um compilador para cada combinação processador/sistemas operacional.

(32)

Interpretadores são programas de computador que leem um código fonte de uma linguagem de programação e o converte, em geral linha a linha, em código executável. Como há variados tipos de processadores e sistemas operacionais, também há vários interpretadores para uma mesma linguagem de programação, um interpretador para cada combinação processador/sistemas operacional.

Existem também, as linguagens de script, que são linguagens interpretadas, executadas do interior de programas e de outras linguagens de programação como em navegadores web.

Notas:

• Grosso modo, pode–se pensar que os dados e as expressões aritméticas e lógicas, compõem as informações que trafegam no Barramento de Dados. Dados utilizados para representar endereços de memória trafegam no Barramento de Endereços. E as estruturas sequencial, condicional e de repetição, com as sub–rotinas e funções, trafegam no Barramento de Controle. O trabalho conjunto destes barramentos organizam o fluxo de controle que os computadores requerem para executarem seus programas.

• As estruturas sequenciais, condicional e de repetição podem ser agrupadas por bloco de comandos dentro ou fora das sub–rotinas e funções. As estruturas e as sub–rotinas e funções podem também ser agrupadas em arquivos de tipo texto para compor um programa–fonte.

• Teoricamente, qualquer linguagem pode ser compilada ou interpretada e, dependendo da necessidade, pode ser melhor criar um interpretador ou um compilador; há algumas linguagens que possuem ambas implementações.

• As linguagens de programação servem como intermediário entre a linguagem humana e a linguagem de máquina, e devem atender tanto humanos quanto computadores.

• A tabela acima (Tabela 1.2) se refere apenas às linguagens do paradigma imperativo, não inclui classes ou objetos do paradigma orientado a objeto, nem de outros paradigmas. Termos usados com frequência:

• Programa-fonte – texto de um programa que um usuário pode ler, comumente chamado de código. O programa-fonte é inserido no Compilador C.

• Programa objeto – tradução do programa-fonte em código de máquina, que o computador pode ler e executar diretamente. O programa-objeto é a entrada para o Linker.

• Linker – programa que liga módulos compilados separadamente em um programa. Ele também combina as funções da Biblioteca Padrão C com o código que você escreveu. A saída do Linker é um programa executável.

• Biblioteca Padrão C – funções padrão disponíveis para uso nos programas, incluem todas as operações de E/S, bem como outras rotinas úteis.

• Tempo de compilação – o tempo durante o qual seu programa está sendo compilado.

(33)

1.11Exercícios

1. Compare as linguagens natural, de programação e de máquina. 2. Descreva a estrutura geral dos computadores.

3. Qual a importância da CPU nos computadores atuais? 4. Dê exemplos de memórias primária e secundária. 5. Compare os tipos de memórias primária e secundária.

6. Dê um exemplo de fluxo de controle. Justifique sua resposta. 7. Compare programas fontes e executáveis.

8. O que é ASCII?

9. Relacione ASCII com memória.

10.Como o Sistema Operacional trabalha? 11.O que é arquivo?

12.O que é driver?

13.Como se programa computadores?

14. Compare algoritmo com programa de computador.

15.Como se resolve um problema por meio de computadores? 16.Compare fluxograma com pseudocódigo.

17.Faça um fluxograma para cada o cálculo dos dígitos verificadores de CPF. 18.Faça um fluxograma para cada para o MDC de dois números.

19.Como se usa a Regra do Dedo nos fluxogramas? 20.O que é programação estruturada?

21.Compare as estruturas sequencial, condicional e de repetição.

22.Comente as etapas do método de George Polya para a resolução de problemas. 23.Qual a importância da verificação?

24.Faça um fluxograma do método de George Polya.

25.Faça um algoritmo para calcular as raízes da equação do segundo grau. 26.Faça um algoritmo para caminha 200 m com passos de 0.8 m.

27.Relação entre Algoritmos, Programa de Computador e Linguagem de Programação Computador.

(34)
(35)

2

Compiladores da Linguagem C

O GNU Compiler Collection (chamado usualmente GCC) é um conjunto de compiladores de linguagens de programação, sendo uma das ferramentas essenciais para manter o software livre, pois permite compilar o código–fonte em binários executáveis para as várias plataformas de hardware e sistemas operacionais, como UNIX, Linux, Windows e Mac OS. Ele é distribuído pela Free Software Foundation (FSF) sob os termos da GNU GPL (https://gcc.gnu.org/).

O GCC é frequentemente eleito o compilador preferido para desenvolver software que necessita de ser executado em vários tipos de hardware. Ao usar os compiladores do projeto GCC, o mesmo analisador gramatical é usado em todas as plataformas, fazendo com que o se o código compila numa, muito provavelmente compilará em todas.

A "Linguagem C" e a "Biblioteca Padrão C" são duas entidades separadas mas que trabalham juntas. É necessário aprender a programar em C, por outro lado é preciso aprender a usar a Biblioteca Padrão C. Ambas são padrão ANSI5.

A Linguagem C é definida pelas regras gramaticais (léxico6, sintaxe7 e semântica8), declarações, tipos de dados, criação de variáveis, operações e operadores, delimitadores, caracteres especiais, comandos, estruturas condicional e de repetição, manipulação de apontadores, criação de funções e estrutura modular, dentre outros. É uma linguagem de programação compilada de propósito geral, estruturada, imperativa, procedural, padronizada pela Organização Internacional para Padronização (ISO). Foi criada em 1972 por Dennis Ritchie. É classificada como sendo de Terceira Geração9.

A Biblioteca Padrão da Linguagem C (também conhecida como glibc) é uma biblioteca de funções padronizada da Linguagem C, que fornece um conjunto básico de operações matemáticas, manipulação de cadeias de caracteres, conversão de tipos de dados, tempo e fuso horário, sistema de arquivos, tratamento de erros, dentre outras.

5 American National Standards Institute (https://www.ansi.org/) 6 Léxico é o conjunto de palavras existente à disposição da linguagem.

7 A sintaxe é a forma de dispor as palavras nos comandos e de dispor os comandos no programa, incluindo a sua relação lógica e também suas combinações para fins de resolução de problemas.

8 A semântica descreve as estruturas da linguagem e seu comportamento nos programas e no hardware. 9 Com recursos das Linguagens de Segunda Geração, que lhes dá grande poder sobre o hardware.

(36)

Ela consiste de 24 cabeçalhos, cada um contendo uma ou mais declarações de funções, tipos de dados e macros10. Ela é uma caixa de ferramentas prontas para uso.

Figura 2.1 As linguagem e bibliotecas da GNU Compiler Collection.

A Linguagem C e a Biblioteca Padrão C serão estudadas nos próximos capítulos.

O Compilador GNU C gera programas executaveis em três etapas, Figura 2.2. Partindo do programa–fonte escrito em C, que, didaticamente, será nomeado arquivo.c, seguem as etapas:

1. Preprocessamento – são incluídos os cabeçalhos da biblioteca padrão, ampliando o arquivo.c original

2. Compilação – o arquivo.c ampliando é traduzido para o seu equivalente em código de máquina, e é gerado o código objeto de nome arquivo.o

3. Linkedição – os binários da Biblioteca Padrão são incluídos no código objeto arquivo.o, produzindo o programa executável arquivo.exe (Windows) ou arquivo (Linux)

Figura 2.2 Processo de produção de programa executável a partir do programa–fonte, feito pelo GNU C.

Desrição do processo de produção de programa executável a partir do programa– fonte, feito pelo GNU C.

Editar É usado um editor para escrever o programa-fonte. Os programas-fonte Ctêm a extensão .c. Por exemplo, prog.c.

(37)

Compilar

Se o compilador não encontrar erro no programa, ele produz um arquivo objeto com extensão .obj (Windows) ou extensão .o (Linux) com o mesmo nome do arquivo do programa-fonte. Por exemplo, prog.c compila para prog.obj ou prog.o. Se o compilador encontrar erros, ele os informa e interrompe o processo.

Ligar

Se não ocorrer erro, o linker produz um programa executável e grava um arquivo com o mesmo nome do programa-fonte, com extensão .exe (Windows) ou sem extensão (Linux). Por exemplo, prog.c dará origem ao arquivo prog.exe ou prog. Se o compilador encontrar erros, ele os informa e interrompe o processo.

Executar O Sistema Operacional carrega o programa executável. Pode-se testá-lo edeterminar se ele funciona corretamente. Se não, fazer as modificações necessárias no programa-fonte e recomeçar com o processo.

O programa executável é um arquivo binário, um programa completo e autossuficiente, podendo ser executado quando carregado na memória RAM pelo Sistema Operacional.

Figura 2.3 Visão resumida do processo de produção de programa executável a partir do programa–fonte, feito pelo GNU C.

O SO é a ponte entre os programas executáveis e a máquina, Figura 2.4. Nesta figura, as setas indicam a comunicação entre as camadas do computador, quando elas prestam e recebem serviços umas das outras durante o tempo de execução do programa executável.

Figura 2.4 Esquema das camadas de um computador.

Ao carregar um programa executável na memória RAM, ele organiza sua memória de trabalho criando quatro regiões logicamente distintas. Embora o layout físico destas regiões de memória difere entre os tipos de CPU e implementação da linguagem C, Figura 2.5, a descrição a seguir mostra conceitualmente como programas C utilizam a memória.

Heap – esta região é dinâmica e de uso livre, é utilizada por mecanismos de alocação dinâmica de memória

(38)

Stack – é uma região dinâmica pois varia conforme a execução do programa. É utilizada para armazenar endereços e passar argumentos nas chamadas de funções, armazenar variáveis locais ou ser manipulada enquanto o programa é executado

Global – a região de dados corresponde à área onde as variáveis globais e estáticas são armazenadas;

Program Code – essa região armazena as instruções do programa.

Figura 2.5 Relação entre a pilha execução de programas C e o hardware.

Um depurador (em inglês: debugger) é um programa de computador usado para testar outros programas e fazer sua depuração, que consiste em encontrar os erros deste programa, caso exista.

O depurador GNU C permite interromper a execução do programa depurado em qualquer ponto e examinar o conteúdo de suas variáveis. Em geral, os depuradores também oferecem funcionalidades mais sofisticadas, como a execução passo a passo do programa; a suspensão do programa para examinar seu estado atual, em pontos predefinidos, chamados pontos de parada; o acompanhamento do valor de variáveis.

A Linguagem C é mantida pela Free Software Foundation (FSF) e distribuída pelo GNU Compiler Collection (GCC). Nos endereços abaixo, pode–se obter as últimas versões do Compilador C:

1. http://tdm–gcc.tdragon.net/download

2. http://www.equation.com/servlet/equation.cmd?fa=fortran

A linguagem C evolui continuamente. A FSF e o GNU estão atentas às necessidades tecnológicas dos nossos tempos.

Referências

Documentos relacionados

programador define distribui¸ c˜ ao de dados entre os places computa¸c˜ ao realizada por atividades (threads desacoplados de objetos). vari´ aveis usadas por mais que uma

Enquanto linguagens de programação como C, LISP, Java, etc., fornecem instruções para calcular e executar ações, as linguagens de marcação não executam

Compreender melhor noções de programação básica, de C++, de Cobol, de Java, de TML, de Ajax, de hardware, de Windows e de Linux faz parte para desenvolver qualquer tipo

De acordo com os resultados, os aspectos positivos mais recorrentes foram: (a) linguagem mais adequada para a proposta da disciplina; (b) atenção ao gerenciamento da

– Por padrão, as variáveis são sempre globais (Escopo léxico).. • Para indicar variáveis locais, usa-se

• A alteração entre os modos de operação pode ser feita por uma chave ou pelo próprio software de

• linguagens de montagem: precisam de um programa montador para gerar linguagem de máquina. • linguagens de alto nível: precisam de um compilador para traduzi-las para uma

n  Independentemente das necessidades de um projeto de desenvolvimento de software específico, um conjunto geral de características das linguagens de programação pode ser