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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Mensajes
Páginas: [1] 2 3
1  Programación / Java / ayuda con algoritmo divide and conquer en: 29 Abril 2015, 00:47 am
Hola amigos,

me he dispuesto a resolver algoritmos de este tipo, concretamente comparar dos vectores y mostrar en que posición difiere un dato el uno del otro.

Primero me he dispuesto a comparar si los dos son iguales o no con el siguiente código:

Código
  1.  
  2.    public static boolean sonIgualesDyV(int[] a, int[] b, int ini, int fin) {
  3.        if(fin - ini <= 1) {
  4.            if((a[ini] != b[ini]) || (a[fin] != b[fin])) {
  5.                return false;
  6.            } else {
  7.                return true;
  8.            }
  9.        } else {
  10.            int medio = (ini + fin)/2;
  11.            boolean resultadoAux = sonIgualesDyV(a,b, ini, medio);
  12.            boolean resultadoAux2 = sonIgualesDyV(a, b, medio+1, fin);
  13.            return (resultadoAux && resultadoAux2);
  14.        }
  15.    }
  16.  
  17.    public static void main(String[] args) {
  18.        // TODO code application logic here
  19.  
  20.        int a[]={1,2,7,8,9,10};
  21.        int b[]={1,2,7,8,9,10};
  22.  
  23.        if (sonIgualesDyV(a,b,0, a.length-1))
  24.            System.out.println("Los vectores son iguales");
  25.         else
  26.            System.out.println("Los vectores no son iguales");
  27.    }
  28.  
  29.  

A partir de aquí y viendo que discurre la lógica implementada he querido modificarlo para devolver un entero con la posición donde difiere un dato de un vector de otro, ejemplo:

a[]={0,1,2,3,4}
b[]={0,1,2,3,6}

Ambos difieren en la posición 4 con un valor distinto por arreglo.

El problema lo tengo con las llamadas recursivas para llamarse a sí mismas y resolver el problema, antes devolvía dos resultados con un boolean(resultadoAux y resultadoAux2), ahora para devolver dos datos int no se como hacerlo... supongo que tendré que crear una condición para evaluar una llamada recursiva u otra o devolver con un arreglo los dos resultados a la llamada de la función...

Código
  1.  
  2.    public static int sonIgualesDyV(int[] a, int[] b, int ini, int fin) {
  3.        if(fin - ini <= 1) {
  4.            if((a[ini] != b[ini])){
  5.                return ini;
  6.            } else if ((a[fin] != b[fin])){
  7.                return fin;
  8.            }
  9.        } else {
  10.            int medio = (ini + fin)/2;
  11.            int resultadoAux = sonIgualesDyV(a,b, ini, medio);
  12.            int resultadoAux2 = sonIgualesDyV(a, b, medio+1, fin);
  13.  
  14.        }
  15.        return 0;
  16.    }
  17.  
  18.    public static void main(String[] args) {
  19.        // TODO code application logic here
  20.        int a[]={1,2,7,8,9,10};
  21.        int b[]={1,2,7,8,6,10};
  22.        System.out.println("Difiere en la posición: "+sonIgualesDyV(a, b, 0, a.length-1));
  23.    }
  24.  
  25.  

Saludos y muchas Gracias

2  Programación / Java / Uso de try-catch en Java en: 9 Octubre 2014, 22:08 pm
Hola acabo de hacer mi primer programa en Java y de utilizar igualmente por vez primera el uso de excepciones try-catch. Mi duda es si cuando se genera la excepción, en este caso el introducir un carácter en lugar de un dígito, se puede evitar que pare o rompa la secuencia del programa. Es decir deseo que genere el aviso de "No se puede introducir caracteres" y posteriormente vuelva al menú de inicio. Dejo el código:

Código
  1. package paquete;
  2.  
  3. import java.util.Scanner;
  4. import java.util.InputMismatchException;
  5.  
  6. public class Main {
  7.  
  8. public static void main(String[] args) {
  9. // TODO Auto-generated method stub
  10. Scanner teclado=new Scanner(System.in);
  11. int opcion,opcion2;
  12. float numero,numero2;
  13. try{
  14. do{
  15.  
  16. System.out.println("******** CALCULADORA  ********");
  17.                        System.out.println("\n1- Realizar una operación");
  18.                        System.out.println("2- Salir");
  19.                        System.out.print("\nIntroduzca su opción: ");
  20.                        opcion=teclado.nextInt();
  21.                     if(opcion==1){
  22.  
  23.             System.out.print("\nIntroduzca el primer argumento: ");
  24.             numero=teclado.nextInt();
  25.             System.out.print("\nIntroduzca el segundo argumento: ");
  26.             numero2=teclado.nextInt();
  27.  
  28.             System.out.println("\n1- Sumar");
  29.             System.out.println("2- Restar");
  30.                System.out.println("3- Multiplicar");
  31.                System.out.println("4- Dividir");
  32.                System.out.print("Opcion: ");
  33.                opcion2=teclado.nextInt();
  34.  
  35.             switch(opcion2){
  36.  
  37.             case 1:
  38.             System.out.println("El resultado de la operacion es: "+  (numero+numero2));
  39.             break;
  40.  
  41.             case 2:
  42.             System.out.println("El resultado de la operacion es: "+ (numero-numero2));
  43.             break;
  44.  
  45.             case 3:
  46.             System.out.println("El resultado de la operacion es: "+ (numero*numero2));
  47.             break;
  48.  
  49.             case 4:
  50.             if(numero2>0)
  51.             System.out.println("El resultado de la operacion es: "+ (numero/numero2));
  52.             else{
  53.             System.out.println("\nEl divisor debe ser mayor de 0");
  54.             }
  55.             break;
  56.  
  57.             default:
  58.             System.out.println("## Gracias por usar la Calculadora ##");
  59.             }
  60.            }
  61.  
  62. }while(opcion==1);
  63. }catch (InputMismatchException ime){
  64. System.out.println("No se puede introducir caracteres");
  65. }
  66. System.out.println("\nHasta Pronto!!");
  67. }
  68. }
  69.  
  70.  

Gracias!!
3  Programación / Programación C/C++ / Re: Opciones de la línea de comandos--> parámetros de main en: 3 Octubre 2014, 21:22 pm
+10 rir3760 Grande !!

Me ha encantado la forma de leer esos caracteres como me has indicado, tomo nota  ;D

Recoloco el código completo de como quedaría :

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main (int argc, char *argv[]) {
  6. int a,c;
  7. if(argc==4){
  8.        sscanf(argv[1],"%d",&a);
  9. sscanf(argv[3],"%d",&c);
  10.  
  11.            switch(argv[2][0]){
  12.  
  13.                case '+':
  14.                    printf("\nLa suma de %d+%d = %d\n",a,c,a+c);
  15.                break;
  16.  
  17.                case '-':
  18.                    printf("\nLa resta de %d-%d = %d\n",a,c,a-c);
  19.                break;
  20.  
  21.                 case '/':
  22.                    printf("\nLa division de %d/%d = %d",a,c,a/c);
  23.                break;
  24.  
  25.                case '*':
  26.                    printf("\nLa multiplicacion de %d*%d = %d",a,c,a*c);
  27.                break;
  28.  
  29.                default:
  30.                    printf("\nIntroduzca una opcion valida\n");
  31.            }
  32. }
  33.  
  34. else
  35.        printf("No hay suficientes datos\n");
  36.  
  37.    return 0;
  38. }
  39.  
  40.  
Por cierto también desconocía que el operador * estaba reservado en bash, he tenido que engañarle de esta manera:
Código:
./main a \* c
Gracias de nuevo!!  :D
4  Programación / Programación C/C++ / Opciones de la línea de comandos--> parámetros de main en: 2 Octubre 2014, 23:49 pm
Hola amigos tengo una duda creando una calculadora a través de la línea de comandos.

El problema es que nunca se me cumple el parámetro argc[] como número entero indicando el valor del total de argumentos que he introducido por teclado.

Por consola introduzco por ejemplo:

Citar
.\main 4+2

Citar
Pienso introduzco 4 parámetros:

- argv[0] --> main
- argv[1] --> 4
- argv[2] --> +
- argv[3] --> 2


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main (int argc, char *argv[]) {
  6. int a,b,c;
  7. printf("\nargc vale %d",argc);
  8. if(argc==4){
  9.        sscanf(argv[1],"%d",&a);
  10. sscanf(argv[2],"%d",&b);
  11. sscanf(argv[3],"%d",&c);
  12.  
  13.            switch(b){
  14.  
  15.                case '+':
  16.                    printf("La suma de %d+%d = %d\n",a,c,a+c);
  17.                break;
  18.  
  19.                case '-':
  20.                    printf("La resta de %d-%d = %d\n",a,c,a-c);
  21.                break;
  22.  
  23.                 case '/':
  24.                    printf("La division de %d/%d = %d",a,c,a/c);
  25.                break;
  26.  
  27.                case '*':
  28.                    printf("La multiplicacion de %d*%d = %d",a,c,a*c);
  29.                break;
  30.  
  31.                default:
  32.                    printf("Introduzca una opcion valida\n");
  33.            }
  34. }
  35.  
  36. else
  37.        printf("No hay suficientes datos\n");
  38.  
  39.    return 0;
  40. }
  41.  
  42.  

Gracias!!
5  Programación / Programación C/C++ / Re: Ayuda con este codigo recursivo en: 26 Septiembre 2014, 18:56 pm
Citar
Nada impide que elimines el avance de linea mediante la función strchr (prototipo en <string.h>) o un bucle.
Tomo nota  ;D

Citar
Ese programa funciona correctamente, si el programa en un momento dado se congela asegúrate de publicar la versión tal cual, sin cambios.
Sí que funciona!! Lo más probable que tocara algo... ;)

Citar
No es posible por lo siguiente:

1) Todo parámetro de una función declarado en la forma "T identificador[N]" se procesa en realidad como "T *identificador", en otras palabras cada parámetro declarado como array se procesa como un puntero.

2) El operador "[]" requiere de dos operandos: un entero y un puntero sin importar el orden, cuando uno de ellos es el nombre de un array este genera de forma automática el puntero necesario.

Como espero entenderás no hay escape: se utilizan punteros (direcciones de memoria) si o si.
Más claro imposible  ;-)

Gracias!!
6  Programación / Programación C/C++ / Re: Ayuda con este codigo recursivo en: 25 Septiembre 2014, 20:09 pm
Hola rir3760 gracias por contestar.

Te cuento el uso de gets porque fgets me arroja ' \n ', ya me avisaste hace un tiempo de este mal uso.

Las indicaciones que me has puesto creo que son con punteros ya que me indicas direcciones, pero aún no he llegado a ese tema, cuando acabe estos ejercicios de recursividad me pondré con ello. No obstante he visto ahora algo por encima pero tengo que verlo con más detalle como trabajan ya que se me queda colgado el código, te cuelgo lo que he modificado del programa pero me gustaría me guiaras también para hacerlo sin punteros.

Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #define N 50
  6.  
  7. void alreves (char *vector);
  8.  
  9. int main(void){
  10.  
  11.    char cadena[N];
  12.    printf("\nIntroduzca frase: ");
  13.    fgets(cadena,sizeof cadena,stdin);
  14.    printf("\nFrase invertida: ");
  15.    alreves(cadena);
  16. }
  17.  
  18. void alreves (char *vector){
  19.  
  20.    if(*vector!='\0'){ /*Estado general*/
  21.            alreves(vector+1);
  22.            putchar(*vector);
  23.    }
  24.    else return ; /*Estado base*/
  25. }

Gracias !!
7  Programación / Programación C/C++ / Ayuda con este codigo recursivo en: 24 Septiembre 2014, 22:47 pm
Hola me estoy iniciando en la recursividad y me encuentro estancado en este código para arrojar de forma recursiva la devolución de una frase al revés.

Había pensado en guardar la frase en un array, seguidamente con un índice ir moviendome por este array recursivamente, pero me encuentro que no se como devolver el retorno de la función a la función principal, independientemente de que esté bien ideado el código......

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void alreves (char vector[],int posicion);
  6.  
  7. void main(int argc, char *argv[]){
  8.  
  9.    char cadena[50];
  10.    int n;
  11.    printf("\nIntroduzca frase: ");
  12.    gets(cadena);
  13.    n=strlen(cadena);
  14. alreves(cadena,n);
  15. }
  16.  
  17. void alreves (char vector[],int posicion){
  18.  
  19.    if(posicion=='\0')
  20.        return 0 ;
  21.    else
  22.        alreves(vector,posicion-1);
  23. }
  24.  

Gracias!!
8  Programación / Programación C/C++ / Re: Escritura y lectura de archivos binarios en: 10 Septiembre 2014, 23:21 pm
Hola rir3760,

gracias de nuevo por las explicaciones, me han servido para resolver los algoritmos de dos formas, te los agrego para que veas como han quedado:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define N 2
  5.  
  6. struct{
  7.    char nombre[20];
  8.    char ciudad[20];
  9.    int edad;
  10. }persona[N];
  11.  
  12. int main(void)
  13. {
  14.    char temporal[20];
  15.    char name[15]="gente.dat";
  16.    int i,numero;
  17.    FILE *fichero;
  18.    if((fichero=fopen(name,"wb"))!=NULL){
  19.        do{
  20.            for(i=0;i<N;i++){
  21.                printf("\nIntroduzca nombre: ");
  22.                fgets(persona[i].nombre,sizeof(persona),stdin);
  23.                if(strcmp(persona[i].nombre,"")!=0){
  24.                    printf("\nIntroduzca ciudad: ");
  25.                    fgets(persona[i].ciudad,sizeof(persona),stdin);
  26.                    printf("\nIntroduzca edad: ");
  27.                    fgets(temporal,19,stdin);
  28.                    sscanf(temporal,"%d",&persona[i].edad);
  29.                    fwrite(&persona[i],sizeof(persona[i]),1,fichero);
  30.                }
  31.            }
  32.        }while(strcmp(persona[i].nombre,"")!=0);
  33.        fclose(fichero);
  34.    }
  35.    else{
  36.        printf("\nError en apertura fichero");
  37.        exit(1);
  38.    }
  39.    if((fichero=fopen(name,"rb"))!=NULL){
  40.  
  41.       while (fread(&persona,sizeof(persona),N,fichero) !=NULL){
  42.           printf("\nIntroduzca numero de persona a visualizar: ");
  43.           scanf("%d",&numero);
  44.           printf("\nNombre: %s",persona[numero].nombre);
  45.           printf("\nCiudad: %s\n",persona[numero].ciudad);
  46.           printf("Edad: %d",persona[numero].edad);
  47.        }
  48.        fclose(fichero);
  49.    }else{
  50.        printf("\nError en apertura fichero");
  51.        exit(1);
  52.    }
  53.    return 0;
  54. }
  55.  

Y este el otro sin uso de array de struct:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. struct{
  6.    char nombre[20];
  7.    char ciudad[20];
  8.    int edad;
  9. }persona;
  10.  
  11. int main(void)
  12. {
  13.    char temporal[20];
  14.    char name[15]="gente.dat";
  15.    int i,numero;
  16.    FILE *fichero;
  17.    if((fichero=fopen(name,"wb"))!=NULL){
  18.        do{
  19.                printf("\nIntroduzca nombre: ");
  20.                fgets(persona.nombre,sizeof(persona.nombre),stdin);
  21.                if(strcmp(persona.nombre,"\n")!=0){
  22.                    printf("\nIntroduzca ciudad: ");
  23.                    fgets(persona.ciudad,sizeof(persona.ciudad),stdin);
  24.                    printf("\nIntroduzca edad: ");
  25.                    fgets(temporal,19,stdin);
  26.                    sscanf(temporal,"%d",&persona.edad);
  27.                    fwrite(&persona,sizeof(persona),1,fichero);
  28.                }
  29.  
  30.        }while(strcmp(persona.nombre,"\n")!=0);
  31.        fclose(fichero);
  32.    }
  33.    else{
  34.        printf("\nError en apertura fichero");
  35.        exit(1);
  36.    }
  37.    if((fichero=fopen(name,"rb"))!=NULL){
  38.  
  39.        printf("\nIntroduzca numero de persona a visualizar: ");
  40.        scanf("%d",&numero);
  41.  
  42.        i=0;
  43.        while ( (fread(&persona,sizeof(persona),1,fichero) !=NULL) && (i<numero) ){
  44.           ++i;
  45.        }
  46.        if (!feof(fichero))
  47.        {
  48.           printf("\nNombre: %s",persona.nombre);
  49.           printf("\nCiudad: %s\n",persona.ciudad);
  50.           printf("Edad: %d",persona.edad);
  51.        }
  52.        else
  53.            printf ("La persona no existe.\n");
  54.        fclose(fichero);
  55.    }else{
  56.        printf("\nError en apertura fichero");
  57.        exit(1);
  58.    }
  59.    return 0;
  60. }
  61.  

Seguro que encuentras algún pero... pero funcionan, jeje

Saludos y gracias
9  Programación / Programación C/C++ / Re: Escritura y lectura de archivos binarios en: 5 Septiembre 2014, 21:31 pm
Hola rir3760,

gracias por las aclaraciones, sólo me queda una duda y es la que me indicas aquí:

Citar
Solo tienes que utilizar la función scanf para obtener el indice del elemento en el array: 0 .. regs_leidos - 1.

La duda me viene en que no deduzco como recorrer ese array con regs_leidos...

Saludos!!
10  Programación / Programación C/C++ / Re: Escritura y lectura de archivos binarios en: 4 Septiembre 2014, 23:08 pm
Hola!!

Gracias por los consejos eferion y rir3760.

Me han ayudado vuestros consejos y metodología para trabajar con ficheros.

No me he explicado muy bien y espero expresarme lo que pretendo hacer.

Mirar lo que quiero que haga el programa en la lectura:

1. Lea el fichero.

2. Que pregunte al usuario por el nº de registro que desea visualizar. Ejemplo:
    Se han introducido y guardado previamente en la primera parte del código con        fwrite:
    - Nombre= José , se habrá guardado en persona[0]
    - Nombre2= David , persona[1]

3. El programa mostrará los datos correspondientes a ese usuario.

He intentado hacerlo de otra forma pero solo consigo que me lea ambos contactos(José y David) si introduzco el contacto '0', si coloco el que me busque el contacto '1' me muestra por pantalla en blanco las opciones que deseo se me visualicen.

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define N 2
  5.  
  6. struct{
  7.    char nombre[20];
  8.    char ciudad[20];
  9.    int edad;
  10. }persona[N];
  11.  
  12. int main(void)
  13. {
  14.    char temporal[20];
  15.    char name[15]="gente.dat";
  16.    int i,numero;
  17.    FILE *fichero;
  18.    if((fichero=fopen(name,"wb"))!=NULL){
  19.        do{
  20.            for(i=0;i<N;i++){
  21.                printf("\nIntroduzca nombre: ");
  22.                fgets(persona[i].nombre,sizeof(persona),stdin);
  23.                if(strcmp(persona[i].nombre,"")!=0){
  24.                    printf("\nIntroduzca ciudad: ");
  25.                    fgets(persona[i].ciudad,sizeof(persona),stdin);
  26.                    printf("\nIntroduzca edad: ");
  27.                    fgets(temporal,19,stdin);
  28.                    sscanf(temporal,"%d",&persona[i].edad);
  29.                    fwrite(&persona[i],sizeof(persona),1,fichero);
  30.                }
  31.            }
  32.        }while(strcmp(persona[i].nombre,"")!=0);
  33.        fclose(fichero);
  34.    }
  35.    else{
  36.        printf("\nError en apertura fichero");
  37.        exit(1);
  38.    }
  39.    if((fichero=fopen(name,"rb"))!=NULL){
  40.        fread(&persona,sizeof(persona),1,fichero); /*leo el archivo antes de preguntar*/
  41.        while(!feof(fichero)){
  42.                printf("\nIntroduzca numero de persona a visualizar: ");
  43.                fgets(temporal,19,stdin);
  44.                sscanf(temporal,"%d",&numero);
  45.                printf("\nNombre: %s",persona[numero].nombre);
  46.                printf("\nCiudad: %s\n",persona[numero].ciudad);
  47.                printf("Edad: %d",persona[numero].edad);
  48.                fread(&persona[numero],sizeof(persona),1,fichero);
  49.        }
  50.        fclose(fichero);
  51.    }else{
  52.        printf("\nError en apertura fichero");
  53.        exit(1);
  54.    }
  55.    return 0;
  56. }
  57.  

Pdata: se que no se ve de muy buena forma el uso de !feof por algunos programadores...

Pdata eferion: me sirvió como simplificaste el código.

Pdata rir3760: me guardo tu código y me quedo con la copla de como leer y mostrar contactos.

Saludos!!
Páginas: [1] 2 3
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines