elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ejercicio en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ejercicio en C  (Leído 2,196 veces)
ElpIOLA20

Desconectado Desconectado

Mensajes: 3



Ver Perfil
Ejercicio en C
« en: 10 Agosto 2018, 01:33 am »

Hola a todos! Estoy comenzando a estudiar programación. Y necesito ayuda con un ejercicio. La verdad es que ya intente de varias formas y no me sale. Quisiera por lo menos alguna pista. Seguramente ustedes sabrán alguna manera de hacerlo.
El ejercicio es el siguiente:

Tengo un archivo. Lo parseo, osea lo leo y lo guardo en un ArrayList. Hasta acá todo bien. El archivo contiene caracteres. Osea 'a', 'b', 'z', '4' etc.
El ejercicio me pide que haga una lista con todos los caracteres que tengo en el arraylist de manera ascendente y que aparezcan una ves cada uno. (porque hay varios caracteres que se repiten). El problema es que no se me ocurre como hacer una función que me los liste sin que se repitan.

Código:
ArrayList* listaOrdenadaAscendente(ArrayList* this, ArrayList* this2)
{
    int i;
    int len = al_len(this);
    eCaracter* letra;
    if(this != NULL && this2 != NULL)
    {
        for(i=0;i<len;i++)
        {
            letra = (eCaracter*) al_get(this,i); //asignamos los elementos del arraylist a la estructura,
            if(comprobarSiEsRepetida(this2,letra) == 1)
            {
                al_add(this2,letra); //agregamos los elementos a la nueva lista que van asignados los caracteres sin repetir.
            }
            else
            {
                al_remove(this2,i); //si ya existe el caracter lo elimino
            }
        }
    }
    return this2;
}

int comprobarSiEsRepetida(ArrayList* this, eCaracter* letra)
{
    int i, index = -1;
    eCaracter* aux;
    int len = al_len(this);
    if(this != NULL && letra != NULL)
    {
        for(i=0;i<len;i++)
        {
            aux = (eCaracter*) al_get(this,i);
            if(get_Caracter(aux) == get_Caracter(letra)) //Comparamos si son iguales
            {
                index = 0;
                break;
            }
            else
            {
                index = 1;
                break;
            }
        }
    }
    return index;
}

Gracias por su tiempo!


« Última modificación: 10 Agosto 2018, 03:57 am por ElpIOLA20 » En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Ejercicio en C
« Respuesta #1 en: 10 Agosto 2018, 06:43 am »

El ciclo for al interior de la funcion comprobarSiEsRepetida no parece tener oportunidades de repetirse muchas veces dado que el if-else siempre hace break, tanto si la condicion del if es verdadera o es falsa.

Me da la impresion que no quieres tener un else ahi y solo salir del for y de la funcion si una condicion ocurre y seguir en el loop si aun no se presenta.

Tampoco entiendo muy bien el ciclo for de la funcion listaOrdenadaAscendente. AL parecer quieres insertar en this2 si no se ha visto antes y eliminarlo si lo has visto antes. Es raro esto, porque no solo insertas si no lo has visto, y si lo has visto simplemente lo ignoras, en vez de intentar borrarlo?

Te sugiero usar nombres de variables que sirvan para entender mejor el programa, this y this2 no son los mejores nombres, especialmente si este codigo llegase a ser compilador por un compilador de C++.


En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
ElpIOLA20

Desconectado Desconectado

Mensajes: 3



Ver Perfil
Re: Ejercicio en C
« Respuesta #2 en: 10 Agosto 2018, 17:28 pm »

Hola CalgaryCorpus gracias por responder. Leí lo que pusiste y si note que el else estaba de mas. Y que no estaba tan entendible para la gente que lo ve de afuera. Lo retoque un poco el código. Pero aun sigue sin funcionar.

Código:
ArrayList* listaOrdenadaAscendente(ArrayList* ListaVieja, ArrayList* ListaNueva)
{
    int i;
    int len = al_len(ListaVieja);
    eCaracter* letra;
    if(ListaVieja != NULL && ListaNueva != NULL)
    {
        for(i=0;i<len;i++)
        {
            letra = (eCaracter*) al_get(ListaVieja,i); //Agregamos los datos de la lista vieja al auxiliar letra.
            if(comprobarSiEsRepetida(ListaNueva,letra) == 1) //si la funcion devuelve 1 significa que no existe el elemento en la lista nueva.
            {
                al_add(ListaNueva,letra); // Por lo tanto aca lo agregamos a la nueva lista.
            }
        }
    }
    return ListaNueva;
}

int comprobarSiEsRepetida(ArrayList* ListaNueva, eCaracter* letra) //letra auxiliar de la vieja lista
{
    int i, index = -1;
    eCaracter* aux;
    int len = al_len(ListaNueva);
    if(ListaNueva != NULL && letra != NULL)
    {
        for(i=0;i<len;i++)
        {
            index = 1;
            aux = (eCaracter*) al_get(ListaNueva,i); // Agregamos los datos de la nueva lista al auxiliar.
            if(get_Caracter(aux) == get_Caracter(letra)) // Comparamos si los datos del auxiliar de la nueva lista son iguales al de la vieja lista.
            {
                index = 0;
                break;
            }
        }
    }
    return index;
}
« Última modificación: 10 Agosto 2018, 17:32 pm por ElpIOLA20 » En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Ejercicio en C
« Respuesta #3 en: 10 Agosto 2018, 18:55 pm »

Te sugiero ser mas explicito en que problemas tienes. Decir que no funciona no da mucha informacion.
Decir que los datos se duplican, o que tal linea hace que el programa caiga, explicitando como estas probando, cuales son las entradas y las salidas que hacen evidente el problema da a entender el trabajo que estas poniendo y ayuda a ayudarte.

Tambien : Usa las etiquetas Geshi adecuadas para que la sintaxis sea coloreada mejor.
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
ElpIOLA20

Desconectado Desconectado

Mensajes: 3



Ver Perfil
Re: Ejercicio en C
« Respuesta #4 en: 10 Agosto 2018, 19:36 pm »

CalgaryCorpus a continuación explicare detalladamente.
Este programa lee un archivo .csv el cual contiene caracteres. Yo a través de otras funciones lo parseo(leo el archivo y guardo los datos en un ArrayList).
Este ArrayList ya esta declarado y inicializado en el main.c.

Código
  1. ArrayList* listaVieja;
  2.    listaVieja= al_newArrayList(); //Esta funcion reserva memoria.
  3.  

Una ves hecho esto, me pide que liste todos los caracteres de manera ascendente sin que se repitan.

Entonces yo pensé declarar otro ArrayList en el main.c el cual seria:

Código
  1. ArrayList* ListaNueva;
  2.    ListaNueva= al_newArrayList();

Y en este guardar los caracteres sin repetir de manera ascendente...

A continuación declaro la función
Código
  1. ArrayList* listaOrdenadaAscendente(ArrayList* ListaVieja, ArrayList* ListaNueva);

El cual se le pasan por parametros nuestros dos ArrayList(La que contiene los caracteres "ListaVieja" y la que va a guardar los nuevos caracteres sin repetir y de manera ascendente "ListaNueva").

Una ves declarada, procedo a desarrollar la función.

Código
  1. ArrayList* listaOrdenadaAscendente(ArrayList* ListaVieja, ArrayList* ListaNueva)
  2. {
  3.    int i;
  4.    int len = al_len(ListaVieja); //al_len me devuelve el tamaño de ListaVieja.
  5.    eCaracter* letra; //Declaramos un puntero al tipo de dato eCaracter* que es una estructura.
  6.                    //La cual usaremos como un auxiliar para que guarde la direccion de memoria de nuestros elementos que se encuentran en nuestra ListaVieja
  7.    if(ListaVieja != NULL && ListaNueva != NULL) //Verificamos que nuestras listas no sean NULL
  8.    {
  9.        for(i=0;i<len;i++)
  10.        {
  11.            letra = (eCaracter*) al_get(ListaVieja,i); //Agregamos los datos de ListaVieja al auxiliar letra.
  12.            if(comprobarSiEsRepetida(ListaNueva,letra) == 1) //Invocamos nuestra funcion comprobarSiEsRepetida que funciona como un filtro. Le pasamos la ListaNueva y el auxiliar.
  13.                                                      //Si devuelve 1 significa que no existe ningun elemento letra que sea igual a un elemento de la ListaNueva.
  14.            {
  15.                al_add(ListaNueva,letra); //Por lo tanto sino existe lo agregamos. al_add copia el elemento letra y lo agrega a la ListaNueva.
  16.            }
  17.        }
  18.    }
  19.    return ListaNueva;
  20. }

Aparte desarrolle la funcion:
Código
  1. int comprobarSiEsRepetida(ArrayList* ListaNueva, eCaracter* letra)

Que es invocada anteriormente. Esta funcion recibe un puntero a la ListaNueva y un puntero al elemento que quiero verificar si existe en la ListaNueva.

Código
  1. int comprobarSiEsRepetida(ArrayList* ListaNueva, eCaracter* letra)
  2.    int i, index = -1;
  3.    eCaracter* aux; //Declaramos un auxiliar de tipo eCaracter* para guardar los elementos que contiene la ListaNueva.
  4.    int len = al_len(ListaNueva); //Esta funcion nos devuelve el tamaño de len
  5.    if(ListaNueva != NULL && letra != NULL)
  6.    {
  7.        for(i=0;i<len;i++)
  8.        {
  9.            index = 1;
  10.            aux = (eCaracter*) al_get(ListaNueva,i); // Agregamos los datos de la nueva lista al auxiliar.
  11.            if(get_Caracter(aux) == get_Caracter(letra)) // Comparamos si los datos del auxiliar de la nueva lista son iguales al de la vieja lista.
  12.            {
  13.                index = 0;
  14.                break;
  15.            }
  16.        }
  17.    }
  18.    return index; //Si retorna 1 no existe el elemento. Si retorna 0 existe.
  19. }

Aparte de todo esto tengo declarado unas funciones que se que andan lo mas bien que sirven para mostrar elementos por pantalla. Entonces corro el programa y no me salta ningún error. Cuando eligo la opcion que me cargue la listaNueva de manera ascendente y sin caracteres. Directamente no me muestra nada. No cuelga el programa. Solamente no me muestra nada. Como si no estuvieran guardando los datos en la nueva lista.

Perdonen por tanto quilombo. Soy nuevo en esto y trato de explicar lo mejor que puedo. Gracias por su tiempo!
« Última modificación: 10 Agosto 2018, 19:39 pm por ElpIOLA20 » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ejercicio en C
« Respuesta #5 en: 10 Agosto 2018, 23:06 pm »

Estás reescribiendo muchas funciones que ya existen en la biblioteca estándar.
En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Ejercicio en C
« Respuesta #6 en: 11 Agosto 2018, 03:07 am »

Sospecho que tu función al_add no está haciendo lo que esperas. Si tienes alguna función para espiar el contenido de una lista, hazlo justo después de llamar a al_add. Creo que obtendrás una lista vacía.

Si pruebas y confirmas mi sospecha, tal vez te conviene compartir el código de esa función también.
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ejercicio en C
« Respuesta #7 en: 11 Agosto 2018, 05:48 am »

Podrías poner todo el código, así podríamos ver que es al estructura eCaracter y las demás funciones auxiliares.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ejercicio 506
Ejercicios
ieman 0 3,787 Último mensaje 13 Mayo 2005, 17:42 pm
por ieman
Ejercicio en C
Ejercicios
ߣ@î§ 3 10,636 Último mensaje 4 Septiembre 2005, 06:31 am
por ߣ@î§
Help Ejercicio 122 en C
Ejercicios
ANELKAOS 4 4,916 Último mensaje 15 Septiembre 2005, 23:41 pm
por Arcangel_RZ
[Ejercicio] Aca tienen un ejercicio para practicar « 1 2 3 »
Programación Visual Basic
Dreamaker 20 15,803 Último mensaje 5 Septiembre 2010, 02:57 am
por TGa.
ejercicio conclase pag 70 ejercicio 1
Programación C/C++
flony 2 4,318 Último mensaje 17 Octubre 2010, 12:16 pm
por Akai
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines