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

 

 


Tema destacado:


  Mostrar Temas
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
61  Programación / Bases de Datos / problema con consulta en: 30 Mayo 2014, 03:32 am
Saludos tengo las siguientes tablas

BAR(id,nombre)
CERVEZA(id,nombre)
CLIENTE(id,nombre)
SIRVE(idBAR,idCERVEZA)
ASISTE(idCLIENTE,idBAR)
GUSTA(idCLIENTE,idCERVEZA)

y tengo la consulta que dice nombrar los nombres de las cervezas que no se sirven en el bar 'TARROS'

lo que llevo es esto:

SELECT c.nombre FROM BAR AS b, CERVEZA AS c, SIRVE AS s
WHERE c.id=s.idCERVEZA AND b.id=s.idBAR AND b.nombre='TARROS'

pero a partir de ahi ya no se como seguir

gracias
62  Programación / Bases de Datos / consultas simples en: 9 Mayo 2014, 20:33 pm
Saludos

tengo la siguientes tablas
CENTROS (Numero, Nombre, Direccion)
DEPARTAMENTOS (Numero, Centro, Director, Tipo_director, Presupesto, Depto_jefe, Nombre)
EMPLEADOS (Cod, Departamento, Telefono, Fecha_nacimiento, Fecha_ingreso, Salario, Comision,Num_hijos, Nombre)

y me pide que haga las siguientes consultas:

20. Obtener, por orden alfabético, los nombres y los salarios de los empleados cuyo salario coincide con la comisión de cualquier otro o la suya propia.

yo pense que seria algo como esto:

SELECT Nombre, Salario
FROM EMPLEADOS
WHERE Salario=Comision;

pero en el problema me dice que el salario puede coincidir con la comision de cualquier otro y esa es la parte que no se como hacerla.

otra es: 22. Para los departamentos cuyo salario medio supera al promedio de la empresa, hallar cuántas extensiones telefónicas tienen.

SELECT COUNT(Telefono)
FROM EMPLEADOS AS e, DEPARTAMENTOS AS d
WHERE AVG(e.salario) > AVG(salario);

pero no se como calcular el promedio del salario de toda la empresa

gracias

63  Programación / Programación C/C++ / problema con una lista en: 1 Mayo 2014, 21:35 pm
Saludos

Tengo la siguiente función que se llama crearArchivoTABSIM() la cual se encuentra dentro de un ciclo en el main, y cada vez que entra al ciclo se le asigna a la funcion una cadena que se llama etiqueta(char *etiqueta).

Código
  1. void crearArchivoTABSIM(char *etiqueta)
  2. {
  3.    FILE *tb;
  4.    ETIQ *p = NULL;
  5.    if((strcmp(etiqueta,"null")) != 0)
  6.    {
  7.        crearListaEtiquetas(&p,etiqueta);
  8.        imprimirEtiquetas(p);
  9.        if((tb = fopen("TABSIM.txt","a+")) != NULL)
  10.        {
  11.            fwrite(etiqueta,strlen(etiqueta),1,tb);
  12.            fwrite("\n",1,1,tb);
  13.        }
  14.    }
  15. }

y dentro de la función crearArchivoTABSIM() se encuentra la función crearListaEtiquetas() que me va a crear una lista simplemente ligada que tiene un campo char *etiqueta,y que cada vez que le envie una etiqueta me la va a insertar al principio, y después de esta esta la función imprimirEtiquetas() que me va a ir imprimiendo las etiquetas


Código
  1. void crearListaEtiquetas(ETIQ **p,char *etiqueta)
  2. {
  3.    ETIQ *nuevo;
  4.    nuevo = crearEtiqueta(etiqueta);
  5.    nuevo->sig = *p;
  6.    *p = nuevo;
  7. }
  8.  
  9. ETIQ *crearEtiqueta(char *etiqueta)
  10. {
  11.    ETIQ *x;
  12.    int lon;
  13.    lon = strlen(etiqueta);
  14.    x = malloc(sizeof(ETIQ));
  15.    x->Etiqueta = malloc((lon+1)*sizeof(char));
  16.    strcpy(x->Etiqueta,etiqueta);
  17.    return x;
  18. }
  19.  
  20. void imprimirEtiquetas(ETIQ *p)
  21. {
  22.    ETIQ *ptr;
  23.    for(ptr = p;ptr!=NULL;ptr = ptr->sig)
  24.       printf("[%s]\n",ptr->Etiqueta);
  25. }
  26.  
como  por ejemplo:

Si le mando las etiquetas ET1, ET2,ET3,ET4

deberia imprimir

1) ET1
2)ET1    ET2
3)ET1   ET2    ET3
4)ET1   ET2    ET3     ET4

pero el problema que tengo es que solo me esta imprimiendo el primer nodo, o sea a donde apunte la cabeza de lista y no se que estoy haciendo mal, previamente ya habia hecho listas ligadas y no me habian dado ningun problema

de antemano gracias
64  Foros Generales / Dudas Generales / número hexadecimal en: 26 Abril 2014, 05:21 am
Saludos

tengo una duda de como hacer un procedimiento de conversión de un número decimal negativo a su hexadecimal, se que si el número fuera positivo con tan solo hacer divisiones sucesivas obtendría el resultado, pero cuál es el procedimiento para los negativos??

gracias
65  Programación / Programación C/C++ / operador ~ en: 22 Abril 2014, 23:21 pm
Saludos

tengo una duda a acerca de si el operador  ~ que se usa para obtener el complemento a 1 de un numero, puede usarse solo con números decimales o si tambien los puede usar con numeros binarios??
66  Programación / ASM / CONTLOC en: 14 Abril 2014, 21:20 pm
saludos, tengo una duda de como funciona el contador de localidades de un ensamblador cuando se tienen errores en una directiva por ejemplo si yo tengo

DB         300

aqui hay un error en el rango porque la directiva solo puede tener un valor del 0 al 255

DB         %11A

aqui hay otro error porque las bases binarias solo aceptan los digitos 1 y 0.

entonces en estos casos aumenta el contloc??? o se queda con el valor anterior??
gracias

67  Programación / Programación C/C++ / hexadecimal de 2 bytes en: 9 Abril 2014, 23:18 pm
Saludos

tengo un codigo que convierte un numero decimal en hexadecimal(siempre tiene que ser decimal-hexadecimal), el programa funciona bien el problema es que una vez que tengo el número hexa tengo que hacer que sea de dos bytes, o sea vendrían siendo 4 digitos como por ejemplo

numero decimal       hexadecimal      hexadecimal 2 bytes
33                               21                        0021

y no se como concatenarle los dos ceros al principio, pense en usar un strcat pero no funciono, creaba otra variable *cadena, y despues de asignarle memoria la inicializaba con: "0", y después le concatenaba la cadena "21" para que me quedara "021".

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. char convertirHexadecimal(int residuo);
  6.  
  7. int main()
  8. {
  9.    char num_hex,*cadena,c[2],*hexadecimal;
  10.    int numero = 33,cociente,residuo,i;
  11.    cadena = calloc(12,sizeof(char));
  12.    for(cociente = numero;cociente > 0;cociente/=16)
  13.    {
  14.        residuo = cociente % 16;
  15.        num_hex = convertirHexadecimal(residuo);
  16.        sprintf(c,"%c",num_hex);
  17.        strcat(cadena,c);
  18.    }
  19.    strrev(cadena);
  20.    printf("[%s]\n",cadena);
  21.    return 0;
  22. }
  23.  
  24. char convertirHexadecimal(int residuo)
  25. {
  26.    char letra;
  27.    switch(residuo)
  28.    {
  29.        case 10:
  30.           letra = 'A';
  31.           break;
  32.        case 11:
  33.           letra = 'B';
  34.           break;
  35.        case 12:
  36.           letra = 'C';
  37.           break;
  38.        case 13:
  39.           letra = 'D';
  40.           break;
  41.        case 14:
  42.           letra = 'E';
  43.           break;
  44.        case 15:
  45.           letra = 'F';
  46.           break;
  47.        default:
  48.           letra = '0' + residuo;
  49.    }
  50.    return letra;
  51. }
  52.  

68  Foros Generales / Dudas Generales / conversiones en: 8 Abril 2014, 02:43 am
Saludos

Alguien conoce de algun metodo que no sea el de divisiones sucesivas el cual convierta un numero decimal a cualquiera de las otras 3 potencias,(binaria,octal,hexadecimal)????

gracias
69  Programación / Programación C/C++ / validar numeros en: 5 Abril 2014, 02:17 am
Saludos, tengo el siguiente segmento de codigo dentro de un CASE '[' o
CASE INDEXADO_INDIRECTO, donde tengo que validar una cadena esta cadena que inicia con [, debe de tener o bien una D despues del corchete o un numero en base DECIMAL (tiene un rango especifico de valores para que sea valido)seguido por una , despues un registro que puede ser x,y,sp,pc  y por ultimo un corchete de cierre ]

por ejemplo si tengo:

[5,Sp -> error: le falta el ultimo corchete
[,x] -> no puede haber una instruccion vacia antes de la coma
[100,] ->no puede haber una instruccion vacia despues de la coma
[ ->despues del primer [ debe haber dos registros separados por una , y despues ]
[AD,sp]-> el primer registro tiene que ser la letra D

PERO cuando le pongo algo como:

[5A9,x] -> aqui me aparece que es un numero valido, pero para este caso en especial solo puede aceptar numeros decimales, y no se como corregir esto

Código
  1. case INDEXADO_INDIRECTO:
  2.            i = 1;
  3.            tam = strlen(operando);
  4.            car = operando[i++];
  5.            if(car == '\0')
  6.               printf("Despues del primer [ debe haber dos registros separados por , y un corchete de cierre\n");
  7.            else
  8.            {
  9.                if(operando[tam-1] != ']')
  10.                   printf("Error: No se encontro corchete de cierre\n");
  11.                else
  12.                {
  13.                    switch(car)
  14.                    {
  15.                        case ']':
  16.                           printf("No pueden estar los corchetes vacios\n");
  17.                           break;
  18.                        case ',':
  19.                           printf("No puede haber una instruccion vacia antes de la coma\n");
  20.                           registro = obtenerRegistro(operando);
  21.                           if((strcmp(registro,"\0")) == 0)
  22.                              printf("No puede haber una instruccion vacia despues de la coma\n");
  23.                              break;
  24.                        case '0':
  25.                        case '1':
  26.                        case '2':
  27.                        case '3':
  28.                        case '4':
  29.                        case '5':
  30.                        case '6':
  31.                        case '7':
  32.                        case '8':
  33.                        case '9':
  34.                           if((ptr = strchr(operando,',')) == 0)
  35.                              printf("Despues del primer corchete debe haber dos registros separados por una ,\n");
  36.                           else
  37.                           {
  38.                               base = 10;
  39.                               x = 1;
  40.                               k = 0;
  41.                               esIndexadoIndirecto16bits = 1;
  42.                               instruccion = obtenerInstruccion(operando,x);
  43.                               numero = obtenerNumero(instruccion,k,base);
  44.                               registro = obtenerRegistro(operando);
  45.                               registro = convertirMayusculas(registro);
  46.                               if((strcmp(registro,"\0")) == 0)
  47.                                  printf("No puede haber una instruccion vacia despues de la coma\n");
  48.                               else
  49.                               {
  50.                                   if(!verificarRegistro(registro))
  51.                                   {
  52.                                       esIndexadoIndirecto16bits = 0;
  53.                                       printf("Los registros validos de un direccionamiento Indexado indirecto de 16 bits son X,Y,SP,PC\n");
  54.                                   }
  55.                                   if(!verificarRangoIndexadoIndirecto(numero))
  56.                                   {
  57.                                       esIndexadoIndirecto16bits = 0;
  58.                                       printf("El rango valido de un direccionamiento Indexado Indirecto de 16 bits es de 0 a 65535\n");
  59.                                   }
  60.                                   if(esIndexadoIndirecto16bits)
  61.                                   {
  62.                                       if((indice = buscarDireccionamiento(encontrado,direccionamiento[7]))!= -1)
  63.                                          printf("Indexado Indirecto de 16 bits([IDX2]), de %s bytes\n",encontrado->total_bytes[indice]);
  64.                                       else
  65.                                          printf("el codop %s no acepta el direccionamiento indexado indirecto de 16 bits\n",encontrado->instruccion);
  66.                                   }
  67.                               }
  68.                           }
  69.                          break;
  70.                       case '-':
  71.                          if((ptr = strchr(operando,',')) == 0)
  72.                             printf("Despues del primer corchete debe haber dos registros separados por una ,\n");
  73.                          else
  74.                          {
  75.                              base = 10;
  76.                              x = 0;
  77.                              k = 1;
  78.                              esIndexadoIndirecto16bits = 1;
  79.                              instruccion = obtenerInstruccion(operando,x);
  80.                              numero = obtenerNumero(instruccion,k,base);
  81.                              registro = obtenerRegistro(operando);
  82.                              registro = convertirMayusculas(registro);
  83.                              if((strcmp(registro,"\0")) == 0)
  84.                                 printf("No puede haber una instruccion vacia despues de la coma\n");
  85.                              else
  86.                              {
  87.                                  if(!verificarRegistro(registro))
  88.                                  {
  89.                                      esIndexadoIndirecto16bits = 0;
  90.                                      printf("Los registros validos de un direccionamiento Indexado indirecto de 16 bits son X,Y,SP,PC\n");
  91.                                  }
  92.                                  if(!verificarRangoIndexadoIndirecto(numero))
  93.                                  {
  94.                                      esIndexadoIndirecto16bits = 0;
  95.                                      printf("El rango valido de un direccionamiento Indexado Indirecto de 16 bits es de 0 a 65535\n");
  96.                                  }
  97.                                  if(esIndexadoIndirecto16bits)
  98.                                  {
  99.                                      if((indice = buscarDireccionamiento(encontrado,direccionamiento[7]))!= -1)
  100.                                         printf("Indexado Indirecto de 16 bits([IDX2]), de %s bytes\n",encontrado->total_bytes[indice]);
  101.                                      else
  102.                                         printf("el codop %s no acepta el direccionamiento indexado indirecto de 16 bits\n",encontrado->instruccion);
  103.                                  }
  104.                              }
  105.                          }
  106.                          break;
  107.                       default:
  108.                          x = 1;
  109.                          esIndexadoIndirecto_Acumulador = 1;
  110.                          instruccion = obtenerInstruccion(operando,x);
  111.                          registro = obtenerRegistro(operando);
  112.                          registro = convertirMayusculas(registro);
  113.                          if(!indirectoAcumulador_D(instruccion))
  114.                          {
  115.                              printf("Error: El Acumulador valido de un Indexdo Indirecto de acumulador es D\n");
  116.                              esIndexadoIndirecto_Acumulador = 0;
  117.                          }
  118.                          if(!verificarRegistro(registro))
  119.                          {
  120.                              printf("Los registros validos de un Indexado Indirecto de Acumulador son X,Y,SP,PC\n");
  121.                              esIndexadoIndirecto_Acumulador = 0;
  122.                          }
  123.                          if(esIndexadoIndirecto_Acumulador)
  124.                          {
  125.                              if((indice = buscarDireccionamiento(encontrado,direccionamiento[6]))!= -1)
  126.                                 printf("Indexado Indirecto de Acumulador D,([D,IDX]), de %s bytes\n",encontrado->total_bytes[indice]);
  127.                              else
  128.                                 printf("el codop %s no acepta el direccionamiento indexado indirecto de acumulador D\n",encontrado->instruccion);
  129.                          }
  130.                      }
  131.                }
  132.            }
  133.            break;
  134.  

y las demas funciones son estas, no puse todo el codigo porque son como 1700 lineas de codigo,se que tengo algunas malas practicas de programacion pero ahora lo importante es corregir ese bug.

Código
  1. char *obtenerRegistro(char *operando)
  2. {
  3.    int j,i = 0;
  4.    char *cadena = NULL,c[2];
  5.    cadena = calloc(2,sizeof(char));
  6.    while(operando[i] != ',')
  7.       i++;
  8.    for(j = i+1;operando[j] != ']';j++)
  9.    {
  10.        sprintf(c,"%c",operando[j]);
  11.        strcat(cadena,c);
  12.    }
  13.    return cadena;
  14. }
  15. char *obtenerInstruccion(char *operando,int x)
  16. {
  17.    int i;
  18.    char *cadena = NULL,c[2],signo[] = {'\0',','};
  19.    cadena = calloc(7,sizeof(char));
  20.    for(i = x;operando[i] != ',';i++)
  21.    {
  22.        sprintf(c,"%c",operando[i]);
  23.        strcat(cadena,c);
  24.    }
  25.    return cadena;
  26. }
  27.  
  28. int obtenerNumero(char *operando,int x,int base)
  29. {
  30.    int i,potencia,num_decimal = 0,lon,entero = 0;
  31.    lon = strlen(operando);
  32.    for(i = lon-1,potencia = 1;i >= x;i--,potencia*=base)
  33.    {
  34.        if(esLetraBase16(operando[i]))
  35.           entero = hexadecimal(operando[i]);
  36.        else
  37.           entero = operando[i]-'0';
  38.        num_decimal+= potencia*entero;
  39.    }
  40.    if(operando[CERO] == '-')
  41.       num_decimal*= -1;
  42.    return num_decimal;
  43. }
  44.  
  45. int hexadecimal(char caracter)
  46. {
  47.    int decimal;
  48.    switch(caracter)
  49.    {
  50.        case 'A':case 'a':
  51.           decimal = 10;
  52.           break;
  53.        case 'B':case 'b':
  54.           decimal = 11;
  55.           break;
  56.        case 'C':case 'c':
  57.           decimal = 12;
  58.           break;
  59.        case 'D':case 'd':
  60.           decimal = 13;
  61.           break;
  62.        case 'E':case 'e':
  63.           decimal = 14;
  64.           break;
  65.        case 'F':case 'f':
  66.           decimal = 15;
  67.           break;
  68.        default:
  69.           printf("!Error!\n");
  70.    }
  71.    return decimal;
  72. }
  73.  
  74. char *convertirMayusculas(char *cadena)
  75. {
  76.    int i;
  77.    for(i = 0;cadena[i];i++)
  78.       cadena[i] = toupper(cadena[i]);
  79.    return cadena;
  80. }
  81.  
  82. int verificarRegistro(char *cadena)
  83. {
  84.    int i;
  85.    char *registro[] = {"X","Y","SP","PC"};
  86.    for(i = 0;i < 4;i++)
  87.    {
  88.        if((strcmp(cadena,registro[i])) == 0)
  89.           return 1;
  90.    }
  91.    return 0;
  92. }
  93.  
  94. int verificarRangoIndexadoIndirecto(int numero)
  95. {
  96.    if(numero >= CERO && numero <= MAX_IDX_INDIRECTO)
  97.       return 1;
  98.    else
  99.       return 0;
  100. }
  101.  

de antemano gracias
70  Programación / Bases de Datos / subconsultas en: 4 Abril 2014, 06:54 am
Saludos, tengo dos tablas en postgres que son la siguientes:

partidas_pedidos con sus campos: id_pedido(Pk),fecha_pedido,cantidad,producto(fK),cliente(Fk)

y info_clientes: nombre,apellido,id_cliente(Pk)

y me piden que haga una consulta:

Mostrar IDs de los clientes, sin repetirse, que en algun pedido hayan comprado mas de dos ejemplares de un mismo producto(cantidad) durante 1999

SELECT DISTINCT id_cliente
FROM info_clientes
WHERE id_cliente=(SELECT cliente FROM partidas_pedidos WHERE cantidad > 2 AND fecha_pedido LIKE '1999%');

pero me aparece un error que dice: subconsulta utilizada como expresion retorno mas de un registro y no entiendo por qué me sale esto
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines