polska Posted March 29, 2012 at 03:59 PM Report #446373 Posted March 29, 2012 at 03:59 PM 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.
pikax Posted March 29, 2012 at 04:13 PM Report #446378 Posted March 29, 2012 at 04:13 PM 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."
bsccara Posted March 29, 2012 at 04:25 PM Report #446384 Posted March 29, 2012 at 04:25 PM 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.
polska Posted March 29, 2012 at 04:25 PM Author Report #446386 Posted March 29, 2012 at 04:25 PM 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.
polska Posted March 29, 2012 at 04:26 PM Author Report #446387 Posted March 29, 2012 at 04:26 PM 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.
petvetbr Posted March 29, 2012 at 04:27 PM Report #446389 Posted March 29, 2012 at 04:27 PM 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
pikax Posted March 29, 2012 at 04:31 PM Report #446391 Posted March 29, 2012 at 04:31 PM 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."
Solution pikax Posted March 29, 2012 at 04:34 PM Solution Report #446392 Posted March 29, 2012 at 04:34 PM 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."
pedrosorio Posted March 29, 2012 at 04:38 PM Report #446396 Posted March 29, 2012 at 04:38 PM 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.
polska Posted March 29, 2012 at 04:40 PM Author Report #446398 Posted March 29, 2012 at 04:40 PM 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.
polska Posted March 29, 2012 at 04:41 PM Author Report #446402 Posted March 29, 2012 at 04:41 PM 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.
pedrosorio Posted March 29, 2012 at 04:42 PM Report #446403 Posted March 29, 2012 at 04:42 PM 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.
polska Posted March 29, 2012 at 04:47 PM Author Report #446404 Posted March 29, 2012 at 04:47 PM 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.
pikax Posted March 29, 2012 at 04:54 PM Report #446408 Posted March 29, 2012 at 04:54 PM 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."
polska Posted March 29, 2012 at 05:11 PM Author Report #446412 Posted March 29, 2012 at 05:11 PM 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.
pikax Posted March 29, 2012 at 05:18 PM Report #446415 Posted March 29, 2012 at 05:18 PM 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."
polska Posted March 29, 2012 at 05:24 PM Author Report #446419 Posted March 29, 2012 at 05:24 PM 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.
pedrosorio Posted March 29, 2012 at 05:31 PM Report #446425 Posted March 29, 2012 at 05:31 PM 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.
polska Posted March 29, 2012 at 05:38 PM Author Report #446427 Posted March 29, 2012 at 05:38 PM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now