elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11
61  Programación / Programación C/C++ / Duda con estructuras en C (Urgente) en: 4 Enero 2014, 16:31 pm
Buenas, me han pedido un programa en la facultad en el que ,mediante estructuras, me pida dos fechas y el programa me dice si una fecha es posterior/anterior/igual a otra fecha y si los años son bisiestos o no.

Tengo dos ficheros, el primero es fecha.c que hace la lectura, comprobación, comparación, comprobación si es bisiesto o no,  con el código que me ha quedado así:

Código:
#include <stdio.h>
#include "fecha.h"

struct fecha leeFecha(void)

{

  struct fecha Fech;

    printf("Introduzca la fecha en formato dd/mm/aaaa: ");

    scanf("%d/%d/%d", &Fech.dia, &Fech.mes, &Fech.año);
 

  return Fech;
}


int compruebaFecha(struct fecha *pFecha)
{
  int compru;
//  int dia;
 // int mes;
  int bis;

  {
    if (pFecha->dia < 1 || pFecha->dia > 31)

      compru = 0;

    else if (pFecha->mes < 1 || pFecha->mes > 12)

      compru = 0;

    else if ((pFecha->mes == 4 || pFecha->mes == 6 || pFecha->mes == 9 || pFecha->mes == 11) && (pFecha->dia > 30))

      compru = 0;

    else if (pFecha->mes == 2)

      {
        if ((bis = 1) && (pFecha->dia > 29))

          compru = 0;

        else if ((bis = 0) && (pFecha->dia > 28))

          compru = 0;
      }

    else

      compru = 1;
  }

  return compru;

}


int comparaFecha(struct fecha f1, struct fecha f2)
/* Función comparaFecha, devuelve:
   -1 si fecha1 < fecha2
   0 si fecha1 = fecha2
   1 si fecha1 > fecha2
*/
{
  int compara;

  if (f1.año < f2.año)
    compara = -1;
  else if (f1.año > f2.año)
    compara = 1;
  else
    {
      if (f1.mes < f2.mes)
        compara = -1;
      else if (f1.mes > f2.mes)
        compara = 1;
      else
        {
          if (f1.dia < f2.dia)
            compara = -1;
          else if (f1.dia > f2.dia)
            compara = 1;
          else
            compara = 0;
        }
    }

  return compara;
}



void imprimeFecha(struct fecha f)
{

  printf("%02d/%02d/%d", f.dia, f.mes, f.año);

  return;
}



// Funcion para comprobar si un año es bisiesto:
int esBisiesto(struct fecha f)
{
  int bis = 0;

  // año bisiesto: {divisible por 4 y no por 100} o {divisible por 400}

  if (((f.año % 4 == 0) && (f.año % 100 != 0)) || (f.año % 400 == 0))
    bis = 1;

  return bis;
}

Aquí está el fichero estructura.c que contiene a la función main y usa las funciones de fecha.c


Código:
#include <stdio.h>
#include "fecha.h"

int main()
{
  struct fecha f1;
  struct fecha f2;
  // struct fecha *pf1;
  // struct fecha *pf2;
  int a;
  int compara;
  int bis1;
  int bis2;

  f1 = leeFecha();
  a = compruebaFecha(&f1);

  if (a == 0)
    {
      printf("Formato de fecha incorrecto\n");
    }

  else
    {
      f2 = leeFecha();
      a = compruebaFecha(&f2);

      if (a == 0)
        {
          printf("Formato de fecha incorrecto\n");
        }

      else

        {

          compara = comparaFecha(f1, f2);

/* Imprimir */

          imprimeFecha(f1);
          {
            if (compara > 0)

              printf(" es posterior a ");

            else if (compara == 0)

              printf(" es igual a ");

            else

              printf(" es anterior a ");
          }

          imprimeFecha(f2);

          bis1 = esBisiesto(f1);
          bis2 = esBisiesto(f2);

          {
            if (bis1 == 1 && bis2 == 0)

              printf("\nLa primera fecha es en bisiesto\n");

            else if (bis1 == 0 && bis2 == 1)

              printf("\nLa segunda fecha es en bisiesto\n");

            else if (bis1 == 1 && bis2 == 1)

              printf("\nAmbas fechas son en bisiesto\n");

            else

              printf("\nNinguna de las dos fechas es en bisiesto\n");

          }
        }
    }
  return 0;
}

Y aquí está fecha.h:

Código:
#ifndef FECHA_H
#define FECHA_H

struct fecha {
  int dia;
  int mes;
  int año;
};

#define AMBAS_BISIESTO   "Ambas fechas son en bisiesto\n"
#define PRIMERA_BISIESTO "La primera fecha es en bisiesto\n"
#define SEGUNDA_BISIESTO "La segunda fecha es en bisiesto\n"
#define NINGUNA_BISIESTO "Ninguna de las dos fechas es en bisiesto\n"

struct fecha leeFecha( void );
int compruebaFecha( struct fecha *pFecha );
int comparaFecha( struct fecha f1, struct fecha f2 );
void imprimeFecha( struct fecha f );
int esBisiesto( struct fecha f );

#endif


Pues bien, el programa me funciona perfectamente salvo por un pequeño error que no consigo solucionar, puede ser una tontería pero llevo tanto tiempo haciendo el programa que no lo veo.

En la ejecución, si le pongo las fechas 06/01/1981 y 02/06/1980 me dice:

6/1/1981 es posterior a 2/6/1980
La segunda fecha es en bisiesto

¿Cómo consigo que en vez de 6/1/1981 y 2/6/1980 me ponga 06/01/1981 y 02/06/1980?

Es decir, que no se "coma" esos ceros.

¿Alguna ayuda?, gracias de antemano

Necesito que me de la ejecución tal y como digo por que si no no me lo dan como válido el programa, aunque funcione correctamente

Un saludo!
62  Programación / Programación C/C++ / Re: ¿Alguien me puede explicar este programa en C? (Dec-Binario) en: 18 Diciembre 2013, 12:18 pm
Por el nombre de la función se puede intuir más o menos lo que va a hacer.

Si el número introducido es 0, imprime 0. Pues 0 en binario es 0.

Lo mismo con el 1.


Para el resto de números se pasa de decimal a binario mediante una función recursiva que se dedica a dividir el número entre 2 (Procedimiento para pasar de decimal a binario  http://recursostic.educacion.es/secundaria/edad/4esotecnologia/quincena5/4q2_contenidos_2c.htm ).


Y eso es todo.

Un saludo!

Muchas gracias, no me había mirado el tema de funciones recursivas y por eso no caía xD
63  Programación / Programación C/C++ / ¿Alguien me puede explicar este programa en C? (Dec-Binario) en: 18 Diciembre 2013, 11:46 am
Buenas, tengo un programa que pasa de decimal (solo números positivos) a binario, pero no entiendo muy bien como hace la conversión, este es el código:

Código:
#include <stdio.h>

int leeNumero();
void decBin(int n);

int main()
{
   int n;
   n = leeNumero();
   decBin(n);
   printf("\n);

  return 0;
}

int leeNumero()
{
    int numero;
    do
       {
         printf("Introduzca un número no negativo: ");
         scanf("%d", &numero);
       }
     while (numero<0);

return numero;
}

void decBin(int n)
{
     if (n == 0)
        printf("0");

     else if (n == 1)
        printf("1");

     else
        {
           decBin(n / 2);
           printf("%d", n % 2);
        }
}


Yo el programa lo entiendo de esta manera:

Declaramos las funciones leeNumero y decBin, entramos en la función main, a través de la función leeNumero se comprueba que el número no sea negativo, volvemos a la función main y entramos en la función decBin, y es ahí donde me surge la duda, ya que no entiendo muy bien como hace la conversión a binario :S

¿Alguna ayuda?, gracias de antemano!

P.D: El programa funciona perfectamente
64  Programación / Programación C/C++ / Re: Problema al compilar un programa en: 8 Diciembre 2013, 17:12 pm
SoyelRobert  el warning sale al usar la opción de -Wall de g++

el error la advertencia se elimina si haces que el programa devuelva algo

en el último pedazo de código le añades return 0; o lo que necesites y listo

Código
  1.  if ((*ccar1 == 'q') && (*ccar2 == 'q'))
  2.    {
  3.      return 0;
  4.    }
  5.  else
  6.    if (((('0' <= *ccar1) && (*ccar1 <= '9'))
  7.         || (('A' <= *ccar1) && (*ccar1 <= 'F'))
  8.         || (('a' <= *ccar1) && (*ccar1 <= 'f')))
  9. || ((('0' <= *ccar2) && (*ccar2 <= '9'))
  10.    || (('A' <= *ccar2) && (*ccar2 <= 'F'))
  11.    || (('a' <= *ccar2) && (*ccar2 <= 'f'))))
  12.      {
  13.  
  14. return 1;
  15.      }
  16.  
  17.     return 0;
  18. }

este tipo de avisos en la mayoría de veces no impiden que el programa se ejecute normalmente pero hace falta tenerlos en cuenta

SAludos

Sí, sale con la opción -Wall, muchas gracias por la solución

Saludos!
65  Programación / Programación C/C++ / Problema al compilar un programa en: 8 Diciembre 2013, 01:15 am
Buenas, he hecho el siguiente código que convierte dos caracteres hexadecimales a decimal, y sale del programa al ingresar "qq":



Código:
// Biblioteca del sistema 
#include <stdio.h>

// Constantes del fichero
#define CTE       16
#define VALOR     "El valor decimal de 0x%c%c es %d\n"
#define NOERROR   1
#define ERROR     0


// Funciones que usaremos
int hexDec(char car1, char car2);
int leeCaracter(char * ccar1, char * ccar2);

int main()
{
  // Declaramos las variables
  char car1;
  char car2;

  // Declaramos las variables de control
  int cuno;
  int cdos;

  // Solicitamos los caracteres hexadecimales

  do
    {
     
      // Llamamos a la función leeCaracter
      leeCaracter(&car1, &car2);
     
      cuno = NOERROR;
      cdos = NOERROR;
      if (!((('0' <= car1) && (car1 <= '9'))
            || (('A' <= car1) && (car1 <= 'F'))
            || (('a' <= car1) && (car1 <= 'f'))))
        {
          cuno = ERROR;
        }

      if (!((('0' <= car2) && (car2 <= '9'))
            || (('A' <= car2) && (car2 <= 'F'))
            || (('a' <= car2) && (car2 <= 'f'))))
        {
          cdos = ERROR;
        }
      if ((NOERROR == cuno) && (NOERROR == cdos))
       
//Llamamos a la funcion hexDec
hexDec(car1, car2);
      if ((cuno == ERROR) && (car1 != 'q'))
        {
  printf("Error en el primer valor introducido\n");
}
      if ((cdos == ERROR) && (car2 != 'q'))
        {
  printf("Error en el segundo valor introducido\n");
}
      getchar();
    }
  while ((car1 != 'q')  || (car2 != 'q'));
 
  return 0;
}

// Definimos la funcion hexDec

int hexDec(char car1, char car2)
{
  int valor1;
  int valor2;
  int valor;

  if (('0' <= car1) && (car1 <= '9'))
    {
      valor1 = car1 - '0';
    }
  else if (('A' <= car1) && (car1 <= 'F'))
    {
      valor1 = car1 - 'A' + 10;
    }
  else if (('a' <= car1) && (car1 <= 'f'))
    {
      valor1 = car1 - 'A' + 10 - 32;
    }

  if (('0' <= car2) && (car2 <= '9'))
    {
      valor2 = car2 - '0';
    }
  else if (('A' <= car2) && (car2 <= 'F'))
    {
      valor2 = car2 - 'A' + 10;
    }
  else if (('a' <= car2) && (car2 <= 'f'))
    {
      valor2 = car2 - 'A' + 10 - 32;
    }
  valor = CTE * valor1 + valor2;
  printf(VALOR, car1, car2, valor);
  return valor;
}

// Definimos la funcion leeCaracter

int leeCaracter(char * ccar1, char * ccar2)
{

  printf("Introduzca un valor hexadecimal: ");
  scanf("%c%c", ccar1, ccar2);
 
  if ((*ccar1 == 'q') && (*ccar2 == 'q'))
    {
      return 0;
    }
  else
    if (((('0' <= *ccar1) && (*ccar1 <= '9'))
         || (('A' <= *ccar1) && (*ccar1 <= 'F'))
         || (('a' <= *ccar1) && (*ccar1 <= 'f')))
|| ((('0' <= *ccar2) && (*ccar2 <= '9'))
    || (('A' <= *ccar2) && (*ccar2 <= 'F'))
    || (('a' <= *ccar2) && (*ccar2 <= 'f'))))
      {
     
return 1;
      }
}

Pero al compilar me da el siguiente aviso:

hexDec7.c: En la función ‘leeCaracter’:
hexDec7.c:138:1: aviso: el control alcanza el final de una función que no es void

¿Alguien me puede decir como solucionarlo?

Saludos y gracias de antemano!
66  Programación / Programación C/C++ / Re: Problema con programa conversor de decimal a binario en: 27 Noviembre 2013, 18:32 pm
Hecho, muchas gracias!
67  Programación / Programación C/C++ / Problema con programa conversor de decimal a binario en: 27 Noviembre 2013, 17:55 pm
Buenas, tengo un ejercicio en el que me piden hacer un programa que pase de números positivos decimales a binario (incluyendo el 0), y yo he hecho esto:

Código:
//Incluimos las librerías propias y del sistema

#include <stdio.h>
#include "decBin.h"

//Declaramos las funciones

int leeNumero();
void decBin(int n);

int main()
{
  int n;
  n = leeNumero();
  if (n > 0)
    {
      decBin(n);
    }
  printf("\n");

  return 0;
}


int leeNumero()
{
  int numero;
  do
    {
      printf(T_INTRODUZCA_NUMERO);
      scanf("\n%d", &numero);
    }
  while (numero < 0);           /*Con este bucle hacemos que si el numero introducido
                                   es negativo, no lo procese y vuelva a pedirlo */


  return numero;
}

//La funcion decBin realiza la conversión decimal-binario

void decBin(int n)
{
  if (n == 0)
    printf("0");

  else if (n == 1)
    printf("1");

  else
    {
      decBin(n / 2);
      printf("%d", n % 2);
    }
}

Aquí os pongo el fichero decBin.h:

Código:
#ifndef DECBIN_H
#define DECBIN_H

#define T_INTRODUZCA_NUMERO  "Introduzca un numero no negativo: "
#define T_INTRODUZCA_NUMERO2 "Introduzca un numero: "

#endif


Me compila bien, sin avisos ni nada, y funciona bien salvo cuando le digo que me convierta el 0 en binario (qué evidentemente sigue siendo 0), lo que hace es salir del programa, ¿alguna solución?

Gracias de antemano y un saludo!
68  Programación / Programación C/C++ / Re: Problema con avisos al compilar un programa en C en: 27 Noviembre 2013, 17:30 pm
Sí, los ignoraré por que el programa funciona perfectamente xD

Gracias!
69  Programación / Programación C/C++ / Problema con avisos al compilar un programa en C en: 27 Noviembre 2013, 15:36 pm
Buenas, tengo que hacer el siguiente programa:

potencia.c: realice un programa que obtenga la potencia de un número elevado a otro, dados ambos
por teclado. Para ello:
a ) escriba la función potencia, que recibe dos números como parámetros, la base y el exponente, y devuelve el resultado de elevar el primero al segundo.
b ) escriba la función leeNumero, que no recibe ningún dato como parámetro y solicita un número no negativo (mayor o igual que 0) por teclado, que devolverá como resultado. La función debe solicitar la introducción del número tantas veces como sean necesarias hasta que el número sea correcto (no negativo).
c ) escriba la función main, que haga uso de las dos funciones anteriores, para calcular la potencia de un número elevado a otro.

Pues bien, tengo hecho esto:

Código:
//Incluímos las librerías propias y del sistema
#include "potencia.h"
#include <stdio.h>

//Declaramos las funciones
int potencia(int base, int exponente);
int leeNumero();

int main()
{

//Declaramos las variables a usar
  int base;
  int exponente;
  int resultado;
  int numero;

  printf(T_BASE, base);
  base = leeNumero(numero);
  printf(T_EXPONENTE, exponente);
  exponente = leeNumero(numero);        //Llamamos a la funcion leeNumero

  resultado = potencia(base, exponente);        //Llamamos a la funcion potencia
  printf(T_RESULTADO, base, exponente, resultado);
  return 0;
}


int potencia(int base, int exponente)
{

  int resultado = 1;
  if (exponente == 0)
    {
      resultado = 1;
    }

  else
    {

      for (; exponente >= 1; exponente--)
        {
          resultado *= base;
        }
    }

  return resultado;
}

int leeNumero()
{
  int numero;
  do
    {
      printf(T_INTRODUZCA_NUMERO);
      scanf("%d", &numero);
    }
  while (numero < 0);


  return numero;
}

Este es el código de potencia.h:

Código:
#ifndef POTENCIA_H
#define POTENCIA_H

/*Textos a utilizar en la funcion printf*/
#define T_BASE              "BASE:\n"
#define T_EXPONENTE         "EXPONENTE:\n"
#define T_RESULTADO         "%d elevado a %d es %d\n"
#define T_INTRODUZCA_NUMERO "Introduzca un numero no negativo: "

#endif

Pues bien, si lo compilo con el comando en consola:

gcc -W -Wall -o potencia potencia.c

Me salen los siguientes avisos:

salas@313CDC38:~/Escritorio/pfunciones2$ gcc -W -Wall -o potencia potencia.c
potencia.c: En la función ‘main’:
potencia.c:29:3: aviso: demasiados argumentos para el formato [-Wformat-extra-args]
potencia.c:31:3: aviso: demasiados argumentos para el formato [-Wformat-extra-args]
potencia.c:29:9: aviso: se utiliza ‘base’ sin inicializar en esta función [-Wuninitialized]
potencia.c:30:8: aviso: se utiliza ‘numero’ sin inicializar en esta función [-Wuninitialized]
potencia.c:31:9: aviso: se utiliza ‘exponente’ sin inicializar en esta función [-Wuninitialized]

¿Alguna forma de solucionarlo?

Compilándolo con el comando gcc -o potencia potencia.c me compila y hace lo que me piden, pero me gustaría tenerlo hecho sin que me de avisos. Gracias de antemano!

Saludos!
70  Programación / Programación C/C++ / Re: Cambiar una sentencia if else if por un if else en: 12 Noviembre 2013, 10:36 am
¿Qué error te da al compilar? A mi me va perfectamente, hay que detallar más las preguntas.

Esperando tu respuesta para poder ayudarte.

¡Un saludo!

No da ninguno, sólo que el profesor exige que la práctica no tenga la sentencia else if xD, pero ya lo he podido solucionar, gracias!
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines