Curso C

842 visualizações

Publicada em

Introductory C programming language course (in Portuguese)

Publicada em: Negócios, Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
842
No SlideShare
0
A partir de incorporações
0
Número de incorporações
44
Ações
Compartilhamentos
0
Downloads
22
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Curso C

  1. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 33. 3.3 Exerc´ ıcios 30return (0);}
  34. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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.

×