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

#41
Cita de: eferion en 22 Octubre 2013, 11:47 AM
... otra cosa es que el código resultante sea robusto,  reutilizable y fácil de mantener.

entiendo, entonces esto se resuelve en el diseño del algoritmo, no en la códificación  :o

Cita de: ivancea96 en 22 Octubre 2013, 21:15 PM
deberías quitar las funciones "input". No quitarlas, sino meterlas todas en una.

Se me ocurren condiciones para los tres casos
     1) ( numero a convertir > 0 )
     2) ( 1 < base tecleada < 10 )
     3) ( respuesta para repetir el programa == 'S' || 'N' )

Si la tercera funcion regresa dato tipo entero puedo usar los numeros 110, 115 para las letras N, S?
es decir leo un caracter (%c) en scanf() pero lo trato como entero en las condiciones

int input_general(int condicion)
{
    int respuesta;
    switch(condicion)
    {
    case 1:
        {
            // Entrada de numero a convertir
            break;
        }
    case 2:
        {
            //Entrada de base
            break;
        }
    case 3:
        {
            //Quieres repetir el programa: SI, NO?
        }
    }
    return (respuesta);
}


es solo una dea, no la he probado y no se si funcione la parte de tener una variable tipo entero y leer en scanf (%c).
#42
Cita de: eferion en 21 Octubre 2013, 22:20 PM
Todo diseño que hagas debería tener como uno de sus fundamentos la reutilización del código. Si el núcleo de un algoritmo está ubicado en el main mal empezamos.

La representación de los datos, así como el proceso para que el usuario introduzca la información pedida, deberían estar también aislados del núcleo del algoritmo, de esa forma te va a resultar bastante más sencillo reutilizar el algoritmo y adaptarlo a diferentes situaciones.

Gracias, nunca habia pensado en esto, ahora que lo mencionas entiendo la portabilidad de un programa. (y revisando varios de mis códigos el nucleo nunca esta bien definido o se encuentra disperso en main)

Saludos!
#43
Programación C/C++ / Re: Presentación y dudas
21 Octubre 2013, 18:58 PM
Te dejo mas bibliografia para C:

1. Garcia Bermejo Giner Jose R, Programación estructurada en C, Ed Pearson Educacion SA, 2008.

2. Augie Hansen, C Programming A complete guide to mastering the C language, Ed Addison-Wesley, 1989

3. Van Wyk, Christopher J, Data structures and C programs, Ed Addison-Wesley, 1988

4. Deitel, Harvey M, Como programar en C/C++, Ed Prentice Hall Hispanoamericana SA, 1995

5. Darnell Peter A, C a software engineering approach

6. Himmel David, Certified course in C

7. Swan Tom, Type and Learn C

Para los ultimos no tengo el dato completo de la editorial, edicion y año

Saludos!
#44
Cita de: eferion en 21 Octubre 2013, 09:06 AM
No se si te has dado cuenta que la usabilidad del código fuera de tu programa es 0.
No se exactamente a que te refieres pero yo tampoco le veo gran uso a este código, nunca he trabajado con otras bases y en todo caso las direcciones de memoria estan en hexadecimal, que este programa no convierte El objetivo principal es implementar una lista ligada, el caso particular es convertir un numero de una base a otra.

Cita de: eferion en 21 Octubre 2013, 09:06 AM
para este caso concreto, se pudiese hacer la conversión con un main propio sin tener que "copiar y pegar".
Entonces la conversion debe estar fuera de main? imagino que la impresion de digitos tambien así la estructura de main puede cambiar dando el mismo resultado, o no?

Cita de: eferion en 21 Octubre 2013, 09:06 AM
A mi, personalmente, me parece estupendo que se publiquen códigos como este, ya que los que están aprendiendo pueden ver códigos de gente más madura. Pero creo que si se hacen cosas así hay que hacerlo con un poco más de cariño.
Te entiendo, trato de hacer las cosas lo mejor posible aunque el código refleje lo contrario para usuarios avanzados, en todo caso revela que el proceso de aprendizaje no ha concluido y falta mucho por aprender.

Cita de: eferion en 21 Octubre 2013, 09:06 AM
Además, tu programa está limitado a un uso con consola de comandos... portarla para ser utilizada en una aplicación con interfaz gráfica requeriría otro esfuerzo adicional.
He abogado mucho por los temas de interfaz gráfica pero los profesores insisten que el verdadero poder lo tiene la consola y el GUI es solo la cara bonita del programa que carece de importancia para el curso.  :-\

Saludos!
#45
Yo estoy comenzando a programar y no tenia idea que las antigüas generaciónes trabajaban en papel, ahora llevo un curso en C y no hemos tocado la computadora ni una sola vez.

En lo personal me parece ridiculo aprender a patinar sin usar patines, andar en bicicleta sin tener una o programar sin escribir codigos en una computadora. Una hoja de papel no reconoce errores de sintaxis o elementos mal declarados.

La mayoria de los temas los reviso por mi cuenta, ya sea preguntando en el foro, buscando en la red o en libros e insisto mucho en que debe haber practica, creando y compilando los temas visto, asi uno tiene la certeza de haber entendido y que todo va bien.

Yo siempre paso los códigos de libros para poder modificarlos, agregar cosas y jugar con ellos, es la unica manera en que aprendo.

Cita de: Danyfirex en 20 Octubre 2013, 05:35 AM
Si vas a ser programador si o si necesitas el PC mas que el profe diga misa.

Saludos!!
#46
Hola, de nuevo posteando códigos de nivel básico-intermedio, uso una lista simple para ir almacenando cada digito del numero convertido:

Comentarios y sugerencias bienvenidas! :)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXBASE 9
struct numeroB10
{
    int num;
    struct numeroB10 *next;
};
typedef struct numeroB10 BASE;
typedef BASE *BASE_PTR;

int input_numero_natural();
int input_mayor_base();
BASE_PTR add_to_list(int residuo, BASE_PTR prev_rec);
char input_error_sino();
void liberar_espacio(BASE_PTR ultimo);

int main()
{
    int numero=0,aux=0,cociente=0,residuo=0,base=0;
    char bucle='0';
    BASE_PTR digit_addr=NULL;
    BASE_PTR impresor=NULL;
    do
    {
        system("CLS");
        printf("Conversor de base 10 a base n\n\nInstrucciones: Ingresa un numero natural en base 10: ");
        numero = input_numero_natural(); //Se valida que sea un dato entero y positivo
        printf("\nAhora elige una base entre 1 y 9 para convertir el numero: ");
        base = input_mayor_base(); //Validacion de base
            if(numero<base)
                puts("\nEl numero a convetir es el mismo!");
            else
            {
                aux = numero;
                    while(aux>=base)
                    {
                        cociente = aux/base;
                        residuo = aux%base;
                        digit_addr = add_to_list(residuo,digit_addr);
                        aux = cociente;
                    }
                digit_addr = add_to_list(aux,digit_addr);
                impresor = digit_addr;
                printf("\nEl numero %d en base 10 es igual a ",numero);
                    while(impresor!=NULL)
                    {
                        printf("%d",impresor->num);
                        impresor = impresor->next;
                    }
                printf(" en base %d",base);
                liberar_espacio(digit_addr);
                digit_addr=NULL;
                impresor=NULL;
            }
        printf("\n\nQuieres convertir otro numero? ( S/N ): ");
        bucle = input_error_sino();
    }while(bucle=='S');
    return (0);
}

/*Funcion: input_mayor_base
  Proposito: Valida que los datos de entrada del usuario sean numeros y evita que se procesen letras, signos o
             numeros negativos, se usa al pedir la base a convertir.*/
int input_mayor_base()
{
    int respuesta;
    while((scanf("%d",&respuesta) != 1)||respuesta<=1||respuesta>MAXBASE) //en caso de ñ y datos raros.
        {
            while (getchar() != '\n');
            if(respuesta>MAXBASE)
            {
                printf("\nSolo puedes convertir hasta base 9: ");
            }
            else
            {
                printf ("\nDato no valido intenta de nuevo: ");
            }
        }
    return respuesta;
}
/*Funcion: input_numero_natural()
  Proposito: Valida que los datos de entrada del usuario sean numeros y evita que se procesen letras, signos o
             numeros negativos, se usa al pedir la base a convertir.*/
int input_numero_natural()
{
    int respuesta;
    while((scanf("%d",&respuesta) != 1)||respuesta<=0) //en caso de ñ y datos raros.
        {
            while (getchar() != '\n');
            if(respuesta==0)
            {
                printf("\nEl numero 0 es el mismo para todas las bases: ");
            }
            else
            {
                printf ("\nDato no valido intenta de nuevo: ");
            }
        }
    return respuesta;
}
/*Funcion: BASE_PTR add_to_list()
  Proposito: Crear un bloque en memoria para el numero a convertir*/
BASE_PTR add_to_list(int residuo, BASE_PTR prev_rec)
{
    BASE_PTR new_rec = NULL;
    new_rec = (BASE_PTR) malloc(sizeof(BASE)); // Crear jugador
    if(!new_rec)
    {   //Validacion de malloc
        printf("Error al reservar memoria");
        exit(1);
    }
    new_rec->num= residuo;
    new_rec->next = NULL;
    if(prev_rec) //Si hay un elemento antes
    {
        new_rec->next = prev_rec;

    }
    return(new_rec);
}
/*Funcion:input_error_sino
  Proposito: Valida que la respuesta sea el caracter S o N,
  se usa en la ultima pregunta para volver a correr el programa */
char input_error_sino()
{
    char respuesta;
    respuesta = getche();
    respuesta = toupper(respuesta);
    printf("\n\n");
        while(respuesta!='S'&&respuesta!='N') //Error si teclea otra cosa
            {
                printf("Opcion invalida, intenta de nuevo: ");
                respuesta = getche();
                puts("");
                respuesta = toupper(respuesta);
            }//Fin mensaje error
    return (respuesta);
}
/*Funcion:liberar_espacio()
  Proposito: borrar numeros generados.*/
void liberar_espacio(BASE_PTR ultimo)
  {
      BASE_PTR aux = NULL;
      aux = ultimo;
      while(aux->next!=NULL)
      {
          ultimo = ultimo->next;
          free(aux);
          aux = ultimo;
      }
      free(aux);
  }
#47
Cita de: Darhius en 17 Octubre 2013, 00:22 AM

Intenta desactivando la siguiente casilla.


La casilla esta desactivada, olvidé mencionar que no estoy haciendo la operacion explicitamente, hago referencia a las celdas que tienen los valores, es decir

B7*J7 = Xi * Yi = 6 *-1.033333
#48
lo unico que sucede es que aumenta el numero de ceros pero el calculo sigue como 6.2
#49
Esta pregunta va en la sección de C no?
por regresar entiendo que quieres borrar lineas  :huh: en tal caso si imprimo una cadena de caracteres, la elimino con:

for(i=0;i<longitud de texto;i++)
printf("\b");
#50
Hola, alguien sabe como deshabilitar el redondeo en operaciones.

Ejemplo: 6*(-1.033333) = -6.199998

Excel muestra -6.200000

El tamaño de la celda es lo suficientemente grande
El formato numero despliega varias cifras significativas

:huh: a alguien le ha pasado?