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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema en volver la posición del elemento maximo de un vector
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema en volver la posición del elemento maximo de un vector  (Leído 7,751 veces)
Denok

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Problema en volver la posición del elemento maximo de un vector
« en: 13 Diciembre 2011, 16:39 pm »

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.

Código:
#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.


« Última modificación: 13 Diciembre 2011, 16:42 pm por Denok » En línea

s00rk

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: Problema en volver la posición del elemento maximo de un vector
« Respuesta #1 en: 13 Diciembre 2011, 17:18 pm »

Primero antes de iniciar el segundo para minimo, deberia preguntar si hubo empate si no hubo regresar el valor, sino ya empezar con el de minimo.

Otra cosa en este tipo de casos no es bueno darle el valor a uno a comparar por 0 o algun otro, la mejor opcion en esto es asignarle el primer valor del vector y ya el for iniciar desde 1 hasta su longitud, que esta se puede obtener con v.size();

Tampoco puedes hacer a max o a min del tipo int, puesto que no puedes asignarle un double a int (sin hacer casto claro).

Quedando algo asi:

Código
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. int posicio_maxim(const vector<double>& v)
  6. {
  7.    if(v.size() == 0)
  8.            return -1;
  9.    int pos = 0;
  10.    double valor = v[0];
  11.    bool flag = false;
  12.    for(int i = 1; i < v.size() && !flag; i++)
  13.    {
  14.            if(v[i] > valor)
  15.            {
  16.                    valor = v[i];
  17.                    pos = i;
  18.            }else if(v[i] == valor)
  19.            {
  20.                 flag = true;
  21.            }
  22.    }
  23.    if(!flag)
  24.             return pos;
  25.  
  26.    pos = 0;
  27.    valor = v[0];
  28.    for(int i = 1; i < v.size(); i++)
  29.    {
  30.            if(valor > v[i])
  31.            {
  32.                    valor = v[i];
  33.                    pos = i;
  34.            }
  35.    }
  36.    return pos;
  37. }
  38.  
  39. int main(){
  40.    int n;
  41.    cout << "Total de Elementos: ";
  42.    cin >> n;
  43.    vector<double> v(n);
  44.    for(int i = 0; i < n; i++){
  45.        cin >> v[i];
  46.    }
  47.    cout << "Posicion: " << posicio_maxim(v) << endl;
  48.    system("pause");
  49. }
  50.  


En línea

Denok

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Problema en volver la posición del elemento maximo de un vector
« Respuesta #2 en: 13 Diciembre 2011, 23:56 pm »

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:

Código:
#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.
En línea

s00rk

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: Problema en volver la posición del elemento maximo de un vector
« Respuesta #3 en: 14 Diciembre 2011, 01:52 am »

porque pones

<= m

?

No entiendo porque el = , en mi opinion eso esta incorrect ya que pides un rango no? pero si el tamaño es 6 y a , le envias 6
los numeros comienzan desde el 0, el vector seria
0 1 2 3 4 5
y la m checaria por
0 1 2 3 4 5 6

Por colocar ese = .
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Problema en volver la posición del elemento maximo de un vector
« Respuesta #4 en: 14 Diciembre 2011, 01:59 am »

¡Buenas!

Estais planteando mal el algoritmo. En ningun momento se pide calcular el minimo del vector. Haceis bien en asumir el primer elemento y la primera posicion como maximo y posicion del maximo, pero luego solo teneis que aseguraros de encontrar valores mayores, ya que de forma automatica se iran actualizando los datos a la posicion mas pequeña de las posibles repeticioines del mayor de los valores:

Código
  1. int posicio_maxim(const vector<double>& v)
  2. {
  3.    int indice;
  4.    double max;
  5.  
  6.    if(!v.size())
  7.        return -1;
  8.  
  9.    //asumimos que el primer valor es el mayor
  10.    max = v[0];
  11.    indice = 0;
  12.  
  13.    for(int i = 1 ; i < v.size() ; i++)
  14.    {
  15.        //modificamos los datos solo si el valor actual es mayor que el maximo provisional
  16.        //al hacer la comparacion con un menor estricto, nos aseguramos de que el maximo
  17.        //provisional es el de menor indice de las posibles repeticiones
  18.        if(max < v[i])
  19.        {
  20.            max = v[i];
  21.            indice = i;
  22.        }
  23.    }
  24.  
  25.    return indice;
  26. }
  27.  

¡Saludos!

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.
« Última modificación: 14 Diciembre 2011, 02:04 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
s00rk

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: Problema en volver la posición del elemento maximo de un vector
« Respuesta #5 en: 14 Diciembre 2011, 02:13 am »

¡Buenas!

Estais planteando mal el algoritmo. En ningun momento se pide calcular el minimo del vector. Haceis bien en asumir el primer elemento y la primera posicion como maximo y posicion del maximo, pero luego solo teneis que aseguraros de encontrar valores mayores, ya que de forma automatica se iran actualizando los datos a la posicion mas pequeña de las posibles repeticioines del mayor de los valores:

Código
  1. int posicio_maxim(const vector<double>& v)
  2. {
  3.    int indice;
  4.    double max;
  5.  
  6.    if(!v.size())
  7.        return -1;
  8.  
  9.    //asumimos que el primer valor es el mayor
  10.    max = v[0];
  11.    indice = 0;
  12.  
  13.    for(int i = 1 ; i < v.size() ; i++)
  14.    {
  15.        //modificamos los datos solo si el valor actual es mayor que el maximo provisional
  16.        //al hacer la comparacion con un menor estricto, nos aseguramos de que el maximo
  17.        //provisional es el de menor indice de las posibles repeticiones
  18.        if(max < v[i])
  19.        {
  20.            max = v[i];
  21.            indice = i;
  22.        }
  23.    }
  24.  
  25.    return indice;
  26. }
  27.  

¡Saludos!

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.


hahaha que tonto soy, yo me guie con su codigo y no a como se planteaba el problema, pues si en ese caso es mas sencillo n_n
En línea

Denok

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Problema en volver la posición del elemento maximo de un vector
« Respuesta #6 en: 14 Diciembre 2011, 11:53 am »

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:
Código:
#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.
En línea

Ferno


Desconectado Desconectado

Mensajes: 375


Ver Perfil
Re: Problema en volver la posición del elemento maximo de un vector
« Respuesta #7 en: 14 Diciembre 2011, 14:13 pm »

En ese caso, el 3 sí sería la posición mínima, porque es la primer posición en la que aparece el elemento mas grande del vector!
En línea

Denok

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Problema en volver la posición del elemento maximo de un vector
« Respuesta #8 en: 15 Diciembre 2011, 15:34 pm »

AA vale vale, xDD muchas graciaaas.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines