Programação de Computadores I BCC 701 2017-1 Teórica 15 TAREFA 1: O Sr. Apu é proprietário de uma vedora de acessórios para computador, a Kwik E' Mart. Esta empresa possui 4 lojas e o Sr. Apu mantém um estoque mínimo de produtos em todas as lojas: HD (100 unidades); impressora (40 unidades); monitor (50 unidades); notebook (30 unidades); e tablet (80 unidades). Estas informações podem ser representadas pelos vetores: produto = [ HD impressora monitor notebook tablet ] minimo = [ 100 40 50 30 80 ] Conforme representado nesses vetores, vemos que a quantidade mínima de HDs é 100 e a quantidade mínima de notebooks é 30. Os estoques das 4 lojas são representados por uma matriz (estoque), onde cada linha representa o estoque de uma determinada loja. Seja a seguinte matriz estoque: 41 48 32 32 81 estoque da loja 1 102 38 50 15 85 estoque da loja 2 100 40 50 30 80 estoque da loja 3 100 40 50 35 78 estoque da loja 4 Você vai escrever um programa para controle do estoque, no qual: Os vetores produto e mínimo, e a matriz estoque, são lidos no início do programa. O programa verifica o estoque de cada produto em cada uma das lojas, identificando uma das seguintes situações em cada loja: a. todos os produtos estão de acordo com o estoque mínimo. Neste caso, é impressa uma mensagem informando tal situação; ou b. são impressos os produtos cujo estoque está abaixo do estoque mínimo e a quantidade que falta para atingir esse estoque. Abaixo, um exemplo de execução do programa. Exemplo RELATÓRIO DO ESTOQUE Loja Nro 1 Produto: HD - Faltam 59 unidades Produto: monitor - Faltam 18 unidades Loja Nro 2 Produto: impressora - Faltam 2 unidades Produto: notebook - Faltam 15 unidades Loja Nro 3 Todos os produtos possuem o estoque mínimo! Loja Nro 4 Produto: tablet - Faltam 2 unidades
Proposta de Solução clc; clear; // Não é necessário que o aluno digite os vetores e a matriz produto = ["HD" "impressora" "monitor" "notebook" "tablet"]; minimo = [ 100 40 50 30 80 ]; estoque = [ 41 48 32 32 81; 102 38 50 15 85; 100 40 50 30 80; 100 40 50 35 78 ]; // --------------------------------------------------------- [m, n] = size(estoque) printf("\nrelatório DO ESTOQUE\n"); for i = 1:m printf("loja Nro %g\n", i); ok = %t; for j = 1:n x = minimo(j) - estoque(i, j); if x > 0 then printf("produto: %s - Faltam %g unidades\n", produto(j), x); ok = %f; if ok then printf("todos os produtos possuem o estoque mínimo!\n");
Tarefa 2: Escreva um programa que leia uma matriz quadrada e imprima a matriz obtida trocando-se cada elemento da diagonal principal da matriz original pelo maior elemento da coluna correspondente. Por exemplo, se a matriz lida for tal como a mostrada abaixo, à esquerda, a matriz resultante é a mostrada à direita. Os elementos trocados estão destacados. Observe que, eventualmente, o maior elemento pode estar na própria diagonal principal, situação em que a matriz não sofre alteração visível. 12 8 15 6 1 6 20 15 0-4 0-8 -1 6 0-9 12 6 15 6 1 8 0-9 0-4 20-8 -1 6 0 15 O exemplo a seguir mostra a execução do programa, no caso em que a matriz lida é exatamente a mostrada acima. Exemplo 1 Matriz original: [ 12 8 15 6 ; 1 6 20 15 ; 0-4 0-8 ; -1 6 0-9 ] Matriz resultante: 12. 6. 15. 6. 1. 8. 0. - 9. 0. - 4. 20. - 8. - 1. 6. 0. 15. DICA: Defina no seu programa as funções a seguir e utilize essas funções para escrever o código do programa principal: 1) Defina a função troca, tal como a seguir: function [c,d] = troca(a,b) c = b; d = a; function Essa função é útil para trocar os valores de duas variáveis em um programa. Por exemplo, o comando [a,b] = troca(a,b), troca os valores das variáveis a e b, de maneira que, por exemplo, se a = 2 e b = 5, antes da execução do comando acima, após a execução do mesmo o valor contido em a será 5 e o valor contido em b será 2. 2) Defina uma função mymax, que receba como parâmetro um vetor v e retorne dois valores m e i, tais que m é o maior elemento de v e i é o índice da posição em que esse elemento ocorre em v (ou seja, mymax funciona exatamente como a função max da biblioteca Scilab). Por exemplo, [mv, iv] = mymax([5 8 3 4 6]) retorna mv = 8 e iv = 2
Proposta de Solução clear; clc function [c, d]=troca(a, b) c = b; d = a function function [m, i]=mymax(v) m = -%inf for j = 1:length(v) if v(j) > m then m = v(j); i = j function matriz = input("matriz original: ") [nl, nc] = size(matriz) for c = 1: nc v = matriz(:,c) [m, l] = max(v) [matriz(c,c), matriz(l,c)] = troca(matriz(c,c), matriz(l,c))
Tarefa 3: Um cromossomo com n genes pode ser representado por um vetor de n posições. Considerando os genes 0 e 1, e dois cromossomos de tamanho n = 16 temos: C1 = [ 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ] C2 = [ 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 ] Definimos cruzamento de C1 e C2 através da combinação de seus genes da seguinte maneira: 1) Escolher uma posição válida k, 1 k n para indicar o ponto de corte; 2) Copiar os elementos do vetor C1, posições de 1 até k, para um vetor C3; 3) Copiar os elementos do vetor C2, posições de (k+1) até n, para o mesmo vetor C3. 4) O vetor C3 é o vetor resultante do cruzamento dos vetores C1 e C2. Desta forma, o cruzamento de C1 e C2, com ponto de corte k = 8, resultaria em: C3 = [ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 ] Escreva um programa Scilab para ler dois vetores C1 e C2, ler o valor de corte k e efetuar o cruzamento desses vetores. Caso o valor lido para k não seja válido, deve-se repetir a solicitação da entrada de k.até que um valor válido seja fornecido. Observe que k é um valor inteiro, mas não é necessário verificar se k é inteiro. A seguir um exemplo de execução do programa, com os mesmos vetores do exemplo acima, mas com outro valor de k: Execução: Digite o primeiro vetor: [ 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ] Digite o segundo vetor: [ 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 ] Digite o valor do ponto de corte: 11 Vetor resultante do cruzamento: 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0
Proposta de Código para a Solução clear; clc; // C1 = [ 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ]; // C2 = [ 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 ]; n = length(c1); k = input("digite o valor do ponto de corte: "); while (k <= 1) (k >= n) printf("\nerro: valor inválido para k!"); k = input("digite o valor do ponto de corte: "); for i = 1:n if i <= k then C3(i) = C1(i); else C3(i) = C2(i); printf("\nvetor resultante do cruzamento: \n"); for i = 1:n printf("%g ", C3(i));
Tarefa 4: Observe a matriz abaixo, que contém os índices (percentuais) de variação de preços de um conjunto de itens do orçamento familiar, obtidos em uma pesquisa durante um período de 6 meses. Item Mês 1 2 3 4 5 6 Alimentos e bebidas 1.3% -1% 2% 3% -0.8% 0.5% Transportes 0.5% 0% 0.7% 0% 0.8% 0% Habitação 0.6% 0.3% 0.4% -0.3% 1.2% 0.8% Saúde e Educação 2.3% 0.5% 0.7% 1.1% 0.4% 1.0% Vestuário 1.0% 0.6% 0.4% -0.5% 1.0% 1.5% Vamos supor, de forma simplificada, que o índice de variação de preço de um dado item, no período de pesquisa, seja calculado como a soma das variações mensais. Por exemplo, o índice para o item alimentos e bebidas seria: 1.3-1+2+3-0.8+5 = 5 Paralelamente, foi feita outra pesquisa para determinar o percentual do orçamento familiar que é destinado a cada um desses itens (peso do item no orçamento). O quadro abaixo sintetiza o resultado das duas pesquisas: Item Variação de Preço Peso Alimentos e bebidas 5% 26% Transportes 2% 20% Habitação 3% 18% Saúde e Educação 6% 26% Vestuário 4% 10% Total 100% Esses dados permitem calcular o índice de inflação no período como: I = (5x26 + 2x20 + 3x18 + 6x26 + 4x10) / 100 = 4.2 Escreva um programa para ler os seguintes dados: 1. um vetor conto os pesos dos itens 2. uma matriz conto as variações de preço desses itens em um período de n meses. O programa deverá calcular: 1. o percentual de variação de preço de cada item, armazenando-os em um vetor 2. o índice de inflação. Um exemplo de execução é mostrado a seguir, considerando 4 itens, em um período de 3 meses. INDICE DE INFLAÇÃO Pesos dos itens: [40 25 15 20] Variação mensal de custo dos itens: [2 3 4; 3 2 2; 3 5 4; 2 3 3] Índice de inflação = 8.75%
Proposta de Solução clear; clc; printf("indice DE INFLAÇÃO\n") pesos = input("pesos dos itens: ") custos = input("variação mensal de custos dos itens: ") [L,C] = size(custos) custot = zeros(1,l) I = 0 for i=1:l custo(i) = 0; for j=1:c custo(i) + custo(i) + custos(i, j) I = I + custo(i) * peso(i) printf( ÍNDICE DE INFLAÇÃO = %6.3f %\n,i)