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

#1
Hola amigo, digamos que también soy principiante y casualmente también estoy estudiando el excelente libro de Deitel (Cómo programar en C y C++, Cuarta edición), el problema al que haces referencia es sencillo, mas bien si me permites darte un consejo te diría que en todo problema que quieras resolver primero debes redactar su respectivo algoritmo, una vez que el algoritmo está comprobado ahí recién lo codificas a lenguaje C (sería ideal que te consigas un libro de Algorítmica para que conozcas todo lo relacionado a los algoritmos).

Como te dije antes, el problema que nos concierne es bastante sencillo, consiste básicamente en hacer las comparaciones después de capturar cada número, acá te pongo el código.


#include <stdio.h>

int main(void)
{
    int num01, num02, num03;
    int menor, mayor;

    printf("Ingrese primer n%cmero: ", 163);
    scanf("%d", &num01);

    /* Inicializamos los valores de mayor y menor con el primer numero */
    mayor = num01;
    menor = num01;

    printf("Ingrese segundo n%cmero: ", 163);
    scanf("%d", &num02);

    /* Ahora que mayor y menor ya tienen un valor definido pues podemos empezar a comparar */
    if(num02 > mayor)
        mayor = num02;

    if(num02 < menor)
        menor = num02;

    printf("Ingrese tercer n%cmero: ", 163);
    scanf("%d", &num03);

    if(num03 > mayor)
        mayor = num03;

    if(num03 < menor)
        menor = num03;

    /* Ahora que tenemos al mayor y menor de los numeros pues es tiempo de mostrar los resultados de las operaciones */
    printf("La suma es %d\n", num01 + num02 + num03);
   
    /* Si quieres que el promedio te salga con decimales coloca esto, como lo pusiste antes te saldra la division entera, sin decimales */
    printf("El promedio es %.2f\n", (num01 + num02 + num03) / 3.0);
    printf("El producto es %d\n", num01 * num02 * num03);

    /* Mostrando al mayor y al menor de los numeros */
    printf("El mayor es %d\n", mayor);
    printf("El menor es %d\n", menor);

    return 0;
}


Permíteme explicarte algunos detalles para que quede todo claro.
Siempre que quieras imprimir acentos u otras letras como la ñ en C debes colocar el modificador de caracter (%c) y como segundo parámetro del printf debes colocar el número de posición en la tabla ASCII que ocupa la letra que quieres mostrar, la tabla de códigos ASCII es una tabla que va del 0 al 255 donde están representadas la mayoría de las letras. Si quisieras imprimir la palabra "árbol" deberías usar esto:

printf("%crbol", 160);

Con esto le dice al C que en donde está el indicador %c debe colocar la letra que ocupa el lugar 160 en la tabla ASCII, me refiero a la letra "á".

Quizás ya lo hayas visto pero para representar números decimales (float) se utiliza el modificador %f, el %.2f quiere decir que el número debe mostrarse con 2 cifras decimales después del punto, si solo colocas el %f el número decimal se mostrará con 6 decimales (predeterminado).

Ante cualquier problema no dudes en consultarme.
#2
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;
}
#3
Ah, ese era el problema, yo estaba bien creído que los datos de tipo String se declaraban y no se tenían que inicializar, asi como se declara un int por ejemplo. Te agradezco mucho que me hayas echado una mano.
#4
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.
#5
Les agradezco mucho la ayuda prestada, es motivador saber que mis dudas son solventadas por personas con gran conocimiento del tema.

Saludos y éxitos a todos!!
#6
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