SlideShare uma empresa Scribd logo
1 de 117
Baixar para ler offline
Linguagem C
Versão 1.0.0
Sumário
I Sobre essa Apostila 2
II Informações Básicas 4
III GNU Free Documentation License 9
IV A linguagem C 18
1 O que é a linguagem C? 19
2 Plano de ensino 20
2.1 Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2 Público Alvo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3 Pré-requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.4 Descrição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.5 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.6 Cronograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.7 Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.8 Avaliação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.9 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3 Introdução à linguagem C 23
3.1 Introdução teórica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.1 O que é a linguagem de programação C? . . . . . . . . . . . . . . . . . . . . 23
3.1.2 Quem realmente controla os programas? . . . . . . . . . . . . . . . . . . . . 24
3.1.3 Histórico da linguagem C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.1.4 Características . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.1.5 O compilador GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.1.6 Tipos de Erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2 Elementos léxicos e sintáticos da linguagem C, parte 1 . . . . . . . . . . . . . . . . 32
3.2.1 Palavras Reservadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2.2 Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2.3 Operadores Aritméticos e de Atribuição . . . . . . . . . . . . . . . . . . . . . 35
3.2.4 Tipos de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.2.5 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.3 Elementos léxicos e sintáticos da linguagem C, parte 2 . . . . . . . . . . . . . . . . 41
1
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
3.3.1 Introdução às funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.3.2 Bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.3.3 Operadores Lógicos e de Comparação . . . . . . . . . . . . . . . . . . . . . 52
3.3.4 Controle de Fluxo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
3.4 Elementos léxicos e sintáticos da linguagem C, parte 3 . . . . . . . . . . . . . . . . 60
3.4.1 Vetores e Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.4.2 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.4.3 Introdução ao uso de ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.4.4 Casts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4 Código estruturado em C e ponteiros 69
4.1 Manipulação de arquivos e entradas/saídas em C . . . . . . . . . . . . . . . . . . . 69
4.1.1 Entrada e saída com o teclado e o monitor . . . . . . . . . . . . . . . . . . . 69
4.1.2 Introdução à manipulação de arquivos . . . . . . . . . . . . . . . . . . . . . . 72
4.2 Recursividade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.2.1 Recursividade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.3 Manipulação de ponteiros e tipos avançados de dados . . . . . . . . . . . . . . . . . 79
4.3.1 Structs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.3.2 Alocação dinâmica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5 Abstração de dados 88
5.1 Estruturas de dados, parte 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
5.1.1 Pilhas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
5.1.2 Filas encadeadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
5.1.3 Filas duplamente encadeadas . . . . . . . . . . . . . . . . . . . . . . . . . . 94
5.1.4 Filas circulares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5.2 Estruturas de dados, parte 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.2.1 Árvores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.2.2 Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
6 Estruturação e manipulação avançada do código e dos arquivos 109
6.1 Dividindo seu programa em diversos arquivos fontes . . . . . . . . . . . . . . . . . . 109
6.1.1 Contole de inclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
6.1.2 Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
6.2 Manipulação avançada de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
6.2.1 Estrutura de dados e persistência . . . . . . . . . . . . . . . . . . . . . . . . 113
2
Parte I
Sobre essa Apostila
3
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
Conteúdo
O conteúdo dessa apostila é fruto da compilação de diversos materiais livres publicados na in-
ternet, disponíveis em diversos sites ou originalmente produzido no CDTC (http://www.cdtc.org.br.)
O formato original deste material bem como sua atualização está disponível dentro da licença
GNU Free Documentation License, cujo teor integral encontra-se aqui reproduzido na seção de
mesmo nome, tendo inclusive uma versão traduzida (não oficial).
A revisão e alteração vem sendo realizada pelo CDTC (suporte@cdtc.org.br) desde outubro
de 2006. Críticas e sugestões construtivas serão bem-vindas a qualquer hora.
Autores
A autoria deste é de responsabilidade de Fernando Machado Mendonça (fmachado@cdtc.org.br).
O texto original faz parte do projeto Centro de Difusão de Tecnologia e Conhecimento que
vêm sendo realizado pelo ITI (Instituto Nacional de Tecnologia da Informação) em conjunto com
outros parceiros institucionais, e com as universidades federais brasileiras que tem produzido e
utilizado Software Livre apoiando inclusive a comunidade Free Software junto a outras entidades
no país.
Informações adicionais podem ser obtidas através do email ouvidoria@cdtc.org.br, ou da
home page da entidade, através da URL http://www.cdtc.org.br.
Garantias
O material contido nesta apostila é isento de garantias e o seu uso é de inteira responsabi-
lidade do usuário/leitor. Os autores, bem como o ITI e seus parceiros, não se responsabilizam
direta ou indiretamente por qualquer prejuízo oriundo da utilização do material aqui contido.
Licença
Copyright ©2006, Instituto Nacional de Tecnologia da Informação (cdtc@iti.gov.br) .
Permission is granted to copy, distribute and/or modify this document under the terms
of the GNU Free Documentation License, Version 1.1 or any later version published by
the Free Software Foundation; with the Invariant Chapter being SOBRE ESSA APOS-
TILA. A copy of the license is included in the section entitled GNU Free Documentation
License.
4
Parte II
Informações Básicas
5
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
Sobre o CDTC
Objetivo Geral
O Projeto CDTC visa a promoção e o desenvolvimento de ações que incentivem a dissemina-
ção de soluções que utilizem padrões abertos e não proprietários de tecnologia, em proveito do
desenvolvimento social, cultural, político, tecnológico e econômico da sociedade brasileira.
Objetivo Específico
Auxiliar o Governo Federal na implantação do plano nacional de software não-proprietário e
de código fonte aberto, identificando e mobilizando grupos de formadores de opinião dentre os
servidores públicos e agentes políticos da União Federal, estimulando e incentivando o mercado
nacional a adotar novos modelos de negócio da tecnologia da informação e de novos negócios
de comunicação com base em software não-proprietário e de código fonte aberto, oferecendo
treinamento específico para técnicos, profissionais de suporte e funcionários públicos usuários,
criando grupos de funcionários públicos que irão treinar outros funcionários públicos e atuar como
incentivadores e defensores dos produtos de software não proprietários e código fonte aberto, ofe-
recendo conteúdo técnico on-line para serviços de suporte, ferramentas para desenvolvimento de
produtos de software não proprietários e do seu código fonte livre, articulando redes de terceiros
(dentro e fora do governo) fornecedoras de educação, pesquisa, desenvolvimento e teste de pro-
dutos de software livre.
Guia do aluno
Neste guia, você terá reunidas uma série de informações importantes para que você comece
seu curso. São elas:
• Licenças para cópia de material disponível;
• Os 10 mandamentos do aluno de Educação a Distância;
• Como participar dos foruns e da wikipédia;
• Primeiros passos.
É muito importante que você entre em contato com TODAS estas informações, seguindo o
roteiro acima.
Licença
Copyright ©2006, Instituto Nacional de Tecnologia da Informação (cdtc@iti.gov.br).
6
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
É dada permissão para copiar, distribuir e/ou modificar este documento sob os termos
da Licença de Documentação Livre GNU, Versão 1.1 ou qualquer versão posterior
públicada pela Free Software Foundation; com o Capitulo Invariante SOBRE ESSA
APOSTILA. Uma cópia da licença está inclusa na seção entitulada "Licença de Docu-
mentação Livre GNU".
Os 10 mandamentos do aluno de educação online
• 1. Acesso à Internet: ter endereço eletrônico, um provedor e um equipamento adequado é
pré-requisito para a participação nos cursos a distância;
• 2. Habilidade e disposição para operar programas: ter conhecimentos básicos de Informá-
tica é necessário para poder executar as tarefas;
• 3. Vontade para aprender colaborativamente: interagir, ser participativo no ensino a distân-
cia conta muitos pontos, pois irá colaborar para o processo ensino-aprendizagem pessoal,
dos colegas e dos professores;
• 4. Comportamentos compatíveis com a etiqueta: mostrar-se interessado em conhecer seus
colegas de turma respeitando-os e se fazendo ser respeitado pelos mesmos;
• 5. Organização pessoal: planejar e organizar tudo é fundamental para facilitar a sua revisão
e a sua recuperação de materiais;
• 6. Vontade para realizar as atividades no tempo correto: anotar todas as suas obrigações e
realizá-las em tempo real;
• 7. Curiosidade e abertura para inovações: aceitar novas idéias e inovar sempre;
• 8. Flexibilidade e adaptação: requisitos necessário à mudança tecnológica, aprendizagens
e descobertas;
• 9. Objetividade em sua comunicação: comunicar-se de forma clara, breve e transparente é
ponto - chave na comunicação pela Internet;
• 10. Responsabilidade: ser responsável por seu próprio aprendizado. O ambiente virtual não
controla a sua dedicação, mas reflete os resultados do seu esforço e da sua colaboração.
Como participar dos fóruns e Wikipédia
Você tem um problema e precisa de ajuda?
Podemos te ajudar de 2 formas:
A primeira é o uso dos fóruns de notícias e de dúvidas gerais que se distinguem pelo uso:
. O fórum de notícias tem por objetivo disponibilizar um meio de acesso rápido a informações
que sejam pertinentes ao curso (avisos, notícias). As mensagens postadas nele são enviadas a
7
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
todos participantes. Assim, se o monitor ou algum outro participante tiver uma informação que
interesse ao grupo, favor postá-la aqui.
Porém, se o que você deseja é resolver alguma dúvida ou discutir algum tópico específico do
curso. É recomendado que você faça uso do Fórum de dúvidas gerais que lhe dá recursos mais
efetivos para esta prática.
. O fórum de dúvidas gerais tem por objetivo disponibilizar um meio fácil, rápido e interativo
para solucionar suas dúvidas e trocar experiências. As mensagens postadas nele são enviadas
a todos participantes do curso. Assim, fica muito mais fácil obter respostas, já que todos podem
ajudar.
Se você receber uma mensagem com algum tópico que saiba responder, não se preocupe com a
formalização ou a gramática. Responda! E não se esqueça de que antes de abrir um novo tópico
é recomendável ver se a sua pergunta já foi feita por outro participante.
A segunda forma se dá pelas Wikis:
. Uma wiki é uma página web que pode ser editada colaborativamente, ou seja, qualquer par-
ticipante pode inserir, editar, apagar textos. As versões antigas vão sendo arquivadas e podem
ser recuperadas a qualquer momento que um dos participantes o desejar. Assim, ela oferece um
ótimo suporte a processos de aprendizagem colaborativa. A maior wiki na web é o site "Wikipé-
dia", uma experiência grandiosa de construção de uma enciclopédia de forma colaborativa, por
pessoas de todas as partes do mundo. Acesse-a em português pelos links:
• Página principal da Wiki - http://pt.wikipedia.org/wiki/
Agradecemos antecipadamente a sua colaboração com a aprendizagem do grupo!
Primeiros Passos
Para uma melhor aprendizagem é recomendável que você siga os seguintes passos:
• Ler o Plano de Ensino e entender a que seu curso se dispõe a ensinar;
• Ler a Ambientação do Moodle para aprender a navegar neste ambiente e se utilizar das
ferramentas básicas do mesmo;
• Entrar nas lições seguindo a seqüência descrita no Plano de Ensino;
• Qualquer dúvida, reporte ao Fórum de Dúvidas Gerais.
Perfil do Tutor
Segue-se uma descrição do tutor ideal, baseada no feedback de alunos e de tutores.
O tutor ideal é um modelo de excelência: é consistente, justo e profissional nos respectivos
valores e atitudes, incentiva mas é honesto, imparcial, amável, positivo, respeitador, aceita as
idéias dos estudantes, é paciente, pessoal, tolerante, apreciativo, compreensivo e pronto a ajudar.
8
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
A classificação por um tutor desta natureza proporciona o melhor feedback possível, é crucial, e,
para a maior parte dos alunos, constitui o ponto central do processo de aprendizagem.’ Este tutor
ou instrutor:
• fornece explicações claras acerca do que ele espera e do estilo de classificação que irá
utilizar;
• gosta que lhe façam perguntas adicionais;
• identifica as nossas falhas, mas corrige-as amavelmente’, diz um estudante, ’e explica por-
que motivo a classificação foi ou não foi atribuída’;
• tece comentários completos e construtivos, mas de forma agradável (em contraste com um
reparo de um estudante: ’os comentários deixam-nos com uma sensação de crítica, de
ameaça e de nervossismo’)
• dá uma ajuda complementar para encorajar um estudante em dificuldade;
• esclarece pontos que não foram entendidos, ou corretamente aprendidos anteriormente;
• ajuda o estudante a alcançar os seus objetivos;
• é flexível quando necessário;
• mostra um interesse genuíno em motivar os alunos (mesmo os principiantes e, por isso,
talvez numa fase menos interessante para o tutor);
• escreve todas as correções de forma legível e com um nível de pormenorização adequado;
• acima de tudo, devolve os trabalhos rapidamente;
9
Parte III
GNU Free Documentation License
10
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
(Traduzido pelo João S. O. Bueno através do CIPSGA em 2001)
Esta é uma tradução não oficial da Licença de Documentação Livre GNU em Português Brasi-
leiro. Ela não é publicada pela Free Software Foundation, e não se aplica legalmente a distribuição
de textos que usem a GFDL - apenas o texto original em Inglês da GNU FDL faz isso. Entretanto,
nós esperamos que esta tradução ajude falantes de português a entenderem melhor a GFDL.
This is an unofficial translation of the GNU General Documentation License into Brazilian Por-
tuguese. It was not published by the Free Software Foundation, and does not legally state the
distribution terms for software that uses the GFDL–only the original English text of the GFDL does
that. However, we hope that this translation will help Portuguese speakers understand the GFDL
better.
Licença de Documentação Livre GNU Versão 1.1, Março de 2000
Copyright (C) 2000 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
É permitido a qualquer um copiar e distribuir cópias exatas deste documento de licença, mas
não é permitido alterá-lo.
INTRODUÇÃO
O propósito desta Licença é deixar um manual, livro-texto ou outro documento escrito "livre"no
sentido de liberdade: assegurar a qualquer um a efetiva liberdade de copiá-lo ou redistribui-lo,
com ou sem modificações, comercialmente ou não. Secundariamente, esta Licença mantém
para o autor e editor uma forma de ter crédito por seu trabalho, sem ser considerado responsável
pelas modificações feitas por terceiros.
Esta Licença é um tipo de "copyleft"("direitos revertidos"), o que significa que derivações do
documento precisam ser livres no mesmo sentido. Ela complementa a GNU Licença Pública Ge-
ral (GNU GPL), que é um copyleft para software livre.
Nós fizemos esta Licença para que seja usada em manuais de software livre, por que software
livre precisa de documentação livre: um programa livre deve ser acompanhado de manuais que
provenham as mesmas liberdades que o software possui. Mas esta Licença não está restrita a
manuais de software; ela pode ser usada para qualquer trabalho em texto, independentemente
do assunto ou se ele é publicado como um livro impresso. Nós recomendamos esta Licença prin-
cipalmente para trabalhos cujo propósito seja de introdução ou referência.
APLICABILIDADE E DEFINIÇÕES
Esta Licença se aplica a qualquer manual ou outro texto que contenha uma nota colocada pelo
detentor dos direitos autorais dizendo que ele pode ser distribuído sob os termos desta Licença.
O "Documento"abaixo se refere a qualquer manual ou texto. Qualquer pessoa do público é um
11
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
licenciado e é referida como "você".
Uma "Versão Modificada"do Documento se refere a qualquer trabalho contendo o documento
ou uma parte dele, quer copiada exatamente, quer com modificações e/ou traduzida em outra
língua.
Uma "Seção Secundária"é um apêndice ou uma seção inicial do Documento que trata ex-
clusivamente da relação dos editores ou dos autores do Documento com o assunto geral do
Documento (ou assuntos relacionados) e não contém nada que poderia ser incluído diretamente
nesse assunto geral (Por exemplo, se o Documento é em parte um livro texto de matemática, a
Seção Secundária pode não explicar nada de matemática).
Essa relação poderia ser uma questão de ligação histórica com o assunto, ou matérias relaci-
onadas, ou de posições legais, comerciais, filosóficas, éticas ou políticas relacionadas ao mesmo.
As "Seções Invariantes"são certas Seções Secundárias cujos títulos são designados, como
sendo de Seções Invariantes, na nota que diz que o Documento é publicado sob esta Licença.
Os "Textos de Capa"são certos trechos curtos de texto que são listados, como Textos de Capa
Frontal ou Textos da Quarta Capa, na nota que diz que o texto é publicado sob esta Licença.
Uma cópia "Transparente"do Documento significa uma cópia que pode ser lida automatica-
mente, representada num formato cuja especificação esteja disponível ao público geral, cujos
conteúdos possam ser vistos e editados diretamente e sem mecanismos especiais com editores
de texto genéricos ou (para imagens compostas de pixels) programas de pintura genéricos ou
(para desenhos) por algum editor de desenhos grandemente difundido, e que seja passível de
servir como entrada a formatadores de texto ou para tradução automática para uma variedade
de formatos que sirvam de entrada para formatadores de texto. Uma cópia feita em um formato
de arquivo outrossim Transparente cuja constituição tenha sido projetada para atrapalhar ou de-
sencorajar modificações subsequentes pelos leitores não é Transparente. Uma cópia que não é
"Transparente"é chamada de "Opaca".
Exemplos de formatos que podem ser usados para cópias Transparentes incluem ASCII sim-
ples sem marcações, formato de entrada do Texinfo, formato de entrada do LaTex, SGML ou XML
usando uma DTD disponibilizada publicamente, e HTML simples, compatível com os padrões, e
projetado para ser modificado por pessoas. Formatos opacos incluem PostScript, PDF, formatos
proprietários que podem ser lidos e editados apenas com processadores de texto proprietários,
SGML ou XML para os quais a DTD e/ou ferramentas de processamento e edição não estejam
disponíveis para o público, e HTML gerado automaticamente por alguns editores de texto com
finalidade apenas de saída.
A "Página do Título"significa, para um livro impresso, a página do título propriamente dita,
mais quaisquer páginas subsequentes quantas forem necessárias para conter, de forma legível,
o material que esta Licença requer que apareça na página do título. Para trabalhos que não
tenham uma página do título, "Página do Título"significa o texto próximo da aparição mais proe-
minente do título do trabalho, precedendo o início do corpo do texto.
12
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
FAZENDO CÓPIAS EXATAS
Você pode copiar e distribuir o Documento em qualquer meio, de forma comercial ou não
comercial, desde que esta Licença, as notas de copyright, e a nota de licença dizendo que esta
Licença se aplica ao documento estejam reproduzidas em todas as cópias, e que você não acres-
cente nenhuma outra condição, quaisquer que sejam, às desta Licença.
Você não pode usar medidas técnicas para obstruir ou controlar a leitura ou confecção de
cópias subsequentes das cópias que você fizer ou distribuir. Entretanto, você pode aceitar com-
pensação em troca de cópias. Se você distribuir uma quantidade grande o suficiente de cópias,
você também precisa respeitar as condições da seção 3.
Você também pode emprestar cópias, sob as mesmas condições colocadas acima, e também
pode exibir cópias publicamente.
FAZENDO CÓPIAS EM QUANTIDADE
Se você publicar cópias do Documento em número maior que 100, e a nota de licença do
Documento obrigar Textos de Capa, você precisará incluir as cópias em capas que tragam, clara
e legivelmente, todos esses Textos de Capa: Textos de Capa da Frente na capa da frente, e
Textos da Quarta Capa na capa de trás. Ambas as capas também precisam identificar clara e
legivelmente você como o editor dessas cópias. A capa da frente precisa apresentar o título com-
pleto com todas as palavras do título igualmente proeminentes e visíveis. Você pode adicionar
outros materiais às capas. Fazer cópias com modificações limitadas às capas, tanto quanto estas
preservem o título do documento e satisfaçam a essas condições, pode ser tratado como cópia
exata em outros aspectos.
Se os textos requeridos em qualquer das capas for muito volumoso para caber de forma
legível, você deve colocar os primeiros (tantos quantos couberem de forma razoável) na capa
verdadeira, e continuar os outros nas páginas adjacentes.
Se você publicar ou distribuir cópias Opacas do Documento em número maior que 100, você
precisa ou incluir uma cópia Transparente que possa ser lida automaticamente com cada cópia
Opaca, ou informar, em ou com, cada cópia Opaca a localização de uma cópia Transparente
completa do Documento acessível publicamente em uma rede de computadores, à qual o público
usuário de redes tenha acesso a download gratuito e anônimo utilizando padrões públicos de
protocolos de rede. Se você utilizar o segundo método, você precisará tomar cuidados razoavel-
mente prudentes, quando iniciar a distribuição de cópias Opacas em quantidade, para assegurar
que esta cópia Transparente vai permanecer acessível desta forma na localização especificada
por pelo menos um ano depois da última vez em que você distribuir uma cópia Opaca (direta-
mente ou através de seus agentes ou distribuidores) daquela edição para o público.
É pedido, mas não é obrigatório, que você contate os autores do Documento bem antes de
redistribuir qualquer grande número de cópias, para lhes dar uma oportunidade de prover você
com uma versão atualizada do Documento.
13
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
MODIFICAÇÕES
Você pode copiar e distribuir uma Versão Modificada do Documento sob as condições das se-
ções 2 e 3 acima, desde que você publique a Versão Modificada estritamente sob esta Licença,
com a Versão Modificada tomando o papel do Documento, de forma a licenciar a distribuição
e modificação da Versão Modificada para quem quer que possua uma cópia da mesma. Além
disso, você precisa fazer o seguinte na versão modificada:
A. Usar na Página de Título (e nas capas, se houver alguma) um título distinto daquele do Do-
cumento, e daqueles de versões anteriores (que deveriam, se houvesse algum, estarem listados
na seção "Histórico do Documento"). Você pode usar o mesmo título de uma versão anterior se
o editor original daquela versão lhe der permissão;
B. Listar na Página de Título, como autores, uma ou mais das pessoas ou entidades responsá-
veis pela autoria das modificações na Versão Modificada, conjuntamente com pelo menos cinco
dos autores principais do Documento (todos os seus autores principais, se ele tiver menos que
cinco);
C. Colocar na Página de Título o nome do editor da Versão Modificada, como o editor;
D. Preservar todas as notas de copyright do Documento;
E. Adicionar uma nota de copyright apropriada para suas próprias modificações adjacente às
outras notas de copyright;
F. Incluir, imediatamente depois das notas de copyright, uma nota de licença dando ao público
o direito de usar a Versão Modificada sob os termos desta Licença, na forma mostrada no tópico
abaixo;
G. Preservar nessa nota de licença as listas completas das Seções Invariantes e os Textos de
Capa requeridos dados na nota de licença do Documento;
H. Incluir uma cópia inalterada desta Licença;
I. Preservar a seção entitulada "Histórico", e seu título, e adicionar à mesma um item dizendo
pelo menos o título, ano, novos autores e editor da Versão Modificada como dados na Página de
Título. Se não houver uma sessão denominada "Histórico"no Documento, criar uma dizendo o
título, ano, autores, e editor do Documento como dados em sua Página de Título, então adicionar
um item descrevendo a Versão Modificada, tal como descrito na sentença anterior;
J. Preservar o endereço de rede, se algum, dado no Documento para acesso público a uma
cópia Transparente do Documento, e da mesma forma, as localizações de rede dadas no Docu-
mento para as versões anteriores em que ele foi baseado. Elas podem ser colocadas na seção
"Histórico". Você pode omitir uma localização na rede para um trabalho que tenha sido publicado
pelo menos quatro anos antes do Documento, ou se o editor original da versão a que ela se refira
der sua permissão;
K. Em qualquer seção entitulada "Agradecimentos"ou "Dedicatórias", preservar o título da
14
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
seção e preservar a seção em toda substância e fim de cada um dos agradecimentos de contri-
buidores e/ou dedicatórias dados;
L. Preservar todas as Seções Invariantes do Documento, inalteradas em seus textos ou em
seus títulos. Números de seção ou equivalentes não são considerados parte dos títulos da seção;
M. Apagar qualquer seção entitulada "Endossos". Tal sessão não pode ser incluída na Versão
Modificada;
N. Não reentitular qualquer seção existente com o título "Endossos"ou com qualquer outro
título dado a uma Seção Invariante.
Se a Versão Modificada incluir novas seções iniciais ou apêndices que se qualifiquem como
Seções Secundárias e não contenham nenhum material copiado do Documento, você pode optar
por designar alguma ou todas aquelas seções como invariantes. Para fazer isso, adicione seus
títulos à lista de Seções Invariantes na nota de licença da Versão Modificada. Esses títulos preci-
sam ser diferentes de qualquer outro título de seção.
Você pode adicionar uma seção entitulada "Endossos", desde que ela não contenha qual-
quer coisa além de endossos da sua Versão Modificada por várias pessoas ou entidades - por
exemplo, declarações de revisores ou de que o texto foi aprovado por uma organização como a
definição oficial de um padrão.
Você pode adicionar uma passagem de até cinco palavras como um Texto de Capa da Frente
, e uma passagem de até 25 palavras como um Texto de Quarta Capa, ao final da lista de Textos
de Capa na Versão Modificada. Somente uma passagem de Texto da Capa da Frente e uma de
Texto da Quarta Capa podem ser adicionados por (ou por acordos feitos por) qualquer entidade.
Se o Documento já incluir um texto de capa para a mesma capa, adicionado previamente por
você ou por acordo feito com alguma entidade para a qual você esteja agindo, você não pode
adicionar um outro; mas você pode trocar o antigo, com permissão explícita do editor anterior que
adicionou a passagem antiga.
O(s) autor(es) e editor(es) do Documento não dão permissão por esta Licença para que seus
nomes sejam usados para publicidade ou para assegurar ou implicar endossamento de qualquer
Versão Modificada.
COMBINANDO DOCUMENTOS
Você pode combinar o Documento com outros documentos publicados sob esta Licença, sob
os termos definidos na seção 4 acima para versões modificadas, desde que você inclua na com-
binação todas as Seções Invariantes de todos os documentos originais, sem modificações, e liste
todas elas como Seções Invariantes de seu trabalho combinado em sua nota de licença.
O trabalho combinado precisa conter apenas uma cópia desta Licença, e Seções Invariantes
Idênticas com multiplas ocorrências podem ser substituídas por apenas uma cópia. Se houver
múltiplas Seções Invariantes com o mesmo nome mas com conteúdos distintos, faça o título de
15
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
cada seção único adicionando ao final do mesmo, em parênteses, o nome do autor ou editor
origianl daquela seção, se for conhecido, ou um número que seja único. Faça o mesmo ajuste
nos títulos de seção na lista de Seções Invariantes nota de licença do trabalho combinado.
Na combinação, você precisa combinar quaisquer seções entituladas "Histórico"dos diver-
sos documentos originais, formando uma seção entitulada "Histórico"; da mesma forma combine
quaisquer seções entituladas "Agradecimentos", ou "Dedicatórias". Você precisa apagar todas as
seções entituladas como "Endosso".
COLETÂNEAS DE DOCUMENTOS
Você pode fazer uma coletânea consitindo do Documento e outros documentos publicados
sob esta Licença, e substituir as cópias individuais desta Licença nos vários documentos com
uma única cópia incluida na coletânea, desde que você siga as regras desta Licença para cópia
exata de cada um dos Documentos em todos os outros aspectos.
Você pode extrair um único documento de tal coletânea, e distribuí-lo individualmente sob
esta Licença, desde que você insira uma cópia desta Licença no documento extraído, e siga esta
Licença em todos os outros aspectos relacionados à cópia exata daquele documento.
AGREGAÇÃO COM TRABALHOS INDEPENDENTES
Uma compilação do Documento ou derivados dele com outros trabalhos ou documentos se-
parados e independentes, em um volume ou mídia de distribuição, não conta como uma Ver-
são Modificada do Documento, desde que nenhum copyright de compilação seja reclamado pela
compilação. Tal compilação é chamada um "agregado", e esta Licença não se aplica aos outros
trabalhos auto-contidos compilados junto com o Documento, só por conta de terem sido assim
compilados, e eles não são trabalhos derivados do Documento.
Se o requerido para o Texto de Capa na seção 3 for aplicável a essas cópias do Documento,
então, se o Documento constituir menos de um quarto de todo o agregado, os Textos de Capa
do Documento podem ser colocados em capas adjacentes ao Documento dentro do agregado.
Senão eles precisarão aparecer nas capas de todo o agregado.
TRADUÇÃO
Tradução é considerada como um tipo de modificação, então você pode distribuir traduções
do Documento sob os termos da seção 4. A substituição de Seções Invariantes por traduções
requer uma permissão especial dos detentores do copyright das mesmas, mas você pode incluir
traduções de algumas ou de todas as Seções Invariantes em adição às versões orignais dessas
Seções Invariantes. Você pode incluir uma tradução desta Licença desde que você também in-
clua a versão original em Inglês desta Licença. No caso de discordância entre a tradução e a
16
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
versão original em Inglês desta Licença, a versão original em Inglês prevalecerá.
TÉRMINO
Você não pode copiar, modificar, sublicenciar, ou distribuir o Documento exceto como expres-
samente especificado sob esta Licença. Qualquer outra tentativa de copiar, modificar, sublicen-
ciar, ou distribuir o Documento é nula, e resultará automaticamente no término de seus direitos
sob esta Licença. Entretanto, terceiros que tenham recebido cópias, ou direitos de você sob esta
Licença não terão suas licenças terminadas, tanto quanto esses terceiros permaneçam em total
acordo com esta Licença.
REVISÕES FUTURAS DESTA LICENÇA
A Free Software Foundation pode publicar novas versões revisadas da Licença de Documen-
tação Livre GNU de tempos em tempos. Tais novas versões serão similares em espirito à versão
presente, mas podem diferir em detalhes ao abordarem novos porblemas e preocupações. Veja
http://www.gnu.org/copyleft/.
A cada versão da Licença é dado um número de versão distinto. Se o Documento especificar
que uma versão particular desta Licença "ou qualquer versão posterior"se aplica ao mesmo, você
tem a opção de seguir os termos e condições daquela versão específica, ou de qualquer versão
posterior que tenha sido publicada (não como rascunho) pela Free Software Foundation. Se o
Documento não especificar um número de Versão desta Licença, você pode escolher qualquer
versão já publicada (não como rascunho) pela Free Software Foundation.
ADENDO: Como usar esta Licença para seus documentos
Para usar esta Licença num documento que você escreveu, inclua uma cópia desta Licença
no documento e ponha as seguintes notas de copyright e licenças logo após a página de título:
Copyright (c) ANO SEU NOME.
É dada permissão para copiar, distribuir e/ou modificar este documento sob os termos da Licença
de Documentação Livre GNU, Versão 1.1 ou qualquer versão posterior publicada pela Free Soft-
ware Foundation; com as Seções Invariantes sendo LISTE SEUS TÍTULOS, com os Textos da
Capa da Frente sendo LISTE, e com os Textos da Quarta-Capa sendo LISTE. Uma cópia da li-
cença está inclusa na seção entitulada "Licença de Documentação Livre GNU".
Se você não tiver nenhuma Seção Invariante, escreva "sem Seções Invariantes"ao invés de
dizer quais são invariantes. Se você não tiver Textos de Capa da Frente, escreva "sem Textos de
Capa da Frente"ao invés de "com os Textos de Capa da Frente sendo LISTE"; o mesmo para os
Textos da Quarta Capa.
Se o seu documento contiver exemplos não triviais de código de programas, nós recomenda-
mos a publicação desses exemplos em paralelo sob a sua escolha de licença de software livre,
17
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
tal como a GNU General Public License, para permitir o seu uso em software livre.
18
Parte IV
A linguagem C
19
Capítulo 1
O que é a linguagem C?
C é uma linguagem flexível e poderosa que possui características de linguagens de alto nível
(como o basic ou cobol) e outras de baixo nível (como assembly), sendo muitas vezes conside-
rada como uma linguagem de nível médio. É uma linguagem tipicamente compilada (ou seja, o
programa é totalmente convertido para um código legível pela máquina antes de ser executada) e
permite liberdade total ao programador, que é responsável por tudo que acontece, possibilitando
um bom controle e objetividade em suas tarefas.
Este curso dará uma base introdutória para a programação em plataformas UNIX/Linux usando
a linguagem C no padrão ANSI. Como o padrão ANSI não aborda recursos como elementos grá-
ficos, multithreading, comunicação entre processos e comunicação em redes, esses temas não
serão abordados nesse curso.
O curso terá duração de 4 semanas e o conteúdo será disponibilizado em etapas, no início
de cada semana. Antes de começar o curso, o aluno deverá ler o Plano de Ensino e o Guia do
Aluno a seguir. Aos iniciantes na plataforma Moodle, recomendamos que leia a Ambientação do
Moodle a seguir.
20
Capítulo 2
Plano de ensino
2.1 Objetivo
Introduzir aos técnicos e programadores a linguagem de programação C padrão ANSI.
2.2 Público Alvo
Técnicos e Programadores que desejam trabalhar com a linguagem C.
2.3 Pré-requisitos
Os usuários deverão ter conhecimento básico acerca da lógica de programação.
2.4 Descrição
O curso de Linguagem de Programação C será realizado na modalidade EAD e utilizará a
plataforma Moodle como ferramenta de aprendizagem. Ele é composto por módulos de apren-
dizado que serão dados no início de cada semana e um módulo de avaliação que será dado na
última. O material didático estará disponível on-line de acordo com as datas pré-estabelecidas
no calendário. A versão utilizada para o compilador (o GCC) será a 4.0.4
2.5 Metodologia
O curso está dividido da seguinte maneira:
2.6 Cronograma
• Semana 1 - Introdução à linguagem C;
• Semana 2 - Código estruturado em C e ponteiros;
• Semana 3 - Abstração de dados;
21
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
• Semana 4 - Estruturação e manipulação avançada do código e dos arquivos;
• Avaliação - Avaliação de aprendizagem e avaliação final.
As lições contêm o conteúdo principal. Elas poderão ser acessadas quantas vezes forem ne-
cessárias, desde que esteja dentro da semana programada. Ao final de uma lição, você receberá
uma nota de acordo com o seu desempenho. Responda com atenção às perguntas de cada li-
ção, pois elas serão consideradas na sua nota final. Caso sua nota numa determinada lição seja
menor que 6.0, sugerimos que você faça novamente esta lição.
Ao final do curso será disponibilizada a avaliação referente ao curso. Tanto as notas das lições
quanto a da avaliação serão consideradas para a nota final. Todos os módulos ficarão visíveis
para que possam ser consultados durante a avaliação final.
Aconselhamos a leitura da "Ambientação do Moodle"para que você conheça a plataforma de En-
sino a Distância, evitando dificuldades advindas do "desconhecimento"sobre a mesma.
Os instrutores estarão à sua disposição ao longo de todo curso. Qualquer dúvida deverá ser
enviada ao fórum. Diariamente os monitores darão respostas e esclarecimentos.
2.7 Programa
O curso da linguagem C oferecerá o seguinte conteúdo:
• Lição 1 - Introdução teórica;
• Lição 2 - Elementos léxicos e sintáticos da linguagem C, parte 1;
• Lição 3 - Elementos léxicos e sintáticos da linguagem C, parte 2;
• Lição 4 - Elementos léxicos e sintáticos da linguagem C, parte 3;
• Lição 5 - Manipulação de arquivos e entradas/saídas em C;
• Lição 6 - Recursividade;
• Lição 7 - Manipulação de ponteiros e tipos avançados de dados;
• Lição 8 - Estruturas de dados, parte 1;
• Lição 9 - Estruturas de dados, parte 2;
• Lição 10 - Dividindo seu programa em diversos arquivos fontes;
• Lição 11 - Manipulação avançada de arquivos.
2.8 Avaliação
Em cache - Páginas Semelhantes
Toda a avaliação será feita on-line. Aspectos a serem considerados na avaliação:
• Iniciativa e autonomia no processo de aprendizagem e de produção de conhecimento;
22
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
• Capacidade de pesquisa e abordagem criativa na solução dos problemas apresentados.
Instrumentos de avaliação:
• Participação ativa nas atividades programadas;
• Avaliação ao final do curso;
• O participante fará várias avaliações referente ao conteúdo do curso. Para a aprovação e
obtenção do certificado o participante deverá obter nota final maior ou igual a 6.0 de acordo
com a fórmula abaixo:
• Nota Final = ((ML x 7) + (AF x 3)) / 10 = Média aritmética das lições
• AF = Avaliações .
2.9 Bibliografia
• Curso O Linux : http://www.coltec.ufmg.br/ info/cursoC_olinux/curso_c_htm.htm
• cplusplus.com : http://www.cplusplus.com/
23
Capítulo 3
Introdução à linguagem C
3.1 Introdução teórica
3.1.1 O que é a linguagem de programação C?
#include <stdio.h>
#define MAX 100
int main (int argc , char *argv[]) {
int i;
for ( i = 0 ; i < MAX ; i++ ) {
printf("Este curso sera sobre a linguagem C!! n");
}
}
#undef MAX
Programa que imprime o texto "Este curso será sobre a linguagem C!!"100 vezes no console
C é uma linguagem que alia características de linguagens de alto nível (como pascal e basic)
e outras de baixo nível como assembly (linguagem de montagem para comandos específicos da
máquina), logo, é freqüentemente conhecida como uma linguagem de nível médio (ou intermediá-
rio) por permitir também facilidade de acesso ao hardware e facilitar a integração com comandos
assembly.
Esta linguagem foi originada da linguagem de programação B (criada por Ken Thompson),
que por sua vez foi originada da linguagem de programação BCPL (criada por Martin Richards).
Pode ser interessante analisar essas linguagens para avaliar algumas características herdadas,
24
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
mas isso não será feito neste curso.
O que isso quer dizer? Que C junta flexibilidade, praticidade e simplicidade. Adicionalmente,
C permite liberdade total ao programador que é responsável por tudo que acontece, nada é im-
posto ou acontece simplesmente ao acaso, tudo é pensado pelo programador e isso significa um
bom controle e objetividade em suas tarefas, o que muitas vezes não é conseguido em diversas
outras linguagens.
C é uma "linguagem estruturada", ou seja, são linguagens que estruturam o programa em
blocos para resolver os problemas. Você divide um grande e complexo problema em um conjunto
de problemas mais simples de serem resolvidos.
C é uma linguagem compilada e utiliza de um compilador C para ser executado, ao contrário
de outras linguagens que utilizam de um interpretador para tal (como o prolog ou o Java Byte-
code). Na concepção da linguagem é que se decide se ela vai ser compilada ou interpretada, pois
todas as linguagens têm seu objetivo a cumprir (como prioridade a velocidade ou a flexibilidade) e
o método de tradução (compilação ou interpretação) tem impacto no cumprimento desses objeti-
vos. A priori, qualquer uma poderia ser interpretada ou compilada, mas linguagens que priorizam
flexibilidade e portabilidade são interpretadas e as linguagens que priorizam a velocidade são
compiladas.
Na verdade, quem faz um programa ser executado é também um programa, só que um pro-
grama avançado que lê todo código fonte (o que foi escrito pelo programador) e o traduz de
alguma forma para ser executado. Isso acontece em todas linguagens. A diferença básica é que
um interpretador lê linha a linha do fonte, o examina sintaticamente e o executa.
Cada vez que o programa for executado esse processo tem de ser repetido e o interpretador
é chamado. Já um compilador lê todo programa e o converte para código-objeto (código de má-
quina, binário, 0’s e 1’s) e pronto. Sempre quando tiver que ser executado é só chamar o código
convertido, pois todas instruções já estão prontas para a execução, não tendo mais vínculo com
seu código-fonte.
A linguagem C também foi projetada visando a portabilidade, ou seja, para que o mesmo có-
digo escrito em C possa ser utilizado para gerar diversos programas executáveis especializados
para diferentes arquiteturas de máquina. Note que o código escrito em linguagem C é portável,
mas o programa executável gerado por ele não o é.
Todas as páginas desta lição virão com um exemplo não tão complexo de código em lingua-
gem C. Eles são para fins ilustrativos. Os interessados podem tentar compilar o código ou analisar
o que eles fazem.
3.1.2 Quem realmente controla os programas?
Quem controla as ações mais básicas de um computador é o Sistema Operacional (SO).
O SO é o que podemos chamar de camada de software que faz a interface (comunicação) en-
tre os usuários e o Hardware (parte física da máquina, placas, circuitos, memórias). O objetivo
básico é controlar as atividades do Hardware e prover um ambiente agradável para o usuário do
25
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
sistema e que ele possa trabalhar com maior grau de abstração (se preocupar menos com pro-
blemas relativos aos detalhes do funcionamento da máquina e poder pensar mais na essência da
resolução de um problema). Qualquer comando de um programa convencional precisa sempre
passar pelo "filtro"do Sistema Operacional antes de ser executada.
O SO tem alguns componentes primordiais para a interação do usuário com a máquina: o
escalonador de processos, o gerenciador de memória, o gerenciador de entrada e saída, o
sistema de arquivos e o interpretador de comandos.
O escalonador de processos (task scheduler) é uma parte do SO que controla o uso de
recursos computacionais por processos (um processo é um programa em execução). Os esca-
lonadores atuais tentam permitir que vários processos rodem quase que paralelamente em um
computador e de forma eficiente. Por exemplo, caso um processo fique muito tempo ocioso es-
perando por um recurso que demora para ser liberado, o escalonador deve fazer com que um
outro processo entre em execução enquanto que o primeiro esteja esperando. Podemos dizer
basicamente que o escalonador de processos é o responsável pela eficiência de um SO como
todo.
O sistemas de arquivos provê ao usuário uma abstração muito conhecida como "arquivos"(e
adicionalmente as "pastas"). É ele quem verifica o conjunto de 1 e 0 (os famosos "bits") presentes
nos dispositivos de armazenamento (atualmente o mais comum é o HD) e o "traduz"para que o
usuário tenha a impressão de que nesses dispositivos realmente existam os "arquivos", não me-
ramente os "bits".
O interpretador de comandos comandos é uma interface primária entre o usuário e o SO.
Permite que o usuário e o SO se "comuniquem"usando uma linguagem em comum. O interpre-
tador de comandos é conhecido no mundo Linux como SHELL (pode variar para outros sistemas).
3.1.3 Histórico da linguagem C
#include <stdlib.h>
int * buscaBin (int *p1, int tam , int elem) {
int *p2 = p1 + tam - 1;
int *p = p1 + ((p2 - p1)/2);
while ( p1 <= p2 ) {
if (*p == elem) {
return p;
} else if (*p < elem) {
p1 = p + 1;
} else {
26
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
p2 = p - 1;
}
p = p1 + ((p2 - p1)/2);
}
return NULL;
}
Função de busca binária em um vetor de elementos inteiros ordenados
Em 1973 Dennis Ritchie, pesquisador da Bell Labs, reescreveu todo sistema UNIX para uma
linguagem de alto nível (na época considerada) chamada C, desenvolvida por ele mesmo. Esse
sistema foi utilizado para um PDP-11 (o microcomputador mais popular na época).
Tal situação de se ter um sistema escrito em linguagem de alto nível foi inovador na época
e pode ter sido um dos motivos da aceitação do sistema por parte dos usuários externos a Bell.
Sua popularização tem relação direta com o exponencial uso do C.
Por vários anos o padrão utilizado para o C foi o que era fornecido com o UNIX versão 5 (des-
crito em The C programming Language, de Brian Kernighan e Dennis Ritchie - 1978). Começaram
a surgir diversas implementações da tal linguagem e os códigos gerados por tais implementações
eram altamente incompatíveis. Não existia nada que formalizasse essas compatibilizações e com
o aumento do uso desses diversos "dialetos"da linguagem, surgiu-se a necessidade de uma pa-
dronização, regras que todos poderiam seguir para poderem rodar seus programas no maior
número de plataformas possíveis.
O ANSI (American National Standards Intitute, Instituto Americano que até hoje dita diversos
padrões) estabeleceu em 1983 um comité responsável pela padronização da linguagem. Atual-
mente, a grande maioria dos compiladores já suportam essa padronização (ou melhor, é quase
uma obrigação suportar o padrão ANSI).
Trocando em miúdos, o C pode ser escrito em qualquer máquina que se utilize de tal padrão
e rodar em qualquer outra que também o faça. Parece inútil? Não. Na verdade, isso (a por-
tabilidade) é a semente de grande parte dos avanços tecnológicos que toda programação tem
proporcionado no mundo de hoje. Com o tempo isso ficará mais claro.
3.1.4 Características
Listamos abaixo algumas características da linguagem C:
1. Projetado inicialmente para o desenvolvimento de softwares básicos (softwares de base,
que provém serviços para outros softwares específicos) de forma independente do hard-
ware;
2. Foi projetado para ser usado por programadores especializados interessados em geração
de códigos compactos e eficientes;
27
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
3. O gerenciamento de memória é por cargo do programador (não existe a coleta de lixo,
como ocorre na linguagem Java), ou seja, o programador é quem especifica a alocação e a
liberação de memória utilizada por um dado;
4. Economia de expressões (as expressões em C utilizam poucas letras);
5. Moderno controle de fluxo e estruturas de dados. Construções para o controle de fluxo do
programa é bem estruturada e é possível criar novas estruturas de dados de forma flexível;
6. Possui um conjunto rico e poderoso de operadores;
7. Elementos dependentes de hardware estão integradas em bibliotecas de funções, logo, os
programas convencionais não precisam se preocupar com esses elementos;
8. Performance próxima das obtidas com a linguagem Assembly;
9. São "case sensitives", ou seja, diferem letras maiúsculas das minúsculas;
10. O entrypoint (o ponto inicial de execução do programa) é declarada através da função
"main()";
11. Os dados são tipados, ou seja, devem ter o "tipo"explicitamente declarado;
12. 12. Os tipos de dados declarados pelo programador (os que não foram especificados pela
linguagem C, como o int, float, char, ...) são diferenciados pelo tamanho (número de bytes
que um dado ocupa), não pelo nome atribuído ao tipo.
3.1.5 O compilador GCC
#include <stdio.h>
#include <stdlib.h>
void andVetor (int vetor1[], int vetor2[] , int tamVetor) {
int *p1 = vetor1;
int *p2 = vetor2;
for ( ; tamVetor > 0 ; tamVetor-- , p1++, p2++ ) {
*p1 = *p1 && *p2;
}
}
int main (int argc , char *argv[]) {
int i;
int v1[] = {1,1,0,1,1};
int v2[] = {1,0,1,1,0};
andVetor(v1,v2,5);
28
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
for (i = 0 ; i < 5 ; i++) {printf("n %d n" , v1[i]);}
return 0;
}
Programa que imprime o resultado da operação lógica "E"aplicado em um vetor.
O GCC (GNU Compiler Collection) é uma distribuição integrada de compiladores de diversas
linguagens de programação, que inclui C, C++, Objective-C, Objective-C++, Java, Fortran, e Ada.
Historicamente, o GCC é mais conhecido como "GNU C Compiler"por seu uso comum ser a com-
pilação da linguagem C.
Neste curso, utilizaremos o GCC como o compilador principal. Este curso dará somente uma
visão rápida do GCC, pois este recurso é bastande diversificado e um curso completo pode ser
feito para ensinar o uso avançado do GCC.
Façamos uma revisão rápida:
Um programa em C é elaborado em dois passos básicos:
• O programa é escrito em texto puro num editor de texto simples. Tal programa se chama
"código fonte"(source code em inglês);
• Passamos o código fonte para o compilador que é o programa que gera um arquivo num
formato que a máquina entenda.
1. O compilador realiza a "pré-compilação", ou seja, processa comandos especiais direciona-
dos para o compilador (as diretivas de compilação) e ignora elementos redundantes (como
espaços em branco ou comentários);
2. O compilador avalia o código fonte para detectar erros léxicos, sintáticos e os erros semân-
ticos simples;
3. O compilador gera, através do código fonte, um código intermediário em uma "gramá-
tica"mais simples para a máquina (geralmente uma linguagem assembly). Posteriormente,
o montador (assembler) gerará um arquivo "objeto"para cada código fonte. Alguns compila-
dores não passam pela linguagem assembly e geram diretamente o código objeto;
4. Depois, o ligador (linker) junta o arquivo objeto com a biblioteca padrão. A tarefa de juntar
todas as funções do programa é bastante complexa. Nesse estágio, o compilador pode
falhar se ele não encontrar referências para a função.
Freqüentemente referimos o termo "compilador" como a junção do "pré-compilador"(que faz
a pré-compilação), o "analisador"(realiza a analização léxica, sintática e parte da semântica), um
"gerador de código de baixo nível"(converte um programa em linguagem de alto nível em outra
29
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
de baixo nível), o montador/assembler (converte um programa em linguagem assembly para um
arquivo objeto) e o ligador/linker (junta diversos arquivos objeto para gerar o programa completo
e executável pela máquina).
Para usar o GCC para compilar seu programa, use:
$ gcc fonte.c
Isso já efetua a pré-compilação, a compilação, a montagem (assembly) e a ligação (link), ge-
rando um programa executável.
Na maioria dos computadores, isso gerará um arquivo chamado "a.out". Para executar esse
programa, digite "./a.out". Para mudar o nome do programa executável gerado, você pode utilizar
a opção -o.
$ gcc -o destino fonte.c
O seu programa se chamará destino e será o derivado do fonte chamado fonte.c.
Se você deseja compilar um programa "fonte1.c"que utiliza "fonte2.c", "fonte3.c"e "fonte4.c"como
biblioteca, execute:
$ gcc -o destino fonte1.c fonte2.c fonte3.c fonte4.c
Isso criará um arquivo "destino"que foi gerado de "fonte1.c", que por sua vez utilizou "fonte2.c",
"fonte3.c"e "fonte4.c"como biblioteca.
3.1.6 Tipos de Erros
#include <stdio.h>
#define FIM 255
unsigned char seq[] = {
3 ,
1 , 4 , 1 , 5 , 9 ,
2 , 6 , 5 , 3 ,5 ,
8 , 9 , 7 , 9 ,3 ,
2 , 3 , 8 , 4 , 6 ,
2 , 6 , 4 , 3 , 3 ,
8 , 3 , 2 , 7 , 9 ,
FIM
};
int main( int argc , char * argv[] ) {
30
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
int i = 0;
printf("n Seq = (");
for ( ; (seq[i]!=FIM)?(printf(" %u ",seq[i]),1) : (0) ; i++ ) {}
printf(");n");
return 0;
}
#undef FIM
Programa que imprime 30 casas decimais do PI
Dito de forma radical, erros são provocados sempre pelo programador. Existem basica-
mente dois tipos de erros:
1. Léxico: relacionado ao formato da palavra (como o uso de letras erradas). Esse tipo de
erro ocorre normalmente ao usar letras/símbolos inesperados nas palavras (por exemplo,
ao usar símbolos como o "@"para nomes de variáveis - o que não é permitido no C);
2. Sintático: relacionado com a organização entre palavras. Erros desse tipo ocorrem quando
duas ou mais palavras (ou letras que representam algum elemento da linguagem) estão
colocadas em posições erradas ou quando palavras esperadas não se encontram no local
devido (por exemplo, para cada ""deve haver um correspondente; se não houver, será erro
sintático);
3. Lógico/Semântico: os demais erros se enquadram nesta categoria. Erros de lógica de
programação (como loop infinito, abertura de arquivos que não existem, etc), erros mate-
máticos (divisão por zero), erros de ordem de operação, erros de tipos (quando se utiliza
um dado de um tipo diferente do esperado - inteiros quando se espera ponteiros), etc. Erros
desta categoria são de difícil detecção.
Os erros de sintaxe são os melhores que podem acontecer (claro, o ideal é que não ocorram
erros, mas nós, como seres humanos, sempre cometemos erros nos piores momentos possí-
veis). O compilador o identificará durante a compilação do programa, ou seja, não gerará um
efeito inesperado durante a execução do programa. Os erros léxico/sintático são gerados quando
criamos programas que estão fora da construção esperada pela gramática da linguagem.
Em geral, quando os compiladores encontram um erro eles não terminam imediatamente,
mas continuam procurando até o final do programa e assim listam todos os erros detectados e do
que se tratam. O programa é somente compilado até o final (geram códigos executáveis) quando
erros léxicos e sintáticos não mais existirem.
É bastante traumatizante para alguém fazendo seu primeiro programa obter um erro e ver
diversas linhas de mensagens que aparentemente não fazem sentido. Não se assuste nem se
desmotive, pois pode ser um simples ponto e vírgula ou um detalhe bobo. Os compiladores não
são inteligentes o suficiente para identificar exatamente qual foi o erro e indicar soluções para
isso. Com o tempo e a experiência você começará a se acostumar e aprender a lidar com isso.
31
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
Caso erros léxico-sintáticos não estejam mais presentes, o compilador transformará o seu có-
digo fonte (texto puro) em código de máquina (os tais 0’s e 1’s, o que a máquina entende) e você
poderá executa-lo. Bem, mas se a lógica do programa estiver errada? Este tipo de erro não pode
ser detectado pelo compilador.
Erros lógicos se assemelham a entregar uma receita de bolo de mandioca quando se espera
um bolo de fubá. Se a receita estiver gramaticalmente correta, o cozinheiro pode perfeitamente
transformar a receita em algum produto, mas não estará preocupado se realmente foi esse pro-
duto que o cliente queria (nem estará preocupado se esse produto será digerível por algum ser
humano). No caso de um compilador, o compilador somente transformará o código fonte para
código de máquina e não verificará se o programa descrito pelo código fonte realmente resolverá
o problema desejado.
Fazendo uma analogia:
1. Você pode falar com seu empregado e ele não entender o que você está expressando e
assim ele não conseguirá executar a tarefa e reclamará. Por exemplo, falando em japonês
com ele! Nesse caso, houve um erro léxico/sintático.
2. Você explica tudo gramaticalmente correto para o seu empregado. Ele entende tudo, porém
a idéia passada é inconsistente. Por exemplo, manda ele ir para uma rua que não existe ou
comprar algo sem que haja dinheiro suficiente. Neste caso, o erro foi de lógica.
Tais erros podem acarretar algumas conseqüências graves como:
• O programa termina repentinamente e às vezes dê uma advertência inesperada;
• O programa funciona incorretamente e gera dados inconsistentes;
• O programa leva o sistema a um estado instável ou lento.
Alguns erros lógicos simples podem ser detectadas pelo compilador (como diferenças de tipos
de dados ou visibilidade/escopo), mas no geral os erros lógicos podem ser resolvidos somente
por inspecção e avaliação lógica.
Detalhes Importantes
Depois de corrigir um erro no código fonte, você deve compilar o programa novamente para
que este tenha efeito, caso contrário o executável não reflitirá o código fonte atual. O compilador
não detectará automaticamente essas mudanças e compilará automaticamente.
O C, como tudo no mundo Linux/UNIX, difere as letras maiúsculas das minúsculas (o dito
"case sensitive"em inglês); esse critério deve ser considerado com cuidado. Existem padrões
que normalizam o uso de maiúsculas e minúsculas em nomes utilizados nos programas C. No
geral, recomenda-se priorizar o uso de minúsculas, com exceção dos dados constantes, strings
e nomes compostos (por exemplo, nome de variáveis como "minhaVariavel"ou nomes de tipos de
32
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
dados como "meuTipo").
Outro detalhe importante: o C (como a maioria das linguagens atuais) exige que se faça uma
listagem de todas as variáveis do programa previamente. Ou seja, não existe uso dinâmico de
variáveis e tudo que você usa tem que ser previamente declarado.
O ";"(ponto-e-vírgula) é o "terminador de comando"no C, ou seja, é o indicador de fim de co-
mando. Diferente das linguagens como o Pascal (que possui "separador de comando", não o
"terminador"), todos os comandos em C (com exceção de alguns blocos de comando) devem ser
terminados com o ponto-e-vírgula. Em linguagens com "separadores de comandos"(como Pas-
cal), o último comando não precisa desse elemento, pois o último comando não tem algo a seguir
para precisar separar.
3.2 Elementos léxicos e sintáticos da linguagem C, parte 1
3.2.1 Palavras Reservadas
Um dos elementos léxicos mais importantes de uma linguagem de programação são as pa-
lavras reservadas. As palavras reservadas, os operadores (unários, binários e ternários), os
símbolos terminadores de comandos e os delimitadores de blocos/expressões formam os ele-
mentos léxicos constantes da gramática da linguagem C.
O que vem a ser palavras reservadas? São palavras que têm significado especial na lingua-
gem. Cada palavra tem significado especial em C e as instruções são executadas através do uso
desses conjuntos de palavras. Existem algumas palavras chaves que são previamente determi-
nadas pelo projeto da linguagem. Chamamos essas palavras de palavras reservadas. A priori,
elas não poderão ser usadas para fins além do determinado pela linguagem. As funções que
cada palavra chave exerce serão esclarecidas no decorrer do curso.
Um compilador C precisaria ser muito inteligente para poder distinguir, através da análise de
contexto, as palavras reservadas dos comuns casos a mesma seqüência de letras possam ser
utilizadas tanto como reservadas em alguns casos quanto como nomes próprios em outros. Por
isso, foi determinado que as palavras reservadas seriam utilizadas somente para seus fins desig-
nados (que são geralmente comandos e afirmativas) .
Abaixo está a lista dessas palavras. Relembrando, o C entende tais palavras apenas em letras
minúsculas (não funcionará se você colocar em maiúsculas).
• auto
• double
• int
• struct
• break
33
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
• else
• long
• switch
• case
• enum
• register
• typedef
• char
• extern
• return
• union
• const
• float
• short
• unsigned
• continue
• for
• signed
• void
• case
• goto
• sizeof
• volatile
• do
• if
• signed
• while
34
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
Todo conjunto de palavras reservadas acima são o conjunto das instruções básicas do C. Apa-
rentemente, parecem poucas e você, na prática, usará apenas algumas poucas delas. Tal fato
acontece pois uma das facilidades do C é a utilização muito natural de bibliotecas que funcionam
como acessórios para o C.
As bibliotecas (conjunto de funções) não fazem parte intrínseca do C, mas você não encon-
trará nenhuma versão do C sem nenhuma delas. Algumas são até tratadas como parte da lin-
guagem por serem padronizadas.
3.2.2 Variáveis
São espaços reservados que guardam valores durante a execução de um programa. Como o
nome diz, elas tem a capacidade de "variar"no tempo. Em geral, são exatamente um pedaço de
memória (o tamanho depende do que se esteja guardando) no qual botamos alguma informação
e podemos nos referir a ela, utilizá-la, alterá-la ou fazermos o que bem entendermos durante a
execução de um programa.
Nome das variáveis
Toda variável tem um nome pela qual é chamada (identificada) e um tipo (o que ela guardará).
Os nomes podem ser de uma letra até palavras.
Dizendo de forma simplificada, os nomes das variáveis obrigatoriamente devem começar por
uma letra ou underscore (o sinal de menos achatado: "_"). O restante pode ser letras de A até Z
maiúsculas, minúsculas, números e o underscore. Exemplos: e, variável _essa_e_uma_variavel,
tambem_variavel. Vale ressaltar que ela é "case sensitive", o que significa que diferencia maiús-
culas e minúsculas.
Recomendações: evite o uso de variáveis com o nome iniciando com o underscore ("_"), pois
elas são freqüentemente utilizadas por bibliotecas padrões do C (explicações sobre bibliotecas
serão feitas mais adiante) e podem causar conflitos de nomes (quando um mesmo nome é uti-
lizado em variáveis declaradas em mesmo nível de escopo - maiores detalhes sobre nível de
escopo serão dados mais adiante). Crie também o hábito de nomear variáveis utilizando letras
minúsculas, pois essa prática é comum no mundo da programação.
As variáveis possuem tipos. Os tipos dizem ao compilador que tipo de dado será armaze-
nado. Isso é feito com o intuito do compilador obter as informações necessárias sobre quanto
de memória ele terá que reservar para uma determinada variável. Também ajuda o compilador
com uma lista de variáveis em um lugar reservado de memória, para que ele possa fazer referên-
cias, checar nomes e tipos e que possa determinar erros. Basicamente possibilita uma estrutura
bem definida do que é usado e uma arrumação conveniente na memória. Podemos dizer que as
variáveis em linguagem C são fortemente "tipadas", pois todas as variáveis possuem tipos asso-
ciados e operações sobre as variáveis somente poderão ser feitas entre tipos compatíveis (mas
não necessariamente iguais).
NOTA: o tipo mais comum nos programas C é o int (número inteiro). Maiores detalhes sobre
os tipos serão dados adiante.
35
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
Declaração de uma variável
Antes de utilizarmos uma variável, precisamos declarar a variável. Veja abaixo a sintaxe da
declaração de uma variável:
<tipo> <nome>;
ou
<tipo> <nome> = <valor_inicial>;
Exemplos:
int minha_variavel;
int i = 10;
int j = i;
Podemos também declarar várias variáveis de uma só vez, separando-as usando vírgulas:
int a , b = 0 , c , d = 11 , e , f;
No caso acima, as variáveis "a", "b", "c", "d", "e"e "f"serão do tipo "int"; cujo "b"terá valor inici-
alizado em 0 e "d"terá valor inicial de 11.
Recomendação: para melhorar a legibilidade, é sempre uma boa prática de programação
atribuir valores iniciais das variáveis no momento de sua declaração e evitar que a mesma variável
seja "reutilizada"(que uma variável seja utilizada para um determinado propósito em um trecho do
código e para um propósito completamente diferente em um outro trecho). Atualmente, um código
manutenível (legível, fácil de alterar, reutilizável, portável e predizível) é muito mais apreciada do
que um código simplesmente compacto.
Atribuição de valores
Utilizamos o operador "="para atribuir valores novos às variáveis. O comando de atribuição de
variáveis pode ser definido como abaixo:
<nome_da_variável> = <expressão>;
Onde <expressão> pode ser um número, uma outra variável, uma expressão matemática (ex.
(a+b)-10, onde a e b são variáveis), uma função, etc.
Exemplo:
minha_variavel = 10 + 2 - outra_variavel;
3.2.3 Operadores Aritméticos e de Atribuição
O que vamos aprender agora é importante no sentido de que vamos usar isto praticamente
em qualquer programa que implementemos. Vamos aprender a traduzir, para o nosso código, as
fórmulas e expressões matemáticas que usamos no dia-a-dia ou que tenham alguma utilidade.
Vamos falar um pouco sobre prioridade dos operadores e precedência, dois conceitos que juntos
vão fazer com que todas as nossas fórmulas e expressões sejam corretamente analisadas pelo
compilador.
36
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
Os operadores
Os seguintes operadores podem ser utilizados tanto com os inteiros quanto com os pontos
flutuantes:
• + : Soma;
• - : Subtração;
• * : Multiplicação;
• / : Divisão;
• ++ : Incremento;
• – : Decremento.
Já o seguinte operador só tem serventia no âmbito dos números inteiros:
% : Resto de divisão entre dois inteiros.
Vamos falar um pouco sobre aridade. A aridade é um conceito que trata da quantidade de
parâmetros que uma determinada operação envolve. Em alguns casos, precisamos de apenas
um parâmetro para executar uma operação, como a seguinte: x = -y. Para poder saber correta-
mente o que está sendo atribuído, precisamos saber apenas o valor de y, e o operador ’-’ está
sendo aplicado apenas ao y. Por esse motivo dizemos que ele é um operador unário. Já os
outros operadores conhecidos são chamados de binários porque precisam de dois parâmetros
para serem corretamente definidos. Exemplo:
x = y + 2.
Nesse caso precisamos saber o valor da variável y e o valor do número 2, para corretamente
definir o valor que vai ser atribuído. Esse mesmo conceito pode ser aplicado a funções, por isso
é importante entendê-lo bem.
Sempre que fizermos uma atribuição em que a variável de destino é um inteiro, o número
que sendo atribuído é convertido em um inteiro, mas não arredondado; a parte decimal é apenas
desconsiderada. Para exemplificar veja o seguinte exemplo:
#include <stdio.h>
int main() {
int intNumero1=0, intNumero2;
float floatNumero1=0.5, floatNumero2;
printf("intNumero1=%d e floatNumero1=%fn",intNumero1, floatNumero1);
intNumero2 = intNumero1 + floatNumero1;
printf("inteiro = inteiro + flutuante: %dnn",intNumero2);
intNumero1 = 1;
floatNumero1 = 2.5;
37
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
printf("intNumero1=%d e floatNumero1=%fn",intNumero1, floatNumero1);
intNumero2 = intNumero1 * floatNumero1;
printf("inteiro = inteiro * flutuante: %dnn",intNumero2);
intNumero1 = 10;
floatNumero1 = 3;
printf("intNumero1=%d e floatNumero1=%fn",intNumero1, floatNumero1);
intNumero2 = intNumero1 / floatNumero1;
printf("inteiro = inteiro / futuante: %dnn",intNumero2);
return(0);
}
Os operadores de incremento e decremento são operadores unários, ou seja, precisam de
apenas um parâmetro para serem corretamente utilizados. Eles não implementam uma funci-
onalidade nova na linguagem, mas facilitam uma operação que é extremamente comum, a de
aumentar e diminuir uma variável em 1. Por exemplo:
intNumero1 = 1;
intNumero1++;
O valor contido na variável x agora é 2. A seguinte operação tem o mesmo efeito:
intNumero1 = 1;
++intNumero1;
Utilizados assim, os dois métodos fazem a mesma coisa, mas é bom evitar o uso desses mé-
todos com o mesmo objetivo porque nos casos mais freqüentemente utilizados os dois métodos
são essencialmente diferentes:
intNumero1 = 1;
intNumero2 = 1;
intNumero1 = intNumero2++;
/* Nesse ponto temos que intNumero1=2 e intNumero2=1. */
intNumero1 = 1;
intNumero2 = 1;
intNumero1 = ++intNumero2;
/* Agora temos que intNumero1=2 e intNumero2=2. Isto acontece porque da primeira vez,
apenas passamos o valor intNumero2+1 para a variável intNumero1. No segundo método,
primeiro incrementamos a variável intNumero2, para depois passar o seu valor para a
variável intNumero1 */
38
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
Métodos interessantes de atribuição
As formas de atribuição que vamos ver agora são muito elegantes, e devem ser utilizadas
quando possível. Com elas o nosso código fica mais enchuto, mais polido e mais legível. Vamos
lá!
varNumero1 += varNumero2 equivale à varNumero1 = varNumero1 + varNumero2
varNumero1 -= varNumero2 equivale à varNumero1 = varNumero1 - varNumero2
varNumero1 *= varNumero2 equivale à varNumero1 = varNumero1 * varNumero2
varNumero1 /= varNumero2 equivale à varNumero1 = varNumero1 / varNumero2
Essas atribuições funcionam como se fossem auto atribuições. As variáveis utilizam elas
mesmo e mais uma variável para determinar o seu novo valor. Estas atribuição são especialmente
úteis quando percebemos que o mesmo valor é utilizado de alguma forma, por exemplo:
float floatValorAplicado = 700;
float floatJuros = 0.0079;
int intNumMeses = 10;
int intContador;
for (intContador=0 ; intContador < intNumMeses ; intContador+=1)
floatValorAplicado += floatValorAplicado * floatJuros;
Como podemos ver, utilizamos duas vezes as atribuições elegantes. Na primeira vez, vimos
que intContador++ equivale à intContador+=1 que equivale à intContador = intContador +
1. Na segunda, podemos ver que floatValorAplicado += floatValorAplicado * floatJuros equi-
vale à floatValorAplicado = floatValorAplicado + floatValorAplicado * floatJuros. É uma boa
economia de código, certo?
Vamos ver agora o último método interessante de atribuição, que também torna o código mais
elegante, legível e enxuto:
intNumero1 = intNumero2 = intNumero3 = 4;
O que acontece aqui é que todas as três variáveis vão receber o valor 4. É como se a atribui-
ção fosse viajando pela instrução da direita para a esquerda. Pense nas atribuições de incremento
e decremento (x++) desta forma, como uma viajem da direita para a esquerda. Facilita vermos
como essas execuções funcionam.
3.2.4 Tipos de dados
Para utilizar uma variável, precisamos levar em consideração os seguintes aspectos:
• Escolher um nome claro e conciso para a variável;
• Escolher a área de atuação da variável (veja "regras de escopo"nas próximas páginas);
• Escolher qual o TIPO da variável será necessária para um dado.
Existem vários tipos de dados em C. Todos eles são palavras reservadas. O C é bem flexível
e possibilita a criação de novos tipos baseando nos tipos elementares (iremos ver isso nas lições
seguintes).
Os tipos elementares da linguagem C são:
39
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
• char: tipo caractere. Exemplos são ’a’, ’b’, ’x’... São os símbolos do nosso alfabeto mais os
outros representáveis com 1 Byte (256 elementos ao todo, incluindo os "dígitos numéricos",
’@’, ’#’, etc). No C, usamos o apóstrofe (’) para indicar que um símbolo deve ser tratado
como um conteúdo de uma varíável do tipo "char". Este tipo pode ser usado também como
um subconjunto do tipo "int"(afinal, em baixo nível os caracteres são números - seqüência
de bits);
• int: número inteiro;
• float: um número real. Significa "ponto flutuante", indicando que o ponto decimal (ou seja,
a precisão) é variável de acordo com a grandeza do número (se um número "float"é grande,
sua precisão precisa ser menor; se pequeno, sua precisão pode ser maior);
• double: número real extendido, ou "float"com dupla precisão. Pode representar um conjunto
maior do que o float;
• void: tipo especial que indica "nenhum tipo". Pode ser utilizado para simular um tipo univer-
sal.
Podemos ter também um conjunto de modificadores de tipos. Eles são declarados antes do
nome do tipo (ex. unsigned short int - nesse caso, o "unsigned"e o "short"são os modificadores).
Veja abaixo os modificadores elementares:
• signed: usado para int e char. Indica que os números negativos devem ser considerados.
É o default, podendo ser omitido;
• unsigned: usado para int e char. Indica que números negativos devem ser desconsidera-
dos. Permite que números positivos maiores possam ser armazenados nas variáveis (em
contrapartida, números negativos não poderão ser armazenados);
• short: usado para int. Indica que a variável deve usar menor ou igual quantidade de bits de
armazenamento do que o convencional;
• long: usado para o int. Indica que a variável deve usar menor ou igual quantidade de bits
de armazenamento do que o convencional.
Existem também os qualificadores de tipos. Eles são freqüentemente utilizados para otimiza-
ção do programa. Seu uso básico é:
<qualificador> <declaração>
Onde <declaração> pode ser uma declaração de variável (como unsigned short int i = 0;)
ou de função.
Os principais qualificadores são:
• auto: indica ao compilador que o objeto (variável ou função) declarada a seguir deve ter seu
escopo restrito ao bloco que ela foi declarada (no caso de uma variável, indica que não deve
ser visível fora do ""e em que ela foi declarada). Esse qualificador é raramente utilizado,
pois é o padrão na linguagem C;
40
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
• extern: indica que o objeto declarado a seguir (variável ou função) já foi declarado fora
do bloco (seja, fora do ""e ou até em um arquivo diferente) e que o objeto previamente
declarado deve ser usado no seu lugar. É útil quando diversos arquivos fontes são usados
para um mesmo programa;
• register: indica que a variável declarada a seguir deve estar presente em um armazena-
mento temporário mais veloz o possível. Antigamente, esse qualificador indicava que a
variável deve estar presente no registrador da CPU, mas atualmente ele só indica que a
varíavel deve estar no dispositivo mais veloz e utilizável no momento;
• volatile: indica que a variável a seguir pode ter seu conteúdo alterado por um fator ex-
terno ao programa (ex. Sistema Operacional, processos concorrentes, threads paralelos,
interrupções do programa, etc). São úteis nos seguintes casos:
– o utilizar como um objeto que é uma porta de entrada/saída mapeada em memória;
– o utilizar o objeto entre diversos processos concorrentes (quando diversos programas
em execução devem utilizar uma mesma variável ou porção da memória);
– o quando um objeto terá seu conteúdo alterado com um serviço de interrupção (ex.
o famoso comando "kill"envia um sinal de interrupção para terminar um processo em
execução).
Como podem ver nas explicações acima, esses qualificadores de tipos/variáveis são usados
para gerar programas avançados e seu uso será explicado mais adiante.
3.2.5 Constantes
Vamos tratar rapidamente da utilização de constantes em programas feitos em C. A utilização
de constantes é uma técnica muito importante na linguagem C, que torna os programa bem mais
legíveis e mais polidos fazendo com que qualquer alteração seja bem mais simples de fazer sem
a necessidade de procurar, às vezes por mais de uma hora, o bloco de código em que a variável
está para que ela seja alterada.
Para exemplificar, imagine que você fez um programa para uma empresa que possua três
departamentos. Você precisa manter o cadastro de todos os funcionários desses departamentos
e mais algumas tarefas relacionadas. Imagine agora que você vai vender esse software para uma
segunda empresa, sendo que esta precisa organizar a ficha de todos os funcionários dos cinco
departamentos da empresa. Para preparar o programa para essa segunda empresa, você vai
ter que procurar todas as ocorrências das variáveis que controlam o número de departamentos
e alterar todas. A não alteração de uma ou mais aparições dessas variáveis fazerá com que o
programa funcione de forma não planejada, gerando reclamações por parte dos clientes. Se ao
invés de utilizar uma ou mais variáveis, você utilizar apenas uma constante que é utilizada em
todo o programa e se a especificação da constante estiver no começo do programa, tudo que
você precisa fazer para vender o software para a segunda empresa é trocar o valor da constante.
Simples, não?
#include <stdio.h>
#define NUM_DEPT 4
int main() {
41
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
comando1;
comando2;
...
for (intDept = 0 ; intDept < NUM_DEPT ; intDept++) {codigo}
}
E assim constantes podem ser utilizadas para praticamente qualquer variável, inclusive stings.
Por exemplo:
#define STR_ERRO404 "A página não pode ser encontrada. Verifique o endereço e tente
novamente"
#define ERRO_PAGINA_NAO_ENCONTRADA 404
#define PI 3.1415
E assim as constantes se tornam estruturas imprescindíveis no cotidiano de um programador.
Utilize os conhecimentos que você já agregou e escreva alguns programas utilizando constantes.
Tomando o cuidado de não exagerar, utilize constantes sempre que possível, isto é, sempre que
você perceber que está utilizando o mesmo valor várias vezes. Nesses casos, o uso de uma
constante é recomendável.
3.3 Elementos léxicos e sintáticos da linguagem C, parte 2
3.3.1 Introdução às funções
Já iremos apresentar aqui as "funções"para vocês. Na verdade, as funções são um conceito
relativamente avançado, mas decidimos mostrar já neste ponto, pois são o núcleo dos programas
escritos em C (podemos dizer que um programa em C é um conjunto de funções, pois não há
como existir um programa em C sem uma função).
Como o nome diz, funções são "coisas"que desenvolvem tarefas. Brilhante... perplexo
Funções são caixas pretas, onde você passa algum tipo de dado e espera receber algum
tipo de saída. Explicando técnicamente, são módulos ou blocos de código que executam uma
determinada tarefa. Essa é a melhor definição. Ele é carregado somente uma vez e é usado
diversas vezes durante a execução do programa. Elas são o núcleo da sintaxe da linguagem C.
Os exemplos abordados nesta página utilizam conceitos que ainda não foram apresentados
neste curso. Ainda não se preocupe com os exemplos, pois serão mais interpretáveis futuramente
(quando todos os elementos léxicos/sintáticos da linguagem forem apresentados).
Para que servem elas?
As tais funções existem por dois motivos básicos:
• depuração de erros - quando se quebra um problema em pedaços menores, fica mais fácil
detectar onde pode existir um problema;
42
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
• reutilização - é visível que grande parte dos códigos que existem em um programa são
repetidos, só se diferenciando as variáveis que são passadas a eles.
Expliquemos então usando duas situações hipotéticas. A primeira, eu tenho que montar um
carro. Posso fazer uma máquina que eu passe todas as peças e ela me retorne o resultado.
Ou posso criar uma máquina que gerencie várias outras pequenas que desempenham tarefas
diferentes que, juntando-as, eu obtenho o carro pronto. Intuitivamente, gostaríamos da primeira,
mas devemos pensar que uma grande caixa preta é pior de se depurar do que várias outras
pequenas e de tarefas específicas. Imagine se acontece algum problema na caixa preta grande,
teríamos que abri-la toda, mexer em várias coisas e tentar chegar a uma conclusão em relação ao
problema. Já em um monte de caixas pequenas especializadas, detectaríamos o problema muito
mais facilmente, só pelas tarefas que elas realizam. Podemos citar não só questão de problemas,
como performance, entendimento e confiabilidade.
Outra situação. Imagine que eu precise fazer uma calculadora. Eu poderia fazer um conjunto
de operações (função), que em um bolo de código calculasse todos os tipos de operações mate-
máticas desejáveis em minha calculadora no momento. Agora pense, depois de 1 ano, eu preciso
de 2 operações matemáticas das 15 que minha calculadora antiga fazia, o que fazer ? Agregar o
bolo de código com 15 funções, 13 delas desnecessárias? A modularização serve para o reapro-
veitamento de código, devemos chegar a pedaços razoáveis e especializados de código que nos
resolvam problemas e que possamos utilizá-los depois.
Lembre-se, isso é uma prática não muito fácil, depende da experiência do profissional e como
ele faz a análise inicial do problema, quebrando-os em menores pedaços e chegando a módulos
pequenos e ao mesmo tempo usuais.
Resumindo, o uso de funções:
• economiza memória e aumenta a legibilidade do programa;
• melhora a estruturação, facilitando a depuração e a reutilização.
Nomes
Bem, podemos dar nomes às funções assim como em variáveis. Letras de A até Z, sem
preocupação de maiúscula/minúscula, de 0 a 9 e com underscore (aquele menos achatado, "_").
Precisa começar por caracteres ou underscore.
É "case sensitive", ou seja, funções com o mesmo nome, mas letras diferentes (em case) não
são consideradas iguais. Podemos exemplificar: esta_e_uma_funcao e Esta_e_uma_funcao, o
"E"("e") é diferente!
A estrutura de uma função
A estrutura básica de uma função é:
tiponomeDaFuncao ( tipo1parametro1, tipo2parametro2 , ... ) { código1; . . . códigoN; }
OBS: Elementos sublinhados podem ser substituídos por algum elemento sintático da lingua-
gem (exemplo: tipo pode ser substituído por int, que é um elemento sintático de tipo de dado no
C).
A cara de uma função é basicamente essa, veja abaixo para um exemplo:
43
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
void imprimeSoma ( int fator1 , int fator2 ) {
int total;
total = fator1 + fator2;
printf ("A soma vale: %d",total);
}
Ignore a palavra void por enquanto. Ela somente indica que a função não tem tipo (isso indica
que a função não tem valor de retorno - veja "tipo de funções"adiante). Quando chamo a função
usando o comando imprimeSoma(5,3); , eu recebo a mensagem da adição de 5 por 3, e retorno
ao meu programa. Conseguiu materializar?
Note que as chaves (o "{"e o "}") delimitam o que faz parte da função (bloco) e o que não o é.
A função main()
A função main() é a função principal de um programa. Ou seja, todo programa tem que ter a
função main(), caso contrário o compilador reclama e não gera o executável.
Um programa começa executando a função main() e termina quando a função main() termina.
Porém, dentro da função main() você pode chamar (executar) outras funções. Falaremos mais
sobre o main() adiante.
O ponto inicial de execução do programa é chamado de "entry point", logo, a função main() é
o entry point de qualquer programa escrito na linguagem C.
Ela pode retornar um valor de tipo int. Ou seja, retorna um número, em geral para o sis-
tema operacional, com o código de sucesso ou indicando qual o erro (número do erro) ocorreu
durante a execução do programa. O número de erro retornado pelo main() é conhecido pelos
programadores como o "condition code".
A função main() pode ter as seguintes estruturas:
• int main()
• int main (int argc , char *argv[])
As estruturas acima são as mais aceitas como padrão. Adicionalmente, muitos compilado-
res aceitam o tipo de retorno do main() omitido (ou seja, o "int"seria desnecessário) ou como
"void"(sem tipo), mas as construções da lista acima são mais recomendadas para maior portabi-
lidade (capacidade de rodar/compilar seu programa em diversas plataformas).
A função main() aceita dois argumentos (parâmetros entre parênteses). Eles são parâmetros
passados pelo sistema operacional quando os programas são ativados. Por exemplo, no terminal
de comando do Linux você pode digitar o comando ls -l. Nesse caso, o ls seria o nome do
programa e o -l seria o parâmetro que o sistema operacional repassará para o programa fazer o
devido tratamento. Os parâmetros do main() representam esses argumentos.
Veja abaixo para uma breve descrição desses parâmetros:
• argc: é do tipo inteiro (numeral). Indica a quantidade de argumentos que foram repassados
pelo sistema operacional, ou seja, indica a quantidade de elementos contidos no vetor argv.
Seu valor é sempre maior ou igual à 1 (um), pois o próprio nome do programa compilado é
considerado como um argumento.
• argv: é um vetor de strings (string é uma palavra ou um conjunto de letras/caracteres). Eles
contêm todos os argumentos repassados pelo sistema operacional. O primeiro elemento (o
elemento 0 - zero) é sempre o nome do próprio programa executável.
44
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
Esses parâmetros são úteis para fazer um programa que opere de forma distinta dependendo
do que o usuário tem passado no terminal de comando. Ainda não se preocupe muito com o
uso correto desses parâmetros. Como eles usam vetores (conceito ainda não explicado detalha-
damente), você não tem a obrigação de saber utilizá-los neste momento. Basta saber que um
mecanismo tão útil já existe na linguagem C.
Chamando funções
Bem, podemos chamar (executar) as funções do ponto que desejamos, desde que ela já tenha
sido declarada. Ela desvia o fluxo do programa, por exemplo:
int main() {
int a=10,b=3;
ação1;
ação2;
imprimirSoma(a,b); ação3;
}
Nota: neste exemplo ação 1, 2 e 3, podem ser quaisquer comandos (Até mesmo outra
função).
O programa desviará o fluxo na chamada da função "imprimirSoma", logo após a "ação2". Isto
suspenderá temporariamente a execução do programa para poder executar a função diminuir, até
que a mesma termine (retorne).
Tipos de funções
Existem basicamente dois tipos de funções. Aquelas que retornam alguma coisa a quem a
chamou e aquelas que não retornam nada.
Começando pelas que não retornam, elas simplesmente realizam tarefas, como o exemplo
anterior. Ela faz uma série de passos e retorna o fluxo ao programa principal, sem interferir em
nada em sua execução, a não ser pelo tempo de execução, saída na tela e mudanças em alguns
dados compartilhados.
Outra opção são funções que retornam um valor de um tipo. Lembre-se, como declaramos
uma função? tipoX nome(tipo1 var1,tipo2 var2); e assim por diante. Ou seja, o tipoX equivale ao
tipo de dado que a função vai retornar. Vamos entender:
int diminuir(int parcela1, int parcela2) {
int total;
total = parcela1 - parcela2;
return total;
}
...
int main() {
int a=10,b=3,total;
45
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
ação1;
ação2;
total = diminuir(a,b);
printf ("A subtracao vale: %d",total); ação3;
}
O efeito é exatamente o mesmo, só que agora o programa principal é que estará jogando
a mensagem na tela e a variável do programa, chamada total, que terá o valor da subtração
(resultado, tipo int, retornado de diminuir(a,b)). Aos poucos vamos juntando as peças.
Vale ressaltar, o que determinou a saída da função, no caso, foi a chamada ao comando
return (que é um comando de desvio), que interrompe o fluxo do bloco que está sendo executado
(saindo deste bloco) e volta aquele imediatamente anterior. Não é necessário chegar até a última
linha da função, pois o return pode estar na 1a, 2a, onde quer que seja.
3.3.2 Bibliotecas
Já que mostramos o que é uma função, aproveitamos para apresentarmos o que é uma bibli-
oteca.
Você pode entender as bibliotecas como um conjunto de declarações (seja de funções, tipos,
variáveis, etc) que foram criadas de forma estratégica para possibilitar sua utilização em diversos
programas.
Como dito anteriormente, funções são uma forma genérica de resolvermos problemas. É
como uma caixa preta. Você passa os dados para ela e recebe o resultado.
Supondo que tenho uma função de realizar soma, eu só me preocupo em passar para ela
os números que desejo ver somado e a função se preocupa em me entregar o resultado, o que
acontece lá dentro é problema dela.
Através deste método, dividimos os programas em pedaços de funcionalidades, genéricos e
pequenos de preferência, com intuito de utiliza-lo futuramente em situações que sejam conveni-
entes.
Assim como soma, pode-se fazer uma função de subtração, multiplicação, divisão e várias
outras e juntando-as se cria a tal famosa biblioteca. As bibliotecas em si podem ser utilizadas por
vários programas.
Só para esclarecer, tenho uma biblioteca que desenha botões em janelas(GTK faz isso). Na
hora que se for criar uma agenda, por exemplo, utilizo as funções desta biblioteca sem precisar
rescrever estas mesmas funções neste programa. Isso pouparia meu tempo e espaço de HD
(apesar de um código fonte não ser algo que ocupe TANTO espaço).
Veja abaixo alguns exemplos de bibliotecas que podem ser encontradas sem muito esforço
em distribuições Debian. Eles se encontram na pasta /usr/include.
• aio.h
• expat_config.h
• jerror.h
• printf.h
46
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
• termio.h
• aliases.h
• expat_external.h
• jmorecfg.h
• pthread.h
• termios.h
• alloca.h
• expat.h
• jpegint.h
• pty.h
• tgmath.h
• a.out.h
• fcntl.h
• jpeglib.h
• pwd.h
• thread_db.h
• argp.h
• features.h
• langinfo.h
• re_comp.h
• tiffconf.h
• argz.h
• fenv.h
• lastlog.h
• regex.h
• tiff.h
• ar.h
• FlexLexer.h
• libgen.h
47
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
• regexp.h
• tiffio.h
• assert.h
• fmtmsg.h
• libintl.h
• resolv.h
• tiffvers.h
• autosprintf.h
• fnmatch.h
• libio.h
• sched.h
• time.h
• byteswap.h
• fpu_control.h
• limits.h
• search.h
• tls.h
• complex.h
• fstab.h
• link.h
• semaphore.h
• ttyent.h
• cpio.h
• ft2build.h
• locale.h
• setjmp.h
• ucontext.h
• crypt.h
• fts.h
48
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
• malloc.h
• sgtty.h
• ulimit.h
• ctype.h
• ftw.h
• math.h
• shadow.h
• unistd.h
• dialog.h
• _G_config.h
• mcheck.h
• signal.h
• ustat.h
• dirent.h
• gconv.h
• memory.h
• spawn.h
• utime.h
• dlfcn.h
• getopt.h
• mntent.h
• stab.h
• utmp.h
• dlg_colors.h
• gettext-po.h
• monetary.h
• stdint.h
• utmpx.h
• dlg_config.h
49
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
• glob.h
• mqueue.h
• stdio_ext.h
• values.h
• dlg_keys.h
• gnu-versions.h
• netdb.h
• stdio.h
• wait.h
• dts.h
• grp.h
• nl_types.h
• stdlib.h
• wchar.h
• elf.h
• gsm.h
• nss.h
• string.h
• wctype.h
• endian.h
• iconv.h
• obstack.h
• strings.h
• wordexp.h
• envz.h
• ieee754.h
• oss-redir.h
• stropts.h
• xlocale.h
50
CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF
• err.h
• ifaddrs.h
• paths.h
• syscall.h
• zconf.h
• errno.h
• initreq.h
• pngconf.h
• sysexits.h
• zlib.h
• error.h
• inttypes.h
• png.h
• syslog.h
• execinfo.h
• jconfig.h
• poll.h
• tar.h
Claro, você não precisa saber de todas elas. O .h é a extensão do arquivo cabeçalho que
contém as definições da biblioteca - header em inglês. Os arquivos cabeçalho são arquivos
texto (você pode abri-lo em qualquer editor de texto para lê-lo), mas conterão somente declara-
ções/protótipos das funções (são somente "assinaturas"das funções, ou seja, funções sem corpo)
e a implementação dessas funções (os códigos em C) geralmente estarão em outros arquivos
(que raramente são textos). Técnicas de como se fazer isso (criar bibliotecas que contenham o
código em outros arquivos) serão tratadas mais adiante.
Em geral, utilizamos algumas funções já prontas para fazer determinadas tarefas que são
consideradas básicas. O programador não costuma fazer uma rotina que leia diretamente do
teclado ou imprima na tela um caractere.
Isso já existe e é bem implementado (uma coisa interessante de se entender em programação
é: o que já existe de bem feito e pode ser utilizado deve ser utilizado). Seu sistema não será
menos digno ou pior se você utilizar uma rotina que todo mundo utiliza em vez de ter a sua
própria. O que importa é a finalidade do programa e o quão bem implementado ele esteja.
Tais funções, que falamos básicas, fazem parte da biblioteca C padrão (as que geralmente
começam com a seqüência "std", que significa standard ou "padrão"). Todo compilador C a
possui e ele faz parte da padronização ANSI C. Seu compilador, independente do sistema que
você utiliza, deve possuir essas bibliotecas (ou seria um furo inquestionável). Outras bibliotecas
51
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c
Linguagem c

Mais conteúdo relacionado

Mais procurados

Quanta
QuantaQuanta
QuantaTiago
 
Apostila cdtc dotproject
Apostila cdtc dotprojectApostila cdtc dotproject
Apostila cdtc dotprojectTiago
 
Manipulando pacotes
Manipulando pacotesManipulando pacotes
Manipulando pacotesTiago
 
Shell script
Shell scriptShell script
Shell scriptTiago
 
De javaparapython
De javaparapythonDe javaparapython
De javaparapythonTiago
 
Screen
ScreenScreen
ScreenTiago
 
Javascript
JavascriptJavascript
JavascriptTiago
 
Selinux
SelinuxSelinux
SelinuxTiago
 
Squid guard
Squid guardSquid guard
Squid guardTiago
 
Drivers de Dispositivos Linux
Drivers de Dispositivos LinuxDrivers de Dispositivos Linux
Drivers de Dispositivos LinuxHudson Augusto
 
Programacao gtk
Programacao gtkProgramacao gtk
Programacao gtkTiago
 
Tcl tk
Tcl tkTcl tk
Tcl tkTiago
 
BrOffice - Apostila completa
BrOffice - Apostila completaBrOffice - Apostila completa
BrOffice - Apostila completaVera Mln Silva
 
Iptables
IptablesIptables
IptablesTiago
 
Programacao cpp
Programacao cppProgramacao cpp
Programacao cppTiago
 

Mais procurados (20)

Samba
SambaSamba
Samba
 
Sql
SqlSql
Sql
 
Quanta
QuantaQuanta
Quanta
 
Apostila cdtc dotproject
Apostila cdtc dotprojectApostila cdtc dotproject
Apostila cdtc dotproject
 
Manipulando pacotes
Manipulando pacotesManipulando pacotes
Manipulando pacotes
 
Zope
ZopeZope
Zope
 
Shell script
Shell scriptShell script
Shell script
 
De javaparapython
De javaparapythonDe javaparapython
De javaparapython
 
Screen
ScreenScreen
Screen
 
Squid
SquidSquid
Squid
 
Javascript
JavascriptJavascript
Javascript
 
Selinux
SelinuxSelinux
Selinux
 
Qemu
QemuQemu
Qemu
 
Squid guard
Squid guardSquid guard
Squid guard
 
Drivers de Dispositivos Linux
Drivers de Dispositivos LinuxDrivers de Dispositivos Linux
Drivers de Dispositivos Linux
 
Programacao gtk
Programacao gtkProgramacao gtk
Programacao gtk
 
Tcl tk
Tcl tkTcl tk
Tcl tk
 
BrOffice - Apostila completa
BrOffice - Apostila completaBrOffice - Apostila completa
BrOffice - Apostila completa
 
Iptables
IptablesIptables
Iptables
 
Programacao cpp
Programacao cppProgramacao cpp
Programacao cpp
 

Semelhante a Linguagem c

Java basico
Java basicoJava basico
Java basicoTiago
 
Planejamento em desenvolvimento_de_sistemas
Planejamento em desenvolvimento_de_sistemasPlanejamento em desenvolvimento_de_sistemas
Planejamento em desenvolvimento_de_sistemasTiago
 
Monitoramento
MonitoramentoMonitoramento
MonitoramentoTiago
 
Intro micro hardware
Intro micro hardwareIntro micro hardware
Intro micro hardwareTiago
 
Open solaris
Open solarisOpen solaris
Open solarisTiago
 
Drivers de dispostivos_linux
Drivers de dispostivos_linuxDrivers de dispostivos_linux
Drivers de dispostivos_linuxTiago
 
Jspservlets
JspservletsJspservlets
JspservletsTiago
 
Pascal
PascalPascal
PascalTiago
 
Linguagem ruby
Linguagem rubyLinguagem ruby
Linguagem rubyTiago
 
Dissertação Mestrado
Dissertação MestradoDissertação Mestrado
Dissertação MestradoJoel Carvalho
 
Intro redes
Intro redesIntro redes
Intro redesTiago
 
Inst configdebian
Inst configdebianInst configdebian
Inst configdebianTiago
 
Postgre sql
Postgre sqlPostgre sql
Postgre sqlTiago
 
Programação Orientada a Objetos com Java
Programação Orientada a Objetos com JavaProgramação Orientada a Objetos com Java
Programação Orientada a Objetos com JavaJooMarcos614503
 

Semelhante a Linguagem c (20)

Java basico
Java basicoJava basico
Java basico
 
Planejamento em desenvolvimento_de_sistemas
Planejamento em desenvolvimento_de_sistemasPlanejamento em desenvolvimento_de_sistemas
Planejamento em desenvolvimento_de_sistemas
 
Monitoramento
MonitoramentoMonitoramento
Monitoramento
 
Intro micro hardware
Intro micro hardwareIntro micro hardware
Intro micro hardware
 
Open solaris
Open solarisOpen solaris
Open solaris
 
Drivers de dispostivos_linux
Drivers de dispostivos_linuxDrivers de dispostivos_linux
Drivers de dispostivos_linux
 
Introdução micro computador
Introdução micro computadorIntrodução micro computador
Introdução micro computador
 
Zope
ZopeZope
Zope
 
Jspservlets
JspservletsJspservlets
Jspservlets
 
Pascal
PascalPascal
Pascal
 
Ltsp
LtspLtsp
Ltsp
 
Linguagem ruby
Linguagem rubyLinguagem ruby
Linguagem ruby
 
Dissertação Mestrado
Dissertação MestradoDissertação Mestrado
Dissertação Mestrado
 
Jdbc
JdbcJdbc
Jdbc
 
Intro redes
Intro redesIntro redes
Intro redes
 
Inst configdebian
Inst configdebianInst configdebian
Inst configdebian
 
Perl
PerlPerl
Perl
 
Poojava
PoojavaPoojava
Poojava
 
Postgre sql
Postgre sqlPostgre sql
Postgre sql
 
Programação Orientada a Objetos com Java
Programação Orientada a Objetos com JavaProgramação Orientada a Objetos com Java
Programação Orientada a Objetos com Java
 

Mais de Tiago

Programacao php moodle
Programacao php moodleProgramacao php moodle
Programacao php moodleTiago
 
6572501 ldp-apostila-de-turbo-pascal
6572501 ldp-apostila-de-turbo-pascal6572501 ldp-apostila-de-turbo-pascal
6572501 ldp-apostila-de-turbo-pascalTiago
 
Guia rapido de_pascal
Guia rapido de_pascalGuia rapido de_pascal
Guia rapido de_pascalTiago
 
Python bge
Python bgePython bge
Python bgeTiago
 
Curso python
Curso pythonCurso python
Curso pythonTiago
 
Curso python
Curso pythonCurso python
Curso pythonTiago
 
Aula 01 python
Aula 01 pythonAula 01 python
Aula 01 pythonTiago
 
Threading in c_sharp
Threading in c_sharpThreading in c_sharp
Threading in c_sharpTiago
 
Retirar acentos de_determinado_texto_em_c_sharp
Retirar acentos de_determinado_texto_em_c_sharpRetirar acentos de_determinado_texto_em_c_sharp
Retirar acentos de_determinado_texto_em_c_sharpTiago
 
Remover caracteres especiais_texto_em_c_sharp
Remover caracteres especiais_texto_em_c_sharpRemover caracteres especiais_texto_em_c_sharp
Remover caracteres especiais_texto_em_c_sharpTiago
 
Obter ip da_internet_em_c_sharp
Obter ip da_internet_em_c_sharpObter ip da_internet_em_c_sharp
Obter ip da_internet_em_c_sharpTiago
 
Metodo using no_c_sharp
Metodo using no_c_sharpMetodo using no_c_sharp
Metodo using no_c_sharpTiago
 
Introdução ao c# para iniciantes
Introdução ao c# para iniciantesIntrodução ao c# para iniciantes
Introdução ao c# para iniciantesTiago
 
Interfaces windows em c sharp
Interfaces windows em c sharpInterfaces windows em c sharp
Interfaces windows em c sharpTiago
 
Filestream sistema arquivos
Filestream  sistema arquivosFilestream  sistema arquivos
Filestream sistema arquivosTiago
 
Curso linux professor rafael
Curso linux professor rafaelCurso linux professor rafael
Curso linux professor rafaelTiago
 
Curso de shell
Curso de shellCurso de shell
Curso de shellTiago
 
Controle lpt em_c_sharp
Controle lpt em_c_sharpControle lpt em_c_sharp
Controle lpt em_c_sharpTiago
 
Classes csharp
Classes csharpClasses csharp
Classes csharpTiago
 
C# o basico
C#   o basicoC#   o basico
C# o basicoTiago
 

Mais de Tiago (20)

Programacao php moodle
Programacao php moodleProgramacao php moodle
Programacao php moodle
 
6572501 ldp-apostila-de-turbo-pascal
6572501 ldp-apostila-de-turbo-pascal6572501 ldp-apostila-de-turbo-pascal
6572501 ldp-apostila-de-turbo-pascal
 
Guia rapido de_pascal
Guia rapido de_pascalGuia rapido de_pascal
Guia rapido de_pascal
 
Python bge
Python bgePython bge
Python bge
 
Curso python
Curso pythonCurso python
Curso python
 
Curso python
Curso pythonCurso python
Curso python
 
Aula 01 python
Aula 01 pythonAula 01 python
Aula 01 python
 
Threading in c_sharp
Threading in c_sharpThreading in c_sharp
Threading in c_sharp
 
Retirar acentos de_determinado_texto_em_c_sharp
Retirar acentos de_determinado_texto_em_c_sharpRetirar acentos de_determinado_texto_em_c_sharp
Retirar acentos de_determinado_texto_em_c_sharp
 
Remover caracteres especiais_texto_em_c_sharp
Remover caracteres especiais_texto_em_c_sharpRemover caracteres especiais_texto_em_c_sharp
Remover caracteres especiais_texto_em_c_sharp
 
Obter ip da_internet_em_c_sharp
Obter ip da_internet_em_c_sharpObter ip da_internet_em_c_sharp
Obter ip da_internet_em_c_sharp
 
Metodo using no_c_sharp
Metodo using no_c_sharpMetodo using no_c_sharp
Metodo using no_c_sharp
 
Introdução ao c# para iniciantes
Introdução ao c# para iniciantesIntrodução ao c# para iniciantes
Introdução ao c# para iniciantes
 
Interfaces windows em c sharp
Interfaces windows em c sharpInterfaces windows em c sharp
Interfaces windows em c sharp
 
Filestream sistema arquivos
Filestream  sistema arquivosFilestream  sistema arquivos
Filestream sistema arquivos
 
Curso linux professor rafael
Curso linux professor rafaelCurso linux professor rafael
Curso linux professor rafael
 
Curso de shell
Curso de shellCurso de shell
Curso de shell
 
Controle lpt em_c_sharp
Controle lpt em_c_sharpControle lpt em_c_sharp
Controle lpt em_c_sharp
 
Classes csharp
Classes csharpClasses csharp
Classes csharp
 
C# o basico
C#   o basicoC#   o basico
C# o basico
 

Último

Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.keislayyovera123
 
Orações subordinadas substantivas (andamento).pptx
Orações subordinadas substantivas (andamento).pptxOrações subordinadas substantivas (andamento).pptx
Orações subordinadas substantivas (andamento).pptxKtiaOliveira68
 
Programa de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades MotorasPrograma de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades MotorasCassio Meira Jr.
 
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptxSlides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptxLuizHenriquedeAlmeid6
 
Gerenciando a Aprendizagem Organizacional
Gerenciando a Aprendizagem OrganizacionalGerenciando a Aprendizagem Organizacional
Gerenciando a Aprendizagem OrganizacionalJacqueline Cerqueira
 
GÊNERO TEXTUAL - TIRINHAS - Charges - Cartum
GÊNERO TEXTUAL - TIRINHAS - Charges - CartumGÊNERO TEXTUAL - TIRINHAS - Charges - Cartum
GÊNERO TEXTUAL - TIRINHAS - Charges - CartumAugusto Costa
 
Slides 1 - O gênero textual entrevista.pptx
Slides 1 - O gênero textual entrevista.pptxSlides 1 - O gênero textual entrevista.pptx
Slides 1 - O gênero textual entrevista.pptxSilvana Silva
 
D9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptxD9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptxRonys4
 
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -Aline Santana
 
Universidade Empreendedora como uma Plataforma para o Bem comum
Universidade Empreendedora como uma Plataforma para o Bem comumUniversidade Empreendedora como uma Plataforma para o Bem comum
Universidade Empreendedora como uma Plataforma para o Bem comumPatrícia de Sá Freire, PhD. Eng.
 
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptxSlides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptxLuizHenriquedeAlmeid6
 
ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024Jeanoliveira597523
 
Bullying - Texto e cruzadinha
Bullying        -     Texto e cruzadinhaBullying        -     Texto e cruzadinha
Bullying - Texto e cruzadinhaMary Alvarenga
 
Pedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptxPedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptxleandropereira983288
 
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEM
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEMCOMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEM
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEMVanessaCavalcante37
 
trabalho wanda rocha ditadura
trabalho wanda rocha ditaduratrabalho wanda rocha ditadura
trabalho wanda rocha ditaduraAdryan Luiz
 
ALMANANHE DE BRINCADEIRAS - 500 atividades escolares
ALMANANHE DE BRINCADEIRAS - 500 atividades escolaresALMANANHE DE BRINCADEIRAS - 500 atividades escolares
ALMANANHE DE BRINCADEIRAS - 500 atividades escolaresLilianPiola
 

Último (20)

Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.
 
Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024
Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024
Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024
 
Orações subordinadas substantivas (andamento).pptx
Orações subordinadas substantivas (andamento).pptxOrações subordinadas substantivas (andamento).pptx
Orações subordinadas substantivas (andamento).pptx
 
Programa de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades MotorasPrograma de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades Motoras
 
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptxSlides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
Slides Lição 03, Central Gospel, O Arrebatamento, 1Tr24.pptx
 
Gerenciando a Aprendizagem Organizacional
Gerenciando a Aprendizagem OrganizacionalGerenciando a Aprendizagem Organizacional
Gerenciando a Aprendizagem Organizacional
 
GÊNERO TEXTUAL - TIRINHAS - Charges - Cartum
GÊNERO TEXTUAL - TIRINHAS - Charges - CartumGÊNERO TEXTUAL - TIRINHAS - Charges - Cartum
GÊNERO TEXTUAL - TIRINHAS - Charges - Cartum
 
Slides 1 - O gênero textual entrevista.pptx
Slides 1 - O gênero textual entrevista.pptxSlides 1 - O gênero textual entrevista.pptx
Slides 1 - O gênero textual entrevista.pptx
 
D9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptxD9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptx
 
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -
 
Universidade Empreendedora como uma Plataforma para o Bem comum
Universidade Empreendedora como uma Plataforma para o Bem comumUniversidade Empreendedora como uma Plataforma para o Bem comum
Universidade Empreendedora como uma Plataforma para o Bem comum
 
Bullying, sai pra lá
Bullying,  sai pra láBullying,  sai pra lá
Bullying, sai pra lá
 
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptxSlides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
 
ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024
 
Em tempo de Quaresma .
Em tempo de Quaresma                            .Em tempo de Quaresma                            .
Em tempo de Quaresma .
 
Bullying - Texto e cruzadinha
Bullying        -     Texto e cruzadinhaBullying        -     Texto e cruzadinha
Bullying - Texto e cruzadinha
 
Pedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptxPedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptx
 
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEM
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEMCOMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEM
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEM
 
trabalho wanda rocha ditadura
trabalho wanda rocha ditaduratrabalho wanda rocha ditadura
trabalho wanda rocha ditadura
 
ALMANANHE DE BRINCADEIRAS - 500 atividades escolares
ALMANANHE DE BRINCADEIRAS - 500 atividades escolaresALMANANHE DE BRINCADEIRAS - 500 atividades escolares
ALMANANHE DE BRINCADEIRAS - 500 atividades escolares
 

Linguagem c

  • 2. Sumário I Sobre essa Apostila 2 II Informações Básicas 4 III GNU Free Documentation License 9 IV A linguagem C 18 1 O que é a linguagem C? 19 2 Plano de ensino 20 2.1 Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.2 Público Alvo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.3 Pré-requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.4 Descrição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.5 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.6 Cronograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.7 Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.8 Avaliação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.9 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3 Introdução à linguagem C 23 3.1 Introdução teórica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.1.1 O que é a linguagem de programação C? . . . . . . . . . . . . . . . . . . . . 23 3.1.2 Quem realmente controla os programas? . . . . . . . . . . . . . . . . . . . . 24 3.1.3 Histórico da linguagem C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.1.4 Características . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.1.5 O compilador GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.1.6 Tipos de Erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.2 Elementos léxicos e sintáticos da linguagem C, parte 1 . . . . . . . . . . . . . . . . 32 3.2.1 Palavras Reservadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.2.2 Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.2.3 Operadores Aritméticos e de Atribuição . . . . . . . . . . . . . . . . . . . . . 35 3.2.4 Tipos de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.2.5 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.3 Elementos léxicos e sintáticos da linguagem C, parte 2 . . . . . . . . . . . . . . . . 41 1
  • 3. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 3.3.1 Introdução às funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.3.2 Bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.3.3 Operadores Lógicos e de Comparação . . . . . . . . . . . . . . . . . . . . . 52 3.3.4 Controle de Fluxo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 3.4 Elementos léxicos e sintáticos da linguagem C, parte 3 . . . . . . . . . . . . . . . . 60 3.4.1 Vetores e Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 3.4.2 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 3.4.3 Introdução ao uso de ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . 65 3.4.4 Casts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 4 Código estruturado em C e ponteiros 69 4.1 Manipulação de arquivos e entradas/saídas em C . . . . . . . . . . . . . . . . . . . 69 4.1.1 Entrada e saída com o teclado e o monitor . . . . . . . . . . . . . . . . . . . 69 4.1.2 Introdução à manipulação de arquivos . . . . . . . . . . . . . . . . . . . . . . 72 4.2 Recursividade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 4.2.1 Recursividade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 4.3 Manipulação de ponteiros e tipos avançados de dados . . . . . . . . . . . . . . . . . 79 4.3.1 Structs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 4.3.2 Alocação dinâmica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 5 Abstração de dados 88 5.1 Estruturas de dados, parte 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 5.1.1 Pilhas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 5.1.2 Filas encadeadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 5.1.3 Filas duplamente encadeadas . . . . . . . . . . . . . . . . . . . . . . . . . . 94 5.1.4 Filas circulares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.2 Estruturas de dados, parte 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 5.2.1 Árvores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 5.2.2 Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 6 Estruturação e manipulação avançada do código e dos arquivos 109 6.1 Dividindo seu programa em diversos arquivos fontes . . . . . . . . . . . . . . . . . . 109 6.1.1 Contole de inclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 6.1.2 Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 6.2 Manipulação avançada de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 6.2.1 Estrutura de dados e persistência . . . . . . . . . . . . . . . . . . . . . . . . 113 2
  • 4. Parte I Sobre essa Apostila 3
  • 5. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF Conteúdo O conteúdo dessa apostila é fruto da compilação de diversos materiais livres publicados na in- ternet, disponíveis em diversos sites ou originalmente produzido no CDTC (http://www.cdtc.org.br.) O formato original deste material bem como sua atualização está disponível dentro da licença GNU Free Documentation License, cujo teor integral encontra-se aqui reproduzido na seção de mesmo nome, tendo inclusive uma versão traduzida (não oficial). A revisão e alteração vem sendo realizada pelo CDTC (suporte@cdtc.org.br) desde outubro de 2006. Críticas e sugestões construtivas serão bem-vindas a qualquer hora. Autores A autoria deste é de responsabilidade de Fernando Machado Mendonça (fmachado@cdtc.org.br). O texto original faz parte do projeto Centro de Difusão de Tecnologia e Conhecimento que vêm sendo realizado pelo ITI (Instituto Nacional de Tecnologia da Informação) em conjunto com outros parceiros institucionais, e com as universidades federais brasileiras que tem produzido e utilizado Software Livre apoiando inclusive a comunidade Free Software junto a outras entidades no país. Informações adicionais podem ser obtidas através do email ouvidoria@cdtc.org.br, ou da home page da entidade, através da URL http://www.cdtc.org.br. Garantias O material contido nesta apostila é isento de garantias e o seu uso é de inteira responsabi- lidade do usuário/leitor. Os autores, bem como o ITI e seus parceiros, não se responsabilizam direta ou indiretamente por qualquer prejuízo oriundo da utilização do material aqui contido. Licença Copyright ©2006, Instituto Nacional de Tecnologia da Informação (cdtc@iti.gov.br) . Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Chapter being SOBRE ESSA APOS- TILA. A copy of the license is included in the section entitled GNU Free Documentation License. 4
  • 7. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF Sobre o CDTC Objetivo Geral O Projeto CDTC visa a promoção e o desenvolvimento de ações que incentivem a dissemina- ção de soluções que utilizem padrões abertos e não proprietários de tecnologia, em proveito do desenvolvimento social, cultural, político, tecnológico e econômico da sociedade brasileira. Objetivo Específico Auxiliar o Governo Federal na implantação do plano nacional de software não-proprietário e de código fonte aberto, identificando e mobilizando grupos de formadores de opinião dentre os servidores públicos e agentes políticos da União Federal, estimulando e incentivando o mercado nacional a adotar novos modelos de negócio da tecnologia da informação e de novos negócios de comunicação com base em software não-proprietário e de código fonte aberto, oferecendo treinamento específico para técnicos, profissionais de suporte e funcionários públicos usuários, criando grupos de funcionários públicos que irão treinar outros funcionários públicos e atuar como incentivadores e defensores dos produtos de software não proprietários e código fonte aberto, ofe- recendo conteúdo técnico on-line para serviços de suporte, ferramentas para desenvolvimento de produtos de software não proprietários e do seu código fonte livre, articulando redes de terceiros (dentro e fora do governo) fornecedoras de educação, pesquisa, desenvolvimento e teste de pro- dutos de software livre. Guia do aluno Neste guia, você terá reunidas uma série de informações importantes para que você comece seu curso. São elas: • Licenças para cópia de material disponível; • Os 10 mandamentos do aluno de Educação a Distância; • Como participar dos foruns e da wikipédia; • Primeiros passos. É muito importante que você entre em contato com TODAS estas informações, seguindo o roteiro acima. Licença Copyright ©2006, Instituto Nacional de Tecnologia da Informação (cdtc@iti.gov.br). 6
  • 8. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF É dada permissão para copiar, distribuir e/ou modificar este documento sob os termos da Licença de Documentação Livre GNU, Versão 1.1 ou qualquer versão posterior públicada pela Free Software Foundation; com o Capitulo Invariante SOBRE ESSA APOSTILA. Uma cópia da licença está inclusa na seção entitulada "Licença de Docu- mentação Livre GNU". Os 10 mandamentos do aluno de educação online • 1. Acesso à Internet: ter endereço eletrônico, um provedor e um equipamento adequado é pré-requisito para a participação nos cursos a distância; • 2. Habilidade e disposição para operar programas: ter conhecimentos básicos de Informá- tica é necessário para poder executar as tarefas; • 3. Vontade para aprender colaborativamente: interagir, ser participativo no ensino a distân- cia conta muitos pontos, pois irá colaborar para o processo ensino-aprendizagem pessoal, dos colegas e dos professores; • 4. Comportamentos compatíveis com a etiqueta: mostrar-se interessado em conhecer seus colegas de turma respeitando-os e se fazendo ser respeitado pelos mesmos; • 5. Organização pessoal: planejar e organizar tudo é fundamental para facilitar a sua revisão e a sua recuperação de materiais; • 6. Vontade para realizar as atividades no tempo correto: anotar todas as suas obrigações e realizá-las em tempo real; • 7. Curiosidade e abertura para inovações: aceitar novas idéias e inovar sempre; • 8. Flexibilidade e adaptação: requisitos necessário à mudança tecnológica, aprendizagens e descobertas; • 9. Objetividade em sua comunicação: comunicar-se de forma clara, breve e transparente é ponto - chave na comunicação pela Internet; • 10. Responsabilidade: ser responsável por seu próprio aprendizado. O ambiente virtual não controla a sua dedicação, mas reflete os resultados do seu esforço e da sua colaboração. Como participar dos fóruns e Wikipédia Você tem um problema e precisa de ajuda? Podemos te ajudar de 2 formas: A primeira é o uso dos fóruns de notícias e de dúvidas gerais que se distinguem pelo uso: . O fórum de notícias tem por objetivo disponibilizar um meio de acesso rápido a informações que sejam pertinentes ao curso (avisos, notícias). As mensagens postadas nele são enviadas a 7
  • 9. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF todos participantes. Assim, se o monitor ou algum outro participante tiver uma informação que interesse ao grupo, favor postá-la aqui. Porém, se o que você deseja é resolver alguma dúvida ou discutir algum tópico específico do curso. É recomendado que você faça uso do Fórum de dúvidas gerais que lhe dá recursos mais efetivos para esta prática. . O fórum de dúvidas gerais tem por objetivo disponibilizar um meio fácil, rápido e interativo para solucionar suas dúvidas e trocar experiências. As mensagens postadas nele são enviadas a todos participantes do curso. Assim, fica muito mais fácil obter respostas, já que todos podem ajudar. Se você receber uma mensagem com algum tópico que saiba responder, não se preocupe com a formalização ou a gramática. Responda! E não se esqueça de que antes de abrir um novo tópico é recomendável ver se a sua pergunta já foi feita por outro participante. A segunda forma se dá pelas Wikis: . Uma wiki é uma página web que pode ser editada colaborativamente, ou seja, qualquer par- ticipante pode inserir, editar, apagar textos. As versões antigas vão sendo arquivadas e podem ser recuperadas a qualquer momento que um dos participantes o desejar. Assim, ela oferece um ótimo suporte a processos de aprendizagem colaborativa. A maior wiki na web é o site "Wikipé- dia", uma experiência grandiosa de construção de uma enciclopédia de forma colaborativa, por pessoas de todas as partes do mundo. Acesse-a em português pelos links: • Página principal da Wiki - http://pt.wikipedia.org/wiki/ Agradecemos antecipadamente a sua colaboração com a aprendizagem do grupo! Primeiros Passos Para uma melhor aprendizagem é recomendável que você siga os seguintes passos: • Ler o Plano de Ensino e entender a que seu curso se dispõe a ensinar; • Ler a Ambientação do Moodle para aprender a navegar neste ambiente e se utilizar das ferramentas básicas do mesmo; • Entrar nas lições seguindo a seqüência descrita no Plano de Ensino; • Qualquer dúvida, reporte ao Fórum de Dúvidas Gerais. Perfil do Tutor Segue-se uma descrição do tutor ideal, baseada no feedback de alunos e de tutores. O tutor ideal é um modelo de excelência: é consistente, justo e profissional nos respectivos valores e atitudes, incentiva mas é honesto, imparcial, amável, positivo, respeitador, aceita as idéias dos estudantes, é paciente, pessoal, tolerante, apreciativo, compreensivo e pronto a ajudar. 8
  • 10. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF A classificação por um tutor desta natureza proporciona o melhor feedback possível, é crucial, e, para a maior parte dos alunos, constitui o ponto central do processo de aprendizagem.’ Este tutor ou instrutor: • fornece explicações claras acerca do que ele espera e do estilo de classificação que irá utilizar; • gosta que lhe façam perguntas adicionais; • identifica as nossas falhas, mas corrige-as amavelmente’, diz um estudante, ’e explica por- que motivo a classificação foi ou não foi atribuída’; • tece comentários completos e construtivos, mas de forma agradável (em contraste com um reparo de um estudante: ’os comentários deixam-nos com uma sensação de crítica, de ameaça e de nervossismo’) • dá uma ajuda complementar para encorajar um estudante em dificuldade; • esclarece pontos que não foram entendidos, ou corretamente aprendidos anteriormente; • ajuda o estudante a alcançar os seus objetivos; • é flexível quando necessário; • mostra um interesse genuíno em motivar os alunos (mesmo os principiantes e, por isso, talvez numa fase menos interessante para o tutor); • escreve todas as correções de forma legível e com um nível de pormenorização adequado; • acima de tudo, devolve os trabalhos rapidamente; 9
  • 11. Parte III GNU Free Documentation License 10
  • 12. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF (Traduzido pelo João S. O. Bueno através do CIPSGA em 2001) Esta é uma tradução não oficial da Licença de Documentação Livre GNU em Português Brasi- leiro. Ela não é publicada pela Free Software Foundation, e não se aplica legalmente a distribuição de textos que usem a GFDL - apenas o texto original em Inglês da GNU FDL faz isso. Entretanto, nós esperamos que esta tradução ajude falantes de português a entenderem melhor a GFDL. This is an unofficial translation of the GNU General Documentation License into Brazilian Por- tuguese. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GFDL–only the original English text of the GFDL does that. However, we hope that this translation will help Portuguese speakers understand the GFDL better. Licença de Documentação Livre GNU Versão 1.1, Março de 2000 Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA É permitido a qualquer um copiar e distribuir cópias exatas deste documento de licença, mas não é permitido alterá-lo. INTRODUÇÃO O propósito desta Licença é deixar um manual, livro-texto ou outro documento escrito "livre"no sentido de liberdade: assegurar a qualquer um a efetiva liberdade de copiá-lo ou redistribui-lo, com ou sem modificações, comercialmente ou não. Secundariamente, esta Licença mantém para o autor e editor uma forma de ter crédito por seu trabalho, sem ser considerado responsável pelas modificações feitas por terceiros. Esta Licença é um tipo de "copyleft"("direitos revertidos"), o que significa que derivações do documento precisam ser livres no mesmo sentido. Ela complementa a GNU Licença Pública Ge- ral (GNU GPL), que é um copyleft para software livre. Nós fizemos esta Licença para que seja usada em manuais de software livre, por que software livre precisa de documentação livre: um programa livre deve ser acompanhado de manuais que provenham as mesmas liberdades que o software possui. Mas esta Licença não está restrita a manuais de software; ela pode ser usada para qualquer trabalho em texto, independentemente do assunto ou se ele é publicado como um livro impresso. Nós recomendamos esta Licença prin- cipalmente para trabalhos cujo propósito seja de introdução ou referência. APLICABILIDADE E DEFINIÇÕES Esta Licença se aplica a qualquer manual ou outro texto que contenha uma nota colocada pelo detentor dos direitos autorais dizendo que ele pode ser distribuído sob os termos desta Licença. O "Documento"abaixo se refere a qualquer manual ou texto. Qualquer pessoa do público é um 11
  • 13. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF licenciado e é referida como "você". Uma "Versão Modificada"do Documento se refere a qualquer trabalho contendo o documento ou uma parte dele, quer copiada exatamente, quer com modificações e/ou traduzida em outra língua. Uma "Seção Secundária"é um apêndice ou uma seção inicial do Documento que trata ex- clusivamente da relação dos editores ou dos autores do Documento com o assunto geral do Documento (ou assuntos relacionados) e não contém nada que poderia ser incluído diretamente nesse assunto geral (Por exemplo, se o Documento é em parte um livro texto de matemática, a Seção Secundária pode não explicar nada de matemática). Essa relação poderia ser uma questão de ligação histórica com o assunto, ou matérias relaci- onadas, ou de posições legais, comerciais, filosóficas, éticas ou políticas relacionadas ao mesmo. As "Seções Invariantes"são certas Seções Secundárias cujos títulos são designados, como sendo de Seções Invariantes, na nota que diz que o Documento é publicado sob esta Licença. Os "Textos de Capa"são certos trechos curtos de texto que são listados, como Textos de Capa Frontal ou Textos da Quarta Capa, na nota que diz que o texto é publicado sob esta Licença. Uma cópia "Transparente"do Documento significa uma cópia que pode ser lida automatica- mente, representada num formato cuja especificação esteja disponível ao público geral, cujos conteúdos possam ser vistos e editados diretamente e sem mecanismos especiais com editores de texto genéricos ou (para imagens compostas de pixels) programas de pintura genéricos ou (para desenhos) por algum editor de desenhos grandemente difundido, e que seja passível de servir como entrada a formatadores de texto ou para tradução automática para uma variedade de formatos que sirvam de entrada para formatadores de texto. Uma cópia feita em um formato de arquivo outrossim Transparente cuja constituição tenha sido projetada para atrapalhar ou de- sencorajar modificações subsequentes pelos leitores não é Transparente. Uma cópia que não é "Transparente"é chamada de "Opaca". Exemplos de formatos que podem ser usados para cópias Transparentes incluem ASCII sim- ples sem marcações, formato de entrada do Texinfo, formato de entrada do LaTex, SGML ou XML usando uma DTD disponibilizada publicamente, e HTML simples, compatível com os padrões, e projetado para ser modificado por pessoas. Formatos opacos incluem PostScript, PDF, formatos proprietários que podem ser lidos e editados apenas com processadores de texto proprietários, SGML ou XML para os quais a DTD e/ou ferramentas de processamento e edição não estejam disponíveis para o público, e HTML gerado automaticamente por alguns editores de texto com finalidade apenas de saída. A "Página do Título"significa, para um livro impresso, a página do título propriamente dita, mais quaisquer páginas subsequentes quantas forem necessárias para conter, de forma legível, o material que esta Licença requer que apareça na página do título. Para trabalhos que não tenham uma página do título, "Página do Título"significa o texto próximo da aparição mais proe- minente do título do trabalho, precedendo o início do corpo do texto. 12
  • 14. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF FAZENDO CÓPIAS EXATAS Você pode copiar e distribuir o Documento em qualquer meio, de forma comercial ou não comercial, desde que esta Licença, as notas de copyright, e a nota de licença dizendo que esta Licença se aplica ao documento estejam reproduzidas em todas as cópias, e que você não acres- cente nenhuma outra condição, quaisquer que sejam, às desta Licença. Você não pode usar medidas técnicas para obstruir ou controlar a leitura ou confecção de cópias subsequentes das cópias que você fizer ou distribuir. Entretanto, você pode aceitar com- pensação em troca de cópias. Se você distribuir uma quantidade grande o suficiente de cópias, você também precisa respeitar as condições da seção 3. Você também pode emprestar cópias, sob as mesmas condições colocadas acima, e também pode exibir cópias publicamente. FAZENDO CÓPIAS EM QUANTIDADE Se você publicar cópias do Documento em número maior que 100, e a nota de licença do Documento obrigar Textos de Capa, você precisará incluir as cópias em capas que tragam, clara e legivelmente, todos esses Textos de Capa: Textos de Capa da Frente na capa da frente, e Textos da Quarta Capa na capa de trás. Ambas as capas também precisam identificar clara e legivelmente você como o editor dessas cópias. A capa da frente precisa apresentar o título com- pleto com todas as palavras do título igualmente proeminentes e visíveis. Você pode adicionar outros materiais às capas. Fazer cópias com modificações limitadas às capas, tanto quanto estas preservem o título do documento e satisfaçam a essas condições, pode ser tratado como cópia exata em outros aspectos. Se os textos requeridos em qualquer das capas for muito volumoso para caber de forma legível, você deve colocar os primeiros (tantos quantos couberem de forma razoável) na capa verdadeira, e continuar os outros nas páginas adjacentes. Se você publicar ou distribuir cópias Opacas do Documento em número maior que 100, você precisa ou incluir uma cópia Transparente que possa ser lida automaticamente com cada cópia Opaca, ou informar, em ou com, cada cópia Opaca a localização de uma cópia Transparente completa do Documento acessível publicamente em uma rede de computadores, à qual o público usuário de redes tenha acesso a download gratuito e anônimo utilizando padrões públicos de protocolos de rede. Se você utilizar o segundo método, você precisará tomar cuidados razoavel- mente prudentes, quando iniciar a distribuição de cópias Opacas em quantidade, para assegurar que esta cópia Transparente vai permanecer acessível desta forma na localização especificada por pelo menos um ano depois da última vez em que você distribuir uma cópia Opaca (direta- mente ou através de seus agentes ou distribuidores) daquela edição para o público. É pedido, mas não é obrigatório, que você contate os autores do Documento bem antes de redistribuir qualquer grande número de cópias, para lhes dar uma oportunidade de prover você com uma versão atualizada do Documento. 13
  • 15. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF MODIFICAÇÕES Você pode copiar e distribuir uma Versão Modificada do Documento sob as condições das se- ções 2 e 3 acima, desde que você publique a Versão Modificada estritamente sob esta Licença, com a Versão Modificada tomando o papel do Documento, de forma a licenciar a distribuição e modificação da Versão Modificada para quem quer que possua uma cópia da mesma. Além disso, você precisa fazer o seguinte na versão modificada: A. Usar na Página de Título (e nas capas, se houver alguma) um título distinto daquele do Do- cumento, e daqueles de versões anteriores (que deveriam, se houvesse algum, estarem listados na seção "Histórico do Documento"). Você pode usar o mesmo título de uma versão anterior se o editor original daquela versão lhe der permissão; B. Listar na Página de Título, como autores, uma ou mais das pessoas ou entidades responsá- veis pela autoria das modificações na Versão Modificada, conjuntamente com pelo menos cinco dos autores principais do Documento (todos os seus autores principais, se ele tiver menos que cinco); C. Colocar na Página de Título o nome do editor da Versão Modificada, como o editor; D. Preservar todas as notas de copyright do Documento; E. Adicionar uma nota de copyright apropriada para suas próprias modificações adjacente às outras notas de copyright; F. Incluir, imediatamente depois das notas de copyright, uma nota de licença dando ao público o direito de usar a Versão Modificada sob os termos desta Licença, na forma mostrada no tópico abaixo; G. Preservar nessa nota de licença as listas completas das Seções Invariantes e os Textos de Capa requeridos dados na nota de licença do Documento; H. Incluir uma cópia inalterada desta Licença; I. Preservar a seção entitulada "Histórico", e seu título, e adicionar à mesma um item dizendo pelo menos o título, ano, novos autores e editor da Versão Modificada como dados na Página de Título. Se não houver uma sessão denominada "Histórico"no Documento, criar uma dizendo o título, ano, autores, e editor do Documento como dados em sua Página de Título, então adicionar um item descrevendo a Versão Modificada, tal como descrito na sentença anterior; J. Preservar o endereço de rede, se algum, dado no Documento para acesso público a uma cópia Transparente do Documento, e da mesma forma, as localizações de rede dadas no Docu- mento para as versões anteriores em que ele foi baseado. Elas podem ser colocadas na seção "Histórico". Você pode omitir uma localização na rede para um trabalho que tenha sido publicado pelo menos quatro anos antes do Documento, ou se o editor original da versão a que ela se refira der sua permissão; K. Em qualquer seção entitulada "Agradecimentos"ou "Dedicatórias", preservar o título da 14
  • 16. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF seção e preservar a seção em toda substância e fim de cada um dos agradecimentos de contri- buidores e/ou dedicatórias dados; L. Preservar todas as Seções Invariantes do Documento, inalteradas em seus textos ou em seus títulos. Números de seção ou equivalentes não são considerados parte dos títulos da seção; M. Apagar qualquer seção entitulada "Endossos". Tal sessão não pode ser incluída na Versão Modificada; N. Não reentitular qualquer seção existente com o título "Endossos"ou com qualquer outro título dado a uma Seção Invariante. Se a Versão Modificada incluir novas seções iniciais ou apêndices que se qualifiquem como Seções Secundárias e não contenham nenhum material copiado do Documento, você pode optar por designar alguma ou todas aquelas seções como invariantes. Para fazer isso, adicione seus títulos à lista de Seções Invariantes na nota de licença da Versão Modificada. Esses títulos preci- sam ser diferentes de qualquer outro título de seção. Você pode adicionar uma seção entitulada "Endossos", desde que ela não contenha qual- quer coisa além de endossos da sua Versão Modificada por várias pessoas ou entidades - por exemplo, declarações de revisores ou de que o texto foi aprovado por uma organização como a definição oficial de um padrão. Você pode adicionar uma passagem de até cinco palavras como um Texto de Capa da Frente , e uma passagem de até 25 palavras como um Texto de Quarta Capa, ao final da lista de Textos de Capa na Versão Modificada. Somente uma passagem de Texto da Capa da Frente e uma de Texto da Quarta Capa podem ser adicionados por (ou por acordos feitos por) qualquer entidade. Se o Documento já incluir um texto de capa para a mesma capa, adicionado previamente por você ou por acordo feito com alguma entidade para a qual você esteja agindo, você não pode adicionar um outro; mas você pode trocar o antigo, com permissão explícita do editor anterior que adicionou a passagem antiga. O(s) autor(es) e editor(es) do Documento não dão permissão por esta Licença para que seus nomes sejam usados para publicidade ou para assegurar ou implicar endossamento de qualquer Versão Modificada. COMBINANDO DOCUMENTOS Você pode combinar o Documento com outros documentos publicados sob esta Licença, sob os termos definidos na seção 4 acima para versões modificadas, desde que você inclua na com- binação todas as Seções Invariantes de todos os documentos originais, sem modificações, e liste todas elas como Seções Invariantes de seu trabalho combinado em sua nota de licença. O trabalho combinado precisa conter apenas uma cópia desta Licença, e Seções Invariantes Idênticas com multiplas ocorrências podem ser substituídas por apenas uma cópia. Se houver múltiplas Seções Invariantes com o mesmo nome mas com conteúdos distintos, faça o título de 15
  • 17. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF cada seção único adicionando ao final do mesmo, em parênteses, o nome do autor ou editor origianl daquela seção, se for conhecido, ou um número que seja único. Faça o mesmo ajuste nos títulos de seção na lista de Seções Invariantes nota de licença do trabalho combinado. Na combinação, você precisa combinar quaisquer seções entituladas "Histórico"dos diver- sos documentos originais, formando uma seção entitulada "Histórico"; da mesma forma combine quaisquer seções entituladas "Agradecimentos", ou "Dedicatórias". Você precisa apagar todas as seções entituladas como "Endosso". COLETÂNEAS DE DOCUMENTOS Você pode fazer uma coletânea consitindo do Documento e outros documentos publicados sob esta Licença, e substituir as cópias individuais desta Licença nos vários documentos com uma única cópia incluida na coletânea, desde que você siga as regras desta Licença para cópia exata de cada um dos Documentos em todos os outros aspectos. Você pode extrair um único documento de tal coletânea, e distribuí-lo individualmente sob esta Licença, desde que você insira uma cópia desta Licença no documento extraído, e siga esta Licença em todos os outros aspectos relacionados à cópia exata daquele documento. AGREGAÇÃO COM TRABALHOS INDEPENDENTES Uma compilação do Documento ou derivados dele com outros trabalhos ou documentos se- parados e independentes, em um volume ou mídia de distribuição, não conta como uma Ver- são Modificada do Documento, desde que nenhum copyright de compilação seja reclamado pela compilação. Tal compilação é chamada um "agregado", e esta Licença não se aplica aos outros trabalhos auto-contidos compilados junto com o Documento, só por conta de terem sido assim compilados, e eles não são trabalhos derivados do Documento. Se o requerido para o Texto de Capa na seção 3 for aplicável a essas cópias do Documento, então, se o Documento constituir menos de um quarto de todo o agregado, os Textos de Capa do Documento podem ser colocados em capas adjacentes ao Documento dentro do agregado. Senão eles precisarão aparecer nas capas de todo o agregado. TRADUÇÃO Tradução é considerada como um tipo de modificação, então você pode distribuir traduções do Documento sob os termos da seção 4. A substituição de Seções Invariantes por traduções requer uma permissão especial dos detentores do copyright das mesmas, mas você pode incluir traduções de algumas ou de todas as Seções Invariantes em adição às versões orignais dessas Seções Invariantes. Você pode incluir uma tradução desta Licença desde que você também in- clua a versão original em Inglês desta Licença. No caso de discordância entre a tradução e a 16
  • 18. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF versão original em Inglês desta Licença, a versão original em Inglês prevalecerá. TÉRMINO Você não pode copiar, modificar, sublicenciar, ou distribuir o Documento exceto como expres- samente especificado sob esta Licença. Qualquer outra tentativa de copiar, modificar, sublicen- ciar, ou distribuir o Documento é nula, e resultará automaticamente no término de seus direitos sob esta Licença. Entretanto, terceiros que tenham recebido cópias, ou direitos de você sob esta Licença não terão suas licenças terminadas, tanto quanto esses terceiros permaneçam em total acordo com esta Licença. REVISÕES FUTURAS DESTA LICENÇA A Free Software Foundation pode publicar novas versões revisadas da Licença de Documen- tação Livre GNU de tempos em tempos. Tais novas versões serão similares em espirito à versão presente, mas podem diferir em detalhes ao abordarem novos porblemas e preocupações. Veja http://www.gnu.org/copyleft/. A cada versão da Licença é dado um número de versão distinto. Se o Documento especificar que uma versão particular desta Licença "ou qualquer versão posterior"se aplica ao mesmo, você tem a opção de seguir os termos e condições daquela versão específica, ou de qualquer versão posterior que tenha sido publicada (não como rascunho) pela Free Software Foundation. Se o Documento não especificar um número de Versão desta Licença, você pode escolher qualquer versão já publicada (não como rascunho) pela Free Software Foundation. ADENDO: Como usar esta Licença para seus documentos Para usar esta Licença num documento que você escreveu, inclua uma cópia desta Licença no documento e ponha as seguintes notas de copyright e licenças logo após a página de título: Copyright (c) ANO SEU NOME. É dada permissão para copiar, distribuir e/ou modificar este documento sob os termos da Licença de Documentação Livre GNU, Versão 1.1 ou qualquer versão posterior publicada pela Free Soft- ware Foundation; com as Seções Invariantes sendo LISTE SEUS TÍTULOS, com os Textos da Capa da Frente sendo LISTE, e com os Textos da Quarta-Capa sendo LISTE. Uma cópia da li- cença está inclusa na seção entitulada "Licença de Documentação Livre GNU". Se você não tiver nenhuma Seção Invariante, escreva "sem Seções Invariantes"ao invés de dizer quais são invariantes. Se você não tiver Textos de Capa da Frente, escreva "sem Textos de Capa da Frente"ao invés de "com os Textos de Capa da Frente sendo LISTE"; o mesmo para os Textos da Quarta Capa. Se o seu documento contiver exemplos não triviais de código de programas, nós recomenda- mos a publicação desses exemplos em paralelo sob a sua escolha de licença de software livre, 17
  • 19. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF tal como a GNU General Public License, para permitir o seu uso em software livre. 18
  • 21. Capítulo 1 O que é a linguagem C? C é uma linguagem flexível e poderosa que possui características de linguagens de alto nível (como o basic ou cobol) e outras de baixo nível (como assembly), sendo muitas vezes conside- rada como uma linguagem de nível médio. É uma linguagem tipicamente compilada (ou seja, o programa é totalmente convertido para um código legível pela máquina antes de ser executada) e permite liberdade total ao programador, que é responsável por tudo que acontece, possibilitando um bom controle e objetividade em suas tarefas. Este curso dará uma base introdutória para a programação em plataformas UNIX/Linux usando a linguagem C no padrão ANSI. Como o padrão ANSI não aborda recursos como elementos grá- ficos, multithreading, comunicação entre processos e comunicação em redes, esses temas não serão abordados nesse curso. O curso terá duração de 4 semanas e o conteúdo será disponibilizado em etapas, no início de cada semana. Antes de começar o curso, o aluno deverá ler o Plano de Ensino e o Guia do Aluno a seguir. Aos iniciantes na plataforma Moodle, recomendamos que leia a Ambientação do Moodle a seguir. 20
  • 22. Capítulo 2 Plano de ensino 2.1 Objetivo Introduzir aos técnicos e programadores a linguagem de programação C padrão ANSI. 2.2 Público Alvo Técnicos e Programadores que desejam trabalhar com a linguagem C. 2.3 Pré-requisitos Os usuários deverão ter conhecimento básico acerca da lógica de programação. 2.4 Descrição O curso de Linguagem de Programação C será realizado na modalidade EAD e utilizará a plataforma Moodle como ferramenta de aprendizagem. Ele é composto por módulos de apren- dizado que serão dados no início de cada semana e um módulo de avaliação que será dado na última. O material didático estará disponível on-line de acordo com as datas pré-estabelecidas no calendário. A versão utilizada para o compilador (o GCC) será a 4.0.4 2.5 Metodologia O curso está dividido da seguinte maneira: 2.6 Cronograma • Semana 1 - Introdução à linguagem C; • Semana 2 - Código estruturado em C e ponteiros; • Semana 3 - Abstração de dados; 21
  • 23. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF • Semana 4 - Estruturação e manipulação avançada do código e dos arquivos; • Avaliação - Avaliação de aprendizagem e avaliação final. As lições contêm o conteúdo principal. Elas poderão ser acessadas quantas vezes forem ne- cessárias, desde que esteja dentro da semana programada. Ao final de uma lição, você receberá uma nota de acordo com o seu desempenho. Responda com atenção às perguntas de cada li- ção, pois elas serão consideradas na sua nota final. Caso sua nota numa determinada lição seja menor que 6.0, sugerimos que você faça novamente esta lição. Ao final do curso será disponibilizada a avaliação referente ao curso. Tanto as notas das lições quanto a da avaliação serão consideradas para a nota final. Todos os módulos ficarão visíveis para que possam ser consultados durante a avaliação final. Aconselhamos a leitura da "Ambientação do Moodle"para que você conheça a plataforma de En- sino a Distância, evitando dificuldades advindas do "desconhecimento"sobre a mesma. Os instrutores estarão à sua disposição ao longo de todo curso. Qualquer dúvida deverá ser enviada ao fórum. Diariamente os monitores darão respostas e esclarecimentos. 2.7 Programa O curso da linguagem C oferecerá o seguinte conteúdo: • Lição 1 - Introdução teórica; • Lição 2 - Elementos léxicos e sintáticos da linguagem C, parte 1; • Lição 3 - Elementos léxicos e sintáticos da linguagem C, parte 2; • Lição 4 - Elementos léxicos e sintáticos da linguagem C, parte 3; • Lição 5 - Manipulação de arquivos e entradas/saídas em C; • Lição 6 - Recursividade; • Lição 7 - Manipulação de ponteiros e tipos avançados de dados; • Lição 8 - Estruturas de dados, parte 1; • Lição 9 - Estruturas de dados, parte 2; • Lição 10 - Dividindo seu programa em diversos arquivos fontes; • Lição 11 - Manipulação avançada de arquivos. 2.8 Avaliação Em cache - Páginas Semelhantes Toda a avaliação será feita on-line. Aspectos a serem considerados na avaliação: • Iniciativa e autonomia no processo de aprendizagem e de produção de conhecimento; 22
  • 24. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF • Capacidade de pesquisa e abordagem criativa na solução dos problemas apresentados. Instrumentos de avaliação: • Participação ativa nas atividades programadas; • Avaliação ao final do curso; • O participante fará várias avaliações referente ao conteúdo do curso. Para a aprovação e obtenção do certificado o participante deverá obter nota final maior ou igual a 6.0 de acordo com a fórmula abaixo: • Nota Final = ((ML x 7) + (AF x 3)) / 10 = Média aritmética das lições • AF = Avaliações . 2.9 Bibliografia • Curso O Linux : http://www.coltec.ufmg.br/ info/cursoC_olinux/curso_c_htm.htm • cplusplus.com : http://www.cplusplus.com/ 23
  • 25. Capítulo 3 Introdução à linguagem C 3.1 Introdução teórica 3.1.1 O que é a linguagem de programação C? #include <stdio.h> #define MAX 100 int main (int argc , char *argv[]) { int i; for ( i = 0 ; i < MAX ; i++ ) { printf("Este curso sera sobre a linguagem C!! n"); } } #undef MAX Programa que imprime o texto "Este curso será sobre a linguagem C!!"100 vezes no console C é uma linguagem que alia características de linguagens de alto nível (como pascal e basic) e outras de baixo nível como assembly (linguagem de montagem para comandos específicos da máquina), logo, é freqüentemente conhecida como uma linguagem de nível médio (ou intermediá- rio) por permitir também facilidade de acesso ao hardware e facilitar a integração com comandos assembly. Esta linguagem foi originada da linguagem de programação B (criada por Ken Thompson), que por sua vez foi originada da linguagem de programação BCPL (criada por Martin Richards). Pode ser interessante analisar essas linguagens para avaliar algumas características herdadas, 24
  • 26. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF mas isso não será feito neste curso. O que isso quer dizer? Que C junta flexibilidade, praticidade e simplicidade. Adicionalmente, C permite liberdade total ao programador que é responsável por tudo que acontece, nada é im- posto ou acontece simplesmente ao acaso, tudo é pensado pelo programador e isso significa um bom controle e objetividade em suas tarefas, o que muitas vezes não é conseguido em diversas outras linguagens. C é uma "linguagem estruturada", ou seja, são linguagens que estruturam o programa em blocos para resolver os problemas. Você divide um grande e complexo problema em um conjunto de problemas mais simples de serem resolvidos. C é uma linguagem compilada e utiliza de um compilador C para ser executado, ao contrário de outras linguagens que utilizam de um interpretador para tal (como o prolog ou o Java Byte- code). Na concepção da linguagem é que se decide se ela vai ser compilada ou interpretada, pois todas as linguagens têm seu objetivo a cumprir (como prioridade a velocidade ou a flexibilidade) e o método de tradução (compilação ou interpretação) tem impacto no cumprimento desses objeti- vos. A priori, qualquer uma poderia ser interpretada ou compilada, mas linguagens que priorizam flexibilidade e portabilidade são interpretadas e as linguagens que priorizam a velocidade são compiladas. Na verdade, quem faz um programa ser executado é também um programa, só que um pro- grama avançado que lê todo código fonte (o que foi escrito pelo programador) e o traduz de alguma forma para ser executado. Isso acontece em todas linguagens. A diferença básica é que um interpretador lê linha a linha do fonte, o examina sintaticamente e o executa. Cada vez que o programa for executado esse processo tem de ser repetido e o interpretador é chamado. Já um compilador lê todo programa e o converte para código-objeto (código de má- quina, binário, 0’s e 1’s) e pronto. Sempre quando tiver que ser executado é só chamar o código convertido, pois todas instruções já estão prontas para a execução, não tendo mais vínculo com seu código-fonte. A linguagem C também foi projetada visando a portabilidade, ou seja, para que o mesmo có- digo escrito em C possa ser utilizado para gerar diversos programas executáveis especializados para diferentes arquiteturas de máquina. Note que o código escrito em linguagem C é portável, mas o programa executável gerado por ele não o é. Todas as páginas desta lição virão com um exemplo não tão complexo de código em lingua- gem C. Eles são para fins ilustrativos. Os interessados podem tentar compilar o código ou analisar o que eles fazem. 3.1.2 Quem realmente controla os programas? Quem controla as ações mais básicas de um computador é o Sistema Operacional (SO). O SO é o que podemos chamar de camada de software que faz a interface (comunicação) en- tre os usuários e o Hardware (parte física da máquina, placas, circuitos, memórias). O objetivo básico é controlar as atividades do Hardware e prover um ambiente agradável para o usuário do 25
  • 27. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF sistema e que ele possa trabalhar com maior grau de abstração (se preocupar menos com pro- blemas relativos aos detalhes do funcionamento da máquina e poder pensar mais na essência da resolução de um problema). Qualquer comando de um programa convencional precisa sempre passar pelo "filtro"do Sistema Operacional antes de ser executada. O SO tem alguns componentes primordiais para a interação do usuário com a máquina: o escalonador de processos, o gerenciador de memória, o gerenciador de entrada e saída, o sistema de arquivos e o interpretador de comandos. O escalonador de processos (task scheduler) é uma parte do SO que controla o uso de recursos computacionais por processos (um processo é um programa em execução). Os esca- lonadores atuais tentam permitir que vários processos rodem quase que paralelamente em um computador e de forma eficiente. Por exemplo, caso um processo fique muito tempo ocioso es- perando por um recurso que demora para ser liberado, o escalonador deve fazer com que um outro processo entre em execução enquanto que o primeiro esteja esperando. Podemos dizer basicamente que o escalonador de processos é o responsável pela eficiência de um SO como todo. O sistemas de arquivos provê ao usuário uma abstração muito conhecida como "arquivos"(e adicionalmente as "pastas"). É ele quem verifica o conjunto de 1 e 0 (os famosos "bits") presentes nos dispositivos de armazenamento (atualmente o mais comum é o HD) e o "traduz"para que o usuário tenha a impressão de que nesses dispositivos realmente existam os "arquivos", não me- ramente os "bits". O interpretador de comandos comandos é uma interface primária entre o usuário e o SO. Permite que o usuário e o SO se "comuniquem"usando uma linguagem em comum. O interpre- tador de comandos é conhecido no mundo Linux como SHELL (pode variar para outros sistemas). 3.1.3 Histórico da linguagem C #include <stdlib.h> int * buscaBin (int *p1, int tam , int elem) { int *p2 = p1 + tam - 1; int *p = p1 + ((p2 - p1)/2); while ( p1 <= p2 ) { if (*p == elem) { return p; } else if (*p < elem) { p1 = p + 1; } else { 26
  • 28. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF p2 = p - 1; } p = p1 + ((p2 - p1)/2); } return NULL; } Função de busca binária em um vetor de elementos inteiros ordenados Em 1973 Dennis Ritchie, pesquisador da Bell Labs, reescreveu todo sistema UNIX para uma linguagem de alto nível (na época considerada) chamada C, desenvolvida por ele mesmo. Esse sistema foi utilizado para um PDP-11 (o microcomputador mais popular na época). Tal situação de se ter um sistema escrito em linguagem de alto nível foi inovador na época e pode ter sido um dos motivos da aceitação do sistema por parte dos usuários externos a Bell. Sua popularização tem relação direta com o exponencial uso do C. Por vários anos o padrão utilizado para o C foi o que era fornecido com o UNIX versão 5 (des- crito em The C programming Language, de Brian Kernighan e Dennis Ritchie - 1978). Começaram a surgir diversas implementações da tal linguagem e os códigos gerados por tais implementações eram altamente incompatíveis. Não existia nada que formalizasse essas compatibilizações e com o aumento do uso desses diversos "dialetos"da linguagem, surgiu-se a necessidade de uma pa- dronização, regras que todos poderiam seguir para poderem rodar seus programas no maior número de plataformas possíveis. O ANSI (American National Standards Intitute, Instituto Americano que até hoje dita diversos padrões) estabeleceu em 1983 um comité responsável pela padronização da linguagem. Atual- mente, a grande maioria dos compiladores já suportam essa padronização (ou melhor, é quase uma obrigação suportar o padrão ANSI). Trocando em miúdos, o C pode ser escrito em qualquer máquina que se utilize de tal padrão e rodar em qualquer outra que também o faça. Parece inútil? Não. Na verdade, isso (a por- tabilidade) é a semente de grande parte dos avanços tecnológicos que toda programação tem proporcionado no mundo de hoje. Com o tempo isso ficará mais claro. 3.1.4 Características Listamos abaixo algumas características da linguagem C: 1. Projetado inicialmente para o desenvolvimento de softwares básicos (softwares de base, que provém serviços para outros softwares específicos) de forma independente do hard- ware; 2. Foi projetado para ser usado por programadores especializados interessados em geração de códigos compactos e eficientes; 27
  • 29. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF 3. O gerenciamento de memória é por cargo do programador (não existe a coleta de lixo, como ocorre na linguagem Java), ou seja, o programador é quem especifica a alocação e a liberação de memória utilizada por um dado; 4. Economia de expressões (as expressões em C utilizam poucas letras); 5. Moderno controle de fluxo e estruturas de dados. Construções para o controle de fluxo do programa é bem estruturada e é possível criar novas estruturas de dados de forma flexível; 6. Possui um conjunto rico e poderoso de operadores; 7. Elementos dependentes de hardware estão integradas em bibliotecas de funções, logo, os programas convencionais não precisam se preocupar com esses elementos; 8. Performance próxima das obtidas com a linguagem Assembly; 9. São "case sensitives", ou seja, diferem letras maiúsculas das minúsculas; 10. O entrypoint (o ponto inicial de execução do programa) é declarada através da função "main()"; 11. Os dados são tipados, ou seja, devem ter o "tipo"explicitamente declarado; 12. 12. Os tipos de dados declarados pelo programador (os que não foram especificados pela linguagem C, como o int, float, char, ...) são diferenciados pelo tamanho (número de bytes que um dado ocupa), não pelo nome atribuído ao tipo. 3.1.5 O compilador GCC #include <stdio.h> #include <stdlib.h> void andVetor (int vetor1[], int vetor2[] , int tamVetor) { int *p1 = vetor1; int *p2 = vetor2; for ( ; tamVetor > 0 ; tamVetor-- , p1++, p2++ ) { *p1 = *p1 && *p2; } } int main (int argc , char *argv[]) { int i; int v1[] = {1,1,0,1,1}; int v2[] = {1,0,1,1,0}; andVetor(v1,v2,5); 28
  • 30. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF for (i = 0 ; i < 5 ; i++) {printf("n %d n" , v1[i]);} return 0; } Programa que imprime o resultado da operação lógica "E"aplicado em um vetor. O GCC (GNU Compiler Collection) é uma distribuição integrada de compiladores de diversas linguagens de programação, que inclui C, C++, Objective-C, Objective-C++, Java, Fortran, e Ada. Historicamente, o GCC é mais conhecido como "GNU C Compiler"por seu uso comum ser a com- pilação da linguagem C. Neste curso, utilizaremos o GCC como o compilador principal. Este curso dará somente uma visão rápida do GCC, pois este recurso é bastande diversificado e um curso completo pode ser feito para ensinar o uso avançado do GCC. Façamos uma revisão rápida: Um programa em C é elaborado em dois passos básicos: • O programa é escrito em texto puro num editor de texto simples. Tal programa se chama "código fonte"(source code em inglês); • Passamos o código fonte para o compilador que é o programa que gera um arquivo num formato que a máquina entenda. 1. O compilador realiza a "pré-compilação", ou seja, processa comandos especiais direciona- dos para o compilador (as diretivas de compilação) e ignora elementos redundantes (como espaços em branco ou comentários); 2. O compilador avalia o código fonte para detectar erros léxicos, sintáticos e os erros semân- ticos simples; 3. O compilador gera, através do código fonte, um código intermediário em uma "gramá- tica"mais simples para a máquina (geralmente uma linguagem assembly). Posteriormente, o montador (assembler) gerará um arquivo "objeto"para cada código fonte. Alguns compila- dores não passam pela linguagem assembly e geram diretamente o código objeto; 4. Depois, o ligador (linker) junta o arquivo objeto com a biblioteca padrão. A tarefa de juntar todas as funções do programa é bastante complexa. Nesse estágio, o compilador pode falhar se ele não encontrar referências para a função. Freqüentemente referimos o termo "compilador" como a junção do "pré-compilador"(que faz a pré-compilação), o "analisador"(realiza a analização léxica, sintática e parte da semântica), um "gerador de código de baixo nível"(converte um programa em linguagem de alto nível em outra 29
  • 31. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF de baixo nível), o montador/assembler (converte um programa em linguagem assembly para um arquivo objeto) e o ligador/linker (junta diversos arquivos objeto para gerar o programa completo e executável pela máquina). Para usar o GCC para compilar seu programa, use: $ gcc fonte.c Isso já efetua a pré-compilação, a compilação, a montagem (assembly) e a ligação (link), ge- rando um programa executável. Na maioria dos computadores, isso gerará um arquivo chamado "a.out". Para executar esse programa, digite "./a.out". Para mudar o nome do programa executável gerado, você pode utilizar a opção -o. $ gcc -o destino fonte.c O seu programa se chamará destino e será o derivado do fonte chamado fonte.c. Se você deseja compilar um programa "fonte1.c"que utiliza "fonte2.c", "fonte3.c"e "fonte4.c"como biblioteca, execute: $ gcc -o destino fonte1.c fonte2.c fonte3.c fonte4.c Isso criará um arquivo "destino"que foi gerado de "fonte1.c", que por sua vez utilizou "fonte2.c", "fonte3.c"e "fonte4.c"como biblioteca. 3.1.6 Tipos de Erros #include <stdio.h> #define FIM 255 unsigned char seq[] = { 3 , 1 , 4 , 1 , 5 , 9 , 2 , 6 , 5 , 3 ,5 , 8 , 9 , 7 , 9 ,3 , 2 , 3 , 8 , 4 , 6 , 2 , 6 , 4 , 3 , 3 , 8 , 3 , 2 , 7 , 9 , FIM }; int main( int argc , char * argv[] ) { 30
  • 32. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF int i = 0; printf("n Seq = ("); for ( ; (seq[i]!=FIM)?(printf(" %u ",seq[i]),1) : (0) ; i++ ) {} printf(");n"); return 0; } #undef FIM Programa que imprime 30 casas decimais do PI Dito de forma radical, erros são provocados sempre pelo programador. Existem basica- mente dois tipos de erros: 1. Léxico: relacionado ao formato da palavra (como o uso de letras erradas). Esse tipo de erro ocorre normalmente ao usar letras/símbolos inesperados nas palavras (por exemplo, ao usar símbolos como o "@"para nomes de variáveis - o que não é permitido no C); 2. Sintático: relacionado com a organização entre palavras. Erros desse tipo ocorrem quando duas ou mais palavras (ou letras que representam algum elemento da linguagem) estão colocadas em posições erradas ou quando palavras esperadas não se encontram no local devido (por exemplo, para cada ""deve haver um correspondente; se não houver, será erro sintático); 3. Lógico/Semântico: os demais erros se enquadram nesta categoria. Erros de lógica de programação (como loop infinito, abertura de arquivos que não existem, etc), erros mate- máticos (divisão por zero), erros de ordem de operação, erros de tipos (quando se utiliza um dado de um tipo diferente do esperado - inteiros quando se espera ponteiros), etc. Erros desta categoria são de difícil detecção. Os erros de sintaxe são os melhores que podem acontecer (claro, o ideal é que não ocorram erros, mas nós, como seres humanos, sempre cometemos erros nos piores momentos possí- veis). O compilador o identificará durante a compilação do programa, ou seja, não gerará um efeito inesperado durante a execução do programa. Os erros léxico/sintático são gerados quando criamos programas que estão fora da construção esperada pela gramática da linguagem. Em geral, quando os compiladores encontram um erro eles não terminam imediatamente, mas continuam procurando até o final do programa e assim listam todos os erros detectados e do que se tratam. O programa é somente compilado até o final (geram códigos executáveis) quando erros léxicos e sintáticos não mais existirem. É bastante traumatizante para alguém fazendo seu primeiro programa obter um erro e ver diversas linhas de mensagens que aparentemente não fazem sentido. Não se assuste nem se desmotive, pois pode ser um simples ponto e vírgula ou um detalhe bobo. Os compiladores não são inteligentes o suficiente para identificar exatamente qual foi o erro e indicar soluções para isso. Com o tempo e a experiência você começará a se acostumar e aprender a lidar com isso. 31
  • 33. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF Caso erros léxico-sintáticos não estejam mais presentes, o compilador transformará o seu có- digo fonte (texto puro) em código de máquina (os tais 0’s e 1’s, o que a máquina entende) e você poderá executa-lo. Bem, mas se a lógica do programa estiver errada? Este tipo de erro não pode ser detectado pelo compilador. Erros lógicos se assemelham a entregar uma receita de bolo de mandioca quando se espera um bolo de fubá. Se a receita estiver gramaticalmente correta, o cozinheiro pode perfeitamente transformar a receita em algum produto, mas não estará preocupado se realmente foi esse pro- duto que o cliente queria (nem estará preocupado se esse produto será digerível por algum ser humano). No caso de um compilador, o compilador somente transformará o código fonte para código de máquina e não verificará se o programa descrito pelo código fonte realmente resolverá o problema desejado. Fazendo uma analogia: 1. Você pode falar com seu empregado e ele não entender o que você está expressando e assim ele não conseguirá executar a tarefa e reclamará. Por exemplo, falando em japonês com ele! Nesse caso, houve um erro léxico/sintático. 2. Você explica tudo gramaticalmente correto para o seu empregado. Ele entende tudo, porém a idéia passada é inconsistente. Por exemplo, manda ele ir para uma rua que não existe ou comprar algo sem que haja dinheiro suficiente. Neste caso, o erro foi de lógica. Tais erros podem acarretar algumas conseqüências graves como: • O programa termina repentinamente e às vezes dê uma advertência inesperada; • O programa funciona incorretamente e gera dados inconsistentes; • O programa leva o sistema a um estado instável ou lento. Alguns erros lógicos simples podem ser detectadas pelo compilador (como diferenças de tipos de dados ou visibilidade/escopo), mas no geral os erros lógicos podem ser resolvidos somente por inspecção e avaliação lógica. Detalhes Importantes Depois de corrigir um erro no código fonte, você deve compilar o programa novamente para que este tenha efeito, caso contrário o executável não reflitirá o código fonte atual. O compilador não detectará automaticamente essas mudanças e compilará automaticamente. O C, como tudo no mundo Linux/UNIX, difere as letras maiúsculas das minúsculas (o dito "case sensitive"em inglês); esse critério deve ser considerado com cuidado. Existem padrões que normalizam o uso de maiúsculas e minúsculas em nomes utilizados nos programas C. No geral, recomenda-se priorizar o uso de minúsculas, com exceção dos dados constantes, strings e nomes compostos (por exemplo, nome de variáveis como "minhaVariavel"ou nomes de tipos de 32
  • 34. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF dados como "meuTipo"). Outro detalhe importante: o C (como a maioria das linguagens atuais) exige que se faça uma listagem de todas as variáveis do programa previamente. Ou seja, não existe uso dinâmico de variáveis e tudo que você usa tem que ser previamente declarado. O ";"(ponto-e-vírgula) é o "terminador de comando"no C, ou seja, é o indicador de fim de co- mando. Diferente das linguagens como o Pascal (que possui "separador de comando", não o "terminador"), todos os comandos em C (com exceção de alguns blocos de comando) devem ser terminados com o ponto-e-vírgula. Em linguagens com "separadores de comandos"(como Pas- cal), o último comando não precisa desse elemento, pois o último comando não tem algo a seguir para precisar separar. 3.2 Elementos léxicos e sintáticos da linguagem C, parte 1 3.2.1 Palavras Reservadas Um dos elementos léxicos mais importantes de uma linguagem de programação são as pa- lavras reservadas. As palavras reservadas, os operadores (unários, binários e ternários), os símbolos terminadores de comandos e os delimitadores de blocos/expressões formam os ele- mentos léxicos constantes da gramática da linguagem C. O que vem a ser palavras reservadas? São palavras que têm significado especial na lingua- gem. Cada palavra tem significado especial em C e as instruções são executadas através do uso desses conjuntos de palavras. Existem algumas palavras chaves que são previamente determi- nadas pelo projeto da linguagem. Chamamos essas palavras de palavras reservadas. A priori, elas não poderão ser usadas para fins além do determinado pela linguagem. As funções que cada palavra chave exerce serão esclarecidas no decorrer do curso. Um compilador C precisaria ser muito inteligente para poder distinguir, através da análise de contexto, as palavras reservadas dos comuns casos a mesma seqüência de letras possam ser utilizadas tanto como reservadas em alguns casos quanto como nomes próprios em outros. Por isso, foi determinado que as palavras reservadas seriam utilizadas somente para seus fins desig- nados (que são geralmente comandos e afirmativas) . Abaixo está a lista dessas palavras. Relembrando, o C entende tais palavras apenas em letras minúsculas (não funcionará se você colocar em maiúsculas). • auto • double • int • struct • break 33
  • 35. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF • else • long • switch • case • enum • register • typedef • char • extern • return • union • const • float • short • unsigned • continue • for • signed • void • case • goto • sizeof • volatile • do • if • signed • while 34
  • 36. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF Todo conjunto de palavras reservadas acima são o conjunto das instruções básicas do C. Apa- rentemente, parecem poucas e você, na prática, usará apenas algumas poucas delas. Tal fato acontece pois uma das facilidades do C é a utilização muito natural de bibliotecas que funcionam como acessórios para o C. As bibliotecas (conjunto de funções) não fazem parte intrínseca do C, mas você não encon- trará nenhuma versão do C sem nenhuma delas. Algumas são até tratadas como parte da lin- guagem por serem padronizadas. 3.2.2 Variáveis São espaços reservados que guardam valores durante a execução de um programa. Como o nome diz, elas tem a capacidade de "variar"no tempo. Em geral, são exatamente um pedaço de memória (o tamanho depende do que se esteja guardando) no qual botamos alguma informação e podemos nos referir a ela, utilizá-la, alterá-la ou fazermos o que bem entendermos durante a execução de um programa. Nome das variáveis Toda variável tem um nome pela qual é chamada (identificada) e um tipo (o que ela guardará). Os nomes podem ser de uma letra até palavras. Dizendo de forma simplificada, os nomes das variáveis obrigatoriamente devem começar por uma letra ou underscore (o sinal de menos achatado: "_"). O restante pode ser letras de A até Z maiúsculas, minúsculas, números e o underscore. Exemplos: e, variável _essa_e_uma_variavel, tambem_variavel. Vale ressaltar que ela é "case sensitive", o que significa que diferencia maiús- culas e minúsculas. Recomendações: evite o uso de variáveis com o nome iniciando com o underscore ("_"), pois elas são freqüentemente utilizadas por bibliotecas padrões do C (explicações sobre bibliotecas serão feitas mais adiante) e podem causar conflitos de nomes (quando um mesmo nome é uti- lizado em variáveis declaradas em mesmo nível de escopo - maiores detalhes sobre nível de escopo serão dados mais adiante). Crie também o hábito de nomear variáveis utilizando letras minúsculas, pois essa prática é comum no mundo da programação. As variáveis possuem tipos. Os tipos dizem ao compilador que tipo de dado será armaze- nado. Isso é feito com o intuito do compilador obter as informações necessárias sobre quanto de memória ele terá que reservar para uma determinada variável. Também ajuda o compilador com uma lista de variáveis em um lugar reservado de memória, para que ele possa fazer referên- cias, checar nomes e tipos e que possa determinar erros. Basicamente possibilita uma estrutura bem definida do que é usado e uma arrumação conveniente na memória. Podemos dizer que as variáveis em linguagem C são fortemente "tipadas", pois todas as variáveis possuem tipos asso- ciados e operações sobre as variáveis somente poderão ser feitas entre tipos compatíveis (mas não necessariamente iguais). NOTA: o tipo mais comum nos programas C é o int (número inteiro). Maiores detalhes sobre os tipos serão dados adiante. 35
  • 37. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF Declaração de uma variável Antes de utilizarmos uma variável, precisamos declarar a variável. Veja abaixo a sintaxe da declaração de uma variável: <tipo> <nome>; ou <tipo> <nome> = <valor_inicial>; Exemplos: int minha_variavel; int i = 10; int j = i; Podemos também declarar várias variáveis de uma só vez, separando-as usando vírgulas: int a , b = 0 , c , d = 11 , e , f; No caso acima, as variáveis "a", "b", "c", "d", "e"e "f"serão do tipo "int"; cujo "b"terá valor inici- alizado em 0 e "d"terá valor inicial de 11. Recomendação: para melhorar a legibilidade, é sempre uma boa prática de programação atribuir valores iniciais das variáveis no momento de sua declaração e evitar que a mesma variável seja "reutilizada"(que uma variável seja utilizada para um determinado propósito em um trecho do código e para um propósito completamente diferente em um outro trecho). Atualmente, um código manutenível (legível, fácil de alterar, reutilizável, portável e predizível) é muito mais apreciada do que um código simplesmente compacto. Atribuição de valores Utilizamos o operador "="para atribuir valores novos às variáveis. O comando de atribuição de variáveis pode ser definido como abaixo: <nome_da_variável> = <expressão>; Onde <expressão> pode ser um número, uma outra variável, uma expressão matemática (ex. (a+b)-10, onde a e b são variáveis), uma função, etc. Exemplo: minha_variavel = 10 + 2 - outra_variavel; 3.2.3 Operadores Aritméticos e de Atribuição O que vamos aprender agora é importante no sentido de que vamos usar isto praticamente em qualquer programa que implementemos. Vamos aprender a traduzir, para o nosso código, as fórmulas e expressões matemáticas que usamos no dia-a-dia ou que tenham alguma utilidade. Vamos falar um pouco sobre prioridade dos operadores e precedência, dois conceitos que juntos vão fazer com que todas as nossas fórmulas e expressões sejam corretamente analisadas pelo compilador. 36
  • 38. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF Os operadores Os seguintes operadores podem ser utilizados tanto com os inteiros quanto com os pontos flutuantes: • + : Soma; • - : Subtração; • * : Multiplicação; • / : Divisão; • ++ : Incremento; • – : Decremento. Já o seguinte operador só tem serventia no âmbito dos números inteiros: % : Resto de divisão entre dois inteiros. Vamos falar um pouco sobre aridade. A aridade é um conceito que trata da quantidade de parâmetros que uma determinada operação envolve. Em alguns casos, precisamos de apenas um parâmetro para executar uma operação, como a seguinte: x = -y. Para poder saber correta- mente o que está sendo atribuído, precisamos saber apenas o valor de y, e o operador ’-’ está sendo aplicado apenas ao y. Por esse motivo dizemos que ele é um operador unário. Já os outros operadores conhecidos são chamados de binários porque precisam de dois parâmetros para serem corretamente definidos. Exemplo: x = y + 2. Nesse caso precisamos saber o valor da variável y e o valor do número 2, para corretamente definir o valor que vai ser atribuído. Esse mesmo conceito pode ser aplicado a funções, por isso é importante entendê-lo bem. Sempre que fizermos uma atribuição em que a variável de destino é um inteiro, o número que sendo atribuído é convertido em um inteiro, mas não arredondado; a parte decimal é apenas desconsiderada. Para exemplificar veja o seguinte exemplo: #include <stdio.h> int main() { int intNumero1=0, intNumero2; float floatNumero1=0.5, floatNumero2; printf("intNumero1=%d e floatNumero1=%fn",intNumero1, floatNumero1); intNumero2 = intNumero1 + floatNumero1; printf("inteiro = inteiro + flutuante: %dnn",intNumero2); intNumero1 = 1; floatNumero1 = 2.5; 37
  • 39. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF printf("intNumero1=%d e floatNumero1=%fn",intNumero1, floatNumero1); intNumero2 = intNumero1 * floatNumero1; printf("inteiro = inteiro * flutuante: %dnn",intNumero2); intNumero1 = 10; floatNumero1 = 3; printf("intNumero1=%d e floatNumero1=%fn",intNumero1, floatNumero1); intNumero2 = intNumero1 / floatNumero1; printf("inteiro = inteiro / futuante: %dnn",intNumero2); return(0); } Os operadores de incremento e decremento são operadores unários, ou seja, precisam de apenas um parâmetro para serem corretamente utilizados. Eles não implementam uma funci- onalidade nova na linguagem, mas facilitam uma operação que é extremamente comum, a de aumentar e diminuir uma variável em 1. Por exemplo: intNumero1 = 1; intNumero1++; O valor contido na variável x agora é 2. A seguinte operação tem o mesmo efeito: intNumero1 = 1; ++intNumero1; Utilizados assim, os dois métodos fazem a mesma coisa, mas é bom evitar o uso desses mé- todos com o mesmo objetivo porque nos casos mais freqüentemente utilizados os dois métodos são essencialmente diferentes: intNumero1 = 1; intNumero2 = 1; intNumero1 = intNumero2++; /* Nesse ponto temos que intNumero1=2 e intNumero2=1. */ intNumero1 = 1; intNumero2 = 1; intNumero1 = ++intNumero2; /* Agora temos que intNumero1=2 e intNumero2=2. Isto acontece porque da primeira vez, apenas passamos o valor intNumero2+1 para a variável intNumero1. No segundo método, primeiro incrementamos a variável intNumero2, para depois passar o seu valor para a variável intNumero1 */ 38
  • 40. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF Métodos interessantes de atribuição As formas de atribuição que vamos ver agora são muito elegantes, e devem ser utilizadas quando possível. Com elas o nosso código fica mais enchuto, mais polido e mais legível. Vamos lá! varNumero1 += varNumero2 equivale à varNumero1 = varNumero1 + varNumero2 varNumero1 -= varNumero2 equivale à varNumero1 = varNumero1 - varNumero2 varNumero1 *= varNumero2 equivale à varNumero1 = varNumero1 * varNumero2 varNumero1 /= varNumero2 equivale à varNumero1 = varNumero1 / varNumero2 Essas atribuições funcionam como se fossem auto atribuições. As variáveis utilizam elas mesmo e mais uma variável para determinar o seu novo valor. Estas atribuição são especialmente úteis quando percebemos que o mesmo valor é utilizado de alguma forma, por exemplo: float floatValorAplicado = 700; float floatJuros = 0.0079; int intNumMeses = 10; int intContador; for (intContador=0 ; intContador < intNumMeses ; intContador+=1) floatValorAplicado += floatValorAplicado * floatJuros; Como podemos ver, utilizamos duas vezes as atribuições elegantes. Na primeira vez, vimos que intContador++ equivale à intContador+=1 que equivale à intContador = intContador + 1. Na segunda, podemos ver que floatValorAplicado += floatValorAplicado * floatJuros equi- vale à floatValorAplicado = floatValorAplicado + floatValorAplicado * floatJuros. É uma boa economia de código, certo? Vamos ver agora o último método interessante de atribuição, que também torna o código mais elegante, legível e enxuto: intNumero1 = intNumero2 = intNumero3 = 4; O que acontece aqui é que todas as três variáveis vão receber o valor 4. É como se a atribui- ção fosse viajando pela instrução da direita para a esquerda. Pense nas atribuições de incremento e decremento (x++) desta forma, como uma viajem da direita para a esquerda. Facilita vermos como essas execuções funcionam. 3.2.4 Tipos de dados Para utilizar uma variável, precisamos levar em consideração os seguintes aspectos: • Escolher um nome claro e conciso para a variável; • Escolher a área de atuação da variável (veja "regras de escopo"nas próximas páginas); • Escolher qual o TIPO da variável será necessária para um dado. Existem vários tipos de dados em C. Todos eles são palavras reservadas. O C é bem flexível e possibilita a criação de novos tipos baseando nos tipos elementares (iremos ver isso nas lições seguintes). Os tipos elementares da linguagem C são: 39
  • 41. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF • char: tipo caractere. Exemplos são ’a’, ’b’, ’x’... São os símbolos do nosso alfabeto mais os outros representáveis com 1 Byte (256 elementos ao todo, incluindo os "dígitos numéricos", ’@’, ’#’, etc). No C, usamos o apóstrofe (’) para indicar que um símbolo deve ser tratado como um conteúdo de uma varíável do tipo "char". Este tipo pode ser usado também como um subconjunto do tipo "int"(afinal, em baixo nível os caracteres são números - seqüência de bits); • int: número inteiro; • float: um número real. Significa "ponto flutuante", indicando que o ponto decimal (ou seja, a precisão) é variável de acordo com a grandeza do número (se um número "float"é grande, sua precisão precisa ser menor; se pequeno, sua precisão pode ser maior); • double: número real extendido, ou "float"com dupla precisão. Pode representar um conjunto maior do que o float; • void: tipo especial que indica "nenhum tipo". Pode ser utilizado para simular um tipo univer- sal. Podemos ter também um conjunto de modificadores de tipos. Eles são declarados antes do nome do tipo (ex. unsigned short int - nesse caso, o "unsigned"e o "short"são os modificadores). Veja abaixo os modificadores elementares: • signed: usado para int e char. Indica que os números negativos devem ser considerados. É o default, podendo ser omitido; • unsigned: usado para int e char. Indica que números negativos devem ser desconsidera- dos. Permite que números positivos maiores possam ser armazenados nas variáveis (em contrapartida, números negativos não poderão ser armazenados); • short: usado para int. Indica que a variável deve usar menor ou igual quantidade de bits de armazenamento do que o convencional; • long: usado para o int. Indica que a variável deve usar menor ou igual quantidade de bits de armazenamento do que o convencional. Existem também os qualificadores de tipos. Eles são freqüentemente utilizados para otimiza- ção do programa. Seu uso básico é: <qualificador> <declaração> Onde <declaração> pode ser uma declaração de variável (como unsigned short int i = 0;) ou de função. Os principais qualificadores são: • auto: indica ao compilador que o objeto (variável ou função) declarada a seguir deve ter seu escopo restrito ao bloco que ela foi declarada (no caso de uma variável, indica que não deve ser visível fora do ""e em que ela foi declarada). Esse qualificador é raramente utilizado, pois é o padrão na linguagem C; 40
  • 42. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF • extern: indica que o objeto declarado a seguir (variável ou função) já foi declarado fora do bloco (seja, fora do ""e ou até em um arquivo diferente) e que o objeto previamente declarado deve ser usado no seu lugar. É útil quando diversos arquivos fontes são usados para um mesmo programa; • register: indica que a variável declarada a seguir deve estar presente em um armazena- mento temporário mais veloz o possível. Antigamente, esse qualificador indicava que a variável deve estar presente no registrador da CPU, mas atualmente ele só indica que a varíavel deve estar no dispositivo mais veloz e utilizável no momento; • volatile: indica que a variável a seguir pode ter seu conteúdo alterado por um fator ex- terno ao programa (ex. Sistema Operacional, processos concorrentes, threads paralelos, interrupções do programa, etc). São úteis nos seguintes casos: – o utilizar como um objeto que é uma porta de entrada/saída mapeada em memória; – o utilizar o objeto entre diversos processos concorrentes (quando diversos programas em execução devem utilizar uma mesma variável ou porção da memória); – o quando um objeto terá seu conteúdo alterado com um serviço de interrupção (ex. o famoso comando "kill"envia um sinal de interrupção para terminar um processo em execução). Como podem ver nas explicações acima, esses qualificadores de tipos/variáveis são usados para gerar programas avançados e seu uso será explicado mais adiante. 3.2.5 Constantes Vamos tratar rapidamente da utilização de constantes em programas feitos em C. A utilização de constantes é uma técnica muito importante na linguagem C, que torna os programa bem mais legíveis e mais polidos fazendo com que qualquer alteração seja bem mais simples de fazer sem a necessidade de procurar, às vezes por mais de uma hora, o bloco de código em que a variável está para que ela seja alterada. Para exemplificar, imagine que você fez um programa para uma empresa que possua três departamentos. Você precisa manter o cadastro de todos os funcionários desses departamentos e mais algumas tarefas relacionadas. Imagine agora que você vai vender esse software para uma segunda empresa, sendo que esta precisa organizar a ficha de todos os funcionários dos cinco departamentos da empresa. Para preparar o programa para essa segunda empresa, você vai ter que procurar todas as ocorrências das variáveis que controlam o número de departamentos e alterar todas. A não alteração de uma ou mais aparições dessas variáveis fazerá com que o programa funcione de forma não planejada, gerando reclamações por parte dos clientes. Se ao invés de utilizar uma ou mais variáveis, você utilizar apenas uma constante que é utilizada em todo o programa e se a especificação da constante estiver no começo do programa, tudo que você precisa fazer para vender o software para a segunda empresa é trocar o valor da constante. Simples, não? #include <stdio.h> #define NUM_DEPT 4 int main() { 41
  • 43. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF comando1; comando2; ... for (intDept = 0 ; intDept < NUM_DEPT ; intDept++) {codigo} } E assim constantes podem ser utilizadas para praticamente qualquer variável, inclusive stings. Por exemplo: #define STR_ERRO404 "A página não pode ser encontrada. Verifique o endereço e tente novamente" #define ERRO_PAGINA_NAO_ENCONTRADA 404 #define PI 3.1415 E assim as constantes se tornam estruturas imprescindíveis no cotidiano de um programador. Utilize os conhecimentos que você já agregou e escreva alguns programas utilizando constantes. Tomando o cuidado de não exagerar, utilize constantes sempre que possível, isto é, sempre que você perceber que está utilizando o mesmo valor várias vezes. Nesses casos, o uso de uma constante é recomendável. 3.3 Elementos léxicos e sintáticos da linguagem C, parte 2 3.3.1 Introdução às funções Já iremos apresentar aqui as "funções"para vocês. Na verdade, as funções são um conceito relativamente avançado, mas decidimos mostrar já neste ponto, pois são o núcleo dos programas escritos em C (podemos dizer que um programa em C é um conjunto de funções, pois não há como existir um programa em C sem uma função). Como o nome diz, funções são "coisas"que desenvolvem tarefas. Brilhante... perplexo Funções são caixas pretas, onde você passa algum tipo de dado e espera receber algum tipo de saída. Explicando técnicamente, são módulos ou blocos de código que executam uma determinada tarefa. Essa é a melhor definição. Ele é carregado somente uma vez e é usado diversas vezes durante a execução do programa. Elas são o núcleo da sintaxe da linguagem C. Os exemplos abordados nesta página utilizam conceitos que ainda não foram apresentados neste curso. Ainda não se preocupe com os exemplos, pois serão mais interpretáveis futuramente (quando todos os elementos léxicos/sintáticos da linguagem forem apresentados). Para que servem elas? As tais funções existem por dois motivos básicos: • depuração de erros - quando se quebra um problema em pedaços menores, fica mais fácil detectar onde pode existir um problema; 42
  • 44. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF • reutilização - é visível que grande parte dos códigos que existem em um programa são repetidos, só se diferenciando as variáveis que são passadas a eles. Expliquemos então usando duas situações hipotéticas. A primeira, eu tenho que montar um carro. Posso fazer uma máquina que eu passe todas as peças e ela me retorne o resultado. Ou posso criar uma máquina que gerencie várias outras pequenas que desempenham tarefas diferentes que, juntando-as, eu obtenho o carro pronto. Intuitivamente, gostaríamos da primeira, mas devemos pensar que uma grande caixa preta é pior de se depurar do que várias outras pequenas e de tarefas específicas. Imagine se acontece algum problema na caixa preta grande, teríamos que abri-la toda, mexer em várias coisas e tentar chegar a uma conclusão em relação ao problema. Já em um monte de caixas pequenas especializadas, detectaríamos o problema muito mais facilmente, só pelas tarefas que elas realizam. Podemos citar não só questão de problemas, como performance, entendimento e confiabilidade. Outra situação. Imagine que eu precise fazer uma calculadora. Eu poderia fazer um conjunto de operações (função), que em um bolo de código calculasse todos os tipos de operações mate- máticas desejáveis em minha calculadora no momento. Agora pense, depois de 1 ano, eu preciso de 2 operações matemáticas das 15 que minha calculadora antiga fazia, o que fazer ? Agregar o bolo de código com 15 funções, 13 delas desnecessárias? A modularização serve para o reapro- veitamento de código, devemos chegar a pedaços razoáveis e especializados de código que nos resolvam problemas e que possamos utilizá-los depois. Lembre-se, isso é uma prática não muito fácil, depende da experiência do profissional e como ele faz a análise inicial do problema, quebrando-os em menores pedaços e chegando a módulos pequenos e ao mesmo tempo usuais. Resumindo, o uso de funções: • economiza memória e aumenta a legibilidade do programa; • melhora a estruturação, facilitando a depuração e a reutilização. Nomes Bem, podemos dar nomes às funções assim como em variáveis. Letras de A até Z, sem preocupação de maiúscula/minúscula, de 0 a 9 e com underscore (aquele menos achatado, "_"). Precisa começar por caracteres ou underscore. É "case sensitive", ou seja, funções com o mesmo nome, mas letras diferentes (em case) não são consideradas iguais. Podemos exemplificar: esta_e_uma_funcao e Esta_e_uma_funcao, o "E"("e") é diferente! A estrutura de uma função A estrutura básica de uma função é: tiponomeDaFuncao ( tipo1parametro1, tipo2parametro2 , ... ) { código1; . . . códigoN; } OBS: Elementos sublinhados podem ser substituídos por algum elemento sintático da lingua- gem (exemplo: tipo pode ser substituído por int, que é um elemento sintático de tipo de dado no C). A cara de uma função é basicamente essa, veja abaixo para um exemplo: 43
  • 45. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF void imprimeSoma ( int fator1 , int fator2 ) { int total; total = fator1 + fator2; printf ("A soma vale: %d",total); } Ignore a palavra void por enquanto. Ela somente indica que a função não tem tipo (isso indica que a função não tem valor de retorno - veja "tipo de funções"adiante). Quando chamo a função usando o comando imprimeSoma(5,3); , eu recebo a mensagem da adição de 5 por 3, e retorno ao meu programa. Conseguiu materializar? Note que as chaves (o "{"e o "}") delimitam o que faz parte da função (bloco) e o que não o é. A função main() A função main() é a função principal de um programa. Ou seja, todo programa tem que ter a função main(), caso contrário o compilador reclama e não gera o executável. Um programa começa executando a função main() e termina quando a função main() termina. Porém, dentro da função main() você pode chamar (executar) outras funções. Falaremos mais sobre o main() adiante. O ponto inicial de execução do programa é chamado de "entry point", logo, a função main() é o entry point de qualquer programa escrito na linguagem C. Ela pode retornar um valor de tipo int. Ou seja, retorna um número, em geral para o sis- tema operacional, com o código de sucesso ou indicando qual o erro (número do erro) ocorreu durante a execução do programa. O número de erro retornado pelo main() é conhecido pelos programadores como o "condition code". A função main() pode ter as seguintes estruturas: • int main() • int main (int argc , char *argv[]) As estruturas acima são as mais aceitas como padrão. Adicionalmente, muitos compilado- res aceitam o tipo de retorno do main() omitido (ou seja, o "int"seria desnecessário) ou como "void"(sem tipo), mas as construções da lista acima são mais recomendadas para maior portabi- lidade (capacidade de rodar/compilar seu programa em diversas plataformas). A função main() aceita dois argumentos (parâmetros entre parênteses). Eles são parâmetros passados pelo sistema operacional quando os programas são ativados. Por exemplo, no terminal de comando do Linux você pode digitar o comando ls -l. Nesse caso, o ls seria o nome do programa e o -l seria o parâmetro que o sistema operacional repassará para o programa fazer o devido tratamento. Os parâmetros do main() representam esses argumentos. Veja abaixo para uma breve descrição desses parâmetros: • argc: é do tipo inteiro (numeral). Indica a quantidade de argumentos que foram repassados pelo sistema operacional, ou seja, indica a quantidade de elementos contidos no vetor argv. Seu valor é sempre maior ou igual à 1 (um), pois o próprio nome do programa compilado é considerado como um argumento. • argv: é um vetor de strings (string é uma palavra ou um conjunto de letras/caracteres). Eles contêm todos os argumentos repassados pelo sistema operacional. O primeiro elemento (o elemento 0 - zero) é sempre o nome do próprio programa executável. 44
  • 46. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF Esses parâmetros são úteis para fazer um programa que opere de forma distinta dependendo do que o usuário tem passado no terminal de comando. Ainda não se preocupe muito com o uso correto desses parâmetros. Como eles usam vetores (conceito ainda não explicado detalha- damente), você não tem a obrigação de saber utilizá-los neste momento. Basta saber que um mecanismo tão útil já existe na linguagem C. Chamando funções Bem, podemos chamar (executar) as funções do ponto que desejamos, desde que ela já tenha sido declarada. Ela desvia o fluxo do programa, por exemplo: int main() { int a=10,b=3; ação1; ação2; imprimirSoma(a,b); ação3; } Nota: neste exemplo ação 1, 2 e 3, podem ser quaisquer comandos (Até mesmo outra função). O programa desviará o fluxo na chamada da função "imprimirSoma", logo após a "ação2". Isto suspenderá temporariamente a execução do programa para poder executar a função diminuir, até que a mesma termine (retorne). Tipos de funções Existem basicamente dois tipos de funções. Aquelas que retornam alguma coisa a quem a chamou e aquelas que não retornam nada. Começando pelas que não retornam, elas simplesmente realizam tarefas, como o exemplo anterior. Ela faz uma série de passos e retorna o fluxo ao programa principal, sem interferir em nada em sua execução, a não ser pelo tempo de execução, saída na tela e mudanças em alguns dados compartilhados. Outra opção são funções que retornam um valor de um tipo. Lembre-se, como declaramos uma função? tipoX nome(tipo1 var1,tipo2 var2); e assim por diante. Ou seja, o tipoX equivale ao tipo de dado que a função vai retornar. Vamos entender: int diminuir(int parcela1, int parcela2) { int total; total = parcela1 - parcela2; return total; } ... int main() { int a=10,b=3,total; 45
  • 47. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF ação1; ação2; total = diminuir(a,b); printf ("A subtracao vale: %d",total); ação3; } O efeito é exatamente o mesmo, só que agora o programa principal é que estará jogando a mensagem na tela e a variável do programa, chamada total, que terá o valor da subtração (resultado, tipo int, retornado de diminuir(a,b)). Aos poucos vamos juntando as peças. Vale ressaltar, o que determinou a saída da função, no caso, foi a chamada ao comando return (que é um comando de desvio), que interrompe o fluxo do bloco que está sendo executado (saindo deste bloco) e volta aquele imediatamente anterior. Não é necessário chegar até a última linha da função, pois o return pode estar na 1a, 2a, onde quer que seja. 3.3.2 Bibliotecas Já que mostramos o que é uma função, aproveitamos para apresentarmos o que é uma bibli- oteca. Você pode entender as bibliotecas como um conjunto de declarações (seja de funções, tipos, variáveis, etc) que foram criadas de forma estratégica para possibilitar sua utilização em diversos programas. Como dito anteriormente, funções são uma forma genérica de resolvermos problemas. É como uma caixa preta. Você passa os dados para ela e recebe o resultado. Supondo que tenho uma função de realizar soma, eu só me preocupo em passar para ela os números que desejo ver somado e a função se preocupa em me entregar o resultado, o que acontece lá dentro é problema dela. Através deste método, dividimos os programas em pedaços de funcionalidades, genéricos e pequenos de preferência, com intuito de utiliza-lo futuramente em situações que sejam conveni- entes. Assim como soma, pode-se fazer uma função de subtração, multiplicação, divisão e várias outras e juntando-as se cria a tal famosa biblioteca. As bibliotecas em si podem ser utilizadas por vários programas. Só para esclarecer, tenho uma biblioteca que desenha botões em janelas(GTK faz isso). Na hora que se for criar uma agenda, por exemplo, utilizo as funções desta biblioteca sem precisar rescrever estas mesmas funções neste programa. Isso pouparia meu tempo e espaço de HD (apesar de um código fonte não ser algo que ocupe TANTO espaço). Veja abaixo alguns exemplos de bibliotecas que podem ser encontradas sem muito esforço em distribuições Debian. Eles se encontram na pasta /usr/include. • aio.h • expat_config.h • jerror.h • printf.h 46
  • 48. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF • termio.h • aliases.h • expat_external.h • jmorecfg.h • pthread.h • termios.h • alloca.h • expat.h • jpegint.h • pty.h • tgmath.h • a.out.h • fcntl.h • jpeglib.h • pwd.h • thread_db.h • argp.h • features.h • langinfo.h • re_comp.h • tiffconf.h • argz.h • fenv.h • lastlog.h • regex.h • tiff.h • ar.h • FlexLexer.h • libgen.h 47
  • 49. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF • regexp.h • tiffio.h • assert.h • fmtmsg.h • libintl.h • resolv.h • tiffvers.h • autosprintf.h • fnmatch.h • libio.h • sched.h • time.h • byteswap.h • fpu_control.h • limits.h • search.h • tls.h • complex.h • fstab.h • link.h • semaphore.h • ttyent.h • cpio.h • ft2build.h • locale.h • setjmp.h • ucontext.h • crypt.h • fts.h 48
  • 50. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF • malloc.h • sgtty.h • ulimit.h • ctype.h • ftw.h • math.h • shadow.h • unistd.h • dialog.h • _G_config.h • mcheck.h • signal.h • ustat.h • dirent.h • gconv.h • memory.h • spawn.h • utime.h • dlfcn.h • getopt.h • mntent.h • stab.h • utmp.h • dlg_colors.h • gettext-po.h • monetary.h • stdint.h • utmpx.h • dlg_config.h 49
  • 51. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF • glob.h • mqueue.h • stdio_ext.h • values.h • dlg_keys.h • gnu-versions.h • netdb.h • stdio.h • wait.h • dts.h • grp.h • nl_types.h • stdlib.h • wchar.h • elf.h • gsm.h • nss.h • string.h • wctype.h • endian.h • iconv.h • obstack.h • strings.h • wordexp.h • envz.h • ieee754.h • oss-redir.h • stropts.h • xlocale.h 50
  • 52. CDTC Centro de Difusão de Tecnologia e Conhecimento Brasil/DF • err.h • ifaddrs.h • paths.h • syscall.h • zconf.h • errno.h • initreq.h • pngconf.h • sysexits.h • zlib.h • error.h • inttypes.h • png.h • syslog.h • execinfo.h • jconfig.h • poll.h • tar.h Claro, você não precisa saber de todas elas. O .h é a extensão do arquivo cabeçalho que contém as definições da biblioteca - header em inglês. Os arquivos cabeçalho são arquivos texto (você pode abri-lo em qualquer editor de texto para lê-lo), mas conterão somente declara- ções/protótipos das funções (são somente "assinaturas"das funções, ou seja, funções sem corpo) e a implementação dessas funções (os códigos em C) geralmente estarão em outros arquivos (que raramente são textos). Técnicas de como se fazer isso (criar bibliotecas que contenham o código em outros arquivos) serão tratadas mais adiante. Em geral, utilizamos algumas funções já prontas para fazer determinadas tarefas que são consideradas básicas. O programador não costuma fazer uma rotina que leia diretamente do teclado ou imprima na tela um caractere. Isso já existe e é bem implementado (uma coisa interessante de se entender em programação é: o que já existe de bem feito e pode ser utilizado deve ser utilizado). Seu sistema não será menos digno ou pior se você utilizar uma rotina que todo mundo utiliza em vez de ter a sua própria. O que importa é a finalidade do programa e o quão bem implementado ele esteja. Tais funções, que falamos básicas, fazem parte da biblioteca C padrão (as que geralmente começam com a seqüência "std", que significa standard ou "padrão"). Todo compilador C a possui e ele faz parte da padronização ANSI C. Seu compilador, independente do sistema que você utiliza, deve possuir essas bibliotecas (ou seria um furo inquestionável). Outras bibliotecas 51