• Jueves 2 de Mayo de 2024, 22:28

Mostrar Mensajes

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

Páginas: 1 [2]
26
C/C++ / Re: Con respecto a la lista de correo
« 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
C/C++ / Re: ayuda con la sentencia feof
« 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
C/C++ / abrir directorios
« 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
C/C++ / Re: ME JUEGO EL CURSO¡¡¡¡¡¡¡¡¡¡
« 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
C/C++ / Re: Puntero a memoria de video
« 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
C/C++ / Re: problena con el paso de parametros. HELP!!
« 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
C/C++ / Re: NCurses
« 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
C/C++ / Puntero o no?
« 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
C/C++ / Reto
« 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
C/C++ / Re: Necesitamos programadores para crear un nuevo SO!
« 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
C/C++ / Re: paso de punteros a funciones
« 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]

Páginas: 1 [2]