VB : Verificação de Balanceamento

Implementar, usando pilhas, um programa que verifica se existe um balanceamento entre parênteses, colchetes e chaves, em um programa escrito em linguagem C. O nome do arquivo contendo o programa deve ser fornecido pelo usuário.

Exemplo 1 -  Entrada:

void main()
{
    int x;
    x = (2*3)+((5*10);
    y = x;
}

Saida:
ERRO LINHA 4: Parêntese aberto mas não fechado.

Exemplo 2 - Entrada:

coisa()
{
   int x;
   x=1;
}}

outro(){}

Saída:
ERRO LINHA 5: Chave fechada mas não aberta

-----------------------------------------
Melhor trabalho entregue até o momento: Clique Aqui

Autores:

Ulysses Pereira de Almeida Neto
Higor Aparecido Vieira Alves
Kelly Rose Miyashiro
Fátima Solange Rodrigues



Outro exemplo de implementação:: Clique Aqui


CCP: Calculadora para Expressões Completamente "Parentizadas"

Calcular o resultado de expressões aritméticas sem precedência implícita de operadores (Parênteses são utilizados para indicar precedência). A entrada conterá apenas números de 0 a 9 e os operadores usados serão o + (soma), * (multiplicação), - (subtração) e / (divisão). Os códigos criados no trabalho VBP devem ser reutilizados para verificar se a expressão fornecida não contém erros de balanceamento de parênteses.

Exemplo 1 - Entrada:
((2+1)*((3-1)/2))

Saida: 3

Exemplo 2 - Entrada:
((2+3)*(3/(3-1)))

Saida: 7.5

Exemplo 3 - Entrada:
((2+3*(3/(3-1)))

Saida: ERRO NO BALANCEAMENTO DOS PARÊNTESES

Melhor trabalho entregue até o momento : Clique Aqui

Autor:

Markus Reichel

TH: Torre de Hanoi

Implementar um algoritmo que mostra uma solução para o problema da Torre de Hanoi pelo método da "tentativa cega", com o número de peças empilhadas, n, sendo fornecido pelo usuário. Verificar qual o maior valor de n para o qual o programa é capaz de oferecer uma resposta depois de alguns minutos.

Usar três pilhas para representar cada um dos 3 "pinos" do problema da torre de Hanoi.
Usar números inteiros de 1..n para representar as n pedras que iniciam no pino 1.
Enquanto problema não resolvido faça
    Sorteie e retire uma pedra X de um pino qualquer Px, // Verifique também se existe pedra no pino.
    Sorteie outro pino Py
    Se a  pedra que está no topo de Py for menor que a pedra X
          Retorne X para Px
    Senão
          Insira X em Py.
    FimSenão
FimFaça

Autores:

Thiago Galves Moretto (emoretto@ec.ucdb.br)



4) BT: Balde de Tinta

Implementar um algoritmo para dar suporte ao "balde de tinta" que aparece em alguns  programas de desenho.
A entrada para o algoritmo é uma matriz M[n x m] de "pixels", um índice indicando um pixel da matriz e a nova cor da região que contém o pixel indicado. Cada pixel será representado por um char, indicando uma cor de 0 a 255.

Descrição do Algoritmo:

Entrada: M[n,m] // Matriz de pixels
              Pi, Pj    // Índices da Matriz M indicando um pixel da regiao que deve ser "pintada"
              nova_cor
Saída: M[n,m] com a região "pintada"

cor_antes = M[Pi,Pj]
Insere Pi,Pj em uma fila.
Enquanto Fila nao Estiver Vazia Faça
   Pi,Pj = Retira um Elemento da Fila
   M[Pi,Pj]  = nova_cor
   Insere vizinhos de Pi,Pj, cuja cor seja cor_antes, na fila
FimFaça

-----------
// IMPORTANTE: Pintar os vizinhos antes de inserí-los na fila melhora
// consideravelmente o desempenho. Experimente.

Disponibilizei uma implementação desse algoritmo junto ao tutorial
do GTK: procure aqui.
-----------

Exemplo 1 - Entrada:

|  2 2 2 2 2 2 2 2 2 2 |
|  9 9 9 9 9 9 9 9 9 9 |
|  9 9 1 1 1 1 1 1 9 9 |
|  9 9 1 1 1 1 1 1 9 9 |
|  9 9 9 9 1 1 9 9 9 9 |
|  9 9 9 9 1 1 9 9 9 9 |
|  9 9 9 9 1 1 9 9 9 9 |
|  9 9 9 9 1 1 9 9 9 9 |
|  7 9 9 9 1 1 9 9 7 7 |
|  7 7 9 9 9 9 9 7 7 7 |

Nova Cor: 0

Pixel Inicial:  M[4,4]

Saída:

|  2 2 2 2 2 2 2 2 2 2 |
|  9 9 9 9 9 9 9 9 9 9 |
|  9 9 0 0 0 0 0 0 9 9 |
|  9 9 0 0 0 0 0 0 9 9 |
|  9 9 9 9 0 0 9 9 9 9 |
|  9 9 9 9 0 0 9 9 9 9 |
|  9 9 9 9 0 0 9 9 9 9 |
|  9 9 9 9 0 0 9 9 9 9 |
|  7 9 9 9 0 0 9 9 7 7 |
|  7 7 9 9 9 9 9 7 7 7 |

-----------------------------------------
Melhor trabalho entregue até o momento: Clique Aqui

Autores:

Ulysses Pereira de Almeida Neto
Higor Aparecido Vieira Alves
Paulo Ricardo Paz Vital

PACI: Paciência

Projetar e implementar em Java o tradicional jogo paciência. Não devem ser reutilizadas as estruturas de dados, para listas e pilhas, já implementadas em Java (novas implementações terão que ser realizadas). As seguintes regras de funcionamento do jogo deverão ser respeitadas:

Configuração inicial e regras de empilhamento

Movimentos possíveis e objetivo do jogo

Melhor trabalho entregue até o momento:


DOMI: Jogo de dominó

Projetar e implementar um jogo de dominó a ser jogado contra o computador. Cada uma das 28 peças de domíno podem ser representadas através de um par de inteiros, variando de 0 a 6: (0,0), (0,1), ..., (0,6), (1,1), (1,2), ..., (1,6), ..., (6,6). Listas encadeadas devem ser utilizadas para representar as peças do usuário, do computador, "do monte" e "na mesa".

Material de Apoio

Melhor trabalho entregue até o momento:


JP: Josephus Problem

Flavius Josephus foi um personagem famoso do século I. Diz a lenda que ele não teria sobrevivido se não fosse sua extraordinária capacidade matemática. Durante a guerra entre Judeus e Romanos, ele fazia parte de um grupo de 41 rebeldes judeus, cercados em uma caverna, pelo Romanos. Preferindo o suicídio à captura, os rebeldes decidiram formar um círculo e passando por cada soldado do círculo, de um em um, matar sempre o terceiro. Mas Josephus, nao querendo participar desse ato, calculou rapidamente em que posição ele, e seus amigos, deveriam ficar, para que todos os outros fossem escolhidos antes deles. (Do livro Concrete Mathematics de Knuth, Graham e Patashnick).

Seja n o número de pessoas no círculo e m o incremento que deve ser usado para escolher o elemento a ser eliminado. Implemente um algoritmo para calcular em que posição Josephus deveria ficar para não ter que ser eliminado (último escolhido). Por exemplo, se n=8 e m=3 então a ordem das eliminações será 3,6,1,5,2,8,4,7 e portanto, Josephus deveria ficar na sétima posicão do círculo.

Use uma lista circular duplamente encadeada na resolução do problema.

Entrada:
int n : Total de pessoas
int m : Incremento

Saida:
int p : Posição que será escolhida por último

Opcionais: Mostrar, graficamente, a execução do algorítmo.
-----------------------------------------

Melhor trabalho entregue até o momento: Clique Aqui (1) Clique Aqui (2)

Autores:

(1) Álvaro Roberto Silvestre Fialho
(2) Felipe Augusto Zuffo

ATAVL: Agenda Telefônica

Faça um programa para carregar na memória RAM uma "base de dados" contendo nome, endereço e telefone de algumas pessoas, e permitir que o usuário faca consultas a essa "base de dados" por nome e por telefone.  A "base de dados" ficará em um arquivo no formato "texto delimitado", com um registro por linha. O delimitador de campos é o ponto-e-virgula. O arquivo agenda.txt é um exemplo de "base de dados" que poderá ser utilizada para testar o seu programa.

Na memória, a base de dados deverá ser armazenada em um vetor. Cada elemento do vetor será uma estrutura com 3 campos: nome, endereco e telefone. A busca será implementada através de duas AVLs, uma para os nomes e outra para os telefones.

Opções complementares:
- Inserção e Remoção de Registros
- Apresentaçao das Árvores AVL na tela do computador.
- Opção para listar informações ordenadas por nome ou telefone.

Material de Apoio:
- at-p1.cpp :  Programa exemplo que lê o arquivo e guarda num vetor (excelente ponto de partida).
 


ATABB: Agenda Telefônica com Árvore Binária de Busca

Similar ao trabalho 6 mas utilizando Árvore Binária de Busca no lugar de AVL.
 


Material de Apoio