Computação e Programação 2012-2013 Mestrado Integrado em Engenharia Civil Licenciatura Bolonha em Engenharia Geológica e de Minas DECivil Exame 2ª Época 30 de janeiro de 2013 Exame sem consulta (2 horas + 30 minutos de tolerância). Se trouxe telemóvel, desligue-o e guarde-o fora de vista. Identifique (a tinta) todas as folhas da sua resolução, no topo, com o seu nome e número. Escreva as suas respostas com caligrafia clara, e sem emas. Resolva os grupos em folhas separadas. No final, os grupos deverão ser entregues separadamente, inclusive os não respondidos (com essa indicação). O Grupo 5 deve ser resolvido no próprio enunciado, identificado com nome e número, e entregue com o resto da resolução. A menos que isso seja indicado explicitamente, não precisa fazer verificações sobre valores para beneficiar a robustez no código desenvolvido. Grupo 1 (4 valores) Problema 1 (1 valor) Escreva uma instrução que permita criar a seguinte variável e respetivo conteúdo (matriz), utilizando o operador dois pontos: mat = 1 3 5 7 9 90 85 80 75 70 mat = [1:2:10 ; 90:-5:70] Problema 2 (1 valor) Considere a seguinte função real de variável real : Escreva uma instrução que permita avaliar esta função matemática e guardar o resultado. Para tal, deverá utilizar variáveis com nomes valorx e valory. valory = (12 * valorx + 9) / (3 * (4 * valorx^2 + 3)) Problema 3 (1 valor) Considerando a existência da matriz anteriormente criada no Problema 1, escreva duas expressões para aceder: (1) ao elemento na segunda linha, terceira coluna; e (2) à terceira coluna completa. mat(2,3) mat(:,3)
Problema 4 (1 valor) Considere a existência de um valor real entre 0 e 1, correspondente a uma taxa de juro anual e guardado na variável taxajuroanual; e a existência de outro valor real positivo, correspondente ao montante inicial de um depósito bancário, e guardado em montanteinicial. Escreva duas instruções para calcular dois valores e guardar ambos os valores num único vetor. Os valores pretidos correspondem às atualizações do valor guardado em montanteinicial para os dois primeiros anos de investimento. O montante atualizado para cada ano decorre do montante do ano anterior, de acordo com a seguinte fórmula:. anos(1) = montanteinicial * (1 + taxajuroanual) anos(2)= anos(1) * ( 1 + taxajuroanual) Grupo 2 (4 valores) Problema 1 (2 valores) Escreva uma função, doisaleatorios, sem parâmetros de entrada, que retorne dois números pseudoaleatórios inteiros no intervalo [10, 20]. Os dois números retornados têm de ser diferentes. function [ ale1, ale2 ] = doisaleatorios ale1 = randi([10 20]); ale2 = randi([10 20]); while ale2 == ale1 ale2 = randi([10 20]); Problema 2 (2 valores) Escreva um script cujo objetivo é implementar um jogo de tiro ao alvo. O script deve começar por, usando a função do problema anterior( 1 ), obter dois números pseudoaleatórios inteiros no intervalo [10, 20]. Estes dois números definirão os limites de um intervalo fechado que será considerado o alvo a atingir. Seguidamente, o script deve pedir ao utilizador (o jogador) um número inteiro no intervalo [10, 20]. Se este número estiver dentro do intervalo alvo, o script deve escrever a mensagem Parabéns! Acertou.. Senão, deve escrever a mensagem Azar! Falhou por N., onde N representa a diferença entre o número introduzido pelo jogador, e o limite mais próximo do intervalo alvo. ( 1 )Se não fez o problema anterior, assuma que a função em causa existe, e está disponível. 2
[a1 a2] = doisaleatorios; liminf = min(a1, a2); limsup = max(a1, a2); tiro = input('um inteiro no intervalo [10, 20]: '); if liminf <= tiro && tiro <= limsup disp('parabéns! Acertou.') else erro = max( liminf - tiro, tiro - limsup ); fprintf('azar! Falhou por %d.\n', erro) Grupo 3 (4 valores) Problema 1 (1 valor) Desenvolva uma função fun1 para (1) receber duas matrizes de números, coincidentes em número de linhas e em número de colunas, e (2) devolver uma matriz de números, com as mesmas dimensões das matrizes entradas. Cada elemento da matriz devolvida será igual a um dos elementos correspondentes nas matrizes de entrada. Se o produto dos elementos correspondentes nas matrizes de entrada for superior a 200, o elemento correspondente na matriz devolvida será igual ao da 1ª matriz recebida. De outro modo, será igual ao da 2ª matriz recebida. Deve utilizar instruções de ciclo encadeadas. function mat3 = fun1( mat1, mat2 ) [nl nc] = size(mat1); mat3 = zeros(nl, nc); % opcional no exame, mas desejável for i = 1:nL for j = 1:nC if mat1(i,j) * mat2(i,j) > 200 mat3(i,j) = mat1(i,j); else mat3(i,j) = mat2(i,j); Problema 2 (1 valor) Desenvolva uma função mainf e uma subfunção subf. subf deverá receber um número,, e devolver três números separadamente, através de três parâmetros de saída. Os valores devolvidos corresponderão, por esta ordem, a,, e. mainf deverá ter zero parâmetros de entrada e três parâmetros de saída. Deverá obter do utilizador um número, utilizá-lo para invocar subf, e, depois, devolver os três números recebidos a partir de subf, por ordem crescente, utilizando cada um dos parâmetros de saída para devolver cada um dos números. function [ val1, val2, val3 ] = mainf x = input('um número: '); [a(1), a(2), a(3)] = subf(x); a = sort(a); val1 = a(1); val2 = a(2); val3 = a(3); function [ seno, coseno, cubo ] = subf( x ) seno = sin(x); 3
coseno = cos(x); cubo = x^3; Problema 3 (2 valores) Desenvolva uma função para ler um ficheiro de texto chamado entrada.txt e devolver um vetor (array) de estruturas (structs) com todos os dados desse ficheiro. O ficheiro terá um qualquer número de linhas, so todas compostas por uma palavra e um número real separados por um espaço. O vetor devolvido terá que ter um tamanho coincidente com o número de linhas do ficheiro. Todas as estruturas devolvidas no vetor terão que ser compostas por dois campos, chamados pal e num, nos quais deverão ser guardados (como string e número real, respetivamente) os dois valores lidos a partir de uma linha do ficheiro. Os dados de cada linha devem ser lidos para uma estrutura distinta no vetor, pela mesma ordem, ou seja, a primeira estrutura guardará os valores lidos da primeira linha, e assim sucessivamente, até que a última estrutura guardará os valores lidos da última linha. function vs = G3P3 fid = fopen('entrada.txt'); i = 0; % contador de linhas while ~feof(fid) i = i + 1; [palavra numero] = strtok(fgetl(fid)); vs(i) = struct( 'pal', palavra, 'num', str2num(numero) ); Grupo 4 (4 valores) Problema 1 (1 valor) Desenvolva uma função mediap para receber dois vetores do mesmo tamanho: (1) um vetor de reais, e (2) um vetor de inteiros. Esta função deverá devolver a média dos valores no primeiro vetor, ponderados com os valores nas posições correspondentes no segundo vetor. Não pode utilizar vetorização nem funções estatísticas pré-definidas do Matlab. function saida = mediap(v, p) numerador = 0; denominador = 0; for i=1:length(v) numerador = numerador + v(i) * p(i); denominador = denominador + p(i); saida = numerador / denominador; Problema 2 (1 valor) Desenvolva uma função mediapvetorizada para fazer o mesmo que a função pedida no problema anterior, mas agora to de recorrer a vetorização e a funções estatísticas pré-definidas do Matlab. function saida = mediapvetorizada(v, p) saida = sum(v.* p) / sum(p); Problema 3 (1 valor) 4
a) Desenvolva uma função anónima para implementar a função matemática apresentada na pergunta do Problema 2 do Grupo 1, guardando a respetiva referência (function handle) com o nome funcao. funcao = @(x)(12 * x^2 + 9) / (3 * (4 * x + 3)) b) Utilizando o resultado da alínea anterior, escreva uma expressão em Matlab para calcular a expressão matemática. funcao(2) + funcao(3) Problema 4 (1 valor) Numa execução do trecho de código em C++ apresentado abaixo, o utilizador introduz na linha de comandos o valor -2, seguido do valor 2. O que é depois mostrado ao utilizador? 1.2 cout << "Introduza dois valores >" ; int x, y, iterador; double resultado = 0; cin >> x; cin >> y; iterador = x; while(iterador <= y) { } if(iterador < 0) resultado = resultado - iterador; else resultado = resultado + iterador; iterador = iterador + 1; cout << resultado / (y - x + 1); 5
Nome Nº Grupo 5 (4 valores) Problema 1 (4 x 0,25 valores) Para cada frase, escreva, antes da alínea, se a mesma é verdadeira (V) ou falsa (F). Cada resposta certa soma 0,25 valores, e cada resposta errada desconta 0,25 valores. F a) A definição de uma função não pode incluir uma invocação da própria função. V b) Uma função pode invocar uma subfunção definida no mesmo ficheiro. F c) Um nome (ou identificador) pode conter espaços. V d) A função plot permite receber um vetor com os valores para as abcissas e outro com os valores para as ordenadas e, como resultado, desenhar um gráfico para a função correspondente. Problema 2 (4 x 0,5 valores) Para cada frase, escreva, antes da alínea, se a mesma é verdadeira (V) ou falsa (F). Cada resposta certa soma 0,5 valores, e cada resposta errada desconta 0,5 valores. F a) Os erros semânticos são assinalados pelo Matlab. V b) Uma variável criada no espaço de trabalho local de uma função não pode ser utilizada em código introduzido na janela de comandos. V c) Um array de células permite guardar valores de tipos diferentes. V d) Existem vários tipos de dados para representar números inteiros, os quais suportam limites (mínimo e máximo) de representação diferentes. Problema 3 (4 x 0,25 valores) Para cada frase, escreva, antes da alínea, se a mesma é verdadeira (V) ou falsa (F). Cada resposta certa soma 0,25 valores, e cada resposta errada desconta 0,25 valores. V a) A possibilidade de definir classes permite ao programador criar novos tipos de dados. V b) A função eval permite avaliar valores do tipo cadeia de caracteres (strings) como instruções. F c) O GUIDE é um compilador para Matlab, permitindo criar ficheiros executáveis a partir de ficheiros com a extensão.m. V d) Uma expressão com o formato <nome>(<valor inteiro positivo>, <valor inteiro positivo>,<valor inteiro positivo>) tanto pode corresponder à chamada de uma função com três parâmetros de entrada como ao acesso a um array de três dimensões. 6