Programação — MEEC
2o Exame — 9 de Fevereiro de 2011
Duração: 3h00
O exame só pode ser realizado em folhas de exame do IST, usando canetas de tinta azul ou
preta.
Identifique todas as folhas do exame, com o nome, número de aluno.
As folhas que não estejam identificadas não são classificadas.
Faça cada grupo de perguntas numa folha separada.
Garanta que as respostas são claras, distinguindo e separando-as dos rascunhos.
Durante esta prova não há esclarecimento de dúvidas. Se detectar algum erro, que tenha
influência na resolução de um exercício, assinale-o. Se tiver razão ser-lhe-á atribuída a totalidade da
cotação dessa pergunta.
1. (4,5 valores)
1.a) (2,0 valores)
O código seguinte tem erros e como tal não faz o que aparece descrito no comentário.
Identifique cada um dos erros sintácticos e lógicos indicando a linha onde ocorre. Sugira uma
correcção possível para cada erro.
Pressuponha que foram feitos todos os includes necessários.
/* Programa que lê do teclado 10 inteiros e imprime
o maior valor introduzido no ecrã*/
int main(){
int vect[9];
int I;max;
printf("Introduza dez inteiros\n")
max= INT_MAX;
while(i<10){
scanf("&d",%vect[i]);
if(vect[i]>max){
max==vect[i];
}
i=i+1;
printf("o maior valor introduzido foi o %f",&max);
exit(0);
}
1.b)(1,5 valores)
Indique o que é escrito no écran durante a execução do seguinte programa quando a linha de
comando é ./a.out 4 :
int fr(int n) {
if (n == 0) return 1;
if (n == 1) return 2;
return ( fr(n - 1) * fr(n – 2) );
}
2º Exame de Programação MEEC 2010/2011
— 2/5 —
void xpto (int a, int *b) {
a = *b * a;
*b = (a+3) % *b;
}
int main(int argc, char *argv[]){
int num;
sscanf(argv[1], "%d", &num);
printf("%d\n", fr(num));
xpto(num, &num);
printf("%d\n", num);
exit(0);
}
1.c) (1.0 valores)
O que acontece se, para a aplicação anterior, o utilizador executar a aplicação sem argumentos?
(por exemplo, escrevendo ./a.out na linha de comando)
Como se resolve esta questão?
2. (3.5 valores)
2.a) (2.0 valores)
Observe a função seguinte e indique o que deve aparecer nos espaços indicados por A, B, C,
D, E e F.
void amp2( A ){
/*função que recebe como argumentos um inteiro impar
e um caracter e desenha no ecrã uma ampulheta, na
forma ilustrada:
n=3 c='X'
n=5 c = 'x'
XXX
xxxxx
X
x x
XXX
x
x x
xxxxx
*/
int i,j;
for(i=0; B ) /* desenha primeira linha */
printf( "%c", c );
printf("\n");
for(i=1; C ){ /* desenha a cruz */
for(j=0; D )
if( E )
printf("%c", c );
else
printf(" ");
printf("\n");
}
for(i=0; B ) /* desenha ultima linha */
2º Exame de Programação MEEC 2010/2011
printf(
}
"%c", c
— 3/5 —
);
2.b) (1.5 valores)
Observe o programa seguinte e indique o que deve aparecer nos espaços indicados por A, B e
C. O programa obtém a partir da linha de comando os argumentos com que deve invocar a função
implementada na alínea anterior (exemplo: ./a.out 4 x).
int main(int argc, char *argv[]){
int n;
char ch;
sscanf( A ); /* lê a partir de argv o valores de n */
ch = B ; /* lê a partir de argv o valor de ch */
if( C ) /*chama funcao se h for numero impar*/
amp( D );
exit(0);
}
3. (4.0 valores)
3.a) (1.5 valores)
Defina o tipo circulo, formado por três reais (x, y, e r), que representam as coordenadas do
centro e o raio.
Escreva uma função que receba 2 argumentos do tipo circulo e devolva um valor inteiro
diferente ou igual a zero caso os dois círculos se intersectem ou não, respectivamente.
Sugestão: a distância entre os centros deverá ser inferior ou igual à soma dos raios, para que se
intersectem.
3.b) (2.5 valores)
Desenvolva uma função que escreva num ficheiro chamado circulos.txt os dados de um
conjunto de círculos.
Esta função recebe como argumento um vector vec de circulos (contendo os dados) e um
inteiro n (contendo o comprimento do vector).
Cada linha do ficheiro deve conter as coordenadas de um círculo (3 reais) seguido dos índices
dos outros círculos por si interceptados.
A função deverá começar por abrir o ficheiro, indicando uma mensagem de erro em caso de
inexistência. Não esquecer o fecho do ficheiro.
4. (2.5 valores)
Preencha as partes assinaladas a seguir a cada comentário no programa seguinte.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
/* a) Declare um vector v com 100 caracters */
/* b) inicialize v com o abecedário maiúsculo e minúsculo.
As letras deverão ficar intercaladas assim:
aAbBcCdDeEfF … xXyYzZ
Pode declarar outras variáveis
2º Exame de Programação MEEC 2010/2011
printf(“%d”, v[10]);
printf(“%d”, &v[10]);
— 4/5 —
*/
/* c) o que acontece se se executar a instrução
printf (“%s”, v);
*/
/* d) transforme v numa string
*/
/* e) Descreva textualmente o que é impresso no écran?
Não é necessário calcular o valor escrito
*/
/* f) Descreva textualmente o que é impresso no écran?
Não é necessário calcular o valor escrito
*/
exit(0);
}
5. (5.5 valores)
Considere uma lista de empregados caracterizados por nome, número, ano e local de
nascimento.
Esta lista está ordenada alfabeticamente por nome, e é criada de modo a que o primeiro
elemento (apontado por base) não contém dados relevantes.
5.a) (0.5 valores)
Declare os tipos necessários ao armazenamento da lista de empregados.
5.b) (1.5 valores)
Escreva uma função chamada contabiliza_idades cujos argumentos sejam um apontador para a
base da lista, o ano corrente e um vector de inteiros.
A função deverá contabilizar e armazenar nesse vector o número de empregados com uma
determinada idade. Só deverão ser contabilizadas as idades entre 18 e 70 anos.
Na primeira posição deverá ficar armazenada a quantidade de trabalhadores com 18 anos, na
segunda a quantidade de trabalhadores com 19 e na última a quantidade de trabalhadores com 70.
5.c) (2.0 valores)
Escreva uma função que receba como argumento o vector anterior e desenhe no ecrã um gráfico
de barras com a informação aí armazenda.
O gráfico de barras ficará deitado e que por cada 5 empregados com uma dada idade são
impresso os caracteres [] ; se restarem 3 ou 4 trabalhadores é desenhado no fim da barra o caracter [
(observe com atenção o exemplo).
É obrigatório usar a instrução for.
Exemplo:
• 5 empregados com 18 anos,
• 11 empregados com 19 anos,
• 9 (5+4) empregados com 20 anos
• 22 empregados com 21 anos:
18
19
20
21
[]
[][]
[][
[][][][]
5.d) (1.5 valores)
Escreva uma função que elimina da lista de trabalhadores todos os empregados cujo ano de
2º Exame de Programação MEEC 2010/2011
nascimento seja anterior a um dado ano.
A função recebe como argumento a base da lista e o ano actual.
— 5/5 —
Download

Programação — MEEC