Transcript of Programação Básica em C
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: 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.
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