Universidade Estadual do Oeste do Paraná – UNIOESTE Campus de Cascavel Colegiado de Ciência da Computação Algoritmos Trabalho 3º Bimestre 1) A utilização de jogos de baralho tem sido um entretenimento muito utilizado ao longo dos anos. Esta abordagem estende-se inclusive ao dia-a-dia dos universitários onde, em seus horários livres, costumam praticar jogos de cartas para diversão. Os alunos do curso de computação, porém, tem muito pouco horários livres para esta pratica desportiva, impossibilitando assim, a realização de disputas muito extensas. Visando contornar este “problema de tempo”, os alunos desenvolveram uma variação do jogo de chacheta (em alguns lugares chama-se pife) chamado QuickCard. O novo jogo segue a seguinte abordagem: a) Utiliza-se um baralho completo, com suas 52 cartas (de 1 a 13, para cada um dos naipes) mais os dois coringas. b) Podem participar da partida de 2 a 6 jogadores. c) O objetivo do jogo é construir combinações envolvendo as três cartas presentes na mão do jogador. Estas combinações pode ser: • Três cartas semelhantes. Por exemplo: 2 de ouros, 2 de paus e 2 de copas; • Três cartas de um mesmo naipe em seqüência: 2, 3 e 4 de espadas; • Qualquer das combinações citadas, utilizando o coringa para substituição de alguma determinada carta. Por exemplo, 2 de ouros, coringa e 2 de copas, ou 2 de espadas, 3 de espadas e coringa. • A carta “As” vale tanto para o início quanto para o fim da seqüência, ou seja, pode assumir o valor 1 ou o valor 14. d) Cada jogador recebe 3 cartas (justamente para gastar menos tempo). e) Distribuídas as cartas, o jogador à direita daquele que distribuiu as cartas. f) Carta jogador na sua vez pode pescar uma carta do monte ou do lixo. As cartas do monte estão escondidas, de forma que o jogador só saberá qual é no momento em que compra-la. Enquanto a carta do lixo é revelada e descartada pelo jogador anterior. g) O jogo é disputado até que um jogador consiga completar sua combinação de três cartas, tornando-se assim o vencedor. Caso as cartas do monte terminem, as cartas do lixo são embaralhadas novamente e são utilizadas para a construção do novo monte. Visando tornar o jogo ainda mais prático e sem depender de que alguém leve o baralho para a faculdade, desenvolvam um software que simule a realização do QuickCard. Este programa deve, obrigatoriamente, conter as seguintes implementações: 1) Um procedimento nomeado Mistura que embaralhe as 54 cartas (52 normais e 2 coringas), garantindo aleatoriedade na distribuição das mesmas. 2) Um procedimento chamado Distribui que recebe por parâmetro o numero de jogadores presentes na mesa e faz a distribuição das 3 cartas para cada jogador. 3) Para controle de quem deve iniciar a partida, sorteia-se um valor inteiro de 1 ao número de jogadores. O valor sorteado será o jogador a iniciar a partida. 4) Desenvolver o procedimento Compra, que deve controlar o processo de compra das cartas de cada jogador. Quando o jogador tem a vez, ele pode escolher entre pegar a carta que está no topo do lixo (quando existir lixo) e a carta do topo do monte. Caso ele deseje ficar com a carta, o procedimento deve pedir que o jogador escolha uma carta para descartar, indo assim para o lixo. Caso ele não queira ficar com a carta comprada, ela é descartada automaticamente ao lixo. 5) O programa deve conter uma função chamada TestaMonte que verifica quantas cartas ainda existem no monte. Esta função apenas retorna 1 se ainda existem cartas no monte e 0se não existirem mais cartas. Caso o monte tenha acabado e ainda não haja vencedor, as cartas do lixo são então embaralhadas e passam a formar o novo monte. Lembrem-se que quando isso ocorrer, o embaralhamento não envolve as 54 cartas, pois cada jogador ainda possui suas três em mãos. 6) Após cada jogador efetuar sua jogada, o sistema deve executar uma função chamada VrfVencedor, que tem por objetivo testar se o jogador que acabou de atuar conseguiu formar alguma combinação possível. A função testa apenas o ultimo jogador a atuar e não todos. Caso alguma combinação seja obtida, a função retornará o número do jogador vencedor, caso contrário retornará 0. 7) O programa deve rodar até que a função VrfVencedor retorne valor diferente de zero. Não há necessidade de simular mais que uma partida. 2) Construir um software que simule um jogo de caça-palavras. Este algoritmo deverá compor uma matriz de 20 linhas e 20 colunas com caracteres de forma que o usuário possa procurar palavras distribuídas na matriz. Para tal desenvolvimento, a equipe deve atender aos seguintes requisitos: a) Os caracteres dispostos na matriz serão todos maiúsculos e estendem-se de A até Z. Não haverá caracteres especiais. b) Para fazer a construção e preenchimento da matriz, deve ser usado um procedimento chamado Constroi, sem passagem de parâmetros de entrada; c) Após formada a matriz o usuário começa a interagir, escolhendo palavras que devem ser procuradas na matriz. Este processo de busca é repetido até que o usuário informe um número ao invés de um caracter. Como a matriz envolve apenas caracteres maiúsculos, não há necessidade de verificar a entrada informada pelo usuário; d) O processo de busca deverá ser feito de três formas distintas: • Busca vertical no sentido cima baixo e baixo cima; • Busca horizontal no sentido direita esquerda e esquerda direita; • Busca em diagonal no sentido crescente e decrescente; e) Para fazer a procura vertical deve ser construído um procedimento chamado BuscaVer que receba como parâmetro de entrada (por cópia) a palavra fornecida pelo usuário; f) Para fazer a procura horizontal deve ser construído um procedimento com o nome de BuscaHor que receba como parâmetro de entrada (por cópia) a palavra fornecida pelo g) Já no terceiro caso, deve ser construída a procedure BuscaDia; 3) Seu Ignácio, dono de uma mercearia, interessado em ter um controle mais eficiente dos produtos de sua loja, bem como das operações de compra e venda, decidiu contratar alguém para desenvolver um software (vocês) básico para tais controles. Para facilitar a vida do programador, Ignácio criou um arquivo em formato texto chamado “cadastro.txt” contendo os dados dos produtos que ele comercializa na mercearia. Este arquivo tem a seguinte estrutura: Código Descrição Unidade Quantidade Preço Compra Preço Venda O campo quantidade indica o total de cada produto em estoque no momento em que o software vai entrar em funcionamento. Assim, existe a restrição de quantidade a ser vendida (não pode vender mais do que possui armazenado). O software deve então ser capaz de armazenar as informações dos produtos especificados e operar sobre estes. Estas operações são as compras feitas pelo seu Ignácio, para renovar o estoque e as vendas feitas a clientes. Para armazenar os dados em memória, pode-se utilizar um vetor contendo os dados (vetor de registro). Este vetor pode ser dimensionado com 35 posições, pois assim cabem todos os registros presentes no arquivo de entrada. Venda Um cliente, ao dirigir-se ao seu Ignácio lhe informa quantos produtos quer comprar e qual a quantidade de cada produto. Apenas os itens que tem unidade em quilograma que podem ser adquiridos parcialmente (meio quilo de feijão, por exemplo). Ao finalizar o pedido, o software deve retornar o total a ser pago pelo cliente e o lucro obtido na comercialização. Para descobrir o produto no cadastro, deve-se verificar o código do item. Este código é informado pelo usuário é deve ser passado por parâmetro (cópia) a uma função chamada VrfCodProd. Esta função deverá retornar o total do produto em estoque caso o produto esteja cadastrado e, caso o produto não esteja cadastro, a função retornará -1. Se o retorno for -1 o usuário deverá redigitar o código do produto, até informar um valor válido. Se a quantidade retornada for 0, exiba uma mensagem avisando o fato e indicando que tal venda não pode ser efetuada. Para critérios de controle, o sistema deve armazenar todas as operações de venda em um arquivo chamado “saidas.txt” sob o formato especificado no exemplo abaixo: Dados da venda: Código: 77 Quantidade: 5 Código: 14 Quantidade: 1 Registro no Arquivo: Venda 01 Código: 77 Quantidade: 5 Total: R$ 9.90 Código: 14 Quantidade: 1 Total: R$ 15.40 Total Venda: R$ 25,30 Lucro Total: R$ 10,60 Lucro: R$ 3.40 Lucro: R$ 7.20 Compra Seu Ignácio, ao notar que o estoque de determinada mercadoria está baixo, vai ao seu fornecedor e adquire produtos para manutenção dos estoques. Ao chegar lá, ele informa quantos produtos vai adquirir e os códigos de cada um deles (os códigos são os mesmos dos cadastrados na mercearia). Como ele sabe de cabeça todos os códigos dos seus produtos, não há necessidade de verificar se o código informado é válido. Para cada compra realizada, deve ser criado um registro em um arquivo texto chamado “entradas.txt”, onde a formato a ser seguido está definido abaixo: Dados da Venda Código: 77 Quantidade: 5 Código: 14 Quantidade: 1 Registro no Arquivo: Compra 01 Código: 77 Quantidade: 5 Código: 14 Quantidade: 1 Total: R$ 6.50 Total: R$ 8.20 Total Compra: R$ 14.70 Sempre que ocorrer uma operação de compra ou venda de produtos, o controle de estoque deve atualizar a quantidade de produtos armazenados. Saída do Sistema Quando o usuário pedir para sair do sistema, este deve exibir na tela o total lucrado no período e o total gasto em compras. Além disso, o programa deve criar um arquivo chamado “cadastroatual.txt” que contenha os mesmos dados do arquivo de entrada, porém, com as quantidades atualizadas. Especificações: a) O trabalho deve ser desenvolvido em dupla ou individualmente. Trabalhos com mais de dois alunos serão desconsiderados. b) Neste trabalho, serão avaliadas organização e clareza do código fonte. O programador deve respeitar as identações necessárias e quanto necessário, utilizar-se de comentários para elucidar operações mais complexas. c) O valor total do trabalho representará 30 décimos da nota do terceiro bimestre. d) Devem ser entregues arquivos contento apenas o código fonte (.c). Este código deve ser entregue em formato digital enviado pelo Curso Moodle da disciplina. Não serão aceitos, em hipótese alguma, trabalhos enviados via e-mail. e) Cópias de trabalhos serão penalizadas com a perda total do valor do trabalho. f) A linguagem utilizada para desenvolver este trabalho deve ser o C (podem ser utilizados os compiladores Geany, Dev C++, GCC, MingW ou mesmo o NetBeans). g) A data de envio do trabalho é 15/10/2010 até as 23:55. Esta submissão será feita via Moodle, dessa forma, todos devem estar cadastrados no curso Algoritmos 2010, para que seja possível o envio do trabalho. h) O trabalho enviado deve estar claramente identificado, como nome dos acadêmicos, série e data do trabalho.