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

#971
Cita de: BatchianoISpyxolo en 14 Febrero 2013, 02:15 AMsi tienes estructuras o clases básicas (PODS), éstos carecen de inicializadores y, por tanto, el programa está mal formado.
No. Si revisamos el tema que mencione con cuidado:
CitarParagraph 5.3.4/15 states that

A new-expression that creates an object of type T initializes that object as follows:

[...]

* If the new-initializer is of the form (), the item is value-initialized (8.5)

where value initialized for POD means zero-initialize
.

[...]

If the new-initializer is omitted:

* If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is default-initialized (8.5). If T is a const-qualified type, the underlying class type shall have a user-declared default constructor.

* Otherwise, the object created has indeterminate value. If T is a const-qualified type, or a (possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of const-qualified type, the program is ill-formed;

En resumen:

* Si se utiliza el inicializador "()" en el caso de PODs su resultado es la asignación del valor 0.

* Si se omite el inicializador el valor almacenado es no determinado.

"ill-formed" solo aplica si 1) Se omite el inicializador y 2) el objeto esta calificado (directa o indirectamente) con el calificador const.

Un saludo
#972
Otra opción es utilizar la función mktime (prototipo en <time.h>) para que sea esta la que calcule el día de la semana y año. Un ejemplo sencillo:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
   char *dia[] = {
      "Domingo",
      "Lunes",
      "Martes",
      "Miercoles",
      "Jueves",
      "Viernes",
      "Sabado"
   };
   struct tm f = {0};
   
   srand((unsigned) time(NULL));
   f.tm_year = 113;
   f.tm_mon = rand() % 12;
   f.tm_mday = 1 + rand() % 28;
   
   mktime(&f);
   printf("2013/%d/%d ==> %s\n", 1 + f.tm_mon, f.tm_mday, dia[f.tm_wday]);
   
   return EXIT_SUCCESS;
}


Un saludo
#973
Cita de: BatchianoISpyxolo en 13 Febrero 2013, 22:43 PM
CitarIf T is a const-qualified type, or a (possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of const-qualified type, the program is ill-formed.
No entiendo el sentido de la cita. ¿Puedes aclararlo por favor?

Un saludo
#974
Cita de: capsulasinformaticas en 13 Febrero 2013, 03:46 AM¿Siempre que quiera mostrar un printf sin que finalize con un '\n' seria conveniente usar un fflush(stdout)?
Si, es necesario.

En el caso de los bufers relacionados con streams de salida estos se vacían en tres escenarios, cuando:

A) Se llena, vaciado automático.
B) La secuencia de caracteres es seguida por el caracter '\n'.
C) Se indica de forma explicita mediante la llamada fflush(stream).

En nuestro caso la opción A no vale porque no se tiene control de este, la segunda tampoco porque la cadena no termina con el mentado carácter, la única opción es la restante.

Si ello no se hace el funcionamiento del programa puede resultar confuso ya que puede este esperar una entrada y solo después enviar el mensaje al stream de salida (por ejemplo instrucciones de uso).

Cita de: capsulasinformaticas en 13 Febrero 2013, 03:46 AMY otra cosa que no entendi es el uso de while ((ch = getchar()) != EOF && ch != '\n')
         ;
en ese codigo, es decir, probe el codigo sin esa parte y como que el bucle hace un loop infinito y no me puedo ingresar la opcion con scanf("%d", &opcion) si ingreso una opcion invalida, pero no se por que pasa.
Porque la función scanf solo consume los caracteres que sean validos para la conversión en turno. Si el carácter a procesar no cumple se queda en la entrada estándar.

Dos ejemplos para explicarlo mejor (con la mentada llamada a scanf):

A) La entrada contiene los caracteres:
' ', ' ', ' ', '1', '2', '3', '\n'
Aquí los caracteres de espacio blanco se descartan, '1', '2' y '3' se utilizan para obtener el entero 123. Como el '\n' no es valido para la conversión (valor de tipo signed int) este se queda en el bufer de la entrada estándar.

B) La entrada contiene:
'J', '\n'
Aquí la función revisa el bufer encontrando el carácter 'J', como este no es valido se queda en el bufer y la función termina de inmediato. En la siguiente iteracion sucede lo mismo y ello ocasiona el bucle infinito que mencionas.

Para evitarlo se descarta el resto de la linea mediante el bucle.

Un saludo
#975
Cita de: ThePinkPanther en 12 Febrero 2013, 22:29 PM
Código (cpp) [Seleccionar]
int *factores=new int[32];
for (i=0;i<32;i++)
   factores[i]=0;

Segun mis pruebas, cuando usas new , la memoria ya es inicializada en 0.

Código (cpp) [Seleccionar]
for (i=0;i<32;i++)
   factores[i]=0;

no es necesario.
Es necesario (en ese caso) ya que el valor inicial de cada elemento depende de su tipo.

Una discusión algo técnica (y en ingles) donde se explica el porque y se da una alternativa es Is new int[10]() valid c++?.

Un saludo
#976
Cita de: SPUL en 13 Febrero 2013, 00:15 AMAQUI ES LA OPERACIÓN QUE NO SE QUE PONER)
Primero verificas si el monto es mayor que 2300, si es así multiplicas por 0.85 (descuento). A continuación multiplicas por 1.20 (el IVA).

Un saludo
#977
Cita de: oblivionxor en 11 Febrero 2013, 03:50 AMHice un programa anteriormente (distinto a este) y me hicieron la recomendación de no comentar tanto el código por que se veia muy adornado y pues puse en practica ese consejo, esta comentado pero solo lo necesario.
Un buen consejo. En mi opinión deberías eliminar todos los comentarios del tipo "fin de esto" ya que son las llaves las que indican el termino de un bloque. Si tienes problemas para detectar el inicio/fin de un bloque o función es mejor optar por un editor de texto para programadores con la característica de resaltado (por ejemplo los basados en Scintilla).

Cita de: amchacon en 11 Febrero 2013, 08:39 AM
Bueno yo le cambiaría el diseño de las llaves [...] Siguiendo las normativas de estilo las pondría abajo:
Código (cpp) [Seleccionar]

do
{
         scanf( "%d", &operando );

         if ( operando < 1 || operando > 5 )
         {
              printf( "Opcion no valida, intenta de nuevo..." );
         }
} while ( operando < 1 || operando > 5 );

La ventaja que tiene es que puede ver mejor a que corresponde cada llave cerrada, ya que se encuentran al mismo nivel.
Hay varios estilos y algunos de estos se pueden revisar en la pagina de la aplicación astyle), lo importante no es buscar cual es el mejor (no hay respuesta, es subjetivo) sino utilizar uno de forma consistente.

----

En cuanto al programa la única forma 100% a prueba de fallos para la lectura de un numero es mediante funciones como strtol, strtoul y strtod. Se puede utilizar la familia scanf pero con sus limitantes. Con esta ultima se debe verificar primero su valor de retorno (numero de conversiones realizadas con éxito) y, si aplica, que el numero este en el rango valido. Un programa de ejemplo:
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
   int opcion;
   int ok;
   int ch;
   
   while (1){
      printf("Indica la opcion: ");
      fflush(stdout);
      ok = scanf("%d", &opcion) == 1 && opcion > 0 && opcion < 6;
     
      while ((ch = getchar()) != EOF && ch != '\n')
         ;
     
      if (ok)
         break;
      else
         puts("Opcion no valida, intenta de nuevo...");
   }
   printf("La opcion es la %d\n", opcion);
   
   return EXIT_SUCCESS;
}


La función "generarNumero" se puede reducir utilizando la función pow (prototipo en <math.h>):
#include <math.h>

/* ... */

float generarNumero(int nivel)
{
   int a = pow(10.0, nivel - 1.0);
   
   return a + rand() % (9 * a);
}


Y las funciones que seleccionan e imprimen una cadena al azar o indicando su posición se pueden reducir utilizando arrays:
void respuestaCorrecta(void)
{
   char *resp[] = {
      "Muy bien!!",
      "Excelente!!",
      "Manten ese buen rendimiento!!",
      "Buen trabajo!!"
   };
   
   puts(resp[rand() % 4]);
}

void impresionTipoDeOperacion(int num_op)
{
   char *op[] = {
      "mas",
      "menos",
      "por",
      "entre"
   };
   
   printf("%s", op[num_op - 1]);
}


Un saludo
#978
Programación C/C++ / Re: manejo de archivos txt
12 Febrero 2013, 15:40 PM
Si no tienes un libro o curso de calidad sobre C++ te recomiendo consigas uno, puedes encontrar recomendaciones mediante el motor de búsqueda de los foros.

Ademas de los problemas ya mencionados por amchacon hay otros dos en la logica del programa.
1) Utilizas la función miembro eof para controlar el bucle, usualmente no es una buena idea, en su lugar basta con verificar el estado del stream (el valor de retorno de la función getline).

2) Lees cada linea y las almacenas en la variable linea, ello tiene el efecto de descartar todas menos la ultima pero como el bucle para empezar esta mal (por el uso de eof()) las pierdes todas.

Debes cambiar el bucle y utilizar un vector para almacenar todas las lineas del archivo. Mas o menos así:
Código (cpp) [Seleccionar]
vector<string>& leer_lineas(const char *nombre, vector<string>& linea)
{
   ifstream entrada(nombre);

   if (entrada.good()){
      for (string temp; getline(entrada, temp); linea.push_back(temp))
         ;

      entrada.close();
   }

   return linea;
}


Un saludo
#979
Para empezar debes evitar el uso de las funciones de la biblioteca conio de Borland, la función gets y la función fflush en la forma "fflush(stdin)". Mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

El error se indica claramente en el mensaje del compilador: los argumentos en la llamada a la función "consulta" no coinciden con su prototipo:
char *consulta(struct pel *p, int *contp, char *pel_bus, char *aut_bus);

/* ... */

struct pel peliculas[MAX];
char opc,pel_bus[15],aut_bus[25], *cartel,cod_act[7];
int contp=0, cond=0;

/* ... */

cartel = consulta(peliculas, pel_bus,aut_bus, contp);

* El segundo argumento "pel_bus" es de tipo "char [15]",  este resulta en un "char *" el cual es pasado a la función pero esta espera un "int *".

* El cuarto argumento "contp" es de tipo "int" cuando ella espera un "char *"

Un saludo
#980
Lo primero que debes hacer es evitar el uso de la biblioteca conio de borland y cambiar la definición de la función main. Mas información en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Para ser honesto no lo revise a fondo pero un error importante se encuentra en la función "transforma", ahí los casos se indican con caracteres:

case'1':    if((v)==0)
/* ... */
case'2':

Debes cambiarlo para que utilice enteros:

case 1:    if((v)==0)
/* ... */
case 2:

Empieza con eso, seguro alguien mas lo revisa con calma.

Un saludo