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 - bdoX

#11
Hola a todos:

Les cuento, ya tengo implementado un chat bidireccional hecha en winsok, para ello tuve que hacerlo con hilos de ejecucion, hasta el momento el programa no acepta mas de un cliente. Funciona bien, el problema es que se ve asi:



ocurre que se ve feo que ingrese los datos, y que este ahí mismo el historial de converzación, por eso tengo ganas de el mismo hilo me genere una ventana aparte donde pueda ingresar los datos y una ventana donde pueda ver los datos del historial de converzación, algo asi:



Lo mismo para el cliente.

Se que la existe una funcion llamada CreateProcess() que al pasarle un flag a la funcion, me genera otra ventana, pero lo que yo no quiero es ejecutar desde otro *.exe a otro *.exe. La idea es tener un solo ejecutable nomas. Ojalá alguien pueda ayudarme please!

saludOS!


#12
Programación C/C++ / Re: [AYUDA] VB Split
23 Enero 2012, 05:59 AM
Si sabes programar en c++ te darás cuenta de que no cambia mucho el asunto.

Enlace

saludos!
#13
La verdad es que no le veo el grado de dificultad.

Esto es lo que hace toda la tarea.


   for(i=0; i<t; i++)
       for(j=0; j<t; j++)
           if ( j > i )
               x += v[i][j];


Acá dejo el code completo


#include <stdio.h>

#define MAX 5

void leer_matriz (unsigned v[][MAX], unsigned t);
void triangulo_superior (unsigned v[][MAX], unsigned t);

int main()
{
   unsigned t, v[MAX][MAX];
   
   do
   {
       printf ( "Cuantos elementos va a tener la matriz?: " );
       scanf ( "%u", &t );
   } while (t < 0 || t > MAX);

   leer_matriz (v, t);
   triangulo_superior (v, t);

   setbuf (stdin, NULL);
   getchar ();
   return 0;
}

void leer_matriz (unsigned v[][MAX], unsigned t)
{
   unsigned i, j;

   for (i = 0; i < t; i++)
   {
       for (j = 0; j < t; j++)
       {
           printf ( "Dame el elemento M[%u][%u]: ", (i + 1), (j + 1) );
           scanf ( "%u", &v[i][j] );
       }
   }

   for (i = 0; i < t; i++)
   {
       for (j = 0; j < t; j++)
           printf ( "%u\t", v[i][j] );

       printf ( "\n" );
   }
}

void triangulo_superior (unsigned v[][MAX], unsigned t)
{
   unsigned i, j;
   int x = 0;

   for (i = 0; i < t; i++)
       for (j = 0; j < t; j++)
           if (j > i)
               x += v[i][j];

   printf ( "La suma es: %d", x );
}



saludos!
#14
Hola a todos:

Voy hacer mi primer aporte en el foro. Se trata de unas funciones que sirven para validar datos de entradas, y unas cuantas macros. Tambien incluye la implementación del getch() que tanto conocemos, en windows y linux.


#include <stdio.h>
#include <stdlib.h>

#ifdef WIN32
   #include <windows.h>
   #define NEWLINE      13
   #define BACKSPACE    8
#else
   #include <termios.h>
   #define NEWLINE      10
   #define BACKSPACE    127
#endif

#define TAM              20
#define SPACE            32
#define MIN_NUM          48
#define MAX_NUM          57
#define MIN_LETRA_MAY    65
#define MAX_LETRA_MAY    95
#define MIN_LETRA_MIN    97
#define MAX_LETRA_MIN    122

char getch ( );
void validar_letras (char *);
void validar_numeros (int *);

int main (void)
{

   char buffer[TAM];
   int numero;
   
   printf ( "ingrese una cadena: " );
   validar_letras (buffer);
   
   printf ( "\nla cadena ingresada es: %s\n", buffer );
   
   setbuf (stdin, NULL);
   
   printf ( "Ingrese un numero: " );
   validar_numeros ( &numero );
       
   printf ( "\nEl numero ingresado es: %d\n", numero );
 
   return 0;

}

void validar_numeros (int *numero)
{
   int i;
   char p[TAM], tecla;

   /*importante inicializar los valores
   ya que la implementacion que sigue lo amerita*/
   i = 0;
   p[0] = '\0';

   do
   {
       tecla = getch ();//atrapa un caracter sin dejar un eco

       /*BACKSPACE es la tecla para eliminar un caracter
       y el i obligaotiamente tiene que ser mayor que cero
       ya que si entra al if y tiene valor cero, el valor de i
       decrementará y p tendría un subindice -1, "p[-1]"¿?*/
       if ( i > 0 && tecla == BACKSPACE )
       {
           printf ( "\b \b" );
           p[--i] = '\0';
       }
       else
       {
           /*rango de numeros y SPACE es el espacio*/
           if ( (tecla >= MIN_NUM && tecla <= MAX_NUM)  ||
                 tecla == SPACE || tecla == '-' )
           {
               /*obligamos a que no hayan mas de un guion, y que
               el guion este al principio*/
               if ( tecla == '-' && i == 0 )
               {
                   printf ( "%c", tecla );
                   p[i++] = tecla;
               }
               else
               {
                   if ( tecla != '-' )
                   {
                       printf ( "%c", tecla );
                       p[i++] = tecla;
                   }
               }
           }
       }
   } while ((tecla != NEWLINE || p[0] == '\0') && i < TAM);
   /* NEWLINE inidica el Enter, i tiene que ser menor
   que TAM pues de lo contrario, estaría accediendo
   a memoria no reservada*/
   p[i] = '\0'; /*colocamos el fin de cadena*/
   *numero = atoi (p);
   /*convierte una cadena en un numero
   10 quiere decir que está en base decimal*/

   return ;
}

void validar_letras (char *p)
{
   int i;
   char tecla;

   /*importante inicializar los valores
   ya que la implementacion que sigue lo amerita*/
   i = 0;
   p[0] = '\0';

   do
   {
       tecla = getch ();//atrapa un caracter sin dejar un eco

       /*BACKSPACE es la tecla para eliminar un caracter o de retroceso
       y el i obligaotiamente tiene que ser mayor que cero
       ya que si entra al if y tiene valor cero, el valor de i
       decrementará y p tendría un subindice -1, "p[-1]"¿?*/
       if ( i > 0 && tecla == BACKSPACE )
       {
           printf ( "\b \b" );
           p[--i] = '\0';
       }
       else
       {
           /*rango de letras mayusculas y minusculas y SPACE es el espacio*/
           if ( (tecla >= MIN_LETRA_MAY && tecla <= MAX_LETRA_MAY)  ||
                (tecla >= MIN_LETRA_MIN && tecla <= MAX_LETRA_MIN)  ||
                 tecla == SPACE )
           {
               printf ( "%c", tecla );
               p[i++] = tecla;
           }
       }
   } while ((tecla != NEWLINE || p[0] == '\0') && i < TAM);
   /* NEWLINE inidica el Enter, i tiene que ser menor
   que TAM pues de lo contrario, estaría accediendo
   a memoria no reservada*/

   p[i] = '\0'; /*colocamos el fin de cadena*/

   return ;
}

#ifdef WIN32

char getch ( )
{
   char car;
   DWORD leidos, modo;

   GetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), &modo );
   SetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), modo &
                    !ENABLE_ECHO_INPUT & !ENABLE_PROCESSED_INPUT );
   ReadConsole ( GetStdHandle (STD_INPUT_HANDLE), &car, 1, &leidos, NULL );
   SetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), modo );
   return car;  
}

#else

char getch ( )
{

   struct termios _ter, fuente;
   char car;
 
   if ( tcgetattr (fileno(stdin), &_ter) )
   {
       perror ( "Error para obtener información\n" );
       return -1;
   }
 
   fuente = _ter;
 
   _ter.c_lflag &= ~ICANON;
   _ter.c_lflag &= ~ECHO;
   _ter.c_cc[VMIN] = 1;
   _ter.c_cc[VTIME] = 0;
 
   if ( tcsetattr (fileno(stdin), TCSANOW, &_ter) )
   {
       perror ( " Error para obtener información\n" );
       return -1;
   }
 
   car = getchar ( );

   if ( tcsetattr (fileno(stdin), TCSANOW, &fuente) )
   {
       perror ( "Error para obtener información" );
       return -1;
   }
 
   return car;
}
#endif



ojalá le sirva a alguien.

PD: este code lo publiqué en otro lado, por cualquier cosa.

saludos!



#15
Hola: bienvenido al foro. mira, te cuento

Cita de: NeoB en 16 Enero 2012, 21:27 PM


/*Creo que aquí me da el error con "strcpy(&argumento1, argv[1]);" y con otros...*/
if (argumento1=="--help")
{
printf("En construcción.\n");
}


¿Alguien me da la forma de copiar argv[1] en argumento1? Gracias de antemano.

lo que recibe strcpy es una dirección, argumento1 ya es una dirección, asi que no hagas esto "&argumento1". Lo otro, es que argumento1 no tiene memoria reservada, asi que no puedes copiar dentro de esa funcion una cadena determinada.

asi tiene que quedar:


if ( (argumento1  = (char *)malloc (TAM*sizeof (char))) == NULL )
{
   printf ( "Error, no puso asignar memoria\n" );
   return -1;
}

strcpy(argumento1, argv[1]);


Tampoco puedes comparar cadenas de forma directa

if (argumento1=="--help")

tienes que hacerlo con una función que no es para nada dificil de implementar, o simplemente usar la funcion de la string.h llamada strcmp() para hacer comparaciones de cadenas

Yo en particular, compararía la cadena directamente sin necesidad de malgastar memoria, pero supongo que es cosa de gustos.

acá te dejo el codigo:


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define TAM 20

int main(int argc, char *argv[])
{
   char *argumento1;
   
   if ( argc != 2 )
   {
       printf ( "ERROR: debe ingresar un parametro, pida ayuda al comando help\n" );
       printf ( "Ej: c:\\programa.exe --help\n" );
       return -1;
   }
   
   if ( (argumento1  = (char *)malloc (TAM*sizeof (char))) == NULL )
   {
       printf ( "Error, no puso asignar memoria\n" );
       return -1;
   }
   
   //funcion que copia la cadena de argv[1] y lo deja en argumento1
   strcpy (argumento1, argv[1]);
   
   //funcion que compara cadenas
   if ( !strcmp (argumento1,"--help") )
   {
       printf("En construcción.\n");
   }
   return 0;
}


#16
Una manera de validar bien mis entradas de datos,  y que me gusta muchisimo, es:


#include <stdio.h>
#include <windows.h>

#define TAM 10

void validar_letras (char *p);
char getch ( );

int main ()
{
   char buffer[TAM];
   
   printf ( "ingrese cadena: " );
   validar_letras (buffer);
   
   printf ( "\n%s", buffer );
   
   setbuf (stdin, NULL);
   getchar ();
   return 0;
}

void validar_letras (char *p)
{
   int i;
   char tecla;
   
   /*importante inicializar los valores
   ya que la implementacion que hice lo amerita*/
   i = 0;
   p[0] = '\0';
   
   do
   {
       tecla = getch ();//atrapa un caracter sin dejar un eco
       
       /*8 es la tecla para eliminar un caracter
       y el i obligaotiamente tiene que ser mayor que cero
       ya que si entra al if y tiene valor cero, el valor de i
       decrementará y p tendría un subindice -1, "p[-1]"¿?*/
       if ( i > 0 && tecla == 8 )
       {
           printf ( "\b \b" );
           p[--i] = '\0';
       }
       else
       {
           /*rango de letras mayusculas y minusculas y 32 es el espacio*/
           if ( (tecla >= 65 && tecla <= 95)  ||
                (tecla >= 97 && tecla <= 122) ||
                 tecla == 32 )
           {
               printf ( "%c", tecla );
               p[i++] = tecla;
           }
       }
   } while ((tecla != 13 || p[0] == '\0') && i < TAM);
   /* 13 inidica el Enter, i tiene que ser menor
   que TAM pues de lo contrario, estaría accediendo
   a memoria no reservada*/
   
   p[i] = '\0'; /*colocamos el fin de cadena*/
   
   return ;
}

char getch ( )
{
   char car;
   DWORD leidos, modo;
   
   GetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), &modo );
   SetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), modo &
                    !ENABLE_ECHO_INPUT & !ENABLE_PROCESSED_INPUT );
   ReadConsole ( GetStdHandle (STD_INPUT_HANDLE), &car, 1, &leidos, NULL );
   SetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), modo );
   return car;  
}


Para que decir con los numeros, es lo mismo.

saludOS!
#17
Que bueno que te haya servido mi ayuda!

saludOS
#18
Te arreglé un poco el codigo. Pero vas a tener que validar otras cosas, como por ejemplo. que cuando te pida el dia. colocas dia 30, despues te pide el mes, y colocas por ejemplo el mes 2, que quiere decir el mes de febrero que tiene 28 dias, tiene que indicarte un error, que te vuelva a pedir el dato. Eso es trabajo tuyo, no es dificil de arreglar ese detalle.


#include <stdlib.h>
#include <stdio.h>

int main ()
{
    int n, d, i, transcurridos, restantes;
    int dias[] = {
        31, 28, 31, 30,
        31, 30, 31, 31,
        30, 31, 30, 31
    };
   
    /*inicialiso los valores para hacer operaciones aritmeticas*/
    transcurridos = 0;
    restantes     = 0;
   
    do
    {
        printf ( "Elige un dia del 1 al 31: " );
        scanf ( "%d", &d );
    } while ( d < 1 || d > 31 );
   
    do
    {
        printf ( "Elige un mes del 1 al 12: " );
        scanf ( "%d", &n );
    } while ( n < 1 || n > 12 );

    /*sumo hasta el mes anterior y le sumo la cantidad de dias
    transcurridos*/
    for ( i = 0; i < (n - 1); i++ )
    {
        transcurridos += dias[i];// No existe el dia cero
    }
   
    transcurridos += d;
    restantes = (365 - transcurridos);
   
    printf ( "Dias restantes: %d\n", restantes );
    system ( "pause>nul" );
   
    return 0;
}



saludos!
#19
Scripting / Re: Expresion regular en Perl
11 Enero 2012, 21:16 PM
Cita de: xD4RIOx en 11 Enero 2012, 20:44 PM
PD: La fuente por excelencia para hablar de expresiónes de Perl es el perlretut, la documentación oficial de perldoc. La referencia a esto sería esta

Saludos

Gracias por el dato.

saludOS!
#20
Scripting / Re: Expresion regular en Perl
11 Enero 2012, 19:49 PM
Cita de: xD4RIOx en 11 Enero 2012, 17:41 PM

La otra expresión:
Código (perl) [Seleccionar]
if ($nombre =~ m/[^ab]/ | $nombre =~ m/^$/) lo que hace es verificar que la cadena EMPIECE por 'a' o 'b', pero dará como válido cosas como 'astilla' o 'barco'.

Saludos


C:\>validar.pl
Ingrese nombre de usuario: barco
No pertenece al lenguaje

C:\>validar.pl
Ingrese nombre de usuario: astilla
No pertenece al lenguaje

C:\>


Lo que dice acá if ($nombre =~ m/[^ab]/ | $nombre =~ m/^$/) es que si encuentra una letra que sea diferende de 'a' ó 'b', o si hay una cadena vacia, que entre al if() de lo contrario, que entre al else, entrando al else me dice que si pertenece al lenguaje. Y los resultados con w = "astilla" y w = "barco", no es cierto de que me da como si perteneciera al lenguaje.

Y lo de la m, ya habia comentado de que no era necesario usarlo, pero no sabia porque, gracias por aclarar eso.

PD:

[^\@ \t] busca cualquier carácter que no sea un @, una tabulación o un espacio. Hay que señalar que \ delante de @ es opcional, ya que el símbolo @ no tiene significados particulares en este contexto, pero funciona también con \@

[^]    indica un conjunto de caracteres que no pueden aparecer

Fuente:

     URL

     URL



saludos!