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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Mensajes
Páginas: 1 ... 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 [52] 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 ... 102
511  Programación / Programación C/C++ / Re: Operadores incremento/decremento en prefijo y postfijo. en: 3 Octubre 2019, 21:37 pm
aqui hay un tema que se explicó con un poco de detalle el asunto relacionado a los incrementos/decrementos post/pre, esto es un problema comun a descubrir cuando se está aprendiendo

https://foro.elhacker.net/buscador-t483138.0.html

no es un asunto de java vs c++ es un asunto de nivel mas bajo...
Gracias por el enlace. No sabía nada de los sequence points. Lo de Java vs C++ lo decía porque aun suponiendo que cada lenguaje funciona con sus normas, pensaba que seguirían un mismo estándar de orden de procesamiento. Pero como explico más adelante parece que cada uno usa un orden diferente.

tienes garantizado que primero se evaluará lo de la derecha (previousIndex--) y obtendrás resultados consistentes. Aún así, yo recomendaría que hagas el decremento en su propia línea, tanto porque así tu programa funcionará en cualquier versión de C++, como porque es menos ambiguo para el programador; no todos están familiarizados con C++17, y aunque lo estemos, se nos pueden olvidar las reglas de evaluación.
Ya he visto que es mejor separar los incrementos/decrementos en líneas diferentes pero quiero terminar de entenderlos. He realizado otra prueba con:
Código
  1. int numeros[5] = {1,2,3,4,5};
  2. int j = 2;
  3. numeros[j+1] = -numeros[j--];
Y el resultado es: numeros = {1,2,-3, 4,5}. Por lo que saco que primero se obtiene el valor almacenado en <numeros[j]>, luego se decrementa <j> y después se calcula la posición de memoria del valor <numeros[j+1]>. Como el índice <j> se decrementa antes de calcular la posición de memoria pues la posición vuelve a ser la misma al sumarle 1 al índice. (Todo esto compilado con -std=c++17)

Sin embargo, en Java si probamos a hacer lo mismo:
Código
  1. int numeros[] = {1,2,3,4,5};
  2. int j = 2;
  3. numeros[j+1] = -numeros[j--];
El resultado es: numeros = {1,2,3,-3,5}. Por lo que aquí parece que antes de realizar el decremento ya tiene la posición de memoria donde lo va a guardar calculada y por eso el decremento no se junta con el +1 llegando de nuevo a la misma posición como ocurre en C++.

Estoy estudiando la precedencia de los operadores y por eso me ha sorprendido que el resultado fuera diferente teniendo en cuenta que los incrementos/decrementos tienen más preferencia que las asignaciones.
También he visto en algunos sitios que los operadores en postfijo tienen más preferencia que en prefijo... pero en otros sitios aparece como que tienen la misma prioridad. No sé si esto depende también del estándar.
Y la última pregunta es: en una sentencia con postincremento, el incremento se produce cuando ya se ha terminado de ejecutar la sentencia (línea completa) o justo después de usar el valor sin incrementar?
512  Programación / Programación C/C++ / Operadores incremento/decremento en prefijo y postfijo. en: 2 Octubre 2019, 14:46 pm
Ya sé que este suele ser un tema básico pero me he encontrado con un resultado inesperado en el funcionamiento de estos operadores.
Mi problema es que estaba implementando un algoritmo de ordenamiento por inserción tanto en C++ como en Java; sin embargo, el resultado obtenido en C++ no era el que esperaba por eso pongo la duda en este foro.
Aquí el código en Java:
Código
  1. public static void insertionSort(int[] numbers){
  2.    for(int i = 1; i < numbers.length; ++i){
  3.        int currentValue = numbers[i];
  4.        int previousIndex = i-1;
  5.        while(previousIndex >= 0 && currentValue < numbers[previousIndex])
  6.            numbers[previousIndex+1] = numbers[previousIndex--];
  7.        numbers[previousIndex+1] = currentValue;
  8.        showArray(numbers);
  9.    }
  10. }

Y aquí el código en C++:
Código
  1. void insertionSort(int *numbers, const int size){
  2.    for(size_t i = 1; i < size; ++i){
  3.        int currentValue = numbers[i];
  4.        int previousIndex = i-1;
  5.        while(previousIndex >= 0 && currentValue < numbers[previousIndex])
  6.            numbers[previousIndex+1] = numbers[previousIndex--];
  7.        numbers[previousIndex+1] = currentValue;
  8.        showArray(numbers, size);
  9.    }
  10. }
Como se puede ver, códigos idénticos. El problema está en la línea 6 del código en C++. He visto que había valores que se repetían y después de un rato investigando he visto que si en C++ se cambia la línea 6 por:
Código
  1. numbers[previousIndex+2] = numbers[previousIndex--];
Entonces sí funciona. Y si se cambia el bucle <while> por:
Código
  1. while(previousIndex >= 0 && currentValue < numbers[previousIndex]){
  2.    numbers[previousIndex+1] = numbers[previousIndex];
  3.    --previousIndex;
  4. }
También funciona correctamente. Entonces el problema sé que está en el orden en que se realiza el decremento. Me gustaría sabes cómo funciona eso en profundidad ya que veo que no funciona igual en Java que en C++.

PD: Agradecería también una explicación del funcionamiento en Java para ver cuáles son las diferencias exactamente. O si es mejor que abra otro tema en el foro de Java para esta parte me lo podéis decir también. :-X :-X
513  Programación / Programación C/C++ / Re: Contar cuantas veces se repite cada vocal en una frase que ingresa el usuario en: 2 Octubre 2019, 12:21 pm
Eso no funciona primero porque en la función <scanf()> estás usando %d que es para variables de tipo entero (int) y además estás intentando guardar en la posición 30 del array <frase>. Esa posición no es accesible ya que si el tamaño es 30, las posiciones van de 0 a 29.
Para guardar cadenas es mejor que uses la función <fgets()>.
Código
  1. #include <stdio.h>
  2.  
  3. #define MAX_SIZE 30 // constante para determinar la longitud maxima de la cadena
  4.  
  5. int main(){
  6.    char frase[MAX_SIZE];
  7.  
  8.    printf("Introduce una frase: ");
  9.    fgets(frase, MAX_SIZE, stdin);
  10.  
  11.    // el resto del programa
  12.  
  13.    getchar();
  14.    return 0;
  15. }
El resto del programa está bien pero como recomendaciones te diría que no uses la librería <conio.h> (que sirve para la función <getch()>) porque no es estándar. Usa mejor la función <getchar()> que pertenece a la librería <stdio.h> y así sólo necesitas esa librería.

Y en el <switch> puedes hacer que cuente también las mayúsculas:
Código
  1. for(size_t i = 0; i < MAX_SIZE; ++i){
  2.    switch(frase[i]){
  3.        case 'a': case 'A': ++vocal_a; break;
  4.        case 'e': case 'E': ++vocal_e; break;
  5.        //...
  6.    }
  7. }
514  Programación / Programación C/C++ / Re: AYUDA LISTA SIMPLE IMPRECION DE DATOS en: 1 Octubre 2019, 01:39 am
esto lo ise a proposito por que me daba error si lo ponia correctamente
Código:
 Estudiante( char* cod, string nom,float pode ){
            cod=codigo; // esta al reves
            nom =nombre; // esta al reves
            pode = poderado; // esta al reves
            siguiente = NULL;
        }
al parecer era por la cantidad de datos que puse [5]
Código:
char codigo[5];
lo quite  [5]y me codigo se ejecuto correctamente
la pregunta como hago para yo elegir la cantidad de datos de cada archivo o debo usar
solamente uso el tipo de dato correcto al fina solo trato de hacer esto
-> https://drive.google.com/open?id=1LD0zBfxs1FsDMGSTp1th0zlob7P6HxkR
Lo siento pero sigues sin ser específico. Igual soy yo pero sigo sin entender tu duda... pusiste [5], dónde?? :huh: :huh:
Citar
como hago para yo elegir la cantidad de datos de cada archivo
Te refieres al largo de la variable <cod> y <codigo>?? Eso tienes que controlarlo con otra variable. Cuando pasas a esa función el parámetro <cod>, estás pasando la dirección de memoria en la que empieza el código <cod> pero para saber cuándo acaba o cómo de largo es, debes pasar otro parámetro que sea el largo.
Si te da igual lo largo que sea <cod> porque en <codigo> vas a copiar sus X primeros caracteres podrías hacer algo como (de paso te pongo cómo hacer estas cosas sin andar cambiando nombres usando la partícula <this>):
Código
  1. Estudiante(char *codigo, string nombre, float poderado){
  2.    this->nombre = nombre; // this->nombre es el del objeto y nombre solo es el parametro
  3.    this->poderado = poderado;
  4.    this->siguiente = NULL; // se puede omitir pero poniendolo se ve mejor que es un atributo del objeto
  5.    strncpy(this->codigo, codigo, X); // asi copias en this->codigo los X primeros caracteres de codigo
  6. }
Si una vez más no he acertado con la interpretación pues bueno, una explicación que te llevas de regalo... :rolleyes: :-X
515  Programación / Programación C/C++ / Re: AYUDA LISTA SIMPLE IMPRECION DE DATOS en: 30 Septiembre 2019, 15:38 pm
si se eso que esta al reves es que no me lo aceptaba me parecio raro probe quitando la cantidad de datos que quiero "[4]" y me permitio hacerlo como es correctamente pero como hago cunado me piden una cantidad fija de datos ?
No sé a que te refieres con eso último. Si tienes un constructor con 3 parámetros, cuando crees un objeto, debes hacerlo con 3 parámetros. Si a lo que te refieres es a poder crear objetos pasando 3 parámetros o pasando otro número de parámetros lo que debes hacer es sobrecargar el constructor con otro número de parámetros.
Si no te refieres a eso, intenta explicármelo otra vez de otra forma para que pueda ayudarte. Podrías ponerme cómo lo tenías y qué era lo que no te dejaba o qué es lo que quieres poder hacer. :-X
516  Programación / Programación C/C++ / Re: COMO ELIMINO EL ULTIMO NODO DE QUE INGRESE( pila C++ ) en: 30 Septiembre 2019, 15:33 pm
No tiene mucho sentido ya que la gracia de usar una Pila es insertar al principio en O(1) y eliminar del principio en O(1). Si insertas y eliminas por el final, las operaciones pasarán de ser O(1) a O(n)... pero si es lo que quieres, me limito a darte una opción.
Creas un nodo auxiliar que empezando en <cabeza> vaya avanzando hasta que <aux->siguiente> sea igual a <cola>. Entonces eliminas <cola> e igualas <cola> a <aux>. Cuidado con lo de "hasta que <aux->siguiente> sea igual a <cola>" ya que puedes tener dos elementos iguales pero que no sean el mismo. Tendrás que comprobarlo con sus direcciones de memoria.
Otra forma que se parecería un poco más a la estructura de una pila (aunque poco) es tener una función que devuelva el número de elementos de la pila. El típico <size()> del contenedor <stack> de la STL. Entonces lo mismo, avanzas con un puntero auxiliar hasta uno menos del último y haces lo mismo de antes.

PD: Tal y como quieres usarlo sería mejor usar listas doblemente enlazadas, en las que cada nodo tiene un puntero a siguiente y otro a anterior. La gracia de estas es trabajar con inserciones y borrados en ambos extremos en O(1). Así sólo tendrías que empezar en <cola>, crear un puntero auxiliar que apunte también a <cola>, hacer que <cola> apunte al anterior y borrar el auxiliar.
517  Programación / Programación C/C++ / Re: AYUDA LISTA SIMPLE IMPRECION DE DATOS en: 25 Septiembre 2019, 11:32 am
Perdon que interrumpa pero me gustaría saber como trabajas con ese atributo Estudiante* siguiente;

Como sabes cual es su siguiente si creas secuencialmente a los estudiantes A, B y C por ejemplo
estudiante A luego B, C o sea como es que A va a tener a B y B a C,
u otro caso al crear A, B, C este A tendrá a B y C, y B a C y C a NULL, bueno algo asi ;-)
Al parecer la función <insertar()> trabaja como si de una pila se tratase. Crea el primer estudiante A y hace <cabeza = A>. Luego crea al estudiante B pero en lugar de hacer:
Código
  1. A->siguiente = B;
Lo que hace es:
Código
  1. B->siguiente = cabeza; // en este caso cabeza es A
  2. cabeza = B;
Por lo que si inserta los estudiantes A, B, C, D, la lista quedaría de la siguiente manera:
Código:
D(cabeza)->C->B->A->NULL 
518  Programación / Programación C/C++ / Re: Problema con Dev C++ 4.9.9.2 en: 25 Septiembre 2019, 11:24 am
cin.get();
return 0;
+1 para el <cin.get()> antes que usar <system("pause")>.  :rolleyes: :rolleyes:
519  Programación / Programación C/C++ / Re: AYUDA LISTA SIMPLE IMPRECION DE DATOS en: 22 Septiembre 2019, 19:24 pm
Sólo he llegado hasta la clase <Estudiante> pero ya te puedo decir que el error (o al menos uno de ellos) está en el constructor.
Código
  1. class Estudiante{
  2.    public:
  3.        char codigo[5];
  4.        string nombre;
  5.        float poderado;
  6.        Estudiante* siguiente;
  7.  
  8.        Estudiante( char* cod, string nom,float pode ){
  9.            cod=codigo; // esta al reves
  10.            nom =nombre; // esta al reves
  11.            pode = poderado; // esta al reves
  12.            siguiente = NULL;
  13.        }
  14. };
Cada objeto de la clase <Estudiante> tiene 4 datos miembros que son: <codigo>, <nombre>, <poderado> y <siguiente>. Los datos miembros no son <cod>, <nom> y <pode>. Estos últimos son los nombres que tendrán los parámetros del constructor mientras este se ejecuta. Estos nombres son temporales y en cada función pueden tener nombres distintos.

Aparte de eso cuidado al guardar el código. Para "copiar" cadenas de tipo C (o dicho de otra manera, arrays de <char>) debes usar métodos como <strcpy()> o más recomendable <strncpy()>. No vale con usar el operador de igual =.
520  Programación / Programación C/C++ / Re: Problema Funciones C en: 21 Septiembre 2019, 15:05 pm
La función <scanf()> tiene que recibir como segundo parámetro la dirección de memoria de la variable donde quieres guardar el número en este caso.
Corrección:
Código
  1. int numero;
  2. scanf("%d", &numero);
Otra forma de hacerlo para no crear la variable <numero> es guardarlo directamente en el parámetro <variable> así:
Código
  1. void modificar_variable(int *variable){
  2.    printf("Introduzca el valor que desee que tenga la variable: ");
  3.    scanf("%d", variable); // en este caso no se usa & porque lo estas pasando con un puntero
  4. }

PD: Para futuras consultas coloca tus códigos entre etiquetas de Código GeSHi para facilitar la lectura a los demás. Suerte :-X
Páginas: 1 ... 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 [52] 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines