COM. – 1 CIÊNCIA DA COMPUTAÇÃO PROVA PARA TRANSFERÊNCIA 1. A CEF concederá um crédito especial com juros de 2% aos seus clientes de acordo com o saldo médio no último ano. Escreva um programa em C que leia o saldo médio de um cliente e calcule o valor do crédito de acordo com a tabela a seguir. Imprima uma mensagem informando o saldo médio e o valor de crédito. Saldo Médio De 0 a 500 Percentual Nenhum crédito De 501 a 1000 30% do valor do saldo médio De 1001 a 3000 40% do valor do saldo médio Acima de 3001 50% do valor do saldo médio 2. Escreva uma função que receba um número inteiro. Essa função deve verificar se tal número é primo. No caso positivo, a função deve retornar 1, caso contrário zero. Escreva também um programa para testar tal função. Transferência UFOP 2011/1 COM. – 2 3. Desenvolva um algoritmo com ordem de complexidade O( n log k ) para encontrar os k menores valores num vetor não ordenado de n elementos (onde n > k). Considere que operações/funções sobre estruturas de dados já estão implementadas. Transferência UFOP 2011/1 COM. – 3 4. Considere a função iterativa de busca binária em um vetor previamente ordenado apresentada abaixo. Construa uma função recursiva que realize a mesma busca. int BinariaIterativa(Tabela *T,TChave x,int n) { int Meio, Esq, Dir; Esq = 0; Dir = n-1; do { Meio = (Esq + Dir) / 2; if (x > T->Registro[Meio].Chave) Esq = Meio + 1; else Dir = Meio - 1; } while ( (x != T->Registro[Meio].Chave) && (Esq <= Dir) ); if (x == T->Registro[Meio].Chave) return Meio; else return -1; } Transferência UFOP 2011/1 COM. – 4 5. Considere uma pilha P vazia e uma fila F não vazia. Utilizando apenas os testes de fila e pilha vazias (FilaVazia, PilhaVazia e FazPilhaVazia), as operações Enfileira, Desenfileira, Empilha, Desempilha e uma variável aux do tipo TItem, escreva uma função em C/C++ que inverta a ordem dos elementos da fila (a função recebe somente a fila como parâmetro). Uma sugestão para a definição (protótipo) da função é: void InverteFila(TFila* pFila); Transferência UFOP 2011/1 COM. – 5 6. Suponha que um vetor (P) seja representado por suas coordenadas polares, o módulo (Γ Γ) e o angulo (α α), como apresentados na figura abaixo. Obs.: Os dados referentes a angulo podem ser tratados todos em radianos. Faça o que se pede. A) Crie um tipo abstrato de dados TPolar para armazenar um número polar usando dois números reais: o módulo (dGama) e o angulo (em radianos - dTeta). B) Escreva uma função que receba um número polar (representado por dois números reais), crie uma estrutura para representá-lo e retorne essa estrutura. Transferência UFOP 2011/1 COM. – 6 C) Escreva uma função que receba uma estrutura TPolar e retorne as coordenadas cartesianas ( x e y ) deste número polar usando decomposição por trigonometria (considere que as funções sin(arc) e cos(arc) estão definidas em math.h). D) Escreva uma função que receba dois TADs TPolar, defina um terceiro TAD para representar o resultado da soma dos dois números polares recebidos como entrada, e finalmente retorne esse terceiro TAD (considere que as funções sqrt(X) e atan2(CO,CA) estão definidas em math.h). Transferência UFOP 2011/1 COM. – 7 GABARITO Prova de transferência para Ciência da Computação Questão 1: #include <stdio.h> int main(void) { double SALDOMEDIO, CREDITO; printf("Digite o Saldo médio: "); scanf("%lf",&SALDOMEDIO); if ( SALDOMEDIO <= 500. ) CREDITO = 0; else if ( SALDOMEDIO <= 1000. ) CREDITO = (30./100) * SALDOMEDIO; else if ( SALDOMEDIO <= 3000. ) CREDITO = (40./100) * SALDOMEDIO; else CREDITO = (50./100) * SALDOMEDIO; printf("Saldo médio de: %lf\n",SALDOMEDIO); printf("Crédito especial de: %lf\n ",CREDITO); return 0; } Questão 2: #include <stdio.h> int primo(int N) { int i,pri; if ( N < 2 ) return 0; else { pri = 1; for ( i = 2; i < N ; i++ ) if ( (N % i) == 0 ) pri = 0 ; return pri; } } int main(void) { int X; printf("Digite um número: "); scanf("%d",&X); if ( primo(X) == 1 ) printf("É primo!\n"); else printf("Não é primo!\n"); return 0; } Transferência UFOP 2011/1 COM. – 8 Questão 3: int KMenores(int* Vetor, int *Heap, int nVetor, int nHeap) { int i ; int n = 0 ; /* tamanho do heap */ for( i = 1 ; i <= nVetor ; i++ ) { if ( n >= nHeap ) { if ( Max(Heap) > Vetor[i] ) { RetiraMax ( Heap, &n); Insere ( Vetor[i], Heap, &n ); } } else Insere ( Vetor[i], Heap, &n ); } return n; } Questão 4: int BinariaRecursiva(Tabela* T,TChave x,int Esq,int Dir) { int Meio; Meio = (Esq+Dir)/2; if (T->Registro[Meio].Chave == x) return Meio; else if (Esq >= Dir) return -1; else if (x > T->Registro[Meio].Chave) return BinariaRecursiva(T,x,Meio+1,Dir); else return BinariaRecursiva(T,x,Esq,Meio-1); } Transferência UFOP 2011/1 COM. – 9 Questão 5: void InverteFila(TFila* pFila) { TPilha stPilhaAux; TItem aux; FazPilhaVazia(&stPilhaAux); while(!FilaVazia(pFila)) { Desenfileira(pFila,&aux); Empilha(&stPilhaAux,aux); } while(!PilhaVazia(&stPilhaAux)) { Desempilha(&stPilhaAux,&aux); Enfileira(pFila,aux); } } Questão 6: #define PI 3.14159265 #include <stdio.h> #include <stdlib.h> #include <math.h> typedef struct { double dGama; double dTeta; } TPolar; TPolar TPolarInicializa(double _dGama, double _dTeta) { TPolar stAux; stAux.dTeta = _dTeta; stAux.dGama = _dGama; return stAux; } void TPolar2Cartesiano(TPolar* pstP, double* pdX, double* pdY) { *pdX = pstP->dGama * cos(pstP->dTeta); *pdY = pstP->dGama * sin(pstP->dTeta); } void Cartesiano2TPolar(double dX, double dY, TPolar* pstP) { pstP->dGama = sqrt(dX*dX+dY*dY); pstP->dTeta = atan2(dY,dX); } Transferência UFOP 2011/1 COM. – 10 TPolar TPolarAdd(TPolar* pstP1,TPolar* pstP2) { TPolar stAdd; double dX,dY,dX1,dX2,dY1,dY2; TPolar2Cartesiano(pstP1,&dX1,&dY1); TPolar2Cartesiano(pstP2,&dX2,&dY2); dX = dX1 + dX2;dY = dY1 + dY2; Cartesiano2TPolar(dX,dY,&stAdd); return stAdd; } int main() { double dGama,dTeta; TPolar stP1,stP2,stP3; printf("Digite o modulo e o angulo do 1o. vetor: "); scanf("%lf %lf",&dGama,&dTeta); stP1 = TPolarInicializa(dGama,dTeta/180*PI); printf("Digite o modulo e o angulo do 2o. vetor: "); scanf("%lf %lf",&dGama,&dTeta); stP2 = TPolarInicializa(dGama,dTeta/180*PI); stP3 = TPolarAdd(&stP1,&stP2); printf("A soma desses dois vetores eh: %lf / %6.2lfo\n", stP3.dGama,stP3.dTeta*180/PI); system("PAUSE"); } Transferência UFOP 2011/1