• Sábado 14 de Diciembre de 2024, 21:45

Autor Tema:  Arreglos unidimensionales!  (Leído 2701 veces)

asyba

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Arreglos unidimensionales!
« en: Sábado 30 de Mayo de 2009, 23:32 »
0
hola que tal me diero de tarea un ejercicio en que tnego que cargar x cantidades de valores en un vector y calcularle el promedio de los numeros que contienen ese vector,, hacer un menu,, calcular los numeros negativos,,,,, y el numero menor de todos,, aca esta lo que hice

en la parte del promedio no se como sacarlo prove pero no me da,, alguna ayudita..?

Código: C#
  1. #include<iostream.h>
  2. #include<conio.h>
  3. #include<ventanas.h>
  4.     void cargar(int v[50],int n);
  5.     void menor(int v[50],int n);
  6.     void mostrar(int v[50],int n);
  7.     void promedio(int v[50],int n);
  8.     void negativo();
  9.     void menu();
  10.  
  11. void main()
  12. {
  13.     clrscr();
  14.     textbackground(RED);
  15.     menu();
  16.  
  17. }
  18.  

Código: C#
  1. void menu()
  2. {
  3.     int op,pro,n;
  4.     int v[50];
  5.     char opciones[6][30]={"1-.Cargar","2-.El menor valor","3-.Promedio","4-.Valores negativos","5-.Mostrar?","6-.Salir"};
  6.     //n=0;
  7.     clrscr();
  8.     do
  9.     {
  10.         clrscr();
  11.         op=menu(opciones,6,38,5,RED,WHITE);
  12.         switch(op)
  13.         {
  14.         case 1: cargar(v,n);
  15.                 break;
  16.         case 2: menor(v,n);
  17.                 break;
  18.         case 3: promedio(v,n);
  19.                 break;
  20.         case 4: negativo();
  21.                 break;
  22.         case 5: mostrar(v,n);
  23.                 break;
  24.         case 6: break;
  25.         }
  26.     }
  27.     while(op!=6);
  28. }
  29.  

Código: C#
  1. void cargar(int v[50],int n)
  2. {
  3.     int i;
  4.     clrscr();
  5.     do
  6.     {
  7.         cout<<"Cargue cuantos componentes quiere (no mas de 50): ";
  8.         cin>>n;
  9.     }
  10.     while(n<=0  || n>100);
  11.     cout<<"nCargue los valores se les pide:n";
  12.     for(i=0;i<n;i++)
  13.     {
  14.         cout<<"V["<<i<<"]: ";
  15.         cin>>v[i];
  16.     }
  17.     cout<<"nPrecione la tecla ENTER para volver al menu.";
  18.     getch();
  19. }
  20. void menor(int v[100],int n)
  21. {
  22.     int i,x;
  23.     ///*
  24.     clrscr();
  25.     if(n>0)
  26.     {
  27.  
  28.     cout<<"El menor valor contenido en el arreglo es: "<<x<<" y se encuentra en el componente: "<<i;
  29.  
  30.     }
  31.     else
  32.     {
  33.         cout<<"Usted no ha cargado ningun valor!!!";
  34.     }
  35.     cout<<"nPrecione la tecla ENTER para volver al menu.";
  36.     getch();
  37. }
  38. void promedio(int v[50],int n)
  39. {
  40.     int i,acum,p,pro;
  41.     acum=0;
  42.     clrscr();
  43.     if(n>0)
  44.     {
  45.     for(i=0;i<n;i++)
  46.     {
  47.     acum+=v[i];
  48.     }
  49.     pro=acum/n;
  50.  
  51.     //p=promedio(v,n);
  52.     cout<<"El promedio de los valores contenidos en el arreglo es: "<<pro;
  53.     //return pro;
  54.     }
  55.     else
  56.     {
  57.         cout<<"Usted no ha cargado ningun valor!!!";
  58.     }
  59.     cout<<"nPrecione la tecla ENTER para volver al menu.";
  60.     getch();
  61. }
  62. void negativo()
  63. {
  64.     /*
  65.     clrscr();
  66.  
  67.     if(n>0)
  68.     {
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.     cout<<"La cantidad de numeros negativos que tiene el arreglo son: "<<neg;
  77.     }
  78.     else
  79.     {
  80.         cout<<"Usted no ha cargado ningun valor!!!";
  81.     }
  82.     cout<<"nPrecione la tecla ENTER para volver al menu.";
  83.     getch();
  84.     */
  85. }
  86. void mostrar(int v[50],int n)
  87. {
  88.     int i;
  89.     clrscr();
  90.     if(n==0)
  91.     {
  92.     cout<<"Usted no a ingresado ningun valor!!!";
  93.     }
  94.     else
  95.     {
  96.     cout<<"El arreglo que usted ingreso es: ";
  97.     for(i=0;i<n;i++)
  98.     {
  99.         cout<<"nV[ "<<i<<"]: "<<v[i];
  100.     }
  101.     }
  102.     cout<<"nPrecione la tecla ENTER para volver al menu.";
  103.     getch();
  104. }
  105.  

Sankara

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Arreglos unidimensionales!
« Respuesta #1 en: Domingo 31 de Mayo de 2009, 12:27 »
0
Hola,
bueno en primer lugar el vector no lo declaras bien
vector<int> v(50); debería ser así para darle tamaño 50 y no con corchetes, los corchetes son el operador de acceso a los elementos

por otro lado, en la función promedio no estás pasando bien el vector, deberías pasarlo así:

void promedio(vector<int> &v,int n)

y la utilizarías así promedio(v, n);

a ser posible pasa en el vector por referencia en el prototipo. La función que tienes para calcular la media no está mal... simplemente ten en cuenta que estás haciendo una división entera, por eso no te sale el resultado que esperas... para ello deberías hacer conversión a float...

por ejemplo así:

float pro;
y al salir del bucle pones
pro=(acum*1.0)/n;

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Arreglos unidimensionales!
« Respuesta #2 en: Domingo 31 de Mayo de 2009, 14:33 »
0
Cita de: "Sankara"
bueno en primer lugar el vector no lo declaras bien
vector<int> v(50); debería ser así para darle tamaño 50 y no con corchetes, los corchetes son el operador de acceso a los elementos
Falso. Puedes declarar perfectamente un vector de enteros de tamaño 50 así: int v[50]

Basándonos en esto, las declaraciones de funciones: void promedio(int v[],int n).

asyba

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Arreglos unidimensionales!
« Respuesta #3 en: Domingo 31 de Mayo de 2009, 21:59 »
0
grax por eso

otra cosa en void mostrar

cuando lo compilo y selecciono esa opcion del menu no me aparece lo que carge por que sera...

y cuando pongo si n == 0 que mediga que no carge nada y si n>0 que haga lo que esta dentro de esas llavaes,,, pero lo que me pasa es que siempre me dice usted no hacargado datos osea me toma n==0 y eh cargado datos..... me ayudan...

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Arreglos unidimensionales!
« Respuesta #4 en: Lunes 1 de Junio de 2009, 09:57 »
0
Explícate un poco mejor, por favor, no he entendido cuál es el problema...

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Arreglos unidimensionales!
« Respuesta #5 en: Lunes 1 de Junio de 2009, 10:22 »
0
Cita de: "asyba"
y cuando pongo si n == 0 que mediga que no carge nada y si n>0 que haga lo que esta dentro de esas llavaes,,, pero lo que me pasa es que siempre me dice usted no hacargado datos osea me toma n==0 y eh cargado datos..... me ayudan...

si te fijas, en el codigo tu pones :

Código: C++
  1.  
  2.    case 5: mostrar(v,n);
  3.                 break;
  4.  
  5.  

cuando llamas a mostrar , n tiene un valor indeterminado que se carga en el scope de la funcion main.  CERO.

Si quieres que el valor de n se mantenga entre funciones tienes que cambiarlo pasandolo por referencia.

Traduzco: cuando defines una variable, esa variable solo mantiene ese valor en la funcion en la que se crea. Cuando la pasas como parametro, se pasa una COPIA de esa variable. La original no la modificas, luego, n siempre vale lo que valia en Main, cosa que es indefinida.
Cuando modifias n en las funciones estas cambiando una COPIA del valor de n. Al volver a la funcion que la llama , main, la variable "vuelve" a su valor anterior (no vuelve por que nunca cambió, pero bueno).

Para evitar esto, modifica las funciones para usar n por referencia.

Código: C++
  1.  
  2. void cargar(int v[50],int  * n); //le pasamos la DIRECCION de la variable. Modificaremos el CONTENIDO de esa dirección.
  3.  
  4. void cargar(int v[50],int  * n)
  5. {
  6. int NuevaN;
  7.  
  8. ... codigo
  9.  
  10. cin>>NuevaN;
  11. *n=NuevaN; //metemos el nuevo valor en la variable
  12.  
  13. ... codigo de hacer cosas
  14. }
  15.  
  16. //en main la usarias:
  17.  
  18. cargar(v, &n);   //le pasamos la DIRECCION de n por referencia.
  19.  
  20.  
  21.  

Asi , en todas las funciones estarias usando la misma variable, y en main tendrias siempre la n actualizada.
Si tienes dudas sobre el paso de parametros por referencia pregunta. No he querido ser muy extenso.

espero que ayude  :hola:

asyba

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Arreglos unidimensionales!
« Respuesta #6 en: Martes 2 de Junio de 2009, 23:31 »
0
graxxx por eso del & haora si me anda


otras 2 ultimas cosas

Código: C++
  1. void menor(int v[100],int n)
  2. {
  3.     int i,j;
  4.     ///*
  5.     clrscr();
  6.     if(n>0)
  7.     {
  8.         for(i=0;i<n;i++)
  9.         {
  10.             for(j=i+1;j<n;j++)
  11.             {
  12.                 if(v[i]<j)
  13.                 {
  14.                 cout<<"El menor valor contenido en el arreglo es: "<<v[i]<<" y se encuentra en el componente: "<<i;
  15.                 }
  16.             }
  17.         }
  18.     }
  19.     else
  20.     {
  21.         cout<<"Usted no ha cargado ningun valor!!!";
  22.     }
  23.     cout<<"nPrecione la tecla ENTER para volver al menu.";
  24.     getch();
  25.  
}

aca no se si esta bien la aprte de j si es que esta bien planteado asi......

y en este
Código: C++
  1. void negativo(int v[50], int n)
  2. {
  3.     int i,x;
  4.     clrscr();
  5.  
  6.     if(n>0)
  7.     {
  8.     for(i=0;i<n;i++)
  9.     {
  10.  
  11.         if(v[i]<0)
  12.         {
  13.         x++;
  14.         cout<<"La cantidad de numeros negativos que tiene el arreglo son: "<<x;
  15.         }
  16.  
  17.     }
  18.     cout<<"No se encuentran valores negativos en el arreglo!!!";
  19.  
  20.     }
  21.     else
  22.     {
  23.     cout<<"Usted no ha cargado ningun valor!!!";
  24.     }
  25.     cout<<"nPrecione la tecla ENTER para volver al menu.";
  26.     getch();
  27. }
  28.  

no se por que me da numeros cualquiera en la cantidad,, y repite varias veces el cartel La cantidad de numeros negativos son.....

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Arreglos unidimensionales!
« Respuesta #7 en: Miércoles 3 de Junio de 2009, 16:02 »
0
Cita de: "asyba"
if(v<j)

en esta linea estas comparando el valor del array con el INDICE! seguramente querias

Código: C++
  1.  
  2. if(v[i]<v[j])
  3.  
  4.  

AUN ASI, eso no te encuentra el menor!

Lo que tienes que hacer es:
1) coges el primer elemento del array
2) lo copias en una variable y asumes que es el numero menor
3) iteras el vector:
         si el elemento n del vector es < que el numero menor:
                      copias el elemento n en el numero menor

asi al terminar tendras en esa variable el menor numero del array (o arreglo).

Cita de: "asyba"

 for(i=0;i<n;i++)
    {
 
        if(v<0)
        {
        x++;
        cout<<"La cantidad de numeros negativos que tiene el arreglo son: "<<x;
        }
 
    }
es que realmente tienes el escribir esa frase DENTRO del for, luego lo hara N veces. Pon el cout al final y en el ciclo simplemente incrementa una variable cada vez que encuentres uno negativo.

 :hola:

Evoltd3v

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
No estas hallando el menor
« Respuesta #8 en: Jueves 4 de Junio de 2009, 00:43 »
0
Holas, espero hacerme entender   ; en la funcion menor que pusiste:

Código: C++
  1.  
  2.  
  3. void menor(int v[100],int n)   // Mas arriba lo declaraste para que espere 50 elementos y no 100
  4. {
  5.     int i,j;
  6.     ///*
  7.     clrscr();
  8.     if(n>0)
  9.     {
  10.         for(i=0;i<n;i++)  
  11.         {
  12.             for(j=i+1;j<n;j++)     //¿Creo que estas intentando usar el metodo de la burbuja?
  13.             {
  14.                 if(v[i]<j)      //Aqui estas comparando el valor de cada elemento del vector con el valor de la variable j
  15.                                    //j vale uno en la primera vuelta y se va sumando una unidad en cada vuelta
  16.                 {
  17.                 cout<<"El menor valor contenido en el arreglo es: "<<v[i]<<" y se encuentra en el componente: "<<i;  
  18.                /*Este mensaje aparece cada vez que se cumpla la condicion, lo que debiste haber hecho es mostrarlo al final; es  decir una vez hallado el valor menor del array */  
  19.                 }
  20.             }
  21.         }
  22.     }
  23.     else
  24.     {
  25.         cout<<"Usted no ha cargado ningun valor!!!";
  26.     }
  27.     cout<<"nPrecione la tecla ENTER para volver al menu.";
  28.     getch();
  29.  
  30.  
  31.  
  32.  

Pudiste haber usado un solo for para hallar el menor de todos los valores ingresados:

Código: C++
  1.  
  2.  
  3. void menor(int v[50],int n){
  4.      
  5.      int r = 0;
  6.  
  7.     if(n>0){
  8.  
  9.           for(i = 0; i < n; i++){
  10.  
  11.                 if(v[i] < v[r]){
  12.                       r = i;                
  13.                    }
  14.           }
  15.     }
  16.     else{
  17.          printf("nUsted no ha cargado ningun valor!!!n");  
  18.     }
  19.  
  20. printf("El menor valor hallado es el:%d", v[r]);
  21. }
  22.  
  23.  

Es mi sugerencia, espero haberte ayudado.