Maximos y minimos numeros aleatorios.

Iniciado por Antonio9411, 19 Noviembre 2012, 20:07 PM

0 Miembros y 1 Visitante están viendo este tema.

Antonio9411

Buenas a quien lea. Escribo con motivo de un probremilla que me ha surgido con un ejercicio de clase que se me ha atragantado. La cuestión es hacer un programa que genere 10 numeros aleatorios entre el 10 y el 1000, los muestre en pantalla y diga cual es el maximo y el minimo.

He comenzado generando los valores aleatorios entre ese itervalo, y los he metido en un vector para poder trabajar con ellos más adelante. Hasta aqui ningún problema, el programa me muestra los resultados en pantalla y todos estan comprendidos entre el 10 y el 1000. Lo malo viene cuando intento definir el max y el min.

Lo que he intentado es definir un maximo y un minimo como los valores de dos posiciones cualquiera del vector, y recorrer el vector con un ciclo for, viendo si cada vector es mayor o menor que el maximo, y así definir nuevos max y min.  Tal que así.

//Programa que genera 10 numeros aleatorios entre el 100 y el 1000 y dice cual es el maximo, el minimo y el medio

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main (void) {
    int v[10], i, max, min;
   
    srand(time(NULL));
    v[0]=10+rand()%(1000-10)+1;
    v[1]=10+rand()%(1000-10)+1;
    v[2]=10+rand()%(1000-10)+1;
    v[3]=10+rand()%(1000-10)+1;
    v[4]=10+rand()%(1000-10)+1;
    v[5]=10+rand()%(1000-10)+1;
    v[6]=10+rand()%(1000-10)+1;
    v[7]=10+rand()%(1000-10)+1;
    v[8]=10+rand()%(1000-10)+1;
    v[9]=10+rand()%(1000-10)+1;
   
     cout<<v[0]<<endl<<v[1]<<endl<<v[2]<<endl<<v[3]<<endl<<v[4]<<endl<<v[5]<<endl;
     cout<<v[6]<<endl<<v[7]<<endl<<v[8]<<endl<<v[9]<<endl;   

   v[0]=max;
   v[0]=min;
    for (i=0;i<10;i++) {
     
        if(v>max) { v=max; }
        else if(v<min) { v=min; } }
       
       
     cout<<"Maximo: "<<max<<endl;
     cout<<"Minimo: "<<min<<endl;   
       
   
   
   
    system("pause");
   
    return 0; }


Sin errores de sintaxis, el programa compila, pero al ejecutarse, me muestra un maximo y un minimo aleatorio y fuera del intervalo. Llevo un par de dias dandole vueltas y no se me ocurre nada.

Supongo que será un error muy obvio y tonto, o que estaré metiendo la pata hasta el fondo confundiendo algún concepto, pero llevo solo un mes programando y no se me ocurre donde.

Gracias de antemano y saludos.

rir3760

El problema son las asignaciones en el bucle:
Código (cpp) [Seleccionar]
v[0] = max;
v[0] = min;
for (i = 0; i < 10; i++){
   if (v[i] > max){
      v[i] = max;
   }else if (v[i] < min){
      v[i] = min;
   }
}


Están al revés, cambia el bucle a:
Código (cpp) [Seleccionar]
max = v[0];
min = v[0];

for (i = 1; i < 10; i++){
   if (v[i] > max){
      max = v[i];
   }else if (v[i] < min){
      min = v[i];
   }
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Antonio9411


zonahurbana

Cita de: Antonio9411 en 19 Noviembre 2012, 20:07 PM
    srand(time(NULL));
    v[0]=10+rand()%(1000-10)+1;
    v[1]=10+rand()%(1000-10)+1;
    v[2]=10+rand()%(1000-10)+1;
    v[3]=10+rand()%(1000-10)+1;
    v[4]=10+rand()%(1000-10)+1;
    v[5]=10+rand()%(1000-10)+1;
    v[6]=10+rand()%(1000-10)+1;
    v[7]=10+rand()%(1000-10)+1;
    v[8]=10+rand()%(1000-10)+1;
    v[9]=10+rand()%(1000-10)+1;
   
     cout<<v[0]<<endl<<v[1]<<endl<<v[2]<<endl<<v[3]<<endl<<v[4]<<endl<<v[5]<<endl;
     cout<<v[6]<<endl<<v[7]<<endl<<v[8]<<endl<<v[9]<<endl;
Y recuerda que para generar N números aleatorios (de un mismo intervalo) puedes usar también un FOR:
for(int x=0; x<N; x++) v[x]=10+rand()%(1000-10)+1;
// En tu caso reemplazarías N por 10.


Lo mismo para mostrar valores N contenidos en un arreglo:
for(int x=0; x<N; x++) cout<<v[x]<<endl;
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

Antonio9411

Cita de: zonahurbana en 20 Noviembre 2012, 21:27 PM
Y recuerda que para generar N números aleatorios (de un mismo intervalo) puedes usar también un FOR:
for(int x=0; x<N; x++) v[x]=10+rand()%(1000-10)+1;
// En tu caso reemplazarías N por 10.


Lo mismo para mostrar valores N contenidos en un arreglo:
for(int x=0; x<N; x++) cout<<v[x]<<endl;

Pues es verdad... Mira que estoy espeso, lo que me puedo ahorrar así... Gracias!

Antonio9411

#5
EDITO. Era un fallo del archivo.