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

#71
Programación C/C++ / Re: funcion trunc
5 Febrero 2012, 00:24 AM
El fallo está en que un tipo char almacena caracteres. ¿Puedes almacenar números?, si, pero lo que almacena es el símbolo no el operando y además solo guarda el primer dígito. Por ejemplo: si le introduces el número 123.456, lo único que va a almacenar es el "1" (un solo caracter).

Y otra cosa es que cuando usas la función "trunc" no se ejecuta sobre el número almacenado (el 1) sino por su valor en ASCII (no hay cifras reales), por eso mismo siempre te dice que es un entero.

Para solucionarlo lo único que tienes que cambiar es el tipo a float:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//Este programa muestra los valores de los tipos de datos//

int main()
{
   float dato;
   printf("Dame un dato\n");
   scanf("%f",&dato);
   if(trunc(dato)-dato==0)
       printf("Es un tipo de dato int\nCon un rango de -32,768 a 32,767\n");
   else
       printf("Es un tipo de dato float\nCon un rango de 3.4 E-38 a 3.4 E+38\n");
   return 0;
}


Saludos.
#72
Para pausar hasta que le de a intro te basta con poner un "scanf()" al final del bucle.

Saludos.
#73
La velocidad del ordenador siempre va a hacer que se imprima "de golpe" a nuestros ojos. La forma de hacer lo que planteas es marcarle las pautas explícitamente, es decir, imprimir un caracter y decírle que espere x segundos. Aqui un ejemplo con la función "Sleep ()" de la librería "windows.h":

Código (cpp) [Seleccionar]
#include <iostream>
#include <windows.h>
using namespace std;

int main ()

{
   char cadena [17] = "Esto es un texto";

   for (int i = 0; i < 16; i++)
   {
       cout << cadena [i];
       Sleep(200);
   }

   cin;
   return 0;
}


Nota 1: La inicial de "Sleep" se escribe con mayúscula.
Nota 2: Dentro se ponen los milisegundos que quieres que se pause el programa (1000 ms = 1 s).

Ami particularmente no me gusta esta función porque como se puede observar haces que el programa sea dependiente de windows (por la librería). Si quieres mantener el programa de forma multiplataforma busca acerca de la librería "time" que creo que también viene con una función similar.

Saludos.
#75
La misma respuesta que antes, usa un bucle para evitar que el usuario introduzca un dato erróneo y usa un análisis de casos o condicionales para tratar los elementos. Ejemplo:

Código (cpp) [Seleccionar]
while (x < 35 || x > 80)  //Aqui se pedirá el valor de x mientras no esté entre 35 y 80 (min y max)
{
  cout << "Valor de X: ";
  cin >> x;
}
if (x >= 35 && x <= 45)  //Si está comprendido entre 35 y 45...
{
  while (y < 3 || y > 4) //...Se pide un valor de Y entre 3 y 4
  {
      cout << endl << "El valor de Y debe estar comprendido entre 3 y 4: ";
      cin >> y;
  }
else  //Y si no es asi...
{
   while (y < 300 || y > 400)  //... se pide un valor de Y entre 300 y 400
   {
      cout << endl << "El valor de Y debe estar comprendido entre 300 y 400: ";
      cin >> y;
    }
}

//Tratamiento de X e Y


Te lo dejo como guía de cómo plantear estos ejercicios, por supuesto tienes que acomodarlo a tu programa en particular.

Saludos.
#76
Gracias por tu tiempo, he optado por usar "cin.ignore(1);" después del cin.

Saludos.
#77
Podrías explicarte mejor por favor, ¿estás diciendo que el usuario introduce los operandos y las operaciones que quieres que haga con ellos (como una calculadora)?.

No está permitido hacer los ejercicios, sin embargo si te explicas bien se te puede orientar acerca de por dónde tirar.
#78
No que yo sepa, y aunque exista no será lo suficientemente grande como para almacenar "infinitos dígitos" (hasta que cierres el programa) como tú planteas. La forma más lógica de hacerlo es calcular X dígitos, por ejemplo 10, y guardarlos en un fichero, memoria dinámica u otro medio, calcular los siguientes 10 dígitos y volver a guardarlos y asi sucesivamente, sino te va a ser imposible.

Saludos.
#79
Gracias por responder, la única entrada que hay antes es esta:

Código (cpp) [Seleccionar]
   while (opcion != 5)
   {
       opcion = 0;
       while (opcion < 1 || opcion > 5)
       {
           F_menu();
           cin >> opcion; //Primera entrada en todo el programa
           cout << endl;
       }

       switch (opcion)
       {
           case 1:
               while (pEA->pSiguiente != 0)
               {
                   pEA = pEA->pSiguiente;
               }

               pEA->pSiguiente = new agenda;
               pEA = pEA->pSiguiente;

               cout << "Introduzca el nombre: ";
               cin.getline (nuevoNombre, tamNombre); // Entrada suprimida
               pEA->configurarNombre (&nuevoNombre[0]);
               cout << endl;

               cout << "Introduzca el correo: ";
               cin.getline (nuevoCorreo, tamCorreo);
               pEA->configurarCorreo (&nuevoCorreo[0]);
               cout << endl;
...


¿Por qué mete un "\n" automáticamente en el buffer?, ¿y cuál sería la solución para evitarlo?.

EDITO: Por si ayuda te pongo el cuerpo del programa hasta donde se produce el error:

Código (cpp) [Seleccionar]
int main ()
{
   USHORT opcion;

   agenda objeto;
   agenda *pEA = &objeto;
   USHORT numContactos = 0;

   char nuevoNombre [tamNombre];
   char nuevoCorreo [tamCorreo];
   ULONG nuevoTelefono = 0;
   ULONG nuevoMovil = 0;

   bool encontrado;
   char nombre [tamNombre];
   char correo [tamCorreo];
   char *pNombre = 0;
   char *pCorreo = 0;
   USHORT contador;

   int i, j;

   while (opcion != 5)
   {
       opcion = 0;
       while (opcion < 1 || opcion > 5)
       {
           F_menu();
           cin >> opcion;
           cout << endl;
       }

       switch (opcion)
       {
           case 1:
               while (pEA->pSiguiente != 0)
               {
                   pEA = pEA->pSiguiente;
               }

               pEA->pSiguiente = new agenda;
               pEA = pEA->pSiguiente;

               cout << "Introduzca el nombre: ";
               cin.getline (nuevoNombre, tamNombre);
               pEA->configurarNombre (&nuevoNombre[0]);
               cout << endl;

               cout << "Introduzca el correo: ";
               cin.getline (nuevoCorreo, tamCorreo);
               pEA->configurarCorreo (&nuevoCorreo[0]);
               cout << endl;
...


Una cosa en la que me acabo de fijar es en cómo inicializo las cadenas en el constructor de la clase; ¿es correcto de esta forma o quizá sea lo que produce el error?:

Código (cpp) [Seleccionar]
agenda::agenda()
{
   char nombre = {'\0'};
   char correo = {'\0'};
   telefono = 0;
   movil = 0;

   pSiguiente = 0;
}


Un saludo.
#80
Citar...
void llenar_informacion(int V[],int m);
int main(int argc, char *argv[])
{
 int m,i,j;
 struct Datos P[100];
 printf("ingrese el n\xA3mero de clientes: ");
 scanf("%d",&m);
 llenar_informacion(P,m);
 system("PAUSE");  
 return 0;
}
...

La función "llenar_informacion" tiene como primer argumento una tabla de enteros llamada "V", sin embargo al llamarla en el cuerpo del programa le estás pasando la variable "P" que es una estructura de tipo "datos". No se puede hacer esa clase de cambio de tipo...

Código (cpp) [Seleccionar]
...
for(i=0;i<m;i++)
 {
  for(i=0;i<m;i++)
  {

...


Eso no es correcto, si vas a poner bucles anidados cada bucle debe tener una variable de control distinta.

Esos son los errores que he visto pero además el uso de gets no es aconsejable porque no tiene en cuenta la cantidad de caracteres que le introduces.

Prueba a modificar esas cosas y comentas, saludos.