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

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Mensajes
Páginas: 1 ... 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 [64] 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ... 102
631  Programación / Programación C/C++ / Re: Importante bucle mientras en: 16 Mayo 2019, 04:35 am
Bueno varias cosas. El programa como ya te han dicho se puede hacer más legible y debes ponerlo entre etiquetas de código GeSHi.
El programa no tiene ningún error y finaliza cuando introduces el número 9999 como cliente. Pero antes debes introducir las otras dos variables que pides. Si no quieres que pase esto debes pedir el número del cliente antes de empezar el <while> y justo antes de terminarlo y las otras dos variables pedirlas únicamente dentro del <while>.
632  Programación / Programación C/C++ / Re: Error al compilar en: 15 Mayo 2019, 23:00 pm
Para mostrar una variable es así:
Código
  1. cout << "La distancia es: " << distancia << endl; // el << endl es un salto de linea
Con <cin> lo que haces es coger el valor que teclee el usuario.

Aparte te comento que las librerías que terminan en .h son de C. La versión de las mismas pero para C++ son quitando el .h y poniendo una c delante <cmath>.
633  Programación / Programación C/C++ / Re: Ayuda con un intrucciones en: 15 Mayo 2019, 20:30 pm
Lo que te piden es que crees tu propia estructura de cola con prioridad (priority_queue). Puedes ver cómo funciona aquí: http://www.cplusplus.com/reference/queue/priority_queue/
En el fondo es esto. Es una cola en la que los elementos se almacenan siguiendo un orden de prioridad. Es una cola en la que las inserciones se hacen según la prioridad que tienen asignadas y las expulsiones se hacen por uno de los extremos de la cola.

Puedes entenderlo como un vector/array en el que los elementos están ordenados según su prioridad. array[0] = {elemento de menor prioridad} y array[size-1] = {elemento de mayor prioridad}. Te pongo un ejemplo:
Código:
Nomenglatura usada: objeto(prioridad)
Segun tu caso: numero menor = mas prioridad
priority_queue = { }
insert(A(5)) -> priority_queue = { A(5) }
insert(B(8)) -> priority_queue = { B(8), A(5) }
insert(C(1)) -> priority_queue = { B(8), A(5), C(1) }
insert(D(4)) -> priority_queue = { B(8), A(5), D(4), C(1) }
sacarTop() -> priority_queue = { A(8), B(5), D(4) }

Entonces lo que te piden es crear usando un array, una estructura que funcione así.
Las operaciones típicas que debe soportar son:
  • insert(cola, elemento) -> inserta el elemento en la posición correcta
  • removeFirst(cola) -> elimina el objeto con mas prioridad
  • Te recomiendo hacer un top() -> muestra el elemento con mas prioridad. Ya que es recomendable que una función sólo lo muestre y el otro sólo lo elimine (removeFirst). Creo que eso es lo que vas a implementar tú en la función <peek()>.
Y las funciones adicionales que te piden que son:
  • display(cola) -> muestra toda la cola.
  • create(cola) -> inicializa la cola con valores. Yo lo haría de forma random. O sea <create(cola, num_elementos)> y que meta <num_elementos> elementos en la cola creados de forma aleatoria.

Ahora vamos al programa en si.
En lugar de crearlo de forma global todo, te recomiendo hacerlo dentro del <main> tanto el array como la instancia <proceso> del <struct> <proceso> (mejor cambia el nombre: proceso_x (instancia) Proceso(struct) para evitar confusión).

Te pongo un ejemplo de uso de cómo lo haría yo para que veas a lo que me refiero. Te pondré las partes necesarias de las funciones y del <main> pero las implementaciones de las funciones te las dejaré a ti.
Código
  1. struct Proceso{
  2.    int prioridad; // define la prioridad de un proceso
  3.    int datos; // define los datos de ese proceso. Esto no tiene importancia
  4. };
  5.  
  6. struct ColaPrioridad{
  7.    Proceso cola_interna[SIZE]; // un array de Procesos que es nuestra cola con prioridad
  8.    int size; // determina la cantidad de elementos que tiene la cola_interna.
  9. };
  10.  
  11. // inserta <num_elementos> elementos en la cola (mi_cola.size = num_elementos)
  12. // puede ser void o ser bool y retornar true si num_elementos <= SIZE y se han guardado bien o false si num_elementos > SIZE
  13. void/bool create(ColaPrioridad mi_cola, int num_elementos);
  14.  
  15. // insertar un elemento en la cola en su posicion correspondiente segun su prioridad
  16. // puede ser void o bool y retornar true si no se ha superado el limite de elementos (mi_cola.size < SIZE) o false en caso contrario
  17. void/bool insert(ColaPrioridad mi_cola, Proceso nuevo_proceso);
  18.  
  19. // elimina el elemento con mayor prioridad
  20. // puede ser void o bool y retornar true si la cola no esta vacia y se ha eliminado bien o false en caso contrario
  21. void/bool removeFirst(ColaPrioridad);
  22.  
  23. // retorna el elemento de mayor prioridad de la cola sin eliminarlo de esta
  24. Proceso top(ColaPrioridad);
  25.  
  26. // muestra la cola completa
  27. void display(ColaPrioridad);
  28.  
  29. int main(){
  30.    ColaPrioridad mi_cola;
  31.    create(mi_cola, 5); // insertamos 5 procesos aleatorios en la cola
  32.    display(mi_cola); // vemos el contenido
  33.    Proceso proceso_nuevo1, proceso_nuevo2; // creamos dos procesos nuevos
  34.    // damos valores a prioridad y datos de proceso_nuevo1 y proceso_nuevo2
  35.  
  36.    // insertamos los nuevos procesos despues de haberles dado valores en la cola
  37.    insert(mi_cola, proceso_nuevo1);
  38.    insert(mi_cola, proceso_nuevo2);
  39.    display(mi_cola); // vemos el contenido
  40.  
  41.    removeFirst(mi_cola); // eliminamos el Proceso con mayor prioridad (es decir, con el atributo prioridad menor)
  42.    display(mi_cola); // vemos el contenido
  43. }

En un principio puede parecer que tienes que introducir los elementos en el array de más prioridad a menos para eliminar el "primer elemento" que es el de mayor prioridad. Sin embargo, si los ordenas de menos a más prioridad, el elemento con más prioridad es <cola_interna[size-1]> y cuando tengas que eliminar el elemento de mayor prioridad (la función <removePrio()> sobra, solo se usa <removeFirst()>) solo tienes que hacer <size-->. Así ahora el último elemento ya es el anterior y cuando introduzcas un elemento nuevo sobrescribes el que se supone que habías borrado con desplazamientos.

Si tienes alguna duda para implementar alguna de las funciones o sobre algo de lo que te he comentado, recuerda, de ser necesario, poner tus avances para poder ayudarte mejor. Suerte :-X
634  Programación / Programación C/C++ / Re: Sobrecarga de operador en: 15 Mayo 2019, 19:42 pm
Hola amigos..

Estoy experimentando con el contenedor set y tengo duda con el operador de sobrecarga que se necesita para meter al contenedor un tipo creado por mi mismo...

Según estuve leyendo y alguien me dijo también que necesito sobrecargar el operador <

Pero este operador menor que, en que forma hace la comparación de elementos?, el contenedor set no permite objetos duplicados, no seria mas lógico sobrecargar == en vez de < para comparar si el elemento ya existe?

Creo que a lo que te refieres es al tipo de ordenación interno del <set>. Un <set> es un conjunto de valores no repetidos y ordenados según un criterio que puedes elegir tú (criterio por defecto: less<T>). Es por esto que si creas un <set> para almacenar objetos deben poder ordenarse de menor a mayor y para ello tienes dos opciones:
  • Sobrecargar el operador <.
  • Crear un functor. (Verás que se hablan mucho de functores para <set> y <priority_queue>.
Código
  1. // OPCION 1: Sobrecarga de <
  2. struct foo{
  3.    // miembros
  4.    bool operator<(const foo &f)const{/*...*/}
  5. };
  6. std::set<foo> my_set; // equivalente a std::set<foo, less<foo>, allocator<foo>> se necesita el operador para el criterio less<foo>
  7.  
  8. // OPCION 2: Functor
  9. struct foo{
  10.    // miembros
  11. };
  12.  
  13. struct comparaFoo{
  14.    bool operator()(const foo &f1, const foo &f2)const{/*...*/}
  15. };
  16. std::set<foo, comparaFoo> my_set; // cambiamos el criterio por defecto por el nuestro

Si quieres saber más sobre esto: http://www.cplusplus.com/reference/set/set/
Puedes leer la teoría. Es muy concisa pero precisa, creo que está muy bien para entenderlo (aunque en inglés, pero es un inglés sencillo). Suerte :-X
635  Programación / Programación C/C++ / Re: URGE AYUDA DEV C++ en: 15 Mayo 2019, 07:04 am
Citar
Propones una funcion que no funciona. No contempla que los valpres almacenados en las variables sean iguales.
Te invito a buscar cualquier ejemplo o analizar el funcionamiento de la función para ver si es cierto que no contempla que los valores sean iguales. Se empieza asignando como mayor a <numero1> y se actualiza en caso de que otro de los números sea mayor estricto. ¿Qué más da que dos números sean iguales? mayor{5,5} = 5. Que más da que el mayor sea el primero o el segundo, si son iguales. Mejor tratar al primero como mayor y nos ahorramos una asignación más a lo tonto.
Esto se usa siempre para determinar el mayor de dos números:
Código
  1. // Lo que se le pasa a alguien por la cabeza cuando esta empezando
  2. // Aqui si es cierto que si no ponemos >= en la condicion tendriamos un problema si numero1 == numero2
  3. int mayor;
  4. if(numero1 >= numero2)
  5.    mayor = numero1;
  6. else
  7.    mayor = numero2;
  8.  
  9. // Como se suele hacer para optimizar
  10. int mayor = numero1; // suponemos que numero1 es mayor
  11. if(numero2 > mayor) // solo si numero2 es mayor estricto actualizamos el mayor, si son iguales mantenemos numero1 ya que es correcto
  12.    mayor = numero2;

Citar
Propones utilizar arrays en un programa que se presupone que el usuario puede introducir la cantidad de valores que quiera. En lugar de usar vectores que no dejan de estar implementados con arrays.
Los contenedores de la STL están muy bien pero para una tarea trivial como es esta no recomiendo su uso. Estás metiendo una enorme cantidad de código (funciones, constantes, etc) que traen consigo cada una de las librerías dedicadas a un contenedor cuando con un array que no añade nada más se puede solucionar.
Además creo que los contenedores de la STL no deberían usarse hasta haber hecho algún algoritmo tedioso con arrays:
1º Para saber desenvolverse en situaciones difíciles en las que por un motivo u otro, sea obligatorio usar arrays.
2º Para comprender mejor el potencial de los contenedores y ver la de trabajo que quitan.
Seguro que hay más razones pero sólo destacaré esas. Imagina que empiezas a programar usando desde el principio la librería <vector> y un día te dicen "¿cómo llevas trabajar con memoria dinámica?" o piensas "¿por qué la gente se esfuerza en aprender memoria dinámica y a usar <new> y <delete> cuando el <vector> lo hace todo solo?"

Citar
Siguiendo por esa linea, seria mas eficiente usar set como contenedor.
Depende lo que entiendas por eficiente... Crear un set de valores donde vamos a meter un array ponte de 1000000 números en los que hay 20 repetidos. Habrá quien diga que mejor un set "así evitas meter los valores que son iguales. Al final coges el último y ya está" Y... El set se ordena por arte de magia? De verdad alguien piensa eso? Requiere tiempo de ejecución que aunque no se vea de forma explícita, está ahí. Habrá quien diga que mejor una cola con prioridad, con las operaciones suficientes para resolver esa tarea y menos costosa y habrá quien no se quede ahí y diga "cuando la cola con prioridad no esté vacía comparas el valor que vas a meter con el top y solo lo introduces si el nuevo valor es mayor, así no introduces todos los valores y por ende no requieres de tanto espacio" Y yo me pregunto al final eso no acaba siendo un bucle que determina el mayor entre el mayor actual y el siguiente número del array?? Mejor saber sacarse las castañas del fuego sin tanto contenedor de la STL aunque no digo que no tengan su utilidad, pero no para algo tan trivial...

Citar
Suprimi el valor decimal a proposito aunque lo correcto sea redondear porque no queria solucionarle la tarea.
Muy bien, entonces digamos que lo comenté para que si alguien lo iba a pasar por alto, se parara a pensarlo. Ya que al final siempre alguien acaba liado preguntándose "¿por qué me salen estos dos porcentajes iguales si uno vale 20,99% y el otro 20,02%? Por no haber hecho un cast en la división.

Citar
En base al resto que comentas intente acercar el codigo al lenguaje humano para que lo entienda.
Para acercarse al lenguaje humano están los comentarios a los que no pondré quejas ya que explicas todo lo que vas haciendo y eso está bien sobre todo para la gente que empieza o el pseudocódigo el cual ya cada cual puede encargarse de traducir a su manera.
Pero por ejemplo crear una variable para guardar el enter del final... Si alguien está empezando y se acostumbra a hacerlo así porque es lo que vio cuando él estaba empezando a programar, algún día le harán preguntas como "¿por qué creas esa variable?" o "¿por qué de tipo int si vas a guardar un enter"? o podrá pensar que eso funciona cuando pulsas enter hasta que un día se equivoque y le dé a otra tecla y se diga "¿por qué pido que pulsen Enter para salir si cualquier tecla sirve?" Son pequeños detalles pero que la gente cuando lo ve debería preguntarse ese tipo de cosas y en cambio muchos lo pasan por alto y dicen "pues se hace así y ya está". Y no es que se haga así, cada uno podrá hacerlo como quiera al final, pero que sepan las opciones que tienen.

Solo quiero dejar claro que tanto el comentario anterior como este son críticas constructivas. No lo hago por tocar las narices ni nada pero en el fondo todos tenemos nuestro ego y nos gusta defenderlo. Y personalmente me gusta explicar el porqué de lo que hago y digo en un mundo que cada vez más se usa el motivo del porque sí hasta en el sistema educativo, sin ningún tipo de razonamiento en el que apoyarse. Ahora que ya he soltado mi reivindicación y he mostrado las posibilidades que hay hasta para hacer la función más simple del mundo. Suerte a todos y ánimo con la programación :-X
636  Programación / Programación C/C++ / Re: URGE AYUDA DEV C++ en: 15 Mayo 2019, 01:53 am
Para la función de <numeroMayor> te puedes ahorrar condiciones si empiezas suponiendo un valor como máximo que es lo que se suele hacer en estos casos. Además poner un <if> vacío para hacer algo en el <else> es mejor darle la vuelta a la condición para hacer lo del <else> en el <if> y no poner el <else>. Algo así:
Código
  1. int numeroMayor(int numero1, int numero2, int numero3){
  2.    int mayor = numero1;
  3.    if(numero2 > mayor)
  4.        mayor = numero2;
  5.    if(numero3 > mayor)
  6.        mayor = numero3;
  7.    return mayor;
  8. }
De todas formas hacerlo para 3 números queda un poco feo porque no te vale para 2 que es el caso base, ni para un número aleatorio por lo que lo suyo sería:
  • Crear la función para 2 parámetros y llamar a la función desde la propia función:
Código
  1. int mayor = numeroMayor(numeroMayor(numero1, numero2), numero3);
  • Crear la función para un array:
Código
  1. int numeroMayor(int *numeros, int size);

La función de <FuncionPromedio()> mejor hacerla de tipo <double/float> porque un promedio usando enteros queda un poco limitado. Recordar hacer un cast en la división para pasar de enteros a reales. Y lo mismo de antes, mejor que reciba un array de números:
Código
  1. double calcularPromedio(int *numeros, int size);

Esto a decisión de cada uno (bueno como todo) pero la función del menú haría que retorne ya la opción elegida. De esta forma puedes meter un filtro <do while> para controlar la opción que se elige. Así además nos ahorramos un <case> ya que no aceptamos ningún valor distinto de {1, 2, 3}:
Código
  1. int opcion_elegida = menu();

Limpias la pantalla al comienzo de cada <case>. Llama a la función una única vez antes de empezar el <switch>. También escribes unos cuantos saltos de línea al final de cada <case>; más de lo mismo, ponlo una única vez después del <switch>. De todas formas esto son funciones fanzy (funciones de adorno) que no debes prestar mucha atención ya que no es lo importante.

Las variables de tipo <bool> en una condición queda mejor poner <if/while(condicion)> para <if/while(condicion == true)> y <if/while(!condicion)> para <if/while(condicion == false)>:
Código
  1. while(!fin);

Citar
Código
  1. //Nos ahorramos la llamada a system pause:
  2. int PausaDelSistema;
  3. cout << "El programa a finalizado." << endl
  4. <<"Introduce cualquier caracter y pulsa enter para finalizar" << endl;
  5. cin >> PausaDelSistema;
Todo esto para no usar <system("pause")>? Con un <cin.get()> solucionado.
Código
  1. cin.get();

637  Programación / Programación C/C++ / Re: URGE AYUDA DEV C++ en: 14 Mayo 2019, 22:45 pm
Todos los códigos entre etiquetas de código GeSHi...  :rolleyes:

Mejor cárgate esa Z... :silbar: :silbar: :silbar:
Por qué la condición entre comillas???? Eso son cadenas de caracteres literales...
En serio... Por qué Z? Por qué si vale 5? Y por qué de tipo <char> si le asignas un entero? Eso no hay quien lo entienda. Como te han dicho usa una variable <bool> que solo puede ser true/false para decidir si seguir repitiendo el programa o si salir. Y pon un nombre que diga algo, como te han dicho, no Z (igual que <ch>.... Llámalo <opcion> o algo así que permita identificarlo fácil).

Además estás usando funciones típicas de C y estás programando en C++... Usa las funciones de entrada/salida típicas de C++ <cout> y <cin> (de <iostream>) en lugar de <getchar()> y <printf()> (de <stdio.h> que en C++ sería <cstdio>) y quita la librería <conio.h> que no tiene utilidad y solo sirve para sacar errores según el compilador... Así que haciendo eso <conio.h> y <stdio.h> sobran. Y el nombre correcto para <stdlib.h> en C++ es <cstdlib> (como con todas, se quita el .h y se añade una c al comienzo del nombre).

Y lo normal es meter cada funcionalidad en una FUNCIÓN, no en un programa. Así haces los programas independientes unos de otros y no tienes que usar <system("...")> que requiere más recursos porque necesita hacer llamadas al sistema.

Y si haces <return> el programa termina. Otra razón más por la que el Z=5 sobra. Bueno el Z=5 y todo lo que vaya después del <return>
638  Programación / Programación C/C++ / Re: Matriz aleatoria en c en: 14 Mayo 2019, 22:15 pm
La i entre corchetes no sale porque se traduce como una etiqueta de cursiva. Por eso a partir de ahí viene escrito en cursiva. Para solucionarlo mete tu código entre etiquetas de código GeSHi seleccionando como lenguaje C.

Y estás usando el formato %ls que la s es para cadenas cuando estás usando una matriz de enteros. El formato para enteros es %d.
Además estás intentando mostrar la dirección de memoria de cada elemento, en vez de el elemento.
Código
  1. printf("%d", &variable); // muestras la dirección de memoria de variable
  2. printf("%d", variable); // muestra el valor entero de la variable
639  Programación / Programación C/C++ / Re: Ayuda con libreria en android en: 14 Mayo 2019, 01:12 am
Para crear un programa que calcule lo que tú quieres no necesitas usar una función como <gotoxy()>.
640  Programación / Programación C/C++ / Re: Operador de seleccion -> en variable no puntero.. en: 13 Mayo 2019, 06:37 am
Al usar la palabra <auto> todo depende del valor de retorno de <getInstance()>. Si esa función devuelve un puntero o una referencia entonces <auto> se comportará como si estuviesemos declarando un puntero de ese tipo.
Páginas: 1 ... 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 [64] 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines