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

#1541
Programación C/C++ / Re: [C]isNumeric (VB6 a C)
19 Agosto 2011, 17:55 PM
En el caso de C y si la intención es validar solo tipos enteros se puede utilizar la función strtol (prototipo en <stdlib.h>) dejando a esta la mayor parte del trabajo. Por ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <limits.h>
#include <errno.h>

#define NUM_CHARS 256

int validar_int(char const *linea, int *num);

int main(void)
{
   char linea[NUM_CHARS];
   int num;
   
   printf("Introduce un numero entero (signed int): ");
   fflush(stdout);
   if (fgets(linea, NUM_CHARS, stdin) == NULL)
      return EXIT_FAILURE;
   
   if (validar_int(linea, &num))
      printf("OK. El numero es %d\n", num);
   else
      puts("Error!");
   
   return EXIT_SUCCESS;
}


int validar_int(char const *linea, int *num)
{
   char *ch;
   long res;
   
   /* Descartamos el ultimo error y tratamos de convertir la linea */
   errno = 0;
   res = strtol(linea, &ch, 0);
   
   /* A continuacion verificamos ... */
   
   /* ... si al menos un caracter pudo convertirse con exito */
   if (res == 0 && ch == linea)
      return 0;
   
   /* ... si el numero esta en el rango valido (signed long) */
   if (errno == ERANGE && (res == LONG_MAX || res == LONG_MIN))
      return 0;
   
   /* ... si el resto de la linea es espacio blanco */
   while (isspace(*ch))
      ch++;
   if (*ch != '\0')
      return 0;
   
   /* ... si el numero esta en el rango valido (signed int) */
   if (res > INT_MAX || res < INT_MIN)
      return 0;
   
   /* Si todo se cumple el numero introducido es valido */
   *num = res;
   
   return 1;
}


Para números de tipo flotante se puede tomar una aproximación similar utilizando strtod (prototipo tambien en <stdlib.h>).

Un saludo
#1542
Así es muy difícil ayudarte salvo utilizando la bola de cristal o, mejor todavía, la mascara vudú y la gallina.

Publica el código fuente completo de tu programa y lo revisamos.

Un saludo
#1543
Programación C/C++ / Re: matriz
19 Agosto 2011, 17:35 PM
Código anterior de Valkyr:
int n1, n2, i, j;

printf ("Ingrese el numero de columnas de la matriz:");
scanf ("%d", &n1);
printf ("Ingrese el numero de filas de la matriz:");
scanf ("%d", &n2);

int matriz[n1][n2];
//Leer numeros y almacenarlos en la matriz
for (i = 0; i < n1; i++)
{
   for (j = 0; j < n2; j++) {
      scanf ("%d", &matriz[i][j]);
   }
}

//Mostrarla por pantalla
for (i = 0; i < n1; i++)
{
   for (j = 0; j < n2; j++) {
      printf ("%d |", matriz[i][j]);
   }
}


Cita de: Valkyr en 16 Agosto 2011, 02:21 AMEl código que puse anteriormente es correcto (o al menos, eso creo porque he usado más C++ que C). Lo he compilado (completando el código ya que falta incluir la librería, declarar el método main y return 0) y ha compilado perfectamente. Lo he ejecutado y el resultado que ha mostrado es el correcto.
Si y No.

En el estándar de facto de C (ISO C90) y C++ solo se puede indicar el numero de elementos de un array mediante una constante entera mayor que cero.

En el caso del nuevo estándar de C (ISO C99) si es posible pero este no tiene, ni de lejos, el soporte que si tiene C90.

Un saludo
#1544
Programación C/C++ / Re: Podeis ayudarme?
19 Agosto 2011, 17:25 PM
Cierto, ese programa solo calcula la suma de los valores inicial y final mas tres. También tendríamos que preguntarnos si no le estamos haciendo la tarea al OP (quien inicio el tema).

Para la operación basta con un bucle donde cada uno de los números se agregue a un acumulador, mas o menos así:
Código (cpp) [Seleccionar]
long total = 0;
for (int i = inicio; i <= fin; i++)
  total += i;

// ...


Un saludo
#1545
En esas dos funciones tienes el mismo error que ya te indicaron (debes indicar el indice del elemento al cual quieres acceder).

Un saludo
#1546
Programación C/C++ / Re: dudita con cadena
19 Agosto 2011, 05:39 AM
Una forma ligeramente distinta es utilizando sprintf para generar el mensaje. También puedes revisar la documentación de "strftime" si necesitas imprimir una cadena tomando en consideración el año, mes, etc.

Un ejemplo de la primera forma es:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

int main(void)
{
   char mensaje[100 /* Por decir algo*/];
   time_t a;
   time_t b;
   int i;
   
   time(&a);
   
   for (i = 0; i < 3; i++)
      MessageBox(NULL, "Click aqui", "", MB_OK);

   time(&b);
   sprintf(mensaje, "%d segundos", (int) difftime(b, a));
   MessageBox(NULL, mensaje, "Felicidades duraste", MB_OK);

   return EXIT_SUCCESS;
}


Y un ejemplo sencillo de la segunda (C estándar) es:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define LONG_CADENA 128

int main(void)
{
   time_t t1;
   struct tm *t2;
   char cadena[LONG_CADENA];
   
   /* 1) Obtener la fecha actual ('time_t') */
   if ((t1 = time(NULL)) == (time_t) -1)
      return EXIT_FAILURE;
   
   /* 2) Obtener la fecha actual ('struct tm *') */
   t2 = localtime(&t1);
   
   /* Imprimir la fecha "manualmente" mediante printf */
   printf("%d/", t2->tm_year + 1900);
   printf("%02d/", t2->tm_mon + 1);
   printf("%02d\n", t2->tm_mday);
   
   /* Construir la fecha mediante strftime */
   strftime(cadena, LONG_CADENA, "%Y/%m/%d", t2);
   printf("%s\n", cadena);
   
   return EXIT_SUCCESS;
}


Un saludo
#1547
La forma "políticamente correcta" es <N> ya que así las facilidades cortesía de ese encabezado se colocan en el nombre de espacios estándar "std", para acceder a ellos se utiliza el nombre compuesto "std::X", "std::Y", etc. o bien directivas "using" para incluir en el nombre de espacios global solo los nombres necesarios.

La forma <N.h> es equivalente a:
Código (cpp) [Seleccionar]
#include <N>
using namespace::std;

Con la desventaja de que todos los nombres cortesía de la inclusión ahora están en el nombre de espacios global lo que abre la puerta al conflicto de nombres (y la razón de los nombres de espacios es justamente eso: evitarlos).

Un saludo
#1548
Cita de: Triper0 en 15 Agosto 2011, 15:15 PM
No, no... Como bien dije, es una convención, es para que el código sea mas legible.
Sin duda que no va a dar error, pero bueno... A mi en su momento me lo dijeron y yo te lo trasmito a vos :P
Es mejor evitar nombres que inician con ese carácter ya que en C los nombres que inician con un guion bajo están reservados, eso significa que si ocurre un error (conflicto de nombres) con, por ejemplo, "__FILE__" o "__STDC__" la culpa es nuestra.

Un saludo
#1549
La solucion exacta depende, principalmente, de los requisitos de validacion del algoritmo.

Por ejemplo si se espera, de facto, que la entrada sea valida consistiendo de un numero sin signo y posiblemente con decimales basta con:
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
   int ch;
   int num_digitos;
   
   num_digitos = 0;
   while ((ch = getchar()) >= '0' && ch <= '9' || ch == '.')
      num_digitos++;
   
   printf("Numero de digitos: %d\n", num_digitos);

   return EXIT_SUCCESS;
}


Pero si se requiere de una validacion mas solida lo mejor es crear una pequeña maquina de estado.

Un saludo
#1550
Cita de: r0rx en 18 Agosto 2011, 01:55 AM
Bueno estoy comenzando a aprender a manejar C y he estado haciendo algunos códigos, así que aquí les dejo un pequeño código que hice para revertir el orden de una cadena.

char * Revertir(char *Cadena, int tam)
{

int i;
char *tmp;

tmp = (char*)malloc(tam);

for (i = tam - 1; i >= 0; i--)
{
tmp[(tam-1)-i] = Cadena[i];
}

tmp[tam] = '\0';

return tmp;
}

En la función tienes un error al reservar memoria para "tam" caracteres ya que falta espacio para un carácter (para el '\0'), aparte de eso no es necesaria la conversión explicita.

Con la corrección mas algunos cambios (todos ellos menores):
char *invertir(char const *cad, int num_chars)
{
   char *tmp;
   int i;
   
   tmp = malloc(num_chars + 1);
   
   for (i = 0; i < num_chars; i++)
      tmp[i] = cad[num_chars - 1 - i];
   tmp[i] = '\0';
   
   return tmp;
}



----


Cita de: escabe en 18 Agosto 2011, 10:23 AM
¿Y por qué no usar ANSI C?

char *strrev(char *s);
Esa función no es parte de la biblioteca estándar de C.


----


Cita de: BlackZeroX?????? en 19 Agosto 2011, 00:13 AM
Cita de: Queta en 18 Agosto 2011, 20:17 PM
¿Y el porqué de esta macro tan innecesaria?

leete esto: macros

Seria mejor evita esa macro y en su lugar utilizar el tipo "char". Ello porque en C una cadena literal como "hola, mundo" es de tipo "array N of char". Aqui el problema es: si el tipo "char" es equivalente a "signed char" o "unsigned char" depende de la implementancion.

Un saludo