• Nenhum resultado encontrado

Departamento de Ciência de Computadores. b) R:

N/A
N/A
Protected

Academic year: 2021

Share "Departamento de Ciência de Computadores. b) R:"

Copied!
5
0
0

Texto

(1)

Departamento de Ciˆ

encia de Computadores

FCUP

Introdu¸c˜

ao `

a Programa¸c˜

ao (CC111)

2010/11

2o

¯ Teste Escrito (15.12.2010)

dura¸

ao: 3 horas

Uma Resolu¸

ao

(Cota¸c˜ao: 1.25, 1.25, 2.5, 2.5, 3, 3, 1, 1, 1, 2, 1.5)

1.

Em cada uma das al´ıneas, diga o que escreve o programa correspondente. a) x=5 y=4 z=5 w=8 #include <stdio.h> int main(){ int x=5, y=4, z=9, w=8; if (x == y) y = z; if (x != y && y <= w) z = x; if (z != x || y > w) w = z;

printf("x=%d y=%d z=%d w=%d",x,y,z,w); return 0;

}

b) R: -7 7 9 1

#include <stdio.h>

int f(int a,int b,int c,int d); int main(){ int a=5, b=7, c=9, d=1; a = f(a,b,c,d); printf("R: %d %d %d %d",a,b,c,d); return 0; }

int f(int a,int b,int c,int d) { if (a > b) a = a-b;

else if (a < b) d = b-a; return d-c;

}

2.

Seja n inteiro positivo. Divida-se n por 2 se for par ou multiplique-se n por 3 e adicione-se 1 se for ´ımpar. Aplique-se ao valor obtido esta regra de transforma¸c˜ao at´e encontrar 1. Por exemplo, para n = 6, obt´em-se 6,3,10,5,16,8,4,2,1, reduzindo-se 6 a 1 em oito passos, dois dos quais s˜ao do tipo 3x + 1. Para n = 27, s˜ao necess´arios 111 passos at´e obter 1, sendo 41 do tipo 3x + 1. A conjectura de Collatz, de 1937, afirma que para todo n ≥ 2, a sequˆencia assim constru´ıda termina sempre em 1 num n´umero finito de passos. At´e `a data, continua por provar.

a) Escreva uma fun¸c˜ao que retorne o n´umero de passos do tipo 3x+1 necess´arios para trans-formar n em 1, supondo que 2 ≤ n < 106 (sabe-se que se n ≤ 19 × 258, a sequˆencia

ter-mina). Assuma que qualquer c´alculo se pode efectuar em 32 bits e que n ´e passado `a fun¸c˜ao. Resolu¸c˜ao: int npassos(int n) { int contador = 0; do { if (n%2 == 0) n = n/2; else { contador++; n = 3*n+1; } } while (n != 1); return contador; }

b) Escreva um programa que leia dois inteiros a e b, com 2 ≤ a ≤ b < 106, e imprima o maior

inteiro n ∈ [a, b] que requer maior n´umero de passos do tipo 3x + 1. Dever´a usar a fun¸c˜ao definida na al´ınea anterior, mas n˜ao a transcreva (inclua apenas o seu prot´otipo).

Resolu¸c˜ao:

#include<stdio.h> int npassos(int n); int main() {

int n, max=0, a, b, pa; scanf("%d %d",&a,&b); for( ;a <= b; a++) { pa = npassos(a); if (pa >= max) { max = pa; n = a; } } printf("%d\n",n); return 0; }

(2)

c) Escreva uma fun¸c˜ao para analisar n sequˆencias de inteiros positivos e classificar cada uma como para k certa ou para k errada conforme seja ou n˜ao seja a sequˆencia de transforma¸c˜oes que se obteria para k sendo k > 1 o seu primeiro valor. O valor n ´e passado `a fun¸c˜ao.

Cada sequˆencia termina em 1 e tem apenas um 1. A fun¸c˜ao vai ler as sequˆencias do stan-dard input e imprimir o resultado. Por exem-plo, para n = 3 e dados 5 2 1 16 8 4 2 1 2 1, escreveria: para 5 errada para 16 certa para 2 certa Resolu¸c˜ao: void analisar(int n) { int valor, lido, k; while (n-- > 0) {

scanf("%d",&k); valor = k; do {

if (valor%2 == 0) valor = valor/2; else valor = 3*valor+1;

scanf("%d",&lido);

} while (lido == valor && lido != 1);

if (lido == valor) printf("para %d certa\n",k); else {

printf("para %d errada\n",k);

while (lido != 1) scanf("%d",&lido); // ler o resto }

} }

3.

Pretende-se cifrar (ou decifrar) um pre¸co usando a palavra REPUBLICA. A letra R substitui o d´ıgito 9, E o d´ıgito 8,. . . , A o d´ıgito 1 e, o d´ıgito 0 permanecer´a inalte-rado. O pre¸co para cifrar ser´a dado na forma e.c em que e e c s˜ao sequˆencias de d´ıgitos, po-dendo e ser 0. Se for para de-cifrar e e c ser˜ao sequˆencias de letras da palavra REPUBLICA e poder˜ao incluir o d´ıgito 0. Escreva um programa que leia uma op¸c˜ao 0 (cifrar) ou 1 (decifrar), a seguir leia um pre¸co em euros na forma e.c, o cifre ou decifre conforme a op¸c˜ao dada e imprima o re-sultado. Assuma que e.c n˜ao ter´a mais do que MAXC carac-teres. Deve definir esta cons-tante simb´olica com valor 15 no programa. Note que ter´a sempre um ponto entre e e c que n˜ao ser´a substitu´ıdo. De-fina trˆes fun¸c˜oes auxiliares para cifrar, decifrar e encon-trar a posi¸c˜ao de um carac-ter numa string formada por caracteres todos distintos, se este ocorrer.

Resolu¸c˜ao:

#include <stdio.h> #define MAXC 15

void cifrar(char preco[]); void decifrar(char preco[]);

void transformar(char preco[],char chave[],char b); int main(){ char preco[MAXC+1]; int opcao; scanf("%d",&opcao); getchar(); // nl scanf("%s",preco); if (opcao == 0) cifrar(preco); else decifrar(preco); printf("%s\n",preco); return 0; }

void cifrar(char preco[]) { char chave[] = "-ACILBUPER"; // porque "-123456789" transformar(preco,chave,’1’); }

void decifrar(char preco[]) {

char chave[] = "-152-8---3--4---7-9--6"; // porque "-ABCDEFGHIJKLMNOPQRSTU" transformar(preco,chave,’A’);

}

void transformar(char preco[],char chave[],char b){ int i;

for (i=0; preco[i]!=’\0’; i++)

if (preco[i] != ’.’ && preco[i] != ’0’) preco[i] = chave[preco[i]-b+1]; }

// Se chamar transformar() no main(), n~ao seria preciso // cifrar() e decifrar().

// ´E ´util implementar uma fun¸c~ao para procurar a posi¸c~ao da letra // na chave de cifra se n~ao se usar uma chave para decifrar.

(3)

Departamento de Ciˆ

encia de Computadores (CC111)

FCUP

2o¯ Teste Escrito (15.12.2010)

Uma Resolu¸

ao

4.

Indique para que serve o m´etodo de Horner, qual ´e a ideia principal, e que interesse tem. O m´etodo de Horner serve para avaliar uma express˜ao polinomial anxn+ . . . + a1x + a0 de grau n

num ponto x dado. ´E interessante porque s´o realiza n multiplica¸c˜oes. Come¸ca pelo coeficiente do termo de grau n e explora a propriedade alg´ebrica ilustrada pelo exemplo abaixo (em que n = 5): a5x5+ a4x4+ a3x3+ a2x2+ a1x + a0 = ( ( ( (a5x + a4)x + a3 )x + a2 )x + a1 )x + a0

5.

Em cada al´ınea deste problema, use obrigatoriamente fun¸c˜oes definidas em al´ıneas precedentes mesmo que n˜ao as tenha implementado.

Suponha que se definiu um novo tipo POINT por typedef struct { int x,y,creg; } POINT; para representar pontos do plano, com coordenadas (x, y) inteiras, num referencial ortonormado. Cada ponto pertence a uma regi˜ao, identificada pelo campo creg (c´odigo de regi˜ao).

a) Escreva uma fun¸c˜ao int sqrDist(POINT q,POINT p) para calcular o quadrado da distˆancia entre os pontos q e p.

Resolu¸c˜ao:

int sqrDist(POINT q,POINT p) {

return (p.x-q.x)*(p.x-q.x) + (p.y-q.y)*(p.y-q.y); }

b) Escreva uma fun¸c˜ao chamada inCircle com parˆametros p e c do tipo POINT e r inteiro, que verifica se o ponto p pertence ao c´ırculo de centro c e raio r. Retorna 1 se pertencer e 0 caso contr´ario. Resolu¸c˜ao:

int inCircle(POINT p,POINT c,int r) { return ( sqrDist(p,c) <= r*r ); }

c) Implemente void coverage(POINT pts[],int m, int circs[][3], int n, int ncs[]) para determinar o n´umero de c´ırculos a que pertence cada um dos m pontos dados por pts. O resultado fica no vector ncs na posi¸c˜ao correspondente. Em cada linha da matriz circs, o primeiro valor define o raio do c´ırculo e os outros dois definem as coordenadas do seu centro, existindo n c´ırculos. Resolu¸c˜ao:

void coverage(POINT pts[],int m, int circs[][3], int n, int ncs[]) { int i, j; POINT c; for(i=0;i<m;i++) ncs[i] = 0; for(j=0;j<n;j++) { c.x = circs[j][1]; c.y = circs[j][2]; for(i=0;i<m;i++)

ncs[i] = ncs[i] + inCircle(pts[i],c,circs[j][0]); }

}

(4)

APENAS UMA DAS AL´INEAS SEGUINTES TERIA DE SER RESOLVIDA

d) Implemente void my_sort(POINT pts[], int m, int ncs[]) para ordenar os m pontos dados por pts por ordem crescente de c´odigo de regi˜ao e, dentro de cada regi˜ao, por ordem crescente de n´ıvel de cobertura, sendo esse n´ıvel dado por ncs. O resultado ficar´a em pts (e ncs tamb´em ficar´a ordenado de forma que ncs[i] continue a corresponder a pts[i]).

Resolu¸c˜ao:

int compara(POINT p,POINT q, int ncp, int ncq) { if (p.creg < q.creg) return -1;

if (p.creg > q.creg) return 1; // p.creg == q.creg

if (ncp < ncq) return -1; if (ncp > ncq) return 1; return 0;

}

void my_sort(POINT pts[], int m, int ncs[]) {

int i, j, imin, ncaux; // ordena¸c~ao por selec¸c~ao POINT aux;

for (i=0; i < m-1; i++) { imin = i; for (j=i+1; j < m; j++) if (compara(pts[j],pts[imin],ncs[j],ncs[imin]) == -1) imin = j; if (i != imin) { aux = pts[i]; ncaux = ncs[i]; pts[i] = pts[imin]; ncs[i] = ncs[imin]; pts[imin] = aux; ncs[imin] = ncaux; } } }

e) Implemente float goodQuality(POINT pts[],int m,int ncs[],int lev,int codreg) para calcular a frac¸c˜ao de pontos da regi˜ao codreg com n´ıvel de cobertura acima de um valor lev. Suponha que o vector pts foi previamente ordenado pela fun¸c˜ao my_sort(), e que o n´ıvel de cobertura ncs[i] corresponde a pts[i]. Implemente pesquisa bin´aria para localizar um ponto na regi˜ao codreg. Resolu¸c˜ao:

int binarySearch(POINT pts[],int m,int ncs[],int codreg) { int inicio = 0, fim = m-1, meio;

while (inicio <= fim) { meio = (inicio+fim)/2;

if (pts[meio].creg == codreg) return meio;

if (pts[meio].creg < codreg) inicio = meio+1;

else fim = meio-1; }

return -1; // nao encontrou }

(5)

float goodQuality(POINT pts[],int m,int ncs[],int lev,int codreg) { int iponto, i, nAcima = 0, ntotal=0;

iponto = binarySearch(p,m,ncs,codreg); if (iponto == -1) {

printf("Regiao nao encontrada\n");

exit(1); // ou menos dr´astico ... return -1.0; por exemplo }

// -- an´alise para i < iponto

for (i=iponto-1; i >= 0 && ps[i].creg == codreg && ncs[i] > lev; i--) { ntotal++;

nAcima++; }

for (; i >= 0 && ps[i].creg == codreg; i--) ntotal++; // -- an´alise de iponto

if (ncs[iponto] > lev) nAcima++; ntotal++;

// -- an´alise para i > iponto

for (i=iponto+1; i < m && ps[i].creg == codreg && ncs[i] <= lev; i++) ntotal++;

for (; i < m && ps[i].creg == codreg; i++) { ntotal++;

nAcima++; }

return (nAcima*1.0)/ ntotal; }

Referências

Documentos relacionados

Neste tipo de situações, os valores da propriedade cuisine da classe Restaurant deixam de ser apenas “valores” sem semântica a apresentar (possivelmente) numa caixa

Para analisar as Componentes de Gestão foram utilizadas questões referentes à forma como o visitante considera as condições da ilha no momento da realização do

O Documento Orientador da CGEB de 2014 ressalta a importância do Professor Coordenador e sua atuação como forma- dor dos professores e que, para isso, o tempo e

Neste estudo foram estipulados os seguintes objec- tivos: (a) identifi car as dimensões do desenvolvimento vocacional (convicção vocacional, cooperação vocacio- nal,

3259 21 Animação e dinamização de actividades lúdico-expressivas - expressão musical 50 3260 22 Animação e dinamização de actividades lúdico-expressivas -

De seguida, vamos adaptar a nossa demonstrac¸ ˜ao da f ´ormula de M ¨untz, partindo de outras transformadas aritm ´eticas diferentes da transformada de M ¨obius, para dedu-

Os testes de desequilíbrio de resistência DC dentro de um par e de desequilíbrio de resistência DC entre pares se tornarão uma preocupação ainda maior à medida que mais

3 O presente artigo tem como objetivo expor as melhorias nas praticas e ferramentas de recrutamento e seleção, visando explorar o capital intelectual para