COMPUTAÇÃO E PROGRAMAÇÃO 1º Semestre 2014/2015 MEMec, LEAN Ficha da Aula Prática 1 Exercícios escritos Sumário das tarefas e objectivos da aula: 1. Realizar exercícios escritos, em condições semelhantes às de exame NOTA: ver também exames de anos anteriores disponibilizados na página da disciplina! João Reis, v1.2@2015 1
1. Exercícios 1. Uma linguagem de programação de alto nível é: Seleccione a resposta correcta: Qualquer linguagem de programação que permita criar programas Uma linguagem mais próxima das linguagens próprias dos microprocessadores do que das dos seres humanos Uma linguagem que permite criar aplicações gráficas Uma linguagem mais próxima das linguagens próprias dos seres humanos do que das dos microprocessadores Nenhuma das anteriores 2. Numa função em Matlab o âmbito de um argumento de entrada é: Seleccione a resposta correcta: A directoria onde o ficheiro com a função está guardado A função ou script onde é feita a chamada à função A própria função O ambiente de trabalho do Matlab (Workspace) Nenhuma das anteriores 3. Explique sucintamente em que consiste a abordagem top-down. 4. Diga (a) o que é, (b) em que tipo de instrução pode ocorrer e (c) em que circunstâncias pode ocorrer um ciclo infinito. 5. Indique três vantagens de criar um programa de forma modular? 6. Diga (a) o que são, (b) ondem podem ocorrer e (c) como se detectam erros lógicos. 7. Escreva o(s) resultado(s) apresentados ao utilizador na linha de comando em cada um dos seguintes casos, respeitando a respectiva formatação gráfica. Código fonte Código fonte João Reis, v1.2@2015 2
Código fonte 8. Escreva o(s) resultado(s) apresentados ao utilizador na linha de comando em cada um dos seguintes casos, respeitando a respectiva formatação gráfica. Considere neste caso as seguintes definições das funções e a sua respectiva chamada na linha de comando: Definição da função function F = func(n) switch n case 0, 1 F = n; otherwise F = func(n-2) + func(n-1); end disp( func(4) ) Chamada da função 9. O programa seguinte tem cinco erros. Assinale e corrija os erros de forma a que o programa execute correctamente. NOTA IMPORTANTE - Para modificar o código deve proceder do seguinte modo: Na sua resposta deve apenas indicar o número da linha se o código estiver correcto, caso o código esteja incorrecto deve indicar a linha e a respectiva alteração. Caso necessite de adicionar novas linhas numere-as utilizando a linha anterior como base, seguida de um ponto e das letras a, b, etc. 1: 4: 7: letra = input('(s/n): ',s); if letra == 's' letra == 'S' disp('continuar') elseif letra == 'n' letra == 'N' else end disp('parar') disp(erro) 1: letra = input('(s/n): ','s'); 4: elseif letra == 'n' letra == 'N' 7: disp('erro') João Reis, v1.2@2015 3
1: 4: 7: 9: 10: 11: 1 1 14: 1 1 17: 1 turma = inseriraluno(turma) % Função que acrescenta um novo aluno % ao vector turma max_nome = 25; % Pedir dados do novo aluno fprintf(fid, 'Insira os dados:\n\n'); novo_aluno.numero = input('número: '); novo_aluno.nome = input('nome: ',s); novo_aluno.nota = input('nota: '); % Corrigir dados do novo aluno if length(novo_aluno.nome) <= max_nome novo_aluno.nome(max_nome+1:end) = []; % Acrescentar o novo aluno à turma turma = [turma, novo_aluno]; 1: 4: 7: 9: 10: 11: 1 1 14: 1 1 17: 1 10. Crie um programa (script) que peça ao utilizador para introduzir dois algarismos em numeração romana no intervalo de I a X, e que indique ao utilizador se os algarismos são iguais, ou se o primeiro é maior ou menor do que o segundo. Por exemplo, se o utilizador introduzir os valores VI e III o programa deverá responder: VI > III 11. Crie uma função chamada my_string_compare que realize a mesma tarefa da função strcmp do Matlab (recebe duas strings como argumentos de entrada, verifica se são iguais, e devolve um valor lógico verdadeiro ou falso). Neste exercício não deve utilizar a capacidade de vectorização do Matlab, e a única função pré-definida permitida é a função length, ou seja, a comparação terá que ser feita letra-a-letra. (Note que as estruturas de selecção e de repetição, if, for, while, etc., não são funções pré-definidas, são instruções de controlo, logo podem, e devem, ser utilizadas). 12. Crie uma função chamada my_string_find que realize a mesma tarefa da função strfind do Matlab (receber duas strings como argumentos de entrada, localizar todas as ocorrências da segunda string na primeira, e devolver o vector de ocorrências). Neste exercício não deve utilizar a capacidade de vectorização do Matlab, e a única função pré-definida permitida é a função length, ou seja, as comparações terão que ser feitas letra-a-letra. a. Resolva o problema utilizando a função my_string_compare criada anteriormente. b. Resolva o problema sem utilizar a função my_string_compare João Reis, v1.2@2015 4
13. Considere o seguinte programa: #define NC 3 float a[] = 5.3, 9.3, 7.3; int b; float c = 0.0; printf("o resultado da operacao misterio com:\n"); for (b = 0; b < NC; b++) c = c + a[b]; printf("%.2f\n", a[b]); printf("= %.3f\n", c/nc); a. Escreva a saída para o ecrã produzida pelo programa. b. Qual a operação mistério implementada? c. Escreva o programa equivalente em linguagem Matlab. A única função pré-definida admitida é a função fprintf. 14. Considere o seguinte programa: /* 1 */ int a = 10, b = 20; /* 2 */ int *c; /* 3 */ c = &a; printf("o valor acessivel pelo ponteiro c e: %d\n", *c); /* 4 */ *c = a + b; printf("o valor acessivel pelo ponteiro c e: %d\n", *c); printf("o valor actual da variavel a e: %d\n", a); a. Escreva a saída para o ecrã produzida pelo programa. b. Escreva as linhas de comentário indicadas pelos números 1 a 4, indicando qual é o propósito de linha de código que se lhe segue imediatamente (apenas essa). João Reis, v1.2@2015 5
15. Considere o seguinte programa: /* 1 */ #define MAXELEM 100 /* 2 */ void myfunction(int [], int); int v[maxelem], n, i; /* 3 */ printf("please enter the number of elements in the vector: "); scanf("%d", &n); /* 4 */ for(i = 0; i < n; i++) printf("enter v%d: ",i+1); scanf("%d", &v[i]); /* 5 */ myfunction(v, n); /* 6 */ printf("\nafter processing:\nv = "); for(i = 0; i < n; i++) printf("%d ",v[i]); void myfunction(int array[], int n_elements) int i, i_aux, j, temp; for(i = 0; i < n_elements-1; i++) i_aux = i; for(j = i + 1; j < n_elements; j++) if (array[j] < array[i_aux]) i_aux = j; temp = array[i]; array[i]=array[i_aux]; array[i_aux]=temp; a. Escreva a saída para o ecrã produzida pelo programa quando o utilizador introduz a sequência de valores 3, 22, 31 e 14 em resposta à sequência de valores pedidos do programa. b. Escreva as linhas de comentário indicadas pelos números 1 a 6, indicando qual é o propósito das linhas de código que se lhe seguem imediatamente (apenas essas). c. Escreva em linguagem Matlab uma função que realize a mesma tarefa de myfunction (defina os seus próprios argumentos de entrada e de saída conforme as necessidades). João Reis, v1.2@2015 6
16. Considere o seguinte programa: /* 1 */ /* 2 */ float funcao1(float *, int); /* 3 */ Código Fonte x[] y float x[] = 10.2, 20.3, 30.4; float y; /* 4 */ y = funcao1(x, 2); printf("%.1f %.1f %.1f\n", x[0], x[2], y); printf("%.1f %.1f %.1f\n", x[0]*2, 2*y, funcao1(&y,0)); /* 5 */ float funcao1(float *a, int n) /* 6 */ return *(a + n); a. Escreva nas linhas indicadas na tabela os valores concretos que as variáveis DO PROGRAMA PRINCIPAL vão tomando ao longo da execução. b. Escreva a saída enviada para o ecrã pelo programa. c. Escreva as linhas de comentário indicadas pelos números 1 a 6, dizendo qual o propósito da linha de código que se lhe segue imediatamente (apenas essa). João Reis, v1.2@2015 7