Jump to content

Duvida - Topas Treinos 2009 Anagramas


Geye
 Share

Recommended Posts

Boas pessoal,

Tenho estado a resolver exercícios do topas e curiosamente já os fiz todos menos este 😛 .

O problema é do dos Anagramas

Enunciado:

Problem B: Anagramas
Image east
Duas palavras ou frases são anagramas se se escrevem com as mesmas letras usadas o mesmo número de vezes mas eventualmente em posições diferentes. Por exemplo: ``optas'' e ``ToPAS'' são anagramas bem como ``Clint Eastwood'' and ``Old West Action'' (ignorando os espaços e a distinção entre maísculas e minúsculas).
Tarefa
Escreva um programa que verifique se dois textos são anagramas. Cada um não terá mais do que 200 caracteres. Deve considerar equivalentes as letras maiúsculas e minúsculas e ignorar todos os caracteres não-letras (espaços, sinais de pontuação, etc.); pode assumir que as letras não têm acentos. A entrada consiste em duas linhas de texto, uma por frase. A saída deverá ser yes se as duas frases são anagramas e no caso contrário.
Exemplo 1

Input

Clint Eastwood
Old West Action
Output

yes
Exemplo 2

Input

ToPAS-SUL
ToPAS
Output

no

Meu Código:

#include <stdio.h>
#include <string.h>

void remover_espacos(char* source)
{
char* i = source;
char* j = source;
while(*j != 0)
{
*i = *j++;
if(*i != ' ')
 i++;
}
*i = 0;
}
void string_sort(char s[])
{
char tmp;
int i, j, length;
length=strlen(s);
for(i=0; i<length-1; i++)
{
for (j=i+1; j<length; j++)
{
if (s[i] > s[j])
{
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
}
}
}
char * converter(char * s)
{
 char *t = s;

 if (!s)
 {
		 return 0;
 }

 int i = 0;
 while ( *t != '\0' )
 {
		 if (*t >= 'A' && *t <= 'Z' )
		 {
				 *t = *t + ('a' - 'A');
		 }
		 t++;
 }

 return s;
}

main()
{
 char string[201],string1[201];
 fgets (string, 201, stdin);
 fgets (string1, 201, stdin);
 strtok(string, "\n");
 strtok(string1, "\n");
 converter(string1);
 converter(string);
 remover_espacos(string1);
 remover_espacos(string);
 string_sort(string1);
 string_sort(string);
 if(strcmp(string1,string)==0)
 printf("yes\n");
 else
 printf("no\n");
 return 0;
}

Bem o meu código acho que está a funcionar correctamente. Reconheço que está programado meio à noob mas nao deve ser disso. Se conseguirem dar-me uma ajudinha.. 😁

Ah! queria saber também quais são as opções para do strlwr/strupr para darem accept no mooshak...é necessário fazer uma função à parte para o fazer (como fiz acima) ou existem alternativas fáceis?

Edited by Warrior
Link to comment
Share on other sites

o meu código acho que está a funcionar correctamente ... Se conseguirem dar-me uma ajudinha

afinal o código está bem ou esta mal ?

se está mal, aonde está mal ?

porquê que dá mal ?

ps : existem soluções mais fáceis. acabei de fazer o exercício em 50 linhas e com código bem legível ...

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

não faço ideia ... nunca usei isso

este é o meu código :

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 256

int compare(const void * a, const void * b) {
 return *(char *)a - *(char *)b;
}

char * prepare(char * str) {
 char * iter = str;

 while (*iter != '\0') {
   *iter = tolower(*iter);
   iter++;
 }

 qsort(str, strlen(str), sizeof(char), compare);

 while (*str == ' ' || *str == '\n')
   str++;

 return str;
}

int main(void) {
 char str1[MAX], str2[MAX], * str1i = NULL, * str2i = NULL;

 fgets(str1, MAX, stdin);
 str1i = prepare(str1);

 fgets(str2, MAX, stdin);
 str2i = prepare(str2);

 for (; *str1i != '\0' && *str1i == *str2i; str1i++, str2i++) /* void */;

 if (*str1i == *str2i) printf("yes\n");
 else                  printf("no\n");
 return 0;
}
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Sem correr o vosso código, parece-me que não estão a ignorar os sinais de pontuação como dito no enunciado. Testem "A!" e "A." e vejam se são dados como anagramas ou não.

Geye: da próxima vez coloca o código dentro das tags correctas para ser mais fácil a leitura. Podes fazer "editar" à tua primeira mensagem para veres como colocar o código a ser apresentado como C.

Link to comment
Share on other sites

parece-me que não estão a ignorar os sinais de pontuação como dito no enunciado

pois .. isso estava escondido lá para o fundo do horizontal scroll ...

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 256

int compare(const void * a, const void * b) {
 return *(char *)a - *(char *)b;
}

char * prepare(char * str) {
 char * iter = str;

 while (*iter != '\0') {
   *iter = tolower(*iter);
   iter++;
 }

 qsort(str, strlen(str), sizeof(char), compare);

 while (*str < 'a')
   str++;

 return str;
}

int main(void) {
 char str1[MAX], str2[MAX], * str1i = NULL, * str2i = NULL;

 fgets(str1, MAX, stdin);
 str1i = prepare(str1);

 fgets(str2, MAX, stdin);
 str2i = prepare(str2);

 for (;
      *str1i != '\0' && *str1i <= 'z' && *str1i == *str2i;
      str1i++, str2i++)
   /* void */;

 if (*str1i == *str2i) printf("yes\n");
 else                  printf("no\n");
 return 0;
}

edit : símbolos após 'z' ignorados

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Sem correr o vosso código, parece-me que não estão a ignorar os sinais de pontuação como dito no enunciado. Testem "A!" e "A." e vejam se são dados como anagramas ou não.

Geye: da próxima vez coloca o código dentro das tags correctas para ser mais fácil a leitura. Podes fazer "editar" à tua primeira mensagem para veres como colocar o código a ser apresentado como C.

Obrigado pela dica. Já deu accepted 👍

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.