Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing...

52
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO Coordena¸ c˜ao dos Programas de P´os–gradua¸ c˜ao em Engenharia Programa de Engenharia Qu´ ımica Laborat´oriodeTermofluidodinˆamica Introdu¸c˜ ao ` aPrograma¸c˜ ao em C Curso de Extens˜ ao Luiz Fernando Lopes Rodrigues Silva, PEQ/COPPE/UFRJ RIO DE JANEIRO, RJ — BRASIL 2005

Transcript of Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing...

Page 1: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

UNIVERSIDADE FEDERAL DO RIO DE JANEIRO

Coordenacao dos Programas de Pos–graduacao em EngenhariaPrograma de Engenharia Quımica

Laboratorio de Termofluidodinamica

Introducao a Programacao em C

Curso de Extensao

Luiz Fernando Lopes Rodrigues Silva, PEQ/COPPE/UFRJ

RIO DE JANEIRO, RJ — BRASIL2005

Page 2: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

Sumario

1 Introducao a Programacao 21.1 Interpretacao do Arquivo–fonte . . . . . . . . . . . . . . . . . 21.2 Computacao Cientıfica . . . . . . . . . . . . . . . . . . . . . . 31.3 Exercıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.4 Primeiro Programa em C . . . . . . . . . . . . . . . . . . . . . 5

2 Tipos e Operadores Basicos 72.1 Tipos de Variaveis . . . . . . . . . . . . . . . . . . . . . . . . 7

2.1.1 Declaracao de Variaveis . . . . . . . . . . . . . . . . . 82.1.2 Variaveis Inteiras . . . . . . . . . . . . . . . . . . . . . 82.1.3 Variaveis de Caracteres . . . . . . . . . . . . . . . . . . 92.1.4 Variaveis de Ponto Flutuante . . . . . . . . . . . . . . 102.1.5 Variaveis Booleanas . . . . . . . . . . . . . . . . . . . . 11

2.2 Tipos de Operadores . . . . . . . . . . . . . . . . . . . . . . . 122.2.1 Operadores Aritmeticos . . . . . . . . . . . . . . . . . 122.2.2 Operadores Relacionais . . . . . . . . . . . . . . . . . . 152.2.3 Operadores Logicos . . . . . . . . . . . . . . . . . . . . 15

2.3 Exercıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3 Fluxos de Controle 193.1 Condicionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.1.1 Comando if–else if . . . . . . . . . . . . . . . . . . . . 193.1.2 Comando switch . . . . . . . . . . . . . . . . . . . . . 21

3.2 Lacos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.2.1 Comando for . . . . . . . . . . . . . . . . . . . . . . . 233.2.2 Comando while . . . . . . . . . . . . . . . . . . . . . . 26

3.3 Exercıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

4 Tipos Derivados 314.1 Entrada e Saıda em Arquivo . . . . . . . . . . . . . . . . . . . 314.2 Arrays - Vetores e Matrizes . . . . . . . . . . . . . . . . . . . 35

Page 3: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

SUMARIO ii

4.3 Ponteiros e Referencia . . . . . . . . . . . . . . . . . . . . . . 374.4 Exercıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

5 Sub-rotinas 425.1 Funcoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

5.1.1 Declaracao e Definicao de Funcao . . . . . . . . . . . . 425.1.2 Passagem de Argumentos . . . . . . . . . . . . . . . . 43

5.2 Exercıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

Page 4: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

Prefacio

Atualmente em qualquer area de atuacao profissional, o computador se tornauma ferramenta cada vez mais presente. Seja para montar um relatorio paraa empresa, estruturar uma apresentacao sobre suas atividades e progressos,executar tarefas repetitivas de analise de dados em uma fabrica, entre muitasoutras funcoes. Mas o principal objetivo deste curso e mostrar os meiosde uso do computador como ferramenta cientıfica para realizar calculos demodo eficiente. Em outras palavras, como analisar um problema qualquer eestruturar uma metodologia de solucao de forma que o computador entendao que o usuario quer, execute os comandos o mais rapido possıvel e fornecaresultados confiaveis.

O objetivo desta apostila e apenas de colocar as informacoes basicas sobrea linguagem de programacao C de modo a auxiliar o treinamento do alunodurante o curso. Como alguns topicos serao colocados em sala de aula, eucoloquei alguns codigos com espaco suficiente para que voces possam anotaras discussoes. A descricao da linguagem nao depende do sistema operacio-nal, seja Windows, Linux, DOS, MacOS, UNIX, desde que um compilador Cesteja instalado. Existem duas referencias sobre C que eu gostaria de passarpara voces. A primeira e o livro de Brian W. Kernighan e Dennis M. Ritchieintitulado “C — A linguagem de programacao padrao ANSI”. Estes autoresforam os desenvolvedores da linguagem C e apesar do livro possuir um bomconteudo, seus exemplos sao mais voltados para manipulacao de caracteres.Ja o livro “C++ and object-oriented numeric computing for scientists andengineers” de Daoqi Yang e uma referencia excelente para programacao ci-entıfica. Apesar de ser um livro de C++, muitos fundamentos basicos de Csao 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

Page 5: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

Capıtulo 1

Introducao a Programacao

1.1 Interpretacao do Arquivo–fonte

Os programas de computador sao formados por uma serie de instrucoes queo computador executa. Quando voce cria um programa, precisa especificaras instrucoes que o computador precisara executar para realizar as operacoesdesejadas. A definicao destas instrucoes e que voce deve fazer e salvar emum arquivo, chamado de arquivo ou codigo fonte. O arquivo fonte de umprograma escrito em C deve possuir a extensao C (ex. arqfonte.c). O ar-quivo fonte e o modo do programador montar a sua logica de programacao ecomunicar isso ao computador. Mas o computador nao entende diretamenteo arquivo fonte e precisa de um tradutor, chamado de compilador. Para criarprogramas, e imperativo e necessario que o compilador esteja instalado nocomputador. O compilador converte as instrucoes colocadas no arquivo fontepara a linguagem de maquina (binaria — 0 ou 1) que o computador compre-ende. Os arquivos gerados com a extensao EXE ou COM contem o codigode maquina e podem ser executados pelo computador. A Fig. 1.1 ilustraesse processo de geracao do codigo fonte, compilacao e criacao do arquivoexecutavel.

Page 6: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

1.2 Computacao Cientıfica 3

Figura 1.1: Conversao do codigo fonte para codigo de maquina.

1.2 Computacao Cientıfica

Em qualquer aplicacao cientıfica, a eficiencia computacional e muito impor-tante e o programador deve sempre ficar atento a esse detalhe. Mas comomontar um programa de forma eficiente? Bem, antes de pensar em pro-gramacao propriamente dita deve–se estruturar muito bem qual e o problemae qual a melhor forma de resolve–lo. Se isso nao estiver bem assentado nacabeca do programador, e melhor parar por aı e comecar a ler o seu problemanovamente. Afinal de contas, como voce vai resolver o seu problema de formaeficiente, se nem sabe ainda como resolve–lo?

Dica de programacao do L.F.

Antes de pensar em programar, organize as ideias no papel. Mesmopara os problemas mais simples. Sempre!! A princıpio podeparecer perda de tempo, mas a facilidade de estruturar o seucodigo fonte sera recompensadora.

As etapas necessarias de solucionar o problema e o que vamos chamar demetodologia de algoritmo e a forma como estas etapas sao executadas estaincluıda na logica de programacao. Estas definicoes vao ficar mais claras aoanalisarmos um exemplo.

1 Exemplo da distancia percorrida pelo carro com aceleracao constante.

Page 7: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

1.3 Exercıcios 4

Bem, temos o problema nas maos, ou seja, um modelo matematico a serresolvido.

S = S0 + v0t−1

2at2 (1.1)

Quais sao as perguntas que sempre devemos fazer para estruturar a me-todologia do algoritmo?

• Qual o meu objetivo? Calcular S!!! ⇒ Entao, essa e a ultima coisacom que devemos nos preocupar.

• O que eu preciso para calcular S? S0, v0, a e t. ⇒ Aaah, entao eutenho que me preocupar em saber os valores dessas variaveis antes decalcular S...

- Atribuir valores para S0, v0, a e t.

- Existe alguma restricao numerica e/ou fısica no meu modelo? ⇒Nao existe tempo negativo.

♦ Condicao para que o programa rejeite valores negativos detempo.

• Calculamos S.

• Mostramos ao usuario o resultado. ⇒ Senao, nao adianta nada, ne?

Mesmo para um problema simples, algumas perguntas devem ser respon-didas antes de tentar calcular qualquer coisa. Eu ficaria muito feliz se aolongo do curso (e depois tambem) voces sempre montassem o algoritmo desolucao. Voces notarao que, com o tempo e a pratica, estruturar a solucao deum problema ficara muito mais facil e podera ate ser feita automaticamente.Podem confiar.

1.3 Exercıcios

I Monte a estrutura de solucao para os problemas abaixo.

Page 8: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

1.4 Primeiro Programa em C 5

1) A troca de calor em um reator nao isotermico precisa ser otimizada.Voce foi incumbido de calcular a quantidade de calor trocada entre o reatore o meio ambiente. O modelo de troca termica esta colocado abaixo, onde Qe a quantidade de calor trocada, UA e o coeficiente global de transferenciade calor, Tr e a temperatura do reator e T∞ e a temperatura do ambiente.

Q = UA(Tr − T∞) (1.2)

2) A Baıa de Guanabara possui uma concentracao de petroleo que estase dispersando com o passar do tempo. A dispersao de petroleo na baıa segueo modelo descrito na Eq. 1.3 onde Cp e a concentracao de petroleo no instantet, Cp0 e a concentracao inicial de petroleo e A e a area onde o petroleo estadisperso. Contudo, a area de dispersao do petroleo varia devido a condicoesclimaticas e com o proprio tempo. Um modelo (Eq. 1.4) descreve a variacaoda area em que o petroleo esta disperso, onde o parametro M e uma mediados efeitos climaticos.

Cp = Cp0e−At (1.3)

A = Me−t (1.4)

1.4 Primeiro Programa em C

Agora que ja vimos como montar os nossos problemas de uma forma estru-turada, ja podemos ver um primeiro exemplo de programacao em C. Noteque ainda nao vimos nenhum comando desta linguagem e este exemplo iraservir apenas como uma forma de comecarmos uma discussao em torno dalogica de programacao em C.

Um programa em C necessariamente deve conter a funcao main() quecontem as instrucoes (ou comandos) entre entre e . Cada comando podeser escrito em mais de uma linha e deve ser terminado por um ponto evırgula (; — se nao tiver, vai dar erro na compilacao do programa). Oscomentarios no codigo fonte estao entre /* e */ (todo o texto entre esses doissımbolos e desconsiderado pelo compilador) ou precedidos por // (a linhatoda fica comentada). Os comentarios podem conter varias informacoes sobreo problema (qual o problema a ser resolvido, qual a metodologia que vai serutilizada, quem programou o codigo, quando, etc.), o codigo fonte (o porquede usar um comando especıfico) ou mesmo detalhes de como usar o programa

Page 9: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

1.4 Primeiro Programa em C 6

depois de compilado. A princıpio, comentar o arquivo fonte pode parecer umatarefa exaustiva, porem estes sao muito uteis para o entendimento futuro docodigo.

Dica de programacao do L.F.

Sempre comente o seu codigo. Nao preciso colocar os porques,apenas comente!!!!!

O objetivo deste primeiro programa e simplesmente escrever uma mensa-gem na tela para o usuario. O codigo fonte esta colocado a seguir.

/* 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 */) ecolocam algumas informacoes sobre o programa. Os outros comentarios desseprograma sao menores e sao precedidos por duas barras //. As bibliotecas emC contem varios comandos e funcoes padroes para auxiliar na programacao.Para habilitar esses comandos, e necessario declarar as bibliotecas no inıciodo programa. A biblioteca padrao que contem os comandos de entrada esaıda de dados em tela chama-se <stdio.h> e esta declarada logo apos oprimeiro comentario. Essa declaracao habilita que o programador use todosos comandos de entrada e saıda padrao em tela. O comando printf efetua essaoperacao mostrando ao usuario a seguinte mensagem: Eu adoro programarem C. Pronto, o nosso primeiro programa esta pronto.

Page 10: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

Capıtulo 2

Tipos e Operadores Basicos

2.1 Tipos de Variaveis

Vamos considerar a seguinte expressao matematica:

z = y + i ∗ x (2.1)

Para que a Eq. 2.1 faca sentido em no codigo fonte, os identificadores 1

x, y, z e i devem ser declarados de forma adequada. Todos os identificadoresdevem ser declarados antes de serem usados. As declaracoes introduzementidades representadas por seus identificadores e seus tipos (ex. inteiro oucaractere).

Os tipos das variaveis fornecem propriedades diferentes tanto na formade armazenamento da variavel na memoria RAM quanto na propria mani-pulacao e operacao da variavel. Existem operacoes que so sao possıveis ousao muito mais eficientes se realizadas com um determinado tipo de variavel.

if( i == 0 )

/* realiza os comandos aqui dentro */

1Os identificadores sao as letras usadas para identificar as suas variaveis.

Page 11: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

2.1 Tipos de Variaveis 8

2.1.1 Declaracao de Variaveis

A declaracao das variaveis no codigo fonte indica que o programa deve re-servar um espaco na memoria RAM para cada variavel declarada. Vamosconsiderar que a memoria RAM esta distribuıda como na Fig. 2.1.1 e divi-dida em bytes.

Figura 2.1: Representacao da memoria RAM subdividida em bytes.

Agora vamos considerar que no inıcio do programa as variaveis i e z este-jam sendo declaradas e portanto, um espaco na memoria deve ser reservado.Este procedimento e o que chamamos de alocacao de espaco na memoria.Deste modo, os valores que forem atribuıdos nestas variaveis ficam alocadosem um endereco especıfico da memoria RAM. A quantidade de memoria quedeve ser reservada depende do tipo da variavel.

Figura 2.2: Alocacao de variaveis na memoria RAM.

2.1.2 Variaveis Inteiras

Cada variavel inteira ocupa 2 bytes de memoria e o valor armazenado namemoria nao inclui a parte fracionaria. Um exemplo segue abaixo.

#include<stdio.h>

main()

int i; // Declarac~ao de i como inteira

Page 12: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

2.1 Tipos de Variaveis 9

int j,k; /* Declarac~ao de j e k como inteiros.

E possıvel declarar mais de uma

variavel por linha */

int ii = 123; // Ao declarar ii, ja atribuo um valor.

i = 2; // Atribuic~ao do valor 2 para a variavel i

j = i; // Atribuic~ao do valor contido em i para j

k = 2.3; /* N~ao considera a parte fracionaria!

k assume o valor de 2 */

/* Saıda em tela das variaveis*/

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 Variaveis de Caracteres

Cada variavel caractere ocupa 1 byte na memoria e armazena valores inteirosque sao convertidos em caracteres ASCII (o valor do inteiro 98 corresponde aocaractere ’b’ no conjunto ASCII). Normalmente, o que se quer e uma variavelque armazene um conjunto de caracteres para que seja possıvel construirpalavras ou sentencas. Alguns caracteres sao especiais e possuem algumasfuncoes especıficas.

Caractere Funcao especıfica\n nova linha\t tabulacao horizontal\v tabulacao vertical\a alerta sonoro\r cursor volta para o inıcio da linha\b backspace

Tabela 2.1: Caracteres especiais para operar a saıda de dados.

Um exemplo (extremamente idiota!) de aplicacao de caracteres.

#include <stdio.h>

#include <conio.h>

Page 13: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

2.1 Tipos de Variaveis 10

main()

char ch1, ch2;

printf("Entre com 1 caracter: ");

/* le um caracter do console sem mostra-lo */

ch1 = getch();

printf("\nEntre com 1 caracter: ");

/* le um caracter do console mostrando-o em seguida:

getche() = getch() and echo */

ch2 = getche();

/* Mostra os caracteres lidos na tela: */

printf("\nO primeiro caracter lido foi: %c", ch1);

printf("\nO ultimo caracter lido foi: %c\n", ch2);

/* Mostra os caracteres lidos na tela usando putch(): */

printf("\nCaracterres lidos:\n");

putch(ch1);

putch(ch2);

printf("\n");

/* A funcao getchar le um caracter da

entrada padrao (stdin): */

ch1 = getchar();

/* A funcao putchar mostra um caracter

na saida padrao (stdout): */

putchar(ch1);

printf("\n");

2.1.4 Variaveis de Ponto Flutuante

As variaveis de ponto flutuante sao capazes de armazenar as casas decimaisde um numero. Existem duas classificacoes para as variaveis de ponto flutu-

Page 14: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

2.1 Tipos de Variaveis 11

ante, com precisao simples (normalmente com 6 casas decimais) ou de duplaprecisao (normalmente com 15 casas decimais). Um exemplo quantifica bema diferenca entre esses dois tipos de variaveis.

#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, osresultados para π estao colocados abaixo.

Valor com precisao simples : 3.1415927410125732000

Valor com precisao dupla : 3.1415926535897931000

Obs.: executem o programa colocado acima mudando a referencia %21.19fda variavel de ponto flutuante. Mude o numero das casas decimais, o numerodos espacos reservados para a variavel e troque o f do ponto flutuante por%g, %e e %E. Vejam e analisem as mudancas.

2.1.5 Variaveis Booleanas

Um booleano, representado por bool, pode armazenar dois valores: true oufalse, e e usado para expressar os resultados de expressoes logicas.

Page 15: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

2.2 Tipos de Operadores 12

bool flag = true; // declarac~ao de flag como booleana

double d;

/* Algum codigo 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 || true = truetrue && false = false true || false = truefalse && true = false false || true = truefalse && false = false false || false = false

Tabela 2.2: Comparacoes de booleanos — && significa E; || significa OU

Por definicao, false tem o valor 0 e true tem valor 1. Por isso, pessoal-mente, eu nao uso variaveis booleanas, mas um inteiro com valor de 0 (falso)ou 1 (verdadeiro).

2.2 Tipos de Operadores

Pronto, ja sabemos quais sao os tipos de variaveis que existem e agora esta-mos aptos a realizar operacoes com elas.

2.2.1 Operadores Aritmeticos

Sao os operadores basicos de soma (+), subtracao (−), multiplicacao (∗)e divisao (/). E muito importante entender o tipo de variavel que se estaoperando, pois perda de informacao pode ocorrer. Veja o exemplo a seguir.

Page 16: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

2.2 Tipos de Operadores 13

double m = 13/4; /* e uma operac~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. Amultiplicacao e a divisao possuem uma maior precedencia em relacao a somae subtracao. Contudo, o que esta contido nos parenteses possue uma pre-cedencia maior que a dos operadores. Vejamos as etapas de execucao dasexpressoes 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 programacao do L.F.

Sempre que voce tiver duvidas sobre a ordem das operacoes, useo parenteses sem medo de ser feliz.

int m;

m = ((5+3)*2) - 3; /* m = (8*2) - 3;

Page 17: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

2.2 Tipos de Operadores 14

m = 16 - 3;

m = 13; */

Os operadores de incremento (++) e decremento (−−) sao muito usadosem qualquer programa C, pois facilitam a leitura do codigo (alguns dizemquem nao...).

int conta = 0;

int m = 2;

conta++; /* Essa operac~ao pode ser substituıda por:

conta = conta + 1; (conta = 1) */

conta--; /* Essa operac~ao pode ser substituıda por:

conta = conta - 1; (conta = 0) */

++m; /* m = 3; */

m = conta++; /* m = 0; conta = 1;*/

Vamos analisar o seguinte codigo (em aula).

#include<stdio.h>

int main()

int valor = 1;

printf("Usando depois da variavel : %d\n", valor++);

printf("Valor apos incremento: %d\n", valor);

valor = 1;

printf("Usando depois da variavel : %d\n", ++valor);

printf("Valor apos incremento: %d\n", valor);

return(1);

Ainda e possıvel realizar operacoes de atribuicao da seguinte maneira.

total += 100; // Significa: total = total + 100;

conta -= 5; // Significa: conta = conta - 5;

metade /=2; // Significa: metade = metade/2;

Page 18: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

2.2 Tipos de Operadores 15

2.2.2 Operadores Relacionais

Os operadores relacionais sao > (maior que), < (menor que), >= (maior ouigual a), <= (menor ou igual a), == (igual a) e ! = (nao igual). A notacao ! eo operador de negacao. O resultado destas operacoes e sempre um booleano.

int x = 5;

bool b, c;

b = (x < 6); // b = true, ja que x e menor que 6

c = (x == 0); // b = false, ja que x n~ao e 0

if(b != c) // Se b n~ao e igual a c, x = 17

x = 17;

if(b) // Se b e true, ent~ao faca x = 19

x = 19;

if(!b) // Se b e false, ent~ao faca x = 221

x = 221;

Deve-se tomar muito cuidado ao usar essas operacoes. Considere o exem-plo abaixo.

int m = 7;

bool b, c;

b = 3 < m < 9; // b = true

m = 20;

c = 3 < m < 9; // c = true

Os operadores relacionais sao executados da esquerda para a direita, porisso a expressao 3 < m < 9 e equivalente a (3 < m) < 9. Entao, estaexpressao sempre e avaliada como true pois 3 < m pode ser tanto 1 (true)quanto 0 (false).

2.2.3 Operadores Logicos

Os operadores logicos, assim como os relacionais, resultam em um valor bo-oleano. Esses operadores sao && (e) e || (ou) e posuem uma precedencia

Page 19: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

2.3 Exercıcios 16

maior que os operadores relacionais (sao executados antes). A Tabela 2.2mostra as relacoes com os booleanos. Veja os exemplos a seguir.

bool b =true, c = false;

bool d = b && c; // d = false

bool e = b || c; // e = true

bool f = (e == false) && c; // f = false

bool g = (d == true ) || c; // g = false

bool h = (d = true ) || c; // h = true

Vamos agora rever a expressao 3 < m < 9. A maneira correta de progra-mar esta expressao em C seria

(3 < m) && (m < 9)

Como o operador < possue uma precedencia maior que o operador &&,os dois pares de parenteses poderiam ser omitidos.

2.3 Exercıcios

I As variaveis a, b, c, d, e, f e g foram inicializadas com os seguintes valores:

a = 3. b = 2. c = 5. d = 4. e = 10. f = 2. g = 3.

Efetue as seguintes expressoes em C :

1. saida = a*b+c*d+e/pow(f,g)

2. saida = a*(b+c)*d + pow(e/f,g)

3. saida = a*(b+c)*(d+e)/pow(f,g)

Page 20: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

2.3 Exercıcios 17

II Analise o codigo abaixo para calcular a media das notas de um aluno.Programe este codigo e retire alguns dos comentarios e comente alguns co-mandos para entender como o codigo funciona.

/*Calculo da media dos alunos*/

#include <stdio.h>

int main()

double M,P1,P2;

// Entrada de dados pelo codigo

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);

*/

// Calculo da media

// Calculo direto

M=(P1+P2)/2.;

// Calculo 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);

III Faca um programa em C que calcule a velocidade em queda livre deum corpo a 6 m de altura. Sabe-se que a formula de queda livre e dada porv =√

2gh, onde g = 9.81. Faca um outro programa em que seja possıvel queo usuario entre na tela com o valor da altura (cuidado, porque ate onde eu

Page 21: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

2.3 Exercıcios 18

sei e os limites da fısica permitem, nao existe altura negativa).

IV Faca um programa em C que leia uma temperatura em graus Farenheit,converta-a para uma temperatura absoluta em kelvins, e escreva o resultado.A formula de conversao e:

T (K) =5.

9.[T (F )− 32.0] + 273.15 (2.2)

V O coseno hiperbolico e definido pela equacao:

cosh(x) =

(

ex + e−x

2.

)

(2.3)

Escreva um programa em C para calcular o coseno hiperbolico para umvalor x fornecido pelo usuario. Use o programa para calcular o coseno hi-perbolico de 3.0. Compare a resposta que seu programa fornece com a res-posta produzida pela funcao intrınseca do C cosh(x), contida na biblioteca<math.h>.

Page 22: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

Capıtulo 3

Fluxos de Controle

3.1 Condicionais

3.1.1 Comando if–else if

A forma mais simples de um condicional e o comando if, cuja sintaxe e:

if(condic~ao) express~ao

onde condicao e uma expressao logica que possui valor de true ou false, eexpressao pode ser apenas um ou varios comandos. A expressao e executadaquando o valor de condicao e avaliado em true, senao a expressao nao eexecutada. A condicao deve estar entre parenteses.

if(n>10) x*=10; // Qdo n>10, faca x*=10

if(n==0) // Qdo n e 5, faca x*=5

x*=5;

if(n) y*=7; // Qdo n!=0, faca y*=7

Os condicionais devem ser usados com cuidado quando a expressao requera comparacao de variaveis nao inteiras. Considere x e y como variaveis de

Page 23: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

3.1 Condicionais 20

ponto flutuante, a condicao if(x == y) deve ser substituıda por if(fabs(x - y)< erro) onde erro e um numero muito pequeno definido pelo usuario e fabs ea funcao matematica que retorna o valor absoluto de uma variavel de pontoflutuante.

Dica de programacao do L.F.

Tome muito cuidado ao avaliar variaveis em ponto flutuante.Note ainda que existe diferenca entre == e =! Aqui, o pro-gramador pode e deve “usar e abusar” dos parenteses e dosoperadores logicos e relacionais.

O condicional if pode ser acompanhado pela parte opcional else.

if(condic~ao)

express~ao1

else

express~ao2

onde, se a condicao for avaliada como true, a expressao1 e executadaenquanto a expressao2 e desprezada. Se a condicao retornar um valor false,a expressao1 e desprezada e a expressao2 e executada. Ainda e possıvelcombinar os condicionais if–else da seguinte maneira:

if(condic~ao1)

express~ao1

else if(condic~ao2)

express~ao2

else if(condic~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 naoe executada e a condicao2 e testada. Se a ultima for true, a expressao2 e

Page 24: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

3.1 Condicionais 21

avaliada e o resto do bloco e desprezado, enquanto se a condicao2 for false oresto do bloco e ignorado. Esse procedimento e repetido ate o final do bloco,onde se nenhuma das condicoes forem true, a expressao4 sera executada.Note que a ultima expressao e um caso que nao possui nenhuma restricao esera efetuado sempre que nenhuma das condicoes anteriores forem satisfeitas.

Vamos ver o exemplo abaixo. O programador quer montar uma estruturaque retorne os parametros fısicos da agua. Porem, ate onde eu sei e a fısicaexplica, dependendo da temperatura, a agua pode se apresentar na formasolida, lıquida ou gasosa e seus parametros fısicos dependem de sua forma.Como fazer isso?

// Usuario entra com T (em K)

printf("Entre com a temperatura da agua (K)");

scanf("%16le",&T);

printf("\n");

if(T <= 273.15)

// Gelo!

// Calcula parametros para gelo

else if((T >= 273.15) && (T <= 373.15))

// Lıquido!

// Calcula parametros para agua lıquida

else

// So sobrou o vapor (fora o plasma!!)

// Calcula parametros para vapor d’agua

3.1.2 Comando switch

O comando switch e muito usado em situacoes de multipla escolhas. Estetesta o valor da condicao, colocada entre parenteses apos a palavra chaveswitch. Entao este valor e usado como um controle de escolha para os casosque satisfazem esse valor. Se o valor nao satisfaz nenhum caso, o controle irapara o caso default. O comando break e usado para sair do comando switch.

Page 25: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

3.1 Condicionais 22

Vamos analisar o exemplo abaixo, onde o programador quer calcular ocoeficiente de transferencia de calor em alguns casos especificados. Sabe-seque os modelos matematicos sao diferentes para cada situacao fısica, entaodevemos colocar restricoes no usos destes ou deixar que o usuario especifiqueo caso que ele quer o resultado.

#include<stdio.h>

#include<conio.h>

#include<ctype.h>

#include<stdlib.h>

int main()

char letra;

// Tem q declarar os parametros dos modelos, ne?

// Se n~ao ja 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 minuscula em maiuscula

letra = toupper(letra);

printf("\n");

// Vamos escolher qual modelo? Depende do q o usuario 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

Page 26: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

3.2 Lacos 23

printf("Fingi que calculei h por B.\n");

break;

case ’C’:

// Escreve aqui como calcula o h para conv. natural

// Comandos

printf("Fingi que calculei h por C.\n");

break;

case ’D’:

// Escreve aqui como calcula o h para conv. com condensacao

// Comandos

printf("Fingi que calculei h por D.\n");

break;

default :

// Entra aqui se nenhum das condic~oes foram satisfeitas

printf("Esse caractere nao e valido. Foi mal...\n");

;

return (1);

Dica de programacao do L.F.

Voce sabia que os condicionais sao um dos comandos mais commaior custo computacional que existem? Se quiser montarum programa com menor custo de computacao, use o me-nor numero de condicionais possıvel e somente quando fornecessario.

3.2 Lacos

3.2.1 Comando for

O laco for e muito utilizado e extremamente conveniente de ser usado. Suaforma geral esta colocada abaixo.

for(inicia;condic~ao;express~ao)

comandos

Page 27: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

3.2 Lacos 24

A inicia representa a inicializacao da variavel de controle do laco, acondicao fornece um controle para determinar se o laco deve continuar aser executado e expressao indica como a variavel inicializada deve ser ava-liada a cada vez que os comandos sao executados. O laco e continuamenteexecutado ate que a condicao seja avaliada como false. Este processo derepeticao e chamado iteracao. Vamos ver o seguinte exemplo.

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 iniciale 3. Como a condicao i < 50 e true, 3 aparece na tela. Entao, a expressaoi∗ = 2 fornece o segundo valor de i que e 6. Como i < 50 ainda e true, 6tambem e retornado na tela. Este processo e repetido ate que i∗ = 2 forneca96, 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 eexecutado, muito menos a expressao i∗ = 2.

O comando break pode ser usado para terminar a execucao do laco, e ocontinue para a execucao da iteracao atual e passa para a proxima. Paradeixar mais claro, vamos ver o exemplo.

int i;

for(i=3;i<50;i*=2)

if(i == 6) continue; // Passa para a proxima iterac~ao

printf("%d\n",i);

if(i == 24) break; // Para a execuc~ao do laco qdo i e 24

Page 28: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

3.2 Lacos 25

Os inteiros 3, 12, 24 irao aparecer na tela. Quando i for 6, o valor de inao sera retornado na tela ja que o comando continue faz com que o controleva para a proxima iteracao com i = 6 ∗ 2 = 12. Quando i = 24, o laco eterminado devido ao comando break.

Dica de programacao do L.F.

Muito cuidado! Ao usar for, nao altere o valor do contador dentrodo laco, pois isso e uma alta fonte de erros.

Um laco pode ser acoplado como qualquer outra expressao. 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

computa a seguinte equacao

99∑

i=0

500∑

j=200

(i− j) (3.1)

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!)

54∏

i=1

27∏

j=−3

(i + j2) (3.2)

Page 29: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

3.2 Lacos 26

Dica de programacao do L.F.

Facam a programacao de Chines. Ao montarem um laco, exe-cutem cada comando no papel e vejam se os resultados estaochegando ao que voce tinha em mente. Mas execute cada co-mando mesmo! Voces vao exercitar a visao de programacao efica mais difıcil de deixar o programa com erros (pelo menosnessa parte que voce fez o chinezinho).

3.2.2 Comando while

O comando while possui a seguinte forma

while(condic~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 sejamais true. O laco seguinte nao ira retornar para a tela nenhum valor ja quesua 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++);

Page 30: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

3.3 Exercıcios 27

O comando do-while e parecido com o laco while, porem possui a seguinteforma.

do

comandos

while(condic~ao)

A execucao dos comandos e continuada ate que a condicao seja avali-ada como false. Neste caso, os comandos serao executados pelo menos umavez. Os comandos continue e break tambem podem ser usados dentro doscomandos while e do-while.

3.3 Exercıcios

I As linhas de comando seguintes implementadas em C tem a funcao dealertar oralmente o usuario de perigosas leituras de temperatura em um sis-tema de controle (valores em graus Fahrenheit). Este procedimento de avisoesta correto ou incorreto? Se estiver incorreto, explique porque e corrija-o(nao programe!! Faca no papel!!).

if( temp < 97.5 )

printf("Temperatura abaixo do normal");

else if ( temp > 97.5 )

printf("Temperatura normal");

else if ( temp > 99.5 )

printf("Temperatura levemente alta");

else if ( temp > 103.0)

printf("Temperatura perigosamente alta");

II Use um laco acoplado para escrever o programa que computa a soma

100∑

i=0

300∑

j=5

cos(i2 +√

j) (3.3)

Page 31: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

3.3 Exercıcios 28

III Escreva um programa em C para calcular a funcao

y(x) = ln(1

1− x) (3.4)

para qualquer valor de x pre-especificado pelo usuario, onde ln e o loga-ritmo natural ( logaritmo na base e). Escreva o programa com um laco whilede forma que o programa repita o calculo para cada valor legal de x aplicadoao programa. Quando um valor ilegal de x for avaliado, termine o programa.

IV Escreva um programa em C para calcular y(t) vinda da Eq. 3.5 paravalores de t entre -9 a 9 em passos de 3.

y(t) =

−3t2 + 5, t ≥ 0

3t2 + 5, t > 0(3.5)

Escreva o resultado em tela e depois em um arquivo de saıda (neste ultimocaso, crie intervalos de 0.1 entre -9 e 9).

V Faca um programa em C que calcule o resultado numerico e analıtico daseguinte serie, onde o usuario entra com o numero de pontos N do somatorio:

Snum =N∑

n=1

1

n2

Sana =π2

6(3.6)

Compare os resultados numericos fornecidos para diferentes valores de Ncom o resultado analıtico.

VI O metodo de Newton-Raphson e uma metodologia iterativa de solucaode equacoes nao lineares. Ou seja, um metodo numerico que encontre o(s)

Page 32: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

3.3 Exercıcios 29

valores de x que facam com que f(x) = 0. Como estamos em um computa-dor e trabalhando com variaveis de ponto flutuante, deve-se assumir que oobjetivo de x foi atingido quando f(x) e menor que um erro pre-definido. Ometodo de Newton-Raphson e colocado abaixo.

xk+1 = xk −f(x)

f ′(x), ate que |xk+1 − xk| < erro (3.7)

O codigo abaixo coloca o metodo de Newton-Raphson da funcao f(x) =ex + sen(x) utilizando um laco while. Modifique o programa de modo queele passe a usar o laco for e que o usuario possa entrar com o numero deiteracoes do metodo. Existe diferenca entre usar um laco sem controle donumero de iteracoes ou um que use? O que voce acha?

#include<math.h>

#include<stdlib.h>

int main()

double x, xk, f, df, erro;

int i;

// Func~ao f(x) = exp(x) + sen(x)

xk=10.; // Chute inicial

x = 0.; // Tem q inicializar a variavel

erro = 1.e-5; // Erro do metodo

// Loop de convergencia

i = 1; // 1a Iterac~ao

printf("It \t X\n");

while(fabs(xk - x) > erro)

x = xk; // Atualiza a variavel

f = exp(x) + sin(x); // Calcula func~ao

df= exp(x) + cos(x); // Calcula a derivada da func~ao

xk= x - f/df; // Metodo de Newton-Raphson

printf("%d \t %g\n", i,xk);

i++;

printf("\n Valor convergido!\n");

printf(" x = %g \n", xk);

Page 33: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

3.3 Exercıcios 30

return (0);

Page 34: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

Capıtulo 4

Tipos Derivados

4.1 Entrada e Saıda em Arquivo

A biblioteca <stdio.h> possui funcoes especıficas para tratar a manipulacaode arquivos em C. Assim e possıvel ler dados vindos de um arquivo ou escreveros resultados do seu programa em outro (ou o mesmo) arquivo. Um arquivode controle deve ser declarado para que possa abrir um arquivo. Por exemplo,

int i,j,k;

FILE *stream;

A variavel stream sera como referencia em todas as manipulacoes de ar-quivo. Para manipular mais de um arquivo ao memso tempo, deve-se decla-rar mais variaveis do tipo FILE. O comando fopen e usado para abrir umarquivo.

stream = fopen("NomeArquivo","Regra");

O comando fopen retorna para a variavel FILE um valor indicando se oprocesso de abertura do arquivo teve sucesso ou nao e ainda atribui a FILEas propriedades sobre o arquivo aberto (como as regras de I/O). O nome doarquivo pode ser colocado diretamente ou usando uma variavel de caracteres

Page 35: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

4.1 Entrada e Saıda em Arquivo 32

contendo o nome do arquivo. As regras definem as acoes que podem serrealizadas no arquivo (escrita, leitura, ambas, etc). O exemplo abaixo abreum arquivo para escrever caracteres no arquivo ate que o usuario entre comum caractere especıfico.As regras mais usuais para manipulacao de arquivosestao listadas no exemplo abaixo.

/* Arquivos sao uma coletanea de bits armazenados

em algum tipo de midia.

Para abrir um arquivo:

FILE *fopen( const char *filename, const char *mode );

"r" - abre um arquivo somente para leitura. Se o arquivo

nao existe ou nao pode ser encontrado, a funcao

fopen retorna um ponteiro nulo.

"w" - abre um arquivo vazio para escrita. Se o arquivo

existe, seu conteudo e destruido.

"a" - abre um arquivo para escrita, a partir de seu final.

Se o arquivo nao existe, um novo arquivo e criado.

"r+" - abre um arquivo para escrita e leitura

(o arquivo deve existir).

"w+" - abre um arquivo para escrita e leitura.

Se o arquivo existe, seu conteudo e destruido.

"a+" - abre um arquivo para leitura e escrita, a partir de

seu final. Se o arquivo nao existe, um novo arquivo

e criado.

*/

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

main()

Page 36: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

4.1 Entrada e Saıda em Arquivo 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 comandosfprintf e fscanf() podem ser usados da mesma forma que os comandos paratela, contudo e necessario indicar o FILE 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) ealtura (float) em arquivo definido pelo usuario. A entrada no banco de dadose finalizada quando o nome contiver nenhum ou apenas 1 caractere.

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <string.h>

int main()

Page 37: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

4.1 Entrada e Saıda em Arquivo 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 seusvalores 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;

Page 38: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

4.2 Arrays - Vetores e Matrizes 35

/* Le o nome do arquivo na tela: */

printf("Entre o nome do arquivo: ");

gets(nomearq);

/* Abre o arquivo: */

fp = fopen(nomearq,"r");

/* Le os dados no arquivo e exibe na tela: */

while( fscanf(fp, "%s %d %f", nome, &idade, &altura) != EOF)

printf("%20s %3d %.2f\n", nome,idade,altura);

/* Fecha o arquivo: */

fclose(fp);

return(0);

4.2 Arrays - Vetores e Matrizes

Sendo T uma variavel declarada, T [n] e um array unidimensional (vetor) den elementos com o mesmo tipo de T . Os elementos sao indexados a partirde 0 ate n − 1 e sao armazenados de forma contınua na memoria, ou seja,um elemento apos o outro. A Fig. 4.2 mostra como esse procedimento erealizado na memoria RAM.

Figura 4.1: Alocacao do vetor v com n elementos na memoria.

A definicao de arrays e colocada a partir de exemplos.

int i,j;

float vec[3]; // array com 3 floats; vec[0], vec[1], vec[2]

Page 39: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

4.2 Arrays - Vetores e Matrizes 36

int st[30]; // array com 30 ints; st[0], ... st[29]

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 esca-lares e, portanto, todas as operacoes que vimos ate agora tambem se aplicamaos arrays. Uma array bidimensional (matriz) com n linhas e m colunas podeser definido como T [n][m]. Os ındices das linhas vao de 0 a n − 1 e os dascolunas vao de 0 a m− 1. Por exemplo,

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;

Um laco acoplado e muito usado para acessar todos os elementos de umamatriz. Um array bidimensional pode ser visto como um array unidimen-sional de arrays unidimensionais. Por exemplo, mt pode ser visto como sepossuısse apenas 2 elementos: mt[0] e mt[1], onde mt[0] e um array uni-dimensional de 5 elementos que representa a primeira linha de mt, e mt[1]tambem e um array unidimensional de 5 elementos, mas que representa asegunda linha de mt. A Fig. 4.2 mostra como um array bidimensional ealocado na memoria.

Figura 4.2: Alocacao de matriz n por m na memoria.

Page 40: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

4.3 Ponteiros e Referencia 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 espacopara s1×s2× . . .×sk elementos que sao alocados contiguamente na memorialinha por linha

Os arrays podem ser inicializados ao serem declarados.

int v[] = 1, 2, 3, 4;

int a[3]= 2, 4, 5;

int u[][3] = 1, 2, 3 , 4, 5, 8 ;

char filename[30] = "output"; // Array de caracteres

Contudo, depois de declarados os valores dos elementos devem ser atriuıdosum por vez.

int v[4];

v = 2, 4, 5, 9; // Erro!! N~ao da para ser assim.

/* A forma correta seria

v[0] = 2;

v[1] = 4;

v[2] = 5;

v[3] = 9; */

Sera que e possıvel inicializar uma matriz do seguinte modo??

int v[2][3] = 1, 2, 0, 4, 0, 0;

4.3 Ponteiros e Referencia

Os ponteiros sao definidos da seguinte forma ∗T . Um ponteiro ∗T podearmazenar o endereco ou local na memoria de uma variavel com o mesmotipo do ponteiro. Por exemplo,

Page 41: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

4.4 Exercıcios 38

int *p; // p e um ponteiro de um inteiro

declara a varavel p como um ponteiro de inteiro. Este ponteiro pode serusado para armazenar o endereco na memoria de variaveis inteiras. Sendo vuma variavel, o seu endereco na memoria pode ser retornado usando &v. Sep e uma variavel ponteiro, ∗p retorna o valor da variavel apontada por p.

int i = 5; // i e int, valor do objeto i e 5. (a)

int* pi=&i; // p e um ponteiro de um inteiro (b)

// e atribui o endereco de i a pi

int j = *pi; // valor da variavel apontada por pi (c)

// e atribuıdo a j, j = 5;

double* = &j; // Ilegal!!

Para uma variavel de ponteiro p, o valor em ∗p ao qual a variavel apontapode ser alterado.

double d1 = 2.7, d2 = 3.1; (a)

double* p = &d1; // p aponta para d1, *p = 2.7 (b)

double a = *p; // a = 2.7

p = &d2; // p aponta para d2, *p = 3.1 (c)

double b = *p; // b = 3.1

*p = 5.5; // o valor para qual p aponta e 5.5 (d)

double c = *p; // c = 5.5

double d = d2; // d = 5.5, ja que *p = 5.5

4.4 Exercıcios

I Simples e direto. Qual o objetivo do codigo abaixo? Nao programe!!Leia e entenda o que esta acontecendo!! Repare na identacao do programa!!Tente usar uma identacao parecida nos seus programas! Depois, voce podeprogramar para ver a execucao do programa.

Page 42: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

4.4 Exercıcios 39

#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;

// Calculo das Temperaturas em Celsius

Tc[0] = 0.;

for(i=1;i<=n;i++)

Tc[i] = Tc[i-1] + dT;

// Calculo 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++)

Page 43: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

4.4 Exercıcios 40

if(Tci <= Tc[i])

/*Interpolac~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);

II O comando #define e uma macro em C, ou seja, e uma forma de definiroperacoes ou variaveis constantes. Veja o exemplo abaixo, onde SQ e umamacro para calcular o quadrado de uma funcao.

#include<stdio.h>

#define SQ(x) ((x) * (x))

int main()

double x, y;

// faz as operac~oes usando SQ

return(0);

Sera que tem diferenca se eu programar SQ como colocado na sequencia?

#define SQ(x) (x * x)

Page 44: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

4.4 Exercıcios 41

III Existe a seguinte tabela de relacao entre κT/ǫ e ΩD,AB e deseja-se in-terpolar os valores de ΩD,AB ao entrar com κT/ǫ. Escreva um algoritmopara a interpolacao para ΩD,AB, sem esquecer de verificar a validade do valorfornecido em tela pelo usuario.

κT/ǫ ΩD,AB

0.30 2.6620.35 2.4760.40 2.3180.45 2.1840.50 2.0660.55 1.9660.60 1.8770.65 1.7980.70 1.7290.75 1.6670.80 1.6120.85 1.5620.90 1.5170.95 1.4761.00 1.439

IV Calcule o tempo necessario para calcular a multiplicacao de duas matri-zes quadradas (n×n), 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 necessariopara efetuar o calculo (procure na internet a biblioteca necessaria para mar-car o tempo em C). Faca dois testes de multiplicacao, trocando a ordem doslacos i—j por j—i. Faca um grafico com os valores de tempo e tamanho dematriz 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];

Page 45: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

Capıtulo 5

Sub-rotinas

5.1 Funcoes

5.1.1 Declaracao e Definicao de Funcao

A funcao pode considerar uma entrada de dados, realizar algumas instrucoese retornar algum resultado. Os parametros de entrada e saıda devem terseus tipos especificados. Por exemplo, uma das funcoes sqrt() contidas em<math.h> recebe um double na entrada, calcula sua raiz quadrada e retornaum double como resultado. Esta funcao e declarada como

double sqrt(double); // recebe double, retorna double

Qunado uma funcaao nao retorna nenhum valor, usa-se void para repre-sentar isso. Quando o tipo da saıda nao e especificado, o padrao do compi-lador e assumi-la como int. Quando a entrada da funcao nao e especificadaindica que nao existe dado de entrada. Alguns exemplos,

int square(int); // recebe int, retorna int

double sum(double,double); // recebe 2 double, retorna 1 double

int f(); // n~ao recebe nada, retorna int

void g(double,double); // recebe 2 double, n~ao retorna nada

Page 46: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

5.1 Funcoes 43

h(int); // recebe int, retorna int

Nas declaracoes acima, as variaveis de entrada (chamadas de parametrosou argumentos) e de saıda (chamadas de valores de retorno) possuem apenastipos, sem descricao dos nomes. Os nomes podem ser incluıdos para melhorleitura do codigo, mas serao ignorados pelo compilador.

int square(int i); // retorna i*i

double pow(double base, double exp);

// retorna a base elevado ao expoente

Todas essas declaracoes sao chamadas de prototypes e so os tipos saoimportantes para ele.

Todas as funcoes devem ser definidas em algum lugar do codigo uma unicavez e com suas instrucoes entre chaves.O comando return e usado para quea funcao produza um retorno. A definicao da funcao pode servir como suadeclaracao tambem. Por exemplo, a funcao square() pode ser definida como

int square(int x)

return x*x;

Apos a execucao da funcao no programa principal, a proxima linha seraexecutada.

int i = 5, j, k;

j = square(i); // chamada da func~ao com i = 5

k = j; // apos execuc~ao, k = j;

5.1.2 Passagem de Argumentos

Existem dois mecanismos de passagem de argumentos em C: passagem porvalor ou por referencia. Na passagem por valor, o argumento e avaliadoquando a funcao e chamada e seu valor se torna o valor do parametro durantea sua execucao. O padrao e a passagem por valor, como mostrado no exemploabaixo.

Page 47: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

5.1 Funcoes 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 e5, 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 aexecucao da funcao, i = 5 e j = 30.

Na passagem por referencia, o argumento deve ser uma variavel com umendereco na memoria e o argumento e passado para a funcao como umareferencia, de forma que o parametro se torne apenas um “apelido” do argu-mento 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 umareferencia ao parametro x. Ou seja, as duas variaveis se referem ao mesmoespaco da memoria. Entao qualquer mudanca realizada em x dentro dafuncao, ira afetar i. No caso acima, x e alterado dentro da funcao e assumevalor de 25. Entao, apos a execucao da funcao, i = 25 e j = 30.

Passagem para ponteiros possuem o mesmo efeito de uma passagem porreferencia, ja que os dois ponteiros apontam para o mesmo local. Veja oexemplo de tres variacoes da funcao swap().

Page 48: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

5.1 Funcoes 45

void swap(int& p, int& q)

int tmp = p;

p = q;

q = tmp;

int i = 2, j = 3;

swap(i, j); // Agora i = 3 e j = 2

-----------------------------------

void swap(int* p, int* q)

int tmp = *p;

*p = *q;

*q = tmp;

int i = 2, j = 3;

swap(&i, &j); // Agora i = 3 e j = 2

-----------------------------------

void swap(int p, int q)

int tmp = p;

p = q;

q = tmp;

int i = 2, j = 3;

swap(i, j); // Agora i = 2 e j = 3

A passagem por valor nao muda o valor dos argumentos, enquanto apassagem por referencia ou valor de ponteiros usualmente implica que o valordos argumentos serao alterados durante a chamada da funcao, a nao ser queseja explicitamente especificado para nao fazer isso usando a palavra-chaveconst.

int g(int val, const int& ref)

ref = 5; // Erro!!! Compilador vai reclamar!!

val++;

return(ref + val);

Page 49: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

5.1 Funcoes 46

O nome de um array e um ponteiro const que aponta para o seu pri-meiro elemento. Entao, os argumentos em forma de array sao tratados comoponteiros e possuem o mesmo efeito de uma passagem por referencia.

double h(double* const d, int n)

int i;

double sum = 0.;

for(i=0;i<n;i++)

sum += d[i];

d[n-1] = 1000.; // Mas pode alterar d!

return(sum);

double a[] = 1,2,8,20,-10,30;

double sum, d5;

sum = h(a,6); // Soma dos elementos de a

d5 = a[5]; // d5 = 1000

Ponteiros constantes apontam para locais constantes, ou seja, nao e per-metido alterar o local em que ele aponta. Mas tambem e possıvel nao permitirque o array seja modificado.

double gh(const double* const d, int n)

int i;

double sum = 0.;

for(i=0;i<n;i++)

sum += d[i];

d[n-1] = 1000.; // Peeee!! Erro!!

return(sum);

Qualquer funcao que nao seja declarada como void deve retornar um valor(com excecao de main). Por exemplo,

int square(int& i)

i*=i; // Erro!! Um valor precisa ser retornado!

Page 50: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

5.2 Exercıcios 47

5.2 Exercıcios

I O que esta acontecendo no programa abaixo? Analise a passagem deparametros pelas funcoes.

#include<stdio.h>

// Prototypes

int swap(int* p, int q, double x, double* y)

int i; /* Vc pode definir variaveis na sua

rotina q ja 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 = 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);

Page 51: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

5.2 Exercıcios 48

II Um algoritmo para encontrar a raiz quadrada de um numero real positivoe:

x0 = 1, xn+1 = 1

2

[

xn + bxn

]

, n = 0, 1, 2, . . .

Escreva uma funcao que implemente este algoritmo. Observe Uma rapidaconvergencia (quadratica) no resultado de xn →

√b. Compare a acuracia da

funcao com a funcao intrınseca sqrt() da biblioteca <math.h>.

III Considerando o polinomio de grau n

pn(x) = anxn + an−1x

n−1 + . . . + a1x + a0

Considere os coeficientes do polinomio de grau 8 como um vetor (a[]=1,-8, 28, -56, 70, -56, 28, -8, 1).

a. Escreva uma funcao que avalie este polinomio.

b. O calculo direto de um polinomio nao e eficiente devido a computacaode cada expoente em x. Um metodo eficiente e o algoritmo de Horner(ou multiplicacoes acopladas). A ideia e reescrever pn(x) da seguinteforma:

pn(x) = (. . . ((anx + an−1)x + an−2)x + . . . + a1)x + a0

Isto introduz a seguinte notacao:

un = an;un−1 = unx + an−1;un−2 = un−1x + an−2;...u1 = u2x + a1;u0 = u1x + a0;

Assim, pn(x) = u0. Em princıpio, parece necessario guardar un, un−1, . . . ,e u0 em um array. Porem, isso nao e preciso ja que depois do calculode un−1 o valor de un nao e mais necessario. O algoritmo de Horner eescrito na sequencia.

Page 52: Introdu¸c˜ao `a Programa¸c˜ao em C · J´a o livro “C++ and object-oriented numeric computing for scientists and engineers” de Daoqi Yang ´e uma referˆencia excelente para

5.2 Exercıcios 49

• Inicializa u = an

• for(i = n− 1, n− 2, . . . , 0)u← ux + ai;

Construa uma outra funcao para calcular o polinomio usando o algo-ritmo de Horner.

c. Compare os resultados fornecidos pelas duas funcoes.

IV Exercıcio mais facil nao existe!! Va no seguinte site:

http://www.gnu.org/software/gsl/manual/gsl-ref toc.html#TOC471

Este e o site das bibliotecas livres da GNU (distribuicao livre — de graca!)escritas em C e C++. Sao todas as rotinas existentes para calculo cientıficoda GNU e sao residentes do sistema operacional linux (contudo, podem fun-cionar em compiladores windows). Procure na lista de rotinas o metodo dosmınimos quadrados (Least-Squares Fitting) e estude os exemplos ali coloca-dos.