Professional Documents
Culture Documents
Se a Matemtica a cincia da lgica e, se para programar precisamos de lgica, ento...(Anita Lopes, 2006) Desde 1987 que sou professora universitria e ministro disciplinas de Linguagens de Programao nos cursos de Sistemas de Informao e de Engenharia. Durante todos esses anos, sempre permeou uma questo: por que necessrio saber Matemtica para programar? Esse projeto se tornou concreto a partir de 2006 quando decidi que precisava tentar esclarecer essa questo, procurando relacionar cada tpico selecionado da Matemtica com comandos/ funes das linguagens de programao. Para que pudesse exemplificar, escolhi a linguagem C++. Comeo na Teoria dos Conjuntos e termino com lgebra das Matrizes, passando por conceitos bsicos tais como: sistemas de numerao, operaes aritmticas, conceito de nmero primo, nmero quadrado perfeito, MDC, MMC, fraes, porcentagem, expresses relacionais, entre outros. Um dos meus objetivos do presente trabalho mostrar que tanto a Matemtica quanto a Programao tm linguagens prprias que precisam ser bem aprendidas para que possamos fazer uso delas sem nenhuma dificuldade. Tenho tambm a pretenso de faz-los adorar a Matemtica, pois como afirma Devlin (2004,p 2): A matemtica tornou-se o estudo dos nmeros, da forma, do movimento, da mudana e do espao. A ordem apresentada ser a dos conceitos Matemticos e, por essa razo, muitos trechos de programas podero apresentar estruturas que voc ainda no aprendeu quando estiver lendo, em seqncia, esse estudo, mas isto no importa, pois voc retornar a eles quando dominar todas as estruturas. Os exemplos sero apresentados na linguagem C++. Em alguns momentos, farei referncia linguagem Pascal porque muitos livros de algoritmos fazem uso do portugol que uma linguagem descritiva, em portugus, baseada entre outras, na linguagem Pascal. No conseguirei abranger todo o contedo de Matemtica que aprendemos at chegarmos universidade, mas tentarei recordar os contedos mais usados como exemplos nos exerccios de programao. Anita Lopes
2006
Nmero
a idia de quantidade. Sua representao depende do sistema. No sistema decimal hindo-arbico, todos os nmeros so formados pelos algarismos de 0 at 9. No sistema romano, todos os nmeros so formados pelas letras: I(1), V(5), X(10), L(50), C(100), D(500) e M(1000). Aplicao: Suponha que voc deseje fazer um programa que entre com umas letras bsicas do sistema romano e mostre o nmero correspondente no sistema decimal. #include <iostream> #include <cstring> using namespace std; int main() { char romano; cout<<"\nDigite uma letra do sistema romano: "; cin>>romano; romano=toupper(romano); cout<<"\nNo sistema decimal: "; switch(romano) { case 'I': cout<<"1\n\n"; break; case 'V': cout<<"5\n\n"; break; case 'X': cout<<"10\n\n "; break; case 'L': cout<<"50\n\n "; break; case 'C': cout<<"100\n\n "; break; case 'D': cout<<"500\n\n "; break; case 'M': cout<<"1000\n"; break; default: printf(" nao corresponde a nenhum numero porque nao eh uma letra do sistema Romano\n\n "); } system("pause"); }
2006
Os conjuntos
N(Natural) = {0,1,2 ... }. Z(Inteiro) = {... 2 1 0 1 2 ...}. Q(Racional) = { x | x=a/b, com a Z, b Z e b 0}. R(Real) = { x | x Q ou x I} Observao: No inclui o conjunto dos complexos. As linguagens de programao procuram, dentro do possvel, criar tipos de dados primitivos que suportem os conjuntos acima, com limitao, pois no poderemos chegar ao infinito. No tenho como objetivo, nesse estudo, um aprofundamento de todos os tipos de dados usados na linguageM C++, mas fazer a associao com o conceito da Matemtica sobre os conjuntos inteiro e real. Logo, s apresentarei os tipos bsicos e que possuem correspondncia nas trs linguagens. Linguagem C++ Z - int R - float
3.
As operaes
adio e subtrao.
Se voc precisar que uma operao de hierarquia menor seja executada primeira, use parnteses. Observe os exemplos abaixo.
o resultado um inteiro, mas nem sempre acontece isso quando dividimos dois inteiros, logo a diviso(/) sempre retornar um resultado no conjunto dos reais.
Somar(+), subtrair(-), multiplicar(*) ou dividir(/) dois reais(ou um inteiro e um real), pela propriedade do fechamento, o resultado um real.
Agora voc me confundiu. Quando dividimos dois inteiros, retornou inteiro. Calma! As linguagens de programao fazem algumas adaptaes. Leia a nota abaixo.
Nas linguagens de programao C/ C++/ Kenya, o operador de diviso(/) retornar um nmero inteiro se o dividendo e o divisor forem inteiros, mas, se desejarmos que a operao seja realizada como real, acrescente .0 em um dos nmeros. Aplicao: Exibe o quociente inteiro e o real da diviso de 23 por 2. #include <iostream> using namespace std; int main() { cout<<"\nDivisao inteira: "<<23/2; cout<<"\nDivisao real: "<<23.0/2<<endl; system("pause"); }
vezes que a base se repete. Tanto a base quanto o expoente so nmeros que pertencem ao conjunto dos reais. Algumas linguagens de programao apresentam o
4
operador de potenciao: ** ou ^, mas na linguagem C++ no existe operador para potenciao. Entretanto, a linguagem C++ disponibiliza a funo pow(base,expoente). Quando no existir a funo pow(base,expoente), poderemos usar a expresso que ser deduzida a seguinte expresso, usando funes que esto presentes em todas as linguagens, exp( ) e log( ) mesmo que, algumas vezes, a notao seja diferente. Funo exp() - calcula a potncia da base e(neperiana) Funo log( ) uma funo inversvel cuja funo inversa a exponenciao. Sua representao:
N log b = x
onde x
para obter N. bom ressaltar que x um nmero real(racional ou irracional). O logaritmo natural(logaritmo neperiano) o logaritmo cuja base : e, aproximadamente 2,71828...Na Matemtica usamos ln quando desejamos calcular o logaritmo na base e. Converso entre base logartmicas: logb =
a a logx b logx
Em programao: log(a)/log(b). Restries: N(logaritmando) precisa ser maior do que 0 e a b(base) precisa ser maior do que 0 e diferente de 1 Deduzindo a expresso que substitui o operador de potenciao ou a funo pow(,) logo, e, se substituirmos o valor de x, teremos ento
se desejarmos uma potncia representada por por uma das propriedade dos logaritmos se b a base neperiana(e), ento
As linguagens de programao sempre disponibilizam duas funes: exponenciao e logaritmo, ambas na base neperiana, com as seguintes sintaxes: log( argumento) ou ln( argumento) e exp( argumento)
5
Reconheo que li muitas vezes para entender e admito que achei muito interessante, mas quando vou precisar us-la?
Acho que j estou lhe convencendo que a Matemtica fantstica. Essa expresso dever ser usada nas linguagens que no possurem operadores/funes de potenciao.
Aplicao: Entra com a base e o expoente e exibe a potncia usando exp() e log(). #include <iostream> #include <cmath> using namespace std; int main() { float base, expoente, potencia; cout<<"\nDigite base: "; cin>>base; cout<<"\nDigite expoente: "; cin>>expoente; potencia= exp(expoente * log(base)); cout<<"\nPotencia: " << potencia<<endl; system("pause"); } Ento, na linguagem C++ poderemos usar essa expresso ou usar a funo pow(base,expoente). Perfeito! Acredito ser mais simples usar a funo pow(base,expoente), mas, no Pascal, teramos que usar essa expresso.
Aplicao: Entra com a base e o expoente e exibe a potncia usando pow(,). #include <iostream> #include <cmath> using namespace std; int main() { float base, expoente, potencia; cout<<"\nDigite base: "; cin>>base; cout<<"\nDigite expoente: "; cin>>expoente;
6
2006
Aplicao: Entra com radicando e o expoente e exibe a potncia usando exp() e log(). #include <iostream> #include <cmath> using namespace std; int main() { float radicando, indice,raiz, raizExp; cout<<"\nDigite o radicando: "; cin>>radicando; cout<<"\nDigite o indice: "; cin>>indice; if(radicando > 0 && ndice >1) { raiz= pow(radicando,1/indice); raizExp=exp(1/indice * log(radicando)); cout<<"\nRaiz: " << raiz<<endl; cout<<"\nRaiz usando a expressao: " << raizExp<<endl; } else cout<< system("pause"); }
#include <iostream> #include <cmath> using namespace std; int main() { float rad,raiz;int indice; cout<<"\nDigte Radicando: "; cin>>rad; cout<<"\nDigte Indice: "; cin>>indice; if(indice < 2) cout<<"\nNao existe raiz para indice menor que 2\n"; else if( rad >=0 ) { raiz=pow(rad, (float)1./indice); if(raiz==floor(raiz)) cout<<"\nQuadrado perfeito\n"; else cout<<"\nNAO eh Quadrado perfeito\n"; } else cout<<"\nNao existe Raiz no conjunto dos Reais\n"; system("pause"); }
4.
O sistema decimal
um sistema posicional. A base desse sistema o nmero 10. Cada algarismo tem um valor absoluto e um valor relativo: Valor absoluto valor do algarismo. Valor relativo valor do algarismo multiplicado pela potncia de 10 da posio em que ele se encontra dentro do nmero. Observe a figura abaixo:
Observe um nmero posicionado nesse quadro e entenda os conceitos de valor absoluto e valor relativo.
Agora vamos aprender como conseguimos fazer isso em programao: Na linguagem Pascal, temos dois operadores que efetuam a diviso inteira entre dois nmeros inteiros: div(retorna o quociente inteiro) e mod(retorna o resto). Na linguagem C++, por definio, o operador de diviso / retorna um quociente inteiro se o numerador(dividendo) e o denominador(divisor) forem inteiros e, para retornar o resto de uma diviso de inteiros, existe o operador % que tem a mesma finalidade de mod do Pascal.
Se trabalharmos com as potncias de 10, poderemos descobrir o valor absoluto e o valor relativo de cada algarismo. Vamos descobrir do algarismo 7 no nmero 32758.
9
Tente agora montar as expresses que representam os valores absoluto e relativo do algarismo da casa das unidades de milhar do nmero 32758. Valor absoluto (32758 / 1000) % 10 Valor relativo (32758 / 1000 % 10) * 1000
10
Tente agora montar as expresses que representam os valores absoluto e relativo do algarismo da casa das centenas de milhar do nmero 4352768. Valor absoluto (4352768 / 100000) % 10 Valor relativo ((4352768 / 100000) % 10) * 100000 Tente agora montar as expresses que representam os valores absoluto e relativo do algarismo da casa das unidades de milho do nmero 8123982. 8123982 / 1000000 (para o algarismo mais esquerda, s Valor absoluto esta operao suficiente) Valor relativo (8123982 / 1000000) * 1000000 Tente agora montar as expresses que representam os valores absoluto e relativo do algarismo da casa das unidades simples do nmero 8123982. 8123982 % 10 (para o algarismo mais direita, s esta Valor absoluto operao suficiente) Valor relativo 8123982 % 10 ( multiplicar por 1, desnecessrio) Tente agora montar a expresso que retira a classe das unidades de milhar do nmero 8123982. Classe das unidades de milhar (8123982 / 1000) % 1000 Tente agora montar a expresso que retira o dia da data 230389. Dia 230389 / 10000 Tente agora montar a expresso que retira o ms da data 230389. Mes (230389 / 100) % 100 Tente agora montar a expresso que retira o ano da data 230389. Ano 230389 % 100 Voc tem um disco com 4 setores, numerados de 0-3. Quando voc escolhe um nmero, sua aposta no seguinte. Faa um programa, sem usar if, que possibilite este jogo. #include <iostream> using namespace std; int main() { int numero, aposta; cout<<"\nDigite numero de 0-3: "; cin>>numero; while(numero<0 || numero > 3) { cout<<"\nSo numeros de 0 ate 3.
11
Nmero capicua um nmero que, lido da esquerda para direita, igual ao lido da direita para esquerda. Exemplo: 2332
#include <iostream> using namespace std; int main() { int num,numC, inv; cout<<"\nNumero: "; cin>>num; numC=num; // para nao perder o valor inicial //inicio do trecho que inverte o numero inv=0; while(numC > 0) { inv = inv * 10 + numC%10; numC /= 10; } //fim do trecho if(num == inv) cout<<"\nEh CAPICUA\n"; else cout<<"\nNAO eh CAPICUA\n"; system("pause"); }
12
2006
Alguns conceitos
13
2006
Divisores/ Mltiplos
As regras da divisibilidade so mais complicadas de se usar em programao do que o operador % (mod ). Atravs de um simples teste, poderemos verificar se um nmero , ou no, mltiplo de outro: C++ if(num1 % num2 == 0 ) Pascal if num1 mod num2 = 0 then Intervalos Nunca entendi bem essa histria de aberto e fechado. Pode explicar?
14
#include <iostream> using namespace std; int main() { int li, ls, num; cout<<"\nDigte limite inferior: "; cin>>li; cout<<"\nDigte limite superior: "; cin>>ls; cout<<"\nDigte numero: "; cin>>num; if(li % num == 0) cout<<"\nMenor: "<<li; else cout<<"\nMenor: "<<li + (num - li % num); cout<<"\nMaior: "<< ls - ls % num; cout<<"\n\n"; system("pause"); } Como descobrir os divisores de um nmero?
15
2006
Nmero Primo um nmero que s tem dois divisores: 1 e o prprio nmero, logo 1 no primo e 2 o nico nmero par que primo.
#include <iostream> using namespace std; int main() { int x, num, contaDivisores=0; cout<<"\nDigte numero: "; cin>>num; for(x=1; x<=num && contaDivisores <=2 ; x++) if( num % x == 0) contaDivisores++; if(contaDivisores == 2) cout<<"\nPrimo\n"; else cout<<"\nNAO Primo\n"; cout<<"\n\n"; system("pause"); }
MDC significa o maior divisor comum de dois, ou mais nmeros. Ns podemos achar o
16
Apresentarei duas solues, sendo que a primeira ser fiel ao Algoritmo de Euclides e a segunda, no far o teste para ordenar. #include <iostream> #include <iostream> using namespace std; using namespace std; int main() int main() { { int dividendo, divisor,resto; int dividendo, divisor,aux,resto; cout<<"\ndigite 1o numero: "; cout<<"\ndigite 1o numero: "; cin>>dividendo; cin>>dividendo; cout<<"\ndigite 2o numero: "; cout<<"\ndigite 2o numero: "; cin>>divisor; cin>>divisor; resto= dividendo % divisor; if( dividendo < divisor ) while( resto != 0) { { aux=dividendo; dividendo = divisor; dividendo=divisor; divisor = resto; divisor=aux; resto = dividendo % divisor; } } resto= dividendo % divisor; cout<<"\nMDC: "<<divisor; while( resto != 0) cout<<"\n\n"; { system("pause"); dividendo = divisor; } divisor = resto; resto = dividendo % divisor; }
17
2006
construo desse programa, faremos uso do programa do MDC: #include <iostream> using namespace std; int main() { int dividendo, divisor,resto; cout<<"\ndigite 1o numero: "; cin>>dividendo; cout<<"\ndigite 2o numero: "; cin>>divisor; resto= dividendo % divisor; while( resto != 0) { dividendo = divisor; divisor = resto; resto = dividendo % divisor; } if( divisor ==1 ) cout<<"\nPrimos entre si"; else cout<<"\nNAO sao Primos entre si"; cout<<"\n\n"; system("pause"); }
Nmeros primos entre si so nmeros cujo nico divisor comum o nmero 1. Para a
18
2006
Nmero Perfeito um nmero cuja soma de seus divisores, exceto ele, igual a ele
#include <iostream> using namespace std; int main() { int x, num, soma=0; cout<<"\nDigte numero: "; cin>>num; for(x=1;x<num;x++) if( num % x == 0) soma+=x; if( soma == num ) cout<<"\nPerfeito"; else cout<<"\nNAO Perfeito"; cout<<"\n\n"; system("pause"); }
Nmeros Amigos so dois nmeros cuja soma dos divisores de um dos nmeros, exceto ele, igual ao outro nmero e, vice-versa.
#include <iostream> using namespace std; int main() { int x, num1, num2, soma1=0, soma2=0; cout<<"\nDigte 1o numero: "; cin>>num1; cout<<"\nDigte 1o numero: "; cin>>num2; for(x=1;x<num1;x++) if( num1 % x == 0) soma1+=x; for(x=1;x<num2;x++) if( num2 % x == 0) soma2+=x; if( soma1== num2 && soma2 == num1 ) cout<<"\nNumeros Amigos"; else cout<<"\Nao sao amigos";
19
//Solucao com funao #include <iostream> using namespace std; int amigos(int n) { int x, s=0; for(x=1;x<n;x++) if( n % x == 0) s+=x; return s; } int main() { int num1, num2, soma1, soma2; cout<<"\nDigte 1o numero: "; cin>>num1; cout<<"\nDigte 1o numero: "; cin>>num2;
2006
soma1=amigos(num1); soma2=amigos(num2); if( soma1== num2 && soma2 == num1 ) cout<<"\nNumeros Amigos"; else cout<<"\Nao sao amigos"; cout<<"\n\n"; system("pause"); }
MMC significa o menor mltiplo comum de dois ou mais nmeros. Ns podemos achar o
#include <iostream> using namespace std; int main() { int a,b,aux,mmc; cout<<"\ndigite primeiro numero: "; cin>> a; cout<<"\ndigite segundo numero: "; cin>>b; if( a < b ) { //troca os valores de a e b aux=a; a=b; b=aux; } mmc=a; while( mmc % b != 0) mmc= mmc+a; cout<<"\nMMC: "<<mmc<<"\n\n"; system("pause"); }
20
2006
Mdias
Mdia aritmtica uma frao cujo numerador a soma dos valores e, no denominador
a quantidade de valores somados.
Aplicao: Entra com a nota da prova, a nota do trabalho e com os respectivos pesos. Exibe a mdia ponderada. #include <iostream> using namespace std; int main() { float nota, trab, pesoN, pesoT, mp; cout<<"\nDigte nota da prova: "; cin>>nota; cout<<"\nDigte nota do trabalho: "; cin>>trab; cout<<"\nDigte peso da prova: "; cin>>pesoN; cout<<"\nDigte peso do trabalho: "; cin>>pesoT; mp= (nota*pesoN + trab*pesoT) /(pesoN
21
2006
7.
Porcentagem
Muitos de nossos programas iro precisar desse conceito. O smbolo de porcentagem %. uma forma de se comparar dois nmeros e resulta de uma regra de trs simples. A primeira frao ter como denominador o nmero que representa uma parte do outro nmero e, como denominador, o maior nmero. A segunda frao ter como denominador 100 e no numerador, uma incgnita porque o que desejamos calcular. Confuso. Voc pode dar um exemplo? Claro! Observe a aplicao abaixo.
Aplicao Suponha que voc tenha um conjunto de 40 alunos e, nesse conjunto, existem 15 alunos que esto com mdia igual ou superior a 9,0 em Algoritmos. Voc gostaria de saber que percentual esse grupo representa.
Claro que no.Se voc fizer todos os exerccios propostos, far parte desse grupo.
Com certeza!
30%: Voc fala trinta por cento. Substitua o por pela diviso e o cento, por 100.
22
2006
Porcentagem usada em expresses que representam acrscimos em salrios ou aluguis, dedues em compras, etc. Aplicao: Suponha que o salrio ser reajustado em 7%: Matemtica C++ Acrscimo = salario x
7 100
7 100
Se usssemos a propriedade distributiva: salario(1 + 0,07) = salario x 1,07 Novo salario = salario x 1,07 NovoSalario = salario * 1.07;
Lembre-se de que na linguagem C++ quando dividimos um nmero inteiro por um inteiro, o resultado ser um inteiro. Sendo assim no se esquea de converter para real: 7.0/100 ou (float) 7/100 se voc inverter a expresso: 7/100 * salrio, ficando assim: 7.0/100 * salrio ou (float) 7/100 * salario Se o percentual de reajuste for desconhecido, ento teramos que usar a expresso: Matemtica Novo salario= salario + salario x C++
indice 100
Desconto em uma compra: O desconto ser de 12% se a compra for a vista. Matemtica C++ Desconto = valor x
12 100
12 100
NovoValor = valor - valor * 12/100 ; NovoValor = valor - valor * 0.12; valor(1 - 0,12) = valor x 0,88.
23
2006
Se ndice do desconto for desconhecido, ento teramos que usar a expresso: Matemtica C++ NovoValor = valor valor * indice /100;
No se esquea que o ndice, expresso em percentual, sempre um valor real. Aplicao: Entrar com o salrio e o ndice de reajuste. Exibir o novo salrio. #include <iostream> using namespace std; int main() { float salario, novoSalario, indice; cout<<"\nDigite o salario: "; cin>>salario; cout<<"\nDigite o indice de reajuste em porcentagem: "; cin>>indice; novoSalario=salario+ salario*indice/100; cout<<"\nNovo salario R$ " << novoSalario<<endl; system("pause"); }
24
2006
Tringulos
Tringulo um polgono que tem trs lados A condio para que trs nmeros possam ser lados de um tringulo :
No C++: if(a<b+c && b<a+c & c<a+b) A classificao dos tringulos quanto aos lados:
O teorema de Pitgoras: O quadrado da hipotenusa igual soma dos quadrados dos catetos. Pelo teorema de Pitgoras e sua extenso, podemos classificar os tringulos quantos aos ngulos, tendo em vista os lados: Tringulo Retngulo Tringulo Obtusngulo Tringulo Acutngulo
25
Aplicao: Entrar com trs nmeros que representam os lados de um triangulo e classific-lo segundo os lados. #include <iostream> using namespace std; int main() { float a,b,c; cout<<"\nDigite o primeiro lado: "; cin>>a; cout<<"\nDigite o segundo lado: "; cin>>b; cout<<"\nDigite o terceiro lado: "; cin>>c; if(a<b+c && b<a+c & c<a+b) if(a==b && a==c) cout<<"\nEQUILATERO\n"; else if(a==b || a==c || b==c) cout<<"\nISOSCELES\n"; else cout<<"\nESCALENO\n"; else cout<<"\nNao formam um triangulo\n"; system("pause"); } Aplicao: Entrar com trs nmeros que representam os lados de um triangulo e classific-lo segundo os ngulos. #include <iostream> using namespace std; int main() { float a,b,c,hip, cat1,cat2; cout<<"\nDigite o primeiro lado: "; cin>>a; cout<<"\nDigite o segundo lado: "; cin>>b; cout<<"\nDigite o terceiro lado: "; cin>>c; if(a<b+c && b<a+c & c<a+b) { if(a>b && a>c) { hip=a; cat1=b; cat2=c; } else if(b > c)
26
2006
9.
Aplicao: Entrar com a largura e o comprimento de uma sala e exibir quantos metros quadrados sero necessrios para revestir o cho de granito e quantos metros lineares sero necessrios para o rodap sem considerar os arremates. #include <iostream> using namespace std; int main() { float largura, comprimento; cout<<"\nDigite a largura da sala: "; cin>>largura; cout<<"\nDigite o comprimento da sala: "; cin>>comprimento; cout<<"\nVoce precisara comprar "<<largura * comprimento<<" metros quadrados de granito para o chao\n "; cout<<"\nVoce precisara comprar "<<2*(largura + comprimento)<<" metros lineares de rodape\n\n"; system("pause"); }
10.
Relaes Trigonomtricas
sen 2 + cos 2 = 1
tangente = sen cos 1 secante = cos
cotangente = 1 tangente 1 cossecante = sen
28
No se esquea que as funes sin( ), cos( ) e tan( ) exigem que o ngulo seja dado em radianos, ou convertido para radiano.
Como mesmo que se converte de graus para radianos? Voc falou muito rpido. V mais devagar, por favor, pois tem mais de dez anos que no estudo.
em
Temos duas unidades para medir os ngulos: grau, do seu transferidor, e radiano. Leia a nota para saber porque a medida radiano escolhida.
O radiano (smbolo: rad) a unidade de medida do Sistema Internacional de Unidades (sigla: SI) que um conjunto de definies utilizado na maioria dos pases, visando uniformizar. Aplicao #include <iostream> #include <cmath> using namespace std; int main() { float angulo, rang; cout<<"\nangulo: "; cin>>angulo; rang= angulo*M_PI/180; cout<<"\nseno : "<<sin(rang)<<"\n"; cout<<"\nco-seno : "<<cos(rang)<<"\n"; cout<<"\ntangente : "<<tan(rang)<<"\n"; cout<<"\nco-secante : "<<1/sin(rang)<<"\n"; cout<<"\nsecante : "<<1/cos(rang)<<"\n"; cout<<"\nco-tangente: "<<1/tan(rang)<<"\n\n"; system("pause"); }
29
2006
Percebo que voc est comeando a se preocupar com detalhes que simplificam nossos programas. Muitas linguagens de programao disponibilizam a constante PI como nomes diferentes. Infelizmente, no. Sugiro que voc, nesses casos, defina sua constante PI cujo valor : 3.14159265358979323846
11.
Seja a equao:
ax 2 + bx + c = 0
com a 0 .
A frmula de Baskara garante que suas razes podem ser calculadas atravs das frmulas abaixo desde que
0 e sendo
A nica restrio que o coeficiente a no seja 0, pois no seria uma equao do 2o grau. Dependendo do valor de , podemos concluir que:
> 0: obteremos duas razes reais = 0: obteremos uma raiz igual a 0 e a outra, real < 0: obteremos duas razes complexas
Agora vou lhe dar razo. O conjunto dos complexos foi retirado do ensino mdio, mas no se preocupe, pois s fazer o teste com .
30
2006
12
an = a1 + (n 1)r .
( a1 + an ).n 2
PG uma seqncia de nmeros cujos termos crescem com uma razo constante, podendo ser crescente ou decrescente (multiplica-se, ou dividi-se, a razo).
31
2006
an = a1 . qn 1 .
a1 (qn 1) Sn = q 1
Com certeza. Voc est ficando cada vez melhor!
.
Esse conceito de sries igual a dos parmetros da estrutura do for. Aplicao. #include <iostream> #include <cmath> using namespace std; int main() { int x, somaPA=0,somaPG=0; float SPA,SPG; cout<<"\nPA - decrescente\n"; for(x=10; x>=1; x--) { cout<<x<<"\t"; somaPA+=x; } cout<<"\n\n";
cout<<"\nPG - crescente\n"; for(x=3; x<=20000; x*=3) { cout<<x<<"\t"; somaPG+=x; } cout<<"\n\n"; SPA=((10+1)*10)/2; SPG=(3*(pow(3.,9.)-1))/(3-1); cout<<"\nPA\tPG\n"; cout<<"\nUsando acumulaor\n"; cout<<"\n"<<somaPA<<"\t"<<somaPG; cout<<"\nUsando a formula\n"; cout<<"\n"<<SPA<<"\t"<<SPG; cout<<"\n\n"; system("pause"); }
32
2006
Fatorial
O fatorial de um nmero n, sendo n 0, o produto de todos inteiros positivos desde um at o nmero, sabendo-se que o fatorial de 0 e de 1 igual a 1. Sua representao na matemtica : o nmero seguido do ponto de exclamao. Exemplo: fatorial de seis: 6! . #include <iostream> using namespace std; int main() { int x, num,fatorial; cout<<"\nNumero: "; cin>>num; fatorial=1; for(x=1; x<=num; x++) fatorial *=x; cout<<"\nFatorial: "<< fatorial; cout<<"\n\n"; system("pause"); }
14.
Arranjo e Combinao
Arranjos so agrupamentos de p elementos onde p < n, sendo n o nmero total de elementos. Sua representao :
n Ap
, lendo-se: Arranjo de n, p a p.
Arranjos so gerados com estruturas de repetio aninhadas (Exemplo: for dentro de for para arranjos 2 a 2). Um exemplo de Arranjo com repetio a gerao das 10 tabuadas de multiplicar.
33
2006
Um exemplo de Arranjo sem repetio a gerao de uma tabela para um torneio de dois turnos no futebol, i., cada time joga com outro duas vezes. #include <iostream> using namespace std; int main() { int x, y; cout<<"\nArranjos Simples 2 a 2\n"; for(x=1; x<=10; x++) { for(y=1; y<=10; y++) if(x!=y) cout<<x<<" - "<<y<<"\t"; cout<<"\n"; } cout<<"\n\n"; system("pause"); }
34
Combinaes so agrupamentos de p elementos onde p < n, sendo n o nmero total de elementos e os agrupamentos so distintos, isto , a ordem no importa(exemplo: ab e ba so iguais). Sua representao :
n Cp
, lendo-se: Combinao de n, p a p.
Um exemplo de combinao a gerao de uma tabela para um torneio de um turno no futebol, i., cada time joga com outro uma vez. Nesse exemplo, a metade do arranjo simples #include <iostream> using namespace std; int main() { int x, y; cout<<"\nCombinacao 2 a 2\n"; for(x=1; x<=10; x++) { for(y=1; y<=10; y++) if(x<y) cout<<x<<" - "<<y<<"\t"; cout<<"\n"; } cout<<"\n\n"; system("pause"); }
35
//1a solucao #include <iostream> using namespace std; int main() { int x,y; //gera os iguais for(x=0; x<=6; x++) cout<<x<<"-"<<x<<"\t"; cout<<"\n"; //combinacao de 7, 2 a 2/ for(x=0; x<=5; x++) { for( y= x+1; y<=6; y++) cout<<x<<"-"<<y<<"\t";
36
//2a solucao #include <iostream> using namespace std; int main() { int x,y; for(x=0; x<=6; x++) { for(y=0; y<=6; y++) if( x<=y ) cout<<x<<"-"<<y<<"\t"; cout<<"\n"; } cout<<"\n\n"; system("pause"); }
2006
14.
Amxn
a11 a12 a13 . a1n Sendo assim, podemos dizer que: a a a . a A numerao das linhas varia de 1 at m crescendo de 1 22 23 21 2n = em 1. . . . . . A numerao das colunas varia de 1 at n crescendo de am1 am2 am3 . amn
1 em 1.
Nossa! O que aconteceu? J comeo a ver um sorriso e sua sobrancelha est menos arqueada.
De repente, deu um estalo e j estou juntando todas as peas de um quebra-cabea.Estou vendo um for dentro do for para representar as linhas e as colunas. Perfeito, mas teremos que fazer adaptaes para algumas linguagens. Na linguagem C++, a numerao das linhas /colunas comea com 0.Veja a nota abaixo.
Percebo que o programa que gerou todos os arranjos de 1 at 10, com repetio, servir para as matrizes bidimensionais.
37
A4 x 4
a00 a01 a02 a03 Sendo assim, podemos dizer que: A numerao das linhas varia de 0 at m-1 a a a a 10 11 12 1,3 = crescendo de 1 em 1. a20 a21 a22 a23 A numerao das colunas varia de 0 at n -1 a30 a31 a32 a33 crescendo de 1 em 1.
Para que possamos ficar mais prximos da programao, passaremos a usar a mesma numerao linha/coluna da linguagem C++. A matriz pode ter tambm s uma dimenso como poder ser observado nas figuras abaixo:
A1x 4 = [2 3 1 13]
2 3 = 1 13
A4 x1
Matriz quadrada uma matriz onde o nmero de linhas igual ao nmero de colunas.
A4 x 4
a00 a01 a02 a03 a a a a 10 11 12 1,3 = a20 a21 a22 a23 a30 a31 a32 a33
Matriz unidade ou identidade uma matriz de ordem n, isto , uma matriz quadrada onde os elementos da diagonal principal so iguais a 1 e os demais, iguais a 0.
1 0 0 0 0 1 0 0 I= 0 0 1 0 0 0 0 1
38
Fazendo uma pequena modificao no programa arranjoSemRepeticao(arranjo simples), obteremos uma sada diferente. Isto lhe lembra o qu? Aplicao: Exiba todas as posies da matriz de ordem 4. #include <iostream> using namespace std; int main() { int x, y; cout<<"\n"; for(x=0; x<4; x++) { for(y=0; y<4; y++) cout<<x<<","<<y<<"\t"; cout<<"\n"; } cout<<"\n\n"; system("pause"); } Aplicao: Exiba todas as posies da matriz de ordem 4 que esto na DP. #include <iostream> using namespace std; int main() { int x, y; cout<<"\n"; for(x=0; x<4; x++) { for(y=0; y<4; y++) if(x==y) cout<<x<<","<<y<<"\t"; else cout<<"\t"; cout<<"\n"; } cout<<"\n\n"; system("pause"); }
39
Aplicao: Exiba todas as posies da matriz de ordem 4 que esto fora da DP. #include <iostream> using namespace std; int main() { int x, y; cout<<"\n"; for(x=0; x<4; x++) { for(y=0; y<4; y++) if(x!=y) cout<<x<<","<<y<<"\t"; else cout<<"\t"; cout<<"\n"; } cout<<"\n\n"; system("pause"); }
Aplicao: Exiba todas as posies da matriz de ordem 4 que esto no tringulo superior da DP. #include <iostream> using namespace std; int main() { int x, y; cout<<"\n"; for(x=0; x<4; x++) { for(y=0; y<4; y++) if(x<y) cout<<x<<","<<y<<"\t"; else cout<<"\t"; cout<<"\n"; } cout<<"\n\n"; system("pause"); }
40
Aplicao: Exiba todas as posies da matriz de ordem 4 que esto no tringulo inferior da DP. #include <iostream> using namespace std; int main() { int x, y; cout<<"\n"; for(x=0; x<4; x++) { for(y=0; y<4; y++) if(x>y) cout<<x<<","<<y<<"\t"; else cout<<"\t"; cout<<"\n"; } cout<<"\n\n"; system("pause"); }
Matriz transposta Dada uma Matriz Am,n, dizemos que AT se o nmero de linhas dela for igual ao nmero de colunas de A e se o nmero de colunas dela for igual ao nmero de linhas de A logo, a transposta de A e ser da seguinte ordem: An,m.
A3,2
Aplicao: Entrar com valores para uma matriz de ordem 2 x 3. Gerar e exibir a transposta. #include <iostream> using namespace std; int main() { int x,y;float a[2][3], at[3][2]; for(x=0; x<2; x++) for(y=0; y<3; y++) { cout<<"Entrar com elemento linha" <<x+1 <<" coluna " <<y+1<<": "; cin>>a[x][y]; at[y][x]=a[x][y];
41
2006
Realmente, tenho que admitir que a lgebra das Matrizes muito fascinante, Operaes com matrizes
2006
2006
2006
Para que possamos multiplicar duas matrizes, o nmero de colunas da primeira tem que ser igual ao nmero de linhas da segunda. A multiplicao de matrizes de maior importncia em vrios aplicativos. Aplicao: Uma bordadeira cearense trabalha com trs tipos de bordados em toalhas: renascena, richelieu e rendend. Faa um programa que armazene a produo mensal dos meses de outubro, novembro e dezembro em uma matriz e o preo de custo e o lucro de cada tipo de toalha em outra matriz. Calcule e exiba o custo total por ms e o lucro total por ms da bordadeira. Ao final, o lucro total. Tipos de bordados Custo/Lucro Renascena Richelieu Rendend Custo Lucro out 6 20 20 Renascena 150 80 nov 5 10 30 Richelieu 135 65 dez 12 15 40 Rendend 95 55 #include <iostream> using namespace std; int main() { char bordado[][20]={"Rensacenca", "Richelieu", "Rendende"}; float custoLucro[3][2], Resultado[3][2], soma; int qtdade[3][3],L,c,m; cout<< "\nProducao das toalhas\n"; for(L = 0; L<3; L++) for(c = 0; c<3; c++) { cout<< "\ndigite numero de toalhas no mes "<<L+1<< " do tipo "<<bordado[c]<<": "; cin>>qtdade[L][c]; } for(L = 0; L<3; L++) {
45
2006
46
47
2006
GIOVANNI,J.R., BONJORNO, J.R. Matemtica 2o grau. vol.1/vol.2/vol.3.So Paulo:FTD. GROSSI, E. ensina quem aprende. In: GROSSI , E. P., BORDIN, J. (org.). Paixo de aprender.5. ed. Petrpolis: Vozes, 1992a. p. 69-75. S
GUIMARES, A. de M., LAJES, N. A. de C. Algoritmos e estruturas de dados. Rio de Janeiro: LTC, 1985. IEZZI, G., DOLCE, O., MACHADO, A. Matemtica e realidade-5a srie/6a srie/7a srie/ 8a srie. Rio de Janeiro:Atual.1997. LOPES, Anita, GARCIA, Guto. Introduo Programao - 500 Algoritmos. 6a ed. Rio de Janeiro: Campus, 2002. MANZANO, J. A. N. G., OLIVEIRA J. F. Algoritmos. de programao. So Paulo: Erica, 1996.
Lgica
para
desenvolvimento
SALVETTI, D. D., BARBOSA L. M.. Algoritmos. So Paulo: Makron Books, 1998. SOUZA, J.C.de M. (Malba Tahan). Matemtica divertida e curiosa. 15a ed. Rio de Janeiro: Record, 2001. STEINBRUCH, A. Matrizes, determinantes e sistemas de equaes lineares. So Paulo: McGraw-Hill,1989. TREMBLAY,J.P., BUNT, R.B. Cincia dos computadores: uma abordagem algortmica. So Paulo: Mc Graw Hill do Brasil, 1983. VILLAS, M.V., VILLASBOAS, L. F. P. Rio de Janeiro Campus, 1997.
Programao:
conceitos, tcnicas e
linguagens.
48