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

#61
Cita de: Almapa en 18 Diciembre 2013, 12:02 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
#62
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:

#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
#63
Cita de: Stakewinner00 en  8 Diciembre 2013, 01:57 AM
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 (cpp) [Seleccionar]
 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;
     }
     
    return 0;
}


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!
#64
Buenas, he hecho el siguiente código que convierte dos caracteres hexadecimales a decimal, y sale del programa al ingresar "qq":



// 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!
#65
Hecho, muchas gracias!
#66
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:

//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:

#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!
#67
Sí, los ignoraré por que el programa funciona perfectamente xD

Gracias!
#68
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:

//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:

#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!
#69
Cita de: avesudra en 12 Noviembre 2013, 00: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!
#70
Buenas, tengo el siguiente programa básico para pasar de número decimal a hexadecimal:

#include <stdio.h>

int main()
{

  /* Declaramos las variables */
  char car1;
  char car2;
  char valor1;
  char valor2;
  int valor;
 
  printf("Introduzca el numero hexadecimal: ");
  scanf("\n%c%c", &car1, &car2);

  /* Condiciones para el primer caracter*/
  if ('0' <= car1 && car1 <= '9')
    valor1 = car1 - '0';
  else if ('A' <= car1 && car1 <= 'F')
    valor1 = car1 - 'A' + 10;

  /* Condiciones para el segundo caracter*/
  if ('0' <= car2 && car2 <= '9')
    valor2 = car2 - '0';
  else if ('A' <= car2 && car2 <= 'F')
    valor2 = car2 - 'A' + 10;


  valor = 16 * valor1 + valor2;

  printf("El valor decimal de 0x%c%c es %d\n", car1, car2, valor);

  return 0;
}


Me pide el profesor que cambie cada sentencia "if else if" por una "if else", pero he probado y siempre me da error al compilar, ¿alguna ayuda?

Saludos!