24
Segundo programa: media.c Vamos analisar um programa que calcula a m ´ edia ponderada entre dois n ´ umeros: media.c Linhas de coment ´ ario: Num arquivo com o c ´ odigo de um programa C (c ´ odigo fonte), um coment ´ ario comec ¸a com barra e asterisco ( /* ) e se estende at ´ e encontrar um asterisco e uma barra ( */ ), podendo abranger v ´ arias linhas. Veja as linhas1a5. Uma outra forma de coment ´ ario, ` as vezes mais pr ´ atica, ´ e um texto comec ¸ando com uma barra dupla (//) e se extendendo at ´ e o fim da linha. Veja as linhas 10, 13, 22 e 28. Esta forma n ˜ ao ´ e padr ˜ ao da linguagem C, mas uma extens ˜ ao tomada emprestada do C++. O compilador ignora as linhas em branco e os coment ´ arios. ´ E muito importante que o programa fonte seja bem comentado. M ´ etodos Computacionais em F ´ ısica I - Segunda Aula 1

Segundo programa: media - IF - Instituto de Física / UFRJsandra/mcomp/SegundaAula.pdf · Linhas de comentario:´ Num arquivo com o codigo´ de um programa C (codigo´ fonte), um

Embed Size (px)

Citation preview

Segundo programa: media.cVamos analisar um programa que calcula a media ponderada entre doisnumeros: media.c

❒ Linhas de comentario:Num arquivo com o codigo de um programa C (codigo fonte), umcomentario comeca com barra e asterisco ( /* ) e se estende ateencontrar um asterisco e uma barra ( */ ), podendo abranger variaslinhas. Veja as linhas1 a 5.

Uma outra forma de comentario, as vezes mais pratica, e um textocomecando com uma barra dupla (//) e se extendendo ate o fim dalinha. Veja as linhas 10, 13, 22 e 28. Esta forma nao e padrao dalinguagem C, mas uma extensao tomada emprestada do C++.

O compilador ignora as linhas em branco e os comentarios.

E muito importante que o programa fonte seja bem comentado.Metodos Computacionais em Fısica I - Segunda Aula

1

❒ Instrucoes para o pre-processador:

Uma linha comecando por # nao e um codigo C propriamente dito,

mas uma instrucao para o pre-processador. Antes de compilar o

programa, o compilador chama o pre-processador que prepara o

codigo de acordo com estas instrucoes. A linha 6 no programa

media.c diz ao pre-processador para incluir o arquivo stdio.h

naquele ponto do codigo. Este arquivo e necessario para podermos

utilizar as funcoes para entrada e saıda de dados. Estes arquivos em

formato texto, cujos nomes terminam em ".h" sao chamados de

arquivos cabecalhos (headers, em ingles)

Metodos Computacionais em Fısica I - Segunda Aula

2

❒ Funcoes, a funcao main:

Um programa em C e composto de blocos chamados de funcoes. Um

programa pode ter uma ou mais funcoes, mas obrigatoriamente deve

ter uma ( e so uma ) funcao chamada main. Esta e a funcao principal e

e por ela que a execucao do programa comeca. A sintaxe de definicao

de qualquer funcao e

tipo nome( argumentos )

No programa media.c temos duas funcoes:

❍ a de nome main, de tipo int que, neste exemplo, nao possui

argumentos.

❍ a de nome printf, de tipo int, com uma lista variavel de

argumentos, neste exemplo, 6 argumentos.

Metodos Computacionais em Fısica I - Segunda Aula

3

❒ Declaracoes:

O corpo da funcao main comeca com um abre chaves ({ ) e termina

com um fecha chaves ( } ) correspondente, respectivamente linhas 9 e

33 no programa media.c Os blocos de codigo que seguem este padrao

sao chamados de declaracoes compostas, porque englobam diversas

declaracoes simples. As linhas de codigo na funcao main que

terminam com um ponto e vırgula ( ; ) sao as declaracoes (simples), as

instrucoes que o programa executara. Toda declaracao simples deve

terminar com o ponto e vırgula.

As linhas 15 e 16 formam uma unica declaracao, a qual pode ser

estendida por mais de uma linha, o que delimita o seu termino e o ;

Metodos Computacionais em Fısica I - Segunda Aula

4

❒ Definicoes:As instrucoes que aparecem nas linhas 10, 11, 13, 15, 16 e 17 saodefinicoes. Para armazenar as informacoes com que o programatrabalhara, chamadas de dados, precisamos reservar uma areaapropriada de memoria e para identificar essa area associamos umnome (identificador) a ela. Devemos dizer o tipo deinformacao que sera armazenada, assim o compilador sabe aquantidade de memoria necessaria. Os identificadores podem servariaveis, como no caso presente, ou constantes, comoveremos mais tarde.

Nas linhas 10 e 11 definimos as variaveis peso1 e peso2 quearmazenarao um numeros inteiros. Nas linhas 13, 15 e 17 definimosvariaveis que armazenarao numeros reais. (Observe que as linhas 15 e16 constituem uma so declaracao que define duas variaveis). Naslinhas 10 e 11 alem da definicao, temos tambem a inicializacaodas variaveis, isto e, lhes atribuimos um valor inicial.

Metodos Computacionais em Fısica I - Segunda Aula

5

❒ Como vemos nas linhas 13, 15 e 17, a inicializacao nao e

obrigatoriamente feita junto com a definicao da variavel. Porem se

utilizarmos uma variavel antes de inicializa-la, o programa utilizara

qualquer informacao que por acaso esteja naquela area de memoria

(“lixo” de outros programas) o que pode levar a erros serios.

❒ Nome das variaveis:

deve comecar com letras e pode-se usar letras e numeros depois, alem

do caracter “ ” (underscore). O C distingue maiusculas de minusculas.

Um estilo de escolha de nomes usado e comecar por minuscula, e

quando quisermos representar com um nome composto, separar por

Maiuscula ou underscore: mediaParcial ou media parcial. Nao podem

ser as palavras reservadas do C (if, for, main, printf...)

O nome das variaveis deve ser escolhido de forma a deixar claro oseu significado, facilitando o entendimento do programa

Metodos Computacionais em Fısica I - Segunda Aula

6

Operadores

❒ O operador atribuicao “=”:

Todas as informacoes que passamos para o computador ficam

armazenadas em sua memoria. Quando declaramos a variavel n1, seu

nome significa uma abreviacao para um endereco na memoria do

computador. Como nenhum valor ainda lhe foi atribuıdo, ela pode

conter qualquer lixo que tenha sido previamente escrito naquela regiao

de memoria. Quando fazemos n1 = 2, guardamos o valor 2 na regiao

de memoria cuja localizacao e dada por n1.

❒ Operadores aritmeticos:

multiplicacao “ * ” , divisao “/ ”, soma “ + ”, subtracao “ - ”,

resto “ % ”

Metodos Computacionais em Fısica I - Segunda Aula

7

❒ Regras de precedencia:

divisao e multiplicacao estao no mesmo nıvel, soma e subtracao vem

depois. Para operadores que estao no mesmo nıvel, a instrucao e

executada da esquerda para a direita.

❒ Exemplos:

3/5 = 0; 6/4 = 1

6%4 = 2

x + y ∗ 3 = x + (y ∗ 3)

34/5/2 = 3; 34/(5/2) = 17

Utilizar parentesis para garantir a precedencia de uma sub-expressaoou deixar mais claro a sequencia de execucao

Metodos Computacionais em Fısica I - Segunda Aula

8

Entrada e saıda de dadosA biblioteca padrao tem diversas funcoes para que valores digitadosdurante a execucao sejam usados pelo programa e para que os resultadossejam escritos na tela. Exemplo:

//lenum.c

#include <stdio.h>

int main()

{

float a, b, soma;

printf("Digite os valores de a e b\n");

scanf("%f %f",&a, &b);

soma = a + b;

printf(" A soma e’ %f\n",soma);

return 0;

}Metodos Computacionais em Fısica I - Segunda Aula

9

❒ scanf:O primeiro argumento de scanf e uma sequencia de caracteres

(string) que define quantos valores serao lidos, e de que tipo sao, e

pode dar outras informacoes como o formato da entrada. O segundo

argumento, depois da vırgula, e a lista com os enderecos das variaveis

que terao seus valores atribuıdos. O operador unario & da o endereco

de memoria de uma determinada variavel, a funcao scanf precisa dessa

informacao para funcionar.

❒ printf:Assim como na scanf, o primeiro argumento de printf define a

quantidade, o tipo e o formato dos valores a serem impressos. O

segundo argumento da a lista das variaveis.

Em ambos os casos, a lista de formatos sera casada com a lista depois da

vırgula. A scanf segue buscando valores para satisfazer sua lista de

formatos.Metodos Computacionais em Fısica I - Segunda Aula

10

Se estamos entrando dados pelo teclado, isso significa que seu programa

ficara esperando a digitacao de tantos dados quantos forem especificados

na lista de formatos.

Espacos em branco, tabs e caracteres de nova linha (tecla enter) sao

ignorados na leitura.

As principais fontes de erro no uso de scanf sao: colocar o nome da

variavel e nao seu endereco, ter listas de formatos incompatıvel com a lista

de enderecos, seja por numero de campos seja por tipo de variavel. Esses

erros em geral nao sao detectados na compilacao.

A saıda dos dados deve apresentar uma mensagem onde fica claro o que

esta sendo impresso.

Estas (teclado e tela) nao sao as unicas formas de entrada e saıda de dados

para um programa.

Metodos Computacionais em Fısica I - Segunda Aula

11

Tarefa

1. Escreva um programa que pede o valor de um angulo emgraus, pelo teclado, calcula e escreve na tela seu valor emradianos.

2. Escreva um programa que pede o valor de umatemperatura em Farenheit, pelo teclado, calcula e escrevena tela seu valor em graus Celsius (C = 5

9(F − 32)).

Metodos Computacionais em Fısica I - Segunda Aula

12

TarefaEscreva um programa que calcule as raızes de equacao de segundo grau

ax2 + bx + c = 0

utlizando a formula bem conhecida

x =−b ±

√b2 − 4ac

2a

Comentarios: a funcao da biblioteca matematica correspondente a√

x esqrt(x). Para usa-la temos que incluir no programa

#include <math.h>

Para gerar o executavel, deve-se tambem linkar com a bibliotecamatematica:

gcc -o raizSegGrau raizSegGrau.c -lm

Metodos Computacionais em Fısica I - Segunda Aula

13

Outras funcoes que tambem estao declaradas em math.h:

• sin(x) → seno de x. x deve ser dado em radianos

• cos(x) → cosseno( de x. x deve ser dado em radianos

• acos(x) → arco-cosseno de x, no intervalo [0, π]

• atan(x) → arco-tangente de x, no intervalo [−π/2, π/2]

• exp(x) → ex

• log(x) → log na base e, x > 0

• log10(x) → log na base 10, x > 0

• pow(x,y)→ xy

• fabs → |x|

Metodos Computacionais em Fısica I - Segunda Aula

14

Estruturas de Decisao e loops

❒ Nos codigos que vimos ate agora, as instrucoes sao seguidas

sequencialmente usando os valores de variaveis atuais a cada linha.

❒ Essa estrutura linear nao e adequada para a maioria das aplicacoes.

❒ Necessitamos de mecanismos que provoquem bifurcacoes na

excecucao, ou seja, que certos comandos so sejam executados se

determinadas condicoes forem satisfeitas.

❒ Tambem precisamos de uma forma de forcar a repeticao de grupos de

comandos.

❒ As diversas estruturas condicionais existentes na linguagem fornecem

esses mecanismos. O funcionamento delas depende da avaliacao,

como falsa ou verdadeira, de uma determinada afirmativa.

Metodos Computacionais em Fısica I - Segunda Aula

15

Estruturas de DecisaoQueremos instruir o programa a executar um conjunto de instrucoes casouma certa condicao seja satisfeita.

if (condicao){comandos

}——————————-

n = 0

x = 2.

if ( x > 0 ) {

printf ("x positivo\n");

n = n + 1;

}

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

Metodos Computacionais em Fısica I - Segunda Aula

16

Se a instrucao e simples (um so comando), as chaves sao desnecessarias:

n = 0

x = 2.

if ( x > 0 ) n = n + 1;

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

Uma expressao logica tem valor numerico0 se for falsa e 6= 0 se for verdadeira

Metodos Computacionais em Fısica I - Segunda Aula

17

if-else

if (condicao){comandos

}else {

comandos

}————————-

x = ...;

if(x > 0){

y = sqrt(x);

}

else {

y = sqrt(-x);

}Metodos Computacionais em Fısica I - Segunda Aula

18

A forma mais geral possıvel: else-if

if (media >= 9.0)

printf("grau A");

else if (media >= 7.0)

printf("grau B");

else if (media >= 5.0)

printf("grau C");

elseprintf("grau D");

if (condicao) {comandos

}else if (condicao) {

comandos

}else if (condicao) {

comandos

}else {

comandos

}

Metodos Computacionais em Fısica I - Segunda Aula

19

Operadores logicos e relacionais

Os operadores relacionais sao

> (maior) >= (maior ou igual) < (menor) <= (menor ou igual),

e

== (igual) != (diferente de),

Os operadores relacionais tem precedencia abaixo dos aritmeticos:

a expressao x < y-1 e avaliada como x < (y-1).

Atencao para a diferenc a entreif (a = = b) e if (a = b)

Metodos Computacionais em Fısica I - Segunda Aula

20

Os operadores logicos sao

&& (e) || (ou).

A avaliacao de uma expressao e feita de acordo com a tabela:

V && V = V

V && F = F

F && F = F

V || V = V

V || F = V

F || F = F

Expressoes conectadas por && e || sao avaliadas da esquerda para a direita,e a avaliacao e interrompida assim que seja possıvel determinar se aexpressao e falsa ou verdadeira.

O operador unario ! e o operador de negacao. Ele troca V por F e vcvs.

Metodos Computacionais em Fısica I - Segunda Aula

21

Exemplos:

if (a > 0.0 && 1./a < c) x = 0;

Se quisermos saber se x esta dentro de um certo intervalo:

if ( x > xmin && x < xmax) {

instrucoes

}

Se quisermos saber se x esta fora de um certo intervalo:

if ( x < xmin || x > xmax) {

instrucoes

}

if ( (a == b && a != 0) || a == 2 )

if ( !(a < b) )

Metodos Computacionais em Fısica I - Segunda Aula

22

Ordem de precedencia:

! ; (* , /, % ) ; (+ , - ) ; ( >, <, >=,<= ) ; ( = = , != ) ; && ; ||

Sempre use parentesis

De Morgans Law:

!(A && B) ≡ !A || !B

!(A || B) ≡ !A && !B

O operador ternario ? fornece um modo alternativo de se fazer teste logico:

z = condicao ? instrucao 1 : instrucao 2

Se condicao for V, a instrucao 1 e executada, senao, a instrucao 2 e

executada.

z = (a > b) ? a : b;

Metodos Computacionais em Fısica I - Segunda Aula

23

Exercıcio

Modifique o programa que calcula as raızes da equacao de segundo grau

para levar em conta ∆ < 0. Os valores dos coeficientes a, b e c, devem ser

lidos pelo teclado. Seu programa deve: recusar valores nulos de a, e

discriminar os casos: raizes iguais, raizes reais diferentes, raizes complexas

diferentes. No ultimo caso, os valores das raızes devem ser escritos como

Re +-i Im, onde Re= −b2a

e Im=√

−∆

2a

Metodos Computacionais em Fısica I - Segunda Aula

24