1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[C] Programa para ver se palavra é "simétrica"

Discussão em 'Programação' iniciada por fabio.silva, 28 de Fevereiro de 2009. (Respostas: 13; Visualizações: 2735)

  1. fabio.silva

    fabio.silva Power Member

    Cumps,
    estava aqui a fazer uns exercicios em C, e apareceu-me um em que tinha de escrever uma palavra é "simétrica", ou seja, se pode ser lida tanto de trás para a frente e vice-versa.
    Lá fiz o código...:
    Código:
    #include<stdio.h>
    #include<stdlib.h>
    #include <string.h>
    #include <conio.h>
    #include <math.h>
    main()
    {
    char palavra[30],pal[30];
    int x,tam;
    printf("digite a palavra: ");
    gets(palavra);
    tam=strlen(palavra);
    for(x=tam-1; x >= 0; x--) pal[x];
    if (strcmp(palavra,pal)== true) printf("a palavra e simetrica");
    else printf("\a palavra nao e simetrica");
    system("pause");
    }
    
    Após executar,mesmo que digite,por exemplo, "arara", aparece sempre "não é simétrica".
    Obrigado
     
    Última edição pelo moderador: 28 de Fevereiro de 2009
  2. Baderous

    Baderous Banido

    Tens aí 2 coisas mal. Aquele pal[x] não sei o que está ali a fazer. E depois estás a usar o strcmp para comparar a palavra com o que, supostamente, seria a palavra invertida, ou seja, o pal. E para além disso estás a verificar se o strcmp devolve true. Acho que precisas de ir ver o modo de funcionamento dessa função: http://www.cplusplus.com/reference/clibrary/cstring/strcmp.html
    Para resolver isso, basta teres 2 iteradores, um a começar no início da palavra e outro no fim e ires verificando a igualdade entre caracteres até chegares ao meio da palavra. Nem precisas de 1 array auxiliar.
    Código:
    int tam = strlen(palavra);
    int eq=1, i=0;
    while (i<tam/2 && eq) {
       if (palavra[i]!=palavra[tam-i-1]) eq=0;
       i++;
    }
     
  3. fabio.silva

    fabio.silva Power Member


    A ideia daquele pal[x] era tentar preencher um vector com a palavra invertida,mas não funcionou.:007:
    Muito obrigado pela ajuda:x2:
     
  4. casdio

    casdio Power Member

    Aproveitando o tópico: qual é o comando (em linux) para compilar um ficheiro?
    É qualquer coisa do género
    Código:
    gcc -o make file.c
    mas não sei ao certo :|
     
  5. Baderous

    Baderous Banido

  6. casdio

    casdio Power Member

    Já vi que o erro não é esse. Falta-me um pacote qualquer do OpenGL, mas nao sei qual... Alguem pode ajudar?
    Código:
    [email protected]:/media/DATA/LEI/LI2/Tarefa1$ make linux
    cc    -c -o display.o display.c
    display.c:4:21: error: GL/glut.h: Ficheiro ou directoria inexistente
    display.c: In function ‘main’:
    display.c:28: error: ‘GLUT_DOUBLE’ undeclared (first use in this function)
    display.c:28: error: (Each undeclared identifier is reported only once
    display.c:28: error: for each function it appears in.)
    display.c:28: error: ‘GLUT_RGB’ undeclared (first use in this function)
    display.c: In function ‘init’:
    display.c:55: error: ‘GL_PROJECTION’ undeclared (first use in this function)
    display.c: In function ‘display’:
    display.c:111: error: ‘GL_COLOR_BUFFER_BIT’ undeclared (first use in this function)
    make: *** [display.o] Error 1
    

    edit: ja arranjei :D
     
    Última edição: 2 de Março de 2009
  7. Resposta depois de estudar um pouco xD

    Nussa, loguei nessa parada so pra dar uma resposta mais limpa e explicada sobre a questao.

    #include<stdio.h>
    #include<stdlib.h>
    #include <string.h>
    #include <conio.h>
    int main(void){
    char string[100]; /* String, ate' 99 caracteres */
    int j, i;
    j=0;

    int cont;
    printf("\n\nDigite uma palavra: ");
    gets(string); /* Le a string */
    printf("\n Palavra digitada:\n%s", string);
    cont = 0;
    for (i=0; string != '\0'; i++)
    {

    cont = cont +1; /* o contador de caracteres */
    }
    printf("\nNumero de letras = %d \n", cont);

    for (i=0; i<cont; i++){
    printf ("%c\n", string); // teste se as palavras coincidem
    printf ("%c\n", string[cont-1]); // -1 pq a ultima letra sempre fica "\o"
    if (string==string[cont-1]){
    printf ("\nTeste %i a palavra eh simetrica \n", i);
    cont--;
    }
    else {
    printf (" \nA Palavra nao eh simetrica");
    break; }
    }
    getch ();
    }
     
  8. m00s

    m00s Power Member

    sugestão: cria uma função que inverta a palavra inserida e a devolva a fim de ser comparada com a 1ª.... seria algo, na minha opinião, que transmitiria simplicidade e melhor compreensão do código.
     
  9. joao.miguel

    joao.miguel Power Member

    Crias um array de chars para a palavra normal e outro array para a palavra invertida.
    Depois comparas os dois e se for igual, a palavra é simétrica. Caso contrário...
     
  10. Noeljunior

    Noeljunior I fold therefore I AM

    Código:
    char[10] a; //le como queres com \0 no fim
    int i, j, t = 0;
    
    for (i = 0, j = strlen(a) -1; i < strlen(a); i++, j--) {
        if (a[i] == a[j])
            t = 1;
    }
    if (t == 1) printf("nao e"); else printf("é");
    
     
  11. mauro1855

    mauro1855 I'm cool cuz I Fold

    gcc -g -o [nome_do_programa] file.c

    Para o autor do tópico, li algumas respostas, e acho que a forma mais correcta é comparar a primeira letra, com a ultima, depois a segunda com a pnúltima, etc.
    Imagina que introduzes arara, tens de contar o tamanho da palavra com o strlen. Se correr bem strlen() = 5 (para a palavra arara)
    Divide esse número: 5 / 2... Dá 2.5, mas para efeitos de contagem, faz arredondamento por defeito, logo dá 2 (a divisão é inteira, portanto não há problema por aí)
    Ou seja, queres comparar as 2 primeiras letras da palavra com as duas ultimas letras da palavra...
    Fazes duas variáveis
    i = 2 /* as duas primeiras palavras*/
    t = strlen(palavra) - 2;

    fazes um ciclo que incremente uma variável x e decremente uma variável y, de forma que o ciclo execute sempre quando x<= i e y>=t... Dentro desse ciclo, poens um if para verificar se string[x] e string[y] são iguais... Se não forem iguais, usas uma variável de controlo.

    No final do ciclo, o programa verifica a dita variável de controlo. Se esta não tiver sido mexida no ciclo, então a palavra é simétrica.

    Isto explicar assim sei que é complicado, mas eu a fazer o código agora ainda me enganava, ainda vou fazer umas experiências...

    Cumps
     
    Última edição: 11 de Março de 2010
  12. também me parece que esta será a melhor opcção, claro que existem sempre varias maneiras para fazer as coisas, podes por exemplo nao usar a variavel de controlo que o mauro1855 disse. ao comparares as letras, se não for igual mandas um printf() a dizer que a palavra n é capicua, e sais fora do ciclo. evita teres de percorrer a palavra toda se as primeiras nao forem...

    acho que o mais importante, independentemente do algoritmo é que percebas muito bem o que estas a fazer e o porquê.
     
  13. Noeljunior

    Noeljunior I fold therefore I AM

    Reparei agora que era uma capicua/palavra invertida. Não sei porque mas tinha outra ideia, sendo assim corrijo o que disse:
     
  14. mauro1855

    mauro1855 I'm cool cuz I Fold

    Só uma ligeira alteração ao teu código, de forma a fazer o algoritmo mais eficaz (agora que ando a aprender Algoritmos e estruturas de dados, faz todo o sentido para mim diminuir ao máximo o tempo necessário para executar a acção):

    Código:
    char[...] a; //le como queres com \0 no fim
    int i, j, t = 0;
    
    for (i = 0, j = strlen(a) -1; (i < j) && t==0 ; i++, j--) {
       if (a[i] != a[j])
    t = 1;
    }
    if (t == 1) printf("nao e"); else printf("é");
    
    A alteração ali é o t==0 no ciclo... Assim que existem duas letras diferentes, t=1, e não vale a pena continuar com o ciclo.

    Cumps
     

Partilhar esta Página