You are on page 1of 9

Introduo

Aqui introduzimos o funcionamento bsico dos computadores e ensinamos como podemos


utiliz-los e program-los para realizar tarefas de nosso interesse.

Algoritmos
Um algoritmo uma seqncia de instrues que permite realizar uma determinada tarefa.
O conceito de algoritmo tambm conhecido por outros nomes, entre eles podemos citar:
receitas, procedimentos ou tcnicas.
Recordando
Em geral,
Algoritmo uma seqncia finita de instrues necessrias para se
realizar uma determinada tarefa.
As instrues que compem o algoritmo so executadas uma de cada vez, seguindo-se a
ordem especificada na seqncia dada. Normalmente, inicia-se a execuo pela primeira
instruo, exceto quando outra instruo explicitamente indicada como sendo a primeira a
executar. As instrues devem ser sempre primitivas, no sentido de que cada uma delas
individualmente executvel pelo computador, no dependendo de interferncia de outros
agentes. No nosso caso, ao escrevermos nossos algoritmos na linguagem C, esta condio
estar automaticamente satisfeita, pois que a linguagem C s conta com instrues que j
so suficientemente primitivas. Mais especificamente, todas as instrues da linguagem C
so tratadas adequadamente pelo compilador C correspondente. Este ltimo, por sua vez,
gera uma seqencia de instrues que so primitivas para o computador em questo.
Durante a execuo do algoritmo, uma de suas instrues pode determinar que viole a
ordem seqencial das instrues, fazendo com que o ponto de execuo salte para outra
instruo que no seja a prxima instruo na seqncia do algoritmo. Por exemplo, pode
determinar a volta para a primeira instruo, ou determinar que se ignore a prxima
instruo passando a executar a segunda seguinte na seqncia. Normalmente, um salto est
associado ao teste de uma condio como, por exemplo, uma comparao entre dois
nmeros. Nesses casos, realizar o salto depender se a condio avaliada como verdadeira
ou falsa, nesse instante. Tambm possvel que uma instruo simplesmente indique um
salto para outra instruo, independente de condies a ela associadas.
Em algum momento, o algoritmo deve encontrar uma instruo sinalizando o fim da
execuo. Ou seja, o tempo total necessrio para terminar a execuo do algoritmo deve
sempre ser finito e, preferencialmente, dentro de um prazo razovel.
Para ser de utilidade, o algoritmo precisa produzir algum resultado, ou dado de sada. Caso
contrrio, o algoritmo no nos forneceria nenhuma informao nova. Por exemplo, ele
poderia calcular uma frmula complexa ou localizar alguma informao em um banco de
dados, e informar os resultados. Usualmente, algoritmos tambm aceitam dados como
entrada, que so usados para guiar sua execuo. Seno, ele sempre produziria os mesmos
dados de sada, ou respostas.

10/3/2010 10:27 Copyright@2005-2009 Arnaldo V. Moura, Daniel Felix Ferber 1


Exemplo de algoritmo
Um dos algoritmos mais conhecidos o Algoritmo de Euclides. Ele utilizado para
determinar o mximo divisor comum (MDC) entre dois nmeros inteiros positivos.

O MDC determinado realizando divises entre os dois nmeros. Caso a diviso resulte
em resto no nulo, a diviso novamente realizada, substituindo os nmeros anteriores pelo
divisor e pelo resto. Descrevendo essa idia como uma seqncia de passos elementares,
poderamos ficar com o seguinte algoritmo:

ALGORITMO:
1. Leia dois nmeros.
2. Divida o primeiro pelo segundo e guarde o resto.
3. Se o resto for 0 (zero),
ento escreva o segundo nmero e PARE.
4. Substitua o primeiro nmero pelo segundo.
5. Substitua o segundo nmero pelo resto da diviso.
6. Retorne ao passo 2.
Algoritmo 1 MDC (Euclides)

Vamos calcular o MDC entre 24 e 18, seguindo o algoritmo acima. esquerda est
indicado qual passo do algoritmo est sendo executado:

Passo 1: L os dados de entrada: 21 e 15.


Passo 2: 21 15 = 1, resto 6.
Passo 3: Resto 0? No, continua com passo 4.
Passo 4: Substitui 21 por 15.
Passo 5: Substitui 15 por 6.
Passo 6: Retornar para passo 2.
Passo 2: 15 6 = 2, resto 3.
Passo 3: Resto 0? No, continua com passo 4.
Passo 4: Substitui 15 por 6.
Passo 5: Substitui 6 por 3.
Passo 6: Retornar para passo 2.
Passo 2: 6 3 = 2, resto 0.
Passo 3: Resto 0? Sim. Escreve 3 e PARE.

Ou seja, segundo o valor gerado pelo algoritmo, o MDC entre 21 e 15 3, o que est
correto.
Note que:
O algoritmo iniciou sua execuo pela primeira instruo (passo 1) e realizou um
nmero finito de instrues at encontrar a instruo PARE (num total de 13 passos
executados).
A entrada do algoritmo foram os nmeros 21 e 15. A sada foi o nmero 3.

10/3/2010 10:27 Copyright@2005-2009 Arnaldo V. Moura, Daniel Felix Ferber 2


O passo 3 uma instruo que contm a condio de teste "Resto 0?". Se essa
condio no satisfeita, o algoritmo segue com a prxima instruo. Caso
contrrio, executa o restante da instruo do passo 3 e pra.
O passo 6 uma instruo de desvio incondicional, ou seja, ao executar esse passo,
o algoritmo simplesmente salta de volta para o passo 2.
Dificuldades na descrio de um algoritmo
A descrio das operaes envolvidas em um algoritmo gera vrias dificuldades quando
utilizamos a lngua portuguesa. Devemos considerar:
A instrues no podem permitir ambigidades na interpretao de sua operao.
Algum poderia questionar o que significa exatamente Divida o primeiro nmero
pelo segundo e guarde o resto. O que fazer com o quociente? Trata-se de uma
diviso com casas decimais? Como proceder quando os nmeros so negativos?
Cada instruo deve realizar uma nica operao bem definida. No caso do
algoritmo para calcular o MDC, um dos passos diz: escreva o segundo nmero e
PARE. Claramente, a instruo PARE no est relacionada com a instruo
ESCREVA.
As operaes devem ser tecnicamente possveis de serem executadas dentro de um
prazo de tempo razovel. Podemos utilizar a operao de diviso, pois existem
circuitos eletrnicos capazes de determinar rapidamente o resultado da diviso de
um nmero por um outro. No entanto, um algoritmo no poderia pedir a fatorao
de um nmero em um nico passo, pois no se conhece uma forma eficaz de
realizar esta operao.

Linguagem de Programao
Essas dificuldades no podem persistir quando se descreve um algoritmo para execuo em
um computador, pois este no tem a capacidade de desambiguar as instrues que no esto
claras, nem de executar instrues que no estejam pr-definidas em seus circuitos internos.
Para aliviar esses e outros problemas quando se descreve algoritmos que vo executar em
um computador, buscou-se outras formas para descrever algoritmos.
A primeira alternativa seria o uso de recursos grficos, como, por exemplo, diagramas. No
entanto, esta abordagem muito trabalhosa e difcil de automatizar para tratamento por um
computador. Assim, predominou uma forma mais prtica, as linguagens de programao.
Essas linguagens possuem um vocabulrio restrito (normalmente palavras do idioma ingls)
e vrias regras indicando vrias restries que devem ser obedecidas ao se escrever
algoritmos. Seguindo-se essas regras risca, idealmente, toda seqncia de instrues
descrever um algoritmo muito bem definido. De forma geral, uma linguagem de
programao impede que a pessoa escreva uma instruo de forma ambgua.

Linguagens de programao permitem a descrio precisa de um


algoritmo.

Existem programas de computador capazes de ler um algoritmo escrito em uma linguagem


de programao e informar se as regras da linguagem foram violadas, impedindo assim
qualquer possibilidade de inconsistncia ou ambigidade.

10/3/2010 10:27 Copyright@2005-2009 Arnaldo V. Moura, Daniel Felix Ferber 3


Neste curso, estudaremos a linguagem de programao denominada Linguagem C, ou
simplesmente C.
Exemplo
Nesse ponto, limitar-nos-emos a ilustrar algumas caractersticas do algoritmo para calcular
o MCD quando escrito na linguagem C. Estudaremos os detalhes durante o curso.

Notamos que as operaes do algoritmo agora so Algoritmo 2 MDC na linguagem C


expressas atravs de operaes aritmticas
indicadas por smbolos como (=, = =, %). No int a, b, r;
entanto, os smbolos que representam as scanf(%d %d, &a, &b);
operaes no necessariamente so os mesmo do {
com os quais estamos acostumados. r = a % b;
Existem palavras com significado especial na if (r == 0) break;
linguagem de programao (chamadas palavras a = b;
chave) tais como: int, scanf, do, break e b = r;
muitas outras que aprenderemos durante o curso. };
O exemplo tambm ilustra um caso das regras de printf(O MDC %d, b);
uso da linguagem C, tambm chamadas de regras return;
de sintaxe: todas as instrues devem ser
terminadas por ponto-e-vrgula.
Alm disso, nem todas as linhas da descrio correspondem a aes a serem executadas
pelo algoritmo. Por exemplo, a primeira linha apenas declara os nomes a, b e r. A
primeira instruo a executar est localizada, na realidade, na segunda linha. Na verdade,
scanf no propriamente uma instruo primitiva da linguagem C. Trata-se de uma
rotina, ou seja, um comando que engloba muitas instrues que so automaticamente
executadas quando scanf invocado. Entraremos em mais detalhes sobre rotinas
oportunamente.
A segunda e penltima linhas so instrues de entrada e sada de dados, respectivamente.
A ltima linha a instruo de parada.

O computador
Os componentes que formam um computador podem ser classificados em duas categorias:
armazenamento e processamento. O primeiro grupo envolve componentes que guardam
dados a serem utilizados pelo computador. Alguns exemplos so: memrias, discos
magnticos, CDs e fitas magnticas. O segundo grupo formados por componentes capazes
de utilizar os dados armazenados no computador e realizar alguns tipos de operaes sobre
os mesmos, como localizar informaes de um cliente, gerar relatrios, calcular estatsticas
ou atualizar os dados armazenados.
Novos dados ou comandos para controlar o computador so obtidos atravs de dispositivos
de entrada (teclado, mouse, conexes de rede, scanner, cmera digital, etc). Outros
dispositivos, chamados dispositivos de sada, permitem ao computador divulgar dados
obtidos pelo processamento ou contidos no armazenamento. Exemplos so: monitor,
impressora, caixas de som.

10/3/2010 10:27 Copyright@2005-2009 Arnaldo V. Moura, Daniel Felix Ferber 4


O computador armazena dados e realiza operaes sobre os mesmos.
Dados so obtidos por dispositivos de entrada. Resultados so
informados em dispositivos de sada.

Instrues de mquina
Para realizar operaes sobre os dados contidos nos dispositivos de armazenamento, o
processamento do computador segue um algoritmo, ou seja, uma seqncia finita de
instrues bem definidas. Em contraste com as instrues escritas em uma linguagem de
programao como C, porm, as instrues diretamente executadas pelo computador esto
escritas em outro dialeto, chamado de instrues, ou cdigo, de mquina. Essas instrues
so muito mais primitivas do que aquelas que podemos utilizar ao descrever algoritmos em
linguagens de programao tais como C. Infelizmente, o hardware do computador no
consegue executar diretamente as instrues escritas em C. Por outro lado, felizmente,
existem meios automticos de se converter uma seqncia de instrues escritas na
linguagem C para instrues de mquina. Dessa forma, os programadores no precisam
usar cdigo de mquina diretamente para descrever seus algoritmos, o que seria um esforo
muito mais severo e muito mais suscetvel a erros. Basta usar instrues da linguagem C e,
uma vez pronto o algoritmo, acionar os mecanismos automticos de converso.
O cdigo gerado um algoritmo que o computador consegue executar de forma montona
e repetitiva, porm em altssima velocidade, simulando as instrues que havamos escrito
na linguagem C.

O computador uma mquina rpida e eficiente para simular algoritmos.

Exemplo
A ttulo de ilustrao, apresentamos, nos slides que acompanham este texto, um algoritmo
para encontrar o MDC de dois nmeros escrito na linguagem de mquina especifica de um
computador com um processador Intel.
Note como as instrues so pouco intuitivas, pois no conseguem expressar diretamente
nossa capacidade de abstrair o problema. Ademais, cada instruo do algoritmo original
exige vrias instrues de mquina para que se produza o meso efeito, ou seja, o cdigo de
mquina uma descrio extremamente detalhista.
Para complicar ainda mais a descrio do algoritmo, o cdigo de mquina exige instrues
que s dizem respeito ao circuito eletrnico especfico de um tipo de processador. Ou seja,
alm do programador preocupar-se em escrever corretamente o algoritmo, ele forado a
planejar seu algoritmo respeitando as caractersticas internas de um determinado
processador. Muito provavelmente, o algoritmo em cdigo de mquina escrito para um
determinador processador no vai executar corretamente em outro processador.

Nveis de Abstrao
Durante esta introduo, apresentamos diversas opes para se descrever um algoritmo.
So elas: portugus, linguagem de programao, e cdigo de mquina.

10/3/2010 10:27 Copyright@2005-2009 Arnaldo V. Moura, Daniel Felix Ferber 5


Os dois extremos so portugus e cdigo de mquina. A vantagem de se utilizar portugus
est na facilidade de se descrever o algoritmo com palavras de nosso dia a dia. No entanto,
este texto ser potencialmente ambguo e no h ferramentas para traduzi-lo diretamente
para a linguagem do computador.
J a linguagem de mquina est justamente num formato que pode ser interpretado
diretamente pelo computador. Alm disso, as instrues so precisas e bem definidas, tal
como necessrio para descrever algoritmos. Infelizmente, muito complicado escrever um
algoritmo em cdigo de mquina, pois o resultado extremamente complexo e detalhista,
exigindo um conhecimento profundo sobre as caractersticas do processador. Com isso,
acaba-se usando tempo e energia com preocupaes irrelevantes programao de
algoritmos.
Buscamos uma opo que permita escrever os algoritmos sem ambigidade e com
operaes bem definidas. Esta opo nos dada pelas linguagens de programao, que
oferecem um meio termo interessante entre no ambigidade e poder de expresso. Existem
centenas, seno milhares, de linguagens de programao em uso. Nesse texto, vamos nos
concentrar numa das mais populares, a linguagem C.
Antes, entretanto, vamos examinar com um pouco mais de detalhes a tarefa de preparar um
programa, ou algoritmo, em uma linguagem de programao.

Construo do Programa
A preparao de um programa, ou algoritmo, para execuo em um computador envolve
vrios passos. O objetivo final obter um arquivo com um cdigo de mquina que possa
ser diretamente interpretado pelo computador como um programa ou aplicao:
1. O programador deve, primeiro, elaborar um algoritmo considerando todas as
questes estudadas anteriormente, principalmente eficcia e correo. O
programador pode represent-lo da forma que preferir.
2. Em seguida, o programador descreve o mesmo algoritmo utilizando uma linguagem
de programao. A esta descrio damos o nome de cdigo fonte. Neste curso,
aprenderemos a linguagem C para este propsito.
3. Depois, necessrio utilizar um compilador para, automaticamente, traduzir o
programa escrito em C para um conjunto de instrues que formam o cdigo de
mquina. Para isso, temos vrios compiladores disponveis.
4. Depois de compilar o algoritmo, devemos test-lo, executando o cdigo de mquina
no computador.
Eventualmente, ao escrevermos o algoritmo numa linguagem de programao, cometemos
erros que sero acusados pelo compilador. Neste caso, voltamos ao passo 2 para corrigir o
cdigo fonte do algoritmo.
Durante a execuo do algoritmo, eventualmente, encontraremos algumas inconsistncias
no seu comportamento. A origem do erro exigir um retorno ao passo 1, para reprojetar o
algoritmo, ou tambm ao passo 2, para reescrever seu cdigo fonte.

10/3/2010 10:27 Copyright@2005-2009 Arnaldo V. Moura, Daniel Felix Ferber 6


Primeiro Programa
Este captulo apresenta os principais conceitos encontrados na estrutura de um programa de
computador escrito na linguagem C.
O programa utilizado como exemplo neste captulo serve como ponto de partida para os
demais exemplos e exerccios ao longo do curso.

O programa "Bom Dia"


Este um programa bem simples, cujo propsito limita-se a imprimir a frase O primeiro
programa lhe deseja um bom dia!. Este programa to simples que nem sequer possui
uma interface grfica convencional, com a qual estamos acostumados. Ele abre uma janela
prpria e, portanto, executa dentro de uma janela do prompt do MS-DOS.
/* ProgramaBasico.c:
Nosso primeiro programa em C */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
// imprime mensagem e para
printf("O primeiro programa lhe deseja um bom dia!");
return 0;
}
Observao: O VisualStudio reconhece o cdigo C enquanto voc o digita no editor. Ele
atribui cores automaticamente ao cdigo C e insere tabulaes de acordo com convenes
estabelecidas para a linguagem C. As cores e as tabulaes podem variar entre os editores.
No h problema quando o seu cdigo apresenta cores ou alinhamento diferente dos
exemplos apresentados neste curso, desde que o texto seja exatamente o mesmo. Outros
ambientes de programao, alem do VisualStudio, vo ter funcionalidades semelhantes.

Estrutura do Cdigo Fonte


J aprendemos que utilizamos uma linguagem de programao (neste caso, a linguagem C)
para descrever como realizar as operaes definidas por um algoritmo. No entanto, para se
obter um programa funcional, alm da descrio do algoritmo em si, precisamos indicar
outras informaes. Normalmente, encontramos os seguintes itens em um programa tpico.
Cada um ser descrito detalhadamente mais adiante:
Comentrios
Diretivas de compilador
Declarao de variveis e definio de procedimentos e funes
Instrues
Pontuao
Comentrios
Comentrio um texto que ser ignorado pelo compilador, mas contm informao til
para o programador. Neste exemplo, utilizamos uma linha de comentrios para descrever
do que trata nosso programa.

10/3/2010 10:27 Copyright@2005-2009 Arnaldo V. Moura, Daniel Felix Ferber 7


O primeiro tipo de comentrio delimitado pelos pares de smbolos /* e */, e pode
ocupar uma ou mais linhas no cdigo fonte. J o segundo tipo de comentrio, comea com
o par de smbolos // e estende-se at o final da linha.
Diretivas de compilador
No incio do cdigo fonte, antes de qualquer instruo do algoritmo, usualmente
necessrio listar algumas diretivas de compilador. Seu uso mais recorrente indicar outros
arquivos que devem ser consultados antes de se iniciar o processo de compilao. Estes
arquivos contm declaraes das instrues complexas (i.e. funes) mais comuns, como
por exemplo, leitura e escrita de dados. Por exemplo, a instruo printf no uma
instruo primitiva. Na verdade, trata-se de uma funo relativamente complexa. Para que
possa ser usada nesse ponto do programa, o compilador tem que conhecer detalhes dessa
funo. Esses detalhes esto no arquivo stdio.h. por isso que devemos usar uma diretiva
do compilador para inserir esse arquivo antes do uso dessa funo no cdigo que estamos
escrevendo. Outro uso das diretivas alterar o comportamento do compilador para um
determinado trecho do cdigo fonte, como veremos ao longo do curso. Posteriormente
sero dados mais detalhes sobre outros usos das diretivas de compilador.
Por ora, para entender os exemplos e compilar os exerccios, os programas devem sempre
conter as seguintes diretivas:
#include <stdio.h>
#include <stdlib.h>
Caso seja necessrio realizar operaes matemticas avanadas, deve-se incluir a seguinte
diretiva:
#include <math.h>
Variveis, Procedimentos e Funes
Um procedimento ou uma funo um conjunto de instrues que realizam alguma tarefa.
Desconsiderando os comentrios e as diretivas de compilador, o cdigo fonte constitui-se
numa seqncia de definies de procedimentos e funes. Alm dos procedimentos e
funes podemos tambm listar declaraes de variveis globais. Por ora, vamos ignorar a
lista de variveis, que ser tratada oportunamente mais adiante.
Em um programa escrito em C, existe uma funo especial, chamada main. Esta funo
contm as instrues por onde se inicia a execuo do programa, i.e., o programa inicia
executando a primeira instruo de main. O captulo Procedimentos e Funes, a ser
estudado mais para o final do curso, aborda este assunto em detalhes.
Por enquanto, importante saber que todo programa em C apresenta uma funo
exatamente de acordo com o esqueleto abaixo:
int main(int argc, char* argv[]) {
...
Algoritmo
...
return 0;
}
A declarao entre parnteses aps a palavra main deve ser "int argc, char*
argv[]". Ela pode ser substituda, em programas simples, simplesmente pela palavra
"void". Vamos uma ou outra declarao, exceto em casos explcitos onde a primeira deva

10/3/2010 10:27 Copyright@2005-2009 Arnaldo V. Moura, Daniel Felix Ferber 8


ser a utilizada. O algoritmo propriamente dito est entre as chaves externas { e }. Por ora, a
ltima linha do algoritmo deve ser return 0; para que o programa funcione
adequadamente.
Instrues e Pontuao
Cada procedimento ou funo composto por uma lista de variveis locais e por um
conjunto de instrues. Na verdade, a lista de variveis no faz parte do algoritmo
propriamente dito; lidaremos com esse aspecto de variveis locais e memria logo em
seguida. Nesse programa simples, no temos uma lista de variveis locais.
J o conjunto de instrues compem o algoritmo propriamente dito. As instrues so
executadas seqencialmente, e cada instruo separada da seguinte por sinais de
pontuao. A pontuao mais comum o ponto e vrgula (;), mas existem outros smbolos
que servem de pontuao: ! % ^ & * ( ) + = { } | ~ [ ] \ ' : " < > ? , . / #.

Prticas de programao
Um bom programador, alm de preocupar-se com um cdigo fonte, descrevendo um
algoritmo de forma correta e eficiente, tambm considera que a aparncia visual do cdigo
fonte um fator importante para que outras pessoas possam compreender o cdigo sem
muito esforo.
Algumas prticas e estilos aqui recomendados facilitam o entendimento do cdigo fonte:
Linhas em branco. So ignoradas pelo compilador. Utilize para separar blocos de
instrues.
Espaos e tabulaes. So ignorados pelo compilador. Podem ser teis para formatar o
cdigo fonte. Recomenda-se escrever todas as instrues comeando na mesma coluna.
Utilize espaos em branco ou tabulaes para recuar as instrues um pouco para a direita,
diferenciando-as do cabealho do procedimento ou da funo. Note que a maioria dos
editores para a linguagem C fazem isso automaticamente para voc.
Uma instruo por linha. Atravs do emprego correto de pontuao, o compilador capaz
de reconhecer vrias instrues que apaecem uma mesma linha. Mesmo assim, recomenda-
se escrever apenas uma instruo por linha, terminando-a sempre com ponto e vrgula.
No decorrer deste curso, sero apresentadas outras boas prticas de escrita de cdigo fonte.

10/3/2010 10:27 Copyright@2005-2009 Arnaldo V. Moura, Daniel Felix Ferber 9