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

#1321
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
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
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
No. Antes de utilizar la función "system" se debe incluir el encabezado <stdlib.h>.

Un saludo
#1325
Programación C/C++ / Re: Duda stdarg.h en C
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:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

void fn(char const *texto, int num_args, ...);

int main(void)
{
   fn("Un argumento sin nombre", 1, 1);
   fn("Dos argumentos sin nombre", 2, 1, 2);
   fn("Tres argumentos sin nombre", 3, 1, 2, 3);
   
   return EXIT_SUCCESS;
}

void fn(char const *texto, int num_args, ...)
{
   int i;
   va_list lista; /* 1 */
   
   va_start(lista, num_args); /* 2 */
   
   printf("%s:", texto);
   
   for (i = 0; i < num_args; i++)
      printf(" %d", va_arg(lista, int) /* 3 */);
   putchar('\n');
   
   va_end(lista); /* 4 */
}


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
El problema es el punto y coma justo despues del bucle for:
for(fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP); /* <== */
printf("%3d%6.1f\n", fahr,(5.0/9.0)*(fahr-32));


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


Un saludo
#1327
Programación C/C++ / Re: Duda stdarg.h en C
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
Cita de: Fastolfe en 30 Enero 2012, 20:17 PMYa 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.


Cita de: Fastolfe en 30 Enero 2012, 20:17 PMAdemá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.


Cita de: Fastolfe en 30 Enero 2012, 20:17 PMrir3760, eso es C++?
No. Es C según su (por desgracia todavía) estándar de facto (C90).

Un saludo
#1329
Programación C/C++ / Re: Array de punteros.
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:
printf("1: %s\n", aux[0]);
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:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
  char linea[] = "    Esta  es  la  cadena  de  prueba    ";
  char *palabra[100]; /* O algun valor apropiado */
  int longitud[100]; /* O algun valor apropiado */
  int num_palabras;
 
  char *p;
  int i;
 
  p = linea;
  num_palabras = 0;
  i = strspn(p, " ");
  while (p[i] != '\0'){
     /* Almacenamos la direccion de la palabra */
     p += i;
     palabra[num_palabras] = p;
     
     /* Obtenemos su longitud */
     longitud[num_palabras] = strcspn(p, " ");
     
     /* Actualizamos los contadores */
     p += longitud[num_palabras];
     num_palabras++;
     
     /* Pasamos a la siguiente ... */
     i = strspn(p, " ");
  }
 
  for (i = 0; i < num_palabras; i++)
     printf("palabra[%d] == \"%.*s\"\n", i, longitud[i], palabra[i]);
 
  return EXIT_SUCCESS;
}


----

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:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char linea[] = "    Esta  es  la  cadena  de  prueba    ";
   char *palabra[100]; /* O algun valor apropiado */
   int longitud[100]; /* O algun valor apropiado */
   int num_palabras;
   int i;
   
   char *p;
   char aux[100];
   int num_chars;
   int num_spc;
   
   p = linea;
   num_palabras = 0;
   while (sscanf(p, " %n%s%n", &num_spc, aux, &num_chars) == 1){
      /* Almacenamos la direccion de la palabra */
      palabra[num_palabras] = p + num_spc;
      longitud[num_palabras] = num_chars - num_spc;
      num_palabras++;
     
      /* Pasamos a la siguiente ... */
      p += num_chars;
   }
   
   for (i = 0; i < num_palabras; i++)
      printf("palabra[%d] == \"%.*s\"\n", i, longitud[i], palabra[i]);
   
   return EXIT_SUCCESS;
}


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
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:
#include <stdio.h>
#include <stdlib.h>

int main()
{
   int num;
   int i;
   int j;
   long fact;
   
   do {
      scanf("%d", &num);
      if (num < 0)
         puts("El numero es incorrecto!");
   }while (num < 0);
   
   for (i = 0; i <= num; i++){
      fact = 1;
      for (j = i; j > 1; j--)
         fact *= j;
         
      printf("%2d! = %ld\n", i, fact);
   }
   
   return EXIT_SUCCESS;
}


* 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