Buscar

P4_2014.2_INF1007 - Prog 2

Prévia do material em texto

��
Disciplina: INF1005 - Programação I
Avaliação:	 P1	Data: 12/09/2014
Algumas Funções de Bibliotecas (NESTA PROVA VOCE PODE USÁ-LAS EM QUALQUER QUESTÃO)
	stdio.h:
int scanf (char* formato, ...);
int printf (char* formato, ...);
FILE* fopen (char* nome, char* modo);
int fclose (FILE* fp);
int fscanf (FILE* fp, char* formato, ...);
int fprintf (FILE* fp, char* formato, ...);
char*fgets(char* str, int size, FILE* fp);
int sscanf(char* str, char* formato, ...);
stdlib.h:
void* malloc (int nbytes);
void free (void* p);
	
	math.h:
double sqrt (double x);
double pow (double x, double exp);
double cos (double radianos);
double sin (double radianos);
string.h:
int strlen (char* s);
int strcmp (char* s, char *t);
char* strcpy (char* destino, char* fonte);
char* strncpy (char* destino, char* fonte, int n);
char* strcat (char* destino, char* fonte);
char* strdup (char* s);
void qsort (void *v, int n, int tam, int (*cmp)(const void*, const void*));
void * bsearch(void * info, void * v, int n, int tam, int (*cmp)(const void *, const void *));
1ª Questão (2,0 pontos) Considere o tipo estruturado abaixo (não é TAD) que representa um imóvel em uma imobiliária:
struct endereco
{	char rua[31];
	int numero;
	char complemento[21];
	char bairro[21];
};
typedef struct endereco Endereco;
struct imovel
{	Endereco endereco;
	int	 numQuartos;
	float	 valor;
};
typedef struct imovel Imovel;
Escreva a função obtemImoveisPerfil, que:
- recebe um vetor de Imoveis, o número de imóveis, um bairro e um número de quartos. Recebe também o endereço de uma variável inteira, onde deve ser retornado o número de imóveis que atendam simultaneamente aos critérios bairro e número de quartos;
- cria e retorna (o endereço do primeiro elemento de) um novo vetor de PONTEIROS para Imoveis, alocado dinamicamente do tamanho exato necessário, com os ponteiros para os imóveis do vetor original recebido que atendam simultaneamente aos critérios bairro e número de quartos. Não esqueça que também deve ser devolvido, em uma variável inteira cujo endereço deve ser fornecido na chamada da função, o número de imóveis que atendam ao critério. 
Obs: Caso não exista nenhum imóvel que atenda aos critérios, nenhum vetor é criado e deve ser retornado NULL. Caso não seja possível criar o novo vetor, também deve ser retornado NULL.
Por exemplo, se fosse recebido o vetor abaixo com 6 imóveis, o bairro BOTAFOGO e o número de quartos igual a 3:
Seria retornado o vetor de ponteiros com 2 elementos: �
2ª Questão (3,0 pontos) Considere o Tipo Abstrato de Dados (TAD) Perfume que representa um perfume vendido por uma perfumaria. A interface do TAD encontra-se no arquivo Perfume.h, descrito abaixo:
 /* Interface do TAD Perfume: arquivo Perfume.h */
typedef struct perfume Perfume;
/* funcao perfCriaPerfume: recebe um nome, um fabricante, um preco e um percentual de desconto, e cria um novo Perfume com esses dados, retornando um ponteiro (ou seja, o endereço) para o Perfume criado */
Perfume *perfCriaPerfume (char *nome, char *fab, float preco, float percentualDesconto);
/* funcao perfExibe: recebe um ponteiro para um Perfume existente e exibe os dados desse Perfume */
void perfExibe (Perfume *pe);
/* funcao perfObtemPrecoFinal: recebe um ponteiro para um Perfume existente e retorna o preco final desse Perfume, ou seja, o preco calculado já com o DESCONTO*/
float perfObtemPrecoFinal(Perfume *pe);
/* funcao perfLibera: recebe um ponteiro para um Perfume existente e libera o espaco ocupado por esse Perfume */
void perfLibera (Perfume *pe);
Considerando o TAD Perfume acima, escreva a função ordena.
A função ordena:
- recebe um vetor de ponteiros para o TAD Perfume e o número de perfumes;
- ordena o vetor recebido crescentemente por preço final. 
Sua função deve utilizar o método quicksort. Você deve escrever e utilizar uma função de comparação em separado. (Pode ser usada a qsort da biblioteca).
Exemplo: 
�
Se os perfumes (apontados) do vetor são:
•	love-DIOR-70.50-10.00
•	luar-DIOR-90.50-5.00
•	rose-DGAB-70.50-20.00
•	mine-CHER-80.50-10.00
•	jazz-DIOR-90.50-10.00
•	kate-DIOR-70.50-10.00
•	bela-CHER-80.50-20.00
•	flor-DGAB-60.50-10.00
Após a ordenação, temos:
•	flor-DGAB-60.50-10.00 (PRECO FINAL: 54.45)
•	rose-DGAB-70.50-20.00 (PRECO FINAL: 56.40)
•	kate-DIOR-70.50-10.00 (PRECO FINAL: 63.45)
•	love-DIOR-70.50-10.00 (PRECO FINAL: 63.45)
•	bela-CHER-80.50-20.00 (PRECO FINAL: 64.40)
•	mine-CHER-80.50-10.00 (PRECO FINAL: 72.45)
•	jazz-DIOR-90.50-10.00 (PRECO FINAL: 81.45)
•	luar-DIOR-90.50-5.00 (PRECO FINAL: 85.97)
�
3ª Questão (2,0 pontos) Considere uma lista simplesmente encadeada de (ponteiros para) Paciente, cujo nó é representado pelo tipo estruturado NoLista abaixo:
typedef struct paciente Paciente;
struct paciente
{	char nome[51];
	int idade;
};
typedef struct noLista NoLista;
struct noLista
{	Paciente *pac;
	struct noLista *prox;
};
Escreva a função verificaOrdAlfabeticamente, que:
- recebe (um ponteiro para) a lista encadeada,
- retorna 1 se a lista encontra-se ordenada alfabeticamente por nome ou 0 em caso contrário.
Obs: Caso a lista esteja vazia ou possua um único elemento, a função retorna 1.
4ª Questão (2,0 pontos) Considere uma árvore binária de busca que guarda as informações (nome e nota) dos candidatos de um concurso, ordenada crescentemente por nota, cujo tipo que representa o nó da árvore é o ABB apresentado abaixo:
struct candidato
{	char nome[51];
	float nota;
};
typedef struct candidato Candidato;
struct no_abb_busca
{	Candidato *info;
	struct no_abb_busca *esq;
	struct no_abb_busca *dir;
};
typedef struct no_abb_busca ABB;
Escreva a função mostraOrdDecAcima, que:
- recebe (um ponteiro para) a raiz da árvore binária de busca e uma nota limite inferior X;
- exibe na tela, em ordem decrescente de nota, os dados dos candidatos com nota > x.
Por exemplo, se a árvore binária de busca fosse a da figura acima e a nota limite fosse 5.0, teríamos a seguinte saída na tela:
{kyra, 9.0}, {rosa, 7.5}, {davi, 7.5}, {vera, 6.5}, {luiz, 6.0}, {sofia, 5.5}, {liana, 5.3}
�
Soluções:
Q1)
Imovel *obtemImoveisPerfil(Imovel *vim, int n, char *bairro, int nQ, int *pQtd)
{	Imovel **vpi;
	int i, j;
	*pQtd=0;
	for (i=0; i<n; i++)
		if(strcmp(vim[i].endereco.bairro, bairro)==0 && vim[i].numQuartos == nQ)
			(*pQtd)++;
	if (*pQtd == 0)
		return NULL;
	vpi = (Imovel **) malloc ((*pQtd)*sizeof(Imovel *));
	if (vpi == NULL)
		return NULL;
	j = 0;
	for (i=0; i<n; i++)
		if(strcmp(vim[i].endereco.bairro, bairro)==0 && vim[i].numQuartos == nQ)
		{	vpi[j]=&vim[i];
			j++;
		}
	return vpi;
}
Q2)
float compPerf(Perfume *pe1, Perfume *pe2)
{	float pr1= perfObtemPrecoFinal(pe1);
	float pr2= perfObtemPrecoFinal(pe2);
	return pr1-pr2;
}
void ordena(Perfume **vp, int n)
{	int a, b;
	Perfume *aux, *pivo;
	if (n<=1)
		return;
	pivo= vp[0]; a=1; b=n-1;
	do
	{	while (a<n && compPerf(vp[a],pivo)<=0) a++;
		while (compPerf(vp[b],pivo)> 0) b--;
		if (a<b)
		{	aux = vp[a]; vp[a]= vp[b]; vp[b]=aux;
			a++; b--;
		}
	} while (a<=b);
	vp[0]= vp[b]; vp[b]=pivo;
	ordena(vp,b);
	ordena(&vp[a], n-a);
}
�
Q3)
int verificaOrdAlfabeticamente (NoLista *lst)
{	if (lst==NULL || lst->prox==NULL)
		return 1;
	while(lst->prox!=NULL)
	{	if (strcmp(lst->pac->nome, lst->prox->pac->nome)>0)
			return 0;
		lst = lst->prox;
	}
	return 1;
}
Q4)
void mostraOrdDecAcima (ABB *r, float notaLimI)
{	if (r==NULL)
		return;
	if(r->info->nota <= notaLimI)mostraOrdDecAcima (r->dir, notaLimI);
	else
	{	mostraOrdDecAcima (r->dir, notaLimI);
		printf("\n%s-%.2f ", r->info->nome, r->info->nota);
		mostraOrdDecAcima (r->esq, notaLimI);
	}
}
VPat,12,112
BOTAFOGO
3 quartos 700000,00
BMit,77,734
LEBLON
2 quartos 800000,00
BRib,85,914
COPACABANA
3 quartos 700000,00
SClem,55,401
BOTAFOGO
2 quartos 700000,00
RGrand,7,503
BOTAFOGO
3 quartos 650000,00
ACop,79,202
COPACABANA
1 quarto 600000,00
ana
24
teo
32
bia
45
leo
61
rui
28
Fig1: lista ordenada, a funcao retorna 1
lea
32
bia
40
edu
55
cris28
28
mac
43
Fig2: lista NAO ordenada, a funcao retorna 0
luiz
6.0
davi
7.5
kyra
9.0
vera
6.5
dina
4.0
lais
3.0
andre
4.0
sofia
5.5
liana
5.3
rosa
7.5
furia
allan
2010
nada
costa
2011
azul
mark
2014
briga
allan
2011
love
mark
1995
pain
costa
1994
raso
liam
2000
veloz
mark
2006
luva
mark
2004
bela
liam
2013
feroz
allan
1997
corra
mark
1997
morte
mark
2009
� PAGE \* MERGEFORMAT �3�
_1477842235.bin

Continue navegando