elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


  Mostrar Mensajes
Páginas: 1 ... 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 [133] 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 ... 160
1321  Programación / Programación C/C++ / Re: Problema con un Do While simple. en: 2 Febrero 2012, 00:22 am
Tanto getchar (estándar) como getch (extensión) retornan un carácter. Tu la estas utilizando para generar una pausa que, siendo estrictos, no es parte del programa (es mas bien una deficiencia del IDE que utilizas).

Un saludo
1322  Programación / Programación C/C++ / Re: Presentación + dudas de principiante en: 2 Febrero 2012, 00:16 am
Como ya se comento vamos a suponer que Programador91 esta aprendiendo C o C++.

En ese caso lo mejor es continuar aprendiendo este en su forma estándar ya que así lo aprendido esta garantizado a funcionar correctamente sin importar el compilador y SO utilizado.

Una vez lo domines (me refiero a Programador91) pasas a las extensiones del lenguaje como es el caso con las dimensiones de la consola.

Un saludo
1323  Programación / Programación C/C++ / Re: Problema con un Do While simple. en: 1 Febrero 2012, 17:08 pm
Si apenas empiezas tu aprendizaje en el lenguaje C evita el uso de conio de Borland, mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

Lo que indicas es normal, la consola tiene un buffer finito y solo puede almacenar (y presentar) un numero determinado de lineas.

Un saludo
1324  Programación / Programación C/C++ / Re: Como se hace para poner colores de fondo en los programas, cambiar la letra,etc. en: 1 Febrero 2012, 14:04 pm
No. Antes de utilizar la función "system" se debe incluir el encabezado <stdlib.h>.

Un saludo
1325  Programación / Programación C/C++ / Re: Duda stdarg.h en C en: 1 Febrero 2012, 02:38 am
No es necesario publicar el contenido del encabezado, en su lugar es mejor revisar un buen libro.

Un programa sencillo de ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdarg.h>
  4.  
  5. void fn(char const *texto, int num_args, ...);
  6.  
  7. int main(void)
  8. {
  9.   fn("Un argumento sin nombre", 1, 1);
  10.   fn("Dos argumentos sin nombre", 2, 1, 2);
  11.   fn("Tres argumentos sin nombre", 3, 1, 2, 3);
  12.  
  13.   return EXIT_SUCCESS;
  14. }
  15.  
  16. void fn(char const *texto, int num_args, ...)
  17. {
  18.   int i;
  19.   va_list lista; /* 1 */
  20.  
  21.   va_start(lista, num_args); /* 2 */
  22.  
  23.   printf("%s:", texto);
  24.  
  25.   for (i = 0; i < num_args; i++)
  26.      printf(" %d", va_arg(lista, int) /* 3 */);
  27.   putchar('\n');
  28.  
  29.   va_end(lista); /* 4 */
  30. }

Los pasos son:

1) Declaras un objeto de tipo "va_list".

2) Ejecutas la macro "va_start" indicando el objeto declarado en el paso 1 y el ultimo parámetro con nombre (en este caso "num_args").

3) Cada vez que debas procesar uno los argumentos utilizas la macro "va_arg" indicando el objeto declarado en el paso 1 y el tipo del objeto esperado (en nuestro caso siempre es de tipo "signed int").

4) Una vez que termines de procesarlos ejecutas la macro "va_end".

Un saludo
1326  Programación / Programación C/C++ / Re: [Ayuda] Tabla de Temperatura en C en: 31 Enero 2012, 19:13 pm
El problema es el punto y coma justo despues del bucle for:
Código
  1. for(fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP); /* <== */
  2. printf("%3d%6.1f\n", fahr,(5.0/9.0)*(fahr-32));

Cambialo a:
Código
  1. for(fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP)
  2.   printf("%3d%6.1f\n", fahr,(5.0/9.0)*(fahr-32));

Un saludo
1327  Programación / Programación C/C++ / Re: Duda stdarg.h en C en: 31 Enero 2012, 16:56 pm
En C estándar no puedes definir la función principal de esa forma, debe ser "int main(int argc, char **argv) ...", "int main(void) ..." o equivalentes.

Mejor explica de una forma clara lo que debes hacer. Supongo es procesar los argumentos pasados a tu programa mediante la linea de comandos o bien crear un programa con una función (similar a printf/scanf) que reciba un numero variable de argumentos.

Un saludo
1328  Programación / Programación C/C++ / Re: Filtro para mensajes? en: 30 Enero 2012, 23:51 pm
Ya se que existen esas funciones rir3760, pero prefiero no acostumbrarme a no usarlas, ya que son vulnerables a los desbordamientos del buffer (y porque me gusta hacerme mis propias funciones xD).
Siendo muy estrictos (lease pedantes) la única función totalmente insegura es "gets". Las demás pueden serlo (o no) dependiendo del contexto. Por ejemplo imagina que desarrollas un procesador de texto (un filtro) y controlas la entrada. En un caso así no hay problema si utilizas funciones como strcpy y strcat.


Además me divertí rompiendome la cabeza para encontrar el algoritmo de busqueda, usando esas funciones no habría sido lo mismo
Si es por diversión, adelante.

Pero siempre sin "perder de vista" que alguien mas (usualmente mas entendido en el tema) ha trabajado con la función y su operación eficiente, por ejemplo utilizando un algoritmo como Booyer-More.


rir3760, eso es C++?
No. Es C según su (por desgracia todavía) estándar de facto (C90).

Un saludo
1329  Programación / Programación C/C++ / Re: Array de punteros. en: 30 Enero 2012, 15:47 pm
Ese programa tiene varios errores. Lo primero es evitar el uso de la función "gets", mas información en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Si apenas empiezas con el tema de punteros deberías conseguir un buen libro sobre el tema, uno muy bueno pero en ingles y algo caro es:

Pointers on C, 1st edition
Kenneth Reek
Addison Wesley
ISBN: 0673999866

Es un libro enfocado en C estándar (C90) con especial énfasis en el tema de manejo de direcciones de memoria (punteros). Comparado con K&R2 lo bueno es que tiene explicaciones mas detalladas (incluyendo gráficas), lo malo es que su selección de ejemplos no es tan buena como el mencionado.

El primer error importante es utilizar la variable "orden" sin darle un valor antes. Debido a que su valor inicial (a falta de uno) es no definido o "basura" no lo puedes utilizar (debes utilizar antes malloc o bien cambiar su uso por un array).

También hay que utilizar nombres claros y descriptivos, por ejemplo para encontrar el uso (y diferencias) entre "aux" y "aux1" hay que revisar en detalle el programa. Mejor acostúmbrate desde ahora.

Tampoco puedes utilizar esto:
Código
  1. printf("1: %s\n", aux[0]);
  2. printf("2: %s\n", aux[1]);
Porque los objetos "aux[N]" son de tipo "char **" mientras que printf espera un "char *".

Si entiendo correctamente buscas obtener las direcciones de cada una de las palabras. Para ello hay varias formas como utilizar strcspn + strspn, sscanf, etc.

Un ejemplo utilizando el par strcspn + strspn:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(void)
  6. {
  7.   char linea[] = "    Esta  es  la  cadena  de  prueba    ";
  8.   char *palabra[100]; /* O algun valor apropiado */
  9.   int longitud[100]; /* O algun valor apropiado */
  10.   int num_palabras;
  11.  
  12.   char *p;
  13.   int i;
  14.  
  15.   p = linea;
  16.   num_palabras = 0;
  17.   i = strspn(p, " ");
  18.   while (p[i] != '\0'){
  19.      /* Almacenamos la direccion de la palabra */
  20.      p += i;
  21.      palabra[num_palabras] = p;
  22.  
  23.      /* Obtenemos su longitud */
  24.      longitud[num_palabras] = strcspn(p, " ");
  25.  
  26.      /* Actualizamos los contadores */
  27.      p += longitud[num_palabras];
  28.      num_palabras++;
  29.  
  30.      /* Pasamos a la siguiente ... */
  31.      i = strspn(p, " ");
  32.   }
  33.  
  34.   for (i = 0; i < num_palabras; i++)
  35.      printf("palabra[%d] == \"%.*s\"\n", i, longitud[i], palabra[i]);
  36.  
  37.   return EXIT_SUCCESS;
  38. }

----

Edito:

Otra opción es mediante la función sscanf utilizando el especificador "%n" el cual nos da el numero de caracteres coincidentes hasta el momento:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char linea[] = "    Esta  es  la  cadena  de  prueba    ";
  7.   char *palabra[100]; /* O algun valor apropiado */
  8.   int longitud[100]; /* O algun valor apropiado */
  9.   int num_palabras;
  10.   int i;
  11.  
  12.   char *p;
  13.   char aux[100];
  14.   int num_chars;
  15.   int num_spc;
  16.  
  17.   p = linea;
  18.   num_palabras = 0;
  19.   while (sscanf(p, " %n%s%n", &num_spc, aux, &num_chars) == 1){
  20.      /* Almacenamos la direccion de la palabra */
  21.      palabra[num_palabras] = p + num_spc;
  22.      longitud[num_palabras] = num_chars - num_spc;
  23.      num_palabras++;
  24.  
  25.      /* Pasamos a la siguiente ... */
  26.      p += num_chars;
  27.   }
  28.  
  29.   for (i = 0; i < num_palabras; i++)
  30.      printf("palabra[%d] == \"%.*s\"\n", i, longitud[i], palabra[i]);
  31.  
  32.   return EXIT_SUCCESS;
  33. }

Un detalle: funciona correctamente con GCC 3.x pero, por alguna extraña razón, no da los resultados correctos con Lcc-Win32 (debería darlos ya que hasta donde revise la documentación el comportamiento debe ser el esperado).

Un saludo
1330  Programación / Programación C/C++ / Re: Diferencias en el código fuente C y C++ en: 28 Enero 2012, 03:46 am
Algunos detalles a considerar sobre el programa en C ...

* Si solo vas a imprimir una cadena literal terminada con '\n' utiliza la función "puts" en lugar de "printf".

* Procesas el caso especial dentro del bucle, si vas a hacerlo hazlo afuera ya que en cada iteracion se debe verificar si la variable es mayor que uno.

* Si lo piensas un poco no es necesaria esa verificación.

El programa modificado es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.   int num;
  7.   int i;
  8.   int j;
  9.   long fact;
  10.  
  11.   do {
  12.      scanf("%d", &num);
  13.      if (num < 0)
  14.         puts("El numero es incorrecto!");
  15.   }while (num < 0);
  16.  
  17.   for (i = 0; i <= num; i++){
  18.      fact = 1;
  19.      for (j = i; j > 1; j--)
  20.         fact *= j;
  21.  
  22.      printf("%2d! = %ld\n", i, fact);
  23.   }
  24.  
  25.   return EXIT_SUCCESS;
  26. }

* En cuanto al tamaño de los ejecutables es una pregunta frecuente, puedes empezar revisando los temas en este foro sobre "reducir el tamaño del ejecutable", también puedes revisar la FAQ de C++ (en ingles, utiliza Google).

* Los rangos máximos dependen del compilador, ellos se definen en los encabezados <limits.h> y <float.h>.

* El tipo "long long" se agrego con el estándar C99.

Un saludo
Páginas: 1 ... 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 [133] 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 ... 160
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines