Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Denok

#11
Gracias por responder!!.

Lo que pasa es que no puedo usar ninguna de las dos opciones que me explicas(no me dejan). Cual seria la manera para que me quedara bien ordenado, no entiendo porque no se ordena bien.
Que tendría que modificar de mi código para que quedase bien?
Tampoco entiendo tu pd, que tiene que ver que sea una función void ? Si me lo explicaras me harías un favor.

Muchas gracias!!

Adiós.
#12
Hola, mirar estoy intentando hacer el ejercicio siguiente:

Hacer un procedimiento
    void insereix(vector <double>& v);

que, suponiendo que todas las posiciones de v, excepto quizas la ultima,estan ordenadas de pequeño a grande, deje v totalmente ordenado de pequeño a grande.
Un ejemplo seria, si v fuera (2,4,7,7,8,9,5), deberia quedar(2,4,5,7,7,8,9).

El codigo que yo he hecho es el siguiente:
Código (cpp) [Seleccionar]


#include <iostream>
#include <vector>
using namespace std;

void insereix(vector <double>& v){
    int n = v.size();
    int k = v[n-1];
    vector <double> vi(n);
    bool inserit = false;
    int j;

    for(int i = 0; i < n and not(inserit); ++i){
        if(v[i] <= k){
            vi[i] = v[i];
        } else {
            vi[i] = k;
            inserit = true;
            j = i + 1;
        }
    }

    for(int i = j; i < n;++i){
        vi[i] = v[i];
    }
}

int main(){
    int n;
    cin >> n;
    vector <double> v1(n);
    for(int i = 0; i < n; ++i)
        cin >> v1[i];

    insereix(v1);

    for(int i = 0; i < n; ++i)
        cout << v1[i];

}


Pero cuando imprimo me sale el vector exactamente igual que lo he introducido.
Para explicar un poco el código de la función, lo que hago es crear un nuevo vector donde guardare el antiguo vector ordenado.
Declaro una variable(k) donde guardo el valor de la ultima posición, y con un for voy comprobando si cada posición es menor o igual a la ultima. Si no es así, introduzco en esa posición el valor de k, y con una variable booleana puesta en false, hago que no se ejecute el código.

Luego solo hago otro for para rellenar el vector desde la siguiente posición de k.

No entiendo porque no funciona.

Muchas gracias y adiós!.
#13
Programación C/C++ / Dudas de recursividad
16 Diciembre 2011, 01:16 AM
Hola, estoy aprendiendo a programar usando recursividad y no acabo de entenderlo del todo.

Os pongo un ejemplo y os presento mis dudas:

#include <iostream>
#include <string>
using namespace std;

void invertir(){
string tmp;
if(cin >> tmp){
invertir();
cout << tmp << endl;
}
}

int main(){
invertir();
}


Este código lo que hace es invertir palabras. Por ejemplo, yo le entrego tres nombres: Jaime, Ramon, Pablo y me devuelve Pablo, Ramon, Jaime.
No entiendo como lo hace, quiero decir, la función entra en un bucle mientras le estén introduciendo datos, pero es que cuando esta dentro de el bucle vuelve a llamarse a si misma, y entonces nunca llegaría al cout << tmp << endl; no? Pues cuando se acabe de introducir datos no entrara al bucle i no passara por el cout.

Ademas, como la variable tmp puede guardar tantos nombres ? No se deberían machacar, quiero decir al poner Jaime i en la siguiente vez Ramon, no se machaca la variable ? Porque sino es que escribe el cout cada vez que pasa por el bucle(que es lo que supongo que pasa) pero no se como lo hace entonces.

No se si me he explicado bien, espero que me podáis ayudar.

En el caso del factorial recursivo me pasa mas o menos lo mismo, no acabo de entender como se guardan los datos, si se deberian machar, etc.

Muchísimas gracias!!

Adiós!
#14
AA vale vale, xDD muchas graciaaas.
#15
No acabo de entender el: PD:
En caso de empate se tiene que devolver la posición minima. NO la posicion del elemento minimo. Por lo tanto se refiere a la posicion del primer elemento maximo, que sera la posicion minima de todas las repeticiones del maximo.

Si es asi, siempre devolvera la posición 0 no?. No acabo de entender-lo.

Si yo por ejemplo ejecuto este codigo:

#include <iostream>
#include <vector>
using namespace std;

int posicio_maxim(const vector<double>& v, int m)
{
    int indice;
    double max;

    if(!v.size())
        return -1;

   
    max = v[0];
    indice = 0;

    for(int i = 1 ; i < m ; i++)
    {
       
        if(max < v[i])
        {
            max = v[i];
            indice = i;
        }
    }

    return indice + 1;
}


int main(){
    int n;
    cin >> n;
    vector<double> v(n);
    for(int i = 0; i < n; i++){
        cin >> v[i];
    }
    int m;
    cin >> m;
    cout << posicio_maxim(v, m) << endl;
}   



Ahora le introduzco, de tamaño de vector 5.
Elementos del vector: 1 2 2 3 3
La m: 5
Y me devuelve la posición 3, que es el primer tres, pero esa no es la posición minima no?
Si me lo pudieras explicar, porque no lo acabo de pillar xD.

Muchas gracias.
Adioooos.
#16
A la función se le tiene añadir una variable m que te diga el maximo entre v[0...m].
Le añado eso, pero al repetir los numeros me saca una posición que no esta ni en el vector.

Te dejo el codigo que he modificado, porque no veo porque me saca, por ejmplo si le entro: 5 elementos que són 1 3 3 4 4 i me saca de posición 5. En teoria me tendria que sacar la posicion 0, porque en caso de empate se devuelve la posición mas pequeña.

Te dejo aqui el codigo que he hecho a partir del tuyo:


#include <iostream>
#include <vector>
using namespace std;

int posicio_maxim(const vector<double>& v, int m)
{
    if(v.size() == 0)
            return -1;
    int pos = 0;
    double valor = v[0];
    bool flag = false;
    for(int i = 1; i <= m and not(flag); i++)
    {
            if(v[i] > valor)
            {
                    valor = v[i];
                    pos = i;
            }else if(v[i] == valor)
            {
                 flag = true;
            }
    }
    if(not(flag))
             return pos;

    pos = 0;
    valor = v[0];
    for(int i = 1; i <= m; i++)
    {
            if(valor > v[i])
            {
                    valor = v[i];
                    pos = i;
            }
    }
    return pos;
}

int main(){
    int n;
    cin >> n;
    vector<double> v(n);
    for(int i = 0; i < n; i++){
        cin >> v[i];
    }
    int m;
    cin >> m;
    cout << posicio_maxim(v, m) << endl;
}   



Muchisimas gracias.

Adiooos.
#17
Hola, estoy intentando hacer este ejercicio pero no me sale.

Consiste en retornar la posición del elemento máximo(el mas grande) de un vector.
En caso de empate se tiene que devolver la posición minima.

Yo he hecho este codigo pero no me funciona bien, y nose por donde tirar ya, haber si alguien me puede ayudar porfavor.


#include <iostream>
#include <vector>
using namespace std;

int posicio_maxim(const vector<double>& v, int m){
   
   int max = 0;
   int pos_max;
   bool empat = false;
   for(int j = 0; j <=m and not(empat); ++j){
       if(v[j] > max){
           max = v[j];
           pos_max = j;
       } else if(v[j] == max) {
           empat = true;
       }          
   }
   
   int min = max;
   int pos_min;
   
   for(int j = 0; j <= m and empat; ++j){
       if(v[j] < min){
           min = v[j];
           pos_min = j;
       }          
   }
   
   if(empat)
    return pos_min;
   else
    return pos_max;
   

}

int main(){
   int n;
   cin >> n;
   vector<double> v(n);
   for(int i = 0; i < n; ++i){
       cin >> v[i];
   }
   int x;
   cin >> x;
   cout << posicio_maxim(v, x) << endl;
}



Muchas gracias.

Adiós.