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

#1171
La suma de los residuos al dividir continuamente el numero por diez no es mas que ... la suma de los dígitos del numero.

Tu programa no funciona correctamente porque en el bucle no modificas la variable "n". Cámbialo a:
Código (cpp) [Seleccionar]
while (n > 0){
   suma += n % 10;
   n /= 10;
}


Un saludo
#1172
El problema con tu programa se debe a que en cada iteracion del bucle estas asignando un nuevo valor al acumulador (la variable "suma"). Cambia el bucle a:
Código (cpp) [Seleccionar]
int suma = 0;
do {
   suma += n % 10;
}while ((n /= 10) != 0);


Un saludo
#1173
El mensaje de advertencia se genera por la linea:
}while (caract!=NULL);
Ya que (usualmente) NULL es de tipo "void *" y (en tu caso) estarias comparando un entero con un puntero.

Para que no se genere el mensaje cambia esa linea a:
}while (caract != '\0');

Un saludo
#1174
La pagina en MSDN sobre el tema que comentas es Métodos abreviados de teclado de Visual Studio. Espero te sea de utilidad.

Un saludo
#1175
Una opción similar es mediante el uso de la función "div" (prototipo en <stdlib.h> o <cstdlib>, dependiendo del caso). Ella realiza la división entera y retorna un objeto de tipo "struct div_t" con dos campos: "quot" es el cociente y "rem" el residuo.

Un ejemplo de su uso (en C) es:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
   int h;
   int m;
   int s;
   int incr;
   div_t tmp;
   
   srand((unsigned) time(NULL));
   h = rand() % 24;
   m = rand() % 60;
   s = rand() % 60;
   printf("%02d:%02d:%02d\n", h, m, s);
   
   incr = rand() % 180;
   printf("+ %d segs\n", incr);
   
   tmp = div(h * 3600 + m * 60 + s + incr, 3600);
   printf("%02d:", tmp.quot);
   tmp = div(tmp.rem, 60);
   printf("%02d:%02d\n", tmp.quot, tmp.rem);
   
   return EXIT_SUCCESS;
}


Un saludo
#1176
Programación C/C++ / Re: Problema con sprintf()
11 Octubre 2012, 16:54 PM
Revisando la función hay tres errores.

El primero es utilizar '{""}' para inicializar el array. En su lugar se debe utilizar "" o bien {'\0'}. Por ejemplo:
char packet[65536] = ""; /* "" o {'\0'}; */

El segundo es utilizar la dirección en memoria de una variable local (el array "packet") como valor de retorno de la función. Las variables locales se destruyen (la memoria utilizada por ellas se libera) justo al terminar la función. Para solucionarlo debes calificar con "static" al array o bien reservar memoria mediante la función "malloc". Un ejemplo de esto ultimo:
char *httpPacket(char *httpDatos)
{
   char *packet = malloc(65536);
   
   /* ... */


El ultimo es lógico: esperas que "sizeof(httpDatos)" resulte en el numero de caracteres de la cadena pasada como argumento. No es así, utilizar dentro de la función "sizeof(httpDatos)" es lo mismo que "sizeof(char *)" y por eso resulta en cuatro (ese es el tamaño del puntero en tu SO). La solución aquí es agregar otro parámetro y pasar "manualmente" el numero de caracteres o bien llamar a la función "strlen" para que ella haga el trabajo.

Por ultimo el error que mencionas sobre la cadena duplicada es difícil de explicar (me refiero a encontrarle una causa), te recomendaría que antes de llamar a la función verifiques el contenido de la cadena empezando por revisar que incluya el carácter terminador '\0'.

Un saludo
#1177
Programación C/C++ / Re: duda c++
11 Octubre 2012, 16:27 PM
Mensaje duplicado (Fue un "error de dedazo").
#1178
Programación C/C++ / Re: duda c++
11 Octubre 2012, 03:15 AM
Cita de: ankora45 en 10 Octubre 2012, 20:43 PMno se como hacer para que si un int te retorne char te devuelva un error en vez de un buffer overflow
Tienes que explicarte de una forma clara y precisa porque, honestamente, es difícil entender el problema.

Supongo la pregunta es: Si en un programa espero obtener un entero y en su lugar el usuario teclea una cadena no valida como "JKL", ¿Como puede detectarlo y continuar con la ejecución del programa?

Si es eso puedes primero leer una linea mediante la función "getline" y a continuación verificar si de esta se puede obtener el numero mediante un objeto de la clase "stringstream".

Un ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <string>
using std::string;

#include <sstream>
using std::stringstream;

int main()
{
   bool ok;
   
   do {
      cout << "Introduce un numero:" << endl;
      string linea;
      getline (cin, linea);
     
      stringstream aux;
      aux << linea;
     
      int numero;
      if (aux >> numero) {
         cout << "El numero es " << numero << endl;
         ok = true;
      } else
         ok = false;
   } while (!ok);
   
   return 0;
}


Editado: la explicacion estaba mal (muy mal). La cambie por una, espero, mejor.

Un saludo
#1179
Programación C/C++ / Re: Ayuda con vectores.
10 Octubre 2012, 07:19 AM
Cita de: elkiedis en 10 Octubre 2012, 04:15 AMDe todos modos rir3760, fijate que no está validando bien las sumas ni las jugadas...

Fijate en tu ejemplo:

1 2 3 4 5 6 7 8 9 10
La tirada es 7, es una jugada valida

X 2 3 4 5 X 7 8 9 10
La tirada es 9, es una jugada valida

X X 3 4 5 X X 8 9 10  // Aquí se podría tomar el 5, no necesariamente se debían sumar 2 cartas.
La tirada es 5, es una jugada NO valida
No veo el problema, eso lo indique con el comentario:
/* Cinco tiradas, solo se revisan pares de cartas */

Un saludo
#1180
Programación C/C++ / Re: Ayuda con vectores.
10 Octubre 2012, 03:20 AM
Cita de: elkiedis en  9 Octubre 2012, 04:04 AMgracias por tu ayuda! Pero el codigo que propones no tiene en cuenta si las cartas ya ha sido previamente tapadas o no...
Si toma en cuenta las cartas que ya han sido marcadas con el valor cero. Ello se realiza con la segunda condición:
(!carta[i] || !carta[j])
Si alguna de las cartas es igual a cero se pasa a revisar el siguiente par.


Si extendemos para crear un programa sencillo terminamos con:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int validar_jugada(int carta[], int tirada, int *a, int *b);

int main (void)
{
   int carta[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
   int tirada;
   int a;
   int b;
   int i;
   int j;
   
   srand((unsigned) time(NULL));
   
   /* Cinco tiradas, solo se revisan pares de cartas */
   for (i = 0; i < 5; i++){
      for (j = 1; j < 11; j++)
         if (carta[j])
            printf(" %d", carta[j]);
         else
            printf(" X");
      putchar('\n');
     
      tirada = 2 + rand() % 11;
      printf("La tirada es %d, es una ", tirada);
      if (validar_jugada(carta, tirada, &a, &b)){
         puts("jugada valida\n");
         carta[a] = carta[b] = 0;
      }else
         puts("jugada NO valida\n");
   }
   
   return EXIT_SUCCESS;
}

int validar_jugada(int carta[], int tirada, int *a, int *b)
{
   int i;
   int j;
   
   if (tirada > 9){
      i = tirada - 9;
      j = 9;
   }else {
      i = 1;
      j = tirada - 1;
   }

   while (i < j && (!carta[i] || !carta[j])){
      i++;
      j--;
   }
   if (i < j){
      *a = i;
      *b = j;
   }
   
   return i < j;
}



Y un ejemplo de su salida:
1 2 3 4 5 6 7 8 9 10
La tirada es 7, es una jugada valida

X 2 3 4 5 X 7 8 9 10
La tirada es 9, es una jugada valida

X X 3 4 5 X X 8 9 10
La tirada es 5, es una jugada NO valida

X X 3 4 5 X X 8 9 10
La tirada es 3, es una jugada NO valida

X X 3 4 5 X X 8 9 10
La tirada es 12, es una jugada valida


Un saludo