Programação 2. Trabalho Prático P4B. Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux.



Documentos relacionados
PROGRAMAÇÃO DE MICROPROCESSADORES 2011 / 2012

Trabalhos Práticos. Programação II Curso: Engª Electrotécnica - Electrónica e Computadores

Trabalho 3: Agenda de Tarefas

Ficheiros binários 1. Ficheiros binários

COMPUTAÇÃO e PROGRAMAÇÃO

Programação III / Estruturas de Dados. Enunciado do Trabalho Prático

Engenharia de Software e Sistemas Distribuídos. Enunciado Geral do Projecto

Ministério Público. Guia de Consulta Rápida

Departamento de Engenharia de Electrónica e Telecomunicações e de Computadores Licenciatura em Engenharia Informática e de Computadores

TECNOLOGIAS DA INFORMAÇÃO E COMUNICAÇÃO. SISTEMAS DE GESTÃO DE BASE DE DADOS Microsoft Access TECNOLOGIAS DA INFORMAÇÃO E COMUNICAÇÃO

FAQ s para os Administradores do Sistema, sobre a Carreira especial médica

MANUAL UTILIZADOR SERVIÇO FTP

Engenharia de Software. Enunciado da Segunda Parte do Projecto

Escola Superior de Tecnologia de Setúbal. Projecto Final

Aplicações de Escritório Electrónico

DICIONÁRIOS. template<class K,class T> class Par { public: K chave; T valor; Par():chave(),valor()

Manual Gespos Passagem de Dados Fecho de Ano

Algoritmos de pesquisa. Tabelas de dispersão/hash

Árvores. Algoritmos e Estruturas de Dados 2005/2006

Tipos agregados. Tipos estruturados

Engenharia de Software. Enunciado da Quarta Parte do Projecto

Especificação do 3º Trabalho

GUIA PARA O PREENCHIMENTO DOS FORMULÁRIOS ENTIDADE GESTORA ERP PORTUGAL

Programação 2ºSemestre MEEC /2011. Programação 2º Semestre 2010/2011 Enunciado do projecto

Ferramentas de Modelação e Análise de Sistemas baseadas em Redes de Petri (RdP)

Gerar o Ficheiro de Inventário

UML (Unified Modelling Language) Diagrama de Classes

Simulação de Evento Discreto

Rock In Rio - Lisboa

Novo Formato de Logins Manual de Consulta

Programação Concorrente em java - Exercícios Práticos Abril 2004

Transição de POC para SNC

Hashing Letícia Rodrigues Bueno

DEPARTAMENTO DE MATEMÁTICA E CIÊNCIAS EXPERIMENTAIS

Engenharia de Software Sistemas Distribuídos

Manual de Utilizador. Disciplina de Projecto de Sistemas Industriais. Escola Superior de Tecnologia. Instituto Politécnico de Castelo Branco

GereComSaber. Disciplina de Desenvolvimento de Sistemas de Software. Sistema de Gestão de Serviços em Condomínios

CAPITULO 3 VARIÁVEIS DO TIPO ARRAY

Aleph Manual de utilização do módulo de circulação e empréstimos

Grupo I [4v] executaprograma();

Coleções. Page 1. Coleções. Prof. Anderson Augustinho Uniandrade

Plataforma de Benefícios Públicos Acesso externo

Acronis Servidor de Licença. Manual do Utilizador

Pilhas. Profa Morganna Diniz

Manual de Procedimentos. Câmaras Municipais

ADSE DIRETA MANUAL DE UTILIZAÇÃO PARA PRESTADORES DA REDE DA ADSE

SIQuant GeoQuality DGNToShapefile Converter

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

TECNOLOGIAS DE INFORMAÇÃO E COMUNICAÇÃO

Módulo Armazém. Neste módulo do OpenERP é possível gerir armazéns, movimentos de produtos, inventários, rastreabilidade, produtos, entre outros.

2. Execução do algoritmo de Huffman para construção de uma árvore binária (árvore de Huffman).

Engenharia de Software e Sistemas Distribuídos. Enunciado Geral do Projecto

Direcção Regional de Educação do Algarve

Trabalho Prático Nº1 Introdução ao C#.NET

Base de dados I. Uma base de dados é um simples repositório de informação relacionado com um determinado assunto ou finalidade

Programação SQL. Manipulação de Dados. DML Data Manipulation Language

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Algoritmos e Programação. Curso de Engenharia de Produção Prof. Ms. Rogério Cardoso rogerio.cardoso@aedu.com professor@rogeriocardoso.com.

TEMA: Oficinas Configurações, workflow e funcionalidades

Manipulação de Arquivos

Armazém Sistema de Recebimento SDR 006 LIBERTAÇÃO DO ESTOQUE USUÁRIO MANUAL DE TREINAMENTO. Versão 1.00

César Cruz Proprietário [18/04]

PRIMAVERA EXPRESS: Funcionalidades do Produto

Introdução aos Algoritmos e Estruturas de Dados 2011/2012

Adenda de Janeiro de 2013 Manual de Utilizador

Projetos. Universidade Federal do Espírito Santo - UFES. Mestrado em Informática 2004/1. O Projeto. 1. Introdução. 2.

GereComSaber. Disciplina de Desenvolvimento de Sistemas de Software. Sistema de Gestão de Serviços em Condomínios

Manual de utilização do Moodle

A BDAP Passo a Passo.

Universidade da Beira Interior. Sistemas Distribuídos

ROUPA DE TRABALHO VOLVO, ENCOMENDAR NO PORTAL WEB

CGA Directa. Manual do Utilizador. Acesso, Adesão e Lista de Subscritores

Relatório de Análise de Requisitos

Procedimentos Fim de Ano - PRIMAVERA

Desenvolvimento de Sistema de Software

Manual de Access 2007

MINISTÉRIO DA CULTURA

O Manual do ssc. Peter H. Grasch

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

1 Introdução. 2 Algumas funções úteis para lidar com strings

exercícios - cap Construa uma máquina de estados que ilustre os requisitos de uma máquina multibanco (levantamento de dinheiro)

Curso de Licenciatura em Engenharia Informática Cadeira de Algoritmia

Projecto de Implementação da. Modelo 11

TECNOLOGIAS DA INFORMAÇÃO E COMUNICAÇÃO - TIC 10º C. Planificação de. Curso Profissional de Técnico de Secretariado

Licenciatura em Engenharia Informática Departamento de Engenharia Informática Instituto Superior de Engenharia do Porto

Benefícios Aumento de produtividade; Sincronização directa e sem problemas; Muito fácil de utilizar.

Engenharia de Software

Grupo I [4v] b. [0,6v] De que forma é que o escalonador do Linux tenta minimizar o impacto desta limitação?

WEBSITE DEFIR PRO

Regulamento de Vigilâncias de Provas Escritas de Avaliação do DEEC

Departamento de Engenharia Electrotécnica e de Computadores. Gestão de Operações. Sistema de Informação Empresarial Introdução ao Software Baan

Guia Rápido do Contacts

Modelo Lógico e Físico da Base de Dados

BOLETIM INFORMATIVO TÉCNICO LIBERAÇÃO DE ATUALIZAÇÃO - CORDILHEIRA VERSÃO 2

Transcrição:

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007 Programação 2 2º Semestre Trabalho Prático P4B Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux. Grupo 1 Mensalmente as companhias aéreas fazem a escala de trabalho para o mês seguinte dos seus tripulantes. Numa versão muito simplificada deste problema, imagine que tem de proceder à distribuição dos voos existentes para um determinado mês, pelos tripulantes disponíveis para esse mesmo período. Os voos a distribuir e respectiva duração em minutos, existem num ficheiro texto com a seguinte estrutura: TP115, 240 TP239, 840 TP4532, 600. Considere a classe Tripulante a seguir definida, para guardar a informação relativa a cada um dos tripulantes por quem vão ser distribuídos os voos. class Tripulante int numtripulante; int minmes; // número de minutos mensais de trabalho acumulados int voosatribuidos; // contador de voos atribuidos no mes. Tripulante() : numtripulante(0), minmes(0), voosatribuidos(0) } Tripulante(const int _numtripulante) : numtripulante(_numtripulante), minmes(0), voosatribuidos(0) } int gettripulante() const return numtripulante; } int getminmes() const return minmes; } void setminmes(int _minmes) const minmes = _minmes; } int getvoosatribuidos() const return voosatribuidos; } void setvoosatribuidos(int _voosatrib) const voosatribuidos = _voosatrib; } bool operator<(const Tripulante &t) const return minmes < t.minmes; } bool operator==(const Tripulante &t) const return minmes == t.minmes && numtripulante == t.numtripulante ; } friend ostream &operator << (ostream &out, const Tripulante &t); ostream &operator<<(ostream &out, const Tripulante &t) out<< '[' << t.numtripulante << ':' << t.minmes << ':' << t.voosatribuidos << ']'<< endl; return out; } A classe Escalonamento disponibiliza métodos úteis para obter a informação pretendida. Esta classe usa uma árvore de pesquisa binária (BST) para armazenar os objectos da classe Tripulante. Os elementos da árvore devem estar ordenados pelos respectivos minutos mês de trabalho (assume-se que não existem valores repetidos). Todo o código pedido para resolver o problema deve ser colocado na directoria escalonamento, criada na sua área de trabalho. O código fonte do programa deve ser escrito num ficheiro com o nome Escalonamento.cpp. Nota: deve usar a implementação de árvores binárias de pesquisa apresentada nas aulas (não alterar este código): BST.h 1

a) Crie a classe Escalonamento, e implemente nesta classe o membro-função: void criararvore(tripulante trip[], int tamarray) Este membro-função recebe um array de objectos do tipo Tripulante e, a partir desse array, deverá criar uma árvore binária de pesquisa para os tripulantes (considere na classe Escalonamento o membro-dado BST<Tripulante> tripulantes) Nota: não coloque tripulantes com o mesmo número de minutos mensais. b) Implemente na classe Escalonamento o membro-função : void distribuirvoos(char* nomeficheiro) Este membro-função recebe como parâmetro o nome do ficheiro de texto com os voos a distribuir, de acordo com o formato indicado no enunciado. Os voos são distribuídos da seguinte forma (actualizando a árvore de tripulantes existente). Enquanto existir informação no ficheiro: 1. Procura na árvore o tripulante com menos minutos mensais de trabalho(seja o tripulante tx) 2. Se o número de horas de voo de tx não exceder o limite legal mensal de 5400 minutos mês, considerando este novo voo, isto é, minmes + minduracao <=5400: remover tx da árvore, acumular os minutos de duração do voo aos minutos mensais que o tripulante já tem, incrementar o número de voos atribuídos voltar a inserir este elemento na árvore. 3. Senão, inserir um novo tripulante na árvore, com um número de tripulante sequencial a partir de 9000, o valor de minutos mês igual à duração deste voo, e o contador de voos igual a 1. 4. Ler nova linha do ficheiro c) Implemente na classe Escalonamento o membro-função: void imprimirnovostripulantes() Este membro-função deve imprimir a lista dos novos tripulantes (número tripulante >=9000) criados pela distribuição dos voos a partir da árvore criada em b). 2

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007 Programação 2 2º Semestre Trabalho Prático P4B Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux. Grupo 2 O índice remissivo de um documento representa um mecanismo simples de consulta às palavras de um documento, associando-as às páginas da sua ocorrência. Pretende-se implementar um índice remissivo para documentos ASCII, onde as palavras são associadas às linhas em que ocorrem. Algumas palavras, entretanto, como artigos, conjunções, etc., não devem ser incluídas no índice. O número de ocorrências para algumas outras palavras também pode ser excessivamente elevado e, neste caso, considerar-se-á um limite, a partir do qual a palavra deixará de ser considerada no índice. Para este exercício, considere duas árvores de pesquisa binária (BST), uma para as palavras do índice, e outra para as palavras que deverão desconsideradas, ou seja, deixadas de fora. class Palavra string palavra; int ocorrencia; list<int> linhas; Palavra() ocorrencia = 0; } friend class IndiceRemissivo; class IndiceRemissivo // palavrasindexadas : BST de elementos do tipo Palavra // palavrasexcluidas : BST de elementos do tipo string int limiteocorrencia; IndiceRemissivo(int limite): limiteocorrencia(limite)} void lerdocumento(char* doc); list<int> procurarpalavra(string palavra); void imprimirindice(ostream& os); Todo o código pedido para resolver o problema deve ser colocado na directoria indice, criada na sua área de trabalho. O código fonte do programa deve ser escrito num ficheiro com o nome indice.cpp. Nota: deve usar a implementação de árvores binárias de pesquisa apresentada nas aulas (não alterar este código): BST.h a) Complete a classe IndiceRemissivo, declarando os membros-dado palavrasindexadas e palavrasexcluídas. Implemente também o membro-função: void IndiceRemissivo::lerDocumento(char* doc) 3

Que lê um documento ASCII e constrói um índice remissivo para as suas palavras. Ao ler o documento, para cada palavra, a função deverá procurar no membro-dado palavrasexcluidas se a palavra deve ser deixada de fora do índice. Se não for uma das palavras a ser deixada de fora, a função deverá procurar no membro-dado palavrasindexadas se a mesma já foi registada. Caso não tenha sido ainda incluída no índice, a palavra deverá ser inserida na árvore, com a indicação do número da linha e o membro-dado ocorrencia deverá ser incrementado. Caso já exista no índice, a ocorrencia deve ser incrementada e a linha da nova ocorrência incluída na lista linhas. Se o número de vezes que a palavra aparece no documento ultrapassar um dado limite, então a mesma deve ser excluída da estrutura palavrasindexadas e incluída na estrutura palavrasexcluidas. Ambas as árvores devem ser ordenadas alfabeticamente. b) Implemente o membro-função list<int> IndiceRemissivo::procurarPalavra(string palavra) que procura por uma palavra indexada. Caso a palavra seja encontrada, a função retorna a lista das linhas em que a palavra ocorre. c) Implemente o membro-função void IndiceRemissivo::imprimirIndice(ostream& os) que exibe na stream de saída indicada todas as palavras indexadas, com as respectivas linhas de ocorrência. Utilize o formato abaixo: <palavra>: <linha1>, <linha2>,... <linhan>; 4

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007 Programação 2 2º Semestre Trabalho Prático P4B Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux. Grupo 3 Pretende-se implementar uma classe para gerir o stock dos itens comercializados numa loja. Todo produto que for vendido deverá ser contabilizado de forma a reflectir no stock os produtos disponíveis para comercialização. Os produtos em stock serão registados numa tabela de dispersão, e serão indexados pelo seu nome. Cada registo deverá ainda conter informações como número de itens disponíveis e o fabricante. class Erro class RegistoProduto string nome; int disponivel; string fabricante; RegistoProduto(string n, int d, string f): nome(n), disponivel(d), fabricante(f)} friend class ControloStock; class ControloStock hash_set<registoproduto, hprod, eqprod> produtos; void lerfacturaentrega(char* factura); void venderitem(string produto, int quantidade); void imprimirstock(ostream& os); Todo o código pedido para resolver o problema deve ser colocado na directoria stock, criada na sua área de trabalho. O código fonte do programa deve ser escrito num ficheiro com o nome stock.cpp. a) Implemente as estruturas hprod e eqprod de forma a permitir a correcta manipulação dos registos de produto no controlo de stock. Implemente também na classe RegistoProduto o membro-função: void ControloStock::lerFacturaEntrega(char* factura) Que lê os itens adquiridos pelo estabelecimento comercial a partir dos itens discriminados na factura do fornecedor (ficheiro texto, indicando em cada linha, o nome do produto, o fabricante, e a quantidade) e actualiza o stock com os novos produtos adquiridos. Caso ainda exista itens do mesmo produto em stock, apenas a quantidade de itens disponíveis deverá ser actualizada. Se o produto não existir em stock, um novo registo deve ser inserido, com a respectiva quantidade. 5

b) Na classe RegistoProduto, implemente a função membro: void ControloStock::venderItem(string produto, int quantidade) que verifica se o produto solicitado existe em stock. Caso a quantidade pretendida seja inferior à quantidade disponível, o produto é vendido e a quantidade disponível é actualizada. Caso a quantidade solicitada seja maior do que a disponível, a função gera uma excepção do tipo Erro. Quando a quantidade disponível atinge o zero, o registo do produto deverá ser retirado do controlo do stock. c) Implemente o membro-função void ControloStock::imprimirStock(ostream& os, int qtmin) que imprime na stream de saída indicada todos os produtos disponíveis em stock, de quantidade em stock superior a qtmin. Deve também imprimir as respectivas quantidades. 6

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007 Programação 2 2º Semestre Trabalho Prático P4B Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux. Grupo 4 Pretende-se criar um dicionário electrónico colaborativo, onde as palavras e os seus significados podem ser inseridos/modificados por diversas pessoas (seguindo o conceito de wiki s). Todos os termos do dicionário serão guardados numa estrutura do tipo tabela de dispersão, onde os próprios termos são utilizados como chave de indexação. class Erro class Termo string palavra; list<string> significados; friend class Dicionario; class Dicionario hash_set<termo, htermo, eqtermo> termos; void adicionartermo(string termo, string significado); void lerdicionario(ifstream &fich); list<string> pesquisar(string termo); void imprimirdicionario(ostream& os); Todo o código pedido para resolver o problema deve ser colocado na directoria dicionario, criada na sua área de trabalho. O código fonte do programa deve ser escrito num ficheiro com o nome dicionario.cpp. a) Implemente as estruturas htermo e eqtermo de forma a permitir a correcta manipulação dos termos do dicionário electrónico. Na classe Dicionario, implemente o membro-função void Dicionario::adicionarTermo(string termo, string significado) Que adiciona um novo termo, com o seu respectivo significado, no dicionário. Caso o termo já se encontre no dicionário, o novo significado deverá ser associado ao termo, sendo o mesmo incluído na lista de significados daquele termo. Na classe Dicionario, implemente o membro-função void lerdicionario(ifstream &fich) Que lê, a partir de um ficheiro texto fornecido, pares (palavra, significado), e os insere no dicionário, invocando o membro-função referido acima (adicionartermo). O ficheiro está organizado da seguinte forma: a primeira linha contém a palavra, e a segunda linha contém o significado. 7

b) Na classe Dicionario, implemente o membro-função: list<string> Dicionario::pesquisar(string termo) que retorna a lista de todos os significados registados para um dado termo, directa ou indirectamente. Isto é, deve retornar a lista de todos os significados de termo mais a lista de todos os significados dos significados de termo, mais.... Deve ter o cuidado de fazer a pesquisa do mesmo termo no dicionário uma única vez, para evitar ciclos. c) Na classe Dicionario, implemente o membro-função: void Dicionario::imprimirDicionario(ostream& os, string &pref) Que imprime na stream de saída indicada todas as palavras do dicionário de prefixo pref, e os seus respectivos significados. Cada palavra do dicionário deverá ser exibida obedecendo ao seguinte formato: <termo1>: 1) <significado1>; 2) <significado2>;... n) <significadon>. <termo2>: 1) <significado1>; 2) <significado2>;... n) <significadon>. 8

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007 Programação 2 2º Semestre Trabalho Prático P4B Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux. Grupo 5 Suponha a existência de um conjunto de caixas de capacidade C, e itens i1, i2,..., in com peso p1, p2,..., pn, respectivamente. O objectivo é empacotar todos os itens sem ultrapassar a capacidade de cada caixa, usando o menor número possível de caixas. Implemente um programa para resolver este problema, de acordo com a seguinte estratégia: Comece por colocar os itens mais pesados primeiro Coloque o item na caixa mais cheia que ainda possua capacidade para conter esse item Guarde os itens em uma fila de prioridade (priority_queue<item>), ordenada por peso do item. Guarde as caixas em uma fila de prioridade (priority_queue<caixa>), ordenada por espaço ainda disponível na caixa. Considere a classe Item: class Item int id; int peso; Item(int idi, int p): id(idi), peso(p) int getid() const return id; } int getpeso() const return peso; }... a classe Caixa: class Caixa int capacidade; int livre; Caixa(int cap): capacidade(cap), livre(cap) int getlivre() const return livre; } void additem(item &item1) livre -= item1.getpeso(); }... e a classe Armazem class Armazem priority_queue<caixa> caixas; priority_queue<item> itens; int capmaxcaixa; // capacidade máxima de cada caixa a usar Armazem(int cmcaixa) capmaxcaixa=capcaixa; } void leitens(char *filename); int guardaitens(); 9

a) Complete as classes Item e Caixa, de forma a permitir o uso correcto das filas de prioridades. Implemente também na classe Armazem o membro-função: void leitens(char *filename) que lê um conjunto de objectos do ficheiro de nome filename e os coloca na fila de prioridade itens (os itens mais pesados devem estar no início do heap). Cada linha do ficheiro contém o peso de um item. Considere a identificação de um item (id) como sendo o número da linha do ficheiro onde está escrito o seu peso. b) Implemente na classe Armazem o membro-função: int guardaitens() que guarda os itens existentes em filapitens no menor número de caixas possível, segundo a estratégia definida anteriormente. Esta função retorna o número de caixas usadas. Note que as caixas a usar possuem capacidade máxima igual ao dado-membro capmaxcaixa. c) Implemente na classe Armazem o membro-função a função: int detocupacao(float ratio) que retorna o número de caixas usadas (presentes na fila de prioridade caixas) com ocupação superior a ratio. 10