Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - MAFUS

#1291
.NET (C#, VB.NET, ASP) / Re: Juego de la Oca
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.
#1292
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:

int **tabla;
int m, n;
int i;

/* Se obtienen las dimensiones de la tabla m y n
* n para el número de filas
* m para el número de columnas
*/

/* Se genera el primer array dinámico que contendrá n filas */

tabla = malloc(sizeof(int*) * filas);

/* Las filas son punteros porqué contendrán la dirección de inicio
* del array columnas.
* Por tanto, para cada elemento de filas, reservamos una porción de
* memoria de m elementos.
*/

for(i = 0; i < filas; ++i)
    tabla[i] = malloc(sizeof(int) * columnas);  /* Se puede apreciar notación de array para un puntero */


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:

int **tabla;
int m, n;
int i;

/* Obtenemos el número de filas: n */
tabla = malloc(sizeof(*int) * n);

for(i = 0; i < n; ++i) {

    /* Obtenemos el número de columnas m de la fila actual i */

    /* Creamos el array de m columnas */
    tabla[i] = malloc(sizeof(int) * m);
}


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í:

/* Supongamos lo siguiente */
typedef struct node_t {
    int i;
    node_t *next;
} node;

void free_node(node **n) {
    node *aux = *n;
    if(aux) {
        free(aux);
        *n = NULL;
}

/* === Código que llama a la función === */
/* Supongamos nodo como un elemento que ya tiene memoria asignada
* con malloc, es decir: *
* node *nodo = malloc(sizeof(node));
* o una función que genere e inicialice un dato node.
* Ya hemos trabajado con él y ahora debemos borrarlo. Además
* se debe llevar a NULL el puntero, por lo que haremos uso
* de la función free_node que forma parte de las funciones de éste tipo
* de datos.
*/

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.
#1293
Programación C/C++ / Re: Busqueda de Archivos
13 Abril 2016, 00:37 AM
Pon un ejemplo de ese diccionario.


Puede que este código te ayude
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

int main() {
    char palabra[50];
    char parchivo[50];
    FILE *fp;
    int i;
    int encontrada = 0;
   
    printf("Buscar > ");
    fgets(palabra, 50, stdin);
    *strchr(palabra, '\n') = '\0'; // Elimino la nueva linea
   
    for(i = 0; i < strlen(palabra); ++i) // No sensible a la capitalización
        palabra[i] = tolower(palabra[i]);

    fp = fopen("diccionario.txt", "r");
    if(!fp) {
        fprintf(stderr, "Archivo diccionario.txt no encontrado");
        exit(EXIT_FAILURE);
    }
   
    fgets(parchivo, 50, fp);
    while(!encontrada && !feof(fp)) {
        *strchr(parchivo, '\n') = '\0';
       
        for(i = 0; i < strlen(parchivo); ++i)
            parchivo[i] = tolower(parchivo[i]);
           
        if(!strncmp(palabra, parchivo, 50)) // comparo dos cadenas
            encontrada = 1;
        fgets(parchivo, 50, fp);
    }
   
    if(encontrada)
        printf("Palabra encontrada\n");
    else
        printf("Palabra no encontrada\n");
   
    fclose(fp);
   
    return EXIT_SUCCESS;
}
#1294
Programación C/C++ / Re: Problema con rand()
12 Abril 2016, 23:37 PM
El hecho es que tu generas un carácter del ASCII 0 al ASCII 9, que son caracteres no imprimibles. Busca una tabla en internet de código ASCII y verás lo que digo. Pero al sumar '0' al resultado del rand lo que haces es llevar ese resultado al caracter ASCII '0' que ese sí ya es la representación del cero. ASCII dice que los caracteres numéricos van del cero hasta el nueve. Por tanto '0' + 0 es '0', '0' + 1 es '1', '0' + 2 es '2', etc.
Si te fijas lo mismo pasa con las letras: 'a' + 0 es 'a', 'a' + 1 es 'b'... 'A' + 0 es 'A', 'A' + 1 es 'B'...
#1295
Programación C/C++ / Re: Problema con rand()
12 Abril 2016, 23:20 PM
char *password=malloc(8*sizeof(char))+1;
Esto está mal. malloc te asigna una zona de memoria pero devuelves la posición 1 byte superior. Tal vez quisiste decir:
char *password=malloc((8+1)*sizeof(char)); para guardar la cadena más el caracter nulo.
Pero tampoco convence ya que rand podría generarte un 0 cuándo estás consiguiendo los números, con lo que la cadena resultante acabaría en ese momento. Por otra parte no estás escribiendo caracteres numéricos sino caracteres de control ASCII no imprimibles, por lo que a la hora de visualizar la cadena podrían aparecer efectos extraños en pantalla.
Tal vez quisiste decir:

for(i=0;i<4;i++)
   password[i]=(int)rand()%10+'0';
;

Más. Si usas malloc para asignar memoria debes usar free para liberarla en cuanto no la uses. La penúltima instrucción de tu programa debería ser free(contrasena);
#1296
Si ese es el archivo de texto solamente lee línea a linea con fgets y tal como la obtengas mándala a la consola con puts. Tal tienes s el txt tal tendrás en pantalla.
#1297
Y como es C++, por lo de las clases, string es el tipo de una clase. No creo que C++ tenga mecanismos, como C#, como para poder usar el nombre de una clase como variable.
#1298
Si es C no uses fstream.
Intenta no usar conio.h sólo es de Borland, cunado en tu trabajo no tengas TC++ estarás vendido.
En cambio, si es C++ intenta usar las librerías de C++ en vez de C.
Usar TC++ sí o sí. Sabía que en la facultad, almenos el C, lo están destrozando. Por eso a la gente no le gusta.
#1299
Es un error pensar que los caracteres se guardan como enteros positivos. El estándar C dice que eso depende de la implementación. Para convertir una letra minúscula del alfabeto a un rango de 0 a 26 no se deben usar los números mágicos. Se debe usar la 'a' minúscula. El estándar ASCII nos asegura que 'a' estará al principio de los alfabetos de minúsculas.
ASCII en C puede tener un rango de -128 a 127 o de 0 a 255. Así para el número de la 'b', para que sea 1, se debe hacer 'b'-'a'.
#1300
fflush sirve para vaciar flujos de salida, según dice el estándar: fflush(stdout) hará que el programa escriba todo lo que le queda por escribir a la pantalla, por ejemplo. Sin embargo fflush no está pensado para flujos de entrada por lo que fflush(stdin) no está definido: puede funcionar o no, depende del compilador.

En CHATROOM tienes un array e punteros a USER. Con esto te complicas un poco la existencia, por así decirlo.
Puedes hacer dos cosas:
1. Un array de USER con lo que trabajarías con un array normal
2. Una lista enlazada, eso es dentro de CHATROOM habría un puntero a USER y todo el trabajo lo harías con funciones orientadas a listas.