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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ... 102
61  Programación / Programación C/C++ / Re: tengo una una pequeña duda, sobre vectores en: 19 Enero 2022, 22:12 pm
Desde luego. Sólo quería recalcar esa limitación.

Y aprovecho ya para extender un pelín más la explicación y decir que no es que esa solución sólo valga para números de un dígito. Lo correcto es decir que sólo vale para números de un dígito si el array de contadores/booleanos es de longitud = 10.
Como forma general para que funcione con cualquier tamaño de números: La longitud del array debe ser 10 elevado al número máximo de dígitos que pueda tener cualquiera de los elementos.
Código:
longitud_array = pow(10, num_max_digitos)
Lo cual se hace inviable para números con muchos dígitos pero con un par de dígitos seguiría siendo una buena opción.
62  Programación / Programación C/C++ / Re: tengo una una pequeña duda, sobre vectores en: 19 Enero 2022, 19:23 pm
Las soluciones de @Mafus son buenas opciones  ;-)

Personalmente, me gusta más la segunda opción pero con un pequeño detalle: cada elemento del array tiene que ser de un único dígito.
Por lo que está opción es más limitada, mientras que la primera funciona con números de cualquier longitud.
63  Programación / Programación C/C++ / Re: me ayudan a hacer que ande esto que usa vectores en: 16 Enero 2022, 13:33 pm
muchas gracias :D por ayudarme
una consulta en el párrafo 3 es normal que este sin color ? por que justo hay me sale error y tenia el mismo error en el programa que hice yo antes que lo haya mandado por acá
No sé a qué te refieres con párrafo 3...
Si puedes especificar un poco más la porción de código que indicas... :silbar:
64  Programación / Programación C/C++ / Re: Factorial de un Número : duda en: 16 Enero 2022, 13:32 pm
Este tema tenía que llamarse: "Hacer complicado lo simple"  :xD

Empezamos por decir que una iteración es cada una de las repeticiones de un proceso.
Partiendo de eso, cuántas iteraciones tiene calcular el factorial de 5 o cualquier otro proceso? Pues las que tu algoritmo defina. Un mismo problema se puede solucionar con diferentes algoritmos que varíen el número de iteraciones para resolverlo.

Creo que se explica más fácil con código:
Código
  1. for(int i = 0; i < 0; ++i); // Este bucle no se va a ejecutar nunca. Iteraciones = 0
  2. for(int i = 0; i < 1; ++i); // Este bucle se va a ejecutar 1 vez: i = {0}. Iteraciones = 1
  3. for(int i = 0; i < num; ++i); // Este bucle se va a ejecutar num-veces si num >= 0 y 0-veces si num < 0. Iteraciones = MAX(0, num)
  4.  
  5. // Y si i no empieza en 0, todo funciona igual
  6. for(int i = 10; i < 15; ++i); // Este bucle se va a ejecutar 5 veces: i = {10, 11, 12, 13, 14}. Iteraciones = 5
  7.  
  8. // De forma general:
  9. for(int i = a; i < b1; ++i); // Este bucle se va a repetir (b1-a) veces o 0 si el resultado es negativo (como antes). Iteraciones = MAX(0, (b1-a))
  10. // Y teniendo en cuenta que el anterior bucle es igual a:
  11. for(int i = a; i <= b1-1; ++i); // Iteraciones: MAX(0, (b1-a)) = MAX(0, (b1-1-a+1))
  12.  
  13. // Consideramos que b2 = b1-1 y juntamos conclusiones:
  14. for(int i = a; i <= b2; ++i); // Iteraciones: MAX(0, (b2-a+1))

Y ahí tenemos cómo calcular el número de iteraciones de un bucle de forma general tanto cuando el comparador es '<' o '<='.

Ahora vamos al código original:
Citar
Código
  1. for ( int i = 1; i <= numero; i++ ) {
  2.  factorial = factorial * i;
  3. }
Cuántas iteraciones realiza? MAX(0, (numero-1+1)) = MAX(0, numero)
Es decir: numero-iteraciones si numero >= 0 o 0 en caso contrario -> numero = 5 -> El programa realiza 5 iteraciones, no hay más.

Que la primera iteración no tiene sentido porque el 1 es el elemento neutro de la multiplicación y entonces multiplicar por 1 es como no hacer nada? Efectivamente, pero ese programa realiza 5 iteraciones.
Si consideras que la primera no es necesaria y realizas la siguiente modificación:
Código
  1. for(int i = 2; i <= numero; ++i) {
  2.  factorial *= i; // Forma corta de escribir: factorial = factorial * i
  3. }
Ahora, cuántas iteraciones realiza este bucle? MAX(0, (numero-2+1)) = MAX(0, (numero-1)) -> numero = 5 -> MAX(0, (5-1)) = MAX(0, 4) = 4 iteraciones

Todo depende de cómo se implemente el algoritmo no de "yo considero que esta no cuenta". Si consideras que algo no cuenta pero tu programa lo está haciendo, entonces cuenta. Si no quieres que cuente, haz que tu programa no lo haga y entonces no contará.
65  Programación / Programación C/C++ / Re: Matrices en C++ en: 15 Enero 2022, 17:12 pm
El problema que tienes da la casualidad de que con la matriz que has puesto de ejemplo no aparece cuando se recorre por filas porque los primos van siempre aumentando.
El problema en sí es: No estás reiniciando los valores de 'mayprimof' ni 'mayprimoc'

Entonces cuando recorres por filas, el valor 'mayprimof' se va actualizando correctamente porque siempre va aumentando.
Sin embargo, al recorrer por columnas, cuando encuentra el 131, ese valor se queda para siempre. Por lo tanto está sumando el 131 tres veces (columnas 2, 3 y 4)


Y algunos consejos extra:
  • Parametriza los números sueltos que tienes por el programa:
Código
  1. const int NUM_FILAS = 5;
  2. const int NUM_COLS = 5;
  3.  
  4. int main() {
  5.  int matriz[NUM_FILAS][NUM_COLS];
  6.  //...
  7. }
Haciendo el programa así, si en cualquier momento quieres cambiar el tamaño de las matrices, sólo tendrás que cambiarlo arriba del todo y el resto del programa funcionará. En tu caso tienes que cambiarlo en todas las líneas en que has puesto 5 (y tendrás que tener cuidado de ver dónde son filas y dónde columnas)

  • Utiliza funciones auxiliares (y a ser posible optimizadas):
Código
  1. int isPrime(int num) {
  2.  // Asumimos que el numero es primo si es mayor que 1 (el 1 no se considera primo)
  3.  int prime = (num > 1);
  4.  // Dividir entre 1 o entre el propio num sabemos que va a dar resto 0 siempre. No hace falta hacerlo (empezamos en 2 y llegamos hasta num-1)
  5.  // Seguimos comprobando mientras siga siendo primo. En cuanto encontremos un divisor paramos
  6.  for(int i = 2; i < num && prime; i++) {
  7.    prime = (num % i != 0);
  8.  }
  9.  return prime;
  10. }
Usando funciones como esta para saber si un número es primo, el código principal te quedará más limpio (y más rápido).
Además puedes probar a pasar a tu algoritmo y a este el número 1234567890 y ver la diferencia de tiempo. Ya te adelanto que el tuyo va a dividir el número 1234567890 veces y este 1 vez.

  • En las últimas líneas, si tienes 2 líneas que estás repitiendo en todos los if(), ponlas una sola vez después del if(). Evita repetir código.
  • Además si primero comprueba si a>b y después si b>a; si ninguna se cumpla ya sabes que a==b. El último if() sobra también.
66  Programación / Programación C/C++ / Re: me ayudan a hacer que ande esto que usa vectores en: 12 Enero 2022, 18:30 pm
Ese código está muy muy verde y hay algunos errores conceptuales muy básicos como ya ha comentado otro usuario:
  • Te piden parar cuando el codigo introducido sea -1. Sin embargo, tú estás mezclando código (double) y nombre (double[] pero que debería ser string).
  • Tienes una variable 'par' que no usas. Además la comprobación de la línea 34 es incorrecta. Un número no es par cuando el cociente de dividirlo entre 2 sea 0, sino el resto.
  • Las variables codigo y stock... no pintan muy bien como double (aunque podría ser pero me parece muy raro que sea el caso). No creo que tengas 1.55555 productos con código 10.12345, no??

Lo suyo para tener un código más organizado sería usar un struct (o class ya que estamos en C++):
Código
  1. // Un 'Producto' se compone de los siguientes atributos
  2. struct Producto {
  3.  string nombre;
  4.  int codigo;
  5.  float precio;
  6.  int stockActual;
  7.  int stockMinimo
  8. };
  9.  
  10. // Te dicen que como mucho puede haber 100 productos:
  11. const int MAX_PRODUCTOS = 100;
  12.  
  13. // Y ahora ya empezamos el programa en si
  14. int main() {
  15.  Producto productos[MAX_PRODUCTOS]; // Array de productos para guardar cada uno de ellos
  16.  int numProductos = 0; // Variable para saber cuantos productos tenemos guardados
  17.  
  18.  // Ahora hay que pedir un codigo. Si es -1 no hacer nada y en caso contrario seguir pidiendo datos:
  19.  int codigo;
  20.  do {
  21.    cout << "Introduce un codigo: ";
  22.    cin >> codigo;
  23.  
  24.    if(codigo != -1) {
  25.      productos[numProductos].codigo = codigo;
  26.      // Aqui deberas seguir pidiendo datos y guardandolos en el elemento correspondiente del array
  27.      //...
  28.      // Al final tendras que aumentar el contador
  29.      ++numProductos;
  30.    }
  31.  } while(codigo != -1 && numProductos < MAX_PRODUCTOS); // Cuando alguna de las condiciones sea falsa, se dejaran de pedir productos
  32.  
  33.  // Y ahora ya puedes recorrer el array de productos y hacer los calculos que te pidan:
  34.  for(int i = 0; i < numProductos; ++i) {
  35.    //...
  36.  }
  37.  //...
  38. }

PD: Revisa las siguientes funciones:
Código
  1. cin.getline(char_array);
  2. getline(cin, string_var);
Seguro que te servirán...  :silbar: :silbar:
67  Programación / Programación C/C++ / Re: Duda con un programa en C en: 29 Diciembre 2021, 23:03 pm
Cierto, cierto.
No me di cuenta en ese momento porque estaba contestando todavía con una legaña en el ojo  ;D

Otro pequeño detalle a tener en cuenta es que un programa ejecutado "sin argumentos", realmente se está ejecutando con un argumento: el nombre del programa. Es decir, si se ejecuta un programa sin argumentos, argc vale 1.
Si no se quiere contar este argumento, se podría hacer algo así:
Código
  1. #define NUM_HIJOS (argc - 1) // IMPORTANTE: Usar parentesis

Aunque personalmente preferiría usar argc directamente en vez del define.
Por lo demás, tema zanjado.
68  Programación / Programación C/C++ / Re: Duda con un programa en C en: 28 Diciembre 2021, 08:21 am
Citar
Si intentas definir esa constante antes del main() tendrás problemas pues argc no existe en ese punto.
EDIT: Tenía mis dudas y tras probarlo, no da problemas (al menos en mi caso). Funciona correctamente.

Puedes usar directamente los parámetros de la función main():
  • argc -> Contiene el número de argumentos. Si no se pasa nada: argc = 1
  • argv -> Contiene los argumentos. Si no se pasa nada: argv[0] = <nombre_programa>

Prueba este código (con diferentes argumentos) para entenderlo mejor:
Código
  1. #include <stdio.h>
  2.  
  3. int main(int argc, char *argv[]) {
  4.  printf("Numero de argumentos: %d\n\n", argc);
  5.  
  6.  for(int i = 0; i < argc; ++i) {
  7.    printf("Argumento %d: %s\n", i, argv[i]);
  8.  }
  9. }
69  Programación / Programación C/C++ / Re: Ayuda codigo en: 20 Diciembre 2021, 20:35 pm
Al tener todos los arrays declarados por separado, tienes que hacer la suma de cada uno de ellos por separado (no puedes hacerlo todo en un bucle). La mejor forma para ello sería una función así:
Código
  1. int sumArray(int numbers[], int size) {
  2.  int sum = 0;
  3.  // Aqui haces la suma desde 0 hasta size-1
  4.  return sum;
  5. }

Y de esta manera tan solo tendrías que hacer:
Código
  1. const int NUM_ARRAYS = 4;
  2. const int ARRAY_SIZE = 5;
  3.  
  4. int main() {
  5.  int a[ARRAY_SIZE] = {...};
  6.  int b[ARRAY_SIZE] = {...};
  7.  //...
  8.  
  9.  int r[NUM_ARRAYS];
  10.  r[0] = sumArray(a, ARRAY_SIZE);
  11.  r[1] = sumArray(b, ARRAY_SIZE);
  12.  //...
  13. }

Otra posibilidad para poder hacerlo mediante un bucle sin importar la cantidad de arrays sería con una matriz (matriz = array de arrays)
Código
  1. const int NUM_ARRAYS = 4;
  2. const int ARRAY_SIZE = 5;
  3.  
  4. int main() {
  5.  int arrays[NUM_ARRAYS][ARRAY_SIZE] = {
  6.    {a0, a1, a2, a3, a4},
  7.    {b0, b1, b2, b3, b4},
  8.    {c0, c1, c2, c3, c4},
  9.    {d0, d1, d2, d3, d4}
  10.  };
  11.  
  12.  int sums[NUM_ARRAYS] = {0}; // Asi inicializas la primera posicion a 0 y el resto al valor por defecto (que es 0 tambien)
  13.  
  14.  for(int i = 0; i < NUM_ARRAYS; ++i) {
  15.    sums[i] = sumArray(arrays[i], ARRAY_SIZE);
  16.  }
  17. }
70  Programación / Programación C/C++ / Re: Línea de Código : duda en: 18 Diciembre 2021, 20:50 pm
Gracias totales !
Excelente explicación.
Sólo te presento aquí algunas Notas para que leas sobre ( y que me digas si no estoy en lo
correcto en los casos en que fuere ) tu Segundo Código, luego de la antepenúltima Línea :

Código
  1. // Como dije antes, aunque las variables globales se inicializan a 0 por defecto, es mejor especificarlo para facilitar su lectura
  2. // Normalmente una variable sin inicializar se entiende que se le va a dar un valor concreto mas adelante y que no importa el valor
  3. // que tenga en este momento
  4. int variableGlobal = 0;
  5. const int CONSTANTE_GLOBAL = 0;
  6.  
  7. void func() {
  8.  int variableLocalFunc = 0;
  9.  
  10.  cout << "Variable global: " << variableGlobal << endl; // Como se llama en el main() despues de modificar el valor de variableGlobal -> Mostrara 10
  11. //  cout << "Variable local main: " << variableLocalMain << endl; // ERROR: La variable local de main() no es accesible desde aqui
  12. }
  13.  
  14. int main() {
  15.  // Una variable local no se inicializa a 0 por defecto. Por lo tanto es necesario inicializarla explicitamente (dado el caso)
  16.  // Al igual que antes, se puede dejar sin inicializar si se le va a dar un valor mas adelante (estando seguros de que no se va a usar esta variable antes de darle un valor)
  17.  // Lo de inicializar siempre todas las variables al momento de declararlas ya depende de gustos
  18.  int variableLocalMain = 0;
  19.  
  20.  variableGlobal = 10;
  21.  cout << "Variable global: " << variableGlobal << endl; // Muestra: "Variable global: 10"
  22.  
  23. //  constanteGlobal = 10; // ERROR: Es una constante -> No se puede modificar  = = = = Debo anular la Línea, entiendo que es coherente hacerlo.
  24. //  cout << "Constante global: " << constanteGlobal << endl; // Muestra: "Constante global: 0" = = = No muestra nada : Sólo arroja ERROR al compilar ( ? )
  25.  
  26.  
  27.  // CIERRE DE PROGRAMA :
  28.  // A C L A R A C I Ó N
  29.  // Cerrando así, con " func(); ", CODE devuelve = " variableGlobal = 10 " pues tiene en cuenta tanto los Cuerpos ' int main( ) ' como ' void func( ) '
  30.                                                 // " variableGlobal = 10 "
  31.  // P  E  R  O
  32.  // Si cerrara con " return 0; " , CODE devuelve = " variableGlobal = 10 " pues tiene en cuenta sólo el Cuerpo ' int main( ) '
  33.  
  34.  func(); // X supuesto q para cerrar con " getch (); " se comportará como con " return 0; " pero habrá que ' dar Cabecera de #include <conio.h> '
  35. }
No, no es cierto eso que has agregado en el "Cierre del programa"...

En C/C++ las funciones devuelven únicamente lo que se especifique en el 'return'. No es como otros lenguajes que devuelven la última instrucción de la función.
La función main() es un caso especial: Es la única función que si no se especifica el return, el propio compilador agrega un 'return 0' automáticamente. Digamos que lo correcto sería especificar el return siempre al final del main() pero te encontrarás muchos casos en los que no se pone porque está implícito y solemos ahorrarnos (me incluyo) esa línea por comodidad sobre todo en programas simples.

PD: No utilices la función getch() de la librería <conio.h>. Como ya se ha mencionado por ahí: esta librería no es estándar y por lo tanto puede haber compiladores que fallen si la incluyes. En su lugar tienes la función getchar() que puedes usar con el mismo propósito pero con la ventaja de que esta pertenece a <stdio.h>.
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines