|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - bench
26
« en: Martes 26 de Marzo de 2002, 19:05 »
Una Funcion Es Recursiva Cuando se Llama a si Misma dentro del Cuerpo de la Funcion:
Por Ejemplo:
int Factorial(int X) { int Retorno = X * Factorial(X-1); return Retorno }
La Ventaja de Un Algoritmo Recursivo, Es La Facilidad Con Que Puede Desarrollarse. En Contra de Lo Complicado Que Puede Ser Resolver el Mismo Problema Con Un Algoritmo iterativo es Decir Que No Se Llama a si Mismo Para Resolver el Problema.
La Mayor Desventaja de Un Algoritmo Recursivo es la Gran Cantidad de Memoria que Requiere Para Ejecutarse.
En El Ejemplo;
Si Prcesamos: 4! Resul_Total = Factorial(4) { int Resultado = 4*Factorial(4-1); return Resultado; }
SE Ejecutara: FACTORIAL(4) 4*FACTORIAL(4-1) /* 1 INT */ 3*FACTORIAL(4-2) /* 2 INT */ 2*FACTORIAL(4-3) /* 3 INT */ 1*FACTORIAL(4-4) /* 4 INT */
Es Decir Se Necesitaran 4 Variables tipo int Para Resolver el Problema. A si que Imaginate la Necesidad de Memoria que se Requiere Para Resolver mediante este algoritmo: el factorial de Un Nro: Muy Grande.
Espero Te Sirva La Informacion
27
« en: Martes 19 de Marzo de 2002, 17:09 »
Espero Que la Siguiente Informacion Sea de Utilidad
/***** Prototipo de la Funcion fwrite: ******************************/ size_t fwrite(Buffer, Tam_Elemento, Nro_Elementos, Punt_File) char *Buffer; /* Puntero a la Información Que Se Va A Guardar */ size_t Tam_Elemento; /* Nro de Bytes Por Elemento a Guardar */ Nro_Elementos; /* Nro de Elementos a Guardar */ FILE *Punt_File;/* Puntero al Archivo Donde Se Va A Grabar la Informacion */
/*** Valor de Retorno ****************
El Numero de Elementos Efectivamente Grabados.
Este Nro Debe Ser Igual a Nro_Elementos, En Caso Contrario Indica Que Se ha Producido Un Error de Escritura y Retorna el Nro de Elementos Efectivamente Guardado Entes de Producirse el Error. En cuyo Caso la instrucción ferror (FILE *Punt_File) Retornara True Para Confirmar La Existencia de Un Error. **********************/
/*** Verificar Si La Escritura Tuvo Exito Si No Grabo El Nro de Elementos Indicado Se Produjo un Error ***********************************************************/
if(fwrite(Buffer, Tam_Elemento, Nro_Elementos, Punt_File) != Nro_Elementos) { perror(Error de Escritura Ejenplo.c Linea xxx:); exit(-1); } /*** else printf ("La Escritura Fue Exitosa"); ****************************************/
/***** Prototipo de la Funcion fread: ******************************/ size_t fread(Buffer, Tam_Elemento, Nro_Elementos, Punt_File) char *Buffer; /* Puntero Donde se Va a Guardar la Información */ size_t Tam_Elemento; /* Nro de Bytes Por Elemento a Leer */ Nro_Elementos; /* Nro de Elementos a Leer */ FILE *Punt_File; /* Puntero al Archivo Donde Se Va A Leer la Informacion */
/*** Valor de Retorno ****************
El Numero de Elementos Efectivamente Leidos.
El Nro de Elementos Leidos Debe Ser Igual a Nro_Elementos. En Caso Contrario Indica Que Se llego al Fin Del Archivo o Que Se Produjo Un Error ***************************************************************************/
/*** Verificar Si La Lectura Tuvo Exito Si No Leyo El Nro de Elementos Indicado Se Llego a Fin de Archivo o Se Produjo un Error en la Lectura ***********************************************************/
if(fread(Buffer, Tam_Elemento, Nro_Elementos, Punt_File) != Nro_Elementos) { if(!ferror(Punt_File)) printf("Se Llego a Fin de Archivo"); else { perror(Error de Lectura Ejemplo.c Linea xxx:); exit(-1); } } /*** printf ("La Lectura Fue Exitosa"); *********************************/ /***** Resto del Codigo ... ...
/*** Si Se Esta Dentro de Un Bucle Verificar Que Se Llego a Fin de Archivo Por Ejemplo: *********************************************************************/ /*** Si No Hay Fin de Archivo Continue ********************************/ if(!feof(Punt_File)) continue;
/*** Si Encuentra Fin de Archivo Rompa ********************************/
if(feof(Punt_File)) break; *********************/
/*** Cerrar Los Archivos Abiertos Antes de Terminar El Programa *********************************************************/ fclose(Punt_File);
/********************************** Otros Elementos a Considerar en el Sistema de Entrada/Salida ***********************************************************/ /*** Despues de Toda Accion de Lectura o Escritura fwrite o fread la POSICION ACTUAL del Punt_File Apunta a la Posicion Nro_Elementos Por Tam_Elementos Leidos o Escritos. Ejemplo: **************************************************************/
/*** Accion de Escritura ********************************************************/ strcpy(Buffer,"Esta Es Una Escritura de Prueba"); Nro_Elementos = strlen(Buffer); if(fwrite(Buffer, sizeof(char),Nro_Elementos, Punt_File) != Nro_Elementos) { perror(Error de Escritura Ejemplo.c Linea xxx:); exit(-1); } else printf ("Se Grabo [%s] Exitosamenten",Buffer);
/*** Accion de Lectura de Lo que Se Acaba de Grabar *********************************************/ /*** Prototipo de Funcion fseek: *************************** int fseek(Punt_File, Nro_Bytes, Origen) FILE *Punt_File; long Nro_Bytes; /* Nro de Bytes a Moverse "Valor negativo o Positivo" */ int Origen; /* A Partir de Donde Se Va a Mover: SEEK_SET Desde el Origen del Archivo, SEEK_CUR A Partir de la Posicion Actual SEEK_END A Partir del Fin del Archivo */ **************************************************************************/
/*** Se Posiciona el Archivo En la Posicion Inicial Donde Se Grabo. Moviendose desde la Posición Actual Hacia Atras Un Numero de Bytes Igual Al Tamaño de Cada Elemento Por el Nro. de Elementos Grabados *****************************************************************/ fseek(Punt_File, -sizeof(char)*Nro_Elementos, SEEK_CUR); /*** Se Inicializa el Buffer **********************/ Buffer[0] = 0x00; /* Se coloca " " en el Primer Elemento del Buffer */ /*** Se lee el Archivo ****************/ if(fread(Buffer, Tam_Elemento, Nro_Elementos, Punt_File) != Nro_Elementos) { if(!ferror(Punt_File)) printf("Se Llego a Fin de Archivon"); else { perror(Error de Lectura Ejemplo.c Linea xxx:); exit(-1); } } printf ("Buffer Leyo [%s] Exitosamenten",Buffer);
/*** Si Se Desea Ir Al Comienzo del Archivo Se Puede Utilizar la Instruccion:
void rewind(FILE *Punt_File) *************************************/
28
« en: Jueves 14 de Marzo de 2002, 18:55 »
Cambiate el al directorio de Trabajo mediante la instruccion chdir(Dir_Trabajo); #define DIR_TRABAJO "/usr/Mis_Arch" #include <dir.h>
chdir(DIR_TRABAJO);
/*** Abres Los Archivos, con open o fopen ***********************************/ int Fid_1; open("Archivo_1",Opcion,Modo); /********** la otra forma es colocar la referencia completa desde la raiz) **************************************/ int fid; Fid = open("/usr/Mis_Arch/Archivo_1",opción,Modo);
Espero te Siva de Ayuda.
29
« en: Jueves 14 de Marzo de 2002, 18:39 »
Creo que el Problema esta en la Forma Como Calculas el El Tamaño de la Structura mao con la instruccion sizeof
typedef struct { char *nombre; char *direccion; int edad; } mao;
void introdatos(mao *p,int datos); void borradatos(mao *p,int datos); void modificadatos(mao *p,int datos); void listadatos(mao *p,int datos); void ventana(); void menu();
void main() { ventana(); mao *p; int datos=0,opc; /*** La Structura mao Tiene dos Elementos que Son Punteros tipo Char, Esta Instruccion no Calcula el espacio de memoria necesario para Guardar un elemento en la structura ***********************************/ p=(mao *)malloc (sizeof(mao)); /****** Sin Que este entrando en un anlisis Profundo del Problema Te Sugiero Que Daclares si requieres Memoria Dinamica ************************************/ p = (mao *)malloc(sizeof (mao)+ strlen(nombre)+ strlen(direccion)); /**************** Pero si ya Conoces el Tamaño de la Structura Es mejor que Trabajes Sobre un Buffer con dimensiones ya determinadas *******************************************/ char Len_Int = sizeof(int); /*Portabilidad */ char Buf_Mao[Len_Int+47];/* 30 char x Nombre + 15 char x direccion. /*** Modeas el Puntero ****************/ p = (mao *)Buf_Mao;
... /******* Creo Que Buena Parte del Problema Lo Tienes Aqui. al Final Si usas malloc, debes liberar la memoria co la instruccion free(mao p) ******************************************/
----------------------------- Solo se Que no se NADA
30
« en: Jueves 14 de Marzo de 2002, 16:34 »
La Declaracion e inicializacion que tienes del puntero es Correcta si has incluido el archivo dos.h, De Tal Forma Que Debes Revizar la Activacion del Modo Grafico la Cual Dependera del Sistema Operativo. Si es en Ambiente Unix(linux) el Modo Grafico se Activa Con Una Funcion de ioctl.
Tambien puedes Declarla Como:
unsigned char *Dir_Vga = (unsigned char *) 0xA0000000;
Espero Te Sirva la Informacion.
31
« en: Miércoles 6 de Marzo de 2002, 01:57 »
La Manipulacion de Las Variables en C
Parten de Su Declaración:
Si Declaras Una Variable Tipo char
char Variable_Char;
el Compilador Reservo un Byte de memoria Para la Variable_Char.
Si Declaras UN PUNTERO tipo char
char *Punt_Char;
El Compilador No Reserva Memoria, sino identifica el lugar donde puedes guardar la direccion de cualquier Variable o Arreglo del tipo char.
Si Declaramos un Arreglo del
char Arreglo_Char[256];
El Compilador Reserva Memoria Para 256 caracteres, Su Puntero es el Nombre del arreglo "Arreglo_Char" y sus elementos estan identificado desde el Primero Arreglo_Char[0]hasta el Ultimo Arreglo_Char[255].
COMO SE MANIPULAN Y POR QUE?
Punt_Char = &Variable_Char;
Si Variable_Char = "A";
Punt_Char Contine la Direccion de la Variable_Char
*Punt_Char contiene el Valor ASCCI de la "A";
Cuando Pasas Una Variable de los tipos Basicos del "C" char,short,int,long,double Como Argumento a Una Funcion, La Funcion Recibe el Valor Que Contenga al Inicio, y Cualquier Modificacion que se efectue dentro del cuerpo de la funcion No tedra ningun efecto Sobre la Variable en el Programa que la Llamo. Manteniendo el Valor que Tenia al al Momento de llamar la Funcion.
Si Pasas el Puntero Si Se Puede Modificar el valor de la Variable Dentro de la Funcion.
Si Punt_Char = Arreglo_Char;
Punt_Char Toma el Valor del Puntero al Primer elemento del Arreglo. (&Arreglo_Char[0])
Y la Unica Forma de Pasar de Pasar Una Variable Compleja Como Parametro a Una Funcion Es Mediante Su Puntero.
Funcion_Char(Arreglo_Char); o Funcion_Char(Punt_Char);
Espero Te Sirva la Informacion
32
« en: Miércoles 6 de Marzo de 2002, 01:11 »
El Tema es bastante complejo, Puesto que el Manejo del Teclado en un terminal depende del tipo de terminal que este connectado a la red, wyse, vt-100 o un emulador de ANSI Por ejemplo.
Las Teclas del Cursor Arriba, Abajo, Izquierda o Derecha; Las Teclas de Funcion "F1" .. "F10", La Tecla ESC entre otras No Transmiten su Valor ASCCI. Como en DOS (Si No Recuerdo Mal: ESC = 27; CRUR_IZQ = 8, CUR_DER = 11, etc). Emiten una Secuencia de Escape que Va a Depender del Terminal que este Conectado. Esto esta definido en el archivo /etc/termcap Puedes Obtener algo de informacion en el manual del linux Mediante la Orden man termcap. y existe una libreria para su manipulacion libtermcap.
Por Ejemplo Creo Recordar que la Capacidad ki=Secuencia de Escape es el Cursor.
Por Ejemplo Para Un Terminal Ansi ki=E[E "Se Lee ESC Corchete E"
Esto Significa Que Cuando Un Usuario Pulsa La Tecla CUR_IZQ, el Terminal Emite Esta Secuencia. Se Tal Manera Que Si Estas Usando la Funcion scanf Para Leer el Teclado, Deberas Leer Byte a Byte Para Separar Las Secuencias de Escape, e Imprimir el Texto. Despues la Secuencia Debes Compararla Con el Termcap del Usuario que se Conecta, Mediante las Funciones de libreria Termcap. Esto es bastante complicado Si quieres que la Aplicacion Funcione Con Cualquier Terminal que se Conecte. Pero Si Conoces Los Terminales Que Se Van a Conectar Por Ejemplo Emulacion VT-100, Puedes Averiguar e la linea de Comandos en Modo Texto. Cual es la Secuencia Para Los Cursores. Pulsandolos y Dando enter. o editas el archivo /etc/termcap y Buscas Las Capacidades Para Mover Los Cursores.
y elaborar Un pequena Estructura Para interpretar Los Cursores.
/*** NO Estoy Verificando la Sintaxis Solo Esquematizado la idea *************************/ struct S_Cap { char *cap; char *Secuencia; unsigned char V_Correspondiente; };Cap[]= { "ki","E[E",8; "kr","E[D",11; "ku"," ",12; "kd"." ",10; }; Si Me Envias el Codigo Puedo Revizarlo. Tienes Razón Existe Muy Poca Informacion al Respecto en Español.
33
« en: Martes 5 de Marzo de 2002, 03:38 »
Para Tomar Una Decision de si Usar Un Puntero o la Estructura, Debes Tomar en Cunta lo Siguiente:
Si Declaras Un Puntero a Una Structura struct personas *Punt_Per, Personas;
Punt_Per Es Un Puntero a Una structura tipo Personas Pero No Apunta a Ninguna Direccion Definida.
Por Eso La Primera Instruccion Debe Ser: Punt_Per = NULL;
Mientras Que la Variable Personas es una structura del Tipo personas y Su Diresccion es &Personas.
De Tal Manera Que Si:
Punt_Per = &Personas;
Entonces Personas ed la Estructura y Punt_Per es Su Direccion.
Cual de las Dos Usar;
Para Una Llamada de Funcion Con Argumento La structura Persona, Solamente Puedes Pasar Su Direccion
Funcio_Per(&Personas); o Funcion_Per(Punt_Per);
y Dentro de la Funcion Tienes Que usar el Puntero,
En el Ejemplo Que Mencionas Tienes UN Error Por que el Puntero a la Structura No esta Inicializado.
En Cuanto A cuando Usar La Structura y Cuando Usar el Puntero:
Puedes Dirigirte Directamente a la structura Cuando:
La Has Declarado Como Una Variable General; Cuando la has Declarado Como una Variable Local Dentro de la Función donde la Vas a Utilizar.
Tienes Que Utilizar el Puntero Si Has Pasado la Structura Como Argumento de Una Funcion. Puesto Que la Una Forma de Pasar Un Arreglo, Union o structura Como Parametro de una Funcion es Mediante Su Puntero.
Fun_Per(struc personas *Punt_Per) { /*** Aqui es Necesario Referirse al Puntero Para Accesar un Elemento de la structura **********************/ }
[Modificado el 3/5/02 por bench]
34
« en: Sábado 23 de Febrero de 2002, 19:24 »
El Mismo Programa Pero Con Matematica de Punteros, Un Codigo Mas complejo Pero Incrementa la Eficiencia.
No Lo he compilado asi que Puede Tener errores.
#include <stdio.h> #include <string.h>
main() { char Buffer[100]; char *Punt = Buffer; char Iniciales[20]; char *Punt_I = Iniciales; char Len_I = 19; /* Max Nro de Palabras */
Printf("Introduce tu frase: "); gets(Buffer);
/*** Se Posiciona el Puntero en el Primer Caracter NO En Blanco *********************/ while((*Punt == ´ ´) && *Punt) Punt++; /*** Se Valida Si la Linea Esta en Blanco ***********************************/ if(!(*Punt)) return; /*** Se Toman Las Iniciales *********************/ *Punt_I++ = *Punt; I--; while(I) { /*** Se Avanza Hasta el Primer Espacio ********************************/ while((*Punt != ´ ´) && *Punt) Punt++; /*** Se Avanza Hasta el Primer Caracter *********************************/ while((*Punt == ´ ´) && *Punt) Punt++; /*** Se Sale Si Termino la Frase **************************/ if(!(*Punt)) break; /*** Se Toman las Iniciales y Se Avansa el Puntero de las Iniciales ***********************/ *Punt_I++ = *Punt; I--; } /* Fin del While Principal */ /*** Se coloca el Indicador "/" *************************/ *Punt_I = 0x00; /*** Se Imprimen las Iniciales en mayusculas **************************************/ printf("nLas iniciales de la frase son: %sn",toupper(Punt_I)); }
---------------------------------------------
[Modificado el 2/23/02 por bench]
35
« en: Sábado 23 de Febrero de 2002, 01:59 »
He Desarrollado LIbrerias Para el Manejo de de Bases de Datos Relacionales Orientadas a Grandes Bases de Datos. Su Presentacion es en modo texto Basadas en Ncurses, Muy Parecidas a una Aplicacion en Clipper, Por lo Tanto Tengo buen conocimiento del Manejo de structuras, arboles binarios, y me inter4esa el manejo del modo grafico a bajo nivel Por lo tanto mandame informacion Par ver en qu puedo colaborar.,
[Modificado el 2/22/02 por bench]
36
« en: Sábado 23 de Febrero de 2002, 00:48 »
Creo Que la Falla La Tienes en el Concepto de Punteros. Espero que Te sirva La Sugerencias en el codigo
#include <stdio.h> #include <conio.h> #include <string.h>
char encriptacion (char *);
void main (void) { /*************************** FALTA INICIALIZAR EL PUNTERO ***************************/ char *mens = NULL; int i,longitud,aux; clrscr(); printf("Escriba el mensaje que quiere encriptar:"); printf("Escribalo y al final pulse enter "); /********************** Inicalizar El Puntero Por Ejemplo Con la Funcion malloc ***************************************/ mens = malloc(512);/*buffer de 512 bytes*/ if (!mens) { perror("Error en la Asignacion de memoria"); exit(0); } /********************* Inicializar el Buffer: Con "/0" ******************************/ i = 0; while(i<512) mens[i++]= 0x00; /*** No Recuerdo la Funcion Coloca El "/0" de Fin de Streen Verificar *********************************/ scanf("%[^n]",mens); longitud=strlen(mens); /* aqui imprimo lo que meti antes*/ /**** Si Desea Imprimir el Estreen Byte a byte La Impresion Para al Encontrar "/0" ***************************************/ for(i = 0; mens; i++) { /*** Se Rompe Si Se Recibirieron mas de 512 *************************************/ if(i == 512); break printf("%c",mens); } getch(); clrscr(); printf("La frase encriptada es"); /*ahora utilizo la funcion de encriptacion*/ mens = ecriptacion(mens);/* Elimine & */ for(i = 0; mens; i++) { /*** Se Rompe Si Se Recibirieron mas de 512 *************************************/ if(i == 512); break printf("%c",mens); } getch(); } /* Fin del Programa Principal */
void encriptacion (char *mensaje) { char *mensaje; int i,longitud,aux; longitud = strlen(mensaje); /*** Creo Que lo Que Esta Tratando de Encriptar Es el Valor Ascci+la Pos *2 lo que es incorecto Por Que Desborda la Cap de un char *****************************************/ for(i=0;i!=longitud;i++){ aux=(int) mensaje; /* Guarda el lvalue */ aux=aux+i*2; mensaje=(char) aux; /*** Sugiero Un Algoritmo Por Ej. ***************************/ for(i = 0; mens; i++) { /*** Se Rompe Si Se Recibirieron mas de 512 *************************************/ if(i == 512); break aux = (mens+ i)* 2; if(aux < 256)mens = aux; else { /*** Considerar Que En una Variable Tipo Char No SE Puede Exeder de 255 Por Ejemplo: **********************************/ mens+= 2; } } /* Fin del For */ } /* Fin de la Funcion */
[Modificado el 2/22/02 por bench]
[Modificado el 2/23/02 por bench]
[Modificado el 2/23/02 por bench]
|
|
|