Documente Academic
Documente Profesional
Documente Cultură
Introduc
ao `
a Programac
ao em C
Curso de Extens
ao
Sum
ario
1 Introdu
c
ao `
a Programa
c
ao
1.1 Interpretacao do Arquivofonte
1.2 Computacao Cientfica . . . . .
1.3 Exerccios . . . . . . . . . . . .
1.4 Primeiro Programa em C . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2
2
3
4
5
2 Tipos e Operadores B
asicos
2.1 Tipos de Variaveis . . . . . . . . . .
2.1.1 Declaracao de Variaveis . . .
2.1.2 Variaveis Inteiras . . . . . . .
2.1.3 Variaveis de Caracteres . . . .
2.1.4 Variaveis de Ponto Flutuante
2.1.5 Variaveis Booleanas . . . . . .
2.2 Tipos de Operadores . . . . . . . . .
2.2.1 Operadores Aritmeticos . . .
2.2.2 Operadores Relacionais . . . .
2.2.3 Operadores Logicos . . . . . .
2.3 Exerccios . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
7
8
8
9
10
11
12
12
15
15
16
3 Fluxos de Controle
3.1 Condicionais . . . . . . . .
3.1.1 Comando ifelse if
3.1.2 Comando switch .
3.2 Lacos . . . . . . . . . . . .
3.2.1 Comando for . . .
3.2.2 Comando while . .
3.3 Exerccios . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
19
19
19
21
23
23
26
27
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4 Tipos Derivados
31
4.1 Entrada e Sada em Arquivo . . . . . . . . . . . . . . . . . . . 31
4.2 Arrays - Vetores e Matrizes . . . . . . . . . . . . . . . . . . . 35
SUMARIO
4.3
4.4
ii
Ponteiros e Referencia . . . . . . . . . . . . . . . . . . . . . . 37
Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5 Sub-rotinas
5.1 Funcoes . . . . . .
5.1.1 Declaracao e
5.1.2 Passagem de
5.2 Exerccios . . . . .
. . . . . . . . . . . .
Definicao de Funcao
Argumentos . . . .
. . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
42
42
42
43
47
Pref
acio
Atualmente em qualquer area de atuacao profissional, o computador se torna
uma ferramenta cada vez mais presente. Seja para montar um relatorio para
a empresa, estruturar uma apresentacao sobre suas atividades e progressos,
executar tarefas repetitivas de analise de dados em uma fabrica, entre muitas
outras funcoes. Mas o principal objetivo deste curso e mostrar os meios
de uso do computador como ferramenta cientfica para realizar calculos de
modo eficiente. Em outras palavras, como analisar um problema qualquer e
estruturar uma metodologia de solucao de forma que o computador entenda
o que o usuario quer, execute os comandos o mais rapido possvel e forneca
resultados confiaveis.
O objetivo desta apostila e apenas de colocar as informacoes basicas sobre
a linguagem de programacao C de modo a auxiliar o treinamento do aluno
durante o curso. Como alguns topicos serao colocados em sala de aula, eu
coloquei alguns codigos com espaco suficiente para que voces possam anotar
as discussoes. A descricao da linguagem nao depende do sistema operacional, seja Windows, Linux, DOS, MacOS, UNIX, desde que um compilador C
esteja instalado. Existem duas referencias sobre C que eu gostaria de passar
para voces. A primeira e o livro de Brian W. Kernighan e Dennis M. Ritchie
intitulado C A linguagem de programacao padrao ANSI. Estes autores
foram os desenvolvedores da linguagem C e apesar do livro possuir um bom
conte
udo, seus exemplos sao mais voltados para manipulacao de caracteres.
Ja o livro C++ and object-oriented numeric computing for scientists and
engineers de Daoqi Yang e uma referencia excelente para programacao cientfica. Apesar de ser um livro de C++, muitos fundamentos basicos de C
sao usados e vale (muito!!) a pena dar uma olhada nele.
Espero que gostem do curso,
Luiz Fernando L. R. Silva
PEQ/COPPE/UFRJ
21/07/2005
Captulo 1
Introdu
c
ao `
a Programa
c
ao
1.1
Interpreta
c
ao do Arquivofonte
1.2 Computac
ao Cientfica
1.2
Computac
ao Cientfica
Em qualquer aplicacao cientfica, a eficiencia computacional e muito importante e o programador deve sempre ficar atento a esse detalhe. Mas como
montar um programa de forma eficiente? Bem, antes de pensar em programacao propriamente dita devese estruturar muito bem qual e o problema
e qual a melhor forma de resolvelo. Se isso nao estiver bem assentado na
cabeca do programador, e melhor parar por a e comecar a ler o seu problema
novamente. Afinal de contas, como voce vai resolver o seu problema de forma
eficiente, se nem sabe ainda como resolvelo?
Dica de programac
ao do L.F.
Antes de pensar em programar, organize as ideias no papel. Mesmo
para os problemas mais simples. Sempre!! A princpio pode
parecer perda de tempo, mas a facilidade de estruturar o seu
codigo fonte ser
a recompensadora.
As etapas necessarias de solucionar o problema e o que vamos chamar de
metodologia de algoritmo e a forma como estas etapas sao executadas esta
includa na logica de programacao. Estas definicoes vao ficar mais claras ao
analisarmos um exemplo.
1.3 Exerccios
1.3
Exerccios
(1.2)
1.4
Primeiro Programa em C
Agora que ja vimos como montar os nossos problemas de uma forma estruturada, ja podemos ver um primeiro exemplo de programacao em C. Note
que ainda nao vimos nenhum comando desta linguagem e este exemplo ira
servir apenas como uma forma de comecarmos uma discussao em torno da
logica de programacao em C.
Um programa em C necessariamente deve conter a funcao main() que
contem as instrucoes (ou comandos) entre entre { e }. Cada comando pode
ser escrito em mais de uma linha e deve ser terminado por um ponto e
vrgula (; se nao tiver, vai dar erro na compilacao do programa). Os
comentarios no codigo fonte estao entre /* e */ (todo o texto entre esses dois
smbolos e desconsiderado pelo compilador) ou precedidos por // (a linha
toda fica comentada). Os comentarios podem conter varias informacoes sobre
o problema (qual o problema a ser resolvido, qual a metodologia que vai ser
utilizada, quem programou o codigo, quando, etc.), o codigo fonte (o porque
de usar um comando especfico) ou mesmo detalhes de como usar o programa
/* Este
e um simples programa para escrever na tela
uma mensagem de texto.
Programado por: Luiz Fernando L. R. Silva
*/
#include<stdio.h> // Biblioteca padr~
ao I/O em tela
main()
{
// Comando para escrever em tela.
printf("Eu adoro programar em C");
}
As tres primeiras linhas do codigo sao comentarios (estao entre /* e */) e
colocam algumas informacoes sobre o programa. Os outros comentarios desse
programa sao menores e sao precedidos por duas barras //. As bibliotecas em
C contem varios comandos e funcoes padroes para auxiliar na programacao.
Para habilitar esses comandos, e necessario declarar as bibliotecas no incio
do programa. A biblioteca padrao que contem os comandos de entrada e
sada de dados em tela chama-se <stdio.h> e esta declarada logo apos o
primeiro comentario. Essa declaracao habilita que o programador use todos
os comandos de entrada e sada padrao em tela. O comando printf efetua essa
operacao mostrando ao usuario a seguinte mensagem: Eu adoro programar
em C. Pronto, o nosso primeiro programa esta pronto.
Captulo 2
Tipos e Operadores B
asicos
2.1
Tipos de Vari
aveis
z =y+ix
(2.1)
if( i == 0 )
{ /* realiza os comandos aqui dentro */ }
1
Os identificadores s
ao as letras usadas para identificar as suas vari
aveis.
2.1.1
Declarac
ao de Vari
aveis
A declaracao das variaveis no codigo fonte indica que o programa deve reservar um espaco na memoria RAM para cada variavel declarada. Vamos
considerar que a memoria RAM esta distribuda como na Fig. 2.1.1 e dividida em bytes.
2.1.2
Vari
aveis Inteiras
#include<stdio.h>
main()
{
int i;
// Declara
c~
ao de i como inteira
E poss
vel declarar mais de uma
vari
avel por linha */
int ii = 123; // Ao declarar ii, j
a atribuo um valor.
i = 2;
// Atribui
c~
ao do valor 2 para a vari
avel i
j = i;
// Atribui
c~
ao do valor contido em i para j
k = 2.3; /* N~
ao considera a parte fracion
aria!
k assume o valor de 2 */
/* Sa
da em tela das vari
aveis*/
printf("O valor de i eh: %d \n",i);
printf("O valor de j e k sao: %d %d \n",j,k);
printf("%d mais %d igual a %d \n",1,2,1+2);
}
2.1.3
Vari
aveis de Caracteres
Fun
c
ao especfica
nova linha
tabulacao horizontal
tabulacao vertical
alerta sonoro
cursor volta para o incio da linha
backspace
10
main()
{
char ch1, ch2;
printf("Entre com 1 caracter: ");
/* le um caracter do console sem mostra-lo
ch1 = getch();
*/
2.1.4
Vari
aveis de Ponto Flutuante
11
#include<stdio.h>
#include<math.h>
int main()
{
float pi_float;
double pi_double;
pi_float = acos(-1.);
pi_double= acos(-1.);
printf("Valor com precisao simples: %21.19f\n", pi_float);
printf("Valor com precisao dupla : %21.19f\n", pi_double);
return(1);
}
Compilando e executando o codigo acima em um AthlonXP 2.2GHz, os
resultados para estao colocados abaixo.
2.1.5
Vari
aveis Booleanas
12
// declara
c~
ao de flag como booleana
/* Algum c
odigo no meio do caminho, que pode
eventualmente mudar o valor de flag */
d = 3.14;
if(flag == false)
{ d = 2.718; }
/* E o programa continua... */
Algumas comparacoes estao descritas na tabela abaixo.
true && true = true
true && false = false
false && true = false
false && false = false
2.2
Tipos de Operadores
Pronto, ja sabemos quais sao os tipos de variaveis que existem e agora estamos aptos a realizar operacoes com elas.
2.2.1
Operadores Aritm
eticos
13
double m = 13/4;
/*
e uma opera
c~
ao entre dois inteiros, e vai
fornecer um resultado inteiro!!
m = 3, as casas decimais s~
ao ignoradas */
double n = 3/4;
/* n = 0 */
double y = 3.0/4; /* Ao operar, o inteiro 4
e convertido para
double! y = 0.75 */
double y = 3/4.0; /* Idem, 3
e convertido em 3.0! y = 0.75 */
As operacoes matematicas sao iniciadas da esquerda para a direita. A
multiplicacao e a divisao possuem uma maior precedencia em relacao `a soma
e subtracao. Contudo, o que esta contido nos parenteses possue uma precedencia maior que a dos operadores. Vejamos as etapas de execucao das
expressoes colocadas no exemplo abaixo.
int m;
m = 1 + 2 + 3*4;
/* m = 1 + 2 + 12;
m = 3 + 12;
m = 15; */
m = 1 + (2 + 3)*4;
/* m = 1 + (5)*4;
m = 1 + 20;
m = 21; */
m = 5 + 10 + 15/3;
/* m = 5 + 10 + 5;
m = 15 + 5;
m = 20; */
m = (5+10+15)/3;
/* m = (15 + 15)/3;
m = 30/3;
m = 10; */
Dica de programac
ao do L.F.
Sempre que voce tiver d
uvidas sobre a ordem das operacoes, use
o parenteses sem medo de ser feliz.
int m;
m = ((5+3)*2) - 3;
/* m = (8*2) - 3;
14
m = 16 - 3;
m = 13; */
Os operadores de incremento (++) e decremento () sao muito usados
em qualquer programa C, pois facilitam a leitura do codigo (alguns dizem
quem nao...).
int conta = 0;
int m = 2;
conta++; /* Essa opera
c~
ao pode
conta = conta + 1;
conta--; /* Essa opera
c~
ao pode
conta = conta - 1;
++m;
/* m = 3; */
m = conta++; /* m = 0; conta =
ser substitu
da por:
(conta = 1) */
ser substitu
da por:
(conta = 0) */
1;*/
2.2.2
15
Operadores Relacionais
Os operadores relacionais sao > (maior que), < (menor que), >= (maior ou
igual a), <= (menor ou igual a), == (igual a) e ! = (nao igual). A notacao ! e
o operador de negacao. O resultado destas operacoes e sempre um booleano.
int x = 5;
bool b, c;
b = (x < 6);
c = (x == 0);
if(b != c)
x = 17;
if(b)
x = 19;
if(!b)
x = 221;
// b = true, j
a que x
e menor que 6
// b = false, j
a que x n~
ao
e 0
// Se b n~
ao
e igual a c, x = 17
// Se b
e true, ent~
ao fa
ca x = 19
// Se b
e false, ent~
ao fa
ca x = 221
Deve-se tomar muito cuidado ao usar essas operacoes. Considere o exemplo abaixo.
int m =
bool b,
b = 3 <
m = 20;
c = 3 <
7;
c;
m < 9; // b = true
m < 9; // c = true
2.2.3
Operadores L
ogicos
Os operadores logicos, assim como os relacionais, resultam em um valor booleano. Esses operadores sao && (e) e || (ou) e posuem uma precedencia
2.3 Exerccios
16
bool
bool
bool
bool
bool
bool
b
d
e
f
g
h
=true, c = false;
= b && c;
= b || c;
= (e == false) && c;
= (d == true ) || c;
= (d = true ) || c;
//
//
//
//
//
d
e
f
g
h
=
=
=
=
=
false
true
false
false
true
Vamos agora rever a expressao 3 < m < 9. A maneira correta de programar esta expressao em C seria
2.3
Exerccios
b = 2.
c = 5.
d = 4.
e = 10.
saida = a*b+c*d+e/pow(f,g)
2.
3.
saida = a*(b+c)*(d+e)/pow(f,g)
f = 2.
g = 3.
2.3 Exerccios
17
/*C
alculo da m
edia dos alunos*/
#include <stdio.h>
int main()
{
double M,P1,P2;
// Entrada de dados pelo c
odigo
P1 = 5.0;
P2 = 7.5;
/* Entrada de dados em tela
printf("Digite o valor da primeira prova P1\n");
printf("Digite o valor da segunda prova P2\n");
scanf("%16le",&P1);
scanf("%16le",&P2);
*/
// C
alculo da m
edia
// C
alculo direto
M=(P1+P2)/2.;
// C
alculo em duas etapas
//M = P1 + P2;
//M /= 2;
if(M >= 7.) { printf("O aluno esta aprovado\n"); }
else { printf("O aluno devera fazer prova final\n"); }
printf("A media do aluno e: %.2f\n",M);
return(1);
}
v = 2gh, onde g = 9.81. Faca um outro programa em que seja possvel que
o usuario entre na tela com o valor da altura (cuidado, porque ate onde eu
2.3 Exerccios
18
T (K) =
5.
[T (F ) 32.0] + 273.15
9.
(2.2)
cosh(x) =
ex + ex
2.
(2.3)
Captulo 3
Fluxos de Controle
3.1
3.1.1
Condicionais
Comando ifelse if
// Qdo n>10, fa
ca x*=10
// Qdo n
e 5, fa
ca x*=5
// Qdo n!=0,
fa
ca y*=7
3.1 Condicionais
20
if(condi
c~
ao)
express~
ao1
else
express~
ao2
onde, se a condicao for avaliada como true, a expressao1 e executada
enquanto a expressao2 e desprezada. Se a condicao retornar um valor false,
a expressao1 e desprezada e a expressao2 e executada. Ainda e possvel
combinar os condicionais ifelse da seguinte maneira:
if(condi
c~
ao1)
express~
ao1
else if(condi
c~
ao2)
express~
ao2
else if(condi
c~
ao3)
express~
ao3
else
express~
ao4
onde a expressao1 e executada so e somente so se a condicao1 for true.
Se for true, todo o resto do bloco e ignorado; e se for false a expressao1 nao
e executada e a condicao2 e testada. Se a u
ltima for true, a expressao2 e
3.1 Condicionais
21
// Usu
ario entra com T (em K)
printf("Entre com a temperatura da agua (K)");
scanf("%16le",&T);
printf("\n");
if(T
{ //
//
}
else
{ //
//
}
else
{ //
//
}
<= 273.15)
Gelo!
Calcula par^
ametros para gelo
if((T >= 273.15) && (T <= 373.15))
L
quido!
Calcula par^
ametros para
agua l
quida
S
o sobrou o vapor (fora o plasma!!)
Calcula par^
ametros para vapor d
agua
3.1.2
Comando switch
3.1 Condicionais
22
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#include<stdlib.h>
int main()
{
char letra;
// Tem q declarar os par^
ametros dos modelos, n
e?
// Se n~
ao j
a era!!!!
printf("Lista de opcoes para calcular o coeficiente ");
printf("de transferencia de calor:\n");
printf("A - Modelo para Conveccao Interna em tubos\n");
printf("B - Modelo para Conveccao Externa\n");
printf("C - Modelo para Conveccao Natural\n");
printf("D - Modelo para Conveccao com condensacao\n");
printf("Entre com sua opcao : ");
letra = getch();
// Transforma letra min
uscula em mai
uscula
letra = toupper(letra);
printf("\n");
// Vamos escolher qual modelo? Depende do q o usu
ario quer...
switch (letra)
{
case A:
// Escreve aqui como calcula o h para conv. interna
// Comandos
printf("Fingi que calculei h por A.\n");
break;
case B:
// Escreve aqui como calcula o h para conv. externa
// Comandos
3.2 La
cos
23
3.2
3.2.1
La
cos
Comando for
for(inicia;condi
c~
ao;express~
ao)
comandos
3.2 La
cos
24
int i;
for(i=3;i<50;i*=2)
{ printf("%d\n",i); }
O exemplo ira retornar na tela os inteiros 3, 6, 12, 24 e 48. O valor inicial
e 3. Como a condicao i < 50 e true, 3 aparece na tela. Entao, a expressao
i = 2 fornece o segundo valor de i que e 6. Como i < 50 ainda e true, 6
tambem e retornado na tela. Este processo e repetido ate que i = 2 forneca
96, one i < 50 e false.
O que acontece no exemplo abaixo?
int i;
for(i=3;i>5;i*=2)
{ printf("%d\n",i); }
Nada!! A condicao nao e satisfeita quando i = 3 e portanto o laco nao e
executado, muito menos a expressao i = 2.
O comando break pode ser usado para terminar a execucao do laco, e o
continue para a execucao da iteracao atual e passa para a proxima. Para
deixar mais claro, vamos ver o exemplo.
int i;
for(i=3;i<50;i*=2)
{ if(i == 6) continue;
printf("%d\n",i);
if(i == 24) break;
}
// Passa para a pr
oxima itera
c~
ao
// P
ara a execu
c~
ao do la
co qdo i
e 24
3.2 La
cos
25
i=0 j=200
(i j)
(3.1)
(i + j 2 )
(3.2)
e
int i,j;
long double b = 5.;
for(i=1;i<5;i++)
for(j=27;j>=-3;j--)
b*=i+j*j;
computa a seguinte equacao (Putz!)
5
27
4 Y
Y
i=1 j=3
3.2 La
cos
26
Dica de programac
ao do L.F.
Facam a programacao de Chines. Ao montarem um laco, executem cada comando no papel e vejam se os resultados est
ao
chegando ao que voce tinha em mente. Mas execute cada comando mesmo! Voces vao exercitar a vis
ao de programacao e
fica mais difcil de deixar o programa com erros (pelo menos
nessa parte que voce fez o chinezinho).
3.2.2
Comando while
while(condi
c~
ao)
comandos
Os comandos sao executados ate que a condicao seja avaliada em false.
Se o valor inicial da condicao for falso, os comandos nunca serao executados.
Por exemplo,
int i = 0;
while(i<=100)
{
printf("%d",i++);
}
O comando entre as chaves sera executado ate que i <= 100 nao seja
mais true. O laco seguinte nao ira retornar para a tela nenhum valor ja que
sua condicao inicial e false.
int i = 10;
while(i>100) {
printf("Ainda bem que isso nao vai ser executado!! ");
printf("Eu ia escrever um monte de besteiras aqui!!\n");
printf("%d",i++); }
3.3 Exerccios
27
do
comandos
while(condi
c~
ao)
A execucao dos comandos e continuada ate que a condicao seja avaliada como false. Neste caso, os comandos serao executados pelo menos uma
vez. Os comandos continue e break tambem podem ser usados dentro dos
comandos while e do-while.
3.3
Exerccios
i=0 j=5
cos(i2 +
j)
(3.3)
3.3 Exerccios
28
y(x) = ln(
1
)
1x
(3.4)
para qualquer valor de x pre-especificado pelo usuario, onde ln e o logaritmo natural ( logaritmo na base e). Escreva o programa com um laco while
de forma que o programa repita o calculo para cada valor legal de x aplicado
ao programa. Quando um valor ilegal de x for avaliado, termine o programa.
3t + 5,
y(t) =
3t + 5,
t0
(3.5)
t>0
Snum =
N
X
1
n=1
Sana =
n2
2
6
(3.6)
3.3 Exerccios
29
valores de x que facam com que f (x) = 0. Como estamos em um computador e trabalhando com variaveis de ponto flutuante, deve-se assumir que o
objetivo de x foi atingido quando f (x) e menor que um erro pre-definido. O
metodo de Newton-Raphson e colocado abaixo.
xk+1 = xk
f (x)
,
f (x)
(3.7)
#include<math.h>
#include<stdlib.h>
int main()
{
double x, xk, f, df, erro;
int i;
// Fun
c~
ao f(x) = exp(x) + sen(x)
xk=10.;
// Chute inicial
x = 0.;
// Tem q inicializar a vari
avel
erro = 1.e-5; // Erro do m
etodo
// Loop de converg^
encia
i = 1; // 1a Itera
c~
ao
printf("It \t X\n");
while(fabs(xk - x) > erro)
{
x = xk;
// Atualiza a vari
avel
f = exp(x) + sin(x); // Calcula fun
c~
ao
df= exp(x) + cos(x); // Calcula a derivada da fun
c~
ao
xk= x - f/df;
// M
etodo de Newton-Raphson
printf("%d \t %g\n", i,xk);
i++;
}
printf("\n Valor convergido!\n");
printf(" x = %g \n", xk);
3.3 Exerccios
return (0);
}
30
Captulo 4
Tipos Derivados
4.1
32
33
FILE *fp;
char ch;
fp = fopen("texto.txt","w");
while( (ch = getche()) != 13)
putc(ch, fp);
fclose(fp);
}
Apos usar o arquivo, o comando fclose fecha o arquivo. Os comandos
fprintf e fscanf() podem ser usados da mesma forma que os comandos para
tela, contudo e necessario indicar o F ILE nos comandos.
#include<stdio.h>
int main()
{
FILE *arq;
arq = fopen("nome.txt", "w");
fprintf(arq,"Consegui escrever\n");
fclose(arq);
return(0);
}
O exemplo a seguir cria um banco de dados de nome (char), idade (int) e
altura (float) em arquivo definido pelo usuario. A entrada no banco de dados
e finalizada quando o nome contiver nenhum ou apenas 1 caractere.
#include
#include
#include
#include
<stdlib.h>
<stdio.h>
<conio.h>
<string.h>
int main()
{
34
FILE *fp;
char nomearq[40], nome[40];
int idade;
float altura;
/* Le o nome do arquivo na telea: */
printf("Entre o nome do arquivo: ");
gets(nomearq);
/* Abre o arquivo: */
fp = fopen(nomearq,"w");
/* Le os dados na tela e grava no arquivo: */
do
{
printf("Entre o nome, idade e altura: ");
scanf("%s %d %f", nome, &idade, &altura);
fprintf(fp, "%20s %5d %5.2f\n", nome, idade, altura);
} while(strlen(nome) > 1);
/* Fecha o arquivo: */
fclose(fp);
return(0);
}
O exemplo a seguir le os dados de nome (char), idade (int) e altura (float)
que estao dentro de um arquivo definido pelo usuario e mostra na tela seus
valores ate o final do arquivo (EOF end of file).
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{
FILE *fp;
char nomearq[40], nome[40];
int
idade;
float altura;
35
4.2
int st[30];
36
vec[0] = 1.0;
vec[2] = 2.0;
for(i=0;i<30;i++) st[i]=i*i+7;
j = st[29];
Os elementos dos arrays sao manipulados como se fossem variaveis escalares e, portanto, todas as operacoes que vimos ate agora tambem se aplicam
aos arrays. Uma array bidimensional (matriz) com n linhas e m colunas pode
ser definido como T [n][m]. Os ndices das linhas vao de 0 a n 1 e os das
colunas vao de 0 a m 1. Por exemplo,
int i,j;
double mt[2][5];
mt[0][0] = 5.0;
mt[1][4] = 5.0;
for(i=0;i<2;i++)
{ for(j=0;j<5;j++)
{ mt[i][j] = i + j; }
}
Um laco acoplado e muito usado para acessar todos os elementos de uma
matriz. Um array bidimensional pode ser visto como um array unidimensional de arrays unidimensionais. Por exemplo, mt pode ser visto como se
possusse apenas 2 elementos: mt[0] e mt[1], onde mt[0] e um array unidimensional de 5 elementos que representa a primeira linha de mt, e mt[1]
tambem e um array unidimensional de 5 elementos, mas que representa a
segunda linha de mt. A Fig. 4.2 mostra como um array bidimensional e
alocado na memoria.
37
Arrays com tres ou mais dimensoes podem ser usados de forma similar.
Um array com k dimensoes declarado como a[s1 ][s2 ] . . . [sk ] ira alocar espaco
para s1 s2 . . . sk elementos que sao alocados contiguamente na memoria
linha por linha
Os arrays podem ser inicializados ao serem declarados.
// Array de caracteres
int v[4];
v = {2, 4, 5, 9}; // Erro!! N~
ao d
a para ser assim.
/* A forma correta seria
v[0] = 2;
v[1] = 4;
v[2] = 5;
v[3] = 9; */
Sera que e possvel inicializar uma matriz do seguinte modo??
4.3
Ponteiros e Refer
encia
4.4 Exerccios
int *p;
38
// p
e um ponteiro de um inteiro
//
//
//
//
//
//
i
e int, valor do objeto i
e 5.
(a)
p
e um ponteiro de um inteiro
(b)
e atribui o endere
co de i a pi
valor da vari
avel apontada por pi (c)
e atribu
do a j, j = 5;
Ilegal!!
(a)
(b)
p = &d2;
double b = *p;
(c)
*p = 5.5;
double c = *p;
double d = d2;
(d)
4.4
Exerccios
4.4 Exerccios
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define
20
int main()
{
double Tc[n+1], Tf[n+1];
double Tci, Tfi;
double dT;
int i;
//Intervalo de 0 a 100oC
dT = (100. - 0.)/(double)n;
// C
alculo das Temperaturas em Celsius
Tc[0] = 0.;
for(i=1;i<=n;i++)
Tc[i] = Tc[i-1] + dT;
// C
alculo das Temperaturas em Farenheit
printf("TC \t TF\n");
for(i=0;i<=n;i++)
{
Tf[i] = 9.*Tc[i]/5. + 32.;
printf("%.5g \t %.5g\n", Tc[i], Tf[i]);
}
// Entrando com a temperatura a ser interpolada
printf("\n Entre com a temperatura em C : ");
scanf("%le",&Tci);
// Testando limites da tabela
if((Tci < Tc[0]) || (Tci > Tc[n]))
{ printf("Oooopss... Temperatura fora da faixa.\n");
exit(1);
}
// Interpolando a temperatura
for(i=0;i<=n;i++)
39
4.4 Exerccios
40
{
if(Tci <= Tc[i])
{
/*Interpola
c~
ao*/
Tfi = Tf[i-1] + (Tci-Tc[i-1])*(Tf[i]-Tf[i-1])
/(Tc[i]-Tc[i-1]);
break;
}
}
// Sa
da em tela
printf("\n Temperatura em F interpolada : %.7f", Tfi);
Tfi = 9.*Tci/5.+32.;
printf("\n Temperatura em F calculada : %.7f \n", Tfi);
return(0);
}
#include<stdio.h>
#define SQ(x) ((x) * (x))
int main()
{
double x, y;
// faz as opera
c~
oes usando SQ
return(0);
}
Sera que tem diferenca se eu programar SQ como colocado na sequencia?
#define
SQ(x) (x * x)
4.4 Exerccios
41
III Existe a seguinte tabela de relacao entre T / e D,AB e deseja-se interpolar os valores de D,AB ao entrar com T /. Escreva um algoritmo
para a interpolacao para D,AB , sem esquecer de verificar a validade do valor
fornecido em tela pelo usuario.
T / D,AB
0.30 2.662
0.35 2.476
0.40 2.318
0.45 2.184
0.50 2.066
0.55 1.966
0.60 1.877
0.65 1.798
0.70 1.729
0.75 1.667
0.80 1.612
0.85 1.562
0.90 1.517
0.95 1.476
1.00 1.439
IV Calcule o tempo necessario para calcular a multiplicacao de duas matrizes quadradas (nn), como ilustrado no codigo abaixo, onde n = 100, 200, 300,
. . . , 1900, 2000. Gere as matrizes de forma randomica (valores entre 0 e 1).
Grave um arquivo guardando o tamanho n da matriz e o tempo necessario
para efetuar o calculo (procure na internet a biblioteca necessaria para marcar o tempo em C). Faca dois testes de multiplicacao, trocando a ordem dos
lacos ij por ji. Faca um grafico com os valores de tempo e tamanho de
matriz para as duas situacoes. O que acontece e porque?
for(k=0;k<n;k++)
{ for(i=0;i<n;i++)
{ for(j=0;j<n;j++)
{ C[i,j] += A[i,k]*B[k,j]; }
}
}
Captulo 5
Sub-rotinas
5.1
5.1.1
Fun
c
oes
Declarac
ao e Definic
ao de Func
ao
//
//
//
//
5.1 Fun
c
oes
h(int);
43
5.1.2
Passagem de Argumentos
5.1 Fun
c
oes
44
int pass_val(int x)
{
x = x*x;
return(x + 5);
}
int i = 5, j;
j = pass_val(i);
// i = 5, j = 30
Na chamada da funcao j = pass val(i), o valor do argumento i, que e
5, e passado ao parametro x. A funcao pass val() e iniciada com x = 5,
executa seu bloco de instrucoes e retorna o valor 30 para j. Entao, apos a
execucao da funcao, i = 5 e j = 30.
Na passagem por referencia, o argumento deve ser uma variavel com um
endereco na memoria e o argumento e passado para a funcao como uma
referencia, de forma que o parametro se torne apenas um apelido do argumento e as mudancas ocorridas no parametro cocrrem no argumento tambem.
int pass_val(int& x)
{
x = x*x;
return(x + 5);
}
int i = 5, j;
j = pass_val(i);
// i = 25, j = 30
Na chamada de j = pass val(i), o argumento i e passado como uma
referencia ao parametro x. Ou seja, as duas variaveis se referem ao mesmo
espaco da memoria. Entao qualquer mudanca realizada em x dentro da
funcao, ira afetar i. No caso acima, x e alterado dentro da funcao e assume
valor de 25. Entao, apos a execucao da funcao, i = 25 e j = 30.
Passagem para ponteiros possuem o mesmo efeito de uma passagem por
referencia, ja que os dois ponteiros apontam para o mesmo local. Veja o
exemplo de tres variacoes da funcao swap().
5.1 Fun
c
oes
45
5.1 Fun
c
oes
46
O nome de um array e um ponteiro const que aponta para o seu primeiro elemento. Entao, os argumentos em forma de array sao tratados como
ponteiros e possuem o mesmo efeito de uma passagem por referencia.
int square(int& i)
{ i*=i; } // Erro!! Um valor precisa ser retornado!
5.2 Exerccios
5.2
47
Exerccios
#include<stdio.h>
// Prototypes
int swap(int* p, int q, double x, double* y)
{
int i; /* Vc pode definir vari
aveis na sua
rotina q j
a foram definidas em main */
double f;
*p = 25; // Valor foi atualizado fora da subrotina
for(i=0;i<q;i++)
{ printf("%g - ", y[i]); y[i] = 0.; }
printf("\n");
f = x;
return(0);
}
int main()
{
int i,j;
double z, v[5]= {0., 1.25, 2.55, 3.5, 4.};
i
j
z
//
=
=
=
v
2;
5;
2.5;
= {0., 1.25, 2.55, 3.5, 4.};
swap(&i, j, z, v);
printf("%d - %d - %g\n", i, j, z);
for(i=0;i<5;i++) { printf("%g - ", v[i]); }
printf("\n");
return(0);
5.2 Exerccios
48
xn+1 =
1
2
xn +
b
xn
n = 0, 1, 2, . . .
5.2 Exerccios
49
Inicializa u = an
for(i = n 1, n 2, . . . , 0)
u ux + ai ;
Construa uma outra funcao para calcular o polinomio usando o algoritmo de Horner.
c. Compare os resultados fornecidos pelas duas funcoes.