DE
SANTO AMARO
Desenvolvimento de Sistemas
Sistemas de Informao
Desenvolvimento de Sistemas
Sistemas de Informao E a D
So Paulo
2009
Eugnio Akihiro Nassu
Desenvolvimento de Sistemas
Sistemas de Informao E a D
So Paulo
2008
2
1 Introduo
Nesta apostila, trataremos dois aspectos fundamentais no desenvolvimento de sistemas, primeiro,
apresentaremos a anlise estruturada, parte importante para a modelagem dos sistemas. Depois iniciaremos a
linguagem C, bsica para a programao. Todas as linguagens modernamente usadas so baseadas na
linguagem C, da sua importncia. Atualmente, outra forma bastante usada para anlise e modelagem de
sistemas a anlise e modelagem Orientada a Objetos, que objeto de outras disciplinas, assim como a
programao Orientada a Objetos.
Esta apostila dividida em duas grandes partes, uma dedicada anlise estruturada e a segunda uma
introduo linguagem de programao C.
3
Detalharemos cada um deles nas sees seguintes.
Entidade
Externa Processo Fluxo de
Depsito Dados
de Dados
Figura 1
4
As figuras 2 e 3 mostram exemplos de um DFD simples, um em cada notao.
D1
E1
F4
CLIENTES F5
F2
P1
Receber
F1 Pedidos
F1 - Pedidos Recebidos
F2 - Pedidos Invlidos
F3 F3 - Inf. de Pagamento
F4 - Detalhes de Pedidos
F5 - Detalhes de Remessa de
Pedidos
Figura 2
5
D1
E1
F2
CLIENTES F4 F5
P1
F1 Receber
Pedidos
F1 - Pedidos Recebidos
F2 - Pedidos Invlidos
F3 - Inf. de Pagamento
F3
F4 - Detalhes de Pedidos
F5 - Detalhes de Remessa de
Pedidos
Figura 3
O software SafeHome possibilita que o dono da casa configure o sistema de segurana quando ele for
instalado, monitora todos os sensores ligados ao sistema de segurana e interage com o dono da casa por
meio de um teclado (key pad) e teclas de funo contidas no painel de controle do SafeHome ilustrado na
Figura 6.6.
Durante a instalao, o painel de controle do SafeHome usado para programar e configurar o
sistema. A cada sensor atribudo um nmero e um tipo, uma senha mestra programada para armar e
desarmar o sistema e nmeros telefnicos so introduzidos para serem discados quando ocorrer um evento
sensor.
Quando um evento sensor sentido pelo software, ele dispara um alarme sonoro ligado ao sistema.
Aps um tempo de espera, que especificado pelo dono da casa durante as atividades de configurao do
sistema, o software disca um nmero telefnico do servio de monitorao, oferece informaes sobre o
local, registrando a natureza do evento que foi detectado. O nmero ser novamente discado a cada 20
6
segundos at que a ligao telefnica seja completada.
Todas as interaes com o SafeHome so gerenciadas por um subsistema de interao com o usurio,
que l a entrada fornecida pelo teclado e pelas chaves de funo, exibe mensagens de prompting e
informaes sobre o status do sistema no mostrador de cristal lquido (LCD). A interao com o teclado
assume a forma exibida na figura 4
of awa stay
1 2 3
SAFEHOME
ma test bypas
4 5 6
instant co chim
away
stay
instant
7 8 9
alarm bypass read
check not
fire ready 0 #
* panic
armed
power
Figura 4
Software Alarme
SafeHom
Tipo de
alarme
Status do Tons de
sensor nmeros
telefnicos Painel de
controle
SENSOR
Figura 5
Na figura 6 exibido um DFD com mais detalhes. Note que as entidades externas so as mesmas, e
detalhamos melhor o processamento dos comandos do sistema. Assim, a anlise se aproxima cada vez mais
da linguagem de programao, que deve ser um dos ltimos estgios do desenvolvimento.
8
Dados e comandos Subsistema de
Painel de do Usurio Interao com o
Controle Dados de Usurio
Configurar
Configurao
Sistema
9
Informaes
Formatar do Sensor
para o
Display
Informaes
Status do sensor Inf. de do Sensor
configurao
Ler
Sensores Dados de configurao
Formatar
Display Tipo de ID e
Localizao
Parmetro de Adquirir
Formatados
ID do sensor Inf. de
Resposta Tipo de ID e
Localizao
Formatados Gerar
Adquirir Impulsos
Condies Dados do p/ a Linha Tipo de
de Alarme alarme Alarme
Informaes sobre
Selecionar
codificao do alarme, ID do Lista de
Nro
sensor e timing Nmeros
Telefnico
Configurar
Tons de Nro
Ligao c/
Nmero Telefnico
a Rede
Telefnico Telefnica
Gerar
Sinal de
Alarme
10
2.1.2 Descrio dos Processos
Aps a preparao dos DFDs, h necessidade de se definir cada processo criado. Aqui apresentado a
Tcnica de Descrio de Processos em Portugus Estruturado que a forma mais popular de descrio das
funes do sistema. O portugus estruturado uma descrio um pouco mais prxima das linguagens de
programao, mas totalmente independente da linguagem que ser utilizada no sistema. Sua sintaxe um
pouco mais aberta, e uma linguagem em que a inteno ainda no ser executada no sistema, mas sim
apenas descrever como o cdigo que ainda ser elaborado deve se comportar. Suas principais caractersticas
incluem:
portugus - vocabulrio reduzido
sintaxe simplificada
identao
A) Sequncia: construo onde uma tarefa seguida por outra, incondicionalmente. Exemplo:
Subtrair o valor (R$) retirado do valor total
Gravar detalhes da transao no arquivo de totais
Liberar o dinheiro
B) Seleo: Aplica-se quando a realizao de uma tarefa (parte da funo) est condicionada a uma outra
tarefa/situao. Exemplos:
11
liberar o R$
Seno informar que o saldo insuficiente
C) Iterao: Aplica-se quando uma tarefa (parte da funo realizada repetidamente. Exemplo:
Para cada cliente
Para cada moeda
Se a moeda vlida
Somar valor da moeda a valor total inserido
Atualizar display
Se total inserido suficiente p/ a bebida selecionada
Liberar o copo
Dispensar a bebida
Seno rejeitar a moeda
Fim
Fim
O nvel de formalismo do Portugus Estruturado pode variar, de acordo com:
A fase de desenvolvimento do software
O interesse da empresa/equipe
Pouco formalismo a principal deficincia da tcnica.
12
D1
E1
F2
CLIENTES F4 F5
P1
F1 Receber
Pedidos
F1 - Pedidos Recebidos
F2 - Pedidos Invlidos
F3 - Inf. de Pagamento
F3
F4 - Detalhes de Pedidos
F5 - Detalhes de Remessa de
Pedidos
Figura 9
ENTIDADE EXTERNA
Observaes:
13
PROCESSO
DEPSITO DE DADOS
Entradas Sadas
F4 - Detalhes dos F5 - Detalhes de Remessa
Pedidos dos Pedidos
Contedo
Pedido
Identificao-pedido
Detalhes-clientes
Detalhes-produtos
ESTRUTURA DE DADOS
SE Discreto SE Contnuo
Valor Significado Limite de Variao dos
AM Amazonas Valores
SP So Paulo Valores Tpicos
PA Paran Significado dos valores
16
DADOS DOS SOFTWARES
detalhes dos
softwares
pedido
processar
CLIENTE pedido
nota fiscal
situao
de crdito
17
FORNECEDORES
DADOS DOS SOFTWARES DE SOFTWARE
detalhes dos
softwares
detalhes dos softwares a endereo,
serem providenciados telefone
pedido
verificar se
CLIENTE o pedido
vlido
situao de solicitar
crdito produtos ao
fornecedor
DADOS DO CLIENTE
PEDIDOS PENDENTES
nota fiscal
preparar
pedidos
detalhes dos softwares
disponveis
18
FORNECEDORES DE
DADOS DOS SOFTWARES SOFTWARE
detalhes dos
softwares
detalhes dos softwares a endereo,
serem providenciados telefone
pedido
verificar se
CLIENTE o pedido
vlido
situao de solicitar
crdito produtos ao
fornecedor
DADOS DO CLIENTE
PEDIDOS PENDENTES
nota fiscal
preparar
pedidos
detalhes dos softwares
disponveis
19
3 Linguagem C
A partir desta seo, apresentaremos a linguagem C, muito importante para o desenvolvimento de sistemas,
sendo uma das linguagens mais usadas e base para muitas das linguagens modernas.
A linguagem C surgiu no incio dos anos 70 para o desenvolvimento do UNIX. O seu criador Dennis
Richie, que na poca trabalhava na ATT & Bell Labs. O mesmo laboratrio tinha criado uma outra
linguagem chamada "B", e a linguagem C herdou algumas de suas caractersticas. Tendo sido criada para
escrever sistemas operacionais uma linguagem bastante poderosa, com recursos para manipulao do
sistema em baixo nvel. Obviamente com esse poder possvel escrever qualquer tipo de aplicativo com C,
mas ela e a sua sucessora, C++ so usadas para desenvolvimento de sistemas operacionais, software bsico
como sistemas de bancos de dados, compiladores e ambientes de desenvolvimento.
3.2 C ou C++
20
palavras-chave da linguagem para utiliz-las em locais indevidos.
As palavras chave da linguagem C so exibidas a seguir:
auto double int struct
Veremos o uso da maioria das palavras durante o curso. Por enquanto importante conhecer as palavras
reservadas para no definir elementos com esses nomes. Observe que todas elas so escritas com letras
minsculas. A linguagem C diferencia maisculas e minsculas. Assim, por exemplo, "Auto" no uma
palavra reservada, bem como "AUTO", "aUtO" ou "altO".
Identificadores so palavras que do nomes a elementos definidos pelo programador. Como j explicado
anteriormente, identificadores no podem ser palavras-chave, tambm conhecidas como reservadas. Elas
possuem a seguinte regra de formao:
Podem conter letras (a-z, A-Z sem acentos), dgitos (0-9) ou o caractere sublinhado ("_").
Devem comear com letras ou com o sublinhado, nunca por um dgito.
Dependendo do compilador usado, so diferenciados entre si pelos primeiros trinta e dois (32)
caracteres.
Existem convenes para criao de identificadores. Falaremos sobre elas medida que formos definindo
elementos. Mas essas so apenas convenes, definidas para facilitar a leitura dos programas.
21
void - indica ausncia de tipo, no usado propriamente como um tipo.
Na linguagem C no existe um tipo booleano nativo.
Quanto ao uso de memria isso depende da plataforma em que se est fazendo o desenvolvimento, pois a
linguagem C altamente aderente ao sistema operacional usado. Podemos usar as seguintes convenes:
int - 2 palavras do computador
char - 1 palavra do computador
float - 4 palavras do computador
double - 8 palavras do computador.
Sendo assim, se o computador em questo for de 32 bits, o tipo int usar 2 vezes 32 = 64 bits.
Existe um operador especfico para descobrir o tamanho dos tipos de dados, o sizeof. Ele um operador til
para operaes de memria, veremos seu uso adiante.
Esses modificadores podem ser aplicados em alguns tipos. Na tabela a seguir, mostramos os tipos disponveis
no padro ANSI:
unsigned char
signed char
unsigned int
signed int
short int
unsigned short int
signed short int
long int
signed long int
unsigned long int
long double
O int pode ser omitido, sendo considerado como padro na ausncia de tipo modificado. No tipo int, as
22
declaraes short e signed so redundantes, uma vez que representam os padres do tipo. O tipo long double
est presente em algumas implementaes de compiladores. Um dos usos mais relevantes do modificador de
sinal no tipo char, uma vez que em alguns compiladores o seu padro sem sinal.
3.6 Variveis
Uma varivel uma regio de memria associada a um tipo e a um nome, que um identificador vlido.
Uma varivel pode armazenar um valor e ser modificada, sendo esse o motivo de seu nome. Na linguagem C
obrigatria a declarao de nome e tipo antes do uso de qualquer varivel. A declarao de uma varivel
deve ser feita no incio de um bloco. Um bloco um trecho de cdigo entre os marcadores de blocos abre
chaves e feha chaves ("{" e "}"). O formato da declarao :
tipo lista_de_variveis
Exemplos:
int i, j, k;
signed char ch;
double altura, peso;
3.7 Constantes
3.7.1 inteiros
23
Nos nmeros reais, de ponto flutuante (float e double), quando temos um nmero entre -1 e 1 podemos
omitir o zero. Por exemplo, .5 representa meio. (0.5 tambm pode ser usado sem problemas)
1E100
O nmero antes da letra 'E' (pode ser maiscula ou minscula) multiplicado por 10 elavado ao nmero
depois da letra 'E'. No exemplo, temos 1 vezes 10 elevado a 100 (esse nmero conhecido como googol,
inspirador do nome da famosa empresa de buscas). O expoente pode ser negativo:
1E-10 = 0.0000000001
Os nmeros inteiros no padro so impressos e colocados na base numrica 10. A linguagem C aceita outras
duas bases, sendo uma delas a octal. Um nmero est na base octal se ele for iniciado com zero. Portanto, em
C, os zeros esquerda em uma constante so importantes.
Exemplos:
24
A - 10
B - 11
C - 12
D - 13
E - 14
F - 15
Ento:
0XCAFE 51966
0x11 17
'a'
'@'
importante diferenciar '1' de 1. Um representa o smbolo grfico, enquanto que o segundo representa o
prprio nmero.
25
confundidos.
Alguns caracteres que no podem ser impressos so representados pelo cdigo de barra invertida. Para
imprimir caracteres de aspas e apstrofo tambm usamos essa notao.
A seguir, os caracteres de barra invertida:
\b retrocesso (backspace)
\f alimentao de formulrio (form feed)
\n nova linha
\r retorno do carro
\t tabulao (TAB)
\" aspas
\' apstrofo
\0 caractere nulo
\\ uma barra
\v tabulao vertical
\a beep
\N constante octal (onde N um nmero na base 8)
\xN constante hexadecimal (onde xN constante hexadecimal)
A linguagem C possui muitos operadores, com vrios nveis de precedncia. A precedncia a ordem em que
as operaes devem ser executadas em uma expresso. Por exemplo, em uma expresso envolvendo soma e
multiplicao, a multiplicao tem precedncia maior, ou seja, deve ser executada primeiro. uma
linguagem famosa por esse motivo. Alm dos operadores aritmticos bsicos, ele possui operadores lgicos,
de bit e de atribuio. O uso de parnteses permitido para estabelecer uma ordem desejada de precedncia
ou para deixar isso claro.
O operador de atribuio simples o sinal '='. O lado esquerdo da atribuio deve ser uma varivel com valor
modificvel. Nos exemplos, supomos que j existem variveis declaradas como na seo de exemplos de
declarao de variveis:
i = 10;
ch = 'A';
peso = 70.5;
A atribuio, alm de modificar o valor da varivel, tambm tem como resultado o valor atribudo. A
26
atribuio um operador com precedncia direita, o que permite construir o seguinte comando:
i = j = k = 0;
Aps esse comando, todas as variveis recebero o valor zero. Essa seqncia pode ser lida como:
i=(j=(k=0));
4/3 resulta em 1
1/2 resulta em 0
1.0/2 resulta em 0.5, pois 1.0 um nmero do tipo double, no inteiro.
15/4 resulta em 3
4%3 resulta em 1
1%2 resulta em 1
15%4 resulta em 3
27
exemplo
2/2*3 resulta em 3. A diviso feita primeiro. Se quisermos que a multiplicao seja executada primeiro,
necessrio usar parnteses:
x = 0;
y = ++x;
Nesse caso, como o operador ++ prefixo, ele aplicado antes da atribuio. y recebe o valor 1, portanto.
Agora,
x=10;
y=x--;
28
3.8.4 Lgica da Linguagem C
A linguagem C no possui tipo booleano. Em seu lugar, a linguagem possui a seguinte conveno: todo valor
igual a zero considerado falso, enquanto qualquer valor diferente de zero considerado verdadeiro.
Os operadores lgicos seguem essa definio, retornando zero ou valor diferente de zero. Os operadores
lgicos so os de comparao:
< menor que
> maior que
<= menor ou igual
>= maior ou igual
!= diferente
== igual a (dois smbolos de igual, um s representa a atribuio)
Esses operadores obedecem as regras das tabelas verdade a seguir: (V denota valor verdadeiro, ou seja,
diferente de zero e falso igual a zero, conforme notao da linguagem C).
29
Os conectores lgicos tem precedncia menor que os comparadores.
Exemplos de expresses:
Por ser uma linguagem voltada para sistemas operacionais, C possui diversos recursos para manipulao de
bits, recurso muito til na programao de sistemas bsicos.
Os operadores de bit da linguagem C so:
~ complemento
& AND bit a bit
| OR bit a bit
^ XOR (ou exclusivo) bit a bit
<< deslocamento esqueda
>> deslocamento direita
3.8.5.1 Complemento
Este operador inverte os bits de um nmero. Supondo que a varivel em questo use 16 bits, suponha que ela
esteja com o valor igual a 171. Esse nmero em binrio :
10101011
Ento se
x = 171;
y = ~x;
30
y receber o valor de x com todos os bits invertidos, ou seja 01010100 correspondente a 84:
x = 154;
y = 127;
z = x & y;
10011010
01111111
--------- aplicando o &
00011010 que igual a 26. Portanto a varivel z recebe o valor 26.
3.8.5.3 Operador |
Esse operador compara os bits de dois valores inteiros e aplica o OR em cada um dos bits.
O and segue a tabela:
X y x|y
1 1 1
1 0 1
0 1 1
0 0 0
10011010
01111110
--------- aplicando o |
11111110 que igual a 254. Portanto a varivel z recebe o valor 254.
3.8.5.4 Operador ^
Esse operador compara os bits de dois valores inteiros e aplica o OR exclusivo em cada um dos bits.
O and segue a tabela:
x y x^y
1 1 0
1 0 1
0 1 1
0 0 0
x = 154;
y = 126;
z = x ^ y;
10011010
01111110
--------- aplicando o ^
11100100 que igual a 228. Portanto a varivel z recebe o valor 228.
32
Suponha o techo de cdigo:
x = 19;
y = x << 3;
x = 19;
y = x >> 2;
10011
1001 - um deslocamento
100 - dois deslocamentos
O deslocamento esquerda uma forma de se multiplicar o nmero por uma potncia de 2. Note que 19 * 8
= 152. E 8 corresponde a 2 elevado a 3, que o nmero de bits deslocados.
Analogamente, o deslocamento a direita corresponde a uma diviso por potncias de 2. No exemplo, 19/4
igual a 4. Essas operaes so mais rpidas que a multiplicao e diviso tradicionais. Se o desempenho do
seu programa for muito crtico, podem ser usadas essas solues para aumentar a velocidade.
3.8.6 Operador ?
O operador ? um operador que define seu resultado a partir do primeiro operando.
Por exemplo:
33
x ? 1: 0
Para avaliar esta expresso, x avaliado primeiro. Se o seu valor for verdadeiro (diferente de zero), o
resultado ser o valor entre o ? e os dois pontos (:). Caso contrrio o resultado ser o valor aps os
dois pontos. Este operador usado no lugar de comandos condicionais, que veremos mais adiante.
x = x + 2;
y = y / 3;
z = z % 10;
x += 2;
y /= 3;
z %= 10;
+=
-=
*=
/=
%=
&=
|=
^=
<<=
>>=
34
x = 2+3, 1*3;
O comando mais conhecido na linguagem C para sada o comando printf. Ele produz uma sada no
dispositivo padro de sada, que no nosso caso em geral a tela do computador. Antigamente, o dispositivo
padro poderia ser uma impressora. Futuramente poderemos ter outros tipos de telas ou interfaces mais
modernas.
No seu formato mais bsico, o comando printf coloca na sada a cadeia de caracteres recebida:
Porm, a cadeia serve na verdade como uma definio de formato. Podemos imprimir valores de variveis a
partir do comando printf usando os cdigos de formato:
O comando printf analisa a cadeia de formato, procurando por cdigos com o sinal de porcentagem (%). No
exemplo, %d indica que ser colocado um valor inteiro na base 10. Ento, o printf espera um valor inteiro
depois da cadeia de formato, no caso, x. O valor de x ser impresso no lugar do %d. Podemos colocar
quantos valores forem necessrios na impresso:
35
%G use o menor entre %E ou %f
%o inteiro na base 8
%x inteiro na base 16 usando letras minsculas
%X inteiro na base 16 usando letras maisculas
%p ponteiro
%% imprime um '%'
O tipo na cadeia de formato deve corresponder ao tipo da varivel ou constante na lista passada. Se houver
diferena nos tipos, podem acontecer erros imprevisveis na execuo do programa. O mais comum a
impresso de valores inesperados.
O comando de entrada o scanf. O scanf recebe uma cadeia de formato, para informar qual o tipo de dado
que ser lido. O usurio do programa deve ento colocar pela entrada padro os dados esperados. Se o
usurio digitar valores invlidos, como letras onde so esperados nmeros, o programa pode dar erros
tambm imprevisveis. No scanf a cadeia de formato no deve ter outros caracteres alm dos cdigos de
formato e espaos.
Os formatos so os mesmos do comando printf, porm se a possibilidade de informar nmero de casas
decimais ou formato.
Outra coisa importante que o scanf recebe o endereo da varivel que ser modificada. Para passar o
endereo, devemos usar o operador prefixo &.
ex:
Nesse caso, o usurio pode digitar as notas separadas por espaos ou apertando o "enter".
36
3.10 Programas seqenciais: Estrutura dos programas C
O cdigo fonte um arquivo de texto comum, puro onde escrito o programa na linguagem de programao
desejada. Aps escrever o programa, devemos executar o compilador, que l o cdigo fonte e o transforma
em um arquivo binrio. Esse arquivo binrio ento ligado (link) com as bibliotecas da linguagem C e outros
mdulos do programa, formando um arquivo executvel.
Vejamos como um programa simples em C (o popular "al mundo"):
1 #include <stdio.h>
2 #include <stdlib.h>
3 int main() {
4 printf( "Ol" );
5 system( "PAUSE" );
6 return 0;
7 }
Todo programa em C se inicia nessa funo com nome "main". A declarao indica que main tem como
resultado um inteiro, e que ela no est esperando parmetros, pois os parnteses esto vazios.
Na linha 4, impressa na tela uma mensagem. Na linha 5 o comando faz com que o programa pare at que
seja apertada alguma tecla. Se no for colocado, no compilador que utilizaremos a janela fechada logo que
o programa finalizado, o que nos impede de ver os resultados.
Na linha 6, definimos o resultado da execuo do programa. O cdigo 0 indica que o programa foi executado
sem problemas. Nos sistemas operacionais baseados no unix (linux, solaris, entre outros), esses resultados
so usados pelo sistema operacional. Por enquando, no h grande utilidade para esse valor.
3.10.1 Formatao
Note que foram usados alguns deslocamentos e linhas em branco no programa de exemplo. O compilador
ignora solenemente todos os espaos e linhas em branco. O programa a seguir equivalente, do ponto de
37
vista do compilador:
Note-se que o programa fica muito difcil de se ler. Nos blocos, usaremos dois espaos para deslocar
comandos que estejam em um mesmo nvel de execuo.
Recomandamos a leitura do site:
http://www.ime.usp.br/~pf/algoritmos/aulas/layout.html
Que tem uma excelente explicao sobre indentao e layout dos programas.
3.10.2 Comentrios
Sempre que escrito cdigo que no seja claro deve-se explicar o que est sendo feito. Isso pode ser feito
atravs de comentrios. Na linguagem C os comentrios so demarcados pelo '/*' e '*/'. Todo texto entre
esses smbolos completamente ignorado pelo compilador.
Comentar o programa til, especialmente para ajudar na manuteno do cdigo. Tambm no se deve fazer
comentrios apenas por obrigao, eles devem ser claros e precisos.
1 #include <stdio.h>
2 #include <stdlib.h>
/* exemplo de comentrio */
/* o compilador no l o que
est escrito aqui */
3 int main() {
4 printf( "Ol" );
5 system( "PAUSE" );
6 return 0;
7 }
http://www.bloodshed.net/dev/devcpp.html
3.11.1 Instalao
Basta executar o programa de instalao obtido na seo anterior. Sua instalao no difere de um programa
comum. Ele possui uma verso em portugus, o que pode ser bastante til para muitos. Mesmo assim, algum
conhecimento de ingls ainda necessrio, uma vez que nem todas as mensagens foram traduzidas para o
38
portugus..
Na primeira execuo, aceite todas as configuraes padro. Levar alguns instantes para analisar alguns
arquivos, mas essas opes facilitaro a programao.
Para criar um programa, aperte control-N ou arquivo->novo->Arquivo Fonte. Podemos ento digitar um
programa simples no editor:
IMPORTANTE: grave o arquivo como um arquivo C, no C++ (C source files). Ele ento ser reconhecido
como programa em C, no em C++.
3.11.3 Executando
39
Nesta altura possvel compilar o programa, Executar se estiver compilado ou compilar e executar. Todas
essas opes se encontram no menu Executar:
Ao executar o programa, aparece uma janela de comando do Windows, a mensagem impressa e impressa
uma mensagem solicitando apertar alguma tecla. Ao ser apertada o programa encerrado.
40
3.11.4 Fazendo cpias do seu programa
Quando gravar o arquivo fonte, observe bem onde ele gravado. Para recuperar um programa em geral basta
gravar o fonte, que em geral pequeno. No necessrio fazer cpias de segurana dos arquivos executveis
e binrios.
41
1) Levantar as variveis que sero necessrias
2) Fazer a entrada de dados
3) Processar os dados
4) Imprimir a sada
1) Neste caso h a solicitao da digitao de apenas um nmero inteiro. Uma varivel inteira basta, portanto
2) Faremos a leitura desse nmero
3) No h processamento, uma vez que devemos apenas imprimir o nmero
4) Imprimiremos o nmero usando o printf
Esta fase corresponde ao detalhamento da descrio do funcionamento do sistema, que foi abordado na
primeira parte do curso.
O cdigo est comentado com os passos correspondentes.
#include <stdio.h>
#include <stdlib.h>
int main() {
/* passo 1 */
int n;
/* passo 2 */
printf( "digite um nmero:" );
scanf( "%d", &n );
/* passo 3, vazio */
/* passo 4, imprime */
printf( "o nmero digitado foi: %d", n );
system("PAUSE" );
}
Programa 2: Faa um programa que l dois nmeros inteiros e imprime sua soma.
1) Vamos usar trs variveis: uma para cada nmero que deve ser lido e um para a soma.
2) fazer a leitura dos dois nmeros
3) calcular a soma
4) imprimir a soma
#include <stdio.h>
#include <stdlib.h>
int main() {
/* passo 1 */
int a, b, soma;
/* passo 2 */
printf( "digite dois nmeros:" );
scanf( "%d %d", &a, &b );
/* passo 3, calcula a soma */
soma = a + b;
/* passo 4, imprime */
42
printf( "o a soma : %d", soma );
system("PAUSE" );
}
Em todos os programas, devemos nos certificar que os valores das variveis foram definidos ou digitados
antes de efetuar qualquer operao com essas variveis. Para isso podemos usar a tcnica do teste de mesa,
ou simulao.
Mais um exemplo, vamos fazer um conversor de temperatura. Os Estados Unidos adotam um sistema de
temperaturas diferente do Brasil, os graus Farenheit. Para converter uma temperatura em graus Farenheit para
graus Celsius podemos usar a frmula:
C = (F-32) *5 / 9
Onde F a temperatura em graus Farenheit. Sero necessrias ento variveis para as duas temperaturas.
#include <stdio.h>
#include <stdlib.h>
int main() {
float F, C;
printf( "digite a temperatura em graus Farenheit:" );
scanf( "%f", &F );
C = (F-32) * 5 / 9;
printf( "%f em graus Celsius %f", F, C );
system("PAUSE" );
}
Uma operao muito comum em programao a troca de valores de variveis. Para tanto, torna-se
necessrio o uso de uma varivel auxiliar para armazenamento de um dos valores.
Podemos imaginar uma situao real para ilustrar esta situao: suponha que voc tem dois peixes, um em
cada aqurio. Dois peixes no cabem no aqurio pois este pequeno e eles so peixes briges. Por algum
motivo voc deseja trocar os peixes de aqurio, sem deixar algum peixe fora da gua. Para efetuar essa troca,
seria necessrio ento um terceiro aqurio. Passamos um peixe(1) para o aqurio vazio, passamos o peixe(2)
para o aqurio que ficou vazio e passamos o peixe(2) para o primeiro aqurio.
Vamos mostrar um programa que l dois valores e troca o valor das variveis:
#include <stdio.h>
#include <stdlib.h>
int main() {
43
int x, y, temp;
printf( "digite dois nmeros inteiros:" );
scanf( "%d %d", &x, &y );
printf( "antes da troca: x vale %d e y vale %d\n" , x, y );
temp = x;
x = y;
y = temp;
printf( "depois da troca: x vale %d e y vale %d\n" , x, y );
system("PAUSE" );
}
Quando necessrio selecionar algum comando a ser executado atravs de uma condio, usado o
comando if. A sintaxe do comando if a seguinte:
if ( <condio> )
<comando1>;
[else
<comando2>;]
O funcionamento do if comea com a avaliao da condio, que pode ser qualquer expresso. Se expresso
tiver resultado verdadeiro conforme a conveno de C, ou seja, valor diferente de zero, o <comando1> ser
executado. Se houver clusula else no comando, que opcional, o <comando2> ser executado caso a
expresso seja falsa, ou seja, tenha valor igual a zero.
#include <stdio.h>
#include <stdlib.h>
int main() {
int idade;
printf( "digite sua idade:");
scanf( "%d", &idade );
if ( idade >= 18 )
printf("voc pode guiar.");
system("PAUSE" );
}
Exemplo de sada:
44
voc pode guiar.
Outra execuo:
-------------------------------------
Apenas o comando seguinte ao comando if ser executado. Neste comando, e em todos os outros, podemos
fazer um grupo de comandos que sero executados em um bloco, delimitado pelas chaves. Para evitar erros,
muitos consideram uma boa prtica sempre usar as chaves, mesmo que seja executado somente um comando.
Vamos expandir o exemplo para que seja impressa uma mensagem caso a idade seja insuficiente.
#include <stdio.h>
#include <stdlib.h>
int main() {
int idade;
printf( "digite sua idade:");
scanf( "%d", &idade );
if ( idade >= 18 ) {
printf("voc pode guiar.");
} else {
printf("voc no pode guiar.");
}
system("PAUSE" );
}
Podemos escrever condies mais complexas usando uma seqncia de comandos if.
Por exemplo, vamos supor que um aluno aprovado se tirar nota maior ou igual a 7. Entre 4 e 7, ele faz um
exame, e abaixo de 4 ele ser reprovado.
#include <stdio.h>
#include <stdlib.h>
int main() {
float nota;
printf( "digite sua nota:");
scanf( "%f", ¬a);
45
if ( nota >= 7 ) {
printf("voc foi aprovado.");
} else if ( nota >= 4 ) {
printf("voc far exame.");
} else {
printf("voc est reprovado.");
}
system("PAUSE" );
}
Uma regra importante a lembrar que o else sempre pertence ao if declarado por ltimo. Isso ocorre quando
temos uma condio dentro da outra:
#include <stdio.h>
#include <stdlib.h>
int main() {
float nota;
printf( "digite sua nota:");
scanf( "%f", ¬a);
if ( nota >= 7 )
if ( nota == 10 )
printf("parabns ");
else if ( nota >= 4 ) {
printf("voc far exame.");
} else {
printf("voc est reprovado.");
}
system("PAUSE" );
}
Nesse caso, o primeiro else corresponder ao segundo if, o que pode no ter sido a inteno inicial do
programador. O uso de chaves resolve o problema, sendo mais um motivo para seu uso em todos os
comandos if.
#include <stdio.h>
#include <stdlib.h>
int main() {
float nota;
printf( "digite sua nota:");
scanf( "%f", ¬a);
if ( nota >= 7 ) {
if ( nota == 10 ) {
printf("parabns ");
}
}else if ( nota >= 4 ) {
printf("voc far exame.");
} else {
printf("voc est reprovado.");
}
system("PAUSE" );
}
46
Uma das maiores utilidades do computador sua capacidade de efetuar tarefas repetitivas. A linguagem C
oferece trs tipos de comandos de repetio. O comando for adequado para efetuar um nmero conhecido
de repeties, embora isso no seja totalmente obrigatrio.
A sintaxe do for a seguinte:
Vamos exibir um comando for simples, em um programa que imprime os nmeros de 1 a 10:
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
O uso de varives com nomes i, j e k para controle do comando for bastante usual.
Note que somente o comando seguinte ao for faz parte do lao de repetio. Caso haja mais de um comando,
formamos um bloco com as chaves.
Um erro bastante comum usar ponto-e-vrgula indevidamente:
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
47
system("PAUSE");
}
Nesse caso, o compilador considera que queremos repetir o comando vazio dez vezes. Somente no final
mostrado o valor 11. Em todos os comandos considerada boa prtica sempre usar as chaves.
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
Note que iniciamos o lao com um valor maior, a comparao foi invertida e o comando de incremento um
decremento.
Podemos usar outros incrementos, por exemplo para imprimir somente os nmeros pares menores que 100:
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
Via de regra, o comando de incremento deve modificar as variveis participantes da condio para que em
algum momento ela se torne falsa. Se isso no acontecer, o programa pode entrar em lao infinito (loop
infinito). No execute o programa a seguir, pois ele entra em loop infinito:
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
48
Isso acontece pois o valor sempre ser 0, nunca sendo modificado, assim a condio sempre ser verdadeira.
Devemos tomar extremo cuidado para que os programas no entrem em lao infinito.
O operador vrgula pode ser usado caso seja necessrio fazer mais de uma operao nos componentes do for:
#include <stdio.h>
#include <stdlib.h>
int main() {
int i, j;
Vejamos agora uma tcnica de programao, que denominaremos como varivel de acumulao. Suponha
que desejamos efetuar a seguinte soma:
1+2+3+...+(n-1)+n
Podemos usar um lao for para efetuar essa operao, usando uma varivel que acumula os resultados. Na
primeira iterao a varivel tem valor zero. Na segunda, somamos com 1, na segunda com 2, assim
sucessivamente:
0
0+1
(0+1)+2
((0+1)+2)+3
...
No final, teremos a soma total dos nmeros. O programa que implementa essa soluo est a seguir:
#include <stdio.h>
#include <stdlib.h>
int main() {
int i, n, soma;
49
Na verdade, existe uma frmula simples que calcula essa soma:
soma = (( 1 + n ) / 2) * n;
Um comando de lao mais genrico, onde no se conhece o nmero de iteraes. a sintaxe do comando while
a seguinte:
while(<condio>)
<comando>;
No incio do while, a <condio> avaliada. Se for verdadeira o comando executado, caso contrrio o
while encerrado. Aps cada execuo, a condio avaliada novamente, completando o lao.
A seguir exebido um programa que imprime os nmeros de 1 a 10 com o uso do while:
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
int i = 1;
while ( i <= 10 ) {
printf( "%d\n", i );
i++;
}
system("PAUSE");
}
Se o comando dentro do while for nico, as chaves so desnecessrias, mas como em todos os outros casos,
recomendada.
Um bom exemplo de aplicao do lao while quando a parada depede da entrada do usurio. No programa
a seguir, o lao continua at o usurio digitar um nmero negativo:
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
int i = 1;
while ( i >= 0 ) {
printf( "%d\n", i );
50
printf( "digite um nmero negativo para encerrar:" );
scanf( "%d", &i );
}
system("PAUSE");
}
O comando while faz o teste da condio logo no incio do lao. Quando desejado que o lao seja
executado pelo menos uma vez, pode ser usado o outro comando, o do/while.
do
<comando>
while (<condio>);
O comando executado uma vez, e a condio avaliada em seguida, desta vez de forma semelhante ao
while. Se a condio for verdadeira, repete o comando, seno encerra o lao. O comando while pode se
comportar da mesma forma, desde que se tenha certeza que a condio verdadeira antes do incio, sendo
assim, o do/while tende a ser menos utilizado.
Uma das utilidades do comando do/while na validao de dados de entrada. No exemplo, exibido um
programa que l uma nota vlida, entre zero e dez. Se a nota for invlida, uma nova entrada solicitada:
#include <stdio.h>
#include <stdlib.h>
int main() {
float nota;
do {
printf( "Digite a nota:" );
scanf( "%f", ¬a );
if (nota<0 || nota>10) {
printf( "nota invlida, digite novamente:\n" );
}
} while (nota<0 || nota>10)
printf( "sua nota foi %f\n", nota );
system("PAUSE");
}
Como a entrada vai acontecer pelo menos uma vez, esse um caso bem apropriado para o uso deste
comando. Ao fazer programas devemos tomar cuidado para que as entradas sejam sempre vlidas. O
comando scanf no muito apropriado para essa tarefa, uma vez que digitando valores de texto onde se
esperam nmeros ou vice-versa pode acarretar erros na execuo do programa consequentemente com sua
interrupo. Mas podemos usar o do/while para amenizar o problema.
51
3.17 Comandos de controle do lao (break e continue)
A linguagem C possui dois comandos para controle de execuo dos laos, o break e o continue. O break
encerra o lao em que ele estiver contido, independente de qualquer condio:
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
Nesse caso, quando i chegar ao valor 5 ser executado o comando break, que encerrar o lao for em que ele
est contido. O break usado em muitas situaes em que o lao j executou sua tarefa e no mais
necessrio repetir seus comandos.
O outro uso do break para encerrar o comando switch, que veremos em seguida.
O continue, por sua vez, fora a prxima execuo do lao, saltando os comandos restantes:
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
Nesse exemplo, o comando continue executado quando a varivel i atinge o valor 5. Nesse exemplo, o
comando printf saltado, passando para a prxima iterao do lao for, ou seja, no incremento e teste. O
efeito no exemplo que somente o nmero 5 no ser impresso na sada padro.
52
Quando temos uma condio mltipla, podemos usar o comando switch. O comando tem algumas limitaes,
pois as opes se limitam a valores inteiros. Vamos ver com um exemplo de programa que escreve os
nmeros em forma de palavra:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf( "digite um nmero:" );
scanf( "%d", &n );
switch( n ) {
case 1: printf( "um" );
break;
case 2: printf( "dois" );
break;
case 3: printf( "trs" );
break;
case 4: printf( "quatro" );
break;
case 5: printf( "cinco" );
break;
case 6: printf( "seis" );
break;
case 7: printf( "sete" );
break;
case 8: printf( "oito" );
break;
case 9: printf( "nove" );
break;
case 10: printf( "dez" );
break;
}
system("PAUSE");
}
O comando break logo aps cada opo essencial, pois na sua ausncia ocorre o chamado "fall-through"
entre as opes. A partir da opo em que h a igualdade, todos os comandos sero executados at o
encerramento do switch ou com o comando break. Ou seja, a opo considada somente para o incio das
opes, sendo ignorado no restante.
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf( "digite um nmero:" );
scanf( "%d", &n );
switch( n ) {
case 1: printf( "um" );
case 2: printf( "dois" );
case 3: printf( "trs" );
53
case 4: printf( "quatro" );
case 5: printf( "cinco" );
case 6: printf( "seis" );
case 7: printf( "sete" );
case 8: printf( "oito" );
case 9: printf( "nove" );
case 10: printf( "dez" );
}
system("PAUSE");
}
No exemplo, se for digitado "1", sero impressos todos os nmeros. Se for digitado "5", sero impressos
todos os nmeros a partir de cinco.
Quando nenhuma das opes ocorrer, podemos colocar uma condio para isso, com o default:
int main() {
int n;
printf( "digite um nmero:" );
scanf( "%d", &n );
switch( n ) {
case 1: printf( "um" );
break;
case 2: printf( "dois" );
break;
case 3: printf( "trs" );
break;
case 4: printf( "quatro" );
break;
case 5: printf( "cinco" );
break;
case 6: printf( "seis" );
break;
case 7: printf( "sete" );
break;
case 8: printf( "oito" );
break;
case 9: printf( "nove" );
break;
case 10: printf( "dez" );
break;
default: printf( "maior que dez" );
}
system("PAUSE");
}
O exemplo a seguir usa o comando switch para dizer quantos dias tem o ms:
int main() {
int mes;
printf( "digite um ms:" );
scanf( "%d", &mes );
switch( n ) {
case 1:
case 3:
54
case 5:
case 7:
case 8:
case 10:
case 12: printf( "ms de 31 dias" );
break;
case 4:
case 6:
case 9:
case 11: printf( "ms de 30 dias" );
break;
case 2: printf( "ms de 28 ou 29 dias" );
break;
default: printf("ms invlido" );
}
system("PAUSE");
}
Existe um comando para desvio incondicional, o comando goto. Seu uso era muito freqente nas linguagens
de programao mais antigas, e seu usa exagerado gerava programas com lgica extremamente confusa,
conhecidas como "cdigo-macarro". Quando a programao estruturada prevaleceu, provou-se que o uso de
goto sempre pode ser evitado. Assim, muitos autores e professores probem terminantemente o uso de
desvios. Porm, em algumas situaes bastante especficas, o uso do goto pode ajudar a tornar o cdigo mais
eficiente, pulando algumas partes de cdigo que no precisam ser executadas. Uma implementao de
autmatos finitos (ref livro de compiladores do Setzer) tambm usa goto de maneira organizada.
O comando goto desvia para um rtulo, identificador colocado no meio do cdigo que servir de ponto de
desvio.
#include <stdio.h>
#include <stdlib.h>
int main() {
float F, C;
printf( "digite a temperatura em graus Farenheit:" );
goto final;
scanf( "%f", &F );
C = (F-32) * 5 / 9;
printf( "%f em graus Celsius %f", F, C );
final:
system("PAUSE" );
}
Nesse programa, ao encontrar o goto seu fluxo automaticamente desviado para a instruo imediatamente
seguinte ao rtulo, definido pelos dois pontos. Claro que nesse caso poderamos ter simplesmente omitido o
55
cdigo que foi pulado. Em geral, o goto est associado a comandos condicionais.
O pr-processador um programa que l o cdigo fonte e executa algumas operaes. Seus comandos so
todos precedidos do caractere do jogo da velha (#).
3.20.1 incluso
J vimos o comando de incluso ser usado em todos os exemplos. uma prtica de programao C colocar
os arquivos de cabealho no topo do cdigo fonte. No usual, mas seria possvel colocar arquivos no meio
de um programa.
Suponha que um arquivo tenha o seguinte contedo, e seu nome seja inclusao.c:
#include <stdio.h>
#include <stdlib.h>
int main() {
#include "inclusao.c"
system("PAUSE" );
}
Nesse caso, o arquivo ser colocado no lugar do comando include. Essa prtica no recomendada, e os
arquivos de incluso so normalmente colocados para os arquivos de cabealho.
H mais uma diferena: Quando os arquivos vem entre os sinais '<' e '>', o arquivo procurado no diretrio
padro de arquivos de incluso, configurado no ambiente de programao. Se o nome estiver entre aspas, ele
ser procurado juntamente com o cdigo fonte sendo compilado.
O define usado para substituir uma cadeia por outra antes da compilao.
Por exemplo
#define UM 1
56
Trocar todas as ocorrncias da cadeia "UM" por "1"
Esse tipo de definio muito usada para definir constantes, nmeros que aparecem de algum lugar que
trocados por uma palavra, ganham mais significado.
exemplo
int v[TAM_MAX];
#define UM 1
#define DOIS UM+UM
#define TRES UM+DOIS
#include <stdio.h>
#include <stdlib.h>
#define P "PAUSE"
int main() {
printf(P);
system(P);
}
Podemos usar o define para definir pequenos cdigos que do resultados, chamados funes. O exemplo a
seguir calcula o valor absoluto de uma expresso.
Os parnteses so para que os resultados sejam corretos sejam quais forem os valores de a.
Se fizermos
ABS(10-20)
resultaria em
10-20<0?10-20:-10-20
57
3.21 Strings
Strings so cadeias de caracteres, que podem formar palavras, texto e caracteres especiais do computador.
Em C, no temos um tipo "String" nativo como nas outras linguagens, so usados os vetores de caracteres
para representar cadeias.
Declaramos uma String colocando seu tamanho entre colchetes:
char nome[30];
A linguagem C usa um tipo de String em que o seu tamanho arbitrrio e seu final definido pela primeira
apario de um caractere nulo ('\0'). Sempre devemos deixar um espao reservado para o caractere
terminador. Sendo assim, a declarao do exemplo comporta uma cadeia com 29 caracteres, mais um para o
terminador, totalizando os 30 da declarao.
Uma varivel desse tipo (na verdade um vetor) no pode ter seu valor modificado, ou seja:
nome = "Teste";
um comando que no funciona, pois o valor de nome no pode ser alterado. Mas seu contedo pode ser sim
modificado. Para tanto, necessrio usar uma funo predefinida, o strcpy
Faz o servio desejado. Existe uma outra forma de declarar uma varivel que contm uma cadeia:
char *nome1;
Essa varivel um ponteiro de memria, e esta pode ter seu valor alterado. Uma constante String pode ser
atribuda varivel:
nome1 = "Teste2";
A desvantagem desse tipo de declarao que no podemos copiar contedos com o strcpy em nome1. Se
atriburmos outro valor para a varivel:
nome1 = "Teste3";
A constante anterior ficar "perdida" na memria, ocupando espao que no pode mais ser reutilizado. Tal
fenmeno conhecido como vazamento de memria. O vazamento de memria prejuducial ao sistema,
pois ocupa memria que pode ser preciosa para a execuo dos programas que no pode mais ser recuperada.
58
Recomenda-se ento, o uso em formato de vetores de caracteres, no como ponteiro para caracteres.
Outra caracterstica das strings em C que no possvel comparar o contedo das strings atravs do
comparador ==. necessrio usar a funo strcmp, que descreveremos a seguir.
Existem vrias funes prontas para manipulao de Strings, listamos exemplos das mais importantes. Suas
declaraes esto no arquivo de cabealho "string.h".
strcpy - copia o contedo de uma String em outra. Devemos nos certificar que o destino possui espao
alocado suficiente para comportar o que ser copiado.
Ex:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char nome[50], copia[50];
system("PAUSE");
}
Note um detalhe. No scanf no usamos o '&' para leitura do nome, no caso de vetores isso no necessrio
pois o nome do vetor j corresponde a seu endereo.
strlen - esta funo retorna o comprimento da string:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char nome[50];
system("PAUSE");
}
59
strcmp - compara duas strings. Esta funo retorna um valor inteiro, dependendo da comparao
lexicogrfica (ordem alfabtica) das strings:
int main() {
char *s1 = "AAAAA",
*s2 = "ZZZZZ",
*s3 = "AAAAA";
system("PAUSE");
}
Sempre bom lembrar que o comparador "==" no compara o contedo de strings, sendo necessrio o uso
desta funo.
int main() {
char s1[50], s2[50];
O resultado armazenado na primeira string, ento para isso necessrio que ela tenha espao alocado
suficiente.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
60
int main() {
char nome[50];
printf("Digite seu nome:");
gets(nome);
printf ( "ol %s\n", nome );
system("PAUSE");
}
puts - imprime uma String na sada padro. Esta funo coloca um caractere de final de linha
automaticamente.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char linha1[100],
linha2[100],
linha3[100];
printf("Digite a 1a. linha:");
gets(linha1);
printf("Digite a 2a. linha:");
gets(linha2);
printf("Digite a 3a. linha:");
gets(linha3);
puts(linha1);
puts(linha2);
puts(linha3);
system("PAUSE");
}
sprintf - permite a fomatao de uma string com o mesmo formato que usado na funo printf. bastante
til na construo de mensagens e na formatao de nmeros.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char linha[100];
sprintf( linha, "%.2f %s %d", 3.1, "teste", 4 );
puts( linha );
system("PAUSE");
}
61
Funes matemticas
abs - retorna o valor absoluto do nmero inteiro
sqrt - retorna a raiz quadrada de um nmero real positivo.
pow - pow( x, y ) retorna x elevado potncia y
acos - retorna o arco-cosseno de um nmero
asin - retorna o arco-seno de um nmero
atan - retorna o arco-tangente de um nmero
cos - retorna o cosseno de um arco em radianos
sin - retorna o seno de um arco em radianos
tan - retorna a tangente de um arco em radianos
exp - retorna e elevado ao parmetro fornecido
log - retorna o logaritmo do nmero na base e
log10 - retorna o logaritmo do nmero na base 10
ceil - retorna o menor inteiro maior ou igual ao real dado
floor - retorna o maior inteiro menor ou igual ao real dado
Vamos mostrar a seguir um programa que usa vrias das funes apresentadas:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
int x = -1;
float a = 4, b = 2, c = 3;
system("PAUSE");
62