Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: johrdy en 10 Febrero 2012, 23:12 pm



Título: cadenas
Publicado por: johrdy en 10 Febrero 2012, 23:12 pm
necesito ayuda con estos problemas de la forma mas simple posiblehttp://imageshack.us/photo/my-images/714/cadenastarea.jpg/ (http://imageshack.us/photo/my-images/714/cadenastarea.jpg/)


Título: Re: cadenas
Publicado por: Valkyr en 11 Febrero 2012, 01:54 am
No dices si lo haces en C o en C++... esa no es manera de pedir ayuda.

Una idea general.

Ejercicio 1:

Simplemente es "justificar" (por decirlo de alguna forma) una cadena. Lees por teclado la cadena, recorres dicha cadena. Si es la primera letra de una palabra la pones a mayúscula, si no la pones en minúscula. Imprimes el resultado.

Ejercicio 2:

Recorres la cadena, cada vez que encuentres un espacio muestras la palabra que has leido hasta ese momento. Repites este proceso hasta llegar al final de la cadena y listo.

Ejercicio 3:

Puede hacerse de varías formas. Puedes coger recorrer la cadena y por cada carácter recorres desde el principio la cadena buscando el número de veces que está dicho carácter. No es la manera más eficiente pero para tener una idea te sobra.

Ejercicio 4:

Compruebas si el primer carácter es igual al último, el segundo al penúltimo, el tercero al antepenúltimo... etc. Si todas las comprobaciones son verdaderas, entonces es palindromo. Si la longitud de la cadena es impar habrá un caracter que se tendrá que comparar consigo mismo (el del centro).

Ejercicio 5:

Este no entiendo muy bien que es lo que hace.

Saludos.


Título: Re: cadenas
Publicado por: johrdy en 11 Febrero 2012, 18:42 pm
disulpen ya bosqueje mas o menos el problema 2 pero tengo un inquietud, no se como hacer para que primero se imprima "prOblema" y luego "un"..
aqui esta mi codigo en C, haber si me pueden hechar una mano
#include <stdio.h>
#define LOG 30   
int main(){
 
    char palabra[LOG+1];
    int i=0;
    gets(palabra);
    printf("\n");
    while (palabra!='\0'){
        if (palabra==' ')
                printf("\n");
        else
                printf("%c",palabra); 
        i++; 
    }

    printf("\n");

    return 0;
}


Título: Re: cadenas
Publicado por: Valkyr en 11 Febrero 2012, 19:09 pm
El código que propones tiene el problema de que si meten por teclado una frase que contenga más de 30 caracteres se te va a salir del array y lo más probable es que casque el programa. Si aún así quieres hacerlo con eso porque tú eres quién va a introducir las frases y te asegurarás de que tienen menos de 30 caracteres sigo:

puedes hacer lo siguiente en el bucle:

Código
  1. while(palabra[i]){
  2.    if(palabra[i]==' ')
  3.        printf("\n");
  4.    else
  5.        printf("%c", palabra[i]);
  6.  
  7.    i++;
  8. }

Supongo que el haber cambiado el orden de problema y un será por error, ya que el ejercicio lo que parece querer hacer es imprimir cada palabra de la frase separada por un espacio en una línea distinta.

Saludos.


Título: Re: cadenas
Publicado por: johrdy en 13 Febrero 2012, 04:20 am
que raro al momento se copiar no se copio esos corchetes..bueno de todos modos gracias
tengo un problema con el ejercicio 3, lo que pasa es que no se como hacer para que no se impriman las palabras ya contadas, mi codigo es el siguiente haber si me hechas una mano nuevamente...
saludos!
#include <stdio.h>
#include<ctype.h>
#include<string.h>

int contar(char frase[], char car);
int i,j;
int main()

{
      char frase[100];
      char car;
      int aparece;
      printf("Introduzca Frase: \n");
      gets(frase);
      j=strlen(frase);
       
      while (frase){ /*Bucle que convierte la cadena a minusculas*/
                 
        frase=tolower(frase); /*tolower convierte las mayusculas en
                                      minusculas*/
            i++; /*Recorremos toda la frase*/
            }
       
        for(i=0;i<j;i++) {
        if(frase!=' '){         
            car = frase ;
            aparece=contar(frase, car);
       
            printf("%c=%d\n", car, aparece)         
         
      }
  }
     
    return 0;             

}


int contar(char frase[], char car)
{
int i=0, veces=0;
while(frase!='\0'){
 if(frase==car)
   veces++;
   i++;
 
}
return veces;

}



Título: Re: cadenas
Publicado por: Valkyr en 13 Febrero 2012, 23:32 pm
En lugar de hacer lo que has hecho podrías tener un array en el que cada posición representa una letra, la posición 0 la 'a', la 1 la 'b'...etc, el array será de enteros y mientras recorres la frase vas sumando los valores del array correspondientes.

El código podría ser algo así: (te lo pongo en pseudocódigo para que tú lo hagas en C)

Código:
CADENA frase; //Variable
ENTERO array[27]; //Variable, posiciones para a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
inicializar(array); //Poner a 0 todas las posiciones del array
LEER(frase); //leemos la frase de la entrada estandar
toLower(frase); //Convierte la frase a minúscula
PARA CADA caracter DE frase HACER
    array[caracter-97]++;

ImprimirArray(array); //Imprimimos los valores del array que sean distintos de 0

Lo de caracter-97 lo hacemos porque la 'a' en código ASCII tiene el valor decimal 97, por tanto restandole ese valor nos queda 0 (que es la posición que le habíamos asignado en el array). De esta forma solo tienes que recorrer una vez la frase y otra el array, que es tiempo constante.

Al imprimir los valores solo debes deshacer el cambio, es decir, la posición 0 será la 'a', la posición 1 la 'b', etc e imprimiremos aquellas posiciones que sean distintas de 0.

Un saludo.


Título: Re: cadenas
Publicado por: rir3760 en 14 Febrero 2012, 03:29 am
Dos comentarios en buen plan (admito raya en lo pedante) sobre el pseudocodigo de Valkyr:

* Los caracteres en el rango 'a' .. 'z' son 26, el carácter 'ñ' es mejor evitarlo por problemático (mismo caso con las vocales acentuadas).

* En C puede utilizarse con el mismo efecto tanto el numero 97 como el carácter literal 'a', mejor (por claridad) el segundo.

Un saludo


Título: Re: cadenas
Publicado por: johrdy en 14 Febrero 2012, 15:49 pm
gracias broders, ya me salieron todos los problemas.
saludos!  :D


Título: Re: cadenas
Publicado por: Valkyr en 14 Febrero 2012, 19:03 pm
Se me fue el dedo o la cabeza o las dos cosas xD. No quise tener en cuenta la Ñ, se que causa problemas (además ya no sería ASCII, sería... UFT-8???) al igual que las palabras acentuadas.

El segundo punto, no había caído en la cuenta de ponerlo de forma literal, llevas razón, se ve mucho más claro.

Un saludo.