Duda C++, Crear array de dimension N

eR_NaNo

Buenas, necesito crear un array unidimensional cuya dimension sea N, y N es un numero que introduce el usuario por teclado.

Alguien sabe como hacerlo?

Thx!!

dagavi

Es muy sencillo.

Igual que declaras un array de algo, pues ese algo en vez de introducirlo manualmente pon una variable:

vector< int> n(4); // vector de enteros de tamaño 4

Pues

int x;
cin >> x

vector< int> n(x);

// Las < > sin espacios, es que si no lo toma como un < i> y el foro lo pone en cursiva

r2d2rigo

Si no te quieres pelear con las STL solo te queda recurrir a los punteros... dobles.

int **array;

cin >> n;

array = new int[n];
for (int i = 0 ; i < n; i++)
{
array = new int;
}

eR_NaNo

No lo entiendo tronco :s

Y no se si tu a mi tb, quizas si xo al no entender tu respuesta te expongo algo mejor el problema.

Tengo q obtener el numero total de almnos de una clase, q lo hago mediane un scanf, ese numero de alumnos, me determina el tamaño del array, en el q luego introducire la altura de cada alumno y hare su media. Lo q no consigo es asignar como dimension del array la cantidad de alumnos leida desde teclado:s

Ahora mismo tengo tal q esto:

#include<stdio.h>
#define n_alum 10
void main()
{
int clase [n_alum], i=0, suma=0, media, altos,bajos;

while (i<n_alum)
{
	printf("Introduzca la altura:\n.");
	scanf("%d",&clase[i]);
	suma=suma+clase[i];
	i++;
}

media=suma/n_alum;

altos=bajos=i=0;

while (i<n_alum)
{
	if (clase[i]<media) bajos=bajos+1;
	else altos=altos+1;
i++;
}
printf("La media es de:%d\n",media);
printf("El numero de alumnos altos es de:%d\n",altos);
printf("El numero de alumnos bajos es de:%d\n",bajos);

}

n_alum, es el numero de alumnos de la clase, aki hice la ñapa y por comprobar si funcionaba la defini yo dandole el valor 10 xq me daba la gana. Lo suyo es q en vez de estar definida, el usuario me diga cuantos alumnos hay en la clase y usar ese valor como definicion de mi array.

eR_NaNo

#3 podrías explicarme q es eso de cin? Soy bastante novato en el tema como podeis ver :s

dagavi

Mensaje en #8

eR_NaNo

Eso es lo primero q intente y no me lo piya, me dice:

error C2133: 'clase' : unknown size

Amos q como no sabe el tamaño del array no puede crearlo :\

dagavi

A ver, toma:

#include<stdio.h>
void main()
{
int n_alum;
scanf("%d", &n_alum);
int clase [n_alum], i=0, suma=0, media, altos,bajos;

while (i<n_alum)
{
printf("Introduzca la altura:\n.");
scanf("%d",&clase);
suma=suma+clase;
i++;
}

media=suma/n_alum;

altos=bajos=i=0;

while (i<n_alum)
{
if (clase<media) bajos=bajos+1;
else altos=altos+1;
i++;
}
printf("La media es de:%d\n",media);
printf("El numero de alumnos altos es de:%d\n",altos);
printf("El numero de alumnos bajos es de:%d\n",bajos);
}

Pa ver que haces mal, porque ha sido poner lo que te digo y a mi me funciona

dagavi

Un ejemplo aparte para que lo veas mas sencillo:

http://pastebin.es/1707

Si quieres olvidate de que está el "while", lo he puesto simplemente para poder realizar varias pruebas

eR_NaNo

Tio, me da el mismo error de compilacion :\

Empiezo a dudar q fuese problema del codigo, xq si tu lo has exo y t compila, no me cuadra :\

dagavi

Donde lo compilas?

Prueba a quitar el "void main" y deja solo "main ()"

Porque el GCC compila bien. (si quieres te paso el ejecutable xD)

eR_NaNo

Acabo de copiar literalmente el codigo de la pagina que has puesto:
#include <stdio.h>

main() {
int x;
while (scanf("%d", &x)) {
int numeros[x];
int i;
for (i = 0; i < x; ++i) scanf("%d", &numeros);
for (i = 0; i < x; ++i) printf("%d ", numeros);
}
}
y me salta con lo mismo pero esta vez con la variable numeros, utilizo el Visual C++ 6.0, tiene algo q veR?

eR_NaNo

Va ser cosa del compilador, como salvo este problema tio?? con el Dev C++ no consigo q me ejecute nunca el programa. Antes lo hacia en linux, xo entre q formateé y no lo puse, y q en la uni lo hacemos en windows, pues no me keda otra q tirar de windows :\

dagavi

No me deja editar, el foro jodió el código (por eso sale en cursiva), quitando los espacios del INCLUDE:

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

int main() {
int x;
while (cin >> x) {
vector numeros(x);
for (int i = 0; i < x; ++i) cin >> numeros;
for (int i = 0; i < x; ++i) cout << numeros << " ";
cout << endl;
}
}


Sobre el Dev-C++ el que yo uso es: http://ovh.dl.sourceforge.net/sourceforge/dev-cpp/devcpp-4.9.9.2_setup.exe

Y me funcionan bien, eso si, poniendo a los archivos la extensión .C (no se si tendrá algo que ver para que el Dev-C++ identifique los códigos C o C++)

eR_NaNo

Tio es q digamos q soy algo mas q amateur y muxo de lo q pones no me suena de nada, entonces si me presento con la practica y tngo q explicarla, mal voy, kiero hacerla mas o menos como la q he puesto, y poder dar razones de xq he hecho esas cosas :s

dagavi

No me deja editar, el foro jodió el código (por eso sale en cursiva), quitando los espacios del INCLUDE:

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

int main() {
int x;
while (cin >> x) {
vector numeros(x);
for (int i = 0; i < x; ++i) cin >> numeros;
for (int i = 0; i < x; ++i) cout << numeros << " ";
cout << endl;
}
}


Sobre el Dev-C++ el que yo uso es: http://ovh.dl.sourceforge.net/sourceforge/dev-cpp/devcpp-4.9.9.2_setup.exe

Y me funcionan bien, eso si, poniendo a los archivos la extensión .C (no se si tendrá algo que ver para que el Dev-C++ identifique los códigos C o C++)

Ahora piro a comer (un poco tarde XD) después ya pasaré a ver si has solucionado esto o no.

PD: MV va fatal

dagavi

Es que lo que he puesto arriba (#8) es lo que hay xD

El Dev-C++ me compila y desde Linux también me compila (ambos usan GCC) así que no se xq el VisualStudio no lo compila :/

eR_NaNo

La cosa es q con el Dev C++, no consigo ejecutar el programa paso a paso, y ver el valor q van tomando las variables, ad+ no se xq justo cuando termino de meter las estaturas, y terminar el while el progrma se cierra :\

Sobre lo q me has dixo de guardarlo en .C, pues es q necesito tenerlo en .cpp q es lo q tengo q llevar a la uni :\

eR_NaNo

Con el Visual me da estos 3 errores por si sirven de algo...

error C2057: expected constant expression

error C2466: cannot allocate an array of constant size 0

error C2133: 'clase' : unknown size

Se lo he pasado a un compañero, y le pasa lo mismo, 3 errores.

dagavi

Según pones en #19 está esperando una constante, por eso no acepta la variable, lo que ya no se es xq pasa eso.

Ya te deberá ayudar alguien que use Visual ya que el GCC si que compila, así que no se como arreglar algo que está bien realizado xD

eR_NaNo

Pero deberia mostrarme los printf al terminar de pedir los datos no??

Lo del debuger no lo decia en concreto x este progrma q es bastante soso, lo decia x otros, x si me enuentro este problema pues ternlo controlado...

eR_NaNo

http://msdn2.microsoft.com/es-es/library/eff825eh(vs.80).aspx

Segun esto, parece ser q es normal, si defines el valor del array como constante, y se lo asignas como dimension, no se produce ese error. En caso contrario si, es decir, cunaod lo defines dinamicamente. Lo q no se es como coño salvarlo, xq no lo kiero constante.

dagavi

Realmente te los muestra, lo que pasa es que va muy rápido.

El programa lee un dato (tarda puesto que te tiene que esperar) y después muestra los datos y continua el programa, en este caso como no hay nada pues acaba.

Para eso está el system("pause");
El PAUSE hace que MS-Dos espere una tecla para continuar [system envía comandos al terminal que lo ejecuta, así que es lo mismo que escribir en MS-Dos "pause"]
Por eso si muestras los datos y debajo pones un PAUSE el programa antes de acabar esperará que se pique una tecla.

Un método más chapuza es abajo declarar una variable (o usar una ya declarada) e intentar leerla:
int espera;
scanf("%d", &espera);

Con eso el programa no finaliza hasta que se lee, pero queda muy xapuza teniendo ya el "Pause"

eR_NaNo

Vale tio, es q desde el Visual, aunq acabe el programa, el mismo te mete la pausa, entonces no se cierra.

Gracias por todo, al menos puedo entregar esta practica, y las q seguian xq se basaban todas en arrays de este tipo xDD Me veia muy jodio jajjaa

Riu

cout y cin son los operadores de entrada y salida de c++, tu estas aprendiendo c, que sus operadores son printf y scanf. para tu problema tienes que hacerlo con punteros o lo que es lo mismo estructuras dinamicas
http://scratchpad.wikia.com/wiki/PLE:Unidad7 .

SeiYa

Siempre puedes usar pilas, listas y colas :P

dagavi

Si, excepto que en la universidad si te dicen haz un programa en C++ usando lo que te hemos enseñado no podemos ir y hacerle un código en Java con punteros y listas solo porque sepamos hacerlo así y no con lo que nos han enseñado.

PD: Lo de cambiar de C++ a Java es un poco burro xD Pero se entiende que si no ha dado pilas y colas (y diría que es obvio que no cuando está creando vectores muy sencillos, los que se usan para aprender), así que no podrá usarlo (no pongo la mano en el fuego por esta "apuesta" xD)

eR_NaNo

Basicamente es lo q dices arriba, es la uni, y es lo q digan los srs maestros.

Sobre lo hablado acerca del compilador y los problemas q da en Visual Studio, los cuales con Dev C++ o linux no se producen, al decirselo a la profe, me ha saltado con los "standar" diciendo q lo standarizado es crear las variables, definir funciones y depues liarnos con el programa en si, y q entonces asi no podiamos hacerlo.

¿Cual ha sido la solucion q me ha dado?

Pues mira, creamos una variable global estatica con un define, de valor mu grande X, y el dato q leemos por teclado lo almacenamos en una varibale local dinamica, y lo comparamos con la global, q es mayor, pues q meta otro numero.

Y se ha kedao tan pancha. Gracias a todos por la colaboracion ;)

Otra duda, como puedo detecta, si solicito por teclado un numero, q me meten una letra o cualkier otro caracter q no sea de tipo numerico??

LOc0

Pues mira, creamos una variable global estatica con un define, de valor mu grande X, y el dato q leemos por teclado lo almacenamos en una varibale local dinamica, y lo comparamos con la global, q es mayor, pues q meta otro numero.

Bienvenido a la huniversidad.

En cuanto a lo otro, si compruebas el valor devuelto por scanf() puedes saber si el dato leído fue del tipo adecuado:

#include <stdio.h>

int main(int argc, char **argv)
{
int num;

printf("\nIntroduce un entero:\n");

while(scanf("%d", &num)!=1)
{
printf("\nERROR: introduce un entero\n");

while((num=fgetc(stdin))!=EOF && num!='\n'); //fflush(stdin) si estás en Windows va mejor.

}

return 0;
}

Salu2 ;)

eR_NaNo

#29

Vale tio, me has iluminado bastante el camino, solo q como ya t dije, soy bastante amateur en el tema, y sobre el codigo q me pusiste, lo he traducido a mi nivel, q viene kedando tal q asi:

#include<stdio.h>
#include<stdlib.h>
void main()
{
int num;

printf("\nIntroduce un entero:\n");

if(scanf("%d", &num)!=1)

printf("\nERROR: introduce un entero\n");exit(0);
}

El tema del EOF y demas, ha sido algo visto por encima, idem con el fflush.

Ahora no consigo usar un while como pusiste, y no un if como hice yo, kedaria de puta madre llevarselo a la profe, xo en cuanto me preguntase, me partiria xD, por eso necesito algo mas ñapa y menos elegante xD