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

#461
Programación C/C++ / Re: ayuda fecha en c
23 Febrero 2014, 17:33 PM
Cita de: J.cE en 20 Febrero 2014, 18:51 PMquisiera que me ayuden con este problema que tengo en un programa para que una fecha ingresada por el usuario si es mayor en 15 dias a la fecha actual y menor a 30 dias de la fecha actual sea aceptada; la fecha actual es tomada de time.h , espero me puedan ayudar con esto
Para obtener la fecha N días antes o después de la actual los pasos son, utilizando las facilidades de la biblioteca estándar de C:

1) Obtienes la fecha actual con la función time.
2) En base al objeto de tipo time_t obtienes uno de tipo "struct tm" mediante la función localtime o gmtime.
3) Incrementas el valor del campo tm_mon.
4) Reajustas los valores mediante la función mktime.

Un ejemplo sencillo:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
   struct tm a = {0};
   struct tm b = {0};
   time_t now;
   
   now = time(NULL);
   a = b = *localtime(&now);
   
   a.tm_mday -= 54;
   mktime(&a);
   printf("-54 ==> %4d/%02d/%02d\n",
      a.tm_year + 1900, a.tm_mon + 1, a.tm_mday);
   
   printf("Now ==> %4d/%02d/%02d\n",
      b.tm_year + 1900, b.tm_mon + 1, b.tm_mday);
   
   b.tm_mday += 15;
   mktime(&b);
   printf("+15 ==> %4d/%02d/%02d\n",
      b.tm_year + 1900, b.tm_mon + 1, b.tm_mday);
   
   return EXIT_SUCCESS;
}


Y su salida (al día de hoy) es:
-54 ==> 2013/12/31
Now ==> 2014/02/23
+15 ==> 2014/03/10


Un saludo
#462
Programación C/C++ / Re: Abrir y leer un archivo
23 Febrero 2014, 16:48 PM
Cita de: SanRey en 23 Febrero 2014, 05:52 AMesta semana empece a trabajar con archivos. Tengo este codigo [...]
Código (cpp) [Seleccionar]
// ...

ifstream fentrada ("Datos_alu.dat",ios::in |ios::binary);
for (x=0; x<n;x++)//Imprimir{
   fentrada.read(reinterpret_cast<char *>(&vec[x]),sizeof(alu));
   
   printf ("Nombre: %s\n",vec[x].nombre);
   printf ("Edad: %i\n",vec[x].edad);
   printf ("Altura %.1f\n",vec[x].altura);
   printf("\n\n");
}
fentrada.close();

// ...

Como puedo hacer otro programa pero que esta vez lea el archivo "Datos.alu.dat" sume las edades, imprima y lo guarde en el mismo archivo. No tengo muy claro como hacer que abra el archivo  y lo lea para poder manejar las edades.
Ese programa tiene varias deficiencias como mezclar C y C++, la recomendación aquí es leer el tema |Lo que no hay que hacer en C/C++. Nivel basico|. También deberías conseguir un buen curso o libro sobre C++, recomendaciones sobre ellos las puedes consultar mediante el motor de búsqueda de los foros.

Aparte de eso en el programa hay un error lógico ya que los nombres del archivo de salida "Datos.alu.dat" y entrada "Datos_alu.dat" no coinciden. En cuanto a la lectura de un archivo no debes tener problemas ya que esa operación ya la realizas en tu programa (en la parte que cite).

Un saludo
#463
Cita de: patilanz en 22 Febrero 2014, 10:57 AMVoy a intentar bajar a un nivel mas bajo para conocer los drivers y lo demás. Pero voy a utilizar las librerías ya existentes aunque siempre quiero conocer como funcionan por dentro ya que en la mayoría de los libros o tutoriales te dice que no se necesario pero yo creo que asi se aprende mucho mas ya que si no sabes como funcionan nunca aprenderás a crear tus propias librerías mas complejas.
Tienes que ir paso a paso, voy a citar el primer párrafo de la guía que mencione:
CitarGetting started with drivers

Start here to learn fundamental concepts about drivers.

You should already be familiar with the C programming language, and you should understand the ideas of function pointers, callback functions, and event handlers. If you are going to write a driver based on User-Mode Driver Framework 1.x, you should be familiar with C++ and COM.

Primero aprendes un lenguaje como C o C++ utilizando solo su biblioteca estándar ya que es la forma mas fácil (debido a que el numero de variables es el mínimo). Esto siendo optimistas te lleva un año o dos. Solo después de eso te enfocas en extensiones como el API de un SO, bibliotecas de terceros, etc.

Ya por ultimo y sin animo de fastidiar: "bajar a un nivel mas bajo" es un Pleonasmo.

Un saludo
#464
Cita de: chino_r en 22 Febrero 2014, 17:17 PMEl signo "&" se que se utiliza para que la computadora guarde en ese espacio algo, sin embargo en mi computadora cuando ejecuto salta un error [...] cuando me olvido de usarlo, no deberia indicarmelo el compilador a la falta de " & " ?
Depende del compilador y la forma en que se ejecute este.

Cita de: chino_r en 22 Febrero 2014, 17:17 PMEstoy usando el dev c++ y mi computadora es una i5 con windows 7, desde ya muchas gracias....
Si recuerdo bien Dev-C++ utiliza como compilador una versión de gcc ya sea MinGW o CygMing. Con ellos debes utilizar las opciones "-ansi -pedantic -Wall -O" para que el compilador se ejecute en el modo mas estricto posible y, en el caso de CygMing, este genera mensajes de advertencia si se te olvida utilizar el operador "&".

Busca en el menú las opciones para configurar el compilador, debe ser de titulo "Opciones de linea de comandos" (o algo similar, no lo tengo instalado) y ahí las agregas.

Un saludo
#465
Cita de: alfred_oh en 22 Febrero 2014, 10:15 AMPoniéndonos en otro situación, si por ejemplo introducimos:
" 123 {ENTER}"
En primer scanf lo que haría sería descartar el primer espacio y coger 123.
Luego el segundo scanf descartaría el segundo espacio, pero que hace con {ENTER}? Lo descarta también?
Si. Se descarta todo el espacio blanco antes de la conversión (espacio, tabulador, avance de linea, etc.).

Cita de: alfred_oh en 22 Febrero 2014, 10:15 AMEntonces podríamos decir que %d descarta todo lo que no sea int?
No porque eso puede llevar a confusiones. Es mejor decir que salvo "%c" y "%[]" con cualquier otro especificador (por ejemplo "%d", "%s", etc.) el espacio blanco al inicio no importa (ya que se descarta).

Un saludo
#466
Programación C/C++ / Re: numero maximo permitido
22 Febrero 2014, 17:01 PM
Cita de: vangodp en 22 Febrero 2014, 03:54 AMEn los compiladores actuales creo que el long es lo mismo que int.
No necesariamente. Las únicas dos garantías son: 1) El tipo int es menor o igual al tipo long y 2) El tipo long se compone por al menos 32 bits.

Cita de: m@o_614 en 22 Febrero 2014, 02:14 AMuna de las restricciones que tengo es que tengo que poder introducir numeros mayores a 100000000 pero el tipo de dato no podra ser char o cadena entonces como lo resuelvo??
Verificas que el resultado de "cin >> variable" sea true y que el resto de la linea solo consista de espacio blanco. Por ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <cstdio>
// EOF

#include <cctype>
using std::isspace;

int main()
{
   cout << "Introduce un numero: ";
   long int num;
   bool rv = cin >> num;
   
   int ch;
   while ((ch = cin.get()) != EOF && ch != '\n')
      if (!isspace(ch))
         rv = false;
   
   if (rv)
      cout << "OK (" << num << ")" << endl;
   else
      cout << "Error" << endl;
   
   return 0;
}

Ello te indicara si ocurre un error pero nada mas, para el caso es mejor leer una linea de texto y verificarla con strtol, strtoll, etc. ya que ellas permiten conocer cual fue el error (por ejemplo un numero fuera del rango valido).

Un saludo
#467
Programación C/C++ / Re: ayuda C
22 Febrero 2014, 01:44 AM
Cita de: J.cE en 21 Febrero 2014, 20:04 PMno he usado mucho la libreria time.h pero tengo esto:

typedef struct
{
    int tm_sec;   
    int tm_min;     
    int tm_hour;     
    int tm_mday;   
    int tm_mon;     
    int tm_year;     
    int tm_wday;     
    int tm_yday;     
    int tm_isdst;   
}tm;

No lo uses, en su lugar incluyes <time.h> y utilizas el tipo "struct tm". El porque se indica en la referencia:
Citarstruct tm contains members that describe various properties of the calendar time. The members shown above can occur in any order, interspersed with additional members.

Cita de: J.cE en 21 Febrero 2014, 20:04 PMy luego que?
Llamas a la funcion mktime e imprimes el valor del campo "tm_yday". Por ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
   struct tm d = {0};
   
   puts("Introduce la fecha (aaaa mm dd):");
   if (scanf("%d %d %d", &d.tm_year, &d.tm_mon, &d.tm_mday) != 3)
      return EXIT_FAILURE;
   d.tm_year -= 1900; /* 0 == 1900, 100 == 2000, etc. */
   d.tm_mon--; /* 0 == Enero, 1 == Febrero, etc. */
   
   if (mktime(&d) == (time_t) -1){
      puts("Fecha no valida");
      return EXIT_FAILURE;
   }
   printf("%4d/%02d/%02d ==> Dias transcurridos: %d\n",
      d.tm_year + 1900, d.tm_mon + 1, d.tm_mday, d.tm_yday);
   
   return EXIT_SUCCESS;
}


Un saludo
#468
Programación C/C++ / Re: ayuda C
21 Febrero 2014, 18:12 PM
Puedes utilizar un objeto de tipo "struct tm" (definición en <time.h>) asignando manualmente los valores para el día, mes y año. A continuación ajustas los campos mediante la función mktime (prototipo en el mismo encabezado). Después de eso basta con utilizar el campo "tm_yday" de la estructura.

Un saludo
#469
Cita de: alfred_oh en 21 Febrero 2014, 16:03 PMtengo el siguiente programa en c
Lo primero que debes hacer es evitar el uso de fflush(stdin), las razones de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Al eliminarlo del programa tenemos:
#include <stdio.h>

int main(void)
{
   int a;
   int b;
   
   puts("Ingrese el valor de a:");
   scanf("%d", &a);

   puts("Ingrese el valor de b:");
   scanf("%d",&b);

   printf("a = %d\n", a);
   printf("b = %d\n", b);
   
   return 0;
}



Tomando ese programa como base ...


Cita de: alfred_oh en 21 Febrero 2014, 16:03 PMla verdad no me queda muy claro de que manera afecta scanf() al buffer de teclado.
Cuando utilizas scanf con el especificador "%d" lo que hace la funcion es:
1) Descarta el espacio blanco, por ello puedes introducir "       123" sin problemas.
2) Consume de la entrada estandar los caracteres que sean validos para la conversion en turno.
3) Al encontrar el primer caracter invalido (o una limitante en el especificador) ese caracter se queda intacto en la entrada estandar y se pasa a la siguiente conversion.

En tu programa si introduces:
    123    456{ENTER}
La primera llamada a scanf descarta el espacio blanco y consume los caracteres "123" para en base a ellos obtener el entero 123, el espacio inmediatamente despues del '3' causa el final de esa conversion y, al ser la ultima, el final de la llamada a scanf.

Para la segunda llamada a scanf el bufer de la entrada estandar contiene:
    456{ENTER}
Y la operacion es similar: scanf descarta los espacios, obtiene el entero  456 y el {ENTER} se queda en el bufer de la entrada estandar.

Cita de: alfred_oh en 21 Febrero 2014, 16:03 PMModifiqué mi código y quedó así:

...

while (getchar() != '\n')
   ;


...

Lo que pasa es que tampoco entiendo como "while(getchar()!='\n');" me ayuda. Lo que entiendo que hace esa línea es "sacar del buffer" todos los símbolos menos el "\n", luego el símbolo que queda en el buffer de teclado es "\n", entonces realmente no esta vacío no?
Por partes:

* Ese bucle descarta todos los caracteres incluyendo el '\n' ya que se puede leer como "Mientras el caracter leido NO sea '\n'" y, por supuesto, al leerlo se descarta.

* Como usualmente la entrada es por linea la intentencion de utilizar scanf y ese bucle es 1) Leer un entero con scanf y 2) Descartar el resto de la linea con el mentado bucle. Todo ello para evitar el comportamiento que mencionas.

Un saludo
#470
Programación C/C++ / Re: programar en dev-c++
21 Febrero 2014, 15:50 PM
Cita de: dega1980 en 21 Febrero 2014, 15:15 PMme gustaria saber si lo tengo que completar con algun otro....por ejemplo algun editor
¿Que tipo de editor? Si te refieres a un editor de texto no es necesario ya que ese IDE (para el caso todos) incluye uno.

Cita de: dega1980 en 21 Febrero 2014, 15:15 PMy si alguien conociese algun buen manual para empezar a programar en este,estaria muy agradecido un saludo
En lugar de enfocarte en el IDE es preferible que busques recomendaciones de libros/cursos sobre el lenguaje (C o C++) que piensas estudiar, puedes empezar utilizando el motor de búsqueda de los foros.

Un saludo