Professional Documents
Culture Documents
Introdução à Programação em C
Curso de Extensão
1 Introdução à Programação 2
1.1 Interpretação do Arquivo–fonte . . . . . . . . . . . . . . . . . 2
1.2 Computação Cientı́fica . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Primeiro Programa em C . . . . . . . . . . . . . . . . . . . . . 5
3 Fluxos de Controle 19
3.1 Condicionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.1.1 Comando if–else if . . . . . . . . . . . . . . . . . . . . 19
3.1.2 Comando switch . . . . . . . . . . . . . . . . . . . . . 21
3.2 Laços . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.2.1 Comando for . . . . . . . . . . . . . . . . . . . . . . . 23
3.2.2 Comando while . . . . . . . . . . . . . . . . . . . . . . 26
3.3 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4 Tipos Derivados 31
4.1 Entrada e Saı́da em Arquivo . . . . . . . . . . . . . . . . . . . 31
4.2 Arrays - Vetores e Matrizes . . . . . . . . . . . . . . . . . . . 35
SUMÁRIO ii
5 Sub-rotinas 42
5.1 Funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.1.1 Declaração e Definição de Função . . . . . . . . . . . . 42
5.1.2 Passagem de Argumentos . . . . . . . . . . . . . . . . 43
5.2 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Prefácio
Introdução à Programação
Quais são as perguntas que sempre devemos fazer para estruturar a me-
todologia do algoritmo?
• Calculamos S.
1.3 Exercı́cios
Q = UA(Tr − T∞ ) (1.2)
Agora que já vimos como montar os nossos problemas de uma forma estru-
turada, já podemos ver um primeiro exemplo de programação em C. Note
que ainda não vimos nenhum comando desta linguagem e este exemplo irá
servir apenas como uma forma de começarmos uma discussão em torno da
lógica de programação em C.
main()
{
// Comando para escrever em tela.
printf("Eu adoro programar em C");
}
z =y+i∗x (2.1)
if( i == 0 )
{ /* realiza os comandos aqui dentro */ }
1
Os identificadores são as letras usadas para identificar as suas variáveis.
2.1 Tipos de Variáveis 8
A declaração das variáveis no código fonte indica que o programa deve re-
servar um espaço na memória RAM para cada variável declarada. Vamos
considerar que a memória RAM está distribuı́da como na Fig. 2.1.1 e divi-
dida em bytes.
#include<stdio.h>
main()
{
int i; // Declaraç~
ao de i como inteira
2.1 Tipos de Variáveis 9
i = 2; // Atribuiç~
ao do valor 2 para a variável i
j = i; // Atribuiç~
ao do valor contido em i para j
k = 2.3; /* N~
ao considera a parte fracionária!
k assume o valor de 2 */
#include <stdio.h>
#include <conio.h>
2.1 Tipos de Variáveis 10
main()
{
char ch1, ch2;
printf("\n");
}
#include<stdio.h>
#include<math.h>
int main()
{
float pi_float;
double pi_double;
pi_float = acos(-1.);
pi_double= acos(-1.);
d = 3.14;
if(flag == false)
{ d = 2.718; }
/* E o programa continua... */
Por definição, false tem o valor 0 e true tem valor 1. Por isso, pessoal-
mente, eu não uso variáveis booleanas, mas um inteiro com valor de 0 (falso)
ou 1 (verdadeiro).
Pronto, já sabemos quais são os tipos de variáveis que existem e agora esta-
mos aptos a realizar operações com elas.
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; */
int m;
m = ((5+3)*2) - 3; /* m = (8*2) - 3;
2.2 Tipos de Operadores 14
m = 16 - 3;
m = 13; */
int conta = 0;
int m = 2;
conta++; /* Essa operaç~ao pode ser substituı́da por:
conta = conta + 1; (conta = 1) */
conta--; /* Essa operaç~ao pode ser substituı́da por:
conta = conta - 1; (conta = 0) */
++m; /* m = 3; */
m = conta++; /* m = 0; conta = 1;*/
#include<stdio.h>
int main()
{
int valor = 1;
Os operadores relacionais são > (maior que), < (menor que), >= (maior ou
igual a), <= (menor ou igual a), == (igual a) e ! = (não igual). A notação ! é
o operador de negação. O resultado destas operações é sempre um booleano.
int x = 5;
bool b, c;
b = (x < 6); // b = true, já que x é menor que 6
c = (x == 0); // b = false, já que x n~ao é 0
if(b != c) // Se b n~
ao é igual a c, x = 17
x = 17;
if(b) // Se b é true, ent~
ao faça x = 19
x = 19;
if(!b) // Se b é false, ent~
ao faça x = 221
x = 221;
int m = 7;
bool b, c;
b = 3 < m < 9; // b = true
m = 20;
c = 3 < m < 9; // c = true
Como o operador < possue uma precedência maior que o operador &&,
os dois pares de parênteses poderiam ser omitidos.
2.3 Exercı́cios
a = 3. b = 2. c = 5. d = 4. e = 10. f = 2. g = 3.
1. saida = a*b+c*d+e/pow(f,g)
3. saida = a*(b+c)*(d+e)/pow(f,g)
2.3 Exercı́cios 17
int main()
{
double M,P1,P2;
// Entrada de dados pelo código
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álculo da média
// Cálculo direto
M=(P1+P2)/2.;
// Cálculo em duas etapas
//M = P1 + P2;
//M /= 2;
return(1);
}
5.
T (K) = [T (F ) − 32.0] + 273.15 (2.2)
9.
ex + e−x
!
cosh(x) = (2.3)
2.
Fluxos de Controle
3.1 Condicionais
if(condiç~
ao) express~
ao
onde condição é uma expressão lógica que possui valor de true ou false, e
expressão pode ser apenas um ou vários comandos. A expressão é executada
quando o valor de condição é avaliado em true, senão a expressão não é
executada. A condição deve estar entre parênteses.
if(condiç~
ao)
express~ao1
else
express~ao2
if(condiç~
ao1)
express~ao1
else if(condiç~
ao2)
express~ao2
else if(condiç~
ao3)
express~ao3
else
express~ao4
#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é?
// Se n~
ao já era!!!!
3.2 Laços
for(inicia;condiç~
ao;express~
ao)
comandos
3.2 Laços 24
int i;
for(i=3;i<50;i*=2)
{ printf("%d\n",i); }
int i;
for(i=3;i>5;i*=2)
{ printf("%d\n",i); }
int i;
for(i=3;i<50;i*=2)
{ if(i == 6) continue; // Passa para a próxima iteraç~
ao
printf("%d\n",i);
if(i == 24) break; // Pára a execuç~
ao do laço qdo i é 24
}
3.2 Laços 25
Um laço pode ser acoplado como qualquer outra expressão. Por exemplo,
int i,j;
double a = 0.;
for(i=0;i<100;i++)
{ for(j=200;j<=500;j++)
a+=i-j; // int s~ao convertidos para double
}
int i,j;
long double b = 5.;
for(i=1;i<5;i++)
for(j=27;j>=-3;j--)
b*=i+j*j;
while(condiç~
ao)
comandos
int i = 0;
while(i<=100)
{
printf("%d",i++);
}
O comando entre as chaves será executado até que i <= 100 não seja
mais true. O laço seguinte não irá retornar para a tela nenhum valor já que
sua condição inicial é 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 Exercı́cios 27
do
comandos
while(condiç~
ao)
3.3 Exercı́cios
100 X
X 300 q
cos(i2 + j) (3.3)
i=0 j=5
3.3 Exercı́cios 28
1
y(x) = ln( ) (3.4)
1−x
−3t2 + 5, t≥0
y(t) = (3.5)
3t2 + 5, t>0
N
X 1
Snum =
n=1 n
2
π2
Sana = (3.6)
6
f (x)
xk+1 = xk − , até que |xk+1 − xk | < erro (3.7)
f ′ (x)
#include<math.h>
#include<stdlib.h>
int main()
{
double x, xk, f, df, erro;
int i;
// Funç~
ao f(x) = exp(x) + sen(x)
xk=10.; // Chute inicial
x = 0.; // Tem q inicializar a variável
erro = 1.e-5; // Erro do método
// Loop de converg^encia
i = 1; // 1a Iteraç~
ao
printf("It \t X\n");
while(fabs(xk - x) > erro)
{
x = xk; // Atualiza a variável
f = exp(x) + sin(x); // Calcula funç~ ao
df= exp(x) + cos(x); // Calcula a derivada da funç~ao
xk= x - f/df; // Método de Newton-Raphson
printf("%d \t %g\n", i,xk);
i++;
}
printf("\n Valor convergido!\n");
printf(" x = %g \n", xk);
3.3 Exercı́cios 30
return (0);
}
Capı́tulo 4
Tipos Derivados
int i,j,k;
FILE *stream;
stream = fopen("NomeArquivo","Regra");
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
main()
{
4.1 Entrada e Saı́da em Arquivo 33
FILE *fp;
char ch;
fp = fopen("texto.txt","w");
fclose(fp);
}
#include<stdio.h>
int main()
{
FILE *arq;
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{
4.1 Entrada e Saı́da em Arquivo 34
FILE *fp;
char nomearq[40], nome[40];
int idade;
float altura;
/* Abre o arquivo: */
fp = fopen(nomearq,"w");
/* Fecha o arquivo: */
fclose(fp);
return(0);
}
O exemplo a seguir lê os dados de nome (char), idade (int) e altura (float)
que estão dentro de um arquivo definido pelo usuário e mostra na tela seus
valores até 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;
4.2 Arrays - Vetores e Matrizes 35
/* Abre o arquivo: */
fp = fopen(nomearq,"r");
/* Fecha o arquivo: */
fclose(fp);
return(0);
}
int i,j;
float vec[3]; // array com 3 floats; vec[0], vec[1], vec[2]
4.2 Arrays - Vetores e Matrizes 36
vec[0] = 1.0;
vec[2] = 2.0;
for(i=0;i<30;i++) st[i]=i*i+7;
j = st[29];
int i,j;
double mt[2][5]; // array 2D c/ 2 linhas e 5 colunas
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; }
}
Arrays com três ou mais dimensões podem ser usados de forma similar.
Um array com k dimensões declarado como a[s1 ][s2 ] . . . [sk ] irá alocar espaço
para s1 × s2 × . . . × sk elementos que são alocados contiguamente na memória
linha por linha
int v[4];
v = {2, 4, 5, 9}; // Erro!! N~
ao dá para ser assim.
/* A forma correta seria
v[0] = 2;
v[1] = 4;
v[2] = 5;
v[3] = 9; */
4.4 Exercı́cios
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define n 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;
// Interpolando a temperatura
for(i=0;i<=n;i++)
4.4 Exercı́cios 40
{
if(Tci <= Tc[i])
{
/*Interpolaç~
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ç~
oes usando SQ
return(0);
}
#define SQ(x) (x * x)
4.4 Exercı́cios 41
κ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
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]; }
}
}
Capı́tulo 5
Sub-rotinas
5.1 Funções
Quando uma função não retorna nenhum valor, usa-se void para represen-
tar isso. Quando o tipo da saı́da não é especificado, o padrão do compilador
é assumi-la como int. Quando a entrada da função não é especificada indica
que não existe dado de entrada. Alguns exemplos,
Todas as funções devem ser definidas em algum lugar do código uma única
vez e com suas instruções entre chaves.O comando return é usado para que
a função produza um retorno. A definição da função pode servir como sua
declaração também. Por exemplo, a função square() pode ser definida como
int square(int x)
{ return x*x; }
int i = 5, j, k;
j = square(i); // chamada da funç~ao com i = 5
k = j; // após execuç~
ao, k = j;
int pass_val(int x)
5.1 Funções 44
{
x = x*x;
return(x + 5);
}
int i = 5, j;
j = pass_val(i);
// i = 5, j = 30
int pass_val(int& x)
{
x = x*x;
return(x + 5);
}
int i = 5, j;
j = pass_val(i);
// i = 25, j = 30
int tmp = p;
p = q;
q = tmp;
}
int i = 2, j = 3;
swap(i, j); // Agora i = 3 e j = 2
-----------------------------------
-----------------------------------
Qualquer função que não seja declarada como void deve retornar um valor
(com exceção de main). Por exemplo,
int square(int& i)
{ i*=i; } // Erro!! Um valor precisa ser retornado!
5.2 Exercı́cios 47
5.2 Exercı́cios
#include<stdio.h>
// Prototypes
int swap(int* p, int q, double x, double* y)
{
int i; /* Vc pode definir variáveis na sua
rotina q já foram definidas em main */
double f;
return(0);
}
int main()
{
int i,j;
double z, v[5]= {0., 1.25, 2.55, 3.5, 4.};
i = 2;
j = 5;
z = 2.5;
// v = {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 Exercı́cios 48
Escreva uma função que implemente este algoritmo.√ Observe uma rápida
convergência (quadrática) no resultado de xn → b. Compare a acurácia da
função com a função intrı́nseca sqrt() da biblioteca <math.h>.
• Inicializa u = an
• for(i = n − 1, n − 2, . . . , 0)
u ← ux + ai ;
5.2 Exercı́cios 49
http://www.gnu.org/software/gsl/manual/gsl-ref toc.html#TOC471