Académique Documents
Professionnel Documents
Culture Documents
CSSIO DE ALCNTARA
UBERLNDIA - MG
FEVEREIRO - 2015
CSSIO DE ALCNTARA
Monograa apresentada por Cssio de Alcntara Faculdade de Matemtica da Universidade Federal de Uberlndia, como parte das
exigncias para concluso do curso de graduao em Matemtica - Licenciatura.
UBERLNDIA - MG
FEVEREIRO - 2015
Agradecimentos
Agradeo primeiramente ao meu pai Ednaldo de Alcntara e minha me Meire Aparecida de Alcntara, pelo apoio e compreenso.
minha namorada Tamara Melo Pereira, pelo companherismo e incentivo.
Ao meu orientador Santos Alberto Enriquez Remigio, pela pacincia, por ter acreditado em mim e disposto de seu tempo para me orientar para a realizao deste trabalho.
Ao professor e amigo Thiago Frana Naves, por ter me auxiliado com os programas.
Ao professor Lcio Borges de Arajo, pelos conselhos.
Ao meu amigo Dane Marques de vila pela ajuda.
A todos os meus colegas da graduao, pelo apoio e amizade.
Resumo
Este trabalho tem como objetivo introduzir aos alunos da graduao do curso de
matemtica a programao com a linguagem C, para isto apresentada uma breve introduo
linguagem, alguns compiladores gratuitos, dos quais utilizado o codeblocks, apresentada
uma explicao de cada tpico estudado, utilizando de analogias matemticas quando conveniente, e resolvido um conjunto de problemas matemticos usando-se esta linguagem para
axao. Tambm apresentada uma breve explicao sobre como resolver numericamente
um problema de valor de contorno (PVC) atravs do mtodo das diferenas nitas (MDF) e
o algoritmo de soluo para sistemas lineares tridiagonais baseado decomposio LU.
Ao nal do trabalho apresentado e resolvido um problema de valor de contorno
linear [1], onde aplicado boa parte do contedo aprendido no decorrer do texto sobre a linguagem C, alm de mostrar a aplicabilidade do MDF para soluo do PVC, que comprovado
ao observar os resultados.
Sumrio
1
INTRODUO
12
1.1
12
OBJETIVO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LINGUAGEM C
14
2.1
Compiladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
2.1.1
15
2.2
Usando o codeblocks . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . .
18
2.2.1
Comentrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.2.2
Pr-Processamento
. . . . . . . . . . . . . . . . . . . . . . . . . . .
19
2.2.3
Funo Principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
2.2.4
Bloco de Dados
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
2.2.5
Funes e Processos . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
2.3
20
2.4
22
2.4.1
O que varivel?
23
2.4.2
Declarao de Variveis
. . . . . . . . . . . . . . . . . . . . . . . . .
23
2.4.3
Tipos de Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
2.4.4
. . . . . . . . . . . . . . . . . . .
26
. . . . . . . . . . . . . . . . . . . . . .
28
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
Controle de Texto . . . . . . . . . . . . . . . . . . . . . . .
30
2.5
Funes de Sada
2.5.1.1
2.6
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.5.2
Funes de Entrada
. . . . . . . . . . . . . . . . . . . . . . . . . . .
30
2.5.3
Mscara de dados
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
34
37
3.1
37
3.1.1
Operadores Lgicos
. . . . . . . . . . . . . . . . . . . . . . . . . . .
38
3.1.2
Else If
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
3.2
ESTRUTURA SWITCH
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
3.3
46
3.3.1
3.4
49
. . . . . . . . . . . . . . . . . . . .
58
Do While . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
FUNES
4.1
63
. . . . . . . . . . . . . . . . . . . . . . . . . .
63
64
4.1.1.1
Retornar Valores . . . . . . . . . . . . . . . . . . . . . . . .
65
4.1.2
67
4.1.3
Prottipos de funes
. . . . . . . . . . . . . . . . . . . . . . . . . .
69
4.1.4
Recursividade
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
4.2
73
4.3
74
4.4
STRUCTS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
4.4.1
83
4.4.2
Typedef
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
86
PONTEIROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
87
4.5.1
87
4.5.2
Aritmtica de ponteiros
89
4.5.3
4.1.1
4.5
4.6
Vetores e Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
90
4.5.3.1
Funo malloc . . . . . . . . . . . . . . . . . . . . . . . . .
90
4.5.3.2
Funo free
. . . . . . . . . . . . . . . . . . . . . . . . . .
91
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
99
ARQUIVOS
4.6.1
4.6.2
. . . . . . . . . . . . . . . . . . . . . . . .
99
. . . . . . . . . . . . . . . . . . . . . . . 101
103
5.1
5.2
Codicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
CONCLUSO
. . . . . . 103
112
Lista de Figuras
2.1.1 Compilador Codeblocks
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
16
16
17
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
10
Lista de Tabelas
2.1
Palavras Reservadas
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
2.2
22
2.3
. . . . . . . . . . . . . . . . . . . . . . . .
24
2.4
27
2.5
Controle de Texto
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
2.6
Mscaras de Dados
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
2.7
. . . . . . . . . . . . . . . . . . . . . . . . . . .
32
2.8
32
2.9
Comandos de Sistema
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
3.1
Operadores Lgicos
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
4.1
Biblioteca math.h
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
75
4.2
11
Captulo 1
INTRODUO
Ao longo do curso de graduao em matemtica na Universidade Federal de Uberlndia (UFU) possvel detectar certa diculdade dos alunos nas disciplinas que exigem conhecimento em linguagens de programao, o que leva o aluno a reprovar e, nos piores casos, decidir
abandonar o curso. Estas disciplinas, que so em sua maioria na rea de matemtica aplicada
computacinal, so extremamente importantes e necessrias para a formao do discente e so
muitas vezes prejudicadas, pois os professores acabam reservando um pouco da carga horria
total da disciplina para ensinar um pouco de programao aos alunos, o que no faz parte da
ementa.
Com o objetivo de introduzir os alunos da graduao do curso de matemtica na
programao com a linguagem C, utilizando de uma didtica de fcil entendimento e abordando
apenas alguns tpicos que so de fato teis para uma introduo, a presente monograa
apresenta uma reviso sobre a linguagem C e um conjunto de exemplos resolvidos usando-se
esta linguagem. No nal do trabalho encontra-se uma aplicao de parte da teoria ensinada,
onde resolvido um Problema de Valor de Contorno (PVC) utilizando o Mtodo das Diferenas
Finitas (MDF).
Para a elaborao deste material foi utilizado o sistema operacional Windows, mas o
que apresentado sobre a linguagem C funciona tambm no Linux, que mais utilizado pelos
alunos da graduao de matemtica na UFU.
1.1 OBJETIVO
Este trabalho tem como objetivo abordar alguns tpicos da linguagem C de programao para que um estudante de matemtica comece a criar seus programas, que pode ser usado
num futuro como material didtico para os alunos da graduao do curso de matemtica.
Sendo assim, os objetivos gerais so:
12
Aplicar parte do que foi aprendido na soluo de um PVC usando o Mtodo das Diferenas Finitas.
13
Captulo 2
LINGUAGEM C
C uma linguagem de programao que foi criada em 1972, por Dennis Ritchie, nos
laboratrios Bell, com o objetivo principal de facilitar a criao de programas extensos com
menos erros. Muitas linguagens de programao foram infuenciadas pela linguagem C, dentre
elas podemos citar C++ e Java [3]. Para programar em linguagem C, alm de entender os
algortmos, o programador precisa de um compilador, que faz a traduo da linguagem de
programao para uma outra (binria) que o computador entenda e o execute.
2.1 Compiladores
Existem vrios compiladores dentre gratuitos e pagos. Para a realizao deste trabalho
foram feitos testes com duas plataformas IDE , o DEV-C++ e o Codeblocks (gura 2.1.1),
e foi optado por trabalhar com este ltimo, por possuir uma interface mais agradvel e ser
de fcil manuseio. Segue uma pequena lista de compiladores gratuitos que um programador
pode utilizar:
DEV-C++ - Plataforma IDE criada pela Bloodshed, tem suporte a projeto e boa
interface com o usurio. muito usado pelos alunos da graduao de matemtica na
UFU. Pode ser baixado no seguinte link: http://www.bloodshed.net/dev/devcpp.html.
GCC - Compilador utilizado pelo projeto GNU2 . padro ANSI C3 e nativo do sistema
4
Codeblocks - Plataforma IDE oriunda de projeto independente e criado com a colaborao de diversos desenvolvedores e programadores ao redor do mundo inteiro com
a inteno de ser uma soluo gratuita e de excelente qualidade.
os sistemas operacionais Windows, Linux e Mac.
http://www.codeblocks.org/downloads.
2.1.1
Usando o codeblocks
Para compilar e executar os programas deste trabalho, basta copiar os cdigos e seguir os
passos listados a seguir:
1. Crie um novo arquivo em branco clicando onde est indicado em vermelho na gura
2.1.2;
2. Cole o cdigo que foi copiado deste trabalho na rea indicada em vermelho na gura
2.1.3, que o local onde criamos os nossos algortmos;
3. Clique no boto indicado em vermelho na gura 2.1.4para compilar e executar o programa. O codeblocks vai pedir para salvar o programa antes, basta salvar no cheiro
desejado.
15
16
17
son e Dennis Ritchie (K&R), intitulado de The C Programming Language [4]. K&R
pretendiam com este programa mostrar ao mundo uma linguagem inovadora, que era mais
produtiva e funcional, capaz de substituir as linguagens da poca (como o Assembly e o B). A
nalidade deste programa mostrar na tela uma mensagem dizendo Este eh o meu primeiro
programa em C e terminar o programa.
// O primeiro programa em C
/* Adaptado do programa original do livro The C Programming
Language de autoria de Ken Thompson e Dennis Ritchie */
# include < stdio .h >
int main ( void )
{
printf ( " Este eh o meu primeiro programa em C . " ) ;
return (0) ;
}
Apesar de no conter nenhuma frmula matemtica, este cdigo um bom ponto de
partida para nosso estudo da linguagem C. Nele possvel observar o bsico da estrutura de
um programa em C: comentrio, pr-processamento, funo principal, bloco de dados
e funes e processos. A seguir estudaremos cada elemento encontrado neste cdigo, assim
como introduzir outros elementos para que nossos programas quem cada vez mais ricos em
linguagem de programao.
A estrutura bsica de um programa na linguagem C, como visto anteriormente,
composta por: comentrio, pr-processamento, funo principal, bloco de dados e
funes e processos. Isto quer dizer, que apenas com estes cinco elementos possvel criar
programas em C. A seguir aprenderemos sobre cada um destes tpicos.
2.2.1
Comentrio
Comentrios so linhas no executadas. Isto quer dizer que o compilador no ir
executar as linhas comentadas de seu programa. Sua funo deixar o cdigo mais legvel e
para fazer anotaes importantes dentro do prprio cdigo, como por exemplo, anotar porque
voc usou uma lgica ao invs de outra, porque voc nomeou aquela varivel de tal forma,
etc.
Sintaxe:
18
// comentrio
ou
/* comentrio */
A diferena entre as duas sitaxes que na primeira o compilador ir entender como
comentrio tudo o que estiver na mesma linha que comeou com barras duplas (//) e na
segunda tudo o que estiver depois de /* e antes de */, podendo estar ou no na mesma linha.
Ento, para comentrios extensos aconselhado utilizar a segunda sintaxe e para comentrios
pequenos ca a critrio do programador.
2.2.2
Pr-Processamento
O pr-processamento, determinado pelo caractere # (sharp), uma das etapas mais
em qualquer parte do programa, desde que no esteja na mesma linha do que outra diretiva
ou instruo, mas de praxe deix-las no incio do programa, pois facililta a organizao do
cdigo.
Existem vrias diretivas, estudaremos duas delas mais adiante, so elas: include e
dene.
Sintaxe:
# pre_processamento
Mais adiante voltaremos neste assunto detalhadamente.
2.2.3
Funo Principal
A funo principal (main) a primeira funo executada por todo programa em
C. Isto quer dizer que os blocos de comandos digitados dentro das limitaes da funo main
sero os primeiros a serem executados.
Sintaxe:
int main ()
{
bloco_de_dados
}
5 Construo
2.2.4
Bloco de Dados
Os blocos de dados, determinado pelo abrir e fechar de chaves {}, so utilizados para
determinar todas as linhas de cdigo que devem ser executados de uma vez. Em um programa
pode haver quantos blocos de dados forem necessrios, desde que, para cada chave aberta
Sintaxe:
{
bloco_de_dados
}
2.2.5
Funes e Processos
Dentro dos blocos de dados (isto , dentro das chaves) podemos ter funes, pala-
vras reservadas (ver Tabela 2.1) ou processos (operaes matemticas). Que so, basicamente, o que dene um programa. Sempre que forem utilizados, a linha deve terminar com
ponto e vrgula (;).
Sintaxe:
{
funao ;
}
No nosso primeiro programa foram utilizadas as funes printf e return.
auto
const
int
static
break
continue
else
for
void
case
default
enum
if
volatile
switch
long
signed
typedef
register
short
char
do
extern
goto
while
union
return
sizeof
20
A utilizao das bibliotecas facilita o trabalho do programador, pois uma vez que
a funo j est pronta dentro de uma determinada biblioteca, basta import-la e utilizar a
funo desejada.
Por exemplo, digamos que o programador deseja mostrar uma mensagem na tela.
Ao invs de produzir uma funo que faa isso, ele s precisa importar uma biblioteca de
entrada e sada (I/O) e utilizar uma funo dela que execute tal procedimento.
Sintaxe:
21
Biblioteca
Descrio
<assert.h>
<complex.h>
<ctype.h>
<errno.h>
<fenv.h>
<oat.h>
<inttypes.h>
<iso646.h>
<limits.h>
<locale.h>
<math.h>
<setjmp.h>
<signal.h>
<stdarg.h>
<stdbool.h>
<stdint.h>
<stddef.h>
<stdio.h>
Tratamento de entrada/sada.
<stdlib.h>
<string.h>
<tgmath.h>
<time.h>
<wchar.h>
<wctype.h>
Tratamento de strings.
Implementa facilidades para utilizao de funes matemticas.
Trata de tipos de data e hora.
Tratamento de caracteres para suportar diversas lnguas.
Contm funes para classicao de caracteres wide,
22
2.4.1
O que varivel?
Variveis so endereos de mmoria no qual podemos atribuir ou mudar o valor.
Exemplo 2. A funo
y = f (x) =
1
. Falta algo para resolv-la? A resposta sim. Note
2x+1
que no foi informado o domnio da funo (assim como o contra-domnio). Sendo assim, no
sabemos quais valores podemos atribuir para a varivel
2.4.2
Declarao de Variveis
A declarao da varivel feita da seguinte maneira:
Nomear a varivel;
Alguns cuidados devem ser tomados ao se declarar uma varivel, como no duplicar
os nomes, lembrar-se do case sensitive, no comear uma varivel por nmero (mas pode
terminar) e tambm no usar espaos no nome da varivel, pois o compilador pode entender
que outra varivel depois do espao e acusar erro (para esta situao, costumeiro usar
2.4.3
Tipos de Variveis
Conforme dito anteriormente, uma das etapas da declarao de variveis especicar
o tipo de varivel, que seria equivalente a especicar o domnio de uma funo. A linguagem
C aceita os tipos mais comuns de variveis alm da possibilidade de modicar o alcance. Na
Tabela 2.3 temos uma noo sobre os tipos de dados. Mas a seguir vamos falar sobre os que
sero mais usados no decorrer do texto.
23
Palavra chave
Signicado
Tamanho
Intervalo de valores
(em bytes)
aceitos
char
caracter
-128 a 127
signed char
-128 a 127
unsigned char
0 a 255
int
inteiro
-32.768 a 32.767
signed int
-32.768 a 32.767
unsigned int
0 a 65.535
short int
inteiro curto
-32.768 a 32 767
-32.768 a 32 767
0 a 65.535
long int
inteiro longo
-2.147.483.648 a 2.147.483.647
-2.147.483.648 a 2.147.483.647
0 a 4.294.967.295
oat
preciso simples
double
long double
16
3.4E-4932 a 1.1E+4932
Observao. O intervalo de valores aceitos da tabela acima pode variar de acordo com a
mquina do usurio.
Inteiro.
Declara-se como: int nomedavarivel
Como o nome sugere, int usado para variveis do tipo inteiro (Exemplo:
uma varivel de
16
32768
2,58,100,2234).
+32767.
Flutuante.
Declara-se como: oat nomedavarivel
O tipo oat usado para variveis do tipo real ou decimal, tambm conhecido
3.4E 36
3.4E + 36.
dgitos, consome
bytes
usamos ponto (.) ao invs de vrgula (,) para escrever um nmero decimal.
Double.
Declara-se como: double nomedavarivel
1.7E + 308.
24
1.7E 308
Caracter.
Declara-se como: char nomedavarivel
O tipo caracter usado para descrever um smbolo, tambm podendo ser um inteiro.
quanto o nmero
2.
Vale ressal-
tar que os caracteres so baseados na tabela ASCII (que pode ser encontrada no endereo
http://187.7.106.14/marcelo/org_comp/tabelaASCII.pdf ), onde cada letra consome
bytes
de memria.
Void.
O tipo void usado quando queremos que algo retorne o valor nulo (ou vazio).
Vamos voltar a falar melhor sobre o tipo void mais adiante, quando entrarmos no assunto
procedimentos.
Tambm temos os seguintes modicadores de alcance:
Long.
Declara-se como: long tipodavarivel nomedavariavel
Long um modicador de alcance que dobra o nmero de bits que a varivel suporta,
fazendo com que o seu alcance aumente consideravelmente.
2147483648
32768
+32767
para
+2147483647.
Short.
Declara-se como: short tipodavarivel nomedavarivel
Short um modicador de alcance que divide por dois (2) o nmero de bits que a
varivel suporta, fazendo com que o seu alcance diminua. Pode ser usado para o tipo int de
varivel, que passa de
32768
+32767
para
32.768
32.767.
Unsigned.
Declara-se como: unsigned tipodavarivel nomedavarivel
atribuir varivel declarada. Pode ser usado para os tipos int e char. Por exemplo o tipo int,
que passa de
32768
+32767
para
65535.
Signed.
Declara-se como: signed tipodavarivel nomedavarivel
Signed um modicador que usado para denir que a nossa varivel admite valores
positivos e negativos.
25
2.4.4
as mesmas.
A atribuio de valores s variveis indicada pelo sinal de igual (=). Sendo que a
varivel que vai receber o valor ca esquerda do sinal e o valor (ou resultado) ca direita.
Exemplo 4. Criar um programa que declara trs variveis inteiras e atribui valores para elas:
// Pr - processamento :
# include < stdio .h >
# include < stdlib .h >
// Funo principal :
int main () {
// Bloco de dados :
// Declarando variveis :
int a ;
int b ;
int c ;
// Atribuindo valores para as variveis :
a = 2;
b = 3;
c = a + b;
return 0;
}
Neste exemplo foram declaradas trs variveis (a,b e
atribudo valor
resultado de
para a varivel
a + b,
ento
a, 3
para a varivel
c)
e para a varivel
o valor que o
c = a + b = 2 + 3 = 5.
na inicializao ou
durante um processo.
Quando queremos que alguma varivel comee com um valor j estipulado, estamos
falando de declarao na inicializao.
clculos, estamos falando de um processo. Na Tabela 2.4 tem um descrio dos operadores
mais comuns.
26
Operador
Descrio
Atribuio
Soma
Subtrao
Multiplicao
Diviso
Resto da diviso
++
Incremento
- -
Decremento
// Pr - processamento
# include < stdio .h >
# include < stdlib .h >
int main () {
// Atribuindo valores na inicializao :
int a = 45;
long int b = 123456789;
// Funo de sada de dados :
printf ( " % d " ,a ) ;
printf ( " % d " ,b ) ;
return 0;
}
Este cdigo atribui os valores
45
para a varivel
123456789
para
b.
Em seguida,
// Pr - processamento
# include < stdio .h >
# include < stdlib .h >
int main () {
// Declarando variveis :
int x ;
int y ;
float z ;
27
2.5.3,
quando
A diferena que
y)
e uma varivel
utuante (z ). Ento, foram criados processos para atribuir valores para estas variveis. Para
a varivel
x = 25 + 3 = 28.
O compilador tem uma ordem de preferncia para realizar os clculos, que , basicamente, a
mesma que utilizamos nos clculos matemticos casuais. Mas, aconselhvel o programador
ter o hbito de usar parnteses para organizar os clculos em seus cdigos. Para a varivel
y = x + 2 = 28 + 2 = 30.
y = x + 2,
z foi realizado o seguinte processo: z = y/0.25, isto quer dizer que z vai receber
funes de entrada.
2.5.1
Funes de Sada
Funes de sada permitem, resumidamente, a comunicao entre a mquina e o
usurio (ou interface com o usurio). Por exemplo um programa no qual deseja-se calcular
a rea
R.
um processo utilizando os operadores da Tabela 2.4 , para atribuir o valor, que ser o nosso
resultado, para uma varivel
A do tipo oat.
28
// Pr - processamento
# include < stdio .h >
# include < stdlib .h >
int main () {
// Declarando variveis :
float A ;
float R = 2;
/* Criando o processo para atribuir o valor para a :
varivel A ( Area = 2* pi * R * R ) : */
A = (3.14) *( R ) *( R ) ;
return 0;
}
Perceba que, diferente dos programas anteriores, no foi utilizado o comando printf.
Ao executar o programa, ele faz os clculos e naliza. exatamente como foi escrito no cdigo.
Da surge a pergunta: Como vou saber o resultado?. Ou melhor: Como vou ver o resultado?. Ento surge a necessidade da utilizao de uma funo de sada, que permitir o
usurio ver o resultado.
As Funes de Sada so encontradas na biblioteca padro de entrada/sada: st-
Sintaxe:
Para isto precisamos falar sobre mscara de dados, que trataremos mais
adiante.
Exemplo 7. Criar um programa que faa aparecer a mensagem Ol na tela para o usurio.
29
2.5.1.1
Controle de Texto
Os controles de texto so usados para melhorar a interface com o usurio. Assim
como quando escrevemos ns saltamos linhas, pargrafos, dentre outros para que o texto que
mais legvel e organizado.
Todos os comandos de controle de texto so determinados pela barra invertida (\).
Como podemos ver na Tabela 2.5, cada letra determina uma ao.
Geralmente ns usaremos apenas os comandos de saltar linha e de adicionar ta-
bulao.
Comando
Ao
\n
\t
\a
Adiciona um bip
\b
Volta um caracter
\r
2.5.2
Funes de Entrada
Voltemos a falar sobre o programa do clculo da rea de uma circunferncia de raio
R.
Com o programa que zemos, conseguimos calcular a rea de uma circunferncia de raio
2.
Mas, e se quisssemos mudar o valor do raio? Seria necessrio abrir o cdigo e mudar o
diferente. Para este programa no algo difcil de se fazer, mas em um programa maior e
mais complexo no muito interessante car fazendo tal procedimento.
as funes de entrada, que devem ser usadas em conjunto com as funes de sada
do seguinte modo: Voc pede para o usurio digitar uma entrada com uma funo de sada
(printf ), ento uma funo de entrada vai armazenar em alguma varivel o que o usurio
digitou.
30
Sintaxe:
2.5.3
Mscara de dados
Para trabalhar com funes de entrada e sada de dados precisamos utilizar
mscaras de dados. Estas so usadas para denir entradas e sadas de dados em C. Basicamente, uma mscara de dados demonstra ao programa que tipo de converso deve ser
adotado para converter os bytes armazenados em uma varivel.
Exemplicando, se pretendemos entrarmos com uma varivel do tipo oat e utilizarmos uma mscara de int, o algortmo vai ler apenas os dois primeiros bytes, pois uma varivel
inteira tem
oat.
Todos os comandos de mscara de dados so determinados pelo simbolo de porcen-
tagem (%). Como podemos ver na Tabela 2.6, onde so listadas as mscaras.
Mscara
Tipo de dado
%d
int
Descrio
Mostra um nmero inteiro
%c
char
Mostra um caracter
%f
oat
%lf
double
%i
int
%ld
long int
%e
oat ou double
%E
oat ou double
%o
int
%x
int
%X
int
%s
char
31
Por exemplo, se
quisermos que aparea o smbolo de porcentagem (%) na tela. Neste caso a mscara
de dados seria %%. Tambm podemos fazer algumas modicaes, como determinar a
preciso de uma varivel do tipo oat. Todas as consideraes sobre mscara de dados
esto nas Tabelas 2.7 e 2.8.
Mscara
%%
Descrio
Mostra o smbolo de porcentagem ( % ) na tela
\"
\'
Mscara
Modicao
Descrio
%d
%+d
%f
%."nmero"f
%o
%#o
%x
%#x
Vamos fazer alguns cdigos para axar o contedo que aprendemos at agora.
Exemplo 9. Criar um programa que pea para que o usurio digite dois nmeros: um inteiro
e um utuante. Aps isso, mostrar na tela os nmeros digitados.
Soluo: Para este programa precisamos, primeiramente, declarar as variveis. Ento usaremos a funo printf para mostrar uma mensagem para o usurio digitar os dois nmeros, e
a funo scanf para l-las. Finalmente, usaremos novamente a funo printf para mostrar ao
usurio os nmeros digitados. Vamos ao cdigo:
unidades; subtrair
13
2.
Soluo: Este programa segue a mesma lgica do anterior. A diferena que sero declaradas
variveis para receber um valor para cada clculo realizado. Vamos ao cdigo:
return 0;
}
Ao executar o programa, ir aparecer a mensagem Ola! Digite um numero inteiro..
Digitando
23 =
6, 22
o programa retornar
=1
2%2 = 0,
2, 2 + 1 = 3, 2 1 = 1, 2 + 5 = 7, 2 13 = 11,
Sintaxe:
Comando
Descrio
cd PASTA
cls
Limpa a tela
color XX
date/t
dir
md PASTA
mem
pause
time/t
title NOME
ver
34
11,
35
// Limpando a tela :
system ( " cls " ) ;
return 0;
}
Primeiramente modicado o ttulo da janela para EXEMPLO DOS COMANDOS
DE SISTEMA. Depois so utilizadas as funes de entrada/sada para atribuir valor para
a varivel inteira
a.
clculos realizados em cima do valor da varivel digitada pelo usurio. Feito isso, aparece uma
mensagem na tela para que o usurio pressione uma tecla para continuar e, em seguida, a tela
limpada novamente.
36
Captulo 3
ESTRUTURAS DE CONTROLE DE
FLUXO
Estruturas de controle de uxo so comandos utilizados para determinar qual a ordem
e quais comandos devem ser executados pelo programa com uma dada condio.
ou
0).
Ento, estamos
dizendo para o computador: Se (If ) for tal coisa, faa isso! e Se no (Else), faa isso!.
fcil notar que esta estrutura seletiva possui a mesma lgica do smbolo
=(se,
ento) que
Sintaxe:
if ( condio ) {
comandos_a_serem_executados_caso_a_condio_seja_verdadeira
;
}
else {
comandos_a_serem_executados_caso_a_condio_seja_falsa ;
}
Exemplo 12. Criar um programa que pea para o usurio que digite um nmero. Vericar
se o nmero digitado par ou mpar.
Soluo: Neste cdigo precisamos, primeiramente, perguntar ao usurio qual o nmero que
ele deseja vericar se par ou mpar e l-lo.
captulo anterior j sabemos fazer esta parte. Em seguida precisamos vericar se o nmero
digitado pelo usurio par ou mpar. Para fazer isto utilizaremos o operador %, que retorna o
resto da diviso (ver Tabela 2.4). Alm disso, criaremos um vericador: SE o resto da diviso
37
0,
Vamos ao cdigo:
2, b = a%2 = 2%2 = 0,
Digitando
digitado eh impar!.
3.1.1
Operadores Lgicos
Para trabalhar melhor com a estrutura if/else precisamos conhecer os operadores
lgicos. Com eles fazemos o processo de anlise da condio, isto , vericar se falsa ou
verdadeira. Como no exemplo
13,
Alm dos operadores de condio existem dois especiais: && (e) e || (ou).
Que
fazem com que nossa gama de possibilidade contemple tudo o que precisamos para construir
os cdigos deste trabalho.
Na Tabela 3.1 temos uma tabela com os operadores lgicos.
38
Operador Lgico
Descrio
Exemplo
==
igual a
2 == 2 (VERDADEIRO)
>=
maior ou igual a
2 >= 1 (VERDADEIRO)
<=
menor ou igual a
2 <= 1 (FALSO)
>
maior que
2 > 1 (VERDADEIRO)
<
menor que
2 < 1 (FALSO)
!=
diferente de
2 != 1 (VERDADEIRO)
||
Ou
No
2 ! 1 (VERDADEIRO)
&&
Exemplo 13. Criar um programa que pea para o usurio digite um nmero natural. Se
ele for positivo, vericar se ele par ou mpar, se ele for par, retornar o seu valor elevado
ao quadrado. Se for mpar, retornar o resto de sua diviso por
2.
Soluo: Para construir este programa utilizaremos a estrutura if/else. Primeiramente usaremos as funes de entrada e sada para que o usurio digite um nmero inteiro.
Ento
usaremos a estrutura if/else para vericar se o nmero digitado positivo. Se for verdadeiro,
vamos construir outro vericador se o nmero par ou mpar (idntico ao exemplo
13).
Se
for par, vamos retornar o valor do nmero digitado elevado ao quadrado e se for mpar o resto
de sua diviso por dois. Vamos ao cdigo:
}
}
else {
printf ( " O numero digitado nao eh natural ! \ n " ) ;
system ( " pause " ) ;
}
return 0;
}
Ao executar o programa, ir aparecer a mensagem Ola! Digite um numero natural
por gentileza..
Digitando
6, 15
36, 1
e a
Exemplo 14. Criar um programa que pea para o usurio digitar1 para calcular a rea de uma
circunferncia de raio
R, 2
e altura
H.
ou
para calcular
os valores do raio, lado, base e altura para realizar os clculos. Mostrar os resultados na tela.
Soluo: O interessante deste exemplo que utilizaremos a estrutura if/else como se fosse
um menu de seleo para o usurio. Mais a frente estudaremos um modo mais simples de
fazer isto, mas if/else uma boa opo de qualquer maneira.
Para montar este programa precisaremos, primeiramente, de criar uma varivel do
tipo int para que o usurio possa digitar sua opo. Feito isso, utilizaremos a estrutura if/else
para impor o condicional e montar o menu. Em cada uma das opes basta montar os clculos
e mostrar o resultado na tela para o usurio. Vamos ao cdigo:
float R ;
printf ( " Digite o valor do raio R
da circunferencia \ n " ) ;
scanf ( " % f " , & R ) ;
system ( " cls " ) ;
printf ( " A area da circunferencia
de raio % f eh :\ n " ,R ) ;
printf ( " % f \ n \ n " ,3.14* R * R ) ;
system ( " pause " ) ;
}
else {
float L ;
printf ( " Digite o valor do lado do
quadrado \ n " ) ;
scanf ( " % f " , & L ) ;
system ( " cls " ) ;
printf ( " A area do quadrado de
lado % f eh : % f \ n \ n " , L , L * L ) ;
system ( " pause " ) ;
}
}
else {
float B , H ;
printf ( " Digite o valor da base do
triangulo : \ n " ) ;
scanf ( " % f " , & B ) ;
system ( " cls " ) ;
printf ( " Digite o valor da altura do
triangulo : \ n " ) ;
scanf ( " % f " , & H ) ;
system ( " cls " ) ;
printf ( " A area do triangulo de base % f e
altura % f eh : " , B , H ) ;
printf ( " % f \ n \ n " ,( B * H ) /2) ;
system ( " pause " ) ;
}
}
else {
printf ( " Entrada invalida ! \ n \ n " ) ;
system ( " pause " ) ;
}
return 0;
}
Ao executar o programa, ir aparecer a mensagem Digite 1 para realizarmos o calculo
da area de uma circunferencia de raio R. 2 para realizarmos o calculo da area de um quadrado
de lado L. Digite 3 para realizarmos o calculo da area de um triangulo de base B e altura
41
H:.. Digitando
L = 50
a = 1
o resultado ser:
R = 7
o resultado ser:
L2 = 2500.
Digitando
3.14 72 = 153.86.
a = 3, B = 3
Digitando
H = 16
a = 2
o resultado ser:
(3 16)/2 = 24.
Perceba que, para resolver este problema, precisamos impor vrias condies para
chegar ao desejado. Foi escolhido este modo de construo para que o programador iniciante
perceba que possvel construir vrios cdigos usando apenas o bsico. No quer dizer que o
melhor aprender apenas o bsico e car criando os cdigos utilizando apenas estes recursos.
Mas no precisamos saber tudo sobre a linguagem C para criar programas.
O exemplo acima pode ser feito de outras maneiras mais simples, uma delas vamos
aprender a seguir.
3.1.2
Else If
Else If (Se no, se) um vericador que utilizamos em alguns casos (como o
exemplo anterior) onde queremos criar outro vericador que no seja exatamente o contrrio
do que foi vericado no if/else.
Resumidamente, estamos dizendo ao computador: Se (if ) for tal coisa, faa isso!
Se no, se (else if ) for tal coisa, faa isso! e Se no (else), faa isso!.
Sintaxe:
if ( condio ) {
comandos_a_serem_executados_caso_a_condio_seja_verdadeira
;
}
else if ( condio ) {
comandos_a_serem_executados_caso_a_condio_seja_verdadeira
;
}
else {
comandos_a_serem_executados_caso_todas_as_condies_sejam_falsas
;
}
\ en \ art5d { lstlisting }
\ begin { example }
Criar um cdigo que reescreve o cdigo do exemplo $15$ utilizando
else if :
\ end { example }
\ begin { lstlisting }
# include < stdio .h >
# include < stdlib .h >
int main () {
int a ;
42
como um
if/else com vrias possibilidades, mas com algumas diferenas que fazem com que o switch
seja melhor em algumas situaes, outras no.
Antes de entendermos as diferenas vamos ver como funciona a sintaxe desta estrutura.
Sintaxe:
switch ( Variavel ) {
case valor_1 :
bloco_de_comandos1 ;
break ;
case valor_2 :
bloco_de_comandos2 ;
break ;
case valor_3 :
bloco_de_comandos3 ;
break ;
default :
bloco_de_comandos4 ;
}
A principal diferena que podemos detectar que, diferente da estrutura if/else,
switch no aceita operadores lgicos para realizar as comparaes. Ao invs disso, ele
verica se uma determinada varivel vale qualquer quantidade de valores que o programador
desejar vericar. Esta vericao feita atravs dos cases (que signica caso) e, caso nenhum
case seja verdadeiro, o compilador executa o bloco de comandos determinado pelo default,
do ingls padro, que o case ativado caso no tenha achado nenhum que fora denido. Ou
seja, o que aconteceria em ltimo caso. Vamos imaginar o seguinte cenrio: Seu programa
pede para que o usurio digite apenas duas opes (S ou N) para reiniciar o programa. Mas,
propositalmente ou por engano, o usurio digita uma opo totalmente diferente. E agora?
O que seu programa deve fazer? aqui que o default entra. Geralmente o default usado
quando previsto um erro, uma entrada de dado incorreta ou no de acordo com o contexto.
44
Basicamente estamos dizendo ao computador: Caso a varivel seja este valor, faa isso e,
caso no seja nenhum dos valores, faa isso.
Outro detalhe o break (que signica parar). No nal de cada case inclumos um
break para que o switch pare e o compilador saia do lao. Caso no seja adicionada esta linha
ao cdigo, o compilador vai percorrer todos os cases mesmo que j tenha encontrado um case
verdadeiro. A no utilizao do break diminui a performace do programa, o que no estamos
interessados. Break tambm pode ser utilizado nas seguintes estruturas: for, while e do while.
Exemplo 15. Criar um programa que simule as operaes bsicas de uma calculadora: Com
a estrutura switch criaremos um menu onde teremos as opes soma, subtrao, multiplicao
e diviso. Para o usurio, vamos pedir que ele digite dois nmeros (tipo oat) e escolher a
operao, digitando
1, 2, 3
ou
4.
2, 124
5 6 = 30.
78
Digitando
o resultado ser:
4, 3
17
Digitando
1, 8
124 78 = 76.
o resultao ser:
19
o resultado ser:
Digitando
3, 5
8 + 19 = 27.
o resultado ser:
3/17 = 0.176471.
Essa
varivel dever ser inicializada, alm disso o programador dever indicar o seu critrio de
Sintaxe:
46
25,
Soluo: Para criar este cdigo, utilizaremos uma estrutura for onde iniciar em
cutado at
25,
1,
ser exe-
memria do computador, alm disso, voc poder criar novamente uma varivel chamada
(como no exemplo
18)
Soluo: Apesar de ser simples, este exemplo utiliza boa parte do que aprendemos at ento.
A diferena entre este cdigo e o anterior que, a cada loop, precisamos vericar se o nmero
par ou mpar (exemplo
13).
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1.
para o usurio a seguinte sequncia:
1, 0, 1, 0, 1, 0, 1, 0, 1,
Exemplo 18. Criar um programa que pea para o usurio digitar um nmero. Retornar uma
mensagem dizendo se ele primo ou no.
Soluo: Lembrando: um nmero primo se ele divisvel por dois nmeros apenas,
e ele
prprio. Ento, vamos criar um If/else dever vericar a seguinte condio: Se o nmero de
divisores for exatamente dois, ento ele primo. Para isto, precisamos de criar uma varivel,
que inicialmente tenha valor nulo, e que incremente uma unidade cada vez que o nmero tenha
uma diviso com resto
0.
Agora que denimos como ser nossa estrutura if/else, vamos organizar o for, para
isso precisamos saber qual ser nossa inicializao. Como estamos querendo contar os divisves
de um determinado nmero, ento os valores acima dele no nos importa. Logo, conveniente
criar um for que v do prprio nmero at o nmero
1,
loop. Com isso conseguimos construir o nosso cdigo. Ento vamos a ele:
else {
printf ( " O numero % d nao eh primo . \ n " , n ) ;
system ( " pause " ) ;
}
return 0;
}
Ao executar o programa, ir aparecer a mensagem Digite um numero inteiro que
gostaria de saber e eh primo:.
Digitando
0.
Neste caso
7,
x = 2,
Digitando
22,
i (n%i)
por
0, 1, 2, 3, 1, 1,
primo.
7, 8, 9, 10, 0, 2, 4, 6, 1, 4, 2, 2, 1, 0, 0.
3.3.1
Neste caso
x = 4,
por
logo
i (n)
22
0, 1, 2, 3, 4, 5, 6,
no primo.
Vetores e Matrizes
Alm de serem usados como vetores e matrizes, tambm costumeiro utiliz-los para
guardar vrios valores em uma s varivel, como por exemplo uma sequncia de nmeros (CPF,
CNPJ, RG, Telefone, etc.), guardar uma sequncia de nmeros, dentre outros.
Para declarar um vetor precisamos dizer qual o tipo de varivel que vamos trabalhar,
mas a varivel vai ser seguida de colchetes ([]), onde deniremos o tamanho do vetor.
Declarao de um Vetor:
Exemplicando:
Exemplicando:
49
10
10.
Soluo: Para preencher tanto um vetor quanto uma matriz utilizaremos a estrutura for. A
questo conseguir acessar cada posio para o preenchimento, para isso basta dizer entre
colchetes qual posio estamos acessando. Por exemplo:
e coluna
da matriz chamada
z.
z[1][2],
Ento vamos ao
cdigo:
Exemplo 20. Criar um programa que preenche uma sequncia numrica de tamanho escolhido
pelo usurio (mximo1000), de valores inteiros, onde o usurio digita as entradas. Feito isso,
calcular o somatrio e o produtrio da sequncia.
50
Soluo: Para criar este cdigo precisamos, primeiramente, criar um vetor do tipo int de
tamanho escolhido pelo usurio e ento utilizar as funes printf e scanf para povo-lo. Aps
isso, precisamos de um lao for para calcular o somatrio e o produtrio, onde criaremos uma
varivel para cada um dos resultados onde iremos, a cada volta do loop, somar e multiplicar o
termo atual com o resultado do que j temos, isto :
e
produt
orio = produt
orio sequencia[i].
somat
orio = somat
orio + sequencia[i]
12
e a seguinte sequncia:
369
e o produtrio
51
1, 1, 2, 3, 5, 8, 13, 21,
2029593312.
Exemplo 21. Criar um cdigo que verica se dois vetores, de tamanho e elementos digitados
pelo usurio, so Linearmente Independentes (LI) ou Linearmente Dependentes (LD).
Soluo: Dois vetores so LD se um deles for igual a uma constante vezes o outro, isto ,
no caso de dois vetores
B:
A=B
Ento, para montarmos este cdigo, precisamos primeiramente utilizar o operador for
para que o usurio preencha os vetores. Feito isto criaremos um terceiro vetor, chamado
do
tipo oat, que ir receber o resultado da diviso de cada membro de um vetor pelo outro, isto
,
c[i] = b[i]/a[i].
tendo o mesmo valor, sendo assim, vamos criar um lao for para vericar com o operador
if se cada par de elementos do vetor
os
}
/* Para que os vetores sejam LD , o vetor c criado
anteriormente precisa
ter todos os membros iguais , isto , c [ i ]= c [ i +1].
O contador adicionar uma unidade caso isso no acontea :
*/
for ( i =1; i < n ; i ++) {
if ( c [ i ] == c [ i +1]) {
contador ++;
}
}
if ( contador == n -1) {
printf ( " \ nOs vetores digitados sao LD .\ n " ) ;
}
else {
printf ( " \ nOs vetores digitados sao LI .\ n " ) ;
}
return 0;
}
Ao executar o programa, ir aparecer a mensagem Digite o tamanho dos vetores:.
Digitando
c = b/a
ser
c = (3, 3, 3),
so iguais,
so LD, ento aparecer a mensagem Os vetores digitados sao LD. para o usurio.
b = (3, 8, 7).
e
O vetor
Digitando
O vetor
a = (1, 4, 9),
so LI, ento aparecer a mensagem Os vetores digitados sao LI. para o usurio.
Exemplo 22. Criar um programa que retorne o mximo e o mnimo de um vetor, de tamanho
n,
Soluo: Para resolver este problema precisamos criar um lao for para que o usurio digite
os elementos do vetor. Feito isto, criaremos um segundo lao for que ir vericar, utilizando
o operador if/else, se cada elemento do vetor digitado maior do que uma varivel auxiliar,
que chamaremos de auxmax, ou menor do que uma outra varivel auxiliar, que chamaremos
de auxmin. Caso seja verdadeiro algum dos vericadores, a varivel em questo assumir o
valor que o vetor possui naquela posio. Vamos ao cdigo:
10
o mnimo
7.
e o vetor
Exemplo 23. Criar um programa que faa com que o usurio preencha uma matriz
10
125
10.
Zerada;
1;
Soluo: Para criar este cdigo precisaremos, primeiramente, preencher uma matriz
10
10
(como vimos anteriormente). Ento criaremos um loop que atribua para cada posio da
54
matriz o valor
0.
for igual a
j ).
para as posies da
Vamos ao cdigo:
3X3.
Para calcular o
55
3X3.
a b c
3.
1 0 11 ,
8 10 7
det = (3 0 7 + 6 8 11 + 9 1 10) (9 0 8 + 3 11
o determinante ser
10 + 6 1 7) = 150.
Exemplo 25. Criar um programa que calcule a soma de duas matrizes
56
4:
Soluo: Para fazer este clculo criaremos uma terceira matriz, de modo que cada um de
seus elementos receber a soma dos elementos da mesma posio das duas matrizes digitadas
pelo usurio. Isto quer dizer que:
Vamos ao cdigo:
1 1 1 1
2 2 2
4x4. Digitando valores para construir as matrizes a =
3 3 3
4 4 4
4 3 2 1
2
e b = 1
4
3
4
1
1+1
5
2+4
= 3
3+1
7
4+4
5
2 3 4
o
3 2 1
2 3 4
4 3 2
4 5 6
.
6 5 4
6 7 8
Sintaxe:
While ( comparaao ) {
bloco_de_instruoes ;
}
importante salienar que while no incrementa (ou decrementa) automaticamente
uma varivel. Ento devemos tomar cuidado, pois s vezes ao utilizar while ns entramos em
loops innitos (ver exemplo
28).
Exemplo 26. Criar um programa que faa um loop innito usando a estrutura while.
58
0!
100,
faa
x = x+1
y = x + 1.
tendam ao innito.
Exemplo 27. Criar um programa que pea para o usurio adivinhar um nmero de
20.
Enquanto ele no digitar o nmero correto, mostrar uma mensagem o desaando a acertar.
acertar o nmero. Caso ele acerte, mostrar uma mensagem parabenizando. Vamos ao cdigo:
return 0;
system ( " pause " ) ;
}
Exemplo 28. Criar um programa que calcule o epsilon da mquina (ou zero da mquina),
isto , a distncia entre
Soluo: Para criar este programa criaremos uma varivel do tipo double chamada
epsilon
atribuir o valor
o valor atual de
epsilon
na inicializao.
epsilon
1 + epsilon
1.
Ento
3.4.1
0.00000.
Do While
Utilizamos a estrutura de repetio do while quando queremos que um determinado
loop seja executado pelo menos uma vez. Traduzindo, do signica faa e while enquanto.
A diferena entre do while e while que, no comando do while, executamos o bloco
de instrues e depois comparamos, enquanto que no while comparamos antes de executar o
bloco de instrues.
Sintaxe:
Do {
bloco_de_instruoes ;
} while ( comparaao ) ;
60
Exemplo 29. Criar um programa que verica qualquer quantidade de nmeros (um a um)
que o usurio digitar se par ou mpar, que naliza quando for digitado o nmero
0.
36
o resto da diviso de
por
2 (n)
0,
eh par..
Digitando
O numero
36,
197
eh impar.
61
Digitando
o programa nalizar.
62
Captulo 4
FUNES
Em todos os nossos programas existe uma linha contendo int main (). Trata-se
de uma funo. Mais do que isso, a funo principal de qualquer programa criado em
linguagem C.
Mas, o que uma funo?
Funes so blocos de cdigos que retornam valores. Assim como o int main, que
retorna um valor inteiro. Este o motivo da linha contendo return
estamos retornando o valor
0
de nossos programas:
0.
x1 ,
x1 ;
resultando em um ponto
x2 ;
x2 ;
entrada
clculos valores
temos usado muito em nossos programas: printf. Nela ns digitamos, por exemplo, um texto
que aparece na tela para o usurio.
63
para o usurio).
Usamos funes, principalmente, quando precisamos realizar algum clculo mais de
uma vez em um programa.
Sintaxe:
4.1.1
com argumentos. Utilizamos o tipo void no lugar dos argumentos quando construmos uma
funo deste tipo.
Sintaxe:
Exemplo 30. Criar um programa que faz com que o usurio preencha matriz uma
5.
Soluo: J sabemos preencher uma matriz (exemplo21). A diferena que agora vamos
criar uma funo que, toda vez que for chamada, mostre na tela uma mensagem para o usurio
digitar um valor. Vamos ao cdigo:
4.1.1.1
Retornar Valores
Funes podem retornar valores ou no. Quando denimos um tipo de retorno para
uma funo, espera-se que este retorno seja feito de algum modo.
comando return. O tipo de retorno o tipo de varivel que a funo vai retornar (o resultado).
Quando no queremos que uma funo retorne valor, basta colocar o seu tipo como sendo
void (como foi visto no exemplo
31).
Sintaxe:
x.
uma varivel esperando um valor no lugar onde a funo ser usada, que ser o resultado da
funo. Veremos melhor nos exemplos.
Exemplo 31. Criar um programa que contm uma funo que soma dois nmeros inteiros e
retorna o resultado da soma.
Soluo: Vamos criar uma funo que precisa de dois argumentos de forma implcita (tipo
void), chamada somar e que retornar o valor da soma de tipo int. Nesta funo iremos pedir
65
179
235
o valor de
ser
Aparecer a mensagem O
414.
Agora, sempre que quisermos somar dois nmeros em um programa, podemos simplesmente copiar a funo somar e colar no cdigo.
Exemplo 32. Criar um programa que contenha uma funo que calcula a derivada de uma
funo am digitada pelo usurio.
Soluo: Vamos criar uma funo chamada derivar_am que retorne um valor do tipo oat.
Na funo principal chamaremos a funo derivar_am, atribuindo o seu resultado a uma
66
4.1.2
f (x) = ax + b.
f (x) = 7.
Digitando
a=7
b = 12 (f (x) = 7 x + 12),
da
a derivada da
7.
mas em muitos casos ns estaremos interessados em utilizar uma determinada funo utilizando
variveis que foram calculadas em outros procedimentos dentro da funo principal, podendo
ser at outras funes. Nestes casos criamos as funes com argumentos.
Argumentos so parmetros pr-especicados que so necessrios para o funcionamento de uma funo. Resumidamente, um argumento uma varivel, que necessrio
para algum processo especicado dentro da funo. Para criar uma funo com argumento
67
basta declarar uma varivel entre os parnteses depois do tipo de retorno e nome da funo. Quando fazemos isso, estamos dizendo que a funo est esperando uma varivel de um
determinado tipo. Para colocar mais de um argumento em uma funo basta separ-los por
vrgulas.
Os argumentos podem ser passados por valor ou por referncia. No primeiro caso
quando queremos enviar os dados para serem usados nos clculos dentro da funo, no
segundo caso quando queremos, alm de utilizar nos clculos dentro da funo, alterar o
valor da varivel. Quando passamos um valor por referncia, estamos enviando o endereo
de memria da varivel ao invs de seu valor. Para passar o valor por referncia basta utilizar
asterisco ( * ) na frente do nome do argumento e, quando vamos atribuir um valor novo para
a varivel que foi passada desta maneira, tambm utilizamos asterisco na frente de seu nome.
Tambm podemos passar funes como argumentos.
Sintaxe:
Exemplo 33. Criar um programa que contm uma funo chamada divisao que divide dois
nmeros digitados pelo usurio.
Soluo: Para criar este programa precisamos utilizar as funes de entrada e sada para que
o usurio digite os dois nmeros para efetuarmos a diviso. Criaremos uma funo chamada
divisao que recebe como argumentos dois valores do tipo oat, os divide, e retorna o resultado
da diviso. Ento basta dar um printf no resultado na funo principal. Vamos ao cdigo:
float x , y , res ;
printf ( " Digite qual eh o dividendo :\ n " ) ;
scanf ( " % f " , & x ) ;
y = 0;
while ( y == 0) {
printf ( " Digite qual eh o divisor : \ n " ) ;
scanf ( " % f " , & y ) ;
if ( y == 0) {
printf ( " o divisor nao pode ser 0! Digite
outro numero :\ n " ) ;
}
}
/* No necessrio especificar o tipo das variveis x e y
,
pois a funo est esperando valores do tipo float : */
res = divisao (x , y ) ;
printf ( " O retultado da divisao entre % f e % f eh : % f .\ n " ,
x , y , res ) ;
return (0) ;
}
Ao ser executado, o programa ir solicitar que o usurio digite o divisor e o dividendo,
respectivamente. Digitando
resultado da divisao entre
4.1.3
42
42
6,
eh:
temos que
x/y = 42/6 = 7.
Aparecer a mensagem O
7.
Prottipos de funes
Prototipagem trata-se de declarar uma funo para que o main (funo principal)
saiba que ela existe, mas o cdigo est em outro lugar. Esta tcnica permite que as funes
possam ser escritas em qualquer lugar do programa, e no mais antes da funo int main ().
til para saber quantas funes existem no programa, alm de melhorar a organizao. Criar
um prottipo de funo quase da mesma maneira que se cria uma funo, a diferena que
os blocos de comandos so substitudos por ponto e vrgula (;).
Sintaxe:
69
Qualquer cdigo deste captulo pode ser reescrito adicionando os prottipos das funes contidas neles.
4.1.4
Recursividade
Recursividade no um comando, mas um modo de chamar uma funo dentro dela
prpria. um artifcil muito til em alguns casos. Para chamar uma funo desta maneira,
basta utiliz-la como se j tivesse sido criada, escrevendo seu nome e os argumentos entre
parnteses (quando existem).
70
1+1 = 2
; o
termo a soma de
1 + 2 = 3.
e o
termo a soma de
termos so
1,
1, 1, 2, 3,
Vamos ao cdigo:
71
21, 34.
9,
1, 1, 2, 3, 5, 8, 13,
da sequencia de Fibonacci eh
34..
usando recursividade.
Soluo: Para fazer este cdigo, criaremos uma funo chamada fatorial que vai receber
um nmero do tipo int.
e de
igual a
1.
Sendo assim,
precisaremos criar um condicional if para validar o valor digitado pelo usurio no programa,
de modo que se for digitado
ou
do fatorial do nmero digitado utilizando recursividade: a funo vai receber o valor digitado
pelo usurio e far com que uma varivel
Ento, enquanto
72
eh
Aparecer a mensagem
720.
Variveis Locais: so aquelas que, uma vez declaradas, s podem ser utilizadas na funo onde esto. Elas s existem quando a funo chamada. At ento ns trabalhamos
apenas com variveis deste tipo.
Exemplo 37. Criar um programa que contenha uma funo que, depois que o usurio digita
o raio de uma circunferncia, incremente o raio para que o comprimento da circunferncia
nova
Soluo: Vamos usar o raio como uma varivel global no nosso programa. Ento modic-lo
na nossa funo de acordo com a medida do comprimento da circunferncia. Vamos ao cdigo:
73
// Modificando o valor de r :
r = c2 / (2* 3.1415) ;
return r ;
}
int main () {
float x ;
printf ( " Digite o valor do raio da circunferencia :\ n " ) ;
scanf ( " % f " , & r ) ;
x = incrementa ( r ) ;
printf ( " O raio incrementado vale : % f \ n " , x ) ;
return 0;
}
Ao executar o programa, ir aparecer a mensagem Digite o valor do raio da circunferencia:. Digitando
novo valor de
vale:
3,
ser:
temos que
c1 = 2 3.1415 3 = 18.849
c2 = 18.849 5 = 94.245.
15.
A seguir
74
Na
Simbologia
O que
Constante em C
Valor da constante
e
log2 e
log10 e
Ln2 (x)
Ln10
(x)
Q
Nmero de Euler
M_E
2,7182818284590452354
Logaritmo de e na base 2
M_LOG2E
1,4426950408889634074
Logaritmo de e na base 10
M_LOG10E
0,43429448190325182765
M_LN2
0,69314718055994530942
M_LN10
2,30258509299404568402
Pi
M_PI
3,14159265358979323846
Q
Q /2
/4
q2
Meio Pi
M_PI_2
1,57079632679489661923
Quarto de Pi
M_PI_4
0,78539816339744830962
Raiz quadrada de 2
M_SQRT2
1,41421356237309504880
M_SQRT1_2
0,70710678118654752440
1
2
2.
10.
Potncias:
pow (): Retorna o valor da base elevada ao expoente. Recebe dois argumentos do tipo double, o primeiro a base e o segundo o expoente.
Exemplo:
Exemplo:
ceil(45.98561) = 46.
Exemplo:
f loor(45.98561) = 45.
Exerccio 38. Criar um programa que mostra todas estas funes e constantes para melhor
entendimento:
75
Digitando
92
2,
parte inteira de
= 56.548668
e rea igual a
9 = 254.469005.
Exemplo 39. Criar um programa que calcule a norma de um vetor digitado pelo usurio.
Soluo: J aprendemos a preencher um vetor no exemplo
21.
3.742.
Exemplo 40. Criar um programa que encontra as razes de uma equao do segundo grau.
Soluo: Para encontrar as razes vamos utilizar a Frmula de Bhaskara:
x=
b-4ac
2a
Para isto criaremos uma funo chamada bhaskara que ter um if/else que ir vericar
o resultado de
4 = b-4ac:
caso seja
<0
77
a(s) razes para o usurio. Vamos declarar todas as variveis deste programa como variveis
globais. Na funo principal vamos pedir para que o usurio digite os coecientes da equao
do
78
a, b
da equao do segundo
a x + b x + c = 0.
Digitando
como
= 0,
x =
2
2
= 1.
Aparecer a
1.
raizes reais!.
Digitando
como
1+ 1
2
= 0 e x1 =
0.5
1 1
2
= 0.5.
.
Exemplo 41. Criar um programa que aplique o Mtodo de Newton [10] para a funo
f (x) = x2 2 x + 1,
sendo
a raiz de
f (x) = 0
(conrmar no exerccio
40).
Lembrando: o
Mtodo de Newton estima os zeros de uma funo, aproximando=os com a seguinte iterao:
xn+1 = xn
Com
f (xn )
f 0 (xn )
x0 dado.
Soluo: Vamos criar uma varivel de comparao (tol) que servir para nalizar o while.
Deixaremos ele xo neste cdigo em
ao usurio escolher o valor de validao. Criaremos tambm uma funo que deriva
e outra que calcula o valor no ponto digitado pelo usurio. Vamos ao cdigo:
x2 2x+1
80
da raiz de
x 2 x + 1 = 0.
b.
Digitando
4,
1.001953..
Exemplo 42. O ltimo Teorema de Fermat: Todo aluno do curso de matemtica deve
ter pelo menos ouvido sobre tal teorema que Pierre Fermat [7] enunciou e deixou, em uma
pgina de livro a seguinte observao: Eu descobri uma demonstrao maravilhosa, mas a
margem deste papel muito pequena para cont-la . A demonstrao s foi feita em 1995,
por Andrew Wiles, utilizando conhecimentos matemticos que na poca em que Fermat era
vivo ainda no tinham sido descobertos, o que leva muitos matemticos a duvidarem de que
Fermat realmente tinha demonstrado seu teorema, que diz que o Teorema de Pitgoras
(quadrado da hipotenusa igual soma do quadrado dos catetos) no vale para
,
x +y = z
n > 2.
n > 2.
Isto
usurio.
Soluo: Para este cdigo vamos criar uma funo chamada fermat que receber um valor
n,
at
5.
x, y
z.
x +y = z
0,
dentro da funo e, se a
0.
Ento, caso
seja
2:.
x +y
n maior
e de
z2.
Alm disso aparecer ao nal a mensagem: O Ultimo Teorema de Fermat nao eh valido para
a situacao proposta.
Observao. Perceba que este programa no demonstra o teorema, mas verica se ele vlido
para casos particulares. Ele tambm no funciona se o usurio digitar valores muito grandes
para
n, isto se deve ao fato de os resultados dos clculos se tornaro muito altos e uma varivel
82
4.4 STRUCTS
As estruturas de dados (Structs) consistem em criar apenas um dado que contm
vrios membros, que nada mais so do que outras variveis. Em outras palavras, uma varivel
que contm um grupo de outras variveis. A vantagem em se usar estruturas de dados que
podemos agrupar de forma organizada vrios tipos de dados diferentes, por exemplo, dentro
de uma estrutura de dados podemos ter juntos tanto um tipo oat, um inteiro, um char ou um
double. Matematicamente falando, podemos guardar dentro de uma s varivel coordenadas
de pontos, retas, planos, polgonos, dentre outros.
As variveis que cam dentro da estrutura de dados so chamadas de membros.
Sintaxe:
struct nome_da_estrutura {
tipo_de_dado nome_do_membro ;
tipo_de_dado nome_do_membro ;
};
Aps nalizar a denio dos membros no bloco de dados, terminamo a linha com
um ponto-e-vrgula ( ; ).
Para declarar uma varivel de tipo estrutura basta digitar o nome da estrutura
como tipo de varivel.
Exemplo 43. Criar uma estrutura chamada pontos, onde sero guardados dois membros do
tipo inteiro: coordenada x e coordenada y.
struct pontos {
int x ;
int y ;
};
4.4.1
oat, int).
seguida de um ponto (.) e o nome do membro. Vamos utilizar o struct criado no exemplo
anterior para exemplicar.
83
Exemplo 44. Criar um programa que, dados dois pontos, calcule a distncia entre eles.
Soluo: Para resolver este programa vamos, primeiramente, utilizar a estrutura do exemplo
42
chamada pontos.
povo-los e ento calcular a distncia entre estes dois pontos utilizando as funes da biblioteca
math.h para realizar os clculos.
de tamanho
84
2.236068.
eh:
(x1 x2 ) + (y1 y2 ) = (1 3) + (1 0) = 4 + 1 = 5 =
2.236068..
Para passar struct como referncia para uma funo usa-se a seguinte sintaxe:
nome_da_struct * nome_da_variavel
Exemplo 45. Vamos usar a struct pontos criada no exemplo anterior sendo passada como
referncia em uma funo chamada calcula:
85
4.4.2
Typedef
Em C podemos redenir um tipo de dado, dando-lhe um novo nome. Isto muito
Sintaxe:
Exemplo 46. Criar um programa que usa typedef para denir int como inteiro e oat como
utuante:
86
Sintaxe:
Sintaxe:
4.5 PONTEIROS
Ponteiros um assunto extremamente complexo e que pode levar o programador a
cometer vrios erros em seus programas, que podem at danicar o computador [3]. Sendo
assim, vamos trabalhar apenas alguns tpicos do contedo que sero o suciente para fazermos
nossos programas.
Quando declaramos uma varivel de qualquer tipo, ela recebe um endereo de memria, que o local onde ela est armazenada na memria do computador. Um ponteiro , em
poucas palavras, uma varivel que aponta para um endereo de memria do seu computador.
Com isto os programas tornam-se mais ecientes, pois estamos trabalhando diretamente com
a memria do computador.
4.5.1
precedida de um asterisco (*). importante ter ateno ao declarar vrios ponteiros em uma
nica linha, pois cada uma precisa ter um asterisco para ser declarada corretamente.
Sintaxe:
tipo_do_ponteiro * nome_do_ponteiro ;
Exemplo 47. Alguns exemplos de ponteiros:
a,
int x ;
int * y ;
x = 10;
* y = 15
O valor
o ponteiro
15
est apontando, mas no sabemos qual este endereo. Ento importante ter
muito cuidado ao manipular ponteiros nos programas, pois podemos mudar valores de variveis
que podem danicar o computador.
Observao. O operador * igual ao de multiplicao. Ento bom tomar cuidado ao utilizlo.
4.5.2
Aritmtica de ponteiros
Existem duas expresses que podem ser usadas quando se trabalha com ponteiros:
utilizando os operadores ++ e ou
4.5.3
4.5.3.1
Funo malloc
Funo que reserva um bloco consecutivo de bytes na memria e retorna o seu en-
dereo. Para isto precisamos denir o tamanho que desejamos. Como o nosso parmetro de
medida em programao o tamanho de cada tipo de varivel em byte, utilizamos o operador
Sintaxe:
sizeof ( tipo_de_variavel ) ;
No quer dizer que o tipo de varivel que colocamos o operador sizeof ser utilizada
no programa. O espao alocado pela funo malloc pode armazenar qualquer tipo de varivel.
Sintaxe:
malloc ( tamanho ) ;
Um ponto importante que esta sintaxe do tipo void, mas a funo malloc pode
alocar qualquer tipo de dado. Para isto, precisamos fazer com que um ponteiro, com tipo j
denido, receba o endereo. Deste modo, a sintaxe ca da seguinte maneira:
90
Sintaxe:
50
vezes o tamanho de
4.5.3.2
Funo free
Funo que libera o espao reservado pela funo malloc.
Sintaxe:
free ( nome_da_variavel ) ;
O nome da variavel deve ser o mesmo endereo retornado pela funo malloc.
Exemplo 52. Criar um programa que aloca memria para um vetor de tamanho
vamos alocar int
n.
Isto ,
vezes o
a[n].
do tipo int :
int main () {
printf ( " digite o tamanho do vetor :\ n " ) ;
scanf ( " % d " , & n ) ;
91
if ( a == NULL ) {
printf ( " Memoria insuficiente .\ n " ) ;
return 1;
}
Este vericador serve para vericar se deu certo a alocao de memria do nosso
vetor. Quando no d certo, a funo malloc retorna NULL. E, caso acontea isto, aparecer
uma mensagem na tela para o usurio ter conhecimento. bom manter a prtica de adicionar
este vericador nos programas que utilizam a funo malloc para previnir problemas futuros.
Exemplo 53. Criar um programa que calcule a norma innita de um vetor de tamanho n.
Lembrando:
kxk = m
ax{|xi | , i = 1, 2, ..., n}
Soluo: Para fazer este programa criaremos, na funo principal, um ponteiro
do tipo int, de tamanho
x,
funo malloc. Este ponteiro receber os valores do vetor que sero digitados pelo usurio.
Feito isto chamaremos a funo normainf, que ir igualar a varivel
valor de
ento
x[0],
norma,
|x[i]| = norma.
do tipo int, ao
ao cdigo:
92
93
4,
do vetor. Digitando
2, 4, 8
6,
temos que
kxk = 8.
1, 2, 3
8.
de um vetor de tamanho
n.
Lembrando:
kxk1 =
qX
|xi |, i = 1, ..., n
x, do
n digitado pelo usurio, que ter sua memria alocada utilizando a funo
Este ponteiro receber os valores do vetor que sero digitados pelo usurio.
Feito
isto chamaremos a funo norma1, que ir fazer o somatrio do mdulo de cada elemento do
vetor (ver exemplo
22),
3,
vetor. Digitando
4, 2
a mensagem A norma
3,
temos que
1, 2
do
Ento aparecer
3.00000.
de um vetor de tamanho
n.
Lembrando:
kxk2 =
qX
x2i , i = 1, ..., n
x,
funo malloc. Este ponteiro receber os valores do vetor que sero digitados pelo usurio.
Feito isto chamaremos a funo norma2, que ir fazer o somatrio de cada elemento do vetor
95
22),
3,
vetor. Digitando
3.74165.
1, 2 e 3 do
p
2
2
kxk2 = 3 + 1 + (2)= 9 + 1 + 4 = 14 =
3, 1
2,
temos que
3.74165.
n,
p(x),
de
n,
pol
aux,
do tipo oat,
O vetor
pol
ser
preenchido com os coecientes do polinmio digitados pelo usurio. Criaremos uma funo
chamada polinomio que preencher o vetor
aux(i) = pol(i) xi ,
isto , o valor de
somatrio do vetor
valor
elevado a
aux
i = 0, ..., n.
Ento faremos um
}
Ao ser executado, o programa ir solicitar que o usurio informe o grau do polinmio,
digitando
3,
(independente). Digitando
3, 2, 1
x, digitando 2 o programa far o seguinte clculo: p(2) = 4(2)3 +2(2)2 +1(2)1 +9(2)0 =
32 + 8 + 2 + 9 = 51.
x = 2.00000
eh:
51.00000.
4.6 ARQUIVOS
Muitas vezes o usurio de um programa precisa registrar os resultados obtidos. Para
atender esta necessidade possvel manipular arquivos utilizando cdigos de programao.
Trabalhar com arquivos em linguagem C consiste em trs itens que vamos abordar a
seguir:
Abrir um arquivo;
Fechar o arquivo;
Para declarar uma varivel do tipo arquivo, utilizamos o identicador de uxo FILE
*. A declarao do mesmo modo que fazemos com uma varivel do tipo ponteiro.
Sintaxe:
FILE * nome_da_variavel_do_tipo_arquivo ;
4.6.1
vrios modos de acesso a um arquivo (ver alguns na Tabela 4.2), estes indicam ao programa
o que ser feito com o arquivo que foi aberto.
Sintaxe:
99
Modo
Signicado
r+
w+
Abre o arquivo para escrita no nal. No apaga o contedo que j tem no arquivo.
a+
Se houver algum erro ao abrir um arquivo a funo retornar o valor NULL. Para
vericar se isto aconteceu comum inserir as seguintes linhas de cdigo aos programas:
Sintaxe:
fclose ( nome_da_variavel_associada_ao_arquivo ) ;
Exemplo 57. Criar um programa que utiliza abertura e fechamento de arquivos.
4.6.2
principais: fprintf e fscanf. Ambas funcionam de modo idntico s funes printf e scanf.
Sintaxe:
Exemplo 58. Criar um programa para axar o que foi aprendido at ento sobre manipulao
de arquivos. Para isto, criaremos um arquivo chamado notas.txt onde colocaremos os seguintes
registros:
Thomaz 7.5 9 8
Rubens 7 10 5.8
Joozinho 8.6 9 10
Maria 10 9.3 8
Camila 9 10 8.4
Ricardo 4 3.5 7
Francielle 8 7.2 2.9
Johnny 5 8.1 9.7
Laura 7.7 9.3 10
Nosso programa vai ler estes registros, que so as notas de trs provas dos alunos de
uma turma, e exibir na tela para o usurio o nome de cada aluno seguido de sua mdia de
notas. importante salienar que o arquivo precisa estar no mesmo local onde est o executvel
do programa criado. Vamos ao cdigo:
102
Captulo 5
RESOLVENDO UM PROBLEMA
DE VALOR DE CONTORNO (PVC)
UTILIZANDO O MTODO DAS
DIFERENAS FINITAS (MDF) E A
LINGUAGEM C
Faremos agora uma aplicao, onde criaremos um programa que aplicar parte do que
foi aprendido sobre a Linguagem C. Para isto, vamos primeiro abordar um pouco sobre o que
um PVC e tambm o MDF. Vale lembrar que o foco deste trabalho no se aprofundar
neste tema.
equaes diferenciais que satisfaz as condies de contorno, que podem ser lineares ou no
lineares.
Neste trabalho veremos a condio de contorno do tipo Robin, que dado por:
1 f (a) + 2 f 0 (a) = va ,
1
onde
va
o valor da combinao de
f (x)
f 0 (x)
no ponto
a,
com
dados.
O mtodo das diferenas nitas tem como princpio aproximar atravs de expres-
ses algbricas cada termo do modelo matemtico em cada n de uma malha que obtida ao
dividir o intervalo de domnio da funo incgnita em uma quantidade nita de
103
n subintervalos
[1].
h.
Vamos ento ver como aplicar o MDF em um PVC Linear seguindo os dois passos
listados acima:
u(a) + du (a) = v
1
2 dx
a
u(b) + du (b) = v
1
2 dx
h=
ba
n
xi = a + ih,
com
i = 0, ..., n.
Discretizao da equao: Vamos discretizar a primeira equao utilizando diferenas centrais para aproximar a primeira e segunda derivada de
u.
E as condies de
t(xi )
Colocando em evidncia
+ q(xi )
ui1 , ui
ui+1 ui1
2h
ui+1 obtemos:
[2t(xi ) hq(xi )] ui1 + [2hg(xi ) 4t(xi )] ui + [2t(xi ) + hq(xi )] ui+1 = 2hf (xi )
Para as condies de contorno:
104
1 u0 + 2
3u0 +4ui u2
2h
Colocando em evidncia
u0 =
un
= va
u0
1 u n + 2
un ,
= vb
obtemos:
2hva 42 u1 +2 u2
e
2h1 32
un =
u0
xi
Ax = r.
Onde as variveis so
ui ,
para
i = 1, ..., n 1.
b1 c 1
u1
r1
a2 b2 c2 0
u2 r2
0 a b
c3
0
u3 r3
3
3
0 0 a4 b 4
c4
. u4 = r4
.. .. .. . .
..
. .
..
..
. .
. . .
.
.
.
.
.
.
0 0 0 a
rn2
0
an1 bn1
un1
rn1
Onde,:
b1 = 2hr1 p1 (4 + 82 ) + 42 hq1 ;
bn1 = 2h2 rn1 pn1 (4 82 ) + 42 hqn1 ;
r1 = 2hf1 2hva (2p1 hq1 );
rn1 = 2hf1 2hvb (2pn1 hqn1 )
c1 = 2p1 ( + 2 ) + hq1 ( 2 );
an1 = 2pn1 ( 2 ) hqn1 ( + 2 );
Para
i = 2, ..., n 2:
bi = 2hri 4pi ;
ri = 2hfi ;
ci = 2pi + hqi ;
ai = 2pi hqi
sendo que:
= 2h1 32
= 2h1 + 32 .
Para resolver este sistema tridiagonal utilizaremos o Algortmo de Thomas [1], que
consiste em fatorar a matriz
da seguinte forma:
105
A = LU ,
onde:
L=
A2 B2
A3 B3
..
..
B1
0
0
.
.
.
.
.
.
A4 B4
.
.
.
..
An1 Bn1
An
.
.
.
Bn
e U =
1 C1
C2
C3
C4
.
.
.
.
.
.
.
.
.
..
..
.
.
.
Cn1
i , i
..
so
obtidos por:
c1
1
ci
i =
,
Bi
B1 = b1 . C1 =
A i = ai ,
Bi = bi Ai Ci1 ,
A n = rn ,
Ento o sistema
Ax = r
2in1
Bn = bn An Cn1
LU x = r.
Ly = r
Ux = y
que aps a soluo, temos a soluo do PVC.
5.2 Codicao
Vamos ento criar um cdigo em linguagem C, utilizando o procedimento que vimos
acima, para resolver o seguinte problema de valor de contorno:
u(x) = cos(x).
// ====================================================
// Cdigo para resolver o problema de valor de contorno :
// t ( x ) d2u / dx2 + q ( x ) du / dx + g ( x ) u = f ( x )
// Neste caso : t ( x ) = -1 , q ( x ) =0 , g ( x ) =1 , f ( x ) = 2 cos ( x )
// ====================================================
# include < stdio .h >
106
}
else if ( i == n -1) {
aux2 = 2* h * beta1 +3* beta2 ;
a [ i ] = 2* t [ i ]*( aux2 - beta2 ) -h * q [ i ]*( aux2 +
beta2 ) ;
b [ i ] = 2*( pow (h ,2) ) * g [ i ]*( aux2 ) -t [ i ]*(4*
aux2 -8* beta2 ) +4* beta2 * h * q [ i ];
r [ i ] = 2*( pow (h ,2) ) * f [ i ]* aux2 -2* h * vb *(2* t
[ i ] - h * q [ i ]) ;
}
else {
a [ i ] = 2* t [ i ] - h * q [ i ];
b [ i ] = 2*( pow (h ,2) ) * g [ i ] -4* t [ i ];
c [ i ] = 2* t [ i ] + h * q [ i ];
r [ i ] = 2*( pow (h ,2) ) * f [ i ];
}
}
}
// Funo que calcula as matrizes L e U :
void LU () {
int i ;
B [ 1 ] = b [ 1 ] ;
C [ 1 ] = c [ 1 ] / B [ 1 ] ;
for ( i = 2; i <= n - 2; i ++ ) {
A [ i ] = a [ i ] ;
B [ i ] = b [ i ] - ( A [ i ] * C [ i - 1 ] ) ;
C [ i ] = c [ i ] / B [ i ] ;
}
A [ n - 1 ] = a [ n - 1 ] ;
B [ n - 1 ] = b [ n - 1 ] - ( A [ n - 1 ] * C [ n - 2 ] )
;
}
// Funo que resolve o sistema linear triangular inferior Ls = r :
void Lsr () {
int i ;
s [ 1 ] = r [ 1 ] / B [ 1 ];
for ( i = 2; i <= n - 1; i ++ ) {
s [ i ] = ( r [ i ] - ( A [ i ] * s [ i - 1 ] ) )
/ B [ i ] ;
}
}
// Funo que resolve o sistema linear triangular superior Up = s :
void Ups () {
int i ;
p [ n - 1 ] = s [ n - 1 ];
108
for ( i = n - 2; i >= 1; i - -) {
p [ i ] = s [ i ] - ( C [ i ] * p [ i + 1 ] ) ;
}
}
// Funo que salva os resultados em um arquivo txt :
void salvar () {
int i ;
arquivo = fopen ( " resultado . txt " , " w " ) ;
fprintf ( arquivo , " Resultados :\ n \ n \ n " ) ;
fprintf ( arquivo , " x p [] uex [] \ n \ n " ) ;
for ( i = 1; i <= n -1; i ++) {
x = ax + i * h ;
uex [ i ] = cos ( x ) ;
fprintf ( arquivo , " % f % f % f \ n " , x , p [ i ] , uex [ i ]) ;
}
}
// Funo principal :
int main () {
int i ;
printf ( " Entre com o numero de divisoes no intervalo [a , b
]: \ n " ) ;
scanf ( " % d " ,& n ) ;
/* Vamos atribuir valores para algumas de nossas
variveis que sero constantes no nosso programa : */
va = 3.0;
vb = -4.0;
alfa1 = 3.0;
alfa2 = 1.0;
beta1 = 4.0;
beta2 = 1.0;
ax = 0;
bx = M_PI ;
// Calculando o tamanho do espaamento h :
h = ( bx - ax ) / n ;
// Colocando um ttulo para a janela :
system ( " title RESOLVENDO UM PVC UTILIZANDO MDF : " ) ;
// Alocando memria para os vetores utilizando a funo
malloc :
r = ( double *) malloc ( n * sizeof ( double ) ) ;
b = ( double *) malloc ( n * sizeof ( double ) ) ;
a = ( double *) malloc ( n * sizeof ( double ) ) ;
c = ( double *) malloc ( n * sizeof ( double ) ) ;
109
A =
B =
C =
s =
p =
uex
t =
q =
g =
f =
( double *) malloc ( n *
( double *) malloc ( n *
( double *) malloc ( n *
( double *) malloc ( n *
( double *) malloc ( n *
= ( double *) malloc ( n
( double *) malloc ( n *
( double *) malloc ( n *
( double *) malloc ( n *
( double *) malloc ( n *
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
* sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
* sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
sizeof ( double ) ) ;
free ( B ) ;
free ( C ) ;
free ( s ) ;
free ( p ) ;
free ( uex ) ;
free ( t ) ;
free ( q ) ;
free ( g ) ;
free ( f ) ;
return 0;
}
Ao executar o programa aparecer a mensagem Entre com o numero de divisoes no
intervalo
[a, b]:.
Digitando
20
com as solues aproximada e exata do problema. Com este arquivo possvel construir o
seguinte grco para comparao dos resultados:
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
0
0.5
1.5
2.5
111
Captulo 6
CONCLUSO
Ao nal deste trabalho conseguimos apresentar alguns conceitos da linguagem C que
servir para que um aluno de matemtica comece a criar seus programas. Construmos diversos
programas para axao, nos quais pudemos ver abordagens diferentes para resolver o mesmo
problema. Alm disso, vimos um pouco sobre problemas de valor de contorno, assim como o
mtodo das diferenas nitas para resoluo dos mesmos. Tambm criamos um cdigo para
resoluo de um PVC com condies de contorno do tipo Robin, onde pudemos axar boa
parte do contedo aprendido.
importante salienar que, embora no tenhamos passado por todo o contedo da
linguagem C, aps o estudo destes tpicos abordados possvel construir uma gama enorme
de programas, sendo que as dvidas que forem surgindo no processo podem ser facilmente
sanadas agora que o programador possui um bom conhecimento prvio.
112
Referncias Bibliogrcas
[1] vila, D. M. Aplicao do Mtodo das Diferenas Finitas na Soluo de Problemas de
Valor de Contorno. Universidade Federal de Uberlndia, 2013.
[2] Boyce, W. E., Diprima, R. C., Equaes Diferenciais Elementares e Problemas de Valores
de Contorno. LTC Editora.
[3] Damas, L., Linguagem C. 10 Edio, 2007.
[4] Kernighan, B. W., Ritchie D. M., The C Programming Language. 2 Edio. Prentice
Hall, 1988.
[5] Lawisch, A., Linguagem de Programao C . UERGS - Universidade Estadual do Rio
Grande do Sul. Novo Hamburgo, 2012.
[6] Maiali, A. C., Costa, O. L. V., Mtodo de Diferenas Finitas e de Monte Carlo em
Derivativos. Universidade de So Paulo.
[7] Singh, S. O ltimo teorema de Fermat. 10. ed. Rio de Janeiro: Record, 2004.
[8] Tabela
ASCII
Completa.
Disponvel
http://187.7.106.14/marcelo/org_comp/tabelaASCII.pdf>.
em:
Acesso
em:
<
19
nov.
2014.
[9] UFMG, Curso de Linguagem C, Universidade Federal de Minas Gerais.
[10] Viana, P. E., Mtodo de Newton. Universidade Federal de Minas Gerais. Belo Horizonte,
2006.
113