INF 1007 Programação II Semestre 09.2 Trabalho 1: Logodesafio O Logodesafio é um passatempo que exercita o conhecimento léxico dos participantes, consistindo em formar palavras a partir de um conjunto de letras embaralhadas que são exibidas em um quadro grande, e uma seqüência de letras exibida em um quadro menor. O objetivo do jogo é obter o maior número de pontos, da seguinte forma: a palavra principal, ou seja, a palavra que é escrita utilizando todas as letras contidas no quadro grande, vale 15 pontos; palavras comuns, ou seja, aquelas formadas apenas com as letras contidas no quadro grande, com 3 ou mais letras, valem 5 pontos; palavras sequências, ou seja, palavras de 4 ou mais letras que contêm a seqüência de letras do quadro menor e letras do quadro grande, valem 10 pontos. As letras disponíveis só podem aparecer uma vez em cada palavra e os acentos são ignorados. Além disso, não valem verbos, plurais, nomes próprios e abreviaturas. T L A N U LHA P I S A A Por exemplo, para o quadro acima, a palavra principal é PAULISTANA, e com as letras do quadro principal foram encontradas 30 palavras de 5 letras, 12 de 6 letras, 3 de 7 letras, 3 de 8 letras, 1 de 9 letras. Por exemplo, LÁPIS, TULIPA, PLATINA, ANALISTA e PAULATINA. Além disso, foram encontradas 8 palavras contendo a seqüência LHA. Por exemplo, PALHA e SAPATILHA. O objetivo deste trabalho é implementar, em linguagem C, um conjunto de funções que auxiliarão na criação do programa de um jogo de Logodesafio, ou seja, um jogo em que o participante tentará formar palavras a partir de dois grupos de letras que são fornecidos. O programa do Logodesafio e o usuário (jogador) interagem da forma descrita a seguir: O programa carrega um jogo específico e exibe as letras e instruções. Forme palavras com 3 letras ou mais com os caracteres: T L A N U P I S A A Ou com 4 letras ou mais e contendo tambem a sequencia: LHA
Em seguida o programa apresenta uma dica da quantidade de palavras que é possível formar com diferentes números de letras. Uma dica, voce pode formar: 12 palavras de 3 letras 19 palavras de 4 letras 34 palavras de 5 letras 12 palavras de 6 letras 3 palavras de 7 letras 5 palavras de 8 letras 2 palavras de 9 letras 1 palavra de 10 letras Num total de 88 palavras. O programa aguarda o usuário continuar o jogo digitando as palavras, ou terminar, digitando um único caractere e ENTER: Digite uma palavra com 3 ou mais letras, ou um unico caractere e ENTER para terminar... Se a palavra fornecida pelo usuário tiver menos de 3 caracteres, o programa exibe uma mensagem de erro e pede nova palavra. A palavra deve ter mais de 3 letras, tente outra vez... Se a palavra fornecida pelo usuário não cumpre as regras de formação para palavra principal, comum ou sequência, o programa exibe uma mensagem de erro e pede nova palavra. Essa palavra nao e valida, tente outra... Se a palavra fornecida pelo usuário for repetida, o programa exibe uma mensagem de erro e pede nova palavra. Essa palavra e repetida, tente outra... Se a palavra fornecida pelo usuário não consta da lista de palavras possíveis, o programa exibe uma mensagem de erro e pede nova palavra. Essa palavra nao existe, tente outra... Finalmente, se a palavra fornecida pelo usuário é bem formada, não repetida e consta da lista, o programa exibe a pontuação do jogador. Parabéns, vc ganhou mais 10 pontos, totalizando 55 pontos... A qualquer momento o usuário pode deixar o jogo digitando uma palavra com um único caractere. Após a pontuação final o programa mostrará a solução. Vc encontrou 11 palavras e acumulou 70 pontos... Observe que as palavras do jogo são armazenadas somente com letras maiúsculas, mas o jogador pode digitar as palavras com letras maiúsculas ou minúsculas de forma
indiferente, pois todos os caracteres são convertidos para maiúsculas. O Anexo 1 apresenta a listagem do programa logodesafio.c, que implementa o programa descrito anteriormente, exibindo estas e outras mensagens para situações específicas. Este programa utiliza a biblioteca desafio.h, que deve ser implementada pelos alunos, e a biblioteca jogo.h, que é fornecida aos alunos. O Anexo 2 apresenta o arquivo desafio.h, e o Anexo 3 apresenta o arquivo jogo.h. OBSERVAÇÕES: 1 A especificação completa e detalhada dos tipos de dados e funções que devem ser implementados estão no arquivo desafio.h --- cujo conteúdo não pode ser alterado ---, que está disponível como anexo a esse enunciado e também no site da disciplina. 2 A função main, fornecida no arquivo logodesafio.c, tem a finalidade de demonstrar a utilização das funções implementadas. Além disso, pode servir também como modelo para a implementação de testes mais completos. 3 O arquivo desafio.c deve ser enviado contendo apenas as funções implementadas. Ou seja, o seu arquivo submetido NÃO deve possuir a função main. A correção do trabalho será realizada pelo corretor automático, que terá um programa que chamará as funções conforme declaradas na interface desafio.h. 4 Programas que apresentarem erro na compilação receberão nota zero. O programa não pode ser escrito usando a sintaxe própria de C++ ou funções que não são do padrão ANSI C. Programas que compilarem serão executados e avaliados através de seqüência de testes. 5 Certamente cada aluno pode discutir com seus colegas (e com seus professores) a forma de implementação que empregará. Ressaltamos, entretanto, que os trabalhos são individuais. Trabalhos similares poderão ter suas notas reduzidas, podendo receber nota zero se o grau de similaridade for muito acentuado. 6 Data de entrega: 30 de setembro.
ANEXO 1 /* logodesafio.c */ #include <stdio.h> #include <stdlib.h> #include "jogos.h" #include "desafio.h" int main(void) char *quadro, *seq, *palavra; char **solucao, **respostas=null; int n, continua, k=0, valor, total = 0; n = Carrega_jogo(&quadro, &seq, &solucao); printf("forme palavras com 3 letras ou mais com os caracteres:\n\n"); Mostra_quadro(quadro); printf("ou com 4 letras ou mais e contendo tambem a sequencia:\n\n"); Mostra_sequencia(seq); printf("uma dica, voce pode formar:\n\n"); Mostra_dica(solucao, n); while(1) printf("\ndigite uma palavra com 3 ou mais letras, ou um único caractere e ENTER para terminar...\n"); palavra = Le_palavra(); if((palavra==null) (palavra[1]=='\0')) break; if(strlen(palavra)<3) printf("\na palavra deve ter mais de 3 letras, tente outra vez...\n"); free(palavra); else valor = 0; if(palavra_principal(quadro, palavra)) valor = 15; else if(palavra_comum(quadro, palavra)) valor = 5; else if(palavra_sequencia(quadro, seq, palavra)) valor = 10; if(valor==0)
printf("\nessa palavra nao e valida, tente outra...\n"); free(palavra); else if(verifica(palavra, respostas, k)) printf("\nessa palavra e repetida, tente outra...\n"); free(palavra); else if(verifica(palavra, solucao, n)) respostas = Registra(palavra, respostas, k); printf("\nparabéns, vc ganhou mais %d pontos, totalizando %d pontos...\n", valor, total); total = total + valor; k++; if(k==n) break; else printf("\nessa palavra nao existe, tente outra...\n"); free(palavra); printf("\nvc encontrou %d palavras e acumulou %d pontos...\n\n", k, total); printf("as palavras que que poderiam ser formadas sao:\n\n"); Mostra_tudo(solucao, n);
ANEXO 2 /* desafio.h */ /* Função Palavra_principal Verifica se uma palavra pode ser a */ /* palavra principal, ou seja, contem todas as letras do */ /* quadro grande, sem repeticao. */ /* quadro - ponteiro para a cadeia de caracteres quadro */ /* palavra - ponteiro para a cadeia de caracteres contendo a */ /* palavra a ser verificada. */ /* Saída: inteiro com valor 1 se a palavra eh a principal, ou 0, */ /* caso contrario. */ int Palavra_principal(char* quadro, char* palavra); /* Função Palavra_comum Verifica se uma palavra contem */ /* apenas caracteres nao repetidos do quadro grande e tamanho */ /* maior ou igual a tres. */ /* quadro - ponteiro para a cadeia de caracteres quadro */ /* palavra - ponteiro para a cadeia de caracteres contendo a */ /* palavra a ser verificada. */ /* Saída: inteiro com valor 1 se a palavra eh valida, ou 0, */ /* caso contrario. */ int Palavra_comum(char* quadro, char* palavra); /* Função Palavra_sequencia Verifica se uma palavra contem */ /* a sequencia fornecida como parametro e caracteres nao */ /* repetidos do quadro grande e tamanho maior ou igual a quatro. */ /* quadro - ponteiro para a cadeia de caracteres quadro */ /* sequencia - ponteiro para a cadeia de caracteres contendo uma */ /* sequencia. */ /* palavra - ponteiro para a cadeia de caracteres contendo a */ /* palavra a ser verificada. */
/* Saída: inteiro com valor 1 se a palavra eh valida, ou 0, */ /* caso contrario. */ int Palavra_sequencia(char* quadro, char* sequencia, char* palavra); /* Função Le_palavra Le uma palavra do teclado com tamanho */ /* maximo 20 e armazena em uma cadeia de caracteres alocada */ /* dinamicamente, apos converter todos os caracteres para */ /* maiusculas. */ /* Saída: Ponteiro para nova string alocada dinamicamente ou */ /* NULL, se nao for possivel alocar a nova cadeia. */ char* Le_palavra(void); /* Função Verifica Verifica se uma palavra esta em um vetor de */ /* palavras registradas. */ /* palavra - ponteiro para a cadeia de caracteres contendo a */ /* palavra a ser verificada. */ /* lista - ponteiro para o vetor de palavras registradas. */ /* n tamanho da lista. */ /* Saída: inteiro com valor 1 se a palavra esta no vetor, ou 0, */ /* caso contrario. */ int Verifica(char* palavra, char** lista, int n); /* Função Registra Copia um vetor de palavras registradas de */ /* tamanho n recebido como parametro para um novo vetor alocado */ /* dinamicamente com tamanho n+1. Na ultima posicao do novo vetor */ /* deve ser colocado o ponteiro para a cadeia de caracteres */ /* contendo a palavra a ser registrada, recebido como parametro. */ /* Se nao for vazio, o vetor original deve ser liberado. */ /* palavra - ponteiro para a cadeia de caracteres contendo a */ /* palavra a ser registrada. */ /* lista - ponteiro para o vetor de palavras registradas. */
/* n tamanho da lista. */ /* Saída: ponteiro para o novo vetor, ou NULL, caso nao consiga */ /* alocar memoria */ char** Registra(char* palavra, char** lista, int n);
ANEXO 3 /* jogo.h */ /* Carrega_jogo Carrega as informacoes necessarias para um */ /* jogo. */ /* letras - ponteiro para receber o endereco da cadeia de */ /* caracteres contendo as letras do quadro principal. */ /* seq - ponteiro para receber o endereco da cadeia de caracteres */ /* contendo a sequencia do quadro menor. */ /* sol - ponteiro para receber o endereco do vetor de ponteiros */ /* para cadeias de caracteres, que contem a solucao */ /* do jogo. */ /* Saída: inteiro com numero de elementos do vetor solucao. */ int Carrega_jogo(char** letras, char** seq, char*** sol); /* Mostra_tudo Mostra na tela todas as palavras que se pode */ /* formar em um jogo. */ /* sol - ponteiro para o vetor de palavras validas no jogo. */ /* n tamanho do vetor. */ void Mostra_tudo(char** sol, int n); /* Mostra_tam Mostra na tela as palavras que se pode formar */ /* em um jogo com o tamanho definido como parametro. */ /* sol - ponteiro para o vetor de palavras validas no jogo. */ /* n tamanho do vetor. */ /* tam numero de caracteres. */ void Mostra_tam(char** sol, int n, int tam);
/* Mostra_dica Mostra na tela uma dica sobre a quantidade de */ /* palavras que e possivel formar em um jogo. */ /* sol - ponteiro para o vetor de palavras validas no jogo. */ /* n tamanho do vetor. */ void Mostra_dica(char** sol, int n); /* Mostra_quadro Mostra na tela os caracteres validos para */ /* formar uma palavra do jogo. */ /* quadro - ponteiro para a cadeia de caracteres contendo a */ /* as letras validas. */ void Mostra_quadro(char* quadro); /* Mostra_sequencia Mostra na tela a sequencia de caracteres */ /* valida de um jogo. */ /* seq - ponteiro para a cadeia de caracteres contendo a */ /* sequencia. */ void Mostra_sequencia(char* seq);