COMPUTAÇÃO E PROGRAMAÇÃO 1º Semestre 2010/2011 MEMec, LEAN Ficha da Aula Prática 3: Entrada/saída de dados. Scripts e funções. Estruturas de selecção. Sumário das tarefas e objectivos da aula: 1. Utilizar funções de entrada/saída 2. Construir programas com scripts e funções 3. Construir gráficos 4. Implementar expressões relacionais 5. Utilizar estruturas de selecção José Borges, v1.1@2010 1
1. Funções de entrada / saída 1.1 Principais funções de entrada / saída no MATLAB input Apresenta uma mensagem na prompt da linha de comandos e fica à espera de uma entrada do utilizador pelo teclado. Escrever na linha de comandos: help input. disp Apresenta o conteúdo de um vector no ecrã. Escrever na linha de comandos: help disp. fprintf Apresenta o conteúdo formatado de uma cadeia de caracteres no ecrã. Escrever na linha de comandos: help fprintf. 1.2 Especificação da cadeia de formatação para a função fprintf José Borges, v1.1@2010 2
1.3 Entrada / saída 1 Apresente uma mensagem no ecrã indicando que vai calcular a área e o perímetro de uma figura rectangular. 2 Escreva uma instrução para pedir ao utilizador o valor do lado 1 do rectângulo. 3 Escreva uma instrução para pedir ao utilizador o valor do lado 2 do rectângulo. 4 Apresente no ecrã o valor da área com uma precisão de 2 casas decimais. 5 Apresente no ecrã o valor do perímetro com uma precisão de 2 casas decimais. 6 Guarde todas as variáveis num ficheiro rectângulo.mat 7 Apague todas as variáveis do espaço de trabalho 8 Confirme que não existem variáveis definidas no espaço de trabalho pela sua listagem 9 Carregue o conteúdo do ficheiro rectângulo.mat para o espaço de trabalho 10 Liste as variáveis definidas no espaço de trabalho >> disp('área e perímetro de um rectangulo') Área e perímetro de um rectângulo >> lado1 = input('lado 1 = '); Lado 1 = 5.252 >> lado2 = input('lado 2 = '); Lado 2 = 3.1 >> area = lado1 * lado2; >> fprintf('área = %.2f \n', area) Área = 16.28 >> perimetro = 2 * lado1 + 2 * lado2; >> fprintf('perímetro = %.2f \n', perimetro) Perímetro = 16.70 >> save rectângulo lado1 lado2 area perimetro >> clear all >> who >> load rectângulo >> who Your variables are: area lado1 lado2 perimetro José Borges, v1.1@2010 3
2. Scripts e funções 2.1 Criação de um script 1 Aceda a uma pasta da directoria de trabalho onde seja possível gravar ficheiros 2 Crie um script a partir das instruções do quadro 1.3. Pode editar o código directamente, ou então utilizar as instruções que já escreveu na linha de comando durante a resolução do quadro 1.3. Para tal, comece por manter premida a tecla Control e, de seguida, assinale todas as instruções que pretende incluir no script clicando em cada uma destas 2 Clique com o botão do lado direito sobre as instruções que assinalou e escolha a opção Create M-file. José Borges, v1.1@2010 4
3 Edite o ficheiro que acabou de criar com comentários 4 Guarde o ficheiro com o nome script_rectangulo.m 5 Apague as variáveis do espaço de trabalho. Execute o script a partir da linha de comandos >> script_rectangulo Lado 1 = 5.252 Lado 2 = 3.1 Área = 16.28 Perímetro = 16.70 2.2 NOTAS Sempre que executar o script anterior, i.e. script_rectangulo.m, vai reescrever o conteúdo do ficheiro de dados rectângulo.mat, perdendo assim o conteúdo anterior. José Borges, v1.1@2010 5
2.3 Criação de uma função 1 Crie uma função area.m que recebe como argumentos de entrada dois valores x e y, correspondentes aos lados de um rectângulo, e que devolve como argumento de saída a área do rectângulo 2 Crie uma função perimetro.m que recebe como argumentos de entrada dois valores x e y, correspondentes aos lados de um rectângulo, e que devolve como argumento de saída o perímetro do rectângulo José Borges, v1.1@2010 6
3 Escreva o driver para as funções anteriores, que pede ao utilizador os valores dos lados de um rectângulo, e que apresenta no ecrã a área e o perímetro do rectângulo, calculados com as funções criadas 4 Execute as funções area.m e perimetro.m, bem como o script driver_rectangulo.m (Nota: execute este passo na sequências dos anteriores e sem apagar variáveis!) >> area(5.252,3.1)??? Attempted to access area(5.252,3.1); index must be a positive integer or logical. >> clear all >> area(5.252,3.1) ans = 16.2812 >> perimetro(5.252,3.1) perimetro = 16.7040 >> driver_rectangulo Lado 1 = 5.252 Lado 2 = 3.1 Área = 16.28 Perímetro = 16.70??? Error using ==> save Variable 'area' not found. Error in ==> driver_rectangulo at 17 save rectângulo lado1 lado2 area perimetro 2.4 HANDS-ON Justifique o erro que ocorreu no início do passo 4 do quadro anterior. Justifique o erro que ocorreu no final do mesmo passo. Implemente uma solução para resolver o referido erro. (Ver solução na última página) José Borges, v1.1@2010 7
3. Construção de gráficos 3.1 Construção de gráficos a partir da linha de comandos no MATLAB plot Construção de gráficos 2D pela linha de comandos na janela corrente. Escrever na linha de comandos: help plot figure Cria/acede à janela da figura especificada. Escrever na linha de comandos: help figure legend Adiciona uma legenda pela linha de comandos ao gráfico da janela corrente. Escrever na linha de comandos: help legend title Adiciona um título à janela corrente. Escrever na linha de comandos: help title xlabel Cria um rótulo no eixo das abcissas da figura. Escrever na linha de comandos: help xlabel ylabel Cria um rótulo no eixo das ordenadas da figura. Escrever na linha de comandos: help ylabel grid Coloca uma grelha em background. Escrever na linha de comandos: help grid axis Formata as gama de valores para os eixos do gráfico. Escrever na linha de comandos: help axis hold Retém o gráfico corrente para sobreposição d um novo gráfico. É interrompido pelo comando hold off. Escrever na linha de comandos: help hold close Fecha a janela corrente. Escrever na linha de comandos: help close 3.2 Formatação de gráficos com a função plot José Borges, v1.1@2010 8
3.3 Construção de gráficos 1 Crie um vector t, definido entre 0 e 1 com passo de 0.01 >> t = 0:0.01:1; 2 Crie uma variável y definida como: >> y = sin(2*pi*t); 3 Crie uma variável z definida como: >> z = cos(2*pi*t); 4 Represente numa mesma figura as variáveis y e z em função de t. O gráfico da variável y deve ser representado com a cor azul e marcas do tipo ponto. O gráfico da variável z deve ser representado com a cor vermelha e marcas do tipo asterisco. >> plot(t,y,'b.-') >> hold on >> plot(t,z,'r*-') >> hold off 5 Adicione uma legenda ao gráfico para identificar cada uma das variáveis y e z. >> legend('sin','cos') José Borges, v1.1@2010 9
6 Adicione uma grelha. >> grid on José Borges, v1.1@2010 10
4. Expressões relacionais 4.1 Operadores 4.2 Precedência de operadores 4.3 HANDS-ON Escreva uma função desigualdade.m que implementa a expressão da desigualdade. A função aceita como argumentos de entrada os valores e devolve um valor lógico, verdade (1) ou falso (0), de acordo com os valores das variáveis. José Borges, v1.1@2010 11
5. Estruturas de selecção 5.1 Estruturas de selecção e sua codificação
Entradas 5.2 HANDS-ON 25. Write a script area_menu that will print a list consisting of cylinder, circle, and rectangle. It prompts the user to choose one, and then prompts the user for the appropriate quantities (e.g., the radius of the circle) and then prints its area. If the user enters an invalid choice, the script simply prints an error message. The script should use a selection structure to accomplish this. Here are some examples of running it (units are assumed to be meters): 1. Contexto do problema Pretende-se desenvolver uma aplicação para calcular a área de uma das seguintes figuras geométricas: circulo, rectângulo, cilindro 2.1 Esquema de processamento Opção do utilizador (opcao) Opção circulo: raio (raio) Opção rectângulo: comprimento (comprimento) e largura (largura) Opção cilindro: raio da base (raio), comprimento do cilindro (comprimento) Saídas Área do sólido (area) 2.2 Especificações funcionais e requisitos (EF) O programa deve apresentar no ecrã um menu com as opções disponíveis para cálculo das áreas (EF) O utilizador deve escolher a opção adequada e, consoante o caso, deve introduzir a informação relativa ao sólido que escolheu (EF) O programa deve apresentar o valor da área calculada (REQ) As unidades definidas em metros [m] e metros quadrados [m2] (REQ) A precisão requerida para a apresentação é de 2 casas decimais 2.3 Métodos de processamento Área do círculo: área círculo = raio2 (1) Área do rectângulo: área rectângulo = comprimento largura (2) Área do cilindro: área cilindro = 2 área círculo + área rectângulo (3) largura = perímetro circulo = 2 raio (4) Constante PI: = 3.141516 (5)
Fluxos de dados 3.1 Abordagem top-down 3.2 Lista de tarefas 3.3 Algoritmo da função area_rectangulo (recebe largura e comprimento) i. Calcular área do rectângulo com fórmula (2) ii. Terminar 3.3 Algoritmo da função area_circulo (recebe raio) i. Calcular área do círculo com fórmula (1) ii. Terminar 3.3 Algoritmo da função perimetro_circulo (recebe raio) i. Calcular perímetro do círculo com fórmula (4) ii. Terminar
3.3 Algoritmo principal i. Programa apresenta mensagem com as opções disponíveis a. Escreve no ecrã 1 - Rectângulo b. Escreve no ecrã 2 - Círculo c. Escreve no ecrã 3 - Cilindro ii. Utilizador fornece opcao iii. Se opcao = 1 a. Programa apresenta mensagem a pedir o comprimento do rectângulo b. Utilizador fornece comprimento c. Programa apresenta mensagem a pedir a largura do rectângulo d. Utilizador fornece largura e. Calcular area com area_rectangulo(fornece largura e comprimento) iv. Se opção = 2 a. Programa apresenta mensagem a pedir o raio do círculo b. Utilizador escreve raio c. Calcular area com area_circulo(fornece raio) v. Se opção = 3 a. Programa apresenta mensagem a pedir o raio da base do cilindro b. Utilizador escreve raio c. Programa apresenta mensagem a pedir o comprimento do cilindro d. Utilizador escreve comprimento e. Calcular o perimetro do cilindro com perimetro_circulo(fornece raio) f. Calcular area_lateral com area_rectângulo(fornece comprimento e perimetro) g. Calcular area_base com area_círculo(fornece raio) h. Calcular area do cilindro com fórmula (3) vi. Caso contrário a. Programa apresenta mensagem de erro b. Interrompe a execução do programa vii. Apresentar valor da area calculada viii. Terminar 5. Estrutura da codificação
6. Soluções 2.4 HANDS-ON >> driver_rectangulo Lado 1 = 5.252 Lado 2 = 3.1 Área = 16.28 Perímetro = 16.70
5.2 HANDS-ON Script: area_menu.m Função: area_circulo.m
Função: area_circulo.m Função: perimetro_circulo.m