segunda-feira, 31 de outubro de 2011
Sistemas de Apoio à Decisão - Aula 31/10/2011 (Trabalho Prático - 30 pontos)
Problema 1 - 10 pontos
Pesquisar e comentar ao menos 2 (dois) usos da Teoria das Probabilidades na resolução de conflitos entre apostadores. Para você se inteirar de um famoso problema envolvendo jogo de dados clique aqui. Interessante para esse problema seria a elaboração de uma apresentação em Powerpoint para que possa ser publicada.
Problema 2 - 20 pontos
Pesquisar sobre a Teoria dos Jogos Algorítmica. Depois, desenvolver uma simulação em Monte Carlo para resolver o problema de decidir qual melhor partilha entre o jogo de dados interrompido de que trata o Problema 1. Se a abordagem Monte Carlo não for satisfatória para a resolução do problema, desenvolver um software em Algoritmo Genético, Algoritmo Guloso ou outro tipo de algoritmo com o mesmo objetivo.
Sistema de Apoio à Decisão - Aula 31/10/2011 (Teoria dos Jogos 2)
Na aula passada falamos sobre Teoria dos Jogos, Cooperação e Conflito. Vejamos nesta aula algumas aplicações da teoria dos jogos.
História da Teoria das Probabilidades
Cartas entre Pascal e Férmat
Teoria dos Jogos 1
Aplicação da Teoria dos Jogos no Apoio à Decisão
Teoria dos Jogos 2
Aplicação da Teoria dos Jogos no Apoio à Decisão
Segurança da Informação - Aula 31/10/2011 (Intrusão, Vírus e Vermes)
Hoje discutiremos sobre essas pragas do mundo moderno. Pequenos programas que invadem e ficam escondidos em nossas máquinas e, quando falamos em máquinas, queremos dizer quaisquer máquinas, pois hoje tudo é informatizado, desde nossos relógios digitais (pesquise LiveView, ou acesse aqui), computadores de bolso (os handhelds, pockets etc.), smartphones, tablets, netbooks, notebooks, ATM etc. Todo cuidado é pouco e, mesmo assim, ainda corremos grave risco com estas pragas virtuais.
Detecção de Intrusos
http://www.dei.isep.ipp.pt/~andre/documentos/deteccao-intrusos.html
Vírus
http://pt.wikipedia.org/wiki/V%C3%ADrus_de_computador
Vermes (Worms)
http://pt.wikipedia.org/wiki/Worm
O celular vira token no acesso aos serviços do Google
O celular vira token no acesso aos serviços do Google - Senhas - Dicas - INFO Online:
domingo, 30 de outubro de 2011
Notas 3º bimestre 2011 - Introdução a Algoritmos - Turma 1ºE
Olá alunos,
Atenciosamente,
Segurança da Informação - Provas do pré-teste do Enem foram fotografadas
Olá alunos,
Leia as matérias (links a seguir) e tirem suas próprias conclusões:
Ainda pensa que está seguro? Melhor rever seus conceitos.
sexta-feira, 28 de outubro de 2011
Matemática Computacional - Aula 28/10/2011 (Trabalho Prático - 30 pontos)
Trabalho Prático - Valor 30 pontos - Entrega 10/11/2011
Os trabalhos são individuais e deverão ser entregues à mão. Cada problema vale 10 pontos.
Usando o método Simplex e o princípio da Dualidade (se aplicável), resolver os problemas seguintes:
Problema 1
Em uma situação de gerenciamento de recursos hídricos para a geração de energia elétrica, o problema a ser resolvido tem por objetivo minimizar o custo de produção de energia elétrica no horário de operação das 8 às 16h em uma rede de duas usinas.
A descrição geográfica consiste em um rio, com uma barragem e usina hidrelétrica UA a montante, e uma barragem com usina hidrelétrica UB a jusante. Existe uma ramificação afluente B ao rio principal, como mostra a figura abaixo.
Os fluxos de afluência de água às barragens são 60 m³/s para a ramificação A e 20 m³/s para B. A potência elétrica gerada pela usina A é calculada por PA = 0,98ΦA, expressa em kW, e ΦAj é o fluxo de água turbinada, em m³/s. Para B, vale PB = 0,93ΦB. O consumo de energia é dividido em dois períodos: das 8 às 12h e das 12 às 16h. Para cada usina -- que funciona também como ponto de distribuição -- valem os consumos de energia da tabela a seguir.
onde 1 kWh é a medida de energia correspondente ao consumo de 1 kWh de potência durante um período de 1 hora. A saber, energia = potência x tempo.
O que não é possível suprir com a energia hidrelétrica deve ser suprido com energia proveniente de usinas térmicas. Porém, 1 kWh de energia elétrica gerada por hidrelétricas custa 18 u.m. (unidades monetárias), e a energia proveniente de termoelétricas custa 50 u.m. por kWh.
Às 8 horas, a barragem da usina A dispõe de 216000 m³ e a barragem B dispõe de 72000 m³. Suponha que a água não turbinada fique represada na barragem e que as perdas por infiltrações e evaporação sejam desprezíveis. As barragens são grandes o suficiente para evitar que água em excesso possa vir a verter. Variáveis de decisão sugeridas para a formulação:
- Φij = fluxo de água turbinada na usina hidrelétrica i (i = A, B) durante o período j (j = 1 no horário das 8 às 12h; j = 2 no horário das 12 às 16h);
- Tij = energia gerada pelas termoelétricas em i (i = A ou B) durante o período j para suprir eventuais carências de energia não supridas pelas geradoras hidrelétricas.
Problema 2
Min Z = 5 x1 + 10 x2 + x3
sujeito a
3 x1 + 2 x2 + 0,8 x3 >= 40
x1 + x2 + 0,5 x3 >= 25
x1 - 2 x3 >= -1
x1, x3 >= 0
Solução (sugestão inicial)
Problema 3
Min Z = 2 x1 ‐ 10 x2 + x3 + 4 x4
sujeito a
3 x1 + 6 x2 + 3 x4 <= 100
4 x1 + 10 x4 >= 50
‐3 x1 + x2 + 6 x3 >= 30
x1, x2, x3, x4 >= 0
Solução (sugestão inicial)
O Mathaeus esboçou um princípio de solução, que parece-me estar correta.
Boa sorte!
Matemática Computacional - Aula 28/10/2011 (Princípio da Dualidade)
O princípio da dualidade se aplica a problemas de minimização, os quais podem ser transformados em problemas de maximização, onde podemos aplicar o método Simplex para resolvê-los como sendo de maximização e, posteriormente, obtermos a resposta da minimização.
Você pode acompanhar as páginas do livro abaixo que contém exemplos muito simples e fáceis de compreender.
quinta-feira, 27 de outubro de 2011
Exercícios Método Simplex
Resolva usando o método Simplex:
Questão 1)
Maximizar: Z = 9x1 + 3x2
Sujeito a:
2x1 + x2 < 14
2x1 + 3x2 < 24
x1, x2 >0
Questão 2)
Maximizar Z = 5x1 + 5x2
Sujeito a:
8x1 + 4x2 < 32
x1 + 2x2 < 8
x1, x2 > 0
Questao 3)
Maximizar Z = 16x1 + 12x2
Sujeito a:
2x1 < 8
2x1 + 3x2 < 12
2x1 + x2 < 8
x1, x2 > 0
Solução do exercício proposto Tutorial Dev-C++ 015 - 5-f
#include <cstdlib>
#include <iostream>
using namespace std;
//S = 3/4 + 5/5 + 7/6 + … + (2n + 1) / (n + 3)
double calculaS(double);
int main(int argc, char *argv[])
{
double a;
printf("Calcula somas do tipo S = 3/4 + 5/5 + 7/6 + ... + (2n + 1) / (n + 3)\n\n");
printf("Forneca n: ");
scanf("%lf", &a);
printf("Soma S = %0.20lf\n\n", calculaS(a));
system("PAUSE");
return EXIT_SUCCESS;
}
double calculaS(double n) {
double numerador;
double denominador;
double soma = 0.0;
double i = 1.0;
while(i<=n) {
numerador = 2*i + 1;
denominador = i + 3;
soma += numerador/denominador;
i+=1.0;
}
return soma;
}
Solução do exercício proposto Tutorial Dev-C++ 015 - 5-e
#include <cstdlib>
#include <iostream>
using namespace std;
//S = 1 + 1/1! + 1/2! + 1/3! + 1/N!
double calculaS(double);
double calculaFatorial(double);
int main(int argc, char *argv[])
{
double a;
printf("Calcula somas do tipo S = 1 + 1/1! + 1/2! + 1/3! + 1/N!\n");
printf("Para N > 1000 a soma S se aproxima do numero \'e\', base dos logaritmos naturais.\n");
printf("Alias, numeros como e, sen(x), cos(x), tan(x), log(x) etc. sao calculados assim.\n\n");
printf("Forneca N: ");
scanf("%lf", &a);
printf("Soma S = %0.20lf\n\n", calculaS(a));
system("PAUSE");
return EXIT_SUCCESS;
}
double calculaS(double n) {
double denominador = 0.0;
double soma = 0.0;
while(denominador<=n) {
soma += 1.0/calculaFatorial(denominador);
denominador+=1.0;
}
return soma;
}
double calculaFatorial(double n) {
double fat = 1.0;
double i = 1.0;
if((n==0.0) || (n==1.0)) return 1.0;
while(i<=n)
fat*=i++;
return fat;
}
Solução do exercício proposto Tutorial Dev-C++ 015 - 5-d
#include <cstdlib>
#include <iostream>
using namespace std;
//S = 1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/N
double calculaS(double);
int main(int argc, char *argv[])
{
double a;
printf("Calcula somas do tipo S = 1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/N\n");
printf("Forneca N: ");
scanf("%lf", &a);
printf("Soma S = %lf\n\n", calculaS(a));
system("PAUSE");
return EXIT_SUCCESS;
}
double calculaS(double n) {
double denominador = 1.0;
double soma = 0.0;
while(denominador<=n) {
soma += 1.0/denominador;
denominador+=1.0;
}
return soma;
}
Solução do exercício proposto Tutorial Dev-C++ 015 - 5-c
#include <cstdlib>
#include <iostream>
#include <stdbool.h>
using namespace std;
bool numPositivo(int);
int main(int argc, char *argv[])
{
int a;
printf("Verificar se um numero e positivo ou negativo.\n");
printf("\tDigite um numero inteiro: ");
scanf("%d", &a);
putchar('\n');
if(numPositivo(a))
printf("E positivo!\n\n");
else printf("Nao e positivo!\n\n");
system("PAUSE");
return EXIT_SUCCESS;
}
bool numPositivo(int n) {
return n>=0;
}
Solução do exercício proposto Tutorial Dev-C++ 015 - 5-b
#include <cstdlib>
#include <iostream>
using namespace std;
int numPerfeito(int);
int main(int argc, char *argv[])
{
int a;
printf("Verificar se um numero e perfeito.\n");
printf("\tDigite um numero inteiro: ");
scanf("%d", &a);
putchar('\n');
if(numPerfeito(a))
printf("E perfeito!\n\n");
else printf("Nao e perfeito!\n\n");
system("PAUSE");
system("CLS");
printf("Verificando os primeiros 200 naturais.\n");
for(a=1;a<=200;a++) {
if(a%5==0) {
system("PAUSE");
system("CLS");
}
if(numPerfeito(a))
printf(" >>>> E perfeito!\n");
else printf(" >>>> Nao e perfeito!\n");
}
system("PAUSE");
return EXIT_SUCCESS;
}
int numPerfeito(int n) {
int i;
int soma = 0;
printf("\nDivisores: ");
for(i=1;i<=n;i++) {
if(n%i==0) {
printf("%d; ", i);
if(i<n) soma += i;
}
}
printf("\n\nSoma dos divisores de %d, exceto %d = %d\n\n", n, n, soma);
return soma==n;
}
Solução do exercício proposto Tutorial Dev-C++ 015 - 5-a
#include <cstdlib>
#include <iostream>
using namespace std;
float fazOp(float, char, float);
int main(int argc, char *argv[])
{
float a, b;
printf("Numero 1: ");
scanf("%f", &a);
putchar('\n');
printf("Numero 2: ");
scanf("%f", &b);
putchar('\n');
printf("\nResultados para %f e %f:\n", a, b);
printf("\tsoma.............: %f\n", fazOp(a, '+', b));
printf("\tdiferencao.......: %f\n", fazOp(a, '-', b));
printf("\tproduto..........: %f\n", fazOp(a, '*', b));
printf("\tdivisao..........: %f\n", fazOp(a, '/', b));
printf("\n\nTentando o operador \'@\':\n");
printf("\toperacao invalida: %f\n", fazOp(a, '@', b));
system("PAUSE");
return EXIT_SUCCESS;
}
float fazOp(float n1, char op, float n2) {
switch(op) {
case '+': return n1 + n2; break;
case '-': return n1 - n2; break;
case '*': return n1 * n2; break;
case '/': return n1 / n2; break;
default:
printf("\tERRO: Operador %c invalido!\n\n", op);
return 0;
break;
}
}
Tutorial Dev-C++ 015 - Funções 2
Olá alunos,
15º tutorial aqui.
próximo tutorial (em breve)
Atenciosamente,
quarta-feira, 26 de outubro de 2011
Sistemas de Apoio à Decisão - Aula 26/10/2011 (Teoria dos jogos, cooperação e conflito)
Teoria dos jogos
Cooperação
Conflito
segunda-feira, 24 de outubro de 2011
Segurança da Informação - Aula 24/10/2011 (Segurança de sistemas: e mail, IP e Web seguros)
Segurança de sistemas: e mail, IP e Web seguros
Cartilha de segurança de email
2. Segurança de IP
Problemas de segurança com o protocolo IP
Sem segurança, as redes públicas e privadas estão sujeitas a monitoramento e acesso não autorizados. Ataques internos podem ser resultado de ínfima segurança de intranet, ou até de nenhuma. Os riscos externos à rede privada são provenientes de conexões com a Internet e extranets. Os controles de acesso do usuário com base em senhas não podem por si só proteger os dados transmitidos em uma rede.
Tipos comuns de ataques de rede
Sem o uso de medidas de segurança e controles, os seus dados podem estar sujeitos a ataques. Alguns ataques são passivos, pois efetuam apenas um monitoramento de informações. Outros são ativos e as informações são alteradas com a intenção de corromper ou destruir os dados ou até a própria rede. Se você não tiver um plano de segurança em execução, suas redes e dados estarão vulneráveis a quaisquer tipos de ataques.
Bisbilhotando
Em geral, a maior parte das comunicações de rede ocorre com texto direto (não criptografado), o que permite a um invasor que tenha obtido acesso aos caminhos de dados de uma rede monitorar e interpretar (ler) o tráfego. Quando um invasor está bisbilhotando as comunicações, diz-se que ele está farejando ou espionando. A capacidade de monitoramento da rede por parte desse tipo de invasor é geralmente o maior problema de segurança que os administradores enfrentam em uma empresa. Sem o uso de serviços de criptografia seguros, os dados poderão ser lidos por outras pessoas ao percorrerem a rede.
Modificação de dados
Depois de um invasor ter lido os dados, geralmente a próxima etapa lógica será modificá-los. Um invasor pode modificar os dados contidos em um pacote sem o conhecimento do remetente ou do receptor. Mesmo que não necessite de confidencialidade para todas as comunicações, ninguém deseja que suas mensagens sejam modificadas quando estiverem em trânsito. Por exemplo, ao enviar requisições de compra, ninguém quer que sejam alteradas informações sobre itens, quantidades ou cobrança.
Falsificação de identidade (falsificação de endereço IP)
A maior parte das redes e sistemas operacionais utilizam o endereço IP para identificar um computador como válido em uma rede. Em alguns casos, é possível que um endereço IP seja utilizado de maneira falsa. Isso é conhecido como falsificação de identidade. Um invasor poderá usar programas especiais para construir pacotes IP que pareçam ser provenientes de endereços válidos na intranet de uma organização.
Após obter acesso à rede com um endereço IP válido, o invasor poderá modificar, excluir ou encaminhar novamente os dados. O invasor também poderá efetuar outros tipos de ataques, conforme está descrito nas seções a seguir.
Ataques com base em senhas
Um fato comum nos planos de segurança da maioria das redes e sistemas operacionais é o controle do acesso com base em senhas. O acesso aos recursos das redes e dos computadores é determinado pelo uso de um nome de usuário e senha.
Historicamente, muitas versões dos componentes dos sistemas operacionais nem sempre protegiam as informações sobre identidade quando eram transmitidas através da rede para serem validadas. Isso pode permitir que uma pessoa que esteja bisbilhotando a rede determine um nome de usuário e senha válidos e os utilize para obter acesso à rede fazendo logon como um usuário válido.
Quando um invasor localiza e acessa uma conta de usuário válida, ele tem os mesmos direitos que o usuário real. Por exemplo, se o usuário tiver direitos administrativos, o invasor pode criar contas adicionais para acessar a rede posteriormente.
Após obter acesso a uma rede com uma conta válida, um invasor poderá fazer o seguinte:
- Obter listas de nomes de computadores e usuários válidos e de informações da rede.
- Modificar configurações de rede e servidor, incluindo controles de acesso e tabelas de roteamento.
- Modificar, excluir ou reencaminhar dados.
Ataque de negação de serviço
Diferentemente de um ataque com base em senha, o ataque de negação de serviço impede que um usuário válido use normalmente o computador ou a rede.
Após obter acesso a uma rede, um invasor poderá fazer o seguinte:
- Distrair a equipe de trabalho dos sistemas de informações para que a intrusão não seja detectada imediatamente. Isso dá ao invasor a oportunidade de fazer ataques adicionais.
- Enviar dados inválidos para aplicativos ou serviços da rede, fazendo com que eles sejam fechados ou não funcionem de forma normal.
- Enviar um fluxo de tráfego até que um computador ou uma rede inteira seja desligada.
- Bloquear o tráfego, o que restringirá o acesso de usuários autorizados aos recursos da rede.
Ataque com interceptação de terceiros
Como o nome indica, um ataque com interceptação de terceiros ocorre quando uma pessoa, entre dois usuários que estejam se comunicando, está monitorando, capturando e controlando a comunicação sem o conhecimento dos usuários. Por exemplo, um invasor pode negociar chaves de criptografia com os dois usuários. Cada usuário pode enviar dados criptografados para o invasor, que poderá descriptografá-los. Quando os computadores estiverem se comunicando em níveis baixos da camada da rede, talvez eles não possam determinar com que computadores estão trocando dados.
Ataque de chave comprometida
Uma chave é um número ou código secreto exigido para criptografar, descriptografar ou validar informações protegidas. Embora a determinação de uma chave seja um processo difícil e que exija o uso de muitos recursos por parte de um invasor, ele é possível. Depois de o invasor determinar uma chave, ela será conhecida como chave comprometida.
O invasor usa a chave comprometida para obter acesso a uma comunicação protegida sem que o destinatário ou o receptor tenham conhecimento do ataque. Com a chave comprometida, o invasor poderá descriptografar ou modificar dados. O invasor também poderá tentar usar a chave comprometida para descobrir outras chaves, o que pode permitir o acesso a outras comunicações protegidas.
Ataque de farejadores
Um farejador é um aplicativo ou dispositivo que pode ler, monitorar e capturar pacotes e trocas de dados de rede. Se os pacotes não estiverem criptografados, o farejador permitirá que os dados contidos no pacotes sejam totalmente visualizados. Até pacotes encapsulados poderão ser lidos e abertos se não estiverem criptografados.
Ao usar um farejador, um invasor poderá fazer o seguinte:
- Analisar uma rede e as informações de acesso, fazendo com que a rede, por fim, pare de responder ou fique corrompida.
- Ler comunicações privadas.
Ataque de camada de aplicativo
Um ataque de camada de aplicativo atinge servidores de aplicativos ocasionando uma falha nos aplicativos ou no sistema operacional do servidor. Isso permite que o invasor possa deixar de ser submetido a controles de acesso normais. O invasor se beneficiará dessa situação, obtendo o controle de um aplicativo, sistema ou rede, e poderá fazer o seguinte:
- Ler, adicionar, excluir ou modificar dados ou um sistema operacional.
- Introduzir um vírus que utilize computadores e aplicativos de software para se reproduzir por toda a rede.
- Introduzir um programa farejador para analisar a rede e obter informações que poderão, por fim, ser usadas para fazer com que a rede pare de responder ou fique corrompida.
- Fechar os aplicativos de dados ou sistemas operacionais de forma anormal.
- Desativar outros controles de segurança para possibilitar futuros ataques.
3. Segurança na Web
Sistemas de Apoio à Decisão - Aula 24/10/2011 (Incerteza e Risco)
- distribuição de probabilidade
- Em estatística, uma distribuição de probabilidade descreve a chance que uma variável pode assumir ao longo de um espaço de valores. Ela é uma função cujo domínio são os valores da variável e cuja imagem são as probabilidades de a variável assumir cada valor do domínio. O conjunto imagem deste tipo de função está sempre restrito ao intervalo entre 0 e 1.
Uma distribuição de probabilidade pode ser discreta (como em um jogo de dados) ou contínua. É comum o uso de funções que se ajustem à distribuição de probabilidade.
Um processo estocástico é uma família de variáveis aleatórias indexadas por elementos t pertencentes a determinado intervalo temporal. Intuitivamente, se uma variável aleatória é um número real que varia aleatoriamente, um processo estocástico é uma função temporal que varia aleatoriamente.
De forma simplificada, podemos dizer que processos estocásticos são processos aleatórios que dependem do tempo.
Mais genericamente, seguindo Kac (M. Kac & J. Logan, in Fluctuation Phenomena, eds. E.W. Montroll & J.L. Lebowitz, North-Holland, Amsterdam, 1976) e Nelson (E. Nelson, Quantum Fluctuations, Princeton University Press, Princeton, 1985), qualquer tipo de evolução temporal (determinística ou essencialmente probabilística) que seja analisável em termos de probabilidade pode ser chamada de processo estocástico.
- números fuzzy;
A lógica difusa ou lógica fuzzy é uma extensão da lógica booleana que admite valores lógicos intermediários entre o FALSO (0) e o VERDADEIRO (1); por exemplo o valor médio 'TALVEZ' (0,5). Isto significa que um valor lógico difuso é um valor qualquer no intervalo de valores entre 0 e 1. Este tipo de lógica engloba de certa forma conceitos estatísticos principalmente na área de Inferência.
As implementações da lógica difusa permitem que estados indeterminados possam ser tratados por dispositivos de controle. Desse modo, é possível avaliar conceitos não-quantificáveis. Casos práticos: avaliar a temperatura (quente, morno, médio etc.), o sentimento de felicidade(radiante, feliz, apático, triste...), a veracidade de um argumento (correctíssimo, correto, contra-argumentativo, incoerente, falso, totalmente errôneo etc.)
A lógica fuzzy deve ser vista mais como uma área de pesquisa sobre tratamento da incerteza, ou uma família de modelos matemáticos dedicados ao tratamento da incerteza, do que uma lógica propriamente dita. A lógica difusa normalmente está associada ao uso da teoria de conjuntos fuzzy proposto por Lukasiewicz.
Ao trabalhar com a lógica fuzzy é comum chamar a lógica booleana de lógica nítida.
Muitos pesquisadores de versões booleanas de lógica não aceitam a lógica fuzzy como uma verdadeira lógica, no sentido em que aceitam, por exemplo, a lógica modal. Isso pode ser associado a diferentes fatos, entre eles o fato de muitos modelos permitirem soluções aproximadas que não correspondem a uma "verdade" lógica.
Técnicas para o tratamento de incertezas:
- árvore de decisão
- diferenças finitas
- simulação Monte Carlo (vide também Como Usar o Excel para Simulação em MC)
- Caos Polinomial (vide também Técnicas de Amostragem)
- Simulação Monte Carlo distribuída (vide o exemplo do Cálculo de Pi)
- Relação Risco-Retorno
Professores denunciam “lista negra” nos institutos federais em greve, assessor de Fernando Haddad nega | Viomundo - O que você não vê na mídia
sexta-feira, 21 de outubro de 2011
Solução do exercício proposto Tutorial Dev-C++ 014 4-e
// Solução do exercício proposto Tutorial 14 4-e
#include <cstdlib>
#include <iostream>
using namespace std;
void imprimeVetor(float v[], int n);
void leVetor(float v[], int n);
void insert(float v[], int n, int valor, int pos);
const int MAXTAM = 10;
int TAM = 5;
int main(int argc, char *argv[])
{
int dup;
float vet[MAXTAM];
leVetor(vet, TAM);
imprimeVetor(vet, TAM);
putchar('\n');
insert(vet, TAM, -10, 3);
imprimeVetor(vet, TAM);
putchar('\n');
insert(vet, TAM, -20, 1);
imprimeVetor(vet, TAM);
putchar('\n');
system("PAUSE");
return EXIT_SUCCESS;
}
void leVetor(float v[], int n) {
int i;
printf("Lendo %d valores...\n", n);
for(i=0;i<n;i++) {
printf("vetor[%d]= ", i);
scanf("%f", &v[i]);
}
}
void imprimeVetor(float v[], int n) {
int i;
printf("Imprimindo %d valores...\n", n);
for(i=0;i<n;i++)
printf("%2d: %0.3f ", i, v[i]);
putchar('\n');
}
void insert(float v[], int n, int valor, int pos) {
int i;
// desloca valores
for(i=n;i>pos;i--)
v[i]=v[i-1];
// insere valor
v[pos]=valor;
TAM += 1;
printf("Inserido valor %d na posicao %d...\n", valor, pos);
}
Solução do exercício proposto Tutorial Dev-C++ 014 4-a
// Solução do exercício proposto Tutorial 14 4-a
#include <cstdlib>
#include <iostream>
using namespace std;
const int MAX = 10;
int main(int argc, char *argv[])
{
int vet[MAX];
int i;
int valor;
int diff;
for(i=0;i<MAX;i++) {
printf("vet[%d]= ",i+1);
scanf("%d", &vet[i]);
putchar('\n');
}
printf("\n\nValor procurado: ");
scanf("%d", &valor);
putchar('\n');
// encontra menor diferença
diff = abs(vet[0] - valor);
for(i=1;i<MAX;i++)
if(abs(vet[i]-valor)<diff)
diff = abs(vet[i]-valor);
// mostra vetor
for(i=0;i<MAX;i++)
printf("%2d: %2d ", i+1, vet[i]);
printf("\n\n");
// procura valor
for(i=0;i<MAX;i++)
if(abs(vet[i]-valor)==diff)
printf( "___^__ ");
else printf(" ");
printf("\n\n");
system("PAUSE");
return EXIT_SUCCESS;
}
Solução do exercício proposto Tutorial Dev-C++ 014 4-b
// Solução do exercício proposto Tutorial 14 4-b
#include <cstdlib>
#include <iostream>
using namespace std;
const int MAX = 10;
int qtdRepeticoes(int v[], int n);
int main(int argc, char *argv[])
{
int vet[MAX];
int i;
for(i=0;i<MAX;i++) {
printf("vet[%d]= ", i+1);
scanf("%d", &vet[i]);
putchar('\n');
}
printf("\n\n");
printf("Vetor: todos os elementos\n");
for(i=0;i<MAX;i++)
printf("%d ", vet[i]);
putchar('\n');
printf("Vetor: nao repetidos\n");
for(i=0;i<MAX;i++)
if(qtdRepeticoes(vet, vet[i])<2)
printf("%d ", vet[i]);
printf("\n\n");
system("PAUSE");
return EXIT_SUCCESS;
}
int qtdRepeticoes(int v[], int n) {
int rep = 0;
int i;
for(i=0;i<MAX;i++)
if(v[i]==n) rep++;
return rep;
}
Solução do exercício proposto Tutorial Dev-C++ 014 4-c
// Solução do exercício proposto Tutorial 14 4-c
#include <cstdlib>
#include <iostream>
using namespace std;
const int MAX_A = 5;
const int MAX_B = 5;
const int MAX_C = 5;
void leVetor(int v[], int t);
void imprimeVetor(int v[], int t);
void multiplicaVetores(int v1[], int v2[], int v3[], int t);
int main(int argc, char *argv[])
{
int A[MAX_A];
int B[MAX_B];
int C[MAX_C];
printf("Vetor A\n");
leVetor(A, MAX_A);
printf("\nVetor B\n");
leVetor(B, MAX_B);
multiplicaVetores(A, B, C, MAX_C);
printf("\nVetor A\n");
imprimeVetor(A, MAX_A);
printf("\nVetor B\n");
imprimeVetor(B, MAX_B);
printf("\nVetor C\n");
imprimeVetor(C, MAX_C);
system("PAUSE");
return EXIT_SUCCESS;
}
void leVetor(int v[], int t) {
int i;
printf("\nInforme valores do vetor\n");
for(i=0;i<t;i++) {
printf("%d: ", i+1);
scanf("%d", &v[i]);
putchar('\n');
}
}
void imprimeVetor(int v[], int t) {
int i;
printf("\nValores do vetor\n");
for(i=0;i<t;i++) {
printf("%d: %d ", i+1, v[i]);
}
putchar('\n');
}
void multiplicaVetores(int v1[], int v2[], int v3[], int t) {
int i;
for(i=0;i<t;i++)
v3[i] = v1[i] * v2[i];
}
Solução do exercício proposto Tutorial Dev-C++ 014 4-d
// Solução do exercício proposto Tutorial 14 4-d
#include <cstdlib>
#include <iostream>
using namespace std;
void imprimeVetor(float v[], int n);
void leVetor(float v[], int n);
int remove_dup(float v[], int n);
void ordenaVetor(float v[], int n);
int MAX = 10;
int main(int argc, char *argv[])
{
int dup;
float vet[MAX];
leVetor(vet, MAX);
ordenaVetor(vet, MAX);
imprimeVetor(vet, MAX);
if(!(dup=remove_dup(vet, MAX)))
printf("Nao ha valores duplicados...\n\n");
else
{
printf("Encontrados %d duplicatas. Duplicatas removidas...\n", dup);
imprimeVetor(vet, MAX);
}
system("PAUSE");
return EXIT_SUCCESS;
}
void leVetor(float v[], int n) {
int i;
printf("Lendo %d valores...\n", n);
for(i=0;i<n;i++) {
printf("vetor[%d]= ", i+1);
scanf("%f", &v[i]);
//putchar('\n');
}
}
void imprimeVetor(float v[], int n) {
int i;
printf("Imprimindo %d valores...\n", n);
for(i=0;i<n;i++)
printf("%2d: %0.3f ", i+1, v[i]);
putchar('\n');
}
int remove_dup(float v[], int n) {
float temp;
int i;
int dup = 0;
int tam;
float v_temp[n]; // vetor temporario
tam = n;
temp = v[0]; // guarda ultimo valor lido
v_temp[0] = temp; // guarda valor nao repetido
// guarda somente valores nao repetidos em v_temp
for(i=1;i<n;i++) {
if(v[i]!=temp) { // valor atual é diferente do guardado
v_temp[i]=v[i]; // transfere valor para v_temp
temp=v[i]; // atualiza temp
}
else
{
temp=v[i]; // atualiza temp
tam--; // v_temp ficará menor
dup++; // quantidade de duplicatas aumenta
}
}
// atualiza vetor sem as repetições
MAX = tam;
for(i=0;i<n;i++)
v[i]=v_temp[i];
return dup;
}
void ordenaVetor(float v[], int n) {
float temp;
int i;
int j;
printf("Ordenando vetor...\n", n);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(v[i]>v[j]) {
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
printf("Vetor ordenado...\n", n);
}
segunda-feira, 17 de outubro de 2011
Segurança da Informação - Aula 17/10/2011 (Segurança de Redes)
Para nossa aula de hoje acessar e ler a Cartilha de Segurança Para Internet, em especial a Parte I, dos itens 1 a 7.
Sistemas de Apoio à Decisão - Aula 17/10/2011 (Teoria da Decisão)
A teoria da decisão baseia-se em diversos critérios. Podemos adotar uma solução estatística, matemática, usar programação linear etc. Vamos tentar resolver alguns casos de estudo e verificar qual a melhor solução para cada um deles.
Alguns casos de estudo:
Caso 1: Lavanderia
O sr. Branco vai abrir uma nova lavanderia, para a qual pretende comprar várias máquinas de lavar. Já fez um estudo prévio sobre 33 tipos de máquina disponíveis, recolhendo dados sobre os atributos que considera mais importantes: preço, tempo de lavagem e consumo de água e eletricidade (tabela 1). O sr. Branco gostaria de pré-selecionar um conjunto de máquinas (não mais que cinco) para uma análise mais aprofundada que lhe permita fazer a escolha final, atendendo a outros atributos dificilmente quantificáveis.
[adaptado de Zeleny (1982), pg 210]
Máquina Preço US$ Lavagem (T.min) kWh Água (L)
1 509 74 1.5 114
2 425 80 1.5 110
3 446 72 1.6 135
4 564 65 1.6 ll8
5 547 53 1.8 140
6 450 68 1.6 135
7 473 65 1.6 130
8 484 56 1.7 115
9 456 68 1.6 130
10 488 72 1.6 114
11 530 55 1.7 135
12 477 76 1.5 110
13 589 53 1.6 130
14 534 61 1.4 122
15 536 57 1.7 110
16 494 71 1.5 135
17 425 65 1.5 120
18 555 53 1.7 125
19 543 57 1.6 120
20 515 68 1.5 130
21 452 76 1.5 112
22 547 68 1.5 120
23 421 76 1.4 130
24 498 68 1.6 120
25 467 65 1.7 130
26 595 50 1.8 135
27 414 68 1.7 125
28 431 66 1.7 110
29 452 72 1.5 115
30 408 77 1.6 119
31 478 59 1.8 110
32 395 76 1.5 120
33 543 57 1.5 135
Caso 2: Bonecas
A fábrica de brinquedos "Mestre Ado" produz uma boneca de qualidade para exportação ("Mafalda") , e uma outra, normal, para consumo interno ("Sandra"). A Mafalda ocasiona um lucro de 400 reais por unidade, contra 300 da Sandra. Por restrições de material, a fábrica só consegue produzir 400 bonecas por dia (independentemente do tipo). Se só produzisse Mafaldas, a fábrica poderia fabricar apenas 250 por dia, devido ao seu tempo de produção, que é o dobro do da Sandra. A firma quer maximizar o lucro, mas privilegiando a exportação.
[adaptado de Hwang e Masud (1979), pg 23]
Caso 3: America
A tabela 2 foi publicada no The New York Times, em Outubro de 1973, quando a Sra. Emmy Grant estava tentando escolher uma área metropolitana para viver, no seu regresso do estrangeiro.
[adaptado de Zeleny (1982), pg 181]
Caso 4: Editora
Uma editora vai lançar um novo livro, ao preço de 1500 reais. O custo de produção é de 300 reais, mais 300 reais por cada exemplar produzido. Um estudo de mercado permitiu estimar as probabilidades de venda do livro, constantes da tabela 3. A editora quer decidir quantos milhares deve ter a edição.
[adaptado de Zeleny (1982), pg 35]
vendas 0 1000 2000 3000 4000 5000 6000>
prob. 0.05 0.15 0.30 0.25 0.15 0.10 0.00
Quem sou eu
NOSSO OBJETIVO
OBJETIVO
Este blog será usado para divulgação de minhas ideias, notícias sobre tecnologia, disponibilização de links para download de materiais diversos (incluindo materiais didáticos -- que poderão ser usados em minhas aulas e/ou cursos). Gostaria de DEIXAR BEM CLARO que quaisquer materiais disponibilizados através deste blog são, tão somente, para acompanhamento de aulas e/ou cursos, e não constituem de modo algum, aulas na modalidade "ensino à distância" (EAD). Alunos têm total acesso aos materiais disponíveis, mas somente como tutoriais passo a passo. Apostilas disponibilizadas através deste blog não são materiais obrigatórios em disciplinas cursadas ou cursos ministrados.RESPONSABILIDADE
O autor deste blog não é responsável pelo mau uso, intencional ou não, de qualquer código de programa disponibilizado aqui. Os códigos de programas disponíveis neste blog para download é e serão sempre, e tão somente, para uso didático durante o aprendizado. Seja bem-vindo.