programação básica em c

363
Versão 20/12/2021 Brauliro G Leal Programação Básica em C Quarta Edição Juazeiro – BA 2021

Upload: others

Post on 27-Jun-2022

2 views

Category:

Documents


0 download

TRANSCRIPT

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: Dezembro 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: [email protected] 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.
Software livre é a melhor ideia.
Programação Básica em C 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.
Fonte: https://publicdomainvectors.org/photos/World-in-Hand-Small.png
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 instrução.
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:
Programação Básica em C 5
• 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.
conceito – definição científica e/ou técnica que fundamenta o conhecimento e a aplicação de um termo
Programação Básica em C 6
É de extrema importância a construção do vocabulário científico e de termos técnicos e também de 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.
Programação Básica em C 7
A figura abaixo é uma visão geral da Linguagem C que será estudada neste texto.
Programação Básica em C 8
Sumário Parte A - Conceitos Gerais................................................................................................................. 12 1 Introdução...................................................................................................................................... 13
3.12 Estrutura de Sequência.........................................................................................................98 3.12.1 Exercícios.....................................................................................................................102
3.21.6 Pesquisa em Vetor........................................................................................................213 3.21.7 Ordenação de Vetores..................................................................................................215 3.21.8 Vetores Estático x Dinâmico.........................................................................................216 3.21.9 Vetor e Apontador.........................................................................................................217 3.21.10 Vetor de Apontadores.................................................................................................218 3.21.11 Vetor como Parâmetro de Função...............................................................................219 3.21.12 Função que Retorna Vetor..........................................................................................221 3.21.13 Exercícios – resolva usando funções e apontadores...................................................221
4.8 Obsolescência de Software....................................................................................................305 Parte F – Compilador GNU C............................................................................................................306 5 O Projeto GNU C............................................................................................................................ 307
Parte A - Conceitos Gerais
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 (IBM,2021).
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 – seu constituinte básico.
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 repetidas 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 da CPU, qué denominada linguagem de máquina.
Programação Básica em C 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 quatro 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 4. barramento – via de acesso que interconecta os outros componentes
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.
Programação Básica em C 15
Estes componentes, em geral, são cartões de circuitos integrados especializados inseridos na placa–mãe ou periféricos conectados ao gabinete do computador. Os componentes básicos do computador possuem funções complementares, trabalham de forma integrada para executares seus processos. 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) – controla o fluxo de trabalho, busca/envia instruções da/para memória 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 (SO), 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, feito pelo loader (cargador de programas) do SO, é 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 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.1.1 Sistema Operacional Os Sistemas 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. De forma simplificada, o SO é a interface entre o usuário e a máquina, de forma que o usuário interage diretamente com o software em uso e o SO assume as demais tarefas do sistema.
Sistema Operacional (SO) é um conjunto de softwares com a função de gerenciar os recursos da máquina e fornecer uma interface entre o computador e o usuário.
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. Os sistemas operacionais mais conhecidos são o Windows, o Linux, o Android e o MacOS.
Os principais recursos gerenciados pelo SO são:
• Processador: distribuiu a capacidade de processamento, o uso da CPU
Programação Básica em C 16
• 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 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
1.1.2 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.2.
Figura 1.2 A linguagem de máquina é a conexão entre o Software e o Hardware dos computadores2.
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.3 é 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.3 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.3, escrever programas usando o alfabeto dos bits também não. Para
2 Fonte: https://locomotiva26.com.br/wp–content/uploads/2015/09/integracao–hardware–software–563x353.jpg
Programação Básica em C 17
facilitar a leitura bits, eles são organizados em grupos de 8 bits, denominado byte, como pode ser visto na Figura 1.4.
Figura 1.4 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.
1.1.3 ASCII e Unicode
Enquanto a comunicação humana faz uso de alfabetos, com grande diversidade de letras, números, símbolos e formatos, o computador usa apenas bits (0 e 1). Isoladamente, o bits expressam apenas dois estados mas, agrupando-os, pode-se associar sequências de bits a cada um dos símbolos dos nossos alfabetos. Sendo necessário, para isso, criar um mapa padrão que associa palavras de computador aos itens dos alfabetos humanos.
Atualmente há dois padrões mundiais – ASCII e Unicode – que são sistemas padrão que associam valores numéricos a caracteres e símbolos, se diferenciando quanto ao número de caracteres definidos. O padrão ASCII estabelece 256 caracteres mapeados, mais restrito, mais antigo e mais econômico. O Unicode integra os caracteres presentes em todas as linguagens conhecidas do mundo, inclui o ASCII, chegando a reconhecer mais de 65 mil símbolos, mais abrangente, mais novo e diverso. Ambos são usados no nosso universo tecnológico – ASCII mais voltado para o hardware e Unicode é generalista. Estes padrões foram criados e incorporados aos padrões mundiais de controle de qualidade de produtos e processos.
O ASCII – American Standard Code for Information Interchange – Código Padrão Americano para o Intercâmbio de Informação, em tradução livre – proposto como uma solução para unificar a representação de caracteres alfanuméricos (letras, números, acentos, sinais diversos e códigos de controle) em computadores.
O Unicode é um padrão adotado mundialmente para representar, em computadores, todos os caracteres de todas as linguagens escritas utilizadas no planeta; ele fornece um número único para cada caractere, não importa a plataforma, não importa o programa e não importa a linguagem. Sendo mantido e gerido pelo Unicode Consortium - www.unicode.org/standard/WhatIsUnicode.html.
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), 33 sinais de controle,
Programação Básica em C 18
além de outros 128 sinais que compõem a parte estendida deste código, Tabela 8.1 e Tabela 8.2 do Anexo.
A codificação ASCII é usada para representar textos em computadores, equipamentos de comunicação, entre outros dispositivos das redes. 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){return 0;}
Exercício 1.2 Escrever as expressões correspondentes aos códigos binários: 1. 0100000101010011010000110100100101010011 2. 01110111001111010011001000101010001010000100000100101111001010110100001000101111
0010100100111011
Exemplo 1.3 Para representar nosso conhecimento usamos símbolos, leia este texto.
50M05 53R35 QU3 49R3ND3 3 R39R353N74M05 N05505 C0NH3C1M3N705 90R M310 D3
Programação Básica em C 19
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 Digital
A unidade de medida da computação digital é 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 (binary digit) – unidade fundamental de informação, vale 0 ou 1 • byte - 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 words • nibble - 4 bits
1.2 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 e, depois, 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.5.
Figura 1.5 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.5.
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.
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ódigos fontes que podem ser convertidos 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ção Básica em C 20
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 não podem ser transformados em Programa de Computador mas o Exemplo 1.6 pode.
Exemplo 1.4 Manual para a montagem de uma Cadeira Eames Plus.
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
Programação Básica em C 21
Ouso afirmar que, de posse dos ingredientes, qualquer ser humano é capaz de montar a citada cadeira a partir do algoritmo.
Segue outro exemplo de algoritmo.
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
Programação Básica em C 22
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. 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.8.
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. O Exemplo 1.9 é um Fluxograma de um dia de uma pessoa fictícia. Neste fluxograma,
pode-se ver as estruturas de sequência, decisão e de iteração. Reproduza o fluxo de controle deste exemplo usando a Regra do Dedo.
Exemplo 1.9 Fluxograma de um dia de uma pessoa fictícia
Programação Básica em C 23
O Exemplo 1.10 é algoritmo para validar CPF em Pseudocódigo, no caso em Portugol. Neste pseudocódigo, pode-se ver as estruturas de sequencia, de decisão e de iteraçã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 DE CPF! * * * * *") 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 para x de 1 ate 10 faca soma2[x] := n_cpf[x]*(12-x) s2 := s2 + soma2[x] fimpara
Programação Básica em C 24
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.2.1 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.6.
Figura 1.6 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 resolvê-los. 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 programadores é importante está outra expressão “entra lixo sai aviso que entrou lixo”.
1.2.2 Conceito de Fluxo de Controle O fluxo de controle percorre o programa do início ao fim, executando suas instruções
conforme definido pelo programador. O início é único mas pode haver várias instruções encerrando esses programas.
Regra do Dedo – pode-se percorrer os programas de computador com um dedo e identificar seu fluxo de controle
Programação Básica em C 25
1.2.3 Desenvolvimento de Programas 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 destas 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
A construção de algoritmos complexos requer o uso de estratégias simplificadoras como “Planejamento Reverso” e “Dividir para Conquistar”, descritas abaixo.
Planejamento Reverso
O planejamento enquanto ação intencional com foco em atividades, é uma etapa fundamental na programação. Neste sentido, o Planejamento Reverso consiste em projetar soluções a partir dos resultados. Ou seja, a partir da saída (S) desejada, deve-se determinar, de modo reverso, quais são o processamento (P) e a entrada de dados (E) necessários.
Programação Básica em C 26
Estratégia Dividir para Conquistar
A estratégia Dividir para Conquistar busca resolver um problema grande, de difícil solução, dividindo-o em problemas menores, de solução mais fácil. Se necessário, pode-se dividir novamente as partes não compreendidas. Esse método pode ser esquematizado nos seguintes passos:
1. Dividir o problema em partes 2. Analisar a divisão e garantir a coerência entre as partes 3. Reaplicar o método, se necessário
Em termos de ideias, por um lado, o Planejamento Reverso permite criar uma visão geral de onde chegar e qual é o caminho até lá. Por outro lado, Dividir para Conquistar permite detalhar cada passo a ser dado ao longo do caminho.
1.2.4 Elaboração do Pensamento Computacional O método de George Polya 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 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 instruções 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 precisam se comunicar, o que leva a necessidade de linguagens de programação de 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, o que levou a criação de linguagens de alto nível para tornar mais fácil a tarefa de programação de computadores.
Programação Básica em C 27
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.
1.2.5 Programação Estruturada As linguagens de programação também podem ser classificadas de acordo com suas
funcionalidades, que definem como são feitos seus programas, o seu paradigma. A programação estruturada é o paradigma de programação de computadores que
descreve a computação como ações, enunciados ou instruções que mudam o estado das variáveis dos programas.
A programação estruturada permite elaborar códigos por meio de apenas três estruturas de: sequência, decisão e iteração, Figura 1.7.
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.7 Fluxogramas das estruturas de sequência, de decisão e de iteraçã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.
Há outros paradigmas para a produção de software, como o paradigma de programação orientado a objetos, o paradigma de programação funcional e o paradigma de programação funcional, dentre outros.
1.3 Linguagens de Programação
Programação Básica em C 28
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 estruturadas, em geral, seus elementos constituintes podem reduzidos a:
1. palavras reservadas 2. símbolos 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,
Programação Básica em C 29
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 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 partes3 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 das 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 de Sequência Na computação, uma estrutura de sequência é um fluxo de controle presente em linguagens de programação, que realiza um conjunto predeterminado de instruções de
3 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.
Programação Básica em C 30
forma sequencial, de cima para baixo, uma a uma, na ordem em que foram postas. O fluxo de controle das estruturas de sequência não apresenta desvios, todos as instruções são executadas, de acordo com sua sequência. Em geral, as instruções destas estruturas são separadas por algum tipo de delimitador, que varia entre as linguagens.
Estrutura de Decisão As estruturas de decisão ou de decisão permitem saltos ou desvios, fazendo com que o programa proceda de uma ou outra maneira, de acordo com os resultados de suas decisões lógicas. Uma estrutura de decisão realiza um único desvio, faz uma única escolha. Toda estrutura de decisão possui uma expressão (denominada condição) que, quando avaliada, permite decisão de fazer ou não fazer o desvio programado. As principais instruções para estruturas de decisão são: se/então/senão e switch/case. O formato das instruções das estruturas de decisão variam entre as linguagens de programação.
Estrutura de Iteração As estruturas de iteração permitem que um grupo de instruções seja executado um número definido ou indefinido de vezes, de acordo com os resultados de suas decisões lógicas. Uma estrutura de iteração pode executar várias vezes seu bloco de instruções. Toda estrutura de iteração possui uma expressão (denominada condição) que, quando avaliada, permite a decisão de executar ou não executar o bloco de instruções programado. As principais instruções para estruturas de iteração são: para e enquanto/faça e faça/enquanto. A instrução para é usado para executar um número definido de repetições. Ela possui um contador automático para este fim. A instrução enquanto/faça avalia sua condição e pode ou não executar seu bloco de instruções, ou seja, ela pode executar seu bloco de instruções uma única vez, nenhuma vez ou várias vezes. A instrução faça/enquanto avalia sua condição e executa seu bloco de instruções ao menos uma vez, ou seja, ela pode executar seu bloco de instruções uma única vez ou várias vezes. O formato das instruções das estruturas de iteração varia entre as linguagens de programação.
Rotinas, Sub–Rotinas e Funções As sub–rotinas são blocos de instruções 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.
Programação Básica em C 31
Interpretadores 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 de sequência, de decisão e de iteraçã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 de sequência, de decisão e de iteração podem ser agrupadas por bloco de instruções 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. • Tempo de execução – o tempo durante o qual seu programa está sendo executado. • Programas de computador – são sequências de instruções passíveis de serem
executadas por um processador, são arquivos binários gravados na memória secundária.
• Processo – é nome dado aos programas de computador quando eles estão sendo executados, são entidades ativas do Sistema Operacional cujo estado é alterado durante a sua execução.
1.4 Exercícios
Programação Básica em C 32
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 o cálculo dos dígitos verificadores de CPF. 18.Faça um fluxograma para o cálculo do MDC de dois números. 19.Como se usa a Regra do Dedo nos fluxogramas? 20.O que é programação estruturada? 21.Identifique as estruturas de sequência, de decisão e de iteração do Exemplo 1.9. 22.Compare as estruturas de sequência, de decisão e de iteração. 23.Comente as etapas do método de George Polya para a resolução de problemas. 24.Qual a importância da verificação? 25.Faça um fluxograma do método de George Polya. 26.Dê três exemplos envolvendo o uso da estratégia “Planejamento Reverso”. 27.Dê três exemplos envolvendo o uso da estratégia “Dividir para Conquistar”. 28.Dê três exemplos envolvendo o uso conjunto das estratégias “Planejamento Reverso” e
“Dividir para Conquistar”. 29.Faça um algoritmo para calcular as raízes da equação do segundo grau. 30.Faça um algoritmo para caminhar 200 m com passos de 0.7 m. 31.Faça um algoritmo para caminhar 500 m com passos de 0.8 m, com parada a cada 100 m. 32.Faça um algoritmo para caminhar 500 m com passos de 0.9 m, com descanso a cada 100 m. 33.Estabeleça as relações entre Algoritmos, Programa de Computador e Linguagem de
Programação Computador.
Parte B – Linguagem de Programação C
Programação Básica em C 34
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 ANSI4.
A Linguagem C é definida pelas regras gramaticais (léxico5, sintaxe6 e semântica7), declarações, tipos de dados, criação de variáveis, operações e operadores, delimitadores, caracteres especiais, instruções, estruturas de decisão e de iteraçã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ção8.
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. Ela consiste de 24 cabeçalhos, cada um contendo uma ou mais declarações de funções, tipos de dados e macros9. Ela é uma caixa de ferramentas prontas para uso.
4 American National Standards Institute (https://www.ansi.org/) 5 Léxico é o conjunto de palavras existente à disposição da linguagem. 6 A sintaxe é a forma de dispor as palavras nas instruções e de dispor as instruções no programa, incluindo a sua relação lógica e também suas combinações para fins de resolução de problemas. 7 A semântica descreve as estruturas da linguagem e seu comportamento nos programas e no hardware. 8 Com recursos das Linguagens de Segunda Geração, que lhes dá grande poder sobre o hardware. 9 Uma das instruções da Linguagem C
Programação Básica em C 35
Figura 2.1 As linguagens e as bibliotecas da GNU Compiler Collection.
A Linguagem C e a Biblioteca Padrão C serão estudadas nos próximos capítulos.
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.
O Compilador GNU C gera programas executáveis em três etapas, Figura 2.2. Partindo do programa–fonte escrito em C, que, didaticamente, será nomeado programa.c, seguem as etapas:
1. Preprocessamento – são incluídos os cabeçalhos da biblioteca padrão, ampliando o programa.c original
2. Compilação – o programa.c ampliando é traduzido para o seu equivalente em código de máquina, e é gerado o código objeto de nome programa.o
3. Linkedição – os binários da Biblioteca Padrão são incluídos no código objeto programa.o, produzindo o programa executável programa.exe (Windows) ou programa (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 C têm a extensão .c. Por exemplo, programa.c.
Compilar Se o compilador não encontrar erro no programa, ele produz um arquivo objeto
Programação Básica em C 36
com extensão .obj (Windows) ou extensão .o (Linux) com o mesmo nome do arquivo do programa-fonte. Por exemplo, programa.c compila para programa.obj ou programa.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, programa.c dará origem ao arquivo programa.exe ou programa. Se o compilador encontrar erros, ele os informa e interrompe o processo.
Executar O Sistema Operacional carrega (loader) o programa executável. Pode-se testá- lo e determinar 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, o SO organiza sua memória de trabalho criando quatro regiões logicamente distintas, 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
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.
Programação Básica em C 37
Figura 2.5 Relação entre a pilha execução de programas C e o hardware.
Um depurador (debugger em inglês) é um programa de computador usado para testar outros programas e fazer sua depuração, que consiste em encontrar os erros neste 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.
2.1 Questões Discuta a figura abaixo:
Programação Básica em C 38
3 Linguagem de Programação C
A Linguagem C é fornece conhecimentos e habilidades sobre os fundamentos das linguagens de programação. A aprendizagem inicial da Linguagem C é feita a partir da solução computacional de pequenos problemas porém, esta linguagem, é capaz de tratar e dar soluções para tarefas computacionais complexas. Não há limites para a Linguagem C e a computação tem nela o seu grande apoio, é a sua principal ferramenta.
A Linguagem C é complementada por uma biblioteca, denominada Biblioteca Padrão da Linguagem C, que possui variadas funções para possibilitar o trabalho em projetos computacionais de grande porte. Além disso, pode-se construir bibliotecas de funções especializadas para as mais diversas áreas do conhecimento e suas aplicações.
A Linguagem C tem influenciado e inspirado o desenvolvimento de outras linguagens de grande importância como, por exemplo, C++, Java e Javascript. E outras tantas voltadas para o hardware e os variados propósitos gerais e específicos.
Criada na década de 1970, esta linguagem pouco mudou nas últimas décadas, mais de meio século de sucesso; devido em, grande parte, a ser uma linguagem pequena, simples, estar em todo lugar, fácil de aprender e que resolve problemas pequenos, grandes e muito grandes.
Em linhas gerais, a Linguagem C é uma linguagem de programação compilada de propósito geral, estruturada, imperativa, procedural10, padronizada pela Organização Internacional para Padronização (ISO), criada em 1972 por Dennis Ritchie para o desenvolvimento do sistema operacional Unix.
Em 1989, o instituto norte-americano de padrões (ANSI) estabeleceu a especificação do padrão da Linguagem C, ratificado como ANSI C. Em 1990, o padrão ANSI C foi adotado pela Organização Internacional para Padronização (ISO). Na década de 1990, este padrão evoluiu para o C99, adotado como padrão ANSI no ano 2000.
A Linguagem C Padrão continua a evoluir11, atualmente é mantida pelo pelo GNU Compiler Collection (GCC) e distribuída pela Free Software Foundation (FSF), disponíveis em gcc.gnu.org e www.fsf.org.
10 Linguagem cujo código fonte é composto de comandos (imperativa), organizados em estruturas de sequência, condiciona e de iteração (estruturada) que são agrupadas em módulos independentes mas interconectados (procedural), formando os programas que, para serem usados, são em código de máquina (compilada). 11 Acompanhe esta evolução pelo site https://en.wikipedia.org/wiki/C_(programming_language).
Programação Básica em C 39
A FSF (Fundação para o Software Livre) é uma organização sem fins lucrativos, que se dedica a eliminação de restrições sobre a cópia, estudo e modificação de programas de computadores. Faz isso promovendo o desenvolvimento e o uso de software livre em todas as áreas da computação mas, particularmente, patrocinando o Projeto GNU que incluem o GNU GCC e o GNU Linux.
Tabela 3.1 Principais elementos da Linguagem C Conjunto de Caracteres
A Linguagem C faz uso apenas dos caracteres ASCII nos programas-fonte, o conjunto de caracteres usados incluem as letras minúsculas (a–z), maiúsculas (A–Z), dígitos decimais (0–9), caracteres gráficos (! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~) e caracteres de formatação(espaço, tabulação horizontal, tabulação vertical, início de linha e nova linha (enter).
Palavras Reservadas
auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, switch, typedef, union, unsigned, void, volatile e while. E também _Bool, _Imaginary, _Complex, inline e restrict.
Comentário
/* */ comentário com várias linhas, iniciando em /* e encerrando em */ // comentário de uma linha, iniciando em // e encerrando no final da linha são eliminados do código fonte pelo pré-processamento
Identificadores
São os nomes criados pelos programadores, eles pode ter de um a 32 caracteres ASCII (letras, números e _). São utilizados para dar nomes a constantes, variáveis, funções e vários itens definidos ou criados pelo programador.
Tipos de Dados
Os tipos de dados são void, bool, char, int, float e double, podem ser modificados por signed, unsigned, short e long. Os tipos de dados podem ser associados aos conjuntos numéricos e também às suas operações matemáticas. As operações com estes tipos podem sofrer truncamento, overflow e underflow. As operações com apontadores pode sofrer extravasamento de memória. Os tipos têm funções para serem lidos e escritos nos dispositivos (funções de E/S) em geral.
void Não ocupa espaço na memória, tem tamanho igual a zero. Não possui operações.
bool Ocupa 1 B na memória, sem bit de sinal, mantissa com 8 bits, pode ser false ou true. Usados em operações lógicas, expressões e controle de fluxo.
char O mesmo que signed char. Ocupa 1 B na memória, 1 bit de sinal, mantissa com 7 bits, varia de -128 a +127, podem ser operados com número inteiro (+ - ++ --) ou como carácter (++ –-)
unsigned char
Ocupa 1 B na memória, sem bit de sinal, mantissa com 8 bits, varia de 0 a +255, podem ser operados com número inteiro (+ - * / ++ --) ou como
Programação Básica em C 40
carácter (+ - ++ –-), os resultados são positivos ou nulos char* Apontador para variável char. Tamanho de unsigned int, é operado como
número inteiro (+ - ++ --). Há também o apontador para unsigned char*, com o mesmo tamanho, operações, limitações e funções de E/S, exceto que aponta para variáveis unsigned char
int O mesmo que signed int. Ocupa 4 B na memória, 1 bit de sinal, mantissa com 31 bits, varia de -231 a +231-1, com operações (+ - * % / ++ –-), a divisão é inteira – não tem fração
unsigned int
Ocupa 4 B na memória, sem bit de sinal, mantissa com 32 bits, varia de 0 a +232-1, com operações (+ - * % / ++ –-), a divisão é inteira – não tem fração, com resultados positivos ou nulos
short int Ocupa 2 B na memória, 1 bit de sinal, mantissa com 15 bits, varia de -215 a +215-1, com operações (+ - * % / ++ –-), a divisão é inteira – não tem fração
unsigned short int
Ocupa 2 B na memória, sem sinal, mantissa com 16 bits, varia de 0 a +216- 1, com operações (+ - * % / ++ –-), a divisão é inteira – não tem fração, os resultados são positivos ou nulos
long O mesmo que long int e também signed long int. Ocupa 8 B na memória, 1 bit de sinal, mantissa com 63 bits, varia de -263 a +263-1, com operações (+ - * % / ++ –-), a divisão é inteira – não tem fração.
unsigned long
O mesmo que unsigned long int. Ocupa 8 B na memória, sem bit de sinal, mantissa com 64 bits, varia de 0 a +264-1, com operações (+ - * % / ++ –), a divisão é inteira – não tem fração, os resultados são positivos ou nulos
float Ocupa 4 B na memória, com bit de sinal, mantissa e expoente, varia de ±1,7×10-38 a ±1,7×1038, com operações (+ - * / ++ –-), a divisão é real – tem parte fracionária. Pode fazer uso da biblioteca matemática (math.h)
double Ocupa 8 B na memória, com bit de sinal, mantissa e expoente, varia de ±3,4×10-308 a ±3,4×10308, com operações (+ - * / ++ –-), a divisão é real – tem parte fracionária. Pode fazer uso da biblioteca matemática (math.h).
long double
Ocupa 16 B na memória, com bit de sinal, mantissa e expoente, varia de ±3,4×10-4932 a ±3,4×104932, com operações (+ - * / ++ –-), a divisão é real – tem parte fracionária. Pode fazer uso da biblioteca matemática (math.h)
tipo [] Vetor do tipo com tamanho definido pelo programador. Não tem operação de E/S
char [] Vetor de char, é um tipo especial da Linguagem C, denominado string. Tem operação de E/S. São usados para armazenar ASCII
tipo * Apontador para variável do tipo. Tamanho de unsigned int, é operado como número inteiro (+ - ++ –-) com resultados sempre positivos e não nulos
Os tipos de dados float, double e long double possuem estrutura complexa, possuem sinal, variam por frações da unidade, são partes do conjunto dos números reais. Possuem grande faixa de variação. A Linguagem C possui o tipo de dado apontador que é capaz de representar endereços de memória e operar sobre eles. Os tipos de dados orientam como o programa os armazena na memória do computador e também como eles são processados pela CPU, ou seja, determinam
Programação Básica em C 41
suas operações. Há também