Hola a todos, recién estoy empezando con C/C++ y espero que me puedan ayudar.
Hice este pequeño programa que lee diez valores enteros en un array desde el teclado y
calcula y muestra la suma, el valor promedio, el mayor y el menor de los números.
Ahora lo que quiero hacer es que no solo lea 10 enteros, sino que el programa lea y almacene indefinidamente los enteros en el array hasta que se lea desde el teclado una palabra clave como por ejemplo "PARAR" y luego realizar los cálculos.
Se hacer mas o menos lo que quiero pero el problema es que no se como declarar un array sin definir la dimencion de este, para que no tenga limite los números que ingresaran.

E probado asi:

Código: Seleccionar todo

int a[];
Pero, creo que es así no es, ¿verdad?, ¿como se podría hacer?

Les dejo el code completo:

Código: Seleccionar todo

#include <iostream>

using namespace std;

int main()
{
    
    int a[10], i = 0 , P;
    int suma = 0, promedio, mayor, menor ;
    
    cout << "ingrese numeros enteros : " << endl;
    
    do 
    {
       cin >> a[i];
       
       if (i == 0) 
       {
             mayor = menor = a[i];
             goto S;
       }
       if (a[i] > mayor)
       {
             mayor = a[i];
             goto S; 
       }
       if (a[i] < menor)
       {
             menor = a[i];
             goto S;
       } 
       S: i++;  
    }
    
    while(i != 10);
    
    for (int x = 0 ; x < 10 ; x++) suma += a[x];
    
    promedio = suma / 10;
    
    cout << "la suma es : " << suma << endl;
    cout << "el promedio es : " << promedio << endl;
    cout << "el mayor es : " << mayor << endl;
    cout << "el menor es : " << menor << endl;
    
    cin >> P ;
    
}

Gracias de antemano, saludos.
http://www.freundt-esta-aburrido.blogspot.com
¿algun limite tendrá, no? Porque la memoria no suele ser infinita
a ver para que entiendas símplemente reserva memoria dinámica al vuelo con malloc ¿como seria eso a ver ? malloc reserva la cantidad de bytes que le dices Le pide al sistema operativo un segmento de memoria del tamaño que le digas , así que si al principio necesitas 16 enteros, pues reservas sizeof(int)*16 , si necesitas más, pues reservas para 32 ,Luego para 64...Hasta que ya no necesites más , pero No olvides Snopk que todo lo que se reserva con malloc, se debe liberar con free
Un eje`mplito:

Código: Seleccionar todo

int* pArray = (int *)malloc(sizeof(int) * 16);
 // Usamos pArray...
free ( pArray );
Si necesitas expandirlo, sigue el procedimiento:
* Reserva la nueva memoria
*Copia los elementos de la vieja a la nueva
*Libera la vieja

exitos hermano !!
<Josh> y bueno hermano,tu hermana q me dijo q estaba cansada de tenerle el orto como la bandera de japon y bueno la pobre me quizo hacer un masaje prostatico nada mas pero era tanto su recelo y venganza acumulada q se esmero un poco mas de lo normal,pero bue,estuivo bien amorizado por la de dias horas años y lagrimas q echo la pobre de tanto culearla
De hecho puedes pasar el limite de los subindices sin problema... jeje, pero como dice mi compañero ps1c0s1s la memoria es limitada y al pasar el subindice estarias accediendo a una zona de memoria extra xD pero igual puedes declarar un a[10] y acceder al subindice 11 de la matriz sin problemas

--Edito

Ese problema me sonaba familiar, no estaras aprendiendo C++ de donde yo aprendi??
(conclase.net)



creo haberlo visto ahi
//mHmm..
linkgl escribió:De hecho puedes pasar el limite de los subindices sin problema... jeje, pero como dice mi compañero ps1c0s1s la memoria es limitada y al pasar el subindice estarias accediendo a una zona de memoria extra xD pero igual puedes declarar un a[10] y acceder al subindice 11 de la matriz sin problemas

--Edito

Ese problema me sonaba familiar, no estaras aprendiendo C++ de donde yo aprendi??
(conclase.net)



creo haberlo visto ahi
Si, conclase.net de todos los manuales/libros que vi este es el que me gusto mas y creo haber escuchado que es el mejor libro de C/C++ y el mas completo de toda la web.
El problema te pide solo que lea 10 enteros desde el teclado y los almacene en un array, pero se me ocurrió esta duda.

Volvamos a mi duda, como tu mismo dices puedo pasarme del limite de los subindices sin problemas pero eso ocasionaría errores inesperados según tengo entendido.

Muchas gracias ps1c0s1s ya entendí como se hace.

Saludos.
http://www.freundt-esta-aburrido.blogspot.com
La solucion automatica para el metodo de ps1c0 es utilizar STL, son -resumen incompleto- contenedores optimizados para ciertas operaciones, por ejemplo, listas ligadas, mapas de bits en memoria, etcétera.
En este caso, el contenedor Vector te sirve para hacer las veces de un array de dimensiones indefinidas. STL no tiene una penalizacion de performance porque está optimizado en C y Asm.
Ejemplo:

Código: Seleccionar todo

#include <vector>

int main (void)
{
  std::vector<int> miArray; // el tipo de datos se determina entre < y >, porque STL usa templates
  miArray.push_back 4;
  miArray.push_back 35;
  //... y asi, lo que haga falta agregar se agrega
}
lo interesante es que tiene mil funciones STL: para empezar, no hay que ocuparse de utilizar free() en cada salida de rutina, y asi se ahorra uno muchos dolores de cabeza. Ademas, se puede reservar memoria en tiempo de ejecucion (que en definitiva es un wrapper de malloc()), obviamente redimensionar el vector, bah tiene mil ventajas. para mi, saber usar bien STL es saber un 20% de c++ (bastante), no al pedo está integrado al lenguaje. E igual va a suceder con Boost.
(MD5 checksum error.)
Responder

Volver a “C/C++”