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

 

 


Tema destacado:


  Mostrar Mensajes
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... 86
31  Programación / Programación C/C++ / Re: agregar varios datos en un MAP en: 7 Diciembre 2020, 03:44 am
Tienes que asignarle con el = el dato que tiene que guardar.
Según las declaraciones de clases que he hecho antes, el segundo campo es un std::vector<Insumo> por lo que es ese objeto el que le tienes que asignar.
Código
  1. Insumo insumo1("Nombre insumo 1", "Unidad de medida 1", 1);
  2. std::vector<Insumo> insumos; // creas el vector
  3. // introduces los objetos que quieras
  4. insumos.push_back(insumo1);
  5. //...
  6. std::map<string, std::vector<Insumo>> myMap;
  7. myMap["tu cadena"] = insumos;
32  Foros Generales / Dudas Generales / Re: [Debate] ¿Qué plataforma utilizar para publicar contenidos? (YouTube, Blogs,...) en: 7 Diciembre 2020, 02:38 am
Los videos te pueden quedar igual de largos que el texto y me imagino que para las personas en general son más difíciles de hacer. Pero creo que los videos son más visitados.
Es cierto que un vídeo también puede resultar demasiado largo pero cuando se quiere comentar, modificar o probar algo es más fácil, rápido y visual hacerlo en un vídeo (donde la imagen y el sonido están coordinados y se ve en todo momento lo que haces) que tener que explicar cada cosa que haces en forma de texto para que quede lo más claro posible.

Y como tú dices, yo también creo que los vídeos son más visitados y difundidos actualmente.
33  Programación / Programación C/C++ / Re: Ayuda para insertar de forma ordenada en un vector en: 7 Diciembre 2020, 02:28 am
Si te fijas en el pseudocódigo que te puse, en la función moverDerecha() empiezo el for() en <longitud - 1> pero cuando lo he llamado desde insertarOrdenado() lo he hecho con <size + 1>. Por lo que realmente:
Código:
i = longitud - 1
longitud = size + 1
ENTONCES -> i = (size + 1) - 1 = size

EDIT: Es necesario recalcar que esa función tal y como la tienes presupone que: (size < maxSize). Por lo que sólo se puede utilizar en los casos en los que esa precondición sea cierta. No es muy buena opción, por eso comenté la alternativa de pasar la longitud máxima y comprobar la condición explícitamente.

PD: En la línea 15 no es necesario el = en la condición. Basta con >. Si lo pones tampoco funcionará mal pero estás copiando un valor que luego vas a sustituir por el nuevo por lo que no es necesario. Lo importante no es que funcione sino entender lo que se está haciendo.
34  Foros Generales / Dudas Generales / [Debate] ¿Qué plataforma utilizar para publicar contenidos? (YouTube, Blogs,...) en: 7 Diciembre 2020, 02:15 am
Desde hace algún tiempo tengo en mente empezar a publicar algunos contenidos como tutoriales, blogs o similares sobre informática, programación y puede que más adelante sobre otros temas relacionados o no con los anteriores. El problema me surge cuando pienso en qué formato y plataforma utilizar para ello, por lo que abro aquí este debate para cualquiera que quiera expresar su opinión (tanto si es creador de contenido como si no) o dar a conocer otras alternativas.

La duda principal que tengo es: ¿vídeo o texto?.
Aunque supongo que en formato texto conlleva menos trabajo de edición, también pueden acabar siendo textos demasiado grandes (lo he comprobado ya en este foro cuando intento responder un tema de forma breve y al final me acabo explayando más de lo esperado). Por esto pensé en hacerlo mejor en formato vídeo aunque no sé cómo me desenvolveré luego.

Y la otra duda es: ¿qué plataforma utilizar?
No conozco nada sobre blogs por lo que no sé qué páginas existen para publicar contenido (obviamente de forma gratuita para empezar) o cómo gestionarlo una vez creado.
Por otro lado, para publicar vídeos, tenía en mente la opción más conocida (creo): YouTube. Conozco algunas otras webs pero que tienen un propósito más específico y de momento prefiero elegir una más flexible y ya más adelante valorar si empezar en otras plataformas.

Dicho esto y como ya he comentado al principio, me gustaría conocer otras opiniones y recomendaciones de personas que se hayan visto, o no, en esta situación.

PD: Por si alguien se ha preocupado, no voy a dejar este foro pero sí quiero empezar otros proyectos personales paralelamente...  :xD

35  Programación / Programación C/C++ / Re: Ayuda para insertar de forma ordenada en un vector en: 7 Diciembre 2020, 01:38 am
Lo primero de todo: el código debe estar publicado entre etiquetas de Código GeSHi. Ya te hemos corregido los mensajes anteriores pero lo suyo es que lo hagas tú a partir de ahora. Si no sabes cómo hacerlo, encima del cuadro de texto hay un desplegable que dice "Código GeSHi". Ahí tienes que seleccionar el lenguaje correspondiente y aparecerán en el cuadro de texto dos etiquetas code. Tu código debe ir entre esas dos etiquetas. Las etiquetas también las puedes escribir a mano sin usar el desplegable.


Los problemas que veo a simple vista son:
  • Línea 15 -> El for() debe empezar por el final e ir hacia el principio por lo que tienes que revisar tanto la condición como la actualización (los dos últimos campos del for()).
  • Línea 87 -> En C/C++ los arrays empiezan en la posición 0. Por lo tanto un array de longitud 5 tendrá como último elemento el 4 {0, 1, 2, 3, 4}. Esto es importante al trabajar con los índices de los arrays. Tienes que corregir eso pues no muestras el elemento 0 (porque empiezas en 1) y muestras el elemento cont (que ya está fuera del límite).
  • Línea 57 -> Por el mismo motivo que el punto anterior, debes empezar en 0.
  • Línea 61 -> Por el mismo motivo otras vez, no puedes repetir el bucle si (cont == k) porque estarás accediendo fuera del límite. Tienes que corregir la condición.

Otras cosas que puedes mejorar son:
  • Líneas 59 y 65 -> La variable <a_insertar> no es necesaria. Puedes utilizar directamente <vector>.
  • Líneas 67 - 77 -> El if-else no es necesario. No tienes que tratar el primer caso diferente pues la función InsertarOrdenado() funciona correctamente para todos los casos.
36  Programación / Programación C/C++ / Re: agregar varios datos en un MAP en: 7 Diciembre 2020, 01:24 am
No veo cuál es el problema que comentas. No tienes que guardar 3 valores (2 strings y 1 int) pues estos están encapsulados dentro de una clase. Lo que tú vas a guardar es el objeto de esa clase únicamente. Sería algo así el esquema general:
Código
  1. class Insumo {
  2.  private:
  3.    std::string nombreIQ;
  4.    std::string unidadMedida;
  5.    int stock;
  6.  //...
  7. };
  8.  
  9. class Consumo {
  10.  private:
  11.    std::string nombreIQ;
  12.    int cantidadConsumida;
  13.    int fecha; // o el tipo de dato que sea
  14.  //...
  15. };
  16.  
  17. class Produccion {
  18.  private:
  19.    std::map<std::string, std::vector<Insumo>> insumos;
  20.    std::map<std::string, Consumo> consumos;
  21.  //...
  22. };

No sé si esto te sirve pero por lo que veo estabas intentando meter los atributos por separado en el map en vez de crear una clase como te dice en el enunciado. Al final esto es lo que viene siendo el paradigma de programación orientada a objetos (POO): utilizar clases para encapsular información de una entidad y poder utilizar esa clase para instanciar objetos de ese tipo.
37  Programación / Programación C/C++ / Re: Ayuda para insertar de forma ordenada en un vector en: 7 Diciembre 2020, 00:07 am
Cuando hay que implementar algoritmos que requieren usar un poco el coco ayuda bastante crear funciones y separar así el código. Esto ayuda a entender mejor el funcionamiento y en caso de error es más fácil saber a qué función dirigirse para corregirlo.

La parte de los valores de entrada lo obviaré pues no será ningún problema. Entonces empezamos con un array <vector> lleno de números y otro <mayores> vacío donde hay que introducir los <numMayores> primeros valores de <vector> que sean mayores que <valorMinimo> ordenados.
Código:
insertados := 0 // numero de elementos insertados en mayores
indice := 0
MIENTRAS indice < vector.size AND insertados < numMayores HACER
  SI vector[indice] >= valorMinimo ENTONCES
    insertarOrdenado(vector[indice], mayores) // Inserta el valor indicado en el array de forma ordenada
    insertados := insertados + 1 // incrementa el numero de insertados en el array
  FIN SI
FIN MIENTRAS
Ya está como ves queda muy muy sencillo. Ahora obviamente hay que entrar en lo que sería la función insertarOrdenados() y ver cómo hacerla, pero ya vamos dividiendo el trabajo.

En la función insertarOrdenado() tienes que ver qué índice le correspondería al valor a insertar. Si ese índice no es la primera posición libre, tendrás que mover todos los valores a la derecha de este. Necesitas conocer también el número de elementos actuales del array por lo que tendrás que pasarlo por parámetro también. Además recomiendo pasar la longitud máxima del array para comprobar que hay huecos (aunque en este caso ya lo hemos comprobado antes con: insertados < numMayores por lo que no es obligatorio)
Código:
Función insertarOrdenado (valor : entero, v : array, size : entero, maxSize : entero)
INICIO
  SI size < maxSize ENTONCES // comprobar que hay huecos. Se puede omitir en este caso pero mejor no. Asi la funcion es mas reutilizable y evita errores
    indiceInsercion := 0 // indice que le corresponde al elemento
    MIENTRAS indiceInsercion < size AND v[indiceInsercion] < valor HACER
      indiceInsercion := indiceInsercion + 1
    FIN MIENTRAS
    SI indiceInsercion != size ENTONCES // si no se inserta al final, hay que mover elementos
      moverDerecha(v, indiceInsercion, size+1) // Mueve una posicion a la derecha desde el indiceInsercion para hacer el hueco. Los detalles los explico mas adelante
    FIN SI
    v[indiceInsercion] = valor
  FIN SI
FIN

Ahora vamos a la última función que nos falta: moverDerecha(). Esta función mueve una posición a la derecha desde el índice indicado hasta el final. Realmente hay que hacerlo en sentido inverso, es decir, empezar por el final e ir guardando en cada posición el valor de la anterior (para no sobreescribir datos y que falle). El último parámetro que he pasado (size+1) indica la longitud del array. Hay que entender que ahora ya trabajamos con un elemento más (aunque de momento haya un hueco) por lo que si ponemos size, tendremos problemas con el último valor. El pseudocódigo de esta sería:
Código:
Funcion MoverDerecha (v: array, inicio : entero, longitud : entero)
INICIO
  PARA i := longitud - 1 HASTA inicio + 1 HACER // Desde el final hasta el indice del hueco mover los elementos. En inicio ya no hace falta pues lo vamos a sobreescribir
    v[i] = v[i-1]
  FIN PARA
FIN

Y con esto ya estaría terminado. Si implementas cada una de las funciones que te he comentado y las juntas, funcionará correctamente. Si tienes algún problema postea tus avances para ir guiándote o corregirte los errores. Suerte :-X
38  Programación / Programación C/C++ / Re: hola me puede ayudar con mi tarea por favor,no le entiendo y ya me estrese :( en: 6 Diciembre 2020, 22:28 pm
1. El tema debería ir en el foro específico de Programación C/C++.
2. El código debe ir entre etiquetas de código GeSHi. Además como te han dicho debe estar bien tabulado para facilitar la lectura a los demás.
3. Ese programa que pones tiene varios errores además de cosas mejorables. Tomarlo como ejemplo me parece un error.
4. Claro que te ayudamos pero no te vamos a hacer la tarea. Pon lo que lleves hecho del programa (no del ejemplo sino del que tienes que hacer) y los problemas que tengas.
39  Programación / Bases de Datos / Re: Extraño: select con offset y limit devuelve datos duplicados en: 6 Diciembre 2020, 02:45 am
el problema es que el SP_CLIENTE_BUSCAR devuelve registros duplicados y en orden inverso durante la paginacion, ademas que se omite 4 o 5 de los 12 registros.
Lo que me devuelve el sp_cliente_buscar:
Código:
paginacion se realiza por cada 5 registros:

PAGINA1:
1 maria    2020-12-05  17:31:19
2 julio    2020-12-05  17:31:19
3 antonio  2020-12-05  17:31:19
4 marlon   2020-12-05  17:31:19
5 mariela  2020-12-05  17:31:19

PAGINA2:
6 carmen   2020-12-05  17:31:19
7 ramiro   2020-12-05  17:31:19
5 mariela  2020-12-05  17:31:19
4 marlon   2020-12-05  17:31:19
3 antonio  2020-12-05  17:31:19
2 julio    2020-12-05  17:31:19

PAGINA 03:
2 julio    2020-12-05  17:31:19
1 maria    2020-12-05  17:31:19
La bd esta en un servidor de hosting, el gestor es phpMyAdmin.
Alguien sabra por que ocurre esto, esta mal mi codigo o esta fallando el servidor?

No tengo demasiada experiencia en bases de datos pero creo que sería una buena idea incluir con qué argumentos se está llamando al procedimiento.
Además veo que dices que la paginación se hace por cada 5 registros pero la Página 2 tiene 6 registros. Esto te ocurre así o ha sido un error al escribirlo aquí??
40  Programación / Programación C/C++ / Re: Esta bien elaborado este codigo? en: 5 Diciembre 2020, 18:19 pm
A grandes rasgos el programa está bastante bien:
  • Uso de constantes para hacerlo fácilmente escalable.
  • Nombres de variables/funciones significativos.
  • Bien estructurado.
...

Sin embargo, hay algunas cosas corregibles y algunos consejos siempre se pueden dar:

ALGUNOS ERRORES O COSAS IMPORTANTES:
  • En la función main() mezclas el uso de <orden> y <menu>. Guardas el valor en <orden> pero utilizas el switch con <menu>. Dudo que esto te esté funcionando por lo que supongo que será un error de formateo.
  • El programa finaliza al crear todos los drones. ¿Una vez que los he almacenado todos ya no puedo consultarlos? Es mejor que la condición de (numDrones < MAX_DRONES) se ponga dentro del case para crear un dron. Que no permita crear más pero que sí permita seguir consultando los creados.
  • Además la condición de (menu != 0) nunca llega a usarse. El <return 0> de la línea 77 hace que acabe el programa sin que llegue a comprobarse la condición. Es mejor que elimines el <case 0:>. Cuando sea 0 no hagas nada especial y ya se encarga el do-while() de hacer que el bucle acabe.
  • En la línea 94 vas a tener problemas si se introduce una cadena demasiado larga. La forma correcta y recomendada de leer cadenas de caracteres en C es mediante fgets(). Además después de cada scanf() (o al menos justo antes de usar fgets()) tendrás que limpiar el buffer para que funcione correctamente.
Código
  1. #define SIZE 100
  2. char cadena[SIZE];
  3. // Guarda como mucho SIZE-1 caracteres de la entrada estandar (stdin) en el array (cadena)
  4. // La ultima posicion se reserva para el caracter de fin de cadena: \0
  5. fgets(cadena, SIZE, stdin);
  6. // El Enter que introduzcas al final tambien se guardara (si hay espacio) entonces:
  7. if(cadena[strlen(cadena)-1] == '\n') cadena[strlen(cadena)-1] = '\0'; // Si se ha guardado lo eliminamos
  8. else while(getchar() != '\n'); // sino, es que quedan caracteres en el buffer. Asi se limpia el buffer de entrada

  • En la función mostrarDatosDron(), qué pasa si el número de serie no existe?? Muestras el último. Si yo busco el dron 123 quiero ver el dron 123 o un aviso de que ese dron no existe, no que el programa me enseñe los datos del 321. Supongo que se entiende, no? Además es mejor asignar siempre un valor a todas las variables de forma explícita y en tu caso contador no tiene un valor inicial explícito.
ALGUNOS CONSEJOS:
  • Puedes utilizar typedef para no tener que repetir la palabra struct.
Código
  1. // Para hacer referencia a Persona hay que escribir siempre: struct Persona
  2. struct Persona {
  3.  char *nombre;
  4.  int edad;
  5. };
  6. struct Persona miPersona;
  7.  
  8. // En este otro caso basta con utilizar solo el nombre de la struct: Persona
  9. typedef struct {
  10.  char *nombre;
  11.  int edad;
  12. } Persona;
  13. Persona miPersona;

  • Yo no usaría la palabra tipo en cada struct. Da a entender que hace referencia al tipo de fecha, de coordenada o de Dron. Piensa que en C no están definidos los tipos primitivos como: tipoInt, tipoFloat,... Es mejor usar solo: Fecha, Coordenada, Dron,...
  • El modelo del Dron puedes definirlo como un puntero y utilizar memoria dinámica. Así cada array ocupará lo estrictamente necesario y no más. Esto complica un poco el programa pues tratar con memoria dinámica no siempre es muy sencillo.
  • En los parámetros de las funciones no es necesario especificar el tamaño de la primera dimensión del array. Puedes ahorrar texto y además imagina que en un momento dado le pasas un array con una longitud diferente. Y cuando no se utilizan parámetros no es necesario especificar "void" (se puede y se suele dejar vacío). De igual manera las funciones con retorno void tampoco suelen especificar el return (se añade implícitamente siempre al final de una función).
  • En las definiciones de las funciones no es necesario especificar tampoco el nombre. El nombre solo hay que especificarlo en la implementación y así si lo cambias no tendrás que cambiarlo en 2 sitios, sino solo en 1. Resultado:
Código
  1. //Declaraciones de funciones
  2. void  mostrarDronesARevisar(Dron[], int numDrones);
  3. void mostrarDatosDron (Dron[], int numDrones);
  4. struct tipoDron leerDatosDron();
  5. void mostrarFlota(Dron[],int numDrones);
  6. void mostrarDronesEnReparto(Dron[], int numDrones);

  • También puedes utilizar la palabra const en parámetros para especificar que estos no pueden ser modificados durante la ejecución de la función. Aunque es típico pensar "qué más dará usar const si yo no voy a cambiar el valor?" En códigos grandes es posible que sin querer o queriendo lo cambies llegado un punto y no lo tengas en cuenta. Así evitas este posible problema.
  • La línea 138 es demasiado enrebuscada. No digo que esté mal pero se puede simplificar. Recuerdo en el colegio cuando me decían "antes de operar hay que convertir todo a la misma unidad". Pues eso es lo que hay que hacer, convertir la fecha a meses ¿quedará algo más sencillo no?:
Código
  1. (year * 12 + mes) > (dron.year * 12 + dron.mes)

  • Una mejor manera para buscar un dron (o cualquier elemento en un array) es con un flag de salida por ejemplo. Aprovecha al máximo cada variable:
Código
  1. int dronBuscado = -1; // Suponemos que no existe
  2. for(int i = 0; i < numDrones && dronBuscado == -1; ++i){
  3.  if(dron[i].numSerie == numSerie) dronBuscado = i;
  4. }
  5. // Ya tienes la posicion del dron buscado o -1 si no existe
  6. if(dronBuscado != -1){
  7.  // ...
  8. } else printf("El dron %d no existe\n", numSerie);

  • Además la eficiencia del algoritmo para buscar un dron es lineal O(n). Puedes modificar el programa para guardar siempre los drones en orden según el numSerie y así tener una eficiencia de búsqueda mejor O(log n).
  • En la función mostrarFlota() quitaría la parte final de mostrar un dron. Imagina que automatizas un programa para que muestre 200 arrays diferentes de drones y tienes que tener a una persona ahí pulsando una tecla cada vez que terminas de mostrar un array. La función tiene que hacer lo que tiene que hacer: mostrar los drones. Luego cuando llames a esta función desde fuera tú sabrás si quieres añadir lo otro o no pero que esto no se añada siempre.

Creo que esto es todo. Al menos todas las cosas que yo cambiaría o que se podrían cambiar para mejorarlo.
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... 86
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines