Jump to content

[Resolvido] Palindromos


polska
 Share

Recommended Posts

Boas pessoal, estou a treinar para o concurso nacional de programação e surgiu-me um pequeno erro num programa... Este programa pede um numero (ex:3), e depois pede o numero de palavras, ou seja, vai pedir 3 palavras, e vai verificar se são palindromos..

Palíndromo é a frase ou palavra que mantém o mesmo sentido quando lida de trás para a frente , ex: ana

Bem, eu desenvolvi o seguinte:

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

int main(){
int n;
char p[50];
bool verifica=false;
scanf("%d",&n);
for(int i=1;i<=n;i++){
	scanf("%s",p);
	for(int l=0;l<strlen(p);l++){
		for(int j=(strlen(p)-1);j>0;j--){
			if(p[l]!=p[j]){
				verifica=true;
			}
		}
	}
	if(verifica){
		printf("Nao\n");
	}else{
		printf("Sim\n");
	}
}
return 0;
}

O programa corre direitinho, mas surge com um erro, quer a palavra seja palindromo ou não, ele diz-me sempre que não é palindormo..

Exemplo :        Input: ana  Output: Nao

                        Input: pedro Output: Nao

...

Alguém me pode ajudar??

Abraço 👍

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

Não funciona porque tens 2 ciclos para verificar a palavra.

tens que ter 2 variaveis para percorrer a array, uma no inicio para o fim, outra do fim para o inicio, enquanto as 2 variveis forem diferentes ias comparar as letras, e alguma for diferente o ciclo termina, porque já se sabe que não é um Palíndromo.

para te ajudar, mete uns printf's para ver os valores da varivel:

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

int main(){
   int n;
   char p[50];
   bool verifica=false;
   scanf("%d",&n);
   for(int i=1;i<=n;i++){
      scanf("%s",p);
      for(int l=0;l<strlen(p);l++){
         for(int j=(strlen(p)-1);j>0;j--){
            if(p[l]!=p[j]){
               verifica=true;
               printf("%d - %c != %c\n",l,p[l],p[j]);
            }
            else
                printf("%d - %c == %c\n",l,p[l],p[j]);
         }
      }
      if(verifica){
         printf("Nao\n");
      }else{
         printf("Sim\n");
      }
   }
   return 0;
}

já agora porque que estás a programar à C em C++?

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

tens que ter 2 variaveis para percorrer a array, uma no inicio para o fim, outra do fim para o inicio, enquanto as 2 variveis forem diferentes ias comparar as letras, e alguma for diferente o ciclo termina, porque já se sabe que não é um Palíndromo.

Diferentes não, quando a variável que aponta para o final fôr igual ou menor que a que aponta para o início senão o algoritmo não pára se a palavra tiver um número par de caracteres.

Link to comment
Share on other sites

Bem, não sei o que queres dizer com progamar á C em C++ .. Mas penso que estejas a dizer isso por eu estar a usar int main e não void main, e também return 0; , estou correto? xD

é simples, para este concurso, os nosso programas são verificados em Linux, e para serem aceites como c++, temos de colocar sempre int main(), return 0; no final, e também, \n no final de cada output..

são apenas regras 👍

;D, obrigado pela ajuda

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

Diferentes não, quando a variável que aponta para o final fôr igual ou menor que a que aponta para o início senão o algoritmo não pára se a palavra tiver um número par de caracteres.

Obrigado ;D

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

Eu fiz da seguinte forma

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

#define false 0
#define true 1
typedef int bool;

int main(){
   int n;
   char p[50];
   bool palindromo=true;
   scanf("%d",&n);
   for(int i=1;i<=n;i++){
      scanf("%s",p);
      int comprimento= strlen(p);
      for(int l=0;l<comprimento;l++)
      {
          if(p[l]!= p[comprimento-1 -l])
          {
              palindromo=false;
              break;
          }

      }
      if(palindromo){
         printf("Sim\n");
      }else{
          printf("Nao\n");

      }
   }
   return 0;
}

Fernando Lage Bastos - MCP/MCTS/MCPD

Link to comment
Share on other sites

Diferentes não, quando a variável que aponta para o final fôr igual ou menor que a que aponta para o início senão o algoritmo não pára se a palavra tiver um número par de caracteres.

pois é, erro meu 👍

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

já agora eu faria assim:

#include<iostream>
#include<cstring>

using namespace std;

bool palindromo(char *str)
{
    int b=strlen(str);
    for(int i=0,b;i>=b;i++,b--)
        if(str[i]!=str[b])
            return false;
    return true;
}

int main()
{
    char str[200];
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>str;
        if(palindromo(str))
            cout<<"e Palindromo"<<endl;
        else
            cout<<"nao e Palindromo"<<endl;
    }
}

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Bem, não sei o que queres dizer com progamar á C em C++ .. Mas penso que estejas a dizer isso por eu estar a usar int main e não void main, e também return 0; , estou correto? xD

Nope. Usas arrays de char em vez de strings da STL, usas scanf e printf em vez de cin e cout, incluis <string.h> e <stdio.h> quando num programa de C++ farias <cstring> e <cstdio>, e no seguimento do que foi dito anteriormente as bibliotecas a incluir seriam <string> e <iostream>.

Não respondo a dúvidas por mensagem.

Link to comment
Share on other sites

Nope. Usas arrays de char em vez de strings da STL, usas scanf e printf em vez de cin e cout, incluis <string.h> e <stdio.h> quando num programa de C++ farias <cstring> e <cstdio>, e no seguimento do que foi dito anteriormente as bibliotecas a incluir seriam <string> e <iostream>.

Bem, o que me estas a dizer é bastante confuso, porque eu estou no 10º ano, primeiro ano que aprendo programação.. e foi assim que aprendi tudo xD, bibliotecas, funções.. foi tudo assim..

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

já agora eu faria assim:

#include<iostream>
#include<cstring>

using namespace std;

bool palindromo(char *str)
{
    int b=strlen(str);
    for(int i=0,b;i>=b;i++,b--)
        if(str[i]!=str[b])
            return false;
    return true;
}

int main()
{
    char str[200];
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>str;
        if(palindromo(str))
            cout<<"e Palindromo"<<endl;
        else
            cout<<"nao e Palindromo"<<endl;
    }
}

eu assim não percebo mesmo nada, não sei o que faz o cin, o cout.. é bastante confuso. Mostra-me como fazias da minha maneira sff, podes usar o meu cod. na boa ;D

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

Bem, o que me estas a dizer é bastante confuso, porque eu estou no 10º ano, primeiro ano que aprendo programação.. e foi assim que aprendi tudo xD, bibliotecas, funções.. foi tudo assim..

Thinking in C++

Isso é C++ válido porque a ideia é suportar (a maior parte) dos programas já escritos em C pelos compiladores de C++, mas o que tens aí é C, não é C++.

Não respondo a dúvidas por mensagem.

Link to comment
Share on other sites

Thinking in C++

Isso é C++ válido porque a ideia é suportar (a maior parte) dos programas já escritos em C pelos compiladores de C++, mas o que tens aí é C, não é C++.

ahaha, muito bem então.. Mas a minha prof. disse que ainda.. ainda iamos passar para C, e disse-nos que isto é que era C++ , eu estava mesmo convencido que sim XD, nós até programamos em visual studio c++...

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

ahaha, muito bem então.. Mas a minha prof. disse que ainda.. ainda iamos passar para C, e disse-nos que isto é que era C++ , eu estava mesmo convencido que sim XD, nós até programamos em visual studio c++...

Isso é C++ válido porque a ideia é suportar (a maior parte) dos programas já escritos em C pelos compiladores de C++, mas o que tens aí é C, não é C++.

------------------------------------------------------------------------------------------------------------------------

meter a extenção cpp, e compilar com o VC++ ou G++, não faz que o teu código fonte seja necessariamente C++.

Mostra-me como fazias da minha maneira sff, podes usar o meu cod. na boa ;D

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


int palindromo(char *str)
{
    int b=strlen(str);
    int i;
    for(i=0,b;i>=b;i++,b--)
        if(str[i]!=str[b])
            return 0;
    return 1;
}

int main()
{
    char str[200];
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%s",str);
        if(palindromo(str))
            printf("e Palindromo\n");
        else
            printf("nao e Palindromo\n");
    }
    return 0;
}

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

------------------------------------------------------------------------------------------------------------------------

meter a extenção cpp, e compilar com o VC++ ou G++, não faz que o teu código fonte seja necessariamente C++.

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


int palindromo(char *str)
{
    int b=strlen(str);
    int i;
    for(i=0,b;i>=b;i++,b--)
        if(str[i]!=str[b])
            return 0;
    return 1;
}

int main()
{
    char str[200];
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%s",str);
        if(palindromo(str))
            printf("e Palindromo\n");
        else
            printf("nao e Palindromo\n");
    }
    return 0;
}

Muito menos confuso, só não percebo o FOR que meteste na função, porque juntaste o i com o b, é como se tivesse dois ciclos for não é?

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

Muito menos confuso, só não percebo o FOR que meteste na função, porque juntaste o i com o b, é como se tivesse dois ciclos for não é?

for(i=0,b;i>=b;i++,b--)
        if(str[i]!=str[b])
            return 0;

Não, o for é constituido por 3 partes, "inicialização/declaração" de variaveis, "condição" e incrementos/decrementos(ou outro calculo), para usares variaveis na 3 parte do for, é nessário que as declares no inicio do for.

Foi só para encurtar um pouco o código.

tenta meter os teus códigos simples, neste exercício têm mais lógica usar uma função para verificar se a string é palindromo ou não.

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

for(i=0,b;i>=b;i++,b--)
        if(str[i]!=str[b])
            return 0;

Não, o for é constituido por 3 partes, "inicialização/declaração" de variaveis, "condição" e incrementos/decrementos(ou outro calculo), para usares variaveis na 3 parte do for, é nessário que as declares no inicio do for.

Foi só para encurtar um pouco o código.

tenta meter os teus códigos simples, neste exercício têm mais lógica usar uma função para verificar se a string é palindromo ou não.

Obrigado ;D

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

int b=strlen(str);
int i;
for(i=0,b;i>=b;i++,b--)
        if(str[i]!=str[b])
            return 0;

Devia ser:

int b=strlen(str)-1;
int i;
for(i=0;i<=b;i++,b--)
        if(str[i]!=str[b])
            return 0;

Não respondo a dúvidas por mensagem.

Link to comment
Share on other sites

Devia ser:

int b=strlen(str)-1;
int i;
for(i=0;i<=b;i++,b--)
        if(str[i]!=str[b])
            return 0;

Exato, agora está a funcionar direito ;D

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

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.