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ú

Temas - cesariox23

#1
Estimados señores: El día de hoy empecé a codificar un programa que me permitiría obtener los componentes RGB de una cadena hexadecimal de color, si yo ingresara 6c6c6c me devolvería (108, 108, 108), el programa estaría hecho para realizar varias conversiones consecutivas asi que consideré correcto incorporar un while y preguntar al usuario si quiere continuar luego de cada conversión, el usuario respondería solo con 2 opciones: s ó n, el detalle es que no he conseguido que el programa me reconozca el char ingresado por el usuario, logré arreglarlo momentáneamente para que me reconozca el valor numérico de los caracteres pero eso se aleja de la idea original, no logro encontrar la falla en mi código y en verdad agradecería cualquier ayuda o crítica constructiva que puedan brindarme.

El entorno de programación que estoy utilizando es:
Codeblocks 10050 (http://forums.codeblocks.org/index.php/board,20.0.html)
MinGW-w64 4.9.2 POSIX - DWARF (http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/)

Este es el código que he escrito hasta ahora.


/* Convertidor de colores hexadecimales a colores RGB */
#include <stdio.h>

/* Función que devuelve el valor decimal de una cifra hexadecimal */
int hex_to_dec(char letra);

int main(void)
{
    char color[7];
    char respuesta = 115;
    int rgb[3];
    int contador, factor, position;

    /* 110 = Valor ASCII de la letra n
       115 = Valor ASCII de la letra s */
    while(respuesta != 110)    // Aca puse anteriormente while(respuesta != 'n') pero no funciono
    {
        /* Inicializando valores */
        for(contador = 0; contador <= 2; contador++)
            rgb[contador]= 0;

        position = 0;

        /* Ingresando el color en hexadecimal */
        printf("Color hexadecimal: ");
        scanf("%s", color);

        /* Iniciando procesamiento de datos para hallar el color RGB */
        for(contador = 0; color[contador] != '\0'; contador++)
        {
            factor = (contador % 2 == 0) ? 16 : 1;

            if(color[contador] >= 49 && color[contador] <= 57)
                rgb[position] += (color[contador] - 48) * factor;
            else if(color[contador] >= 97 && color[contador] <= 102)
                rgb[position] += hex_to_dec(color[contador]) * factor;
            else if(color[contador] >= 65 && color[contador] <= 70)
                rgb[position] += hex_to_dec(color[contador]) * factor;

            if(factor == 1)
                position++;
        }

        /* Mostrando los valores decimales del número hexadecimal */
        printf("RGB: ");
        for(contador = 0; contador <= 2; contador++)
        {
            if(contador == 2)
                printf("%d", rgb[contador]);
            else
                printf("%d - ", rgb[contador]);
        }
        printf("\n");

        /* Preguntando respuesta para continuar */
        printf("Continuar? s/n: ");
        scanf("%d", &respuesta);    // Aca puse anteriormente scanf("%c", &respuesta) pero el programa no ejecutaba el scanf
        printf("\n");
    }

    return 0;
}

/* Definiendo la función que devuelve el valor decimal de una cifra hexadecimal */
int hex_to_dec(char letra)
{
    int contador;
    static int base = 10;
    static char minusculas[6] = {'a', 'b', 'c', 'd', 'e', 'f'};
    static char mayusculas[6] = {'A', 'B', 'C', 'D', 'E', 'F'};

    /* Recorriendo el arreglo para encontrar coincidencias */
    for(contador = 0; contador <= 5; contador++)
    {
        if(letra == minusculas[contador] || letra == mayusculas[contador])
            break;
    }

    return base + contador;
}
#2
Estimados señores, los saludo muy cordialmente y paso a exponer mi duda. Soy programador principiante y autodidacta, he estado realizando un ejercicio que consiste en crear una clase llamada Fecha con 3 campos miembro: Year, Month y Day, el ejercicio pide además que se hagan ciertas comprobaciones para asegurar que solo se introducen datos válidos.

En el archivo Fecha.java está la definición de la clase principal y consideré oportuno definir métodos privados para la verificación interna de los datos, el problema está en el método privado nameMonth que debería devolver el nombre del mes en función del valor numérico del campo miembro Month, me sale error en la línea al final de la estructura switch donde está la instrucción: "return nombre", el compilador me dice que la variable no está inicializada, como debería inicializar la variable nombre para que el método funcione correctamente?

Archivo Fecha.java
Código (java) [Seleccionar]

/* Definicion general de la clase Fecha */

public class Fecha
{
    private int year, month, day;
   
    public Fecha(int y, int m, int d)
    {
        year = (y <= 0) ? 2014 : y;
        month = verifyMonth(m);
        day = verifyDay(d);
    }
   
    /* Metodo privado que devuelve el nombre del mes en funcion a su numero */
    private String nameMonth(int mes)
    {
        String nombre;
       
        switch(mes)
        {
            case 1:
                nombre = "Enero";
                break;
            case 2:
                nombre = "Febrero";
                break;
            case 3:
                nombre = "Marzo";
                break;
            case 4:
                nombre = "Abril";
                break;
            case 5:
                nombre = "Mayo";
                break;
            case 6:
                nombre = "Junio";
                break;
            case 7:
                nombre = "Julio";
                break;
            case 8:
                nombre = "Agosto";
                break;
            case 9:
                nombre = "Septiembre";
                break;
            case 10:
                nombre = "Octubre";
                break;
            case 11:
                nombre = "Noviembre";
                break;
            case 12:
                nombre = "Diciembre";
                break;
        }
       
        return nombre;
    }
   
    /* Metodo privado para saber si un year es bisiesto */
    private boolean Bisiesto(int y)
    {
        if((y % 4 == 0) && (!(y % 100 == 0) || (y % 400 == 0)))
            return true;
        else
            return false;
    }
   
    /* Metodo privado para verificar si el mes asignado es el correcto */
    private int verifyMonth(int mes)
    {
        int valor;
       
        if(mes <= 0)
            valor = 1;
        else if(mes > 12)
            valor = 12;
        else
            valor = mes;
           
        return valor;               
    }
   
    /* Metodo para verificar si el dia asignado es el correcto */
    private int verifyDay(int dia)
    {
        int maximo, valor;
       
        /* Evaluando el valor de los campos miembro month y year para determinar el maximo valor en dias de cada mes  */
        switch(month)
        {
            case 4:
            case 6:
            case 9:
            case 11:
                maximo = 30;
                break;
            case 2:
                maximo = (Bisiesto(year)) ? 29 : 28;
                break;
            default:
                maximo = 31;
                break;
        }
       
        if(dia <= 0)
            valor = 1;
        else if(dia > maximo)
            valor = maximo;
        else
            valor = dia;
           
        return valor;           
    }
   
    /* Metodo para mostrar la fecha */
    public String mostrarFecha()
    {
        String fecha = String.format("%d de %s de %d", day, nameMonth(month), year);
        return fecha;
    }
}


Archivo PruebaFecha.java
Código (java) [Seleccionar]

/* Prueba general de la clase Fecha */
import java.util.Scanner;

public class PruebaFecha
{
    public static void main(String args[])
    {
        Scanner entrada = new Scanner(System.in);
        Fecha miFecha = new Fecha(2014, 6, 2);
       
        System.out.printf("\nLa fecha es %s\n", miFecha.mostrarFecha());
    }
}


De antemano les agradezco cualquier ayuda que puedan darme, saludos y éxitos a todos.
#3
Estimados señores: Soy un estudiante autodidacta y de nivel principiante del lenguaje C, siempre que he querido mostrar acentos en mis textos lo he hecho de la siguiente manera:
printf("\nN%cmero de cuenta: ", 163);

Tenía entendido que también se podía colocar el valor hexadecimal de caracter insertándolo en el mismo texto de la siguiente manera:
printf("\nN\xA3mero de cuenta: ");

Así lo hice y escribí un programa en donde usé varias veces los valores hexadecimales para mostrar correctamente las letras con acentos y al momento de compilar me sale el siguiente mensaje:

warning: secuencia de escape hexadeximal fuera de rango (enabled by default)

En el programa que estaba escribiendo tenía como 5 líneas de código con instrucciones printf que usaban estos valores y me salió 5 veces el mensaje arriba expuesto. La tabla que estoy usando es esta:

á: \xA0
é: \x82
í: \xA1
ó: \xA2
ú: \xA3

El programa compiló igualmente y al momento de ejecutarlo en donde se supone que debería estar una letra con acento solo hay una línea, algo asi como "N-mero de cuenta: ".

Estoy haciendo algo mal? O se requiere algún archivo de cabecera extra? (Hasta ahora solo he usado el stdio.h) De antemano les agradezco cualquier ayuda que puedan brindarme, ah y por cierto, mi entorno donde programo es este:

Compilador: gcc 4.8.1-4 (MinGW - www.mingw.org)
IDE: Codeblocks svn 9677 (Nightly)
S.O: Windows XP SP3