Orientación con un problema

Iniciado por Caster, 16 Mayo 2013, 19:37 PM

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

leosansan

#10

Tienes varios errores comprensibles en este arranque con los arrays:

* El primer índice o bien no pones nada o, mejor pones el número de palabras que contiene el array capitulo1, 5 en este caso.

* El segundo índice no está mal ya que no se peca por exceso, pero penaliza el uso de la memoria y en este caso, como la palabra más larga es de 6 caracteres habrá que poner 7, por lo que te explique de tener en cuenta al caracter nulo de todo fin de cadena.

* En los for se te fue la olla  ;) al poner fil=0 y col=0 cuando los índices son i y j, por lo que será i=0 y j=0.

* En el caso de arrys de cadenas mejor que pensar en filas y columnas, algo típico en los arrayas bidimensionales numéricos aunque en sí no esté mal, es pensar en posición de la cadena y caracter de dicha cadena.

* Al usar la función strlen no le pusiste el argumento de la misma, fíjate en el código para verlo mejor.

* Haces un uso excesivo de las llaves. Cuando un for, if o compañía sólo tiene una instrucción como "cuerpo" te la puedes  y debes ahorrar, sólo enmaraña la lectura del código. Supongo que es una buena costumbre adquirida de python, como el indentar siempre el código para una buena comprensión y fácil lectura.

* Tienes un punto y coma de más al final de los for, dentro del paréntesis.

* Al final te olvidaste de la instrucción para imprimir los resultados. He aquí la salida:


Código (cpp) [Seleccionar]
pincel ---->pin
cinc ---->c
cincel ---->cin
pipa ---->p
papel ---->pa


Y con tanto rollo casi me olvido de ponerte una posible solución, se podría mejorar con el uso de otras funciones de la librería string, pero estamos a lo que estamos, el uso de arrays:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <string.h>

int main(){
   int i,j;
   char capitulo1[5][7] = {"pincel", "cinc", "cincel", "pipa", "papel"};
   char cap1[5][7]={0};
   for (i= 0; i<5; i++)
       for (j = 0; j<strlen(capitulo1[i])-3; j++)
               cap1[i][j] = capitulo1[i][j];
               for (i = 0; i<5; i++)
       printf("%s ---->%s\n",capitulo1[i],cap1[i]);
   return 0;
}


Una variante para que imprima en cap1 un número de letras en función de la longitud de la cadena y así no salgan cadenas de una sola letra sería:

Código (cpp) [Seleccionar]
pincel ---->pin
cinc ---->ci
cinceles ---->cinc
pipa ---->pi
termometro ---->termo


Para esta variante del código:

Código (cpp) [Seleccionar]

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

int main(){
   int i,j,longitud;
   char capitulo1[5][11] = {"pincel", "cinc", "cinceles", "pipa", "termometro"};
   char cap1[5][11]={0};
   for (i= 0; i<5; i++){
       longitud=strlen(capitulo1[i])/2;
       for (j = 0;j<longitud; j++)
               cap1[i][j] = capitulo1[i][j];
   }
   for (i = 0; i<5; i++)
       printf("%s ---->%s\n",capitulo1[i],cap1[i]);
   return 0;
}


Espero no haberte agobiado con tantas sugerencias de un tirón pero sabes que para cualquier otra duda o sugerencia, aquí estamos para darte un empujoncito. ¡Ánimos! ;-)

Saluditos!. .... ...

Caster

#11
El tema de los índices ya lo he cambiado y en los dos arrays ya que en el segundo nunca van a salir palabras más largas que las primeras y lo deje así:

char capitulo[5][7] = {"pincel", "cinc", "cincel", "pipa", "papel"};
   char cap[5][7];


Otro punto era la duda que tenía yo para mostrar cada palabra en una linea diferente con un for y veo que a un array bidimensional se le puede tratar solamente con un indice, como me muestras aqui:

for (i = 0; i<5; i++)
       printf("%s ---->%s\n",capitulo1[i],cap1[i]);


Citar* En el caso de arrys de cadenas mejor que pensar en filas y columnas, algo típico en laos arrayas bidimensionales numéricos aunque en sí no esté mal, es pensar en posición de la cadenay caracter de dicha cadena.

Lo tendré en cuenta de aqui en adelante.

Citar* En los for se te fue la olla   al poner fil=0 y col=0 cuando los índices son i y j, por lo que será i=0 y j=0.

Se me olvidó cambiarlo en todas las partes del programa, pero mejor lo dejo con i y j.

En el segundo código que me das no entiendo porque divides la longitud total de la palabra entre 2:

longitud=strlen(capitulo1[i])/2;

Edito: Vale ya lo entendí, en vez de restar 3 carcteres lo divides en 2 para que nunca quede una letras sola. En este mismo código declaras la variable longi, pero no veo que uso tiene.

Saludos.

leosansan

#12
Cita de: Caster en 19 Mayo 2013, 15:06 PM En este mismo código declaras la variable longi, pero no veo que uso tiene.


Ninguna utilidad, fue una variante que intenté, pero al final no me hizo falta usarla :-)

Ya he reeditado el post anterior y la he eliminado. Bien observado, aunque no hace mal sobra del código.

Saluditos!. .... ..

Caster

Quería probar el código pero estoy volviendo a tener problemas con el compilador del Qt Creator, ya cree un posts aparte con esto y lo había resuelto pero vuelve a fallar, a ver si doy con la solución y lo pruebo.

Saludos

leosansan

Cita de: Caster en 19 Mayo 2013, 15:45 PM
Quería probar el código pero estoy volviendo a tener problemas con el compilador del Qt Creator, ya cree un posts aparte con esto y lo había resuelto pero vuelve a fallar, a ver si doy con la solución y lo pruebo.


¿No usas Code:Blocks?.

Pruébalo y seguro que te encantará, con sus ventanitas y múltiples pestañas, su opción para C11 su ....... vamos no digo que dejes de usar el Qt Creator pero no te cuesta nada probar "don Code:Blocks" .

Saluditos!. ... ..

Caster

Bueno, ahora que tengo tiempo, retomo otra vez este problema, a día de hoy tengo este código:

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

int main(){
    int i,j,longitud;
    char capitulo1[5][11] = {"pincel", "cinc", "cinceles", "pipa", "termometro"};
    char cap1[5][6]={0};
    for (i= 0; i<5; i++){
        longitud=strlen(capitulo1[i])/2;
        for (j = 0;j<longitud; j++)
                cap1[i][j] = capitulo1[i][j];
    }
    for (i = 0; i<5; i++)
        printf("%s ---->%s\n",capitulo1[i],cap1[i]);
    return 0;
}


Funciona, pero no del todo bien, porque lo que hace es mostrar la mitad de la palabra, y en el problema pide un "identificador" para cada palabra y no siempre es la mitad, en algunas es más largo y en otras más corto, lo que yo quería hacer es que haga eso con cualquier palabra introducida, pero no se me ocurre porque puede coger letras del principio, del final, por el medio... y no tengo ni la más mínima idea de como hacer.

Saludos

leosansan


No hay nada peor que un problema no bien definido. En principio, lo que originó este tema, sólo habla de identificadores pero deja abierta la puerta a interpretaciones y eso es no estar bien definido el problema.

Una opción sería incluir además de las primeras letras un símbolo para las que no aparecen e incluir asimismo las finales. Por ejemplo:


Código (cpp) [Seleccionar]

pincel ---->pin-el
cinco ---->ci--o
cinceles ---->cinc--es
pipa ---->pi-a
termometro ---->termo---ro


Pero para gustos colores, es el problema de un ejercicio no bien definido, insisto.

Código (cpp) [Seleccionar]

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

int main(){
    int i,j,longitud;
    char capitulo1[5][11] = {"pincel", "cinco", "cinceles", "pipa", "termometro"};
    char cap1[5][11]={0};
    for (i= 0; i<5; i++)
    {
        longitud=strlen(capitulo1[i]);
        for (j = 0;j<longitud/2; j++)
                cap1[i][j] = capitulo1[i][j];
        if (longitud<=5)
        {
            for (j = longitud/2;j<longitud-1; j++)
                cap1[i][j] = '-';
                cap1[i][longitud-1] =capitulo1[i][longitud-1] ;
        }
        else if (longitud>=6)
        {
            for (j = longitud/2;j<longitud-2; j++)
                cap1[i][j] = '-';
            cap1[i][longitud-2] =capitulo1[i][longitud-2] ;
            cap1[i][longitud-1] =capitulo1[i][longitud-1] ;
        }
        printf("%s ---->%s\n",capitulo1[i],cap1[i]);
    }
    return 0;
}


Saluditos!