Computação e Programação 7ª Aula de Problemas Sub-funções; Vectorização; Manipulação de strings; Estrutura try-catch Instituto Superior Técnico, Dep. de Engenharia Mecânica - ACCAII
Problema 1 Seja um polinómio em x descrito por: Escreva uma função, denominada calculapolinomio com as seguintes especificações: Parâmetros de entrada: coef vector com os coeficientes do polinómio por ordem decrescente [c n... c 0 ]. Parâmetros de saída: pol c c x c x c x n 2 0 1 2... Utilize uma sub-função para cálculos auxiliares. x vector com os pontos para os quais se pretende calcular o valor do polinómio. resultado vector com a avaliação do polinómio nos pontos pretendidos. Sempre que possível evite os ciclos for, e utilize a funcionalidade de vectorização do Matlab. n n
Problema 1 Análise resumida Algoritmo da função calculapolinomio: 1. Seja n o valor do comprimento de coef menos uma unidade. 2. Criar um vector chamado expoente com elementos entre n e 0 com passo -1 3. Para cada elemento i de x fazer a) Utilizando operações elemento-a-elemento calcular o vector parcelas = coef * x(i) ^ expoente b) Calcular resultado(i) = soma_parcelas(parcelas) Algoritmo da função soma_parcelas: 1. Retornar a soma dos elementos do vector de entrada 3
Problema 1 Codificação calculapolinomio.m function resultado = calculapolinomio(coef, x) expoente = (length(coef)-1):-1:0; for i = 1:length(x), parcelas = coef.* x(i).^ expoente; resultado(i) = soma_parcelas(parcelas); end return % Esta sub-função é um exemplo de como em Matlab também se pode % realizar um somatório recorrendo a uma operação matricial ao % invés de utilizar um ciclo. function res = soma_parcelas(parc) return res = parc*ones(length(parc),1);
Problema 2 Escreva uma função, denominada analisastring, com as seguintes especificações: Parâmetros de entrada: cadeia_car uma string; Parâmetros de saída: info_cadeia_car vector linha contendo a seguinte informação: 1. Número de letras maiúsculas existentes na string; 2. Número de letras minúsculas existentes na string; 3. Número de caracteres em branco existentes na string; A função deve testar se o parâmetro de entrada é realmente uma string, se não for deve abortar com uma mensagem de erro associada. Teste a função com um script.
Problema 2 Codificação function info_cadeia_car = analisastring(cadeia_car) if ~ischar(cadeia_car) error('não é uma cadeia de caracteres.'); end % Em Matlab a função sum() pode ser utilizada para somar todos os % elementos de um vector evitando a utilização de um ciclo ou a % realização da operação matricial utilizada no problema anterior info_cadeia_car(1) = sum( cadeia_car >= 'A' & cadeia_car <= 'Z' ); info_cadeia_car(2) = sum( cadeia_car >= 'a' & cadeia_car <= 'z' ); info_cadeia_car(3) = sum( isspace(cadeia_car) );
Problema 2 Codificação clc, clear all, close all cadeia = input('introduza uma cadeia de carateres: ', 's'); info = analisastring(cadeia); fprintf('a cadeia de caracteres introduzida possui:\n'); fprintf('%8d letras maiúsculas\n', info(1)); fprintf('%8d letras minúsculas\n', info(2)); fprintf('%8d espaços\n', info(3));
Problema 3 Escreva um script que peça ao utilizador uma expressão matemática, sintaticamente correcta em Matlab, em função da variável x (por exemplo: 3*x^3+4*x^2+2*x ). Em seguida deve pedir o vector de pontos onde se pretende avaliar o valor da função. O vector com o resultado deve ser apresentado no monitor e, se todos os seus valores forem finitos (ou seja diferentes de Inf ou NaN), deve ser apresentado um gráfico da função. A sintaxe da função fornecida pelo utilizador deve ser testada utilizando os comandos try-catch e a função eval. Se a sintaxe não estiver correcta o programa deve avisar o utilizador e permitir nova introdução.
Problema 3 Análise resumida Algoritmo da função obter_expressao_valida: 1. Pedir ao utilizador uma cadeia de caracteres expressao contendo a expressão a avaliar. 2. Repetir enquanto expressao não corresponder a uma expressão sintacticamente correcta a) Avaliar expressao b) Se a expressão não for sintacticamente correcta i) Pedir novamente a cadeia-de-caracteres expressao 3. Retornar o valor de expressao 9
Problema 3 Codificação function expressao = obter_expressao_valida expressao = input('por favor introduza a expressão a avaliar:','s'); x = 1; exp_correcta = false; while ~exp_correcta try res = eval(expressao); exp_correcta = true; catch disp('a expressão introduzida não é válida em Matlab.'); expressao = input('por favor repita a introdução: ', 's'); exp_correcta = false; end end
Problema 3 Análise resumida Algoritmo da função obter_vector_valido: 1. Repetir indefinidamente a) Pedir um vector de pontos vec_x ao utilizador b) Se vec_x tiver o formato de um vector i) Retornar vec_x c) Apresentar mensagem indicando que o vector não é válido 11
Problema 3 Codificação function vec_x = obter_vector_valido while true vec_x = input('por favor introduza o vector de pontos: '); if isvector(vec_x), return end disp('os dados introduzidos não formam um vector válido.'); end
Problema 3 Análise resumida Parâmetros de entrada: expressao, vector_x Parâmetros de saída: resultado Algoritmo da função avalia_expressao: 1. Em cada ponto i de vector_x, avaliar expressao e atribuir a resultado(i) 13
Problema 3 Codificação function resultado = avalia_expressao(expressao, vector_x) for i = 1:length(vector_x), x = vector_x(i); resultado(i) = eval(expressao); end
Problema 3 Análise resumida Algoritmo do programa principal: 1. Chamar função expressao = obter_expressao_valida 2. Chamar função vec_x = obter_vector_valido 3. Chamar função res = avalia_expressao(expressao, vec_x) 4. Apresentar valores de res na forma de uma coluna 5. Se todos os elementos de res são finitos a) Apresentar gráfico de res em função de vec_x 15
Problema 3 Codificação % Obter uma expressão válida em Matlab expressao = obter_expressao_valida; % Obter pontos a avaliar na forma de um vector vec_x = obter_vector_valido; % Avaliar a expressão res = avalia_expressao(expressao, vec_x); % Apresentar resultados if size(res,1) > 1, disp(res) else disp(res') end if all(isfinite(res)) plot(vec_x, res); end
Exercícios Propostos [Livro 1] (Ver referências no último slide) 18. Write a script that will Call a function to prompt the user for an angle in degrees Call a function to calculate and return the angle in radians Call a function to print the result Note that the solution to this problem involves four M-files: one which acts as a main program, and three for the functions 19. Modify the above program so that the function to calculate the angle is a subfunction to the function that prints. 17
Exercícios Propostos [Livro 1] (Ver referências no último slide) 23. The resistance R in ohms of a conductor is given by R = E / I where E is the potential in volts and I is the current in amperes. Write a script that will Call a function to prompt the user for the potential and the current Call a function that will print the resistance; this will call a subfunction to calculate and return the resistance 24. The power in watts is given by P = EI. Modify the program above to calculate and print both the resistance and the power. Modify the subfunction so that it calculates and returns both values. 18
Exercícios Propostos [Livro 1] (Ver referências no último slide) 2. Write a function that will receive a name and department as separate strings and will create and return a code consisting of the first two letters of the name and the last two letters of the department. The code should be upper-case letters. For example, >> namedept('robert','mechanical') ans = ROAL 3. Write a function that will prompt the user separately for a first and last name and will create and return a string with the form last, first. 19
Exercícios Propostos [Livro 1] (Ver referências no último slide) 7. Write a script that will create x and y vectors. Then, it will ask the user for a color ( red, blue, or green ) and for a plot style ( o, * ). It will then create a string pstr that contains the color and plot style, so that the call to the plot function would be: plot(x,y,pstr). For example, if the user enters blue and *, the variable pstr would contain b*. 10. Write a function that will receive two strings as input arguments, and will return a character matrix with the two strings in separate rows. Rather than using the char function to accomplish this, the function should pad with extra blanks as necessary and create the matrix using square brackets. 20
Exercícios Propostos [Livro 1] (Ver referências no último slide) 14. Write a function that will receive two input arguments: a character matrix which is a column vector of strings, and a string. It will loop to look for the string within the character matrix. The function will return the row number in which the string is found if it is in the character matrix, or the empty vector if not. 18. In cryptography, the intended message sometimes consists of the first letter of every word in a string. Write a function crypt that will receive a string with the encrypted message and return the message. >> estring = 'The early songbird tweets'; >> m = crypt(estring) m = Test 21
Exercícios Propostos [Livro 1] (Ver referências no último slide) 18. In cryptography, the intended message sometimes consists of the first letter of every word in a string. Write a function crypt that will receive a string with the encrypted message and return the message. >> estring = 'The early songbird tweets'; >> m = crypt(estring) m = Test 21. Create the following two variables: >> var1 = 123; >> var2 = '123'; Then, add 1 to each of the variables. What is the difference? 22
Referências [Livro 1] Capítulo 5 e 6 de Matlab: A Practical Introduction to Programming and Problem Solving, Stormy Attaway (2009) Elsevier. 23