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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Mensajes
Páginas: 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14 15 16 17
41  Programación / Programación C/C++ / Re: Problema con estructuras[Ayuda] en: 7 Noviembre 2012, 22:08 pm
Declaras empleados e[3], sin haber hecho un typedef de la struct y luego usas la struct... etc etc.

Se consecuente con tus declaraciones y con los parámetros que tus funciones reciben y los argumentos que pasas al llamarlas.

Además ten cuidado con cosas como esta:

Código
  1. void ingresar(empleado d);

Debes pasar la referencia de d para poder modificarla.

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct {
  4.     char nom[40];
  5.     int asiento[3];
  6. } empleado;
  7. void ingresar(empleado * d);
  8. void asignarAsiento(empleado q[]);
  9. void imprimir(empleado a);
  10.  
  11. int main()
  12. {
  13.    int i;
  14.      empleado e[3];
  15.      asignarAsiento(e);
  16.      for (i=0; i<3; ++i)
  17.        imprimir(e[i]);
  18.      return 0;
  19. }
  20. void ingresar(empleado * d){
  21.     printf("Nombre: ");
  22.      scanf("%s", d->nom);
  23.     printf("Asiento: ");
  24.      scanf("%d", d->asiento);
  25.    }
  26. void asignarAsiento(empleado e[]){
  27.    int i, j;
  28.    for(i=0; i<3; i++){
  29.        ingresar(&e[i]);
  30.        for(j=0; j<i; j++) {
  31.  
  32.            if( *e[i].asiento == *e[j].asiento ){
  33.                printf ("Asiento ocupado. Vuelva a intentarlo.\n");
  34.                i--;
  35.                break;
  36.            }
  37.        }
  38.    }
  39. }
  40. void imprimir(empleado a){
  41.     printf("Nombre: %s\tAsiento: %d\n", a.nom, *a.asiento);
  42. }
  43.  

Puede que te funcione.
42  Programación / Programación C/C++ / Re: Calculadora hecha en C en: 7 Noviembre 2012, 21:33 pm
@barnix456, bueno tú has insertado todo el código en un mismo archivo y funciona. Pero claro, si tienes programas de 10-20 mil líneas, la cosa se complica.

La idea sería:

funciones.h
Código
  1.  
  2. /* Tipos de datos */
  3.  
  4. /* Encabezados de funciones públicas */
  5.  
  6. void restar(void);
  7. void multiplicar(void);
  8. void dividir(void);
  9. void potencia(void);
  10. void raiz_cuadrada(void);
  11. void seno(void);
  12. void coseno(void);
  13. void tangente(void);

funciones.c
Código
  1.  
  2. /* includes */
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7.  
  8. void sumar(void)
  9. {
  10.    float num1, num2;
  11. printf("\nIntroduzca los dos numeros a sumar: \n");
  12. scanf("%f %f", &num1, &num2);
  13.    printf("\n%.2f", num1 + num2);
  14. return;
  15. }
  16. void restar(void)
  17. {
  18.    float num1, num2;
  19. printf("\nIntroduzca los dos numeros a restar: \n");
  20. scanf("%f %f", &num1, &num2);
  21. printf("\n%.2f", num1 - num2);
  22. return;
  23. }
  24. void multiplicar(void)
  25. {
  26.    float num1, num2;
  27. printf("\nIntroduzca los dos numeros a multiplicar: \n");
  28. scanf("%f %f", &num1, &num2);
  29. printf("\n%.2f", num1 * num2);
  30. return;
  31. }
  32. void dividir(void)
  33. {
  34.    float num1, num2;
  35. printf("\nIntroduzca los dos numeros a dividir: \n");
  36. scanf("%f %f", &num1, &num2);
  37. printf("\n%.2f", num1 / num2);
  38. return;
  39. }
  40. void potencia(void)
  41. {
  42.    float num1, num2;
  43. printf("\nIntroduzca la base: \n");
  44. scanf("%f", &num1);
  45. printf("Introduzca el exponente: \n");
  46. scanf("%f", &num2);
  47. printf("\n%.2f", pow(num1, num2));
  48. return;
  49. }
  50. void raiz_cuadrada(void)
  51. {
  52.    float num1;
  53. printf("\nIntroduzca el numero: \n");
  54. scanf("%f", &num1);
  55. printf("La raiz cuadrada es: %.2f \n", sqrt(num1));
  56. return;
  57. }
  58. void seno(void)
  59. {
  60.    float num1;
  61. printf("\nIntroduzca el numero: \n");
  62. scanf("%f", &num1);
  63. printf("El seno es: %.2f \n", sin(num1));
  64. return;
  65. }
  66. void coseno(void)
  67. {
  68.    float num1;
  69. printf("\nIntroduzca el numero: \n");
  70. scanf("%f", &num1);
  71. printf("El coseno es: %.2f \n", cos(num1));
  72. return;
  73. }
  74. void tangente(void)
  75. {
  76.    float num1;
  77. printf("\nIntroduzca el numero: \n");
  78. scanf("%f", &num1);
  79. printf("La tangente es: %.2f \n", tan(num1));
  80. return;
  81. }


main.c
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "funciones.h" // <- debe estar en el mismo dir o especificar ruta completa
  4.  
  5. void main()
  6. {
  7.    int op;
  8.  
  9.    printf("\t\tElija una opcion:\n\n");
  10. printf("\t*********************************\n");
  11. printf("\t*\t [1] Sumar\t\t*\n");
  12. printf("\t*\t [2] Restar\t\t*\n");
  13. printf("\t*\t [3] Multiplicar\t*\n");
  14. printf("\t*\t [4] Dividir\t\t*\n");
  15. printf("\t*\t [5] Potencia\t\t*\n");
  16. printf("\t*\t [6] Raiz cuadrada\t*\n");
  17. printf("\t*\t [7] Seno\t\t*\n");
  18. printf("\t*\t [8] Coseno\t\t*\n");
  19. printf("\t*\t [9] Tangente\t\t*\n");
  20. printf("\t*\t [10] Salir\t\t*\n");
  21. printf("\t*********************************\n\n");
  22. scanf("%d", &op);
  23.  
  24. switch (op) {
  25.  
  26. case 1:
  27. sumar();
  28. break;
  29.  
  30. case 2:
  31. restar();
  32. break;
  33.  
  34. case 3:
  35. multiplicar();
  36. break;
  37.  
  38. case 4:
  39. dividir();
  40. break;
  41.  
  42. case 5:
  43. potencia();
  44. break;
  45.  
  46. case 6:
  47. raiz_cuadrada();
  48. break;
  49.  
  50. case 7:
  51. seno();
  52. break;
  53.  
  54. case 8:
  55. coseno();
  56. break;
  57.  
  58. case 9:
  59. tangente();
  60. break;
  61.  
  62. case 10:
  63. break;
  64.  
  65. default:
  66.            printf("Ha elejido una opcion incorrecta\n");
  67.            break;
  68. }
  69. }
  70.  

La idea ahora sería compilar funciones.c como objeto. Es decir generar un fichero compilado, aunque no ejecutable.
Usando gcc sería:
Código:
gcc -c funciones.c -o funciones.o

Lo siguiente, compilar main.c junto con funciones.h como objeto:
Usando gcc sería:
Código:
gcc -c main.c funciones.h -o main.o

Finalmente deberíamos generar el ejecutable final compilando los dos archivos objeto (funciones.o y main.o):
Usando gcc sería:
Código:
gcc main.o funciones.o -o ejecutable
(En Windows .exe)

Para agilizar la compilación en módulos se diseñan archivos makefile de tal manera que solo con ejecutar make, compilamos todo nuestro programa.
43  Programación / Programación C/C++ / Re: Calculadora hecha en C en: 7 Noviembre 2012, 00:16 am
Hay diversos motivos por los que se usan los headers de C o los módulos en general.

Una de las ideas es facilitar la lectura del código, optimizar la depuración del código y hacer más portable el código.

Imaginad que tenéis todas las librerías que uséis escritas en un mismo archivo o_O. Lo que hacéis es incluirlas y así quedan representadas por la directiva #include en vuestro código (el preprocesador luego incluirá el código de esas librerías en el archivo donde se incluyan).

Otra idea es la de encapsulación de código. Una parte interfaz (o pública) y otra parte implementación (o privada). De tal manera que el programador puede elegir qué información es visible para otros usuarios y cuál no.

Los archivos con extensión .h (headers o encabezados) contienen la información pública. Tipos de datos y encabezados de funciones para su posterior acceso. Y los archivos con extensión .c ( c files o archivos c ) contienen la parte privada o de implementación relacionanda con su encabezado.

Por ejemplo, imaginemos que implementamos un árbol binario y cada nodo guarda un entero. Posteriormente nosotros queremos un árbol binario que represente cadenas de caracteres. Pues tan solo yendo al header del árbol binario, podemos modificar ese tipo y todo el código nos servirá para represenar árboles binarios cuyos nodos representan cadenas de caracteres... De esa manera se incentiva la abstracción del código...

¡Saludos!
44  Programación / Programación C/C++ / Re: vectores y matrices en C en: 6 Noviembre 2012, 21:41 pm
Aquí tienes un tutorial bueno, bonito y barato de mi facultad:

http://www.dc.fi.udc.es/~so-grado/CursoC.pdf

Es muy interesante tratar a los vectores n-dimensionales como punteros.
45  Programación / Programación C/C++ / Re: función random en: 6 Noviembre 2012, 21:39 pm
Pues aquí un código para generar un vector de números aleatorios en un rango:

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <sys/time.h>
  4. #define TAM 10
  5.  
  6. void inicializar_semilla() {
  7. srand(time(NULL));
  8. }
  9.  
  10. /* genera un vector de tamaño n con números de -10 a 10 */
  11. void aleatorio_mod10(int v[], int n) {
  12. int i;
  13. inicializar_semilla();
  14. for (i=0; i < n; i++)
  15. v[i] = (rand() % 21) - 10;
  16. }
  17.  
  18. int main () {
  19.    int vector[TAM], i;
  20.    aleatorio_mod10(vector, TAM);
  21.    for (i=0; i<TAM; i++)
  22. printf("%d ", vector[i]);
  23.    printf("\n");
  24. }
  25.  

rand() % x: genera un número aleatorio entre 0 y x-1

En mi caso: rand() % 21: genera números entre 0 y 20.

Si a ese resultado le resto 10, pues genero números en el rango [-10,10] en Z
46  Programación / Programación C/C++ / Re: [C][?]Como determinar que imprima ciertos caracteres en: 6 Noviembre 2012, 21:22 pm
@Jaes también depende de la codificación que esté usando tu Shell. Estoy en Linux así que de momento no te puedo ayudar.
47  Programación / Programación C/C++ / Re: Como planteariais este problema?( en C) en: 6 Noviembre 2012, 16:08 pm
Lo mejor para entender como funciona sería una explicación gráfica. Así que te recomiendo algún pdf o algún vídeo incluso mejor.

Pongo el código para que lo puedas leer mejor:

Ordenación por inserción:
Código
  1. void ord_ins(int v[], int n) {
  2.    int i,j,x;
  3.    for (i=1;i<n;i++) {
  4.        x = v[i];
  5.        j = i-1;
  6.        while ( (j>-1) && (v[j]>x) )
  7.            v[j+1] = v[j--];
  8.        v[j+1] = x;
  9.    }
  10. }

índices del vector: 0..N-1 y ordenación ascendente

Bueno supongamos que tenemos el array { 7, 2, 6, 4, 8, -3 }

1º. Suponemos que el primer elemento está ordenado.

2º. Recorremos el array desde 1 hasta N-1, porque el primer elemento suponemos que está ordenado.

3º. Entonces teniendo en cuenta el for de 1 a N-1, en cada iteración del for escogeremos el elemento
Código:
array[i]
. Es decir, en la primera iteración el 2, en la siguiente al 6, en la siguiente al 4... Es decir x =
Código:
array[i]

4º Insertamos ordenadamente x en el subvector generado por los índices 0 e i-1. En este caso insertar x en el subvector { 7 }, porque va desde 0 a i-1, y como i vale 1, pues es el subvector array(0..0). Como 2 es menor que siete, lo insertamos delante.

array { 2, 7, 6, 4, 8, -3 } Hay que mover el 7 a la derecha y el 2 situarlo en la primera posición

5º Volvemos al paso 3 hasta terminar el ciclo for

-> { 2, 7, 6, 4, 8, -3 } seleccionamos el 6 e insertamos en { 2, 7 } => { 2, 6, 7, 4, 8, -3 }

-> { 2, 6, 7, 4, 8, -3 } seleccionamos el 4 e insertamos en { 2, 6, 7 } => { 2, 4, 6, 7, 8, -3 }

-> { 2, 4, 6, 7, 8, -3 } seleccionamos el 8 e insertamos en { 2, 4, 6, 7 } => { 2, 4, 6, 7, 8, -3 } <= El elemento está ya ordenado

-> { 2, 4, 6, 7, 8, -3 } seleccionamos el -3 e insertamos en { 2, 4, 6, 7, 8 } => { -3, 2, 4, 6, 7, 8,} <= Vualá, vector ordenado

Recuerda que para cada inserción tenemos que mover todos los elelementos desde la posición donde vamos a insertar hasta i-1 una posición hacia adelante.

Saludos y espero que lo entiendas.
48  Programación / Programación C/C++ / Re: Ejercicio en C de Vectores[Borland 5.02] en: 6 Noviembre 2012, 02:22 am
Me sigue sin funcar, no me reconoce el pasaje de valor de longitud o tamaño del vector, a vector atravez de una variable.

Es que le tienes que pasar la dirección de memoria donde está alojada la variable largo en el montículo. O sea, el puntero:

Código
  1. ordenar1(&largo,vector1)

No, no haría falta, porque le pasas una copia y listo ._., Y a mí al compilar con C::B y ejecutar me va todo perfecto.
49  Programación / Programación C/C++ / Re: Como planteariais este problema?( en C) en: 6 Noviembre 2012, 01:39 am
No tiene sentido ordenar y luego extraer, quicksort en el mejor caso es n*log(n), unido a extraer quedaría O(n*log(n) + n).En el caso peor, sería O(n2).La complejidad de mi algoritmo es simplemente O(n). ( ya sé que no estamos discutiendo eficiencia)

Extraer es constante, no lineal: O(2) = O(1). Pero que sí, que se puede hacer lineal llevando el max y el cuasi_max a la par.
50  Programación / Programación C/C++ / Re: Problemas con el vuelto en monedas en: 5 Noviembre 2012, 19:35 pm
... A mí sí me da.

Edito:

Me faltaba sumar la h del final. Edito el código arriba.

Cuando usas dos decimales no termina de funcionar bien.
Páginas: 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14 15 16 17
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines