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

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Mensajes
Páginas: 1 ... 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 [136] 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 ... 161
1351  Programación / Programación C/C++ / Re: Cuadrado en c++ en: 14 Abril 2016, 17:46 pm
Solución sencilla, en C, sin control de errores de entrada.
Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.    int x;
  5.    int x2;
  6.    char c;
  7.  
  8.    printf("Caracter a imprimir > ");
  9.    c = getchar();
  10.    printf("Tamaño del lado del cuadrado > ");
  11.    scanf("%i", &x);
  12.  
  13.    x2 = x*x;
  14.  
  15.    while(x2--) {
  16.        putchar(c);
  17.        if(x2 % x == 0)
  18.            putchar('\n');
  19.    }
  20.  
  21.    return 0;
  22. }
1352  Programación / Programación C/C++ / Re: Problema basico con listas en C en: 14 Abril 2016, 16:42 pm
Muy buenas. Muchas gracias, me alegro que mis aportaciones te sirvan.

typedef, que supongo que no sabes que es, sirve para crear alias de tipos de datos. De forma simple
Código
  1. typedef int entero;
ahora escribir entero es como si escribieramos int por lo que
Código
  1. entero num;
es lo mismo que escribir
Código
  1. int num;

Del mismo modo se pueden crear datos de tipo puntero
Código
  1. typedef int *puntero_a_int
ahora puntero_a_int se ha convertido en un int *
por lo que el siguiente fragmento es válido
Código
  1. typedef int *puntero_a_int;
  2. int a = 3;
  3. puntero_a_int = &a;

Ahora al código
Código
  1. typedef struct nodo_t {
  2.    int valor;
  3.    struct nodo_t* siguiente;
  4. } nodo, *pila;

lo que hace es crear un nodo básico en el empleo de listas y pilas:
Código
  1. struct nodo_t {
  2.    int valor;
  3.    struct nodo_t* siguiente;
  4. }

Podría trabajar solo con eso, sustituyendo lo que en el código aparece como nodo por struct nodo_t y lista por struct nodo_t * pero creando esos dos alias el código queda más comprensible a simple vista.

Básicamente lista y nodo son casi lo mismo, uno es un puntero y el otro la estructura. Si sigues el código verás que con esos alias el código es más fácil de seguir.

Para ver como quedaría de la otra forma haz una copia del código y sustituye lista por struct nodo_t* y nodo por struct nodo_t y verás la diferencia.
1353  Programación / Programación C/C++ / Re: Problema basico con listas en C en: 14 Abril 2016, 15:53 pm
Está un poco modificado pues defino un puntero directamente, pero los argumentos de push y pop esperan un puntero a puntero.

Como pusiste un ejemplo con push supuse que era una pila, así que el ejemplo implementa una pila.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct nodo_t {
  5.    int valor;
  6.    struct nodo_t* siguiente;
  7. } nodo, *pila;
  8.  
  9. pila nueva_pila() {
  10.    return NULL;
  11. }
  12.  
  13. void push(pila *l, int n) {
  14.    nodo *nuevo = malloc(sizeof(nodo));
  15.    nuevo->valor = n;
  16.    nuevo->siguiente = *l;
  17.    *l = nuevo;
  18. }
  19.  
  20. int pop(pila *l, int *dato) {
  21.    int exito = 0;
  22.    *dato = 0;
  23.    nodo* a_borrar;
  24.    if(*l) {
  25.        *dato = (*l)->valor;
  26.        a_borrar = *l;
  27.        *l = (*l)->siguiente;
  28.        free(a_borrar);
  29.        exito = 1;
  30.    }
  31.    return exito;
  32. }
  33.  
  34. int main() {
  35.    pila mi_pila;
  36.    int valor;
  37.    int exito;
  38.  
  39.    mi_pila = nueva_pila();
  40.    push(&mi_pila, 3);
  41.    push(&mi_pila, 5);
  42.    exito = pop(&mi_pila, &valor);
  43.    if(exito) printf("%i\n", valor);
  44.    exito = pop(&mi_pila, &valor);
  45.    if(exito) printf("%i\n", valor);
  46.    exito = pop(&mi_pila, &valor);
  47.    if(exito) printf("%i\n", valor);
  48.  
  49.    return 0;
  50. }
1354  Programación / Programación C/C++ / Re: ERROR en C process returned -10737441819 en: 14 Abril 2016, 14:56 pm
Un programa en C siempre debe devolver un valor entero comprendido entre 0 y 255 cuando termina.

Tu programa termina cuando termina main pero no retorna nada, de forma controlada. Para solventar esto pon como última instrucción en main
Código
  1. return 0;
así retornarás el valor 0, que según el estándar quiere decir que el programa ha finalizado sin problemas.
1355  Programación / Programación C/C++ / Re: Ayuda con if-else en: 14 Abril 2016, 00:52 am
Después de usar scanf para coger caracteres o números usa la instrucción
Código
  1. while(getchar()!='\n');
Esto vaciará el buffer stdin de todos los caracteres sobrantes.
1356  Programación / Programación C/C++ / Re: Problema basico con listas en C en: 14 Abril 2016, 00:36 am
Respuesta rápida:
Los parámetros de una función son una copia local del argumento de llamada.
Respuesta algo menos rápida:
Debes pasar un puntero a lista como argumento de la función.
Te doy media solución:
void push(lista **head, int value);

A partir de aquí me detengo y te invito a pensar porqué debe ser así.
1357  Programación / Programación C/C++ / Re: Arbol de expresion en c++ en: 13 Abril 2016, 17:34 pm
¿Cómo vas con eso?

Nunca he montado uno de esos pero con la información de wikipedia en inglés hay una buena base para empezar.
https://en.wikipedia.org/wiki/Binary_expression_tree
1358  Programación / .NET (C#, VB.NET, ASP) / Re: Juego de la Oca en: 13 Abril 2016, 17:18 pm
Esto va al foro de .NET pero ya te digo: un juego de la oca es un array de 63 casillas. Que sobre un tablero lo veas en espiral es para ahorrar espacio. En verdad es un juego muy sencillo de realizar.
1359  Programación / Programación C/C++ / Re: Punteros dobles / Punteros a puntero. en: 13 Abril 2016, 16:00 pm
Apuntar a un puntero parece una redundancia pero tiene sus usos:

1. Construcción de una tabla de forma dinámica:
Para un compilador que no implemente el estándar C99 o superior la única forma de obtener una tabla de MxN de la que las dimensiones no se conocen en tiempo de programación (a partir de ahora en tiempo de compilación) es usando punteros e instrucciones alloc. Ejemplo:
Código
  1. int **tabla;
  2. int m, n;
  3. int i;
  4.  
  5. /* Se obtienen las dimensiones de la tabla m y n
  6.  * n para el número de filas
  7.  * m para el número de columnas
  8.  */
  9.  
  10. /* Se genera el primer array dinámico que contendrá n filas */
  11.  
  12. tabla = malloc(sizeof(int*) * filas);
  13.  
  14. /* Las filas son punteros porqué contendrán la dirección de inicio
  15.  * del array columnas.
  16.  * Por tanto, para cada elemento de filas, reservamos una porción de
  17.  * memoria de m elementos.
  18.  */
  19.  
  20. for(i = 0; i < filas; ++i)
  21.    tabla[i] = malloc(sizeof(int) * columnas);  /* Se puede apreciar notación de array para un puntero */
  22.  

2. Construcción de una tabla de diente de sierra.
Es parecido al anterior pero con la ventaja de que se gasta menos memoria.
Si, por ejemplo, se necesita una tabla de la siguiente forma:
123456
123
1
123456
123
Se puede generar de la siguiente manera:
Código
  1. int **tabla;
  2. int m, n;
  3. int i;
  4.  
  5. /* Obtenemos el número de filas: n */
  6. tabla = malloc(sizeof(*int) * n);
  7.  
  8. for(i = 0; i < n; ++i) {
  9.  
  10.    /* Obtenemos el número de columnas m de la fila actual i */
  11.  
  12.    /* Creamos el array de m columnas */
  13.    tabla[i] = malloc(sizeof(int) * m);
  14. }

3. Cambiar la dirección a la que apunta un puntero e una función externa
Tenemos un dato definido por nosotros, por ejemplo una lista, y decidimos que tenga una funcinalidad, una función, que borre un nodo y deje ese puntero del nodo  NULL para no tener problemas extraños si más adelante se referenciara ese nodo borrado: al ser NULL se pararía el programa y se lanzaría un mensaje de error, con lo que nos ayudaría con la depuración.

La función sería así:
Código
  1. /* Supongamos lo siguiente */
  2. typedef struct node_t {
  3.    int i;
  4.    node_t *next;
  5. } node;
  6.  
  7. void free_node(node **n) {
  8.    node *aux = *n;
  9.    if(aux) {
  10.        free(aux);
  11.        *n = NULL;
  12. }
  13.  
  14. /* === Código que llama a la función === */
  15. /* Supongamos nodo como un elemento que ya tiene memoria asignada
  16.  * con malloc, es decir: *
  17.  * node *nodo = malloc(sizeof(node));
  18.  * o una función que genere e inicialice un dato node.
  19.  * Ya hemos trabajado con él y ahora debemos borrarlo. Además
  20.  * se debe llevar a NULL el puntero, por lo que haremos uso
  21.  * de la función free_node que forma parte de las funciones de éste tipo
  22.  * de datos.
  23.  */
  24.  
  25. free_node(&nodo);

Hay más funcionalidades para punteros a punteros, pero estas son las más comunes. Ya las irás viendo a medida que avances con C.
1360  Programación / Programación C/C++ / Re: Busqueda de Archivos en: 13 Abril 2016, 00:37 am
Pon un ejemplo de ese diccionario.

Puede que este código te ayude
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #include <stdlib.h>
  5.  
  6. int main() {
  7.    char palabra[50];
  8.    char parchivo[50];
  9.    FILE *fp;
  10.    int i;
  11.    int encontrada = 0;
  12.  
  13.    printf("Buscar > ");
  14.    fgets(palabra, 50, stdin);
  15.    *strchr(palabra, '\n') = '\0'; // Elimino la nueva linea
  16.  
  17.    for(i = 0; i < strlen(palabra); ++i) // No sensible a la capitalización
  18.        palabra[i] = tolower(palabra[i]);
  19.  
  20.    fp = fopen("diccionario.txt", "r");
  21.    if(!fp) {
  22.        fprintf(stderr, "Archivo diccionario.txt no encontrado");
  23.        exit(EXIT_FAILURE);
  24.    }
  25.  
  26.    fgets(parchivo, 50, fp);
  27.    while(!encontrada && !feof(fp)) {
  28.        *strchr(parchivo, '\n') = '\0';
  29.  
  30.        for(i = 0; i < strlen(parchivo); ++i)
  31.            parchivo[i] = tolower(parchivo[i]);
  32.  
  33.        if(!strncmp(palabra, parchivo, 50)) // comparo dos cadenas
  34.            encontrada = 1;
  35.        fgets(parchivo, 50, fp);
  36.    }
  37.  
  38.    if(encontrada)
  39.        printf("Palabra encontrada\n");
  40.    else
  41.        printf("Palabra no encontrada\n");
  42.  
  43.    fclose(fp);
  44.  
  45.    return EXIT_SUCCESS;
  46. }
  47.  
Páginas: 1 ... 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 [136] 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 ... 161
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines