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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Mensajes
Páginas: 1 ... 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 80 ... 102
641  Programación / Programación C/C++ / Re: Operador de seleccion -> en variable no puntero.. en: 13 Mayo 2019, 04:57 am
Por qué dices que no es un puntero? Normalmente la función miembro <getInstance()> suele ser una función de las clases singleton (clases que solo pueden tener una instancia) y estas clases suelen tener un puntero a un objeto de esa clase.
Código
  1. class SingletonExample{
  2.    private:
  3.        static SingletonExample* instance = NULL;
  4.        SingletonExample(){}
  5.    public:
  6.        static SingletonExample getInstance(){
  7.            if (instance == NULL)
  8.                instance = new SingletonExample;
  9.            return *instance;
  10.        }
  11. }
Te dejo el enlace de donde he sacado este fragmento de código: https://stackoverflow.com/questions/12707542/what-exactly-does-getinstance-do-in-a-singleton

Y como bien acabas de decir. La palabra reservada <auto> crea la variable del mismo tipo que le estás asignando.
642  Programación / Programación C/C++ / Re: Ayuda con el uso varias funciones en: 12 Mayo 2019, 21:46 pm
Ahora para dejar ya el tema zanjado por el momento, una tontería más que olvidé:
Citar
cout << "La suma de los numeros abundantes entre " << valor1 << " y " << valor2 << " es " << abund;
Cuidado con lo que se dice y lo que se quiere decir. Lo que tú vas a mostrar es la cantidad de números abundantes en (valor1, valor2) que tampoco es lo mismo que la cantidad que hay en [valor1, valor2) (cerrado-abierto) ni (valor1, valor2] (abierto-cerrado) ni [valor1, valor2] (cerrado-cerrado). No la suma de los números abundantes que eso se calcularía sustituyendo <abund++> por <abund += x>. No sé si ves la diferencia pero digamos que es importante saber lo que se está calculando en cada momento.
643  Programación / Programación C/C++ / Re: Ayuda con el uso varias funciones en: 12 Mayo 2019, 21:31 pm
El problema no es ese, ya verás ahora que te vas a dar cuenta.
Los números abundantes los contabilizas en <abund> pero... ¿cuánto empieza valiendo <abund>?
644  Programación / Programación C/C++ / Re: Ayuda con el uso varias funciones en: 12 Mayo 2019, 20:29 pm
Bien, veamos, parece que tienes otro problema con las funciones, los parámetros.
Cuando a una función le pasamos parámetros es porque necesitamos variables que dependen de cada ejecución. Por ejemplo si queremos si un número es perfecto/abundante/defectivo pues debemos pasarle el número no? Lógico.
Para poder usar estas variables dentro de la función debemos darle un nombre. En el prototipo no es necesario, podemos dejarlo en <int Perfecto(int)> porque el prototipo solo necesita saber de qué tipo es cada parámetro y el valor que retorna. Pero en la implementación sí debemos poner un nombre por ejemplo <int Perfecto(int num)>.
Luego tenemos las variables locales a una función. Por ejemplo si necesitamos una variable como parece que ahora es <sum_div> que la vamos a usar dentro de la función para hacer cálculos pero fuera de esa función no tiene utilidad, la podemos crear de forma local en la función. Y quedaría algo así:
Código
  1. // cabeceras
  2. int Perfecto(int);
  3.  
  4. // main
  5.  
  6. int Perfecto(int num){
  7.    int sum_div = 0; // num no lo declaramos aqui porque lo estamos pasando como parametro
  8.    for(int i = 1; i < num; ++i) // desde el 1 hasta num-1
  9.        if(num % i == 0) // si num es divisible por i
  10.            sum_div += i; // sum_div = sum_div + i   acumulamos la i
  11.    if(sum_div > num) // si se cumple esto, num es abundante (me fio de tu definicion de abundante, no he comprobado que sea asi)
  12.        return 1; // devolvemos 1 y la funcion termina
  13.    if(sum_div < num) // si se cumple esto, num es defectivo
  14.        return -1; // devolvemos -1 y la funcion termina
  15.    return 0; // si num no es abundante ni defectivo, entonces tiene que ser perfecto, no queda otra. Devolvemos 0 y termina la funcion
  16. }
Por pasos:
No sé la utilidad del <while()> supongo que es por si te preguntan por el 0, pero no funciona así. Piensa que un <while()> se ejecuta mientras se cumpla la condición por lo tanto si esa función recibe un número distinto a 0 NUNCA saldría del <while()>. En programación es importante diferenciar entre <while()> e <if()> ya que representan cosas distintas.
Como ves ya hemos reducido los parámetros a 1 porque <sum_div> la creamos dentro de la función ya que fuera no tiene utilidad y no varía su valor inicial, siempre la inicializaremos en 0.
También he quitado los <cout> por lo que te decía. Mejor que la función nos responda lo que queremos saber y ya veremos nosotros cómo usamos esa información. Imagina que el que creó la función suma, lo implementó de está forma:
Código
  1. int suma(int a, int b){
  2.    int suma = a + b;
  3.    cout << "La suma de " << a << " + " << b << " = " << suma << endl;
  4.    return suma;
  5. }
Entonces cada vez que alguien hiciera <suma(a, b)> le saldría esa línea por pantalla. No siempre queremos mostrar el resultado de una suma ya que muchas veces son cálculos parciales, no la solución. Entonces se implementa la suma como:
Código
  1. int suma(int a, int b){
  2.    return a+b;
  3. }
  4.  
  5. // Y si en alguna ocasion queremos ver el resultado pues hacemos
  6. cout << "La suma de " << a << " + " << b << " = " << suma(a,b) << endl; // pero esto ya en el main o en otra funcion
Y por último, el <return> es como el final de la función. Si se ejecuta un <return> ya no se van a ejecutar las líneas que sigan porque un <return> "retorna" el control a la función que llama a la que acaba de terminar.

Espero no haberme dejado nada. Si tienes más dudas sobre funciones, ya sabes que puedes preguntar y siempre puedes probar a hacer funciones hasta que las manejes perfectamente. Suerte :-X
645  Programación / Programación C/C++ / Re: problema con la sentencia if en: 12 Mayo 2019, 16:36 pm
El problema no es que se salte la condición sino que no te deja introducir el valor de <sexo>. Esto es porque al introducir la edad, introduces un número y pulsas Enter entonces en el buffer de entrada se guarda (imaginemos que introduces 20) <20 Enter>. Luego el programa busca en el buffer de entrada el valor de edad y encuentra un 20, por lo que el programa hace <edad = 20> y en el buffer queda <Enter>. Después el programa te pregunta el sexo y como el buffer no está vacío recoge el Enter y hace <sexo = Enter> (entíendase la asigación).

Para solucionar esto debes limpiar el buffer de entrada. Normalmente te recomendarán que hagas <fflush(stdin)> para limpiarlo. Sin embargo, <fflush()> es una función que se diseñó para limpiar el buffer de salida (<fflush(stdout)>) y aunque parece que funciona para el de entrada, siempre se recomienda no usarlo ya que no está definido formalmente su comportamiento para <stdin> (en los manuales oficiales de C se expone que el comportamiento es "indeterminado")

Tienes algunas alternativas como pueden ser:
Código
  1. getchar(); // alternativa 1: coge un caracter del buffer
  2. fgetc(stdin); // alternativa 2: mas de lo mismo
  3. // Para cuando puedes tener mas de un Enter tienes una alternativa 3: en bucle

Te dejo aquí un enlace a un tema que se abrió hace un tiempo tratando de buscar alternativas a <fflush(stdin)>:
https://foro.elhacker.net/programacion_cc/iquestqueda_algo_en_el_buffer_de_entrada_stdin_solucionado-t489993.0.html
Te recomiendo que uses algunas de estas para evitar ese <fflush(stdin)> que tanto daño hace. En el fondo mejor será conocer y aplicar buenas prácticas de programación.
646  Programación / Programación C/C++ / Re: Pequeña duda con metodo find. en: 12 Mayo 2019, 07:50 am
Exacto así es.
En cambio si el primer "Es" estuviera escrito en minúsculas también, encontraría ese y después empezaría a buscar desde la "s" del primer "es" y encontraría también el segundo.
647  Programación / Programación C/C++ / Re: Ayuda con el uso varias funciones en: 12 Mayo 2019, 01:55 am
Muy bien, vamos por partes. El problema que tienes es el siguiente: tienes una función para saber si un número es perfecto, abundante o defectivo y luego tienes que usar esa misma función para identificar los números abundantes dentro de un rango.
La solución es muy simple y lo vas a ver enseguida. Tu función <Perfecto()> devuelve un <int> pero en la función le haces un <return 0> por lo que siempre devuelve 0. Eso no tiene mucha utilidad. Además acabo de ver que esa función <Perfecto()> hace demasiadas cosas. A ver qué te parece mi propuesta:
Creas una función que sea <int Perfecto(int a)> que devuelve 0 si el a es perfecto, 1 si es abundante y -1 si es defectivo. Quitando todos los <cout> de la función y el bucle.
Entonces en el <main> es algo tan simple como esto:
Código
  1. for(int i = extremo_inferior; i <= extremo_superior; ++i) // la condicion con < o <= es decision tuya
  2.    if(Perfecto(i) == 1)
  3.        cout << "El numero " << i << " es abundate" << endl;
  4.    else if(Perfecto(i) == 0)
  5.        cout << "El numero " << i << " es perfecto" << endl;
  6.    else // si no es 1 ni 0 no hace falta otra condicion, tiene que ser -1
  7.        cout << "El numero " << i << " es defectivo" << endl;
Y esto lo puedes usar para calcular tanto los que son abundantes como los perfectos como los defectivos; solo tienes que modificar la condición con {-1, 0, 1}.
En casos que la "respuesta" de una función sea "sí/no" puedes retornar un <bool> y la idea es la misma. Usa los retornos de las funciones de forma que aporten información, para no aportar nada mejor usar una función de tipo <void>.
Además te recomiendo no usar variables globales a no ser que sean constantes globales en algunos casos.
De eso se trata una función es como encapsular una funcionalidad que luego puedas usar más veces. Creas una función que calcule algo de un número (normalmente evitando <cout>) y luego cada vez que la quieras usar la puedes acoplar a un <cout>, a un bucle, a una condición, etc.

Respecto al tema de <conio.h>, ciertamente es una librería no estándar por lo que todos los compiladores no pueden usarla por defectos y entonces puede dar errores según con que compilador lo compiles. El uso más frecuente de esa librería es <getch()> para hacer una pausa y es una mejora a utilizar <system("pause")> que usa más recursos del sistema para una tarea tan tonta, pero se puede mejorar más.
La solución es usar <cin.get()> (en <iostream> de C++) o <getchar()> (en <stdio.h> en C). Ambas hacen lo mismo y evitas usar librerías no estándar además de que son funciones que vienen en la librería más común de cada lenguaje, tanto de C como de C++.
648  Programación / Programación C/C++ / Re: Problema con la ejecución de un programa en dev c++ en: 11 Mayo 2019, 23:05 pm
Adjunta el código para poder ayudarte mejor.

EDITO: Claramente hay un error en tu código, pero el compilador lo advierte como un Warning por eso que sí compila. A la función <scanf()> le tienes que pasar la dirección de memoria de la variable, no su nombre.
Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main(){
  4.    int n1=0,n2=0,suma=0; // no es necesario inicializarlas
  5.    printf("ingrese un numero: ");
  6.    scanf("%d", &n1); // te faltaba el &
  7.    printf("ingrese otro numero: ");
  8.    scanf("%d", &n2); // el & otra vez
  9.    suma=n1+n2;
  10.    printf("la suma es %d",suma);
  11.    system("pause"); // mejor getchar();
  12.    return 0;
  13. }
Además de eso te recomiendo sustituir <system("pause")> por <getchar()>, el fin es el mismo y evitas una llamada al sistema que requiere más recursos que la alternativa que te he comentado, además que así no necesitas usar la librería <stdlib.h>
649  Foros Generales / Foro Libre / Re: ternas en programacion en c, me dice este problema en: 11 Mayo 2019, 20:01 pm
Si conoces tanto la secuencia como el valor d, necesitas tres bucles cada uno para ir avanzando por el array a un ritmo distinto e ir comprobando que la distancia entre los elementos a los que apunta cada índice de cada bucle es igual a d.
Te dejo que lo intentes programar y si tienes más dudas pon tus avances para ayudarte.

PD: Para la próxima pon tus códigos entre etiquetas de código GeSHi y hay un subforo de C/C++ por lo que puede que muevan este tema.
PD 2: Las funciones que no retornan nada (void) no necesitan llevar un <return> al final.
650  Programación / Programación General / Re: ¿Lenguaje binario? ¿Qué es lo que en realidad debo saber? en: 10 Mayo 2019, 15:21 pm
¿Cuál es el siguiente paso que debo de dar para seguir entendiendo como funcionan las computadoras, los lenguajes y cómo esta recibe y cumple órdenes?
Si como has dicho te interesa aprender cómo funcionan las computadoras internamente te recomendaría algunas cosillas como:
  • Arquitectura de computadores: verás diferencias de los sistemas de 32/64 bits. La famosa arquitectura de Von Neumann (no estoy seguro de si se escribe así :xD), y algo muy importante, LA MEMORIA. Es fundamental saber cómo se cargan los programas en memoria, como se calculan direcciones de memoria (tipos de direccionamiento), etc.
  • Ensamblador: me parece fundamental también saber algo de ensamblador. No hace falta que te aprendas todas las instrucciones y tal pero está bien conocer el punto intermedio entre nuestros programas en C/C++ por ejemplo y los 0 y 1 que usa la computadora. Se podría meter dentro de la arquitectura pero creo que se merece un punto a parte. Destacar la importancia de conocer cómo funciona la memoria aquí (registros).
  • Sistemas operativos: los sistemas que han existido y existen. Los avances que han ido produciendo, las diferencias entre el modo kernel y el modo usuario (interesante esto úlimo aunque sea de un vistazo)
  • Lenguajes de programación: aquí tienes una inmensa variedad para elegir, desde robustos C/C++/Java hasta modernos y sencillos Python/Ruby. Yo te recomendaría C/C++ primero porque fueron mis inicios y siguen siendo mis favoritos a día de hoy pero sobre todo porque trabajan un poco a más bajo nivel que Python por ejemplo. En C/C++ puedes trabajar más directamente con la memoria lo que te ayudará de forma práctica a entender toda la teoría que te habrás leído y releído de lo comentado más arriba.

Creo que poco más que decir. Yo después de mis años de carrera en Ingeniería Informática te diría que esos son los fundamentos y lo que se me viene a la mente cuando pienso en el funcionamiento de los computadores.
Suerte con tus proyectos :-X
Páginas: 1 ... 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 80 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines