• Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
587
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
19
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. UNIVERSIDADE FEDERAL DO RIO DE JANEIRO Coordena¸˜o dos Programas de P´s–gradua¸˜o em Engenharia ca o ca Programa de Engenharia Qu´ ımica Laborat´rio de Termofluidodinˆmica o a Introdu¸˜o ` Programa¸˜o em C ca a ca Curso de Extens˜o aLuiz Fernando Lopes Rodrigues Silva, PEQ/COPPE/UFRJ RIO DE JANEIRO, RJ — BRASIL 2005
  • 2. Sum´rio a1 Introdu¸˜o ` Programa¸˜o ca a ca 2 1.1 Interpreta¸˜o do Arquivo–fonte ca . . . . . . . . . . . . . . . . . 2 1.2 Computa¸˜o Cient´ ca ıfica . . . . . . . . . . . . . . . . . . . . . . 3 1.3 Exerc´ıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.4 Primeiro Programa em C . . . . . . . . . . . . . . . . . . . . . 52 Tipos e Operadores B´sicos a 7 2.1 Tipos de Vari´veis . . . . . . . . . . a . . . . . . . . . . . . . . 7 2.1.1 Declara¸˜o de Vari´veis . . . ca a . . . . . . . . . . . . . . 8 2.1.2 Vari´veis Inteiras . . . . . . . a . . . . . . . . . . . . . . 8 2.1.3 Vari´veis de Caracteres . . . . a . . . . . . . . . . . . . . 9 2.1.4 Vari´veis de Ponto Flutuante a . . . . . . . . . . . . . . 10 2.1.5 Vari´veis Booleanas . . . . . . a . . . . . . . . . . . . . . 11 2.2 Tipos de Operadores . . . . . . . . . . . . . . . . . . . . . . . 12 2.2.1 Operadores Aritm´ticos . . . e . . . . . . . . . . . . . . 12 2.2.2 Operadores Relacionais . . . . . . . . . . . . . . . . . . 15 2.2.3 Operadores L´gicos . . . . . . o . . . . . . . . . . . . . . 15 2.3 Exerc´ ıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 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 . . . . . . . . . . . . c . . . . . . . . . . . . . . . . . . . . 23 3.2.1 Comando for . . . . . . . . . . . . . . . . . . . . . . . 23 3.2.2 Comando while . . . . . . . . . . . . . . . . . . . . . . 26 3.3 Exerc´ ıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 Tipos Derivados 31 4.1 Entrada e Sa´ em Arquivo . . . . . . . . . . . . . . . . . . . 31 ıda 4.2 Arrays - Vetores e Matrizes . . . . . . . . . . . . . . . . . . . 35
  • 3. ´SUMARIO ii 4.3 Ponteiros e Referˆncia . . . . . . . . . . . . . . . . . . . . . . 37 e 4.4 Exerc´ ıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385 Sub-rotinas 42 5.1 Fun¸˜es . . . . . . co . . . . . . . . . . . . . . . . . . . . . . . . 42 5.1.1 Declara¸˜o e ca Defini¸˜o de Fun¸˜o ca ca . . . . . . . . . . . . 42 5.1.2 Passagem de Argumentos . . . . . . . . . . . . . . . . 43 5.2 Exerc´ıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
  • 4. Pref´cio aAtualmente em qualquer ´rea de atua¸˜o profissional, o computador se torna a cauma ferramenta cada vez mais presente. Seja para montar um relat´rio para oa empresa, estruturar uma apresenta¸˜o sobre suas atividades e progressos, caexecutar tarefas repetitivas de an´lise de dados em uma f´brica, entre muitas a aoutras fun¸˜es. Mas o principal objetivo deste curso ´ mostrar os meios co ede uso do computador como ferramenta cient´ ıfica para realizar c´lculos de amodo eficiente. Em outras palavras, como analisar um problema qualquer eestruturar uma metodologia de solu¸˜o de forma que o computador entenda cao que o usu´rio quer, execute os comandos o mais r´pido poss´ e forne¸a a a ıvel cresultados confi´veis. a O objetivo desta apostila ´ apenas de colocar as informa¸oes b´sicas sobre e c˜ aa linguagem de programa¸˜o C de modo a auxiliar o treinamento do aluno cadurante o curso. Como alguns t´picos ser˜o colocados em sala de aula, eu o acoloquei alguns c´digos com espa¸o suficiente para que vocˆs possam anotar o c eas discuss˜es. A descri¸˜o da linguagem n˜o depende do sistema operacio- o ca anal, seja Windows, Linux, DOS, MacOS, UNIX, desde que um compilador Cesteja instalado. Existem duas referˆncias sobre C que eu gostaria de passar epara vocˆs. A primeira ´ o livro de Brian W. Kernighan e Dennis M. Ritchie e eintitulado “C — A linguagem de programa¸˜o padr˜o ANSI”. Estes autores ca aforam os desenvolvedores da linguagem C e apesar do livro possuir um bomconte´ do, seus exemplos s˜o mais voltados para manipula¸˜o de caracteres. u a caJ´ o livro “C++ and object-oriented numeric computing for scientists and aengineers” de Daoqi Yang ´ uma referˆncia excelente para programa¸˜o ci- e e caent´ıfica. Apesar de ser um livro de C++, muitos fundamentos b´sicos de C as˜o usados e vale (muito!!) a pena dar uma olhada nele. a Espero que gostem do curso, Luiz Fernando L. R. Silva PEQ/COPPE/UFRJ 21/07/2005
  • 5. Cap´ ıtulo 1Introdu¸˜o ` Programa¸˜o ca a ca1.1 Interpreta¸˜o do Arquivo–fonte caOs programas de computador s˜o formados por uma s´rie de instru¸˜es que a e coo computador executa. Quando vocˆ cria um programa, precisa especificar eas instru¸˜es que o computador precisar´ executar para realizar as opera¸˜es co a codesejadas. A defini¸˜o destas instru¸˜es ´ que vocˆ deve fazer e salvar em ca co e eum arquivo, chamado de arquivo ou c´digo fonte. O arquivo fonte de um oprograma escrito em C deve possuir a extens˜o C (ex. arqfonte.c). O ar- aquivo fonte ´ o modo do programador montar a sua l´gica de programa¸˜o e e o cacomunicar isso ao computador. Mas o computador n˜o entende diretamente ao arquivo fonte e precisa de um tradutor, chamado de compilador. Para criarprogramas, ´ imperativo e necess´rio que o compilador esteja instalado no e acomputador. O compilador converte as instru¸˜es colocadas no arquivo fonte copara a linguagem de m´quina (bin´ria — 0 ou 1) que o computador compre- a aende. Os arquivos gerados com a extens˜o EXE ou COM cont´m o c´digo a e ode m´quina e podem ser executados pelo computador. A Fig. 1.1 ilustra aesse processo de gera¸˜o do c´digo fonte, compila¸˜o e cria¸˜o do arquivo ca o ca caexecut´vel. a
  • 6. 1.2 Computa¸˜o Cient´ ca ıfica 3 Figura 1.1: Convers˜o do c´digo fonte para c´digo de m´quina. a o o a1.2 Computa¸˜o Cient´ ca ıficaEm qualquer aplica¸˜o cient´ ca ıfica, a eficiˆncia computacional ´ muito impor- e etante e o programador deve sempre ficar atento a esse detalhe. Mas comomontar um programa de forma eficiente? Bem, antes de pensar em pro-grama¸˜o propriamente dita deve–se estruturar muito bem qual ´ o problema ca ee qual a melhor forma de resolvˆ–lo. Se isso n˜o estiver bem assentado na e acabe¸a do programador, ´ melhor parar por a´ e come¸ar a ler o seu problema c e ı cnovamente. Afinal de contas, como vocˆ vai resolver o seu problema de forma eeficiente, se nem sabe ainda como resolvˆ–lo? e Dica de programa¸˜o do L.F. ca Antes de pensar em programar, organize as id´ias no papel. Mes- e mo para os problemas mais simples. Sempre!! A princ´ ıpio pode parecer perda de tempo, mas a facilidade de estruturar o seu c´digo fonte ser´ recompensadora. o a As etapas necess´rias de solucionar o problema ´ o que vamos chamar de a emetodologia de algoritmo e a forma como estas etapas s˜o executadas est´ a ainclu´ na l´gica de programa¸˜o. Estas defini¸˜es v˜o ficar mais claras ao ıda o ca co aanalisarmos um exemplo.1 Exemplo da distˆncia percorrida pelo carro com acelera¸ao constante. a c˜
  • 7. 1.3 Exerc´ ıcios 4 Bem, temos o problema nas m˜os, ou seja, um modelo matem´tico a ser a aresolvido. 1 S = S0 + v0 t − at2 (1.1) 2 Quais s˜o as perguntas que sempre devemos fazer para estruturar a me- atodologia do algoritmo? • Qual o meu objetivo? Calcular S!!! ⇒ Ent˜o, essa ´ a ultima coisa a e ´ com que devemos nos preocupar. • O que eu preciso para calcular S? S0 , v0 , a e t. ⇒ Aaah, ent˜o eu a tenho que me preocupar em saber os valores dessas vari´veis antes de a calcular S... - Atribuir valores para S0 , v0 , a e t. - Existe alguma restri¸˜o num´rica e/ou f´ ca e ısica no meu modelo? ⇒ N˜o existe tempo negativo. a ♦ Condi¸˜o para que o programa rejeite valores negativos de ca tempo. • Calculamos S. • Mostramos ao usu´rio o resultado. ⇒ Sen˜o, n˜o adianta nada, n´? a a a e 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 tamb´m) vocˆs sempre montassem o algoritmo de e esolu¸˜o. Vocˆs notar˜o que, com o tempo e a pr´tica, estruturar a solu¸˜o de ca e a a caum problema ficar´ muito mais f´cil e poder´ at´ ser feita automaticamente. a a a ePodem confiar.1.3 Exerc´ ıciosI Monte a estrutura de solu¸˜o para os problemas abaixo. ca
  • 8. 1.4 Primeiro Programa em C 5 1) A troca de calor em um reator n˜o isot´rmico precisa ser otimizada. a eVocˆ foi incumbido de calcular a quantidade de calor trocada entre o reator ee o meio ambiente. O modelo de troca t´rmica est´ colocado abaixo, onde Q e a´ a quantidade de calor trocada, UA ´ o coeficiente global de transferˆnciae e ede calor, Tr ´ a temperatura do reator e T∞ ´ a temperatura do ambiente. e e Q = UA(Tr − T∞ ) (1.2) 2) A Ba´ de Guanabara possui uma concentra¸˜o de petr´leo que est´ ıa ca o ase dispersando com o passar do tempo. A dispers˜o de petr´leo na ba´ segue a o ıao modelo descrito na Eq. 1.3 onde Cp ´ a concentra¸˜o de petr´leo no instante e ca ot, Cp0 ´ a concentra¸˜o inicial de petr´leo e A ´ a ´rea onde o petr´leo est´ e ca o e a o adisperso. Contudo, a ´rea de dispers˜o do petr´leo varia devido ` condi¸˜es a a o a coclim´ticas e com o pr´prio tempo. Um modelo (Eq. 1.4) descreve a varia¸˜o a o ca o a a ¯ eda ´rea em que o petr´leo est´ disperso, onde o parˆmetro M ´ uma m´dia a edos efeitos clim´ticos. a Cp = Cp0 e−At (1.3) ¯ A = M e−t (1.4)1.4 Primeiro Programa em CAgora que j´ vimos como montar os nossos problemas de uma forma estru- aturada, j´ podemos ver um primeiro exemplo de programa¸˜o em C. Note a caque ainda n˜o vimos nenhum comando desta linguagem e este exemplo ir´ a aservir apenas como uma forma de come¸armos uma discuss˜o em torno da c al´gica de programa¸˜o em C. o ca Um programa em C necessariamente deve conter a fun¸˜o main() que cacontˆm as instru¸˜es (ou comandos) entre entre { e }. Cada comando pode e coser escrito em mais de uma linha e deve ser terminado por um ponto ev´ ırgula (; — se n˜o tiver, vai dar erro na compila¸˜o do programa). Os a cacoment´rios no c´digo fonte est˜o entre /* e */ (todo o texto entre esses dois a o as´ ımbolos ´ desconsiderado pelo compilador) ou precedidos por // (a linha etoda fica comentada). Os coment´rios podem conter v´rias informa¸˜es sobre a a coo problema (qual o problema a ser resolvido, qual a metodologia que vai serutilizada, quem programou o c´digo, quando, etc.), o c´digo fonte (o porquˆ o o ede usar um comando espec´ ıfico) ou mesmo detalhes de como usar o programa
  • 9. 1.4 Primeiro Programa em C 6depois de compilado. A princ´ıpio, comentar o arquivo fonte pode parecer umatarefa exaustiva, por´m estes s˜o muito uteis para o entendimento futuro do e a ´c´digo. o Dica de programa¸˜o do L.F. ca Sempre comente o seu c´digo. N˜o preciso colocar os porquˆs, o a e apenas comente!!!!! O objetivo deste primeiro programa ´ simplesmente escrever uma mensa- egem na tela para o usu´rio. O c´digo fonte est´ colocado a seguir. a o a/* Este ´ um simples programa para escrever na tela e uma mensagem de texto. Programado por: Luiz Fernando L. R. Silva */#include<stdio.h> // Biblioteca padr~o I/O em tela amain(){ // Comando para escrever em tela. printf("Eu adoro programar em C");} As trˆs primeiras linhas do c´digo s˜o coment´rios (est˜o entre /* e */) e e o a a acolocam algumas informa¸˜es sobre o programa. Os outros coment´rios desse co aprograma s˜o menores e s˜o precedidos por duas barras //. As bibliotecas em a aC contˆm v´rios comandos e fun¸˜es padr˜es para auxiliar na programa¸˜o. e a co o caPara habilitar esses comandos, ´ necess´rio declarar as bibliotecas no in´ e a ıciodo programa. A biblioteca padr˜o que contˆm os comandos de entrada e a esa´ de dados em tela chama-se <stdio.h> e est´ declarada logo ap´s o ıda a oprimeiro coment´rio. Essa declara¸˜o habilita que o programador use todos a caos comandos de entrada e sa´ padr˜o em tela. O comando printf efetua essa ıda aopera¸˜o mostrando ao usu´rio a seguinte mensagem: Eu adoro programar ca aem C. Pronto, o nosso primeiro programa est´ pronto. a
  • 10. Cap´ ıtulo 2Tipos e Operadores B´sicos a2.1 Tipos de Vari´veis aVamos considerar a seguinte express˜o matem´tica: a a z =y+i∗x (2.1) Para que a Eq. 2.1 fa¸a sentido em no c´digo fonte, os identificadores 1 c ox, y, z e i devem ser declarados de forma adequada. Todos os identificadoresdevem ser declarados antes de serem usados. As declara¸˜es introduzem coentidades representadas por seus identificadores e seus tipos (ex. inteiro oucaractere). Os tipos das vari´veis fornecem propriedades diferentes tanto na forma ade armazenamento da vari´vel na mem´ria RAM quanto na pr´pria mani- a o opula¸˜o e opera¸˜o da vari´vel. Existem opera¸˜es que s´ s˜o poss´ ca ca a co o a ıveis ous˜o muito mais eficientes se realizadas com um determinado tipo de vari´vel. a aif( i == 0 ){ /* realiza os comandos aqui dentro */ } 1 Os identificadores s˜o as letras usadas para identificar as suas vari´veis. a a
  • 11. 2.1 Tipos de Vari´veis a 82.1.1 Declara¸˜o de Vari´veis ca aA declara¸˜o das vari´veis no c´digo fonte indica que o programa deve re- ca a oservar um espa¸o na mem´ria RAM para cada vari´vel declarada. Vamos c o aconsiderar que a mem´ria RAM est´ distribu´ como na Fig. 2.1.1 e divi- o a ıdadida em bytes. Figura 2.1: Representa¸˜o da mem´ria RAM subdividida em bytes. ca o Agora vamos considerar que no in´ do programa as vari´veis i e z este- ıcio ajam sendo declaradas e portanto, um espa¸o na mem´ria deve ser reservado. c oEste procedimento ´ o que chamamos de aloca¸˜o de espa¸o na mem´ria. e ca c oDeste modo, os valores que forem atribu´ ıdos nestas vari´veis ficam alocados aem um endere¸o espec´ c ıfico da mem´ria RAM. A quantidade de mem´ria que o odeve ser reservada depende do tipo da vari´vel. a Figura 2.2: Aloca¸˜o de vari´veis na mem´ria RAM. ca a o2.1.2 Vari´veis Inteiras aCada vari´vel inteira ocupa 2 bytes de mem´ria e o valor armazenado na a omem´ria n˜o inclui a parte fracion´ria. Um exemplo segue abaixo. o a a#include<stdio.h>main(){ int i; // Declara¸~o de i como inteira ca
  • 12. 2.1 Tipos de Vari´veis a 9 int j,k; /* Declara¸~o de j e k como inteiros. ca ´ poss´vel declarar mais de uma E ı vari´vel por linha */ a int ii = 123; // Ao declarar ii, j´ atribuo um valor. a i = 2; // Atribui¸~o do valor 2 para a vari´vel i ca a j = i; // Atribui¸~o do valor contido em i para j ca k = 2.3; /* N~o considera a parte fracion´ria! a a k assume o valor de 2 */ /* Sa´da em tela das vari´veis*/ ı a 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´veis de Caracteres aCada vari´vel caractere ocupa 1 byte na mem´ria e armazena valores inteiros a oque s˜o convertidos em caracteres ASCII (o valor do inteiro 98 corresponde ao acaractere ’b’ no conjunto ASCII). Normalmente, o que se quer ´ uma vari´vel e aque armazene um conjunto de caracteres para que seja poss´ ıvel construirpalavras ou senten¸as. Alguns caracteres s˜o especiais e possuem algumas c afun¸˜es espec´ co ıficas. Caractere Fun¸˜o espec´ ca ıfica n nova linha t tabula¸˜o horizontal ca v tabula¸˜o vertical ca a alerta sonoro r cursor volta para o in´ da linha ıcio b backspace Tabela 2.1: Caracteres especiais para operar a sa´ de dados. ıda Um exemplo (extremamente idiota!) de aplica¸˜o de caracteres. ca#include <stdio.h>#include <conio.h>
  • 13. 2.1 Tipos de Vari´veis a 10main(){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: %cn", 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 Vari´veis de Ponto Flutuante aAs vari´veis de ponto flutuante s˜o capazes de armazenar as casas decimais a ade um n´ mero. Existem duas classifica¸˜es para as vari´veis de ponto flutu- u co a
  • 14. 2.1 Tipos de Vari´veis a 11ante, com precis˜o simples (normalmente com 6 casas decimais) ou de dupla aprecis˜o (normalmente com 15 casas decimais). Um exemplo quantifica bem aa diferen¸a entre esses dois tipos de vari´veis. c a#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.19fn", pi_float); printf("Valor com precisao dupla : %21.19fn", pi_double); return(1);} Compilando e executando o c´digo acima em um AthlonXP 2.2GHz, os oresultados para π est˜o colocados abaixo. aValor com precisao simples : 3.1415927410125732000Valor com precisao dupla : 3.1415926535897931000 Obs.: executem o programa colocado acima mudando a referˆncia %21.19f eda vari´vel de ponto flutuante. Mude o n´ mero das casas decimais, o n´ mero a u udos espa¸os reservados para a vari´vel e troque o f do ponto flutuante por c a%g, %e e %E. Vejam e analisem as mudan¸as.c2.1.5 Vari´veis Booleanas aUm booleano, representado por bool, pode armazenar dois valores: true oufalse, e ´ usado para expressar os resultados de express˜es l´gicas. e o o
  • 15. 2.2 Tipos de Operadores 12bool flag = true; // declara¸~o de flag como booleana cadouble d;/* Algum c´digo no meio do caminho, que pode o eventualmente mudar o valor de flag */d = 3.14;if(flag == false){ d = 2.718; }/* E o programa continua... */ Algumas compara¸˜es est˜o descritas na tabela abaixo. co a true && true = true true || true = true true && false = false true || false = true false && true = false false || true = true false && false = false false || false = false Tabela 2.2: Compara¸˜es de booleanos — && significa E; || significa OU co Por defini¸˜o, false tem o valor 0 e true tem valor 1. Por isso, pessoal- camente, eu n˜o uso vari´veis booleanas, mas um inteiro com valor de 0 (falso) a aou 1 (verdadeiro).2.2 Tipos de OperadoresPronto, j´ sabemos quais s˜o os tipos de vari´veis que existem e agora esta- a a amos aptos a realizar opera¸˜es com elas. co2.2.1 Operadores Aritm´ticos eS˜o os operadores b´sicos de soma (+), subtra¸˜o (−), multiplica¸˜o (∗) a a ca ca a ´e divis˜o (/). E muito importante entender o tipo de vari´vel que se est´ a aoperando, pois perda de informa¸˜o pode ocorrer. Veja o exemplo a seguir. ca
  • 16. 2.2 Tipos de Operadores 13double m = 13/4; /* ´ uma opera¸~o entre dois inteiros, e vai e ca fornecer um resultado inteiro!! m = 3, as casas decimais s~o ignoradas */ adouble n = 3/4; /* n = 0 */double y = 3.0/4; /* Ao operar, o inteiro 4 ´ convertido para e double! y = 0.75 */double y = 3/4.0; /* Idem, 3 ´ convertido em 3.0! y = 0.75 */ e As opera¸˜es matem´ticas s˜o iniciadas da esquerda para a direita. A co a amultiplica¸˜o e a divis˜o possuem uma maior precedˆncia em rela¸˜o ` soma ca a e ca ae subtra¸˜o. Contudo, o que est´ contido nos parˆnteses possue uma pre- ca a ecedˆncia maior que a dos operadores. Vejamos as etapas de execu¸˜o das e caexpress˜es colocadas no exemplo abaixo. oint 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 programa¸˜o do L.F. ca Sempre que vocˆ tiver d´vidas sobre a ordem das opera¸˜es, use e u co o parˆnteses sem medo de ser feliz. eint m;m = ((5+3)*2) - 3; /* m = (8*2) - 3;
  • 17. 2.2 Tipos de Operadores 14 m = 16 - 3; m = 13; */ Os operadores de incremento (++) e decremento (−−) s˜o muito usados aem qualquer programa C, pois facilitam a leitura do c´digo (alguns dizem oquem n˜o...). aint conta = 0;int m = 2;conta++; /* Essa opera¸~o pode ca ser substitu´da por: ı conta = conta + 1; (conta = 1) */conta--; /* Essa opera¸~o pode ca ser substitu´da por: ı conta = conta - 1; (conta = 0) */++m; /* m = 3; */m = conta++; /* m = 0; conta = 1;*/ Vamos analisar o seguinte c´digo (em aula). o#include<stdio.h>int main(){ int valor = 1; printf("Usando depois da variavel : %dn", valor++); printf("Valor apos incremento: %dn", valor); valor = 1; printf("Usando depois da variavel : %dn", ++valor); printf("Valor apos incremento: %dn", valor); return(1);} Ainda ´ poss´ realizar opera¸˜es de atribui¸˜o da seguinte maneira. e ıvel co catotal += 100; // Significa: total = total + 100;conta -= 5; // Significa: conta = conta - 5;metade /=2; // Significa: metade = metade/2;
  • 18. 2.2 Tipos de Operadores 152.2.2 Operadores RelacionaisOs operadores relacionais s˜o > (maior que), < (menor que), >= (maior ou aigual a), <= (menor ou igual a), == (igual a) e ! = (n˜o igual). A nota¸˜o ! ´ a ca eo operador de nega¸˜o. O resultado destas opera¸˜es ´ sempre um booleano. ca co eint x = 5;bool b, c;b = (x < 6); // b = true, j´ que x ´ menor que 6 a ec = (x == 0); // b = false, j´ que x n~o ´ 0 a a eif(b != c) // Se b n~o ´ igual a c, x = 17 a e x = 17;if(b) // Se b ´ true, ent~o fa¸a x = 19 e a c x = 19;if(!b) // Se b ´ false, ent~o fa¸a x = 221 e a c x = 221; Deve-se tomar muito cuidado ao usar essas opera¸˜es. Considere o exem- coplo abaixo.int m = 7;bool b, c;b = 3 < m < 9; // b = truem = 20;c = 3 < m < 9; // c = true Os operadores relacionais s˜o executados da esquerda para a direita, por aisso a express˜o 3 < m < 9 ´ equivalente ` (3 < m) < 9. Ent˜o, esta a e a aexpress˜o sempre ´ avaliada como true pois 3 < m pode ser tanto 1 (true) a equanto 0 (false).2.2.3 Operadores L´gicos oOs operadores l´gicos, assim como os relacionais, resultam em um valor bo- ooleano. Esses operadores s˜o && (e) e || (ou) e posuem uma precedˆncia a e
  • 19. 2.3 Exerc´ ıcios 16maior que os operadores relacionais (s˜o executados antes). A Tabela 2.2 amostra as rela¸˜es com os booleanos. Veja os exemplos a seguir. cobool b =true, c = false;bool d = b && c; // d = falsebool e = b || c; // e = truebool f = (e == false) && c; // f = falsebool g = (d == true ) || c; // g = falsebool h = (d = true ) || c; // h = true Vamos agora rever a express˜o 3 < m < 9. A maneira correta de progra- amar esta express˜o em C seria a(3 < m) && (m < 9) Como o operador < possue uma precedˆncia maior que o operador &&, eos dois pares de parˆnteses poderiam ser omitidos. e2.3 Exerc´ ıciosI As vari´veis a, b, c, d, e, f e g foram inicializadas com os seguintes valores: aa = 3. b = 2. c = 5. d = 4. e = 10. f = 2. g = 3. Efetue as seguintes express˜es em C : o 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)
  • 20. 2.3 Exerc´ ıcios 17II Analise o c´digo abaixo para calcular a m´dia das notas de um aluno. o ePrograme este c´digo e retire alguns dos coment´rios e comente alguns co- o amandos para entender como o c´digo funciona. o/*C´lculo da m´dia dos alunos*/ a e#include <stdio.h>int main(){ double M,P1,P2;// Entrada de dados pelo c´digo o P1 = 5.0; P2 = 7.5;/* Entrada de dados em tela printf("Digite o valor da primeira prova P1n"); printf("Digite o valor da segunda prova P2n"); scanf("%16le",&P1); scanf("%16le",&P2);*/// C´lculo da m´dia a e// C´lculo direto a M=(P1+P2)/2.;// C´lculo em duas etapas a//M = P1 + P2;//M /= 2; if(M >= 7.) { printf("O aluno esta aprovadon"); } else { printf("O aluno devera fazer prova finaln"); } printf("A media do aluno e: %.2fn",M); return(1);}III Fa¸a um programa em C que calcule a velocidade em queda livre de cum corpo a 6 m de altura. Sabe-se que a f´rmula de queda livre ´ dada por √ o ev = 2gh, onde g = 9.81. Fa¸a um outro programa em que seja poss´ que c ıvelo usu´rio entre na tela com o valor da altura (cuidado, porque at´ onde eu a e
  • 21. 2.3 Exerc´ ıcios 18sei e os limites da f´ ısica permitem, n˜o existe altura negativa). aIV Fa¸a um programa em C que leia uma temperatura em graus Farenheit, cconverta-a para uma temperatura absoluta em kelvins, e escreva o resultado.A f´rmula de convers˜o ´: o a e 5. T (K) = [T (F ) − 32.0] + 273.15 (2.2) 9.V O coseno hiperb´lico ´ definido pela equa¸˜o: o e ca ex + e−x cosh(x) = (2.3) 2. Escreva um programa em C para calcular o coseno hiperb´lico para um ovalor x fornecido pelo usu´rio. Use o programa para calcular o coseno hi- aperb´lico de 3.0. Compare a resposta que seu programa fornece com a res- oposta produzida pela fun¸˜o intr´ ca ınseca do C cosh(x), contida na biblioteca<math.h>.
  • 22. Cap´ ıtulo 3Fluxos de Controle3.1 Condicionais3.1.1 Comando if–else ifA forma mais simples de um condicional ´ o comando if, cuja sintaxe ´: e eif(condi¸~o) express~o ca a onde condi¸˜o ´ uma express˜o l´gica que possui valor de true ou false, e ca e a oexpress˜o pode ser apenas um ou v´rios comandos. A express˜o ´ executada a a a equando o valor de condi¸˜o ´ avaliado em true, sen˜o a express˜o n˜o ´ ca e a a a eexecutada. A condi¸˜o deve estar entre parˆnteses. ca eif(n>10) x*=10; // Qdo n>10, fa¸a x*=10 cif(n==0) { // Qdo n ´ 5, fa¸a x*=5 e cx*=5;}if(n) y*=7; // Qdo n!=0, fa¸a y*=7 c Os condicionais devem ser usados com cuidado quando a express˜o requer aa compara¸˜o de vari´veis n˜o inteiras. Considere x e y como vari´veis de ca a a a
  • 23. 3.1 Condicionais 20ponto flutuante, a condi¸˜o if(x == y) deve ser substitu´ por if(fabs(x - y) ca ıda< erro) onde erro ´ um n´ mero muito pequeno definido pelo usu´rio e fabs ´ e u a ea fun¸˜o matem´tica que retorna o valor absoluto de uma vari´vel de ponto ca a aflutuante. Dica de programa¸˜o do L.F. ca Tome muito cuidado ao avaliar vari´veis em ponto flutuante. a Note ainda que existe diferen¸a entre == e =! Aqui, o pro- c gramador pode e deve “usar e abusar” dos parˆnteses e dos e operadores l´gicos e relacionais. o O condicional if pode ser acompanhado pela parte opcional else.if(condi¸~o) ca express~o1 aelse express~o2 a onde, se a condi¸˜o for avaliada como true, a express˜o1 ´ executada ca a eenquanto a express˜o2 ´ desprezada. Se a condi¸˜o retornar um valor false, a e caa express˜o1 ´ desprezada e a express˜o2 ´ executada. Ainda ´ poss´ a e a e e ıvelcombinar os condicionais if–else da seguinte maneira:if(condi¸~o1) ca express~o1 aelse if(condi¸~o2) ca express~o2 aelse if(condi¸~o3) ca express~o3 aelse express~o4 a onde a express˜o1 ´ executada s´ e somente s´ se a condi¸˜o1 for true. a e o o caSe for true, todo o resto do bloco ´ ignorado; e se for false a express˜o1 n˜o e a a´ executada e a condi¸˜o2 ´ testada. Se a ultima for true, a express˜o2 ´e ca e ´ a e
  • 24. 3.1 Condicionais 21avaliada e o resto do bloco ´ desprezado, enquanto se a condi¸˜o2 for false o e caresto do bloco ´ ignorado. Esse procedimento ´ repetido at´ o final do bloco, e e eonde se nenhuma das condi¸˜es forem true, a express˜o4 ser´ executada. co a aNote que a ultima express˜o ´ um caso que n˜o possui nenhuma restri¸˜o e ´ a e a caser´ efetuado sempre que nenhuma das condi¸˜es anteriores forem satisfeitas. a co Vamos ver o exemplo abaixo. O programador quer montar uma estruturaque retorne os parˆmetros f´ a ısicos da ´gua. Por´m, at´ onde eu sei e a f´ a e e ısicaexplica, dependendo da temperatura, a ´gua pode se apresentar na forma as´lida, l´ o ıquida ou gasosa e seus parˆmetros f´ a ısicos dependem de sua forma.Como fazer isso?// Usu´rio entra com T (em K) aprintf("Entre com a temperatura da agua (K)");scanf("%16le",&T);printf("n");if(T <= 273.15){ // Gelo! // Calcula par^metros para gelo a}else if((T >= 273.15) && (T <= 373.15)){ // L´quido! ı // Calcula par^metros para ´gua l´quida a a ı}else{ // S´ sobrou o vapor (fora o plasma!!) o // Calcula par^metros para vapor d’´gua a a}3.1.2 Comando switchO comando switch ´ muito usado em situa¸˜es de m´ ltipla escolhas. Este e co utesta o valor da condi¸˜o, colocada entre parˆnteses ap´s a palavra chave ca e oswitch. Ent˜o este valor ´ usado como um controle de escolha para os casos a eque satisfazem esse valor. Se o valor n˜o satisfaz nenhum caso, o controle ir´ a apara o caso default. O comando break ´ usado para sair do comando switch. e
  • 25. 3.1 Condicionais 22 Vamos analisar o exemplo abaixo, onde o programador quer calcular ocoeficiente de transferˆncia de calor em alguns casos especificados. Sabe-se eque os modelos matem´ticos s˜o diferentes para cada situa¸˜o f´ a a ca ısica, ent˜o adevemos colocar restri¸˜es no usos destes ou deixar que o usu´rio especifique co ao 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 par^metros dos modelos, n´? a e // Se n~o j´ era!!!! a aprintf("Lista de opcoes para calcular o coeficiente ");printf("de transferencia de calor:n");printf("A - Modelo para Conveccao Interna em tubosn");printf("B - Modelo para Conveccao Externan");printf("C - Modelo para Conveccao Naturaln");printf("D - Modelo para Conveccao com condensacaon");printf("Entre com sua opcao : ");letra = getch();// Transforma letra min´scula em mai´scula u uletra = toupper(letra);printf("n");// Vamos escolher qual modelo? Depende do q o usu´rio quer... aswitch (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
  • 26. 3.2 La¸os c 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 condi¸~es foram satisfeitas co printf("Esse caractere nao e valido. Foi mal...n");};return (1);} Dica de programa¸˜o do L.F. ca Vocˆ sabia que os condicionais s˜o um dos comandos mais com e a maior custo computacional que existem? Se quiser montar um programa com menor custo de computa¸˜o, use o me- ca nor n´mero de condicionais poss´ u ıvel e somente quando for necess´rio. a3.2 La¸os c3.2.1 Comando forO la¸o for ´ muito utilizado e extremamente conveniente de ser usado. Sua c eforma geral est´ colocada abaixo. afor(inicia;condi¸~o;express~o) ca a comandos
  • 27. 3.2 La¸os c 24 A inicia representa a inicializa¸˜o da vari´vel de controle do la¸o, a ca a ccondi¸˜o fornece um controle para determinar se o la¸o deve continuar a ca cser executado e express˜o indica como a vari´vel inicializada deve ser ava- a aliada a cada vez que os comandos s˜o executados. O la¸o ´ continuamente a c eexecutado at´ que a condi¸˜o seja avaliada como false. Este processo de e carepeti¸˜o ´ chamado itera¸˜o. Vamos ver o seguinte exemplo. ca e caint i;for(i=3;i<50;i*=2){ printf("%dn",i); } O exemplo ir´ retornar na tela os inteiros 3, 6, 12, 24 e 48. O valor inicial a´ 3. Como a condi¸˜o i < 50 ´ true, 3 aparece na tela. Ent˜o, a express˜oe ca e a ai∗ = 2 fornece o segundo valor de i que ´ 6. Como i < 50 ainda ´ true, 6 e etamb´m ´ retornado na tela. Este processo ´ repetido at´ que i∗ = 2 forne¸a e e e e c96, one i < 50 ´ false. e O que acontece no exemplo abaixo?int i;for(i=3;i>5;i*=2){ printf("%dn",i); } Nada!! A condi¸˜o n˜o ´ satisfeita quando i = 3 e portanto o la¸o n˜o ´ ca a e c a eexecutado, muito menos a express˜o i∗ = 2. a O comando break pode ser usado para terminar a execu¸˜o do la¸o, e o ca ccontinue para a execu¸˜o da itera¸˜o atual e passa para a pr´xima. Para ca ca odeixar mais claro, vamos ver o exemplo.int i;for(i=3;i<50;i*=2){ if(i == 6) continue; // Passa para a pr´xima itera¸~o o ca printf("%dn",i); if(i == 24) break; // P´ra a execu¸~o do la¸o qdo i ´ 24 a ca c e}
  • 28. 3.2 La¸os c 25 Os inteiros 3, 12, 24 ir˜o aparecer na tela. Quando i for 6, o valor de i an˜o ser´ retornado na tela j´ que o comando continue faz com que o controle a a av´ para a pr´xima itera¸˜o com i = 6 ∗ 2 = 12. Quando i = 24, o la¸o ´ a o ca c eterminado devido ao comando break. Dica de programa¸˜o do L.F. ca Muito cuidado! Ao usar for, n˜o altere o valor do contador dentro a do la¸o, pois isso ´ uma alta fonte de erros. c e Um la¸o pode ser acoplado como qualquer outra express˜o. Por exemplo, c aint i,j;double a = 0.;for(i=0;i<100;i++){ for(j=200;j<=500;j++) a+=i-j; // int s~o convertidos para double a}computa a seguinte equa¸˜o ca 99 500 (i − j) (3.1) i=0 j=200 eint 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 equa¸˜o (Putz!) ca 4 27 5 (i + j 2 ) (3.2) i=1 j=−3
  • 29. 3.2 La¸os c 26 Dica de programa¸˜o do L.F. ca Fa¸am a programa¸˜o de Chinˆs. Ao montarem um la¸o, exe- c ca e c cutem cada comando no papel e vejam se os resultados est˜o a chegando ao que vocˆ tinha em mente. Mas execute cada co- e mando mesmo! Vocˆs v˜o exercitar a vis˜o de programa¸˜o e e a a ca fica mais dif´ de deixar o programa com erros (pelo menos ıcil nessa parte que vocˆ fez o chinˆzinho). e e3.2.2 Comando whileO comando while possui a seguinte formawhile(condi¸~o) ca comandos Os comandos s˜o executados at´ que a condi¸˜o seja avaliada em false. a e caSe o valor inicial da condi¸˜o for falso, os comandos nunca ser˜o executados. ca aPor exemplo,int i = 0;while(i<=100){ printf("%d",i++);} O comando entre as chaves ser´ executado at´ que i <= 100 n˜o seja a e amais true. O la¸o seguinte n˜o ir´ retornar para a tela nenhum valor j´ que c a a asua condi¸˜o inicial ´ false. ca eint 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++); }
  • 30. 3.3 Exerc´ ıcios 27 O comando do-while ´ parecido com o la¸o while, por´m possui a seguinte e c eforma.do comandoswhile(condi¸~o) ca A execu¸˜o dos comandos ´ continuada at´ que a condi¸˜o seja avali- ca e e caada como false. Neste caso, os comandos ser˜o executados pelo menos uma avez. Os comandos continue e break tamb´m podem ser usados dentro dos ecomandos while e do-while.3.3 Exerc´ ıciosI As linhas de comando seguintes implementadas em C tem a fun¸˜o de caalertar oralmente o usu´rio de perigosas leituras de temperatura em um sis- atema de controle (valores em graus Fahrenheit). Este procedimento de avisoest´ correto ou incorreto? Se estiver incorreto, explique porque e corrija-o a(n˜o programe!! Fa¸a no papel!!). a cif( 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 la¸o acoplado para escrever o programa que computa a soma c 100 300 cos(i2 + j) (3.3) i=0 j=5
  • 31. 3.3 Exerc´ ıcios 28III Escreva um programa em C para calcular a fun¸˜o ca 1 y(x) = ln( ) (3.4) 1−x para qualquer valor de x pr´-especificado pelo usu´rio, onde ln ´ o loga- e a eritmo natural ( logaritmo na base e). Escreva o programa com um la¸o while cde forma que o programa repita o c´lculo para cada valor legal de x aplicado aao 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.    −3t2 + 5, t≥0 y(t) = (3.5) 3t2 + 5, t>0   Escreva o resultado em tela e depois em um arquivo de sa´ (neste ultimo ıda ´caso, crie intervalos de 0.1 entre -9 e 9).V Fa¸a um programa em C que calcule o resultado num´rico e anal´ c e ıtico daseguinte s´rie, onde o usu´rio entra com o n´ mero de pontos N do somat´rio: e a u o N 1 Snum = n=1 n 2 π2 Sana = (3.6) 6 Compare os resultados num´ricos fornecidos para diferentes valores de N ecom o resultado anal´ ıtico.VI O m´todo de Newton-Raphson ´ uma metodologia iterativa de solu¸˜o e e cade equa¸˜es n˜o lineares. Ou seja, um m´todo num´rico que encontre o(s) co a e e
  • 32. 3.3 Exerc´ ıcios 29valores de x que fa¸am com que f (x) = 0. Como estamos em um computa- cdor e trabalhando com vari´veis de ponto flutuante, deve-se assumir que o aobjetivo de x foi atingido quando f (x) ´ menor que um erro pr´-definido. O e em´todo de Newton-Raphson ´ colocado abaixo. e e f (x) xk+1 = xk − , at´ que |xk+1 − xk | < erro e (3.7) f ′ (x) O c´digo abaixo coloca o m´todo de Newton-Raphson da fun¸˜o f (x) = o e ca xe + sen(x) utilizando um la¸o while. Modifique o programa de modo que cele passe a usar o la¸o for e que o usu´rio possa entrar com o n´ mero de c a uitera¸˜es do m´todo. Existe diferen¸a entre usar um la¸o sem controle do co e c cn´ mero de itera¸˜es ou um que use? O que vocˆ acha? u co e#include<math.h>#include<stdlib.h>int main(){double x, xk, f, df, erro;int i;// Fun¸~o f(x) = exp(x) + sen(x) caxk=10.; // Chute inicialx = 0.; // Tem q inicializar a vari´vel aerro = 1.e-5; // Erro do m´todo e// Loop de converg^ncia ei = 1; // 1a Itera¸~o caprintf("It t Xn");while(fabs(xk - x) > erro){ x = xk; // Atualiza a vari´vel a f = exp(x) + sin(x); // Calcula fun¸~o ca df= exp(x) + cos(x); // Calcula a derivada da fun¸~o ca xk= x - f/df; // M´todo de Newton-Raphson e printf("%d t %gn", i,xk); i++;}printf("n Valor convergido!n");printf(" x = %g n", xk);
  • 33. 3.3 Exerc´ ıcios 30return (0);}
  • 34. Cap´ ıtulo 4Tipos Derivados4.1 Entrada e Sa´ em Arquivo ıdaA biblioteca <stdio.h> possui fun¸˜es espec´ co ıficas para tratar a manipula¸˜o cade arquivos em C. Assim ´ poss´ ler dados vindos de um arquivo ou escrever e ıvelos 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 vari´vel stream ser´ como referˆncia em todas as manipula¸˜es de ar- a a e coquivo. Para manipular mais de um arquivo ao memso tempo, deve-se decla-rar mais vari´veis do tipo F ILE. O comando fopen ´ usado para abrir um a earquivo.stream = fopen("NomeArquivo","Regra"); O comando fopen retorna para a vari´vel F ILE um valor indicando se o aprocesso de abertura do arquivo teve sucesso ou n˜o e ainda atribui ` F ILE a aas propriedades sobre o arquivo aberto (como as regras de I/O). O nome doarquivo pode ser colocado diretamente ou usando uma vari´vel de caracteres a
  • 35. 4.1 Entrada e Sa´ em Arquivo ıda 32contendo o nome do arquivo. As regras definem as a¸˜es que podem ser corealizadas no arquivo (escrita, leitura, ambas, etc). O exemplo abaixo abreum arquivo para escrever caracteres no arquivo at´ que o usu´rio entre com e aum caractere espec´ ıfico.As regras mais usuais para manipula¸˜o de arquivos caest˜o listadas no exemplo abaixo. a/* 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(){
  • 36. 4.1 Entrada e Sa´ em Arquivo ıda 33 FILE *fp; char ch; fp = fopen("texto.txt","w"); while( (ch = getche()) != 13) putc(ch, fp); fclose(fp);} Ap´s usar o arquivo, o comando fclose fecha o arquivo. Os comandos ofprintf e fscanf() podem ser usados da mesma forma que os comandos paratela, contudo ´ necess´rio indicar o F ILE nos comandos. e a#include<stdio.h>int main(){FILE *arq;arq = fopen("nome.txt", "w");fprintf(arq,"Consegui escrevern");fclose(arq);return(0);} O exemplo a seguir cria um banco de dados de nome (char), idade (int) ealtura (float) em arquivo definido pelo usu´rio. A entrada no banco de dados a´ finalizada quando o nome contiver nenhum ou apenas 1 caractere.e#include <stdlib.h>#include <stdio.h>#include <conio.h>#include <string.h>int main(){
  • 37. 4.1 Entrada e Sa´ em Arquivo ıda 34FILE *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.2fn", nome, idade, altura);} while(strlen(nome) > 1);/* Fecha o arquivo: */fclose(fp);return(0);} O exemplo a seguir lˆ os dados de nome (char), idade (int) e altura (float) eque est˜o dentro de um arquivo definido pelo usu´rio e mostra na tela seus a avalores at´ o final do arquivo (EOF — end of file). e#include <stdio.h>#include <conio.h>#include <string.h>int main(){FILE *fp;char nomearq[40], nome[40];int idade;float altura;
  • 38. 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 %.2fn", nome,idade,altura);/* Fecha o arquivo: */fclose(fp);return(0);}4.2 Arrays - Vetores e MatrizesSendo T uma vari´vel declarada, T [n] ´ um array unidimensional (vetor) de a en elementos com o mesmo tipo de T . Os elementos s˜o indexados a partir ade 0 at´ n − 1 e s˜o armazenados de forma cont´ e a ınua na mem´ria, ou seja, oum elemento ap´s o outro. A Fig. 4.2 mostra como esse procedimento ´ o erealizado na mem´ria RAM. o Figura 4.1: Aloca¸˜o do vetor v com n elementos na mem´ria. ca o A defini¸˜o de arrays ´ colocada a partir de exemplos. ca eint i,j;float vec[3]; // array com 3 floats; vec[0], vec[1], vec[2]
  • 39. 4.2 Arrays - Vetores e Matrizes 36int 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 s˜o manipulados como se fossem vari´veis esca- a alares e, portanto, todas as opera¸˜es que vimos at´ agora tamb´m se aplicam co e eaos arrays. Uma array bidimensional (matriz) com n linhas e m colunas podeser definido como T [n][m]. Os ´ ındices das linhas v˜o de 0 a n − 1 e os das acolunas v˜o de 0 a m − 1. Por exemplo, aint i,j;double mt[2][5]; // array 2D c/ 2 linhas e 5 colunasmt[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 la¸o acoplado ´ muito usado para acessar todos os elementos de uma c ematriz. 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] ´ um array uni- edimensional de 5 elementos que representa a primeira linha de mt, e mt[1]tamb´m ´ um array unidimensional de 5 elementos, mas que representa a e esegunda linha de mt. A Fig. 4.2 mostra como um array bidimensional ´ ealocado na mem´ria. o Figura 4.2: Aloca¸˜o de matriz n por m na mem´ria. ca o
  • 40. 4.3 Ponteiros e Referˆncia e 37 Arrays com trˆs ou mais dimens˜es podem ser usados de forma similar. e oUm array com k dimens˜es declarado como a[s1 ][s2 ] . . . [sk ] ir´ alocar espa¸o o a cpara s1 × s2 × . . . × sk elementos que s˜o alocados contiguamente na mem´ria a olinha 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 atri-bu´ ıdos um por vez.int v[4];v = {2, 4, 5, 9}; // Erro!! N~o d´ para ser assim. a a/* A forma correta seria v[0] = 2; v[1] = 4; v[2] = 5; v[3] = 9; */ Ser´ que ´ poss´ inicializar uma matriz do seguinte modo?? a e ıvelint v[2][3] = {1, 2, 0, 4, 0, 0};4.3 Ponteiros e Referˆncia eOs ponteiros s˜o definidos da seguinte forma ∗T . Um ponteiro ∗T pode aarmazenar o endere¸o ou local na mem´ria de uma vari´vel com o mesmo c o atipo do ponteiro. Por exemplo,
  • 41. 4.4 Exerc´ ıcios 38int *p; // p ´ um ponteiro de um inteiro e declara a var´vel p como um ponteiro de inteiro. Este ponteiro pode ser ausado para armazenar o endere¸o na mem´ria de vari´veis inteiras. Sendo v c o auma vari´vel, o seu endere¸o na mem´ria pode ser retornado usando &v. Se a c op ´ uma vari´vel ponteiro, ∗p retorna o valor da vari´vel apontada por p. e a aint i = 5; // i ´ int, valor do objeto i ´ 5. e e (a)int* pi=&i; // p ´ um ponteiro de um inteiro e (b) // e atribui o endere¸o de i a pi cint j = *pi; // valor da vari´vel apontada por pi (c) a // ´ atribu´do a j, j = 5; e ıdouble* = &j; // Ilegal!! Para uma vari´vel de ponteiro p, o valor em ∗p ao qual a vari´vel aponta a apode 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.7p = &d2; // p aponta para d2, *p = 3.1 (c)double b = *p; // b = 3.1*p = 5.5; // o valor para qual p aponta ´ 5.5 e (d)double c = *p; // c = 5.5double d = d2; // d = 5.5, j´ que *p = 5.5 a4.4 Exerc´ ıciosI Simples e direto. Qual o objetivo do c´digo abaixo? N˜o programe!! o aLeia e entenda o que est´ acontecendo!! Repare na identa¸ao do programa!! a c˜Tente usar uma identa¸˜o parecida nos seus programas! Depois, vocˆ pode ca eprogramar para ver a execu¸˜o do programa. ca
  • 42. 4.4 Exerc´ ıcios 39#include<stdio.h>#include<stdlib.h>#include<math.h>#define n 20int 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´lculo das Temperaturas em Celsius a Tc[0] = 0.; for(i=1;i<=n;i++) Tc[i] = Tc[i-1] + dT;// C´lculo das Temperaturas em Farenheit a printf("TC t TFn"); for(i=0;i<=n;i++) { Tf[i] = 9.*Tc[i]/5. + 32.; printf("%.5g t %.5gn", 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++)
  • 43. 4.4 Exerc´ ıcios 40 { if(Tci <= Tc[i]) { /*Interpola¸~o*/ ca 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 #def ine ´ uma macro em C, ou seja, ´ uma forma de definir e eopera¸˜es ou vari´veis constantes. Veja o exemplo abaixo, onde SQ ´ uma co a emacro para calcular o quadrado de uma fun¸˜o. ca#include<stdio.h>#define SQ(x) ((x) * (x))int main(){ double x, y; // faz as opera¸~es usando SQ coreturn(0);} Ser´ que tem diferen¸a se eu programar SQ como colocado na sequˆncia? a c e#define SQ(x) (x * x)
  • 44. 4.4 Exerc´ ıcios 41III Existe a seguinte tabela de rela¸˜o entre κT /ǫ e ΩD,AB e deseja-se in- caterpolar os valores de ΩD,AB ao entrar com κT /ǫ. Escreva um algoritmopara a interpola¸˜o para ΩD,AB , sem esquecer de verificar a validade do valor cafornecido em tela pelo usu´rio. a κ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.439IV Calcule o tempo necess´rio para calcular a multiplica¸˜o de duas ma- a catrizes quadradas (n × n), como ilustrado no c´digo abaixo, onde n = 100, o200, 300, . . ., 1900, 2000. Gere as matrizes de forma randˆmica (valores en- otre 0 e 1). Grave um arquivo guardando o tamanho n da matriz e o temponecess´rio para efetuar o c´lculo (procure na internet a biblioteca necess´ria a a apara marcar o tempo em C). Fa¸a dois testes de multiplica¸ao, trocando a c c˜ordem dos la¸os i—j por j—i. Fa¸a um gr´fico com os valores de tempo e c c atamanho de matriz para as duas situa¸˜es. O que acontece e porque? cofor(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]; } }}
  • 45. Cap´ ıtulo 5Sub-rotinas5.1 Fun¸˜es co5.1.1 Declara¸˜o e Defini¸˜o de Fun¸˜o ca ca caA fun¸˜o pode considerar uma entrada de dados, realizar algumas instru¸˜es ca coe retornar algum resultado. Os parˆmetros de entrada e sa´ devem ter a ıdaseus tipos especificados. Por exemplo, uma das fun¸˜es sqrt() contidas em co<math.h> recebe um double na entrada, calcula sua raiz quadrada e retornaum double como resultado. Esta fun¸˜o ´ declarada como ca edouble sqrt(double); // recebe double, retorna double Quando uma fun¸˜o n˜o retorna nenhum valor, usa-se void para represen- ca atar isso. Quando o tipo da sa´ n˜o ´ especificado, o padr˜o do compilador ıda a e a´ assumi-la como int. Quando a entrada da fun¸˜o n˜o ´ especificada indicae ca a eque n˜o existe dado de entrada. Alguns exemplos, aint square(int); // recebe int, retorna intdouble sum(double,double); // recebe 2 double, retorna 1 doubleint f(); // n~o recebe nada, retorna int avoid g(double,double); // recebe 2 double, n~o retorna nada ah(int); // recebe int, retorna int
  • 46. 5.1 Fun¸˜es co 43 Nas declara¸˜es acima, as vari´veis de entrada (chamadas de parˆmetros co a aou argumentos) e de sa´ (chamadas de valores de retorno) possuem apenas ıdatipos, sem descri¸˜o dos nomes. Os nomes podem ser inclu´ ca ıdos para melhorleitura do c´digo, mas ser˜o ignorados pelo compilador. o aint square(int i); // retorna i*idouble pow(double base, double exp);// retorna a base elevado ao expoente Todas essas declara¸˜es s˜o chamadas de prototypes e s´ os tipos s˜o co a o aimportantes para ele. Todas as fun¸˜es devem ser definidas em algum lugar do c´digo uma unica co o ´vez e com suas instru¸˜es entre chaves.O comando return ´ usado para que co ea fun¸˜o produza um retorno. A defini¸˜o da fun¸˜o pode servir como sua ca ca cadeclara¸˜o tamb´m. Por exemplo, a fun¸˜o square() pode ser definida como ca e caint square(int x){ return x*x; } Ap´s a execu¸˜o da fun¸˜o no programa principal, a pr´xima linha ser´ o ca ca o aexecutada.int i = 5, j, k;j = square(i); // chamada da fun¸~o com i = 5 cak = j; // ap´s execu¸~o, k = j; o ca5.1.2 Passagem de ArgumentosExistem dois mecanismos de passagem de argumentos em C: passagem porvalor ou por referˆncia. Na passagem por valor, o argumento ´ avaliado e equando a fun¸˜o ´ chamada e seu valor se torna o valor do parˆmetro durante ca e aa sua execu¸˜o. O padr˜o ´ a passagem por valor, como mostrado no exemplo ca a eabaixo.int pass_val(int x)
  • 47. 5.1 Fun¸˜es co 44{ x = x*x; return(x + 5);}int i = 5, j;j = pass_val(i);// i = 5, j = 30 Na chamada da fun¸˜o j = pass val(i), o valor do argumento i, que ´ ca e5, ´ passado ao parˆmetro x. A fun¸˜o pass val() ´ iniciada com x = 5, e a ca eexecuta seu bloco de instru¸˜es e retorna o valor 30 para j. Ent˜o, ap´s a co a oexecu¸˜o da fun¸˜o, i = 5 e j = 30. ca ca Na passagem por referˆncia, o argumento deve ser uma vari´vel com um e aendere¸o na mem´ria e o argumento ´ passado para a fun¸˜o como uma c o e careferˆncia, de forma que o parˆmetro se torne apenas um “apelido” do argu- e amento e as mudan¸as ocorridas no parˆmetro ocorrem no argumento tamb´m. c a eint 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 ´ passado como uma ereferˆncia ao parˆmetro x. Ou seja, as duas vari´veis se referem ao mesmo e a aespa¸o da mem´ria. Ent˜o qualquer mudan¸a realizada em x dentro da c o a cfun¸˜o, ir´ afetar i. No caso acima, x ´ alterado dentro da fun¸˜o e assume ca a e cavalor de 25. Ent˜o, ap´s a execu¸˜o da fun¸˜o, i = 25 e j = 30. a o ca ca Passagem para ponteiros possuem o mesmo efeito de uma passagem porreferˆncia, j´ que os dois ponteiros apontam para o mesmo local. Veja o e aexemplo de trˆs varia¸˜es da fun¸˜o swap(). e co cavoid swap(int& p, int& q) {
  • 48. 5.1 Fun¸˜es co 45 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 n˜o muda o valor dos argumentos, enquanto a apassagem por referˆncia ou valor de ponteiros usualmente implica que o valor edos argumentos ser˜o alterados durante a chamada da fun¸ao, a n˜o ser que a c˜ aseja explicitamente especificado para n˜o fazer isso usando a palavra-chave aconst.int g(int val, const int& ref) { ref = 5; // Erro!!! Compilador vai reclamar!! val++; return(ref + val);}
  • 49. 5.1 Fun¸˜es co 46 O nome de um array ´ um ponteiro const que aponta para o seu pri- emeiro elemento. Ent˜o, os argumentos em forma de array s˜o tratados como a aponteiros e possuem o mesmo efeito de uma passagem por referˆncia. edouble 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 ad5 = a[5]; // d5 = 1000 Ponteiros constantes apontam para locais constantes, ou seja, n˜o ´ per- a emetido alterar o local em que ele aponta. Mas tamb´m ´ poss´ n˜o permitir e e ıvel aque 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.; // P´´´´!! Erro!! eeee return(sum);} Qualquer fun¸˜o que n˜o seja declarada como void deve retornar um valor ca a(com exce¸˜o de main). Por exemplo, caint square(int& i){ i*=i; } // Erro!! Um valor precisa ser retornado!
  • 50. 5.2 Exerc´ ıcios 475.2 Exerc´ ıciosI O que est´ acontecendo no programa abaixo? Analise a passagem de aparˆmetros pelas fun¸˜es. a co#include<stdio.h>// Prototypesint swap(int* p, int q, double x, double* y){ int i; /* Vc pode definir vari´veis na sua a rotina q j´ foram definidas em main */ a 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 - %gn", i, j, z); for(i=0;i<5;i++) { printf("%g - ", v[i]); } printf("n"); return(0);}
  • 51. 5.2 Exerc´ ıcios 48II Um algoritmo para encontrar a raiz quadrada de um n´ mero real positivo u´:e 1 b x0 = 1, xn+1 = 2 xn + xn , n = 0, 1, 2, . . . Escreva uma fun¸˜o que implemente este algoritmo. Observe uma r´pida ca √ aconvergˆncia (quadr´tica) no resultado de xn → b. Compare a acur´cia da e a afun¸˜o com a fun¸˜o intr´ ca ca ınseca sqrt() da biblioteca <math.h>.III Considerando o polinˆmio de grau n o pn (x) = an xn + an−1 xn−1 + . . . + a1 x + a0 Considere os coeficientes do polinˆmio de grau 8 como um vetor (a[]={1, o-8, 28, -56, 70, -56, 28, -8, 1}).a. Escreva uma fun¸˜o que avalie este polinˆmio. ca ob. O c´lculo direto de um polinˆmio n˜o ´ eficiente devido ` computa¸˜o a o a e a ca de cada expoente em x. Um m´todo eficiente ´ o algoritmo de Horner e e (ou multiplica¸˜es acopladas). A id´ia ´ reescrever pn (x) da seguinte co e e forma: pn (x) = (. . . ((an x + an−1 )x + an−2 )x + . . . + a1 )x + a0 Isto introduz a seguinte nota¸˜o: ca un = an ; un−1 = un x + an−1 ; un−2 = un−1 x + an−2 ; . . . u1 = u2 x + a1 ; u0 = u1 x + a0 ; Assim, pn (x) = u0 . Em princ´ ıpio, parece necess´rio guardar un , un−1, . . . , a e u0 em um array. Por´m, isso n˜o ´ preciso j´ que depois do c´lculo e a e a a de un−1 o valor de un n˜o ´ mais necess´rio. O algoritmo de Horner ´ a e a e escrito na sequˆncia. e • Inicializa u = an • for(i = n − 1, n − 2, . . . , 0) u ← ux + ai ;
  • 52. 5.2 Exerc´ ıcios 49 Construa uma outra fun¸˜o para calcular o polinˆmio usando o algo- ca o ritmo de Horner.c. Compare os resultados fornecidos pelas duas fun¸˜es. coIV Exerc´ mais f´cil n˜o existe!! V´ no seguinte site: ıcio a a a http://www.gnu.org/software/gsl/manual/gsl-ref toc.html#TOC471 Este ´ o site das bibliotecas livres da GNU (distribui¸˜o livre — de gra¸a!) e ca cescritas em C e C++. S˜o todas as rotinas existentes para c´lculo cient´ a a ıficoda GNU e s˜o residentes do sistema operacional linux (contudo, podem fun- acionar em compiladores windows). Procure na lista de rotinas o m´todo dos em´ınimos quadrados (Least-Squares Fitting) e estude os exemplos ali coloca-dos.