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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


  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 23 ... 102
71  Programación / Programación C/C++ / Re: Línea de Código : duda en: 16 Diciembre 2021, 22:27 pm
Entonces, pues, si me podrías explicar si haber definido a "  ' resultado ' como Local y no Global " - aunque funcione bien el Código - sería un error conceptual ..... o en todo caso:
..... ¿ En qué caso/s específico/s es obligatorio definir a una variable como Global ?
Realmente el error es el opuesto: definir la variable 'resultado' global cuando en este caso debería ser local.

  • Una variable local sólo es accesible desde dentro del ámbito (scope) en que se define.
  • Una variable global es accesible desde cualquier lugar del código.
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. // Como dije antes, aunque las variables globales se inicializan a 0 por defecto, es mejor especificarlo para facilitar su lectura
  5. // Normalmente una variable sin inicializar se entiende que se le va a dar un valor concreto mas adelante y que no importa el valor que tenga en este momento
  6. int variableGlobal = 0;
  7. const int CONSTANTE_GLOBAL = 0;
  8.  
  9. void func() {
  10.  int variableLocalFunc = 0;
  11.  
  12.  cout << "Variable global: " << variableGlobal << endl; // Como se llama en el main() despues de modificar el valor de variableGlobal -> Mostrara 10
  13.  cout << "Variable local main: " << variableLocalMain << endl; // ERROR: La variable local de main() no es accesible desde aqui
  14. }
  15.  
  16. int main() {
  17.  // Una variable local no se inicializa a 0 por defecto. Por lo tanto es necesario inicializarla explicitamente (dado el caso)
  18.  // 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)
  19.  // Lo de inicializar siempre todas las variables al momento de declararlas ya depende de gustos
  20.  int variableLocalMain = 0;
  21.  
  22.  variableGlobal = 10;
  23.  cout << "Variable global: " << variableGlobal << endl; // Muestra: "Variable global: 10"
  24.  
  25.  constanteGlobal = 10; // ERROR: Es una constante -> No se puede modificar
  26.  cout << "Constante global: " << constanteGlobal << endl; // Muestra: "Constante global: 0"
  27.  
  28.  func();
  29. }

La norma general es:
  • No definir variables globales prácticamente nunca (si estás empezando quédate con que nunca debes definir una variable global). Las variables globales son accesibles desde cualquier parte del programa. Imagina un programa con 200 archivos diferentes y con variables globales, ¿cuántas posibilidades hay de que alguna variable tenga el mismo nombre? ¿Qué pasa si estás usando una variable global en un fichero pero está siendo modificada desde otro fichero? Problemas.
  • Las constantes globales sí están permitidas. En programas muy grandes hay que tener cuidado con declarar cosas globales pero en programas pequeños puedes declarar las constantes que necesites globales por tenerlas todas al principio del fichero y tener así el cuerpo de las funciones más reducido.
  • Si las variables locales sólo son accesibles desde la función en que se crean, ¿cómo puedo acceder a una variable definida en una función desde otra? Te presento: los parámetros (gran invento). Las utilidades de los parámetros es que permite digamos "enviar" variables de una función a otra. Además por defecto estas variables se pasan por valor (se envía una copia) y no por referencia (se envía la original) por lo que si se modifican dentro de la función que las recibe, no afectará a la función que las envió.
  • Si las variables pasadas como parámetro no se ven afectadas fuera de la función, ¿cómo puedo hacer cambios en una variable y que estos se mantengan fuera? Te presento: el valor de retorno (otro gran invento) [o el paso por referencia, pero este es más avanzado, no deberías usarlo si no es estrictamente necesario y si estás empezando no creo que lo sea]
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. // Funcion que modifica el parametro pero este no se ve modificado fuera
  5. void incrementVoid(int num) {
  6.  num++;
  7.  cout << "Incremento void: " << num << endl;
  8. }
  9.  
  10. // Funcion que modifica el parametro y lo devuelve para que sea asignado fuera y asi mantener su nuevo valor
  11. int incrementReturn(int num) {
  12.  num++;
  13.  cout << "Incremento return: " << num << endl;
  14.  return num;
  15. }
  16.  
  17. // Funcion que modifica el parametro pasado por referencia -> Modifica el actual entonces no hace falta devolverlo
  18. void incrementReference(int &num) {
  19.  num++;
  20.  cout << "Incremento referencia: " << num << endl;
  21. }
  22.  
  23. int main() {
  24.  int num = 1;
  25.  
  26.  incrementVoid(num); // Mostrara: "Incremento void: 2"
  27.  cout << "Valor num en main: " << num << endl; // Mostrara: "Valor num en main: 1" (no se ha visto modificado)
  28.  
  29.  num = incrementReturn(num); // Mostrara: "Incremento return: 2"
  30.  cout << "Valor num en main: " << num << endl; // Mostrara: "Valor num en main: 2" (en la linea anterior le hemos asignado el valor devuelto por incrementReturn())
  31.  
  32.  incrementReference(num); // Mostrara: "Incremento referencia: 3" (En la linea anterior num ya valia 2 y la funcion le ha vuelto a incrementar 1)
  33.  cout << "Variable num en main: " << num << endl; // Mostrara: "Valor num en main: 3" (la funcion incrementReference() ha modificado la variable num original por lo que el cambio se mantiene)
  34. }

Como ya he dicho, y repito, no debes usar parámetros por referencia de momento. Seguro que lo que estés pensando puedes hacerlo igual con un return.
72  Programación / Programación C/C++ / Re: Línea de Código : duda en: 15 Diciembre 2021, 20:30 pm
No entiendo muy bien lo que estás preguntando pero básicamente para entender esa línea tienes que tener claras las siguientes premisas:
  • resultado es de tipo int
  • arreglo es de tipo int[] por lo que arreglo[a] es de tipo int
  • int + int = int
  • El operador = tiene menos preferencia que el operador + por lo que primero se realiza la suma y después la asignación

Y ahora entrando más concretamente en tu código:
  • Como resultado es una variable global y no se ha inicializado, vale 0 (como explica Eternal Idol) -> Con variables locales esto no se cumple -> Es obligatorio inicializarlas (y las globales por claridad también se recomienda inicializarlas explícitamente)
  • Ahora te pongo unos valores de ejemplo para 'arreglo' y vemos lo que está pasando:
Código:
resultado = 0
arreglo = {1, 2, 3, 4}

Iteracion 0 -> resultado = resultado + arreglo[0] -> resultado = 0 + 1 -> resultado = 1
Iteracion 1 -> resultado = resultado + arreglo[1] -> resultado = 1 + 2 -> resultado = 3
Iteracion 2 -> resultado = resultado + arreglo[2] -> resultado = 3 + 3 -> resultado = 6
Iteracion 3 -> resultado = resultado + arreglo[3] -> resultado = 6 + 4 -> resultado = 10
73  Programación / Java / Re: JComboBox aleatorio en java en: 9 Diciembre 2021, 20:16 pm
La idea principal es simple: genera un número aleatorio en el rango [0, JComboBox.getItemCount() - 1] usando la clase Random.

Ahora depende de lo que quieras exactamente (siendo x el número aleatorio generado):
  • Si lo que quieres es obtener el elemento x del comboBox: Utiliza el método JComboBox.getItemAt()
  • Si lo que quieres es dejar seleccionado el elemento x en el comboBox: Utiliza el método JComboBox.setSelectedIndex()
74  Programación / Programación C/C++ / Re: [C++] Matriz resultante bien calculada pero mal presentada en: 8 Diciembre 2021, 13:20 pm
La matriz no se muestra correctamente porque eso no es automático, tienes que hacerlo tú.

En el último for() estás mostrando todos los valores en una línea seguido de un espacio entre cada elemento.
Si quieres que se muestre como una matriz, tienes que agregar un salto de línea después de mostrar cada fila.

Sobre la otra pregunta. Imagina las matrices:
Código:
A = | 1  2 |          B = | 5  6 |
    | 3  4 |              | 7  8 |
Si hacemos C = A * B, el resultado es:
Código:
C = | (1 * 5 + 2 * 7)    (1 * 6 + 2 * 8) |
    | (3 * 5 + 4 * 7)    (3 * 6 + 4 * 8) |
Cada vez que avanzamos una columna de la matriz A (1 -> 2 | 3 -> 4) también avanzamos una fila de la matriz B (5 -> 7 | 6 -> 8)
Al avanzar ambas a la vez, sólo se utiliza un for(). Como ca == fb, da igual hacer el for() usando ca o fb como condición. Si te fijas la K se utiliza tanto en A como en B pero en A hace variar las columnas y en B hace variar las filas.

Si se usase otro for() dentro para B, entonces estarías haciendo combinatoria (todos con todos) porque no avanzarías filas (de B) y columnas (de A) a la vez:
Código:
(1 * 5 + 1 * 7 + 2 * 5 + 2 * 7)    (1 * 6 + 1 * 8 + 2 * 6 + 2 * 8)
(3 * 5 + 3 * 7 + 4 * 5 + 4 * 7)    (3 * 6 + 3 * 8 + 4 * 6 + 4 * 8)
75  Programación / Programación C/C++ / Re: [C++] Problemas para implementar historial y pago en: 8 Diciembre 2021, 12:58 pm
Tengo estos codigos pero me falta que se cambie el monto que se tiene por alguna manera no me deja colocar 23,250 que es lo que se desea
tambien me falta como tal el historial y el pago de servicio :,(

No veo el problema en colocar la cantidad inicial:
Código
  1. float saldoActual = 23250; // con float tienes suficiente. No necesitas usar double, pero funcionaria igual

Te falta hacer el menú en sí. Para ello lo mejor es utilizar un switch:
(Y guardar el resultado en un int. No necesitas usar un string para esto)
Código
  1. int opcion;
  2. cout << "***** MENU DE EJEMPLO *****" << endl
  3.     << "\t1. Opcion 1 del menu de prueba" << endl
  4.     << "\t2. Opcion 2 del menu de prueba" << endl
  5.     << "\t..." << endl
  6.     << "Opcion: ";
  7. cin >> opcion;
  8.  
  9. switch(opcion) {
  10.    case 1:
  11.        // hacer lo que sea
  12.        break;
  13.  
  14.    case 2:
  15.        // hacer lo que sea
  16.        break;
  17.  
  18.    default:
  19.        // la opcion elegida no es una de las controladas antes
  20.        break; // este break es opcional
  21. }

La parte del historial tampoco tiene nada del otro mundo. Sin embargo, creo que no está bien pues hay una opción de "Historial" y otra de "Saldo" y al elegir la opción de "Historial" lo que quieres mostrar es el saldo. Yo diría que la opción "Saldo" muestra el saldo actual y la opción "Historial" muestra todos los movimientos (ingresos y pagos) que se han hecho.
De todas formas, limitándome al enunciado:
Si se elige la opción "Historial" haces un 'cout' y muestras el saldoActual.
Si se elige la opción "Pago" haces prácticamente lo mismo que para retirar dinero pero pidiendo otro mensaje como concepto del pago.
76  Programación / Programación C/C++ / Re: Comportamiento desigual mismo código C en Linux-Ubuntu y Windows-MinGW en: 7 Diciembre 2021, 20:26 pm
He probado a ejecutar tu código y tus mismos ejemplos en Windows (tanto desde CMD como Powershell) y... Funciona correctamente.

De todas formas, yo diría que el problema puede andar por las líneas 29 y 30. Utiliza:
Código
  1. estado_nodo = (char*)malloc(num_nodos * sizeof(char));
  2. camino = (int*)malloc(num_nodos * sizeof(int));

Si eso no soluciona tu problema, muestra mensajes por pantalla entre las líneas de los cálculos para ver hasta qué línea se ejecuta exactamente.

Además de esto, otra cosa aparte: Cuando definas una macro compleja con #define, usa siempre paréntesis.
Código
  1. #define A 2 * 2
  2. #define B (2 * 2)
  3.  
  4. int a = 16 / A; // a = 16 / 2 * 2 = 16
  5. int b = 16 / B; // b = 16 / (2 * 2) = 4
77  Programación / Programación C/C++ / Re: Comportamiento desigual mismo código C en Linux-Ubuntu y Windows-MinGW en: 7 Diciembre 2021, 18:18 pm
Como dice @Eternal Idol, no debería haber ninguna diferencia.
Sólo decir que en el código anterior faltan unas comillas dobles antes del % pero supongo que ha sido un error al escribir el mensaje pues sino no compilaría el programa.

Qué más haces con esa variable?
Pega un par de ejecuciones donde se vea funcionando bien y fallando para poder echarle un ojo... :rolleyes:
78  Programación / Programación C/C++ / Re: Dudas Procedimientos y Funciones en C++ en: 5 Diciembre 2021, 18:35 pm
Para obtener las diferentes cifras de un número tan solo necesitas usar los operadores de disivión (/) y de módulo (%) junto con tu mayor aliado: el número 10.

Si quieres más ayuda, expón tu código pues no se hacen tareas.
79  Programación / Programación C/C++ / Re: Duda en una Línea de Codigo en: 5 Diciembre 2021, 18:34 pm
Gracias. Deduzco entonces que IOSTREAM incluye a LOCATIONS, pues me sucedió lo mismo que con CCTYPE en lo referente a ALGORITHM
No se debe suponer que una cabecera incluirá otras pues esto depende de cada implementación, de cada compilador.
Lo que a ti te funciona sin declarar una cabecera, a otra persona le puede fallar. Lo mejor es que si sabes que necesitas usar una cabecera, la declares explícitamente.
80  Programación / Programación C/C++ / Re: Buenas, necesito ayuda URGENTE!! en un ejercicio, y es que siempre me da Violacion de segmento en: 3 Diciembre 2021, 19:24 pm
Lee los errores que te aparecen pues te dicen bien claro cuáles son los problemas.
No hay mayor virtud para un programador que entender los errores que lanza el compilador.

Pasar a C no es lo mismo que copiar y pegar mi pseudocódigo. Tal y como dicen los errores, hay variables sin declarar, funciones que no existen (porque no existen) y conflictos en la definición de la función.
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines