Considerações: Leia a lista toda, o quanto antes, para evitar más interpretações e muitas dúvidas em cima da hora

Tamanho: px
Começar a partir da página:

Download "Considerações: Leia a lista toda, o quanto antes, para evitar más interpretações e muitas dúvidas em cima da hora"

Transcrição

1 Universidade Federal de Pernambuco Centro de Informática Lista 4 Introdução a Programação Prof: Adriano Sarmento Data: 16/12/2013 Data de entrega: 07/01/2014 Considerações: Leia a lista toda, o quanto antes, para evitar más interpretações e muitas dúvidas em cima da hora Envie uma prévia da lista, pelo menos um dia antes da data final da entrega, para o caso de acontecer algum imprevisto A lista é para ser feita individualmente. Qualquer tentativa de cópia acarretará o zeramento da lista de todos os envolvidos Não é permitido o uso da biblioteca conio.h. Em caso de dúvida, envie para duvidasip@googlegroups.com Evite utilizar variáveis globais, returns no meio do código, goto e o uso de break nas estruturas de repetição, pois pode acarretar diminuição na nota por motivos já explicados em sala de aula /monitoria. Atenção para a liberação da memória no final dos programas, será cobrado que o espaço alocado no decorrer do programa seja totalmente liberado no final do mesmo.

2 1) Biblioteca do Graci Tendo problemas para organizar seus livros, Graciliano decidiu fazê los em parcialmente ordem alfabética. Para isso, ele precisa que seja criado um vetor de 26 posições (uma para cada letra do alfabeto) de vetores dinâmicos de string, assuma que quando o programa começar, sua biblioteca estará vazia. Mas ele possui alguns livros que começam com a mesma letra e ainda assim precisa organizá los. Cabe a você criar o programa que trate a colisão (quando dois livros começam com a mesma letra) da seguinte forma: Aloque espaço para mais uma string no vetor dinâmico da letra e coloque o nome do livro nessa nova string alocada, ou seja, na última posição do vetor aumentado. O sistema possui os seguintes comandos: Cadastrar Lê o nome de um novo livro e o põe na tabela (o nome do livro pode ser tão grande quanto Graci queira). A cada nova entrada, deve ser impresso "Livro cadastrado na posição x", x é o índice do livro no vetor dinâmico. Finalizar Imprime todos os livros cadastrados no sistema separados por uma linha em braco. Começando com a letra A e seguindo até Z, do menor para o maior índice do vetor, para cada posição ocupada. Entrada: Saída: Cadastrar Livro cadastrado na posição 0 Harry Potter e o cálice de fogo. Livro cadastrado na posição 0 Cadastrar Livro cadastrado na posição 1. Os contos de Beedle, o Bardô Cadastrar Harry Potter e a Pedra filosofal Finalizar Livros: Harry Potter e o cálice de fogo Harry Potter e a Pedra filosofal Os contos de Beedle, o Bardô

3 2) Breds Breds são seres que ao sair para a guerra contra os Brules se organizam muito rigidamente, um Bred mal posicionado e a batalha é certamente perdida. Tendo muitos problemas para determinar a formação correta, o general Bred decidiu automatizar o processo, e pediu ajuda a você, sagaz programador, para determinar a formação. Ela deve seguir as seguintes regras: Pode haver apenas três Breds em cada linha de combate. O número de linhas de Breds deve ser sempre múltiplo de três. Os Breds só podem ser inseridos no exército de três em três. Quanto maior a patente do Bred mais acima e à direita da linha ele deve estar. As linhas devem ficar ao máximo preenchidas, de forma que respeitem as propriedades acima, e quanto mais acima, mais preenchida ela está. Assim, sempre deve se ter o mínimo de linhas necessárias para alojar todos os Bred do exército respeitando as propriedades. Quando o for dado como entrada, imprima a organização dos Breds para o general. Obs: Cada Bred será um ponteiro para inteiro, que será sua patente. Obs2: Esses ponteiros devem ser organizados em uma matriz de ponteiros para inteiro alocada dinamicamente, e apenas notação de ponteiros deve ser usadas para acessar as posições da matriz, e os valores dessa matriz que devem ser impressos como saída. Obs3: A patente do Bred será o valor dado como entrada e ela deve ser sempre maior que 0, em caso de entrada inválida deve ser exibida uma mensagem de erro e pedida uma nova entrada válida, pois toda linha será invalidada. Entrada 1: Saída 1: Entrada 2: Saída 2: Entrada inválida digite novamente Entrada 3: Saída 3:

4 ) Dominó Todos conhecem o jogo de dominós, em que peças com dois valores devem ser colocadas na mesa em seqüência, de tal forma que os valores de peças imediatamente vizinhas sejam iguais. O objetivo desta tarefa é determinar se é possível colocar todas as peças de um conjunto dado em uma formação válida. Tarefa Conjunto de seis peças (a) e uma formação utilizando todas as seis peças (b) É dado um conjuto de peças de dominó. Cada peça tem dois valores X e Y, com X e Y variando de 0 a 6 (X pode ser igual a Y). Sua tarefa é escrever um programa que determine se é possível organizar todas as peças recebidas em seqüência, obedecendo as regras do jogo de dominó. Entrada A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de testes contém um número inteiro N que indica a quantidade de peças do conjunto. As N linhas seguintes contêm, cada uma, a descrição de uma peça. Uma peça é descrita por dois inteiros X e Y (0 X 6 e 0 Y 6) que representam os valores de cada lado da peça. O final da entrada é indicado por N = 0. OBS: Você deve alocar exatamente n posições no vetor.

5 Exemplo de Entrada Saída Para cada conjunto de teste da entrada seu programa deve produzir três linhas na saída. A primeira linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado a partir de 1. A segunda linha deve conter a expressão "sim" se for possível organizar todas as peças em uma formação válida ou a expressão "nao" (note a ausência de acento) caso contrário. A terceira linha deve ser deixada em branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser seguida rigorosamente. Exemplo de Saída Teste 1 sim Teste 2 nao Teste 3 sim (esta saída corresponde ao exemplo de entrada acima).

6 4) Tetris A sua turma do colégio resolveu organizar um campeonato de tetris. Após discussão sobre as regras, ficou definido que cada aluno jogaria um total de 12 partidas. Das 12 pontuacões obtidas por cada aluno, a maior e a menor são descartadas, e as demais são somadas, resultando na pontuacão final de cada aluno. Tarefa Como você possui conhecimentos de programacão, acabou sendo designado pela turma para escrever um programa para imprimir a classificacão final do campeonato, a partir das pontuacões de cada jogador. Entrada A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de testes contém um número inteiro J, que indica o número de jogadores que participaram do campeonato. A seguir, para cada jogador há duas linhas na entrada: a primeira possui o nome do jogador (formado apenas por letras, sendo apenas a inicial em maiúscula, que pode ter qualquer tamanho), e a segunda possui as 12 pontuacões que o jogador obteve, separadas por espaço. As pontuações são inteiros entre 0 e O final da entrada é indicado por um conjunto de teste com J = 0. Exemplo de Entrada 4 Zezinho Luizinho Carlinhos Joaozinho Pedrinho Huguinho Zezinho

7 Saída Para cada conjunto de teste, o seu programa deve escrever uma linha contendo o identificador do conjunto de teste, no formato "Teste n", onde n é numerado seqüencialmente a partir de 1. A seguir, o seu programa deve escrever a classificacão final no campeonato, utilizando uma linha para cada participante. Cada linha deve conter três informacões, separadas por um espaço em branco: a classificacão do jogador, a sua pontuacão final, e o seu nome. A classificacão de um jogador é igual a 1 mais o número de jogadores que obtiveram pontuação maior do que a sua. Em caso de empate, os jogadores devem ser ordenados em ordem alfabética. Depois de toda a classificacão, deve ser deixada uma linha em branco. O formato do exemplo de saída abaixo deve ser seguido rigorosamente. Exemplo de Saída Teste Joaozinho Zezinho Luizinho Carlinhos Teste Huguinho Pedrinho Zezinho (esta saída corresponde ao exemplo de entrada acima) 5) Preto e Branco Uma imagem digital é a representação de uma imagem bidimensional usando números binários codificados. Uma das formas de codificar uma imagem colorida é usando o sistema RGB, onde cada pixel é representado por três valores, definindo assim a intensidade das camadas de cores vermelha (Red), verde (Green) e azul (Blue). Um determinado banco pretende digitalizar todo o seu arquivo de documentos, e chamou você para executar essa tarefa. A tarefa era simples, até você ser avisado que, por questão de gastos para armazenar as versões digitais dos documentos, esses terão que ser convertidos para imagens em preto e branco, para assim, economizar espaço. O seu trabalho é fazer um programa que receba uma imagem colorida de 24 bits e converta a mesma para uma versão em preto e branco. Essa transição é feita em dois passos: 1. Converter a imagem em uma equivalente em tons de cinza (Grayscale). 2. Com a versão em grayscale, executar a conversão para preto e branco (B&W)

8 A conversão de RGB para Grayscale é facilmente feita através da seguinte fórmula: GS = 0.299*R *G *B Uma das formas de converter uma imagem em grayscale para B&W é através da média da imagem. A partir do valor obtido, os pixels cujo tom de cinza é igual ou menor que a média se torna preto (0) e qualquer pixel com o valor acima se torna branco (1). A média de uma imagem é dada pela soma dos valores em grayscale de todos os pixels, dividida pelo número de pixels. A entrada do programa será dada da seguinte forma: 1. Dois inteiros (L e C), representando o número de linhas e colunas de pixels da imagem. 2. L linhas de 24*C bits (0 e 1), equivalentes a cada linha da imagem, onde a cada 24 bits se tem um pixel da imagem (8bits para cada uma das camadas de cores RGB, em sequência). A saída do programa é uma matriz de L linhas e C colunas, com os valores binários da imagem em preto e branco. De posse dessas informações sabemos que o programa executa, em sequência, as seguintes ações: 1. Lê toda a imagem, armazenando as strings de bits na memória. 2. Faz a conversão de strings para inteiros, e em sequência, a mudança de base. 3. Utilizando os valores em RGB, converte a imagem para tons de cinza. 4. Usando os valores obtidos na etapa anterior, obtém a versão B&W da imagem e a imprime na tela. Observações: 1. Na leitura, os bits serão armazenados numa matriz de pixels, onde cada pixel é um vetor de 3 strings(rgb, respectivamente). 2. Depois da conversão das strings para números, a imagem colorida ficará armazenada numa matriz de pixels, onde cada pixel é um vetor de 3 inteiros(rgb). 3. A imagem em tons de cinza ou preto e branco serão armazenadas numa matriz de pixel, onde cada pixel é um unsigned char. Entrada: Saída: Media:

9 Entrada: Saída: Media: