|
Mostrar Mensajes
|
Páginas: 1 [2] 3 4
|
11
|
Programación / Programación C/C++ / chat con hilos + winsock en C
|
en: 24 Enero 2012, 20:58 pm
|
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!
|
|
|
13
|
Programación / Programación C/C++ / Re: Suma triangulo superior matriz
|
en: 22 Enero 2012, 20:52 pm
|
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?: " ); } while (t < 0 || t > MAX); leer_matriz (v, t); triangulo_superior (v, t); 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++) } } 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
|
Programación / Programación C/C++ / validacion de datos en C + getch() en windows y linux sin conio
|
en: 17 Enero 2012, 16:11 pm
|
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 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 ); 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 ) { 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 ) { p[i++] = tecla; } else { if ( 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*/ /*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 ) { 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 ) { 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 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 { 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; } 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
|
Programación / Programación C/C++ / Re: Problema la copiar cadena con strcpy
|
en: 16 Enero 2012, 22:37 pm
|
Hola: bienvenido al foro. mira, te cuento /*Creo que aquí me da el error con "strcpy(&argumento1, argv[1]);" y con otros...*/ if (argumento1=="--help") { }
¿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; }
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 //funcion que compara cadenas if ( !strcmp (argumento1 ,"--help") ) { } return 0; }
|
|
|
16
|
Programación / Programación C/C++ / Re: validar texto y numero!! Turbo c++
|
en: 16 Enero 2012, 17:55 pm
|
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); int main () { char buffer[TAM]; printf ( "ingrese cadena: " ); validar_letras (buffer); 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 ) { 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 ) { 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 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!
|
|
|
18
|
Programación / Programación C/C++ / Re: Calcular días que quedan hasta final de año
|
en: 15 Enero 2012, 20:14 pm
|
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: " ); } while ( d < 1 || d > 31 ); do { printf ( "Elige un mes del 1 al 12: " ); } 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 ); return 0; }
saludos!
|
|
|
20
|
Programación / Scripting / Re: Expresion regular en Perl
|
en: 11 Enero 2012, 19:49 pm
|
La otra expresión: 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!
|
|
|
|
|
|
|