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

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Temas
Páginas: 1 [2] 3
11  Programación / Programación C/C++ / [C] Decimal a base n, con n<10 en: 20 Octubre 2013, 22:51 pm
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! :)
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #define MAXBASE 9
  5. struct numeroB10
  6. {
  7.    int num;
  8.    struct numeroB10 *next;
  9. };
  10. typedef struct numeroB10 BASE;
  11. typedef BASE *BASE_PTR;
  12.  
  13. int input_numero_natural();
  14. int input_mayor_base();
  15. BASE_PTR add_to_list(int residuo, BASE_PTR prev_rec);
  16. char input_error_sino();
  17. void liberar_espacio(BASE_PTR ultimo);
  18.  
  19. int main()
  20. {
  21.    int numero=0,aux=0,cociente=0,residuo=0,base=0;
  22.    char bucle='0';
  23.    BASE_PTR digit_addr=NULL;
  24.    BASE_PTR impresor=NULL;
  25.    do
  26.    {
  27.        system("CLS");
  28.        printf("Conversor de base 10 a base n\n\nInstrucciones: Ingresa un numero natural en base 10: ");
  29.        numero = input_numero_natural(); //Se valida que sea un dato entero y positivo
  30.        printf("\nAhora elige una base entre 1 y 9 para convertir el numero: ");
  31.        base = input_mayor_base(); //Validacion de base
  32.            if(numero<base)
  33.                puts("\nEl numero a convetir es el mismo!");
  34.            else
  35.            {
  36.                aux = numero;
  37.                    while(aux>=base)
  38.                    {
  39.                        cociente = aux/base;
  40.                        residuo = aux%base;
  41.                        digit_addr = add_to_list(residuo,digit_addr);
  42.                        aux = cociente;
  43.                    }
  44.                digit_addr = add_to_list(aux,digit_addr);
  45.                impresor = digit_addr;
  46.                printf("\nEl numero %d en base 10 es igual a ",numero);
  47.                    while(impresor!=NULL)
  48.                    {
  49.                        printf("%d",impresor->num);
  50.                        impresor = impresor->next;
  51.                    }
  52.                printf(" en base %d",base);
  53.                liberar_espacio(digit_addr);
  54.                digit_addr=NULL;
  55.                impresor=NULL;
  56.            }
  57.        printf("\n\nQuieres convertir otro numero? ( S/N ): ");
  58.        bucle = input_error_sino();
  59.    }while(bucle=='S');
  60.    return (0);
  61. }
  62.  
  63. /*Funcion: input_mayor_base
  64.   Proposito: Valida que los datos de entrada del usuario sean numeros y evita que se procesen letras, signos o
  65.              numeros negativos, se usa al pedir la base a convertir.*/
  66. int input_mayor_base()
  67. {
  68.    int respuesta;
  69.    while((scanf("%d",&respuesta) != 1)||respuesta<=1||respuesta>MAXBASE) //en caso de ñ y datos raros.
  70.        {
  71.            while (getchar() != '\n');
  72.            if(respuesta>MAXBASE)
  73.            {
  74.                printf("\nSolo puedes convertir hasta base 9: ");
  75.            }
  76.            else
  77.            {
  78.                printf ("\nDato no valido intenta de nuevo: ");
  79.            }
  80.        }
  81.    return respuesta;
  82. }
  83. /*Funcion: input_numero_natural()
  84.   Proposito: Valida que los datos de entrada del usuario sean numeros y evita que se procesen letras, signos o
  85.              numeros negativos, se usa al pedir la base a convertir.*/
  86. int input_numero_natural()
  87. {
  88.    int respuesta;
  89.    while((scanf("%d",&respuesta) != 1)||respuesta<=0) //en caso de ñ y datos raros.
  90.        {
  91.            while (getchar() != '\n');
  92.            if(respuesta==0)
  93.            {
  94.                printf("\nEl numero 0 es el mismo para todas las bases: ");
  95.            }
  96.            else
  97.            {
  98.                printf ("\nDato no valido intenta de nuevo: ");
  99.            }
  100.        }
  101.    return respuesta;
  102. }
  103. /*Funcion: BASE_PTR add_to_list()
  104.   Proposito: Crear un bloque en memoria para el numero a convertir*/
  105. BASE_PTR add_to_list(int residuo, BASE_PTR prev_rec)
  106. {
  107.    BASE_PTR new_rec = NULL;
  108.    new_rec = (BASE_PTR) malloc(sizeof(BASE)); // Crear jugador
  109.    if(!new_rec)
  110.    {   //Validacion de malloc
  111.        printf("Error al reservar memoria");
  112.        exit(1);
  113.    }
  114.    new_rec->num= residuo;
  115.    new_rec->next = NULL;
  116.    if(prev_rec) //Si hay un elemento antes
  117.    {
  118.        new_rec->next = prev_rec;
  119.  
  120.    }
  121.    return(new_rec);
  122. }
  123. /*Funcion:input_error_sino
  124.   Proposito: Valida que la respuesta sea el caracter S o N,
  125.   se usa en la ultima pregunta para volver a correr el programa */
  126. char input_error_sino()
  127. {
  128.    char respuesta;
  129.    respuesta = getche();
  130.    respuesta = toupper(respuesta);
  131.    printf("\n\n");
  132.        while(respuesta!='S'&&respuesta!='N') //Error si teclea otra cosa
  133.            {
  134.                printf("Opcion invalida, intenta de nuevo: ");
  135.                respuesta = getche();
  136.                puts("");
  137.                respuesta = toupper(respuesta);
  138.            }//Fin mensaje error
  139.    return (respuesta);
  140. }
  141. /*Funcion:liberar_espacio()
  142.   Proposito: borrar numeros generados.*/
  143. void liberar_espacio(BASE_PTR ultimo)
  144.  {
  145.      BASE_PTR aux = NULL;
  146.      aux = ultimo;
  147.      while(aux->next!=NULL)
  148.      {
  149.          ultimo = ultimo->next;
  150.          free(aux);
  151.          aux = ultimo;
  152.      }
  153.      free(aux);
  154.  }
12  Informática / Software / [Excel] Deshabilitar redondeo version 2007 en: 16 Octubre 2013, 22:58 pm
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?
13  Programación / Programación C/C++ / [C] Lista doble y error en campo anterior, siguiente en: 10 Octubre 2013, 02:54 am
Hola, la semana pasada pregunté por una lista ligada simple y partiendo de ese código agregué un apuntador al campo anterior para convertirla en una lista doble circular.

El problema creo sucede cuando le paso los parametros a la funcion que crea el nodo en la linea 30, los parametros son el nombre del jugador, el apuntador del elemento anterior y el apuntador al siguiente.

Lo que me esta costando trabajo es visualizar cuando se crea el primer elemento que apunta a si mismo y los demas apuntan al anterior o posterior pero no a si mismos  :huh:

Pregunta: Que apuntador se debe pasar para el campo siguiente?
cuando es una lista simple se pasa la direccion del elemento anterior para asignarle en su campo siguiente el valor del nuevo nodo, pero aqui??

reedito: cometi de nuevo el error de asignacion en: if(i==0), ya edite el código


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct persona
  4. {
  5.    char *nombre;
  6.    struct persona *next;
  7.    struct persona *prev;
  8. };
  9. typedef struct persona JUGADOR;
  10.  
  11. typedef JUGADOR *J_PTR;
  12.        J_PTR first = NULL;
  13.        J_PTR last = NULL;
  14.  
  15. J_PTR add_to_list(char *ch, J_PTR prev_rec,J_PTR next_rec);
  16.  
  17. int main()
  18. {
  19.    int i,num_jugadores;
  20.    char *nombre;
  21.    J_PTR j_addr = NULL;
  22.    printf("Escribe el numero de jugadores: ");
  23.    scanf("%d",&num_jugadores);
  24.    while(getchar()!='\n');
  25.    printf("\nAhora cada uno de sus nombres\n\n");
  26.    for(i=0;i<num_jugadores;i++)
  27.    {
  28.        printf("Jugador %d: ",i+1);
  29.        scanf("%s",&nombre);
  30.        j_addr = add_to_list(nombre, j_addr, first); /*la funcion devuelve new_rec*/
  31.            if(i==0)
  32.            {
  33.                first = j_addr;
  34.            }
  35.        last = j_addr;
  36.        last->next = first;
  37.  
  38.            printf("Nombre:%s\nprev: %p  \nnext: %p\n",nombre,(void *)j_addr->prev,(void *)j_addr->next);
  39.  
  40.        puts("\n");
  41.    }
  42. }
  43.  
  44. J_PTR add_to_list(char *name, J_PTR prev_rec,J_PTR next_rec)
  45. {
  46.    J_PTR new_rec = NULL;
  47.    new_rec = (J_PTR) malloc(sizeof(JUGADOR)); // Crear jugador
  48.    if(!new_rec)
  49.    {   //Validacion de malloc
  50.        printf("Error al reservar memoria");
  51.        exit(1);
  52.    }
  53.    new_rec->nombre = name;
  54.    new_rec->next = NULL;
  55.    new_rec->prev = NULL;
  56.    if(prev_rec) //Si hay un elemento antes
  57.    {
  58.        prev_rec->next = new_rec;
  59.        new_rec->prev = prev_rec;
  60.    }
  61.    new_rec->next = next_rec;
  62.    return(new_rec);
  63. }
  64.  
14  Programación / Programación C/C++ / [C] Funcion regresa array de caracteres en: 9 Octubre 2013, 05:59 am
Hola, tengo una función que pide el nombre de una persona, quiero que regrese el arreglo de caracteres para que en main se haga uso del nombre tecleado. Hay un tema donde usan apuntadores, he tratado de adaptarlo a mi funcion pero me da error, algo estoy haciendo mal:

Código
  1. /*Que debe regresar?*/ input_nombre()
  2. {
  3.    char nombre[20];
  4.    int longitud=0;
  5.    do
  6.    {
  7.        printf("Persona 1: ");
  8.        scanf("%s",&nombre);
  9.            while (getchar() != '\n');
  10.        longitud = strlen(nombre);
  11.        if(longitud>20)
  12.        {
  13.            printf("\nError, el nombre no puede ser mayor a 20 caracteres\n\n");
  14.        }
  15.  
  16.    }while(longitud>20);
  17.    return //El nombre de la persona
  18. }

Eventualmente voy a guardar el nombre en una estructura en su campo nombre[20]  :huh:
15  Programación / Programación C/C++ / [C] Apuntadores a estructuras en: 4 Octubre 2013, 18:25 pm
Hola, estoy construyendo una lista de numeros pero al compilar me da error por el operador ->, alguien nota el error?
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct st_num //Plantilla para numero aleatorio.
  4. {
  5.    int rand_num;
  6.    struct st_num *ptr_next;
  7. }st_num;
  8.  
  9. typedef struct
  10. {
  11.    st_num *head;
  12.    st_num *last;
  13.  
  14. }fila;
  15.  
  16. int main()
  17. {
  18.    int i;
  19.    int respuesta_num; //Dato tecleado por usuario
  20.    char key_buff[40];
  21.    st_num *nodo;
  22.    menu_principal(); //Borrar pantalla y desplegar texto
  23.    scanf("%d",&respuesta_num);
  24.    gets(key_buff); //limpiar buffer
  25.    fila->head = NULL;
  26.    fila->last = NULL;
  27.  
  28.    for(i=0;i<respuesta_num;i++)
  29.    {
  30.        nodo = (st_num *) malloc(sizeof(st_num)); //Direccion de bloque creado
  31.        nodo->rand_num = rand()%100+1;
  32.            if(i=0) //Edicion de primer elemento
  33.            {
  34.                fila->head = nodo;
  35.                fila->last = nodo;
  36.                nodo->ptr_next = NULL;
  37.            }
  38.            if(nodo->ptr_next != NULL)
  39.            {
  40.                nodo ->ptr_next = fila->head;
  41.            }
  42.        fila->head = nodo;
  43.        printf("%d\n",nodo->ptr_next);
  44.    }
  45. }
  46.  
16  Programación / Programación C/C++ / [C] Introduccion a estructuras y apuntadores en: 13 Septiembre 2013, 09:11 am
Hola, estoy aprendiendo estructuras y apuntadores, tengo un código muy básico:
Código
  1. #include <stdio.h>
  2. void main()
  3. {
  4.    typedef struct coordinate
  5.        {
  6.            char nombre[15];
  7.            int x,y;
  8.        }coordinate;
  9.    coordinate ubicacion_01,ubicacion_02;
  10.    coordinate  *ptr_punto;
  11.    ptr_punto=&ubicacion_01;
  12.    puts("Escribe el nombre del lugar");
  13.    gets(ptr_punto->nombre);
  14.    printf("Lugar: %s",(*ptr_punto).nombre);
  15.    getch();
  16. }
  17. }

Pregunta:

Se deben inicializar las variables al crear una estructura?, si a x,y les doy el valor de cero el compilador me da error, hay algun problema si no inicializo el arreglo nombre y las variables enteras?

La sentencia typedef esta bien dentro de main? o debo declarar la estructura fuera como prototipo?
saludos!
17  Programación / Programación C/C++ / [C] error en scanf("%c",&variable) en: 23 Junio 2013, 00:14 am
Hola, tengo un problema con algo tan sencillo:

1- Entrada de nombre sin problemas, al dar una nueva linea la entrada de matricula falla
2- como matricula se imprimen datos basura, no te deja escribir nada, por lo tanto la condicion no funciona y lo demas tampoco  :(
Código
  1. int informacion_personal()
  2. {
  3.    char nombre_apellido[50];
  4.    char id[12];
  5.    unsigned short numero_caracteres=0;
  6.    printf("Para finalizar escribe tu nombre y matricula\n\n");
  7.    printf("Nombre: ");
  8.    scanf(" %c",&nombre_apellido);
  9.    printf("\nMatricula: ");
  10.    scanf("%c",&id);
  11.    numero_caracteres = strlen(id);
  12.    if(numero_caracteres>9)
  13.    {
  14.        printf("Demasiados caracteres!\n");
  15.    }
  16.    strcpy(nombre,nombre_apellido);
  17.    printf("%s %s",matricula,nombre);
  18.    getch();
  19. }
  20.  

No hay mucho que pueda hacer, intente con gets pero al correr se salta la instruccion y no puedes escribir nada, tenia asignado los valores a variables globales (nombre y matricula) pensando que eso era el problema pero no, reasigne a locales y nada.
18  Programación / Programación C/C++ / [C] Imprimir Triangulo de Pascal en: 6 Junio 2013, 06:55 am
Cambiar la impresion de un arreglo (C++)

Como puedo imprimir las tabulaciones para darle forma al triangulo en C?
Código
  1. #include<stdio.h>
  2.  
  3. int main()
  4. {
  5.    int i,j=1,k=1,tab,n=4; //i = renglones  j = elementos
  6.    long int elemento;
  7.    for(i=0;i<14;i++) //Renglones 0,1,2,3,4,5...
  8.    {
  9.        for(j=0;j<k;j++) //Renglon 0, elemento 1
  10.        {
  11.            elemento = (facto(i))/(facto(j)*(facto(i-j)));
  12.            printf("%d ",elemento);
  13.  
  14.        }
  15.        k++;
  16.        printf("\n");
  17.        n-=1;
  18.  
  19.    }
  20. }
  21.  
  22. facto(long long int num)
  23. {
  24.   int i=num;
  25.   long long fact=1;
  26.   for(i=num;i>1;i--)
  27.    {
  28.        fact*=i;
  29.    }
  30.    return fact;
  31. }
  32.  

Estaba intentando con:
Código
  1. for(tab=n;tab>0;tab--)
  2.        {
  3.            printf("\t");
  4.        }
pero queda mal, muy mal  :laugh:
19  Programación / Programación C/C++ / [C] e^x, si x es grande, numero negativo en: 3 Junio 2013, 05:26 am
Hola,
tengo que calcular el valor de e^x con la serie 1+x+((x^2)/2!)+((x^n)/n!)
encontre un tema relacionado, el código descrito da el mismo resultado que el que yo he hecho.

1- No estoy seguro si he definido bien las variables
2- Para numeros muy grandes el resultado es falso, se arroja un numero negativo, leí en otro tema que se debe definir una funcion que permita numeros muy grandes (a la hora de calcular el factorial) porque la compilacion tiene un limite.

¿Se puede definir una variable mayor a long long?

Como me ha sucedido en ocasiones anteriores, el programa funciona pero no tengo la certeza de que el código este bien escrito. Comentarios y sugerencias bienvenidas.

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3. main()
  4. {
  5.    int e,respuesta,n;
  6.    float resultado=0;
  7.    printf("Calcular e^x\n ");
  8.    printf(" Valor de x: ");
  9.    scanf("%d",&respuesta);
  10.    printf(" Numero de terminos: ");
  11.    scanf("%d",&n);
  12.    for(e=n;e>1;e--)
  13.        {
  14.            resultado+= (pow(respuesta,n)) / (facto(n));
  15.            n--;
  16.        }
  17.    resultado += 1 + respuesta;
  18.  
  19.    printf("\ne^%d: %.4f",respuesta,resultado);
  20. }
  21.  
  22. facto(long long int num)
  23. {
  24.   int i=num;
  25.   long long fact=1;
  26.   for(i=num;i>1;i--)
  27.    {
  28.        fact*=i;
  29.    }
  30.    return fact;
  31. }
saludos!
20  Programación / Programación C/C++ / [C] Problema con Arrays. en: 25 Mayo 2013, 03:01 am
Hola,
estoy revisando el tema de arreglos y necesito crear un programa que calcule el promedio de 5 calificaciones tecleadas, esto va por alumno. Creo que el problema esta en los renglones 29, 30.

Al final cuando imprime el promedio del alumno 1, alumno 2 etc, solamente el primer dato es correcto, los demas no, imagino que estoy asignando mal los valores a cada variable del arreglo alumno[r].

Mi idea es la sig: Se ingresan las 5 calificaciones que se suman y guardan en califsum, despues se calcula el promedio de dichos datos y se almacena el resultado en alumno[n], al final se tienen los promedios de 10 alumnos en el arreglo. Tambien debo obtener el promedio general, pero no se como trabajar los elementos de un arreglo (en general para sumar, restar,etc)

Código
  1. #include <stdio.h>
  2.  
  3. main()
  4. {
  5.    int i=0,j,k=1,r=0,alu=1,calif=0,califsum=0,respuesta=0;
  6.    float califprom=0,alumno[10]={0};
  7.    printf("Cuantos alumnos quieres registrar?: ");
  8.    scanf("%d,",&respuesta); //El numero de alumnos esta contenido en respuesta
  9.    while(respuesta>10)
  10.    {
  11.        printf("El sistema no permite registrar mas de 10 alumnos por sesion.\n");
  12.        printf("Cuantos alumnos quieres registrar?: ");
  13.        scanf("%d,",&respuesta); //El numero de alumnos esta contenido en respuesta
  14.    }
  15.    for(i=0;i<respuesta;i++) //Bucle para el numero de alumnos
  16.    {
  17.        j=0;
  18.        printf("Teclea las calificaciones del alumno %d:\n",i+1);
  19.        while(j<5) //Bucle por 5 calificaciones
  20.        {
  21.            printf("%d. ",k); //Se imprime el numero de calificacion 1. 2. 3. etc.
  22.            scanf("%d",&calif);
  23.            califsum+= calif;
  24.            k++;
  25.            j++;
  26.        }
  27.        k=1;
  28.        califprom = califsum / 5;
  29.        alumno[r] = califprom;
  30.        r++;
  31.    }
  32.    printf("\nDetalle de calificaciones:\n\n");
  33.    r=0;
  34.    while(alu<=respuesta)
  35.    {
  36.        printf("Promedio Alumno %d: %.2f\n",alu,alumno[r]);
  37.        alu++;
  38.        r++;
  39.    }
  40. }

¿Se pueden imprimir incrementos ++ en printf()? en la linea 18 por ejemplo tuve que modificar porque al tener i++ las cosas no funcionaban:
Código
  1. printf("Teclea las calificaciones del alumno %d:\n",i++);

espero entiendan lo que trato de hacer,
saludos!
Páginas: 1 [2] 3
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines