cadenas

Iniciado por johrdy, 10 Febrero 2012, 23:12 PM

0 Miembros y 1 Visitante están viendo este tema.

johrdy

necesito ayuda con estos problemas de la forma mas simple posiblehttp://imageshack.us/photo/my-images/714/cadenastarea.jpg/

Valkyr

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.

johrdy

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;
}

Valkyr

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:


while(palabra[i]){
    if(palabra[i]==' ')
        printf("\n");
    else
        printf("%c", palabra[i]);

    i++;
}


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.

johrdy

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;

}


Valkyr

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)


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.

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

johrdy

gracias broders, ya me salieron todos los problemas.
saludos!  :D

Valkyr

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.