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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


  Mostrar Mensajes
Páginas: 1 [2]
11  Programación / Programación C/C++ / Re: No lee instrucciones de main en: 12 Agosto 2021, 03:28 am
Me he tomado la libertad de modificar tu código y añadir unas cuantas cosas. De igual forma he comentado cambios y añadidos.

Espero que te sirva.


Me ha ayudado un monton los cambios, muchisimas gracias por el tiempo que te tomaste!  ;D ;D ;D ;D
12  Programación / Programación C/C++ / No lee instrucciones de main en: 11 Agosto 2021, 18:39 pm
Hola! Hice un codigo de insertar elementos ordenados en una lista enlazada, me funciono perfectamente solo que repetia la asignacion de la variable que iba a ingresar a la lista, asi:
num = 1;
agregar_lista (num);
num = 2; ,
agregar_lista (num); ... etc

ahora quise hacerlo con while, deje todo como estaba solamente modifique ese procedimiento, pero no se por que no funciona, no lee lo que hay dentro del while como tampoco lo que hay fuera, incluso intente mostrar en pantalla mensajes al iniciar el programa y tampoco sirve, a que se debe? Antes funcionaba sin ningun problema  :(

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct rNodo {
  5.    int dato;
  6.    struct rNodo * siguiente;
  7. }tNodo;
  8. typedef struct rLista {
  9.    tNodo * primero;
  10.    tNodo * ultimo;
  11.    int longitud;
  12. }tLista;
  13.  
  14. typedef tNodo * Nodo;
  15. typedef tLista * Lista;
  16.  
  17.  
  18. tLista * inicializar (Lista lista);
  19. tNodo * crear_nodo (int nuevo_dato);
  20. tLista * ins_de_orden_ascen (Lista lista, Nodo nuevo_nodo);
  21.  
  22.  
  23. int main(void)
  24. {
  25.    Lista lista = inicializar(lista);
  26.    int nuevo_dato;
  27.    int finalizar = 1;
  28. do {
  29. printf("ingrese un numero:");
  30.        scanf("%i", &nuevo_dato);
  31.        lista = ins_de_orden_ascen(lista, crear_nodo(nuevo_dato));
  32.        printf("Quiere ingresar otro numero? 1(si) o 0(no):");
  33.        scanf("%i", &finalizar);
  34.        } while (finalizar == 1);
  35.  
  36.    return 0;
  37. }
  38.  
  39.  
  40. tLista * inicializar (Lista lista) {
  41.    Lista nueva_lista = (tLista*) malloc (sizeof (tLista));
  42.    nueva_lista->primero = NULL;
  43.    nueva_lista->ultimo = NULL;
  44.    nueva_lista->longitud = 0;
  45.    return nueva_lista;
  46. }
  47. tNodo * crear_nodo (int nuevo_dato) {
  48.    Nodo nuevo_elemento = (tNodo*) malloc (sizeof (tNodo));
  49.    nuevo_elemento->dato = nuevo_dato;
  50.    nuevo_elemento->siguiente = NULL;
  51.    return nuevo_elemento;
  52. }
  53. tLista * ins_de_orden_ascen (Lista lista, Nodo nuevo_nodo) {
  54.    if (lista->longitud == 0) { // Si la lista es vacia
  55.        nuevo_nodo->siguiente = lista->primero;
  56.        lista->primero = nuevo_nodo;
  57.        lista->ultimo = nuevo_nodo;
  58.    } else {
  59.        Nodo aux = lista->primero; // aux apunta al primer elemento
  60.        Nodo sig;
  61.        int encontro = 0;
  62.        while (encontro == 0) {
  63.            sig = aux->siguiente; // sig apunta al siguiente elemento de aux
  64.             if (aux->dato > nuevo_nodo->dato) { // Si el nuevo elemento es menor al elemento actual
  65.                    nuevo_nodo->siguiente = aux;
  66.                    lista->primero = nuevo_nodo;
  67.                    encontro = 1;
  68.             } else
  69.                 if ((aux->dato < nuevo_nodo->dato) && (sig == NULL)) { // Si el nuevo elemento es mayor al ultimo de la lista
  70.                            nuevo_nodo->siguiente = aux->siguiente;
  71.                            aux->siguiente = nuevo_nodo;
  72.                            lista->ultimo = nuevo_nodo;
  73.                            encontro = 1;
  74.                        } else
  75.                            if ((aux->dato < nuevo_nodo->dato) && (sig->dato > nuevo_nodo->dato)) { // Si se encuentra en el medio de la lista
  76.                                nuevo_nodo->siguiente = aux->siguiente;
  77.                                aux->siguiente = nuevo_nodo;
  78.                                encontro = 1;
  79.                            } else
  80.                                aux = aux->siguiente;
  81.        }
  82.    }
  83.    lista->longitud++; // Aumenta la cantidad de elementos
  84.    return lista;
  85. }
13  Programación / Programación C/C++ / Lista Enlazada - asignar memoria en: 30 Julio 2021, 23:01 pm
Hola gente!, estaba leyendo un codigo en internet y me surgieron algunas dudas:

Código
  1. typedef struct ElementoLista
  2. {
  3.  char *dato;
  4.  struct ElementoLista *siguiente;
  5. } Elemento;
  6.  
  7. typedef struct ListaIdentificar
  8. {
  9.  Elemento *inicio;
  10.  Elemento *fin;
  11.  int tamanio;
  12. } Lista;

Código
  1. int ins_en_lista_vacia (Lista * lista, char *dato) {
  2.    Elemento *nuevo_elemento;
  3.    if ((nuevo_elemento = (Elemento *) malloc (sizeof (Elemento))) == NULL)
  4.    {
  5.        return -1;
  6.    }
  7.    if ((nuevo_elemento->dato = (char *) malloc (50 * sizeof (char))) == NULL)
  8.    {
  9.        return -1;
  10.    }
  11.    strcpy (nuevo_elemento->dato, dato);
  12.    nuevo_elemento->siguiente = NULL;
  13.    lista ->inicio = nuevo_elemento;
  14.    lista ->fin = nuevo_elemento;
  15.    lista ->tamanio++;
  16.    return 0;
  17. }

Es una funcion para insertar un elemento a una lista vacia, en la condicion 'if' primero le asigna espacio en la memoria a 'nuevo_elemento' y despues compara ese resultado con NULL, que significa eso? Generalmente asigno NULL a los punteros que todavia no apuntan a un elemento, ademas que en esa funcion le asigno memoria a 'nuevo_elemento' y despues a 'nuevo_elemento->dato', no seria suficiente con asignar memoria solo a 'nuevo_elemento->dato'?

Código
  1. int main (void){
  2.    char eleccion;
  3.    char *nom;
  4.    Lista *lista;
  5.    Elemento *actual;  
  6.    if ((lista = (Lista *) malloc (sizeof (Lista))) == NULL) return -1;
  7.    if ((nom = (char *) malloc (50)) == NULL) return -1;

Mi otra duda es que pude notar que asigno memoria a una estructura entera, 'Lista', no a una variable de tipo 'Elemento' como hizo en la funcion de insercion, por que no hacer lo mismo con todas las estructuras? No como hizo en la funcion 'ins_en_lista_vacia' que asigno en dos situaciones. Espero no haber hecho muchas preguntas, realmente me tiene confundida este tema de asignar memoria y no encuentro un medio para poder entenderlo mejor. Desde ya muchas gracias.

14  Programación / Programación C/C++ / Re: Invocacion funcion con variables de tipo puntero en: 20 Julio 2021, 17:44 pm
Tienes un problema en la línea 3:
Para crear los diferentes elementos del array has escrito
Código:
(1,1,0,1,1),(1,1,1,1,1),(1,0,1,1,1),(1,1,1,1,1),(0,1,1,1,1)

Con los paréntesis no generas elementos, sino que agrupas operaciones. Pues bien dentro de los paréntesis estás usando el operador coma.

El operador coma es un operador binario que evalúa la primera expresión y descarta su valor, después evalúa la segunda expresión y devuelve el resultado. Encadenando expresiones, cómo lo has hecho estás devolviendo el último operando de cada grupo de paréntesis.

Por otra parte, cuándo inicializas un array se puede hacer de forma incompleta dando valor a las primeras posiciones; el compilador entiende que debe dejar las siguientes a 0 por lo que en realidad tu código genera el siguiente array:
Código:
1 1 1 1 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

Para solucionar esto sólo cambia los paréntesis por llaves en tu inicialización del array.

Mil gracias, ahora me funciona correctamente!  :D :D :D :D :D
15  Programación / Programación C/C++ / Re: Invocacion funcion con variables de tipo puntero en: 20 Julio 2021, 17:43 pm
Hola @LadyWin

Te dejo mis ideas jaja...Por ahi ya lo sabes pero, creo que la única forma que eso te retorna 0 es que ese if de la línea 9 es distinto de cero. Al utilizar punteros acordate que modificas el valor de la variable misma... entonces, la segunda llamada no va a devolver 1 porque se modificaron las variables en sí mismas. Osea que te está posicionando en otro casillero del tablero que no es cero...
Por ahi te interese hacer paso de parametros por valor, y vos le pasas la posición del tablero que queres evaluar.

Luego... en mi humilde opinión, te conviene hacer más descriptivos los nombres de tus variables y funciones, código aburrido y simple = código funcional y facil de mantener. Por ejemplo, la función puede llamarse: evalua_movimiento_caballo(), de un vistazo ya sabes qué hace.

PD: en el caso de que esa función busque las posibles posiciones del caballo (las que son igual a cero en la matriz), tal vez podrías hacer un while o for que recorra cada fila de la matriz hasta que encuentre una posición cero, y si no encuentra ninguna salta a la fila que viene...

Tenés razon, mejorare el nombre que utilizo para mis variables y funciones, gracias por el dato!
16  Programación / Programación C/C++ / Invocacion funcion con variables de tipo puntero en: 20 Julio 2021, 00:59 am
Hola, esto es una parte de un programa que estoy haciendo que evalúa los posibles movimientos, en este caso, de un caballo de el ajedrez, los 0 serian espacios vacíos, el punto de partida seria el 0 de la posición v[4][0]:
 
                                                   1 1 0 1 1
                                                    1 1 1 1 1
                                                    1 0 1 1 1
                                                    1 1 1 1 1
                                                    0 1 1 1 1


Código
  1. int main (){
  2.    int a=4,b=0;
  3.    int v[N][M]={(1,1,0,1,1),(1,1,1,1,1),(1,0,1,1,1),(1,1,1,1,1),(0,1,1,1,1)};
  4.    printf(" return--> %i ",mov1(v,&a,&b)); //devuelve 1
  5.    printf(" return--> %i ",mov1(v,&a,&b)); // pero aca devuelve 0
  6.    return 0;
  7. }
  8. int mov1 (int v[N][M],int *a,int *b){
  9.   if (v[*a-2][*b+1]==0){
  10.       *a=*a-2;
  11.       *b=*b+1;
  12.       return 1;
  13.   }else{
  14.            return 0;
  15.   }
  16. }

Este código debería retornar dos veces 1 pero desconozco la razón del porqué en la segunda invocación no me evalúa correctamente la condición de if y me devuelve 0, se deberá a que estoy utilizando mal los punteros?
Páginas: 1 [2]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines