Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: sabar en 25 Noviembre 2014, 17:17 pm



Título: URGENTE ayuda arreglo c++
Publicado por: sabar en 25 Noviembre 2014, 17:17 pm
Código
  1. #include<iostream>
  2. #include <string.h>
  3. #include<stdio.h>
  4.  
  5. using namespace std;
  6.  
  7. int main(){
  8.           char frase[30];
  9.           int tam,i;
  10.           bool band= true;
  11.           char resp[20];
  12.           cout<<"ingresa la frase: ";
  13.           gets(frase);
  14.           tam=strlen(frase)-1;
  15.           while(i<tam&&band){
  16.           if(frase[i]==frase[tam]){
  17.            i++;
  18.            tam--;
  19.           }else{
  20.           band= false;
  21.           }
  22.           }
  23.           if(i>tam){
  24.    strcpy(resp,"si es palindromo");
  25.    }else{
  26.    strcpy(resp,"no es palindromo");
  27.    }
  28.    cout<<resp;
  29. }
  30.  


ya lo modifique pero como hago para que me salga bien si es o no palindromo


Título: Re: ayuda arreglo c++
Publicado por: _Enko en 25 Noviembre 2014, 17:49 pm
No deberias invertir la cadena y luego comparar si la cadena invertida es igual que la original?

Si son iguales entonces si es palindromo.


Título: Re: ayuda arreglo c++
Publicado por: ivancea96 en 25 Noviembre 2014, 18:02 pm
Lo primero sería ver si es palíndroma, precisamente con el algoritmo que tienes, que es correcto.
Pero en vez de hacer el cout: en caso de que no se cumpla la igualdad en algún momento, poner una variable booleana (declarada antes que el bucle, e igualada a true), a false.

De ese modo, en el momento en que encuentre una letra que no corresponda, ya sabrá que la frase no es palíndroma.

Eso sí, el cout lo pondrías al final, según sea el valor de la variable booleana.


Título: Re: ayuda arreglo c++
Publicado por: Orubatosu en 25 Noviembre 2014, 21:59 pm
Bueno, hay formas de invertir una cadena entera, pero asumo que esto es un ejercicio, no otra cosa.

Tu bucle está mal enfocado, en lugar de intentar averiguar si una palabra es un palindromo, deberías intentar demostrar que no lo es.

Me explico... la situación es sencilla. Tienes el string de caracteres, tienes la longitud de la palabra, y puedes comparar los caracteres... estupendo.

Pues entonces, haz que el bucle avise de que no existe una coincidencia. Es decir: si no es palindromo.

Compara los caracteres por parejas, y abandona el bucle en el mismo momento en que no haya una coincidencia.

Declara una variable bool que sea "true" indicando que es palíndromo, y que solo pase a false si dentro del bucle no se cumple alguna de las comparaciones, luego una vez que has salido del bucle puedes mostrar el resultado.

La diferencia puede parecer trivial, pero implica una forma de abordar el problema que debes de tener en cuenta, y es que debes de intentar siempre que el programa haga el mínimo esfuerzo posible.

Claro, podemos comprobar todas las letras, y si son iguales decir que es palindromo, pero lo contrario tiene la ventaja de que si en la primera pasada no hay coincidencia, podemos salir inmediatamente del bucle sin necesidad de comprobar el resto.

Esto en una palabra de 5, 10 o 12 caracteres es irrelevante, pero si abordamos un caso similar, donde haya cientos, o miles de casos la cuestión ya no es tan simple, porque el programa debe de intentar siempre "atajar" los problemas lo mas rápido posible y con el menor uso posible de recursos. Bueno, no siempre se consigue, pero al menos intentarlo.

Es un poco como la "política" a la hora de comprobar una condición que contiene comparadores lógicos como && or !! de poner primero el mas simple, ya que el programa entonces si el primer caso no se cumple, no comprueba nada mas ahorrando tiempo y recursos.

A todo esto, si no me equivoco mucho (y si lo estoy que me corrijan) no es necesario declarar el #include<string.h> porque la biblioteca string forma parte de iostream.

Igualmente, puedes averiguar la longitud de un string sin necesidad de usar otras bibliotecas usando el método string::size();

Así en este caso, podrías usar

Código:
tam = frase.size();

En lugar de

Código:
tam = strlen(frase);

Ni que decir, que como te han señalado es posible invertir directamente la cadena usando algo como:

Código:
tekst = string ( tekst.rbegin(), tekst.rend() );

Pero claro, este no es el propósito del ejercicio


Título: Re: ayuda arreglo c++
Publicado por: ivancea96 en 25 Noviembre 2014, 22:49 pm
Igualmente, puedes averiguar la longitud de un string sin necesidad de usar otras bibliotecas usando el método string::size();

No es una string, es un arreglo.

En cualquier caso y resivando el código, pides una frase, y utilizas el operador >> de cin. Eso solo te dará una palabra.


Título: Re: ayuda arreglo c++
Publicado por: sabar en 26 Noviembre 2014, 01:26 am
No es una string, es un arreglo.

En cualquier caso y resivando el código, pides una frase, y utilizas el operador >> de cin. Eso solo te dará una palabra.

ENTONCES COMO PUEDO HACER PARA QUE ME LEA TODA LA ORACION CREO QUE ES CON gets PERO NO SE COMO SE UTILIZA


Título: Re: ayuda arreglo c++
Publicado por: zShackra en 26 Noviembre 2014, 04:36 am
ENTONCES COMO PUEDO HACER PARA QUE ME LEA TODA LA ORACION CREO QUE ES CON gets PERO NO SE COMO SE UTILIZA


Aún no me he decidido por aprender C++ pues aún sigo con C, pero tengo entendido que con la función cin.getline() lo puedes hacer.

Por cierto, esas librerías que incluyes creo que son una mezcla de librerías de C y C++... ¿en qué lenguaje estás programando?...

P.D.: gets() no debería ser usada, fue removida y reemplazada por gets_s() en el estándar C11 (http://goo.gl/AAI3TB).


Título: Re: ayuda arreglo c++
Publicado por: Orubatosu en 26 Noviembre 2014, 22:20 pm
ENTONCES COMO PUEDO HACER PARA QUE ME LEA TODA LA ORACION CREO QUE ES CON gets PERO NO SE COMO SE UTILIZA


Creas una variable de típo string, por ejemplo "entrada"

Luego sustituyes "cin" por "Getline (cin, entrada);

Al final obtienes toda la cadena introducida, incluyendo espacios hasta el fin de línea.

lo he reformado un poco (bastante)... pero a ver si entiendes como lo hago

Código:
#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

int main(){
           string entrada;
           bool band= true;
           cout<<"ingresa la frase: ";
           getline (cin, entrada);
           char frase[entrada.size()+1];
           strcpy(frase, entrada.c_str());
           int tam = entrada.size();
           for (int i=0; i<tam; i++){
                if (frase[i] != frase[tam-i-1]) band = false;
                }

    if (band) cout << "si es palindromo";
    if (!band) cout << "no es palindromo";

    }

Quizás lo mas "exótico" es como se convierte el string de entrada en un array de caracteres (además del tamaño justo). Claro, si no te convence se puede hacer fácilmente una función para eso.

Algo interesante sería que pensaras que estrictamente hablando, un programa que comprueba frases palindromas debería de funcionar convirtiendo antes todo el texto a mayúsculas o minúsculas, porque la comprobación entre "A" y "a" te daría falso, y lo mismo para acentos (aunque no podrás usarlos en windows a menos que uses clocale)

Edito: Ahora que lo pienso un poco (que bruto que soy a veces) en realidad no necesitas hacer una comprobación de todo el arreglo, solo desde el principio hasta la mitad, ya que al comparar la primera con la última, la segunda con la penúltima, etc... a partir de la mitad del arreglo, estás comprobando de nuevo lo mismo.