Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007. Programação 2

Documentos relacionados
Algoritmos e Estruturas de Dados 2007/2008

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007. Programação 2

Algoritmos e Estruturas de Dados

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007. Programação 2. Trabalho Prático P2B

Sistemas Operacionais I Aula Prática 1 - Introdução ao Linux

Introdução à Linguagem de Programação C: Variáveis, Constantes, Expressões, Atribuição, Tipos de dados, Entrada e Saída de Dados

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

FICHA 8 PILHAS E FILAS

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Operadores. Tipo de operadores. Aritméticos. Relacionais. Lógicos. Bit a bit. Cálculos aritméticos: soma, subtracção, multiplicação, divisão, etc.

Prof. Jesus José de Oliveira Neto

Conceitos básicos de programação

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007. Programação 2

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Linguagem C: Introdução

Slide 01 16/03/2017. Estruturas de Dados. Prof. Cleziel Franzoni da /Cleziel.

Programação Básica. Estrutura de um algoritmo

CIV 2802 Sistemas Gráficos para Engenharia º Trabalho: Programação básica em C++: Classes

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

Algoritmos: tipos de dados, variáveis e expressões

Exercícios Repetição

INF P4-12/12/09 Questão 1 Nome:

Tipos de Dados, Variáveis e Entrada e Saída em C. DCC 120 Laboratório de Programação

Ambiente de desenvolvimento

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

SCC 202 Algoritmos e Estruturas de Dados I. Pilhas (Stacks) (implementação dinâmica)

Tipo de Dados Abstractos: Pilha (stack)

Capítulo 2 Operadores. A função scanf()

Estruturas de Dados. Módulo 11 Pilhas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Variáveis, Tipos de Dados e Operadores

Um exercício (pilhas, BST,...)

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95

C Operadores e Expressões

Programação de Computadores I Dados, Operadores e Expressões PROFESSORA CINTIA CAETANO

EXPRESSÕES ARITMÉTICAS PARTE 1

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE DEPARTAMENTO DE INFORMÁTICA E MATEMÁTICA APLICADA. DIM0320 Algoritmos e Programação de Computadores

Módulo Lógica Programação com aplicações em Java. Projeto khouse Profissionalizante Profª Larissa Brandão

Algoritmos e Estrutura de Dados Aula 08 Pilhas

Introdução a programação Visão geral

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2

Por que programar? Programação de Computadores Introdução a C++ É tudo questão de automatizar coisas. Alan de Freitas

Algoritmos e Estruturas de Dados

3. Linguagem de Programação C

Aula 3 Conceitos de memória, variáveis e constantes Cleverton Hentz

Centro Universitário Franciscano Curso de Sistemas de Informação Disciplina de algoritmos e programação II. Ponteiros

Prova 2 PMR2300 1o. semestre 2015 Prof. Thiago Martins

UNIVERSIDADE DA BEIRA INTERIOR

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007. Programação 2. Trabalho Prático P1B

Estruturas de Dados Filas

Curso Básico de Programação Aula 11. Revisão Aula Anterior Laços de Repetição While; Do-While; For.

CCO 016 / COM 110 Fundamentos de Programação

Introdução a Programação de Jogos

Estrutura de Dados I Bacharelado em Sistemas de Informação FACOM UFU Lista de Exercícios

CURSO BÁSICO DE PROGRAMAÇÃO AULA 11. Revisão Aula Anterior Vetores Cadeia de Caracteres

Aula 7 e 8 Filas e suas Aplicações. Prof. Leticia Winkler

Abaixo seguem os comandos e suas particularidades, bem como exemplos para o indicador de linha

Programação Orientada a Objetos II Java Segunda aula. Prof. Rogério Albuquerque de Almeida

Módulo 1. Introdução. AEDS I C++ (Rone Ilídio)

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

Métodos de Programação I Ana Maria de Almeida

Exercícios de Repetição

Aula 8 Comandos de Seleção

Algoritmos e Estruturas de Dados I (DCC/003) 2013/1. Estruturas Básicas. Aula Tópico 4

Algoritmos e Programação

Linguagem C: Ponteiros. Prof. Leonardo Barreto Campos 1

Puca Huachi Vaz Penna

Programação II. Aula 3

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 29 de agosto de 2008

Variáveis primitivas e Controle de fluxo

Programação: Vetores

Introdução a Computação

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007. Programação 2

PROGRAMAÇÃO I E N T R A DA E S A Í DA D E DA D O S

3. Linguagem de Programação C

TÉCNICAS DE LINGUAGEM DE PROGRAMAÇÃO

Introdução a Linguagem C. Prof. Me. Hélio Esperidião

Programação Estruturada

12. Filas Interface do tipo fila

Algoritmos e Estruturas de Dados 2005/2006

Linguagem C Princípios Básicos (parte 1)

Introdução a Programação. Curso: Sistemas de Informação Programação I José R. Merlin

Faculdade Anglo-Americano Curso de Ciência da Computação Linguagem de Programação. Lista de Exercícios 1

ESTRUTURA DE DADOS FILAS SEQUENCIAIS

A regra de acesso aos dados de uma fila é a seguinte: O primeiro elemento que entra (na fila) é o primeiro que sai (FIFO first in, first out).

Programação de Computadores 1 Lista 2. Prof. Álvaro A. F. de Souza DECSI - ICEA - UFOP

Linguagem C vetores. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

Classes o Objetos. Classes, objetos, métodos e variáveis de instância

Aula 3. Objetivos Sequências de escapes ; Um aplicativo que adiciona inteiro; Aritmética.

S U M Á R I O. Definição de Estrutura de Dados. Vetores. Listas Ligadas. Pilhas. Filas

Programação Aplicada à Engenharia

INF1007: Programação 2. 0 Revisão. 06/08/2015 (c) Dept. de Informática - PUC-Rio 1

Transcrição:

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007 Programação 2 2º Semestre Trabalho Prático P3B Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux. Grupo 1 Pretende-se implementar uma classe para modelar o atendimento aos clientes num banco. Existem duas filas, uma prioritária e outra normal, e os clientes podem realizar dois tipos de operações, depósitos e levantamentos. class NaoHaCliente class Cliente string operacao; double montante; Cliente(string o="deposito", double m): operacao(o), montante(m)} friend class Banco; class Banco queue<cliente> filaprioritaria; queue<cliente> filanormal; double valoremcofre; Banco(double valor=10000):valoremcofre(valor)} void inserecliente(cliente cte, string fila); bool clientesemespera(); Cliente proximoclienteservir(); double montantemovimentado(); a) Implemente o membro-função void Banco::insereCliente(Cliente cte, string fila) Este membro-função insere o cliente na fila indicada, que pode tomar dois valores ( normal ou prioritaria ), para realizar uma operação, que pode ser de deposito ou de levantamento. As operações de deposito incrementam o membro-dado valoremcofre do banco, enquanto que nas operações de levantamento o valoremcofre sofre um decremento do valor da operação. Contudo um cliente que realiza levantamentos, independente do valor, irá sempre para a fila normal. 1

Implemente ainda o membro-função bool Banco::clientesEmEspera() que retorna verdadeiro se ainda existir algum cliente à espera de ser atendido, em quaisquer filas. b) Implemente o membro-função Cliente Banco::proximoClienteServir(); Que retorna o próximo cliente a ser servido e remove-o da fila respectiva. Os primeiros clientes a serem servidos são os da filaprioritaria, e só a seguir são atendidos os clientes da filanormal. Caso não existam clientes à espera deve ser lançada uma excepção do tipo NaoHaCliente. c) Implemente o membro-função double Banco::montanteMovimentado(); Esta função retorna a soma dos montantes movimentados por todos os clientes até o momento, tanto os servidos na filaprioritaria como os servidos na filanormal. Altere convenientemente a classe Banco de forma a simplificar este método. No programa principal, leia sucessivamente do standard input a informação de um cliente e insira-o na fila. A leitura de clientes deve ser terminada com Ctrl-D (exercite também a leitura das informações dos clientes a partir de um ficheiro fornecido). Finalmente, imprima o montante total movimentado. 2

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007 Programação 2 2º Semestre Trabalho Prático P3B Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux. Grupo 2 Quando dois computadores comunicam entre si num ambiente de rede, as informações são trocadas em porções discretas denominadas pacotes. Como a largura de banda pode não ser suficiente para o envio de todos os pacotes de uma só vez, utiliza-se uma memória auxiliar (buffer) para armazenar os pacotes. O processamento dos pacotes obedece um regime FIFO. Pretende-se implementar uma classe para gerir a memória auxiliar. class Erro class Pacote int tamanho; int id; //identificador Pacote(int tnho, int idt): tamanho(tnho), id(idt)} friend class MemoriaAuxiliar; class MemoriaAuxiliar queue<pacote> pacotes; int maxmemoria; MemoriaAuxiliar(int mtamanho = -1):maxMemoria(mTamanho) int memoriaconsumida(); Pacote proximopacote(); void adicionapacote(const Pacote& pkge); a) Implemente o membro-função int MemoriaAuxiliar::memoriaConsumida(); Esta função retorna o tamanho de memória efectivamente utilizada pelos pacotes em espera de processamento, que será igual ao somatório do tamanho de todos os pacotes na fila de espera. b) Implemente o membro-função Pacote MemoriaAuxiliar::proximoPacote(); 3

que retorna o próximo pacote na lista de espera a ser enviado pela rede e retira-o da fila de espera. Esse procedimento irá incrementar a memória disponível permitindo a adição de novos pacotes. Após a implementação da próxima função-membro, teste a função proximopacote na função principal. b) Implemente o membro-função void MemoriaAuxiliar::adicionaPacote(const Pacote& pkge); que adiciona um novo pacote à memória. Se a memória ainda tiver espaço livre, superior ao tamanho do pacote a ser adicionado, este será inserido na fila de processamento da memória auxiliar. A memória disponível é igual à diferença da memória máxima do buffer (membrodado maxmemoria) e a memória consumida pelos pacotes em fila de espera, resultante da função memoriaconsumida. Caso não haja memória disponível, o pacote é simplesmente ignorado. No programa principal, insira sucessivamente novos pacotes à memória auxiliar a partir do standard input (ou através de um ficheiro de texto a ser fornecido). A leitura deve ser terminada com Ctrl-D. Finalmente, imprima a memória total consumida. 4

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007 Programação 2 2º Semestre Trabalho Prático P3B Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux. Grupo 3 Uma impressora de rede recebe ficheiros para impressão, que entram numa fila de espera obedecendo a um regime FIFO. Pretende-se implementar uma classe para gerir a fila de impressão dessa impressora. class Erro class Documento string nome; string owner; int tamanho; int nfolhas Documento(string n, string o, int t, int f): nome(n), owner(o), tamanho(t), nfolhas(f); friend class Impressora; class Impressora queue<documento> filadeimpressao; int maxmemoria; int folhasportoner; int folhasimpressas; Impressora(int mmemoria, int folhas): maxmemoria(mmemoria), folhasportoner(folhas)} void adicionadocumento(documento doc); Documento imprimirdocumento(); void excluirdocumento(srting n, string o); void listardocumentos(ostream& os); void trocartoner(); a) Implemente o membro-função void Impressora::adicionaDocumento(Documento doc) Esta tenta adicionar um novo documento à fila de impressão. Caso o tamanho do documento a adicionar seja maior do que a memória disponível, o documento simplesmente é ignorado. A 5

memória disponível é igual à diferença entre a memória máxima da impressora e a memória consumida pelos documentos que já se encontram na fila. b) Implemente o membro-função Documento Impressora::imprimirDocumento() Que tenta imprimir o próximo documento na lista de espera. Se o documento for impresso, sai da fila. Caso não haja toner na impressora, suficiente para imprimir todas as páginas do documento, a impressora imprime as páginas que forem possíveis, deixando o restante do documento para ser impresso quando o toner for trocado. Se isso acontecer, deverá lançar uma excepção do tipo Erro. Implemente também a função-membro void trocartoner(); Que repõe um novo toner na impressora sempre que o anterior terminar. A função basicamente reiniciará o membro-dado folhasimpressas a zero, que indica o número de folhas já impressas com um dado toner. c) Implemente o membro-função void Impressora::excluirDocumento(srting n, string o) Que retira da fila de impressão o documento de nome n, pertencente ao owner o. Implemente também o membro-função void Impressora::listarDocumentos(ostream& os) que exibe na stream de saída indicada todos os documentos em espera para impressão, e o total de folhas que a impressora ainda é capaz de imprimir com o toner actual. 6

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007 Programação 2 2º Semestre Trabalho Prático P3B Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux. Grupo 4 A Notação Reversa Polaca (Reverse Polish Notation), utilizada em máquinas de calcular como a 48Gx da HP, por exemplo, considera expressões matemáticas em que os operadores surgem a seguir aos operandos (notação pósfixa). A expressão 3+5 seria, portanto, 3 5 +. Pretende-se implementar uma classe RPN que realiza as quatro operações básicas (soma, subtracção, multiplicação e divisão) entre números inteiros de um algarismo. class OperacaoInvalida class Elemento float operando; char operador; Elemento(float umoperando=0.0, char umoperador='?'): operando(umoperando), operador(umoperador)} class CalculadoraRPN stack<elemento> pilha; protected: float realizaoperacao(float v1, float v2, char op); float avaliaexpressao(string expressao); a) Implemente o membro-função float CalculadoraRPN::realizaOperacao(float v1, float v2, char op) que realiza a operação op entre os operandos v1 e v2. Caso a operação a ser efectuada não seja uma das quatro operações aritméticas básicas, esta função deverá gerar uma excepção do tipo OperacaoInvalida. 7

b) Implemente o membro-função float CalculadoraRPN::avaliaExpressao(string expressao) que recebe uma expressão na notação RPN, e realiza os respectivos reconhecimentos de operandos e operadores, utilizando a função anterior para o cálculo das respectivas operações. Basicamente, os operandos serão postos numa pilha, à medida em que são lidos da expressão, e sempre que um operador for encontrado executa-se a função-membro avaliaexpressao sobre os dois operandos no topo da pilha, sendo os mesmos substituídos pelo resultado da função. Esse procedimento é realizado até restar apenas um valor na pilha, que será o resultado final. c) Teste a classe implementada na função principal. Peça ao utilizador que introduza expressões sucessivas (com diferentes operações e número de operandos), que serão avaliadas pela classe CalculadoraRPN. A leitura de expressões deverá ser finalizada com Ctrl-D. Exercite também com expressões lidas a partir de um ficheiro fornecido. 8

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007 Programação 2 2º Semestre Trabalho Prático P3B Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux. Grupo 5 Pretende-se implementar um programa para resolução aritmética de expressões matemáticas simples. As expressões a analisar podem conter unicamente as quatro operações: soma +, subtracção, multiplicação + e divisão / sobre operandos inteiros. As operações também podem conter (), [] ou }, para indicar explicitamente a prioridade de execução das operações. Um exemplo de expressão válida é: 5 * [(2 + 5)/2 +3] -2} class ExpressaoInvalida class OperacaoInvalida class Calculadora stack<float> operandos; stack<char> operadores; bool parentesisok(); void leexpressao(string &expressao); float calculaoperacao(float op1, float op2, char opr); float calculavalor(); a) Implemente o membro-função bool Calculadora::parentesisOK(); Que retorna verdadeiro se, para todo carácter (, [ ou, existir o seu correspondente de fechamento, ou seja ), ] ou }, respectivamente. Caso contrário, a função retornará falso. Na implementação, utilize uma pilha auxiliar. Todo parêntesis de abertura ( (, [ ou ) encontrado na expressão lida é posto no topo da pilha. Para cada parêntesis de fechamento ( ), ] ou } ) encontrado, deverá verificar se o que está no topo da pilha é o seu correspondente de abertura. Se for, o parêntesis de abertura deverá ser retirado do topo da pilha. Caso contrário há erro de correspondência. No fim do procedimento, a pilha deverá estar vazia. Implemente também o membro-função void Calculadora::leExpressao(string &expressao) Que realiza a leitura de uma expressão a calcular e utiliza a função anterior para testar se a expressão é válida ou não. Caso não seja válida, lançará uma excepção do tipo ExpressaoInvalida. Se a expressão for válida, colocará nas pilhas operandos e operadores os respectivos valores lidos da expressão. 9

b) Implemente o membro-função float Calculadora::calculaOperacao(float op1, float op2, char opr) que realiza a operação opr entre os operandos op1 e op2. Caso a operação a ser efectuada não seja uma das quatro operações aritméticas básicas, esta função deverá gerar uma excepção do tipo OperacaoInvalida. c) Implemente o membro-função float Calculadora::calculaValor() que realiza o cálculo das respectivas operações da expressão fornecida. O cálculo é realizado a partir das pilhas operandos e operadores. Para cada operador, do topo da lista, executa-se a função anterior, calculaoperacao, com os dois primeiro operandos da pilha operandos. Tanto os operandos e o operador são retirados das respectivas pilhas. O resultado da função calculaoperação é inserido no topo pilha operandos. O procedimento é realizado para o operador seguinte, até que não tenha mais operadores na pilha. O resultado final será, portanto, o último valor da pilha operandos. Teste a classe implementada na função principal, pedindo ao utilizador que introduza expressões sucessivas. A leitura de expressões deverá ser finalizada com Ctrl-D. Teste também com a leitura de expressões a partir de um ficheiro fornecido. 10

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007 Programação 2 2º Semestre Trabalho Prático P3B Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux. Grupo 6 Uma biblioteca armazena livros antigos num arquivo morto, em pilhas de caixas, onda cada caixa contém livros de um mesmo tema (programação, literatura, arte, etc.) Sempre que um livro antigo precisa ser consultado, as caixas de cima precisam ser retiradas, até que a caixa do tema desejado seja encontrada. class LivroInexistente class Livro string titulo; string tema; Livro(string tlo, string tma): titulo(tlo), tema(tma)} class Caixa stack<livro> livros; string tema; int conteudo; Caixa(string tma, int cdo): tema(tma), conteudo(cdo)} friend class Biblioteca; class Biblioteca stack<caixa> caixas; Livro retirarlivro(string tlo, string tma); void reporlivro(livro livro); void listarlivros(ostream& os, string tma); void listarlivros(ostream& os); a) Implemente o membro-função Livro Biblioteca::retirarLivro(string tlo, string tma) Que procura nas caixas um livro com dado título, tlo, de um certo tema, tma. Quando a caixa do tema desejado é identificada, os livros são retirados um a um, e empilhados numa mesa 11

auxiliar, até que o livro desejado seja encontrado. Depois de retirado o livro desejado, os livros anteriores são repostos na caixa de uma só vez, sendo a caixa fechada. As caixas anteriores são repostas, uma a uma, na ordem inversa a que foram retiradas. Se o livro (ou tema) não existirem, a função gerará uma excepção do tipo LivroInexistente. b) Implemente o membro-função void Biblioteca::reporLivro(Livro livro) Que repõe um dado livro na respectiva caixa. O livro é reposto no topo da pilha da caixa. Esta função também poderá ser utilizada para adicionar novos livros ao arquivo morto. c) Implemente os membros-função void Biblioteca::listarLivros(ostream& os, string tma) void Biblioteca::listarLivros(ostream& os) Que exibem uma lista dos livros no arquivo morto. A primeira função exibe os livros de um dado tema, portanto, apenas os contidos numa dada caixa. A segunda função exibe todos os livros arquivados. 12