K = numero de alumnos.Gracias por tu respuesta, la verdad es que tienes razon es dificil para una principiante como yo, lo del uso de matriz tridimensional. Pero según veo, sería una cosa asi:
L = numero de cursos.
M = numero de asignaturas.
y suponiendo que las clasificaciones son int
int *p = (int *)malloc (K*L*M);
aunque esta es una manera sucia, lo mejor es hacer esto pero adicionandole un nuvo vector al sebgundo creado... nada facil para un principiante.:
http://teleportmedia.com/foro/viewtopic.php?t=223 (http://teleportmedia.com/foro/viewtopic.php?t=223)
pues asi como lo haces no..Pero al ser una matriz tridimensional no se deben usar punteros triples?. Por favor, cuando puedas me lo aclaras, porque a mi me habian dicho que era con puntero triple. Gracias.
asi:Código: Text
float *M; M =(float*) malloc(a*b*c*sizeof(float));
ya asi el resto depende de como lo uses...
debes tener cuidado en no superar los limites de la matriz.
La pregunta era sobre una "matriz dinamica tridemnsional",Te agradezco tu ayuda Noel,pero insisto mi practica es en lenguaje C, no en lenguaje C++,ydebo manejar una matriz dinamica tridimensional, en C.
por eso vuelvo a mi propuesta original.
Por supuesto, si la matriz es estatica, el problema es completamente trivial y puede resolvers perfectamente como dice el Sr. Ingeniero.
Como ejemplo, te envio un ejemplo de como manipular una matriza dinamica, llenarla de valores consecutivos y exponerla en la pantalla.
Exito ! ! !
// program matrix.cpp
// matriz dinamica tridimencional.
// written in Borland C++ - ver 4.5
#include <iomanip.h>
#include <iomanip.h>
int GetDim(char x)
{
int dim = -1;
while(dim <= 0)
{
cout << x << " = ";
cin >> dim;
}
return dim;
} // GET DIM
void Init(int *a,int K,int L,int M)
{
int counter = 0;
for(int i = 0;i < K;i++)
for(int j = 0;j < L;j++)
for(int k = 0;k < M;k++)
a[L*M*i + M*j + k] = counter++;
} // INIT
void Show(int *a,int K,int L,int M)
{
for(int i = 0;i < K;i++)
{
for(int j = 0;j < L;j++)
{
for(int k = 0;k < M;k++)
cout << setw(5) << a[L*M*i + M*j + k];
cout << endl;
}
cout << endl << endl;
}
cout << endl << endl;
} // SHOW
void main()
{
int K = GetDim('K'),
L = GetDim('L'),
M = GetDim('M');
cout << endl;
int *a = new int[K*L*M];
Init(a,K,L,M);
Show(a,K,L,M);
cout << "end of program - good bye ! ! !" << endl;
delete []a;
} // MAIN
de la froma en como te mostre en el link de la pagina de teleport media esta hecho con puntero doble para hacer una matriz bidimensional,Juank,la matriz que tengo que manejar,debe ser dinamica, por eso creo que lo que te puse del puntero triple,queria saber si estaba bien.Por eso,te pedi,si podia mirar el codigo,es q tengo poca idea,de esto,y necesito un empujon para empezar la practica,una vez sepa si defino bien,lamatriz, y como reservar memoria,entonces ya podre iniciarla.Al menos eso espero.De todos modos muchas gracias.
para hacer una matriz tridimencional con el metodo no 'cochino'
sera como esta en ese link pero con un puntero triple y asignando un nuevo vector a la segunda dimension del vactor.
no es nada facil..
trata de entender el codigo fuente de la matriz bidimensional creada dinamicamente (en el link que cocoloque arriba)y una vez lo hayas entendido intenta crear el de tres dimensiones.
AHhhhhhhhhhhhhhhhhhhhhhh :scream:
ahora que leo tu post completo me doy cuenta que en ningun momenmto dices que la matriz tiene que ser creada dinamicamente o si?
Lo que pasa es que me deje guiar por el post de Noel Solw que trata de explicar algo asi...
lo siento lo que hay que hacer es esto:Código: Text
K = numero de alumnos. L = numero de cursos. M = numero de asignaturas. float datos[K][L][M];
Lo siento te estaba complicando mucho la vida para algo tan sencillo.
la solucion que das no sirve por varias razones:Gracias por entenderlo,pero insisto,en el link q me has dicho viene matriz bidimensional,y yo necesito matriz tridimensional,con lo cual a la hora de reservar memoria,creo que sera diferente,vuelve a mirar por favor,el codigo,q escribi antes a ver si es correcto.Muchas gracias.
1- es lenguaje c++ y se requiere en c.
2- no estas creeando una matriz en ningun momento.
Solo estas creando un vector, lo que haces es a lo que yo
graciosamente llamo el metodo cochino, el cual es simular con un vector una
matriz.
3- Como bien se ha informado i82maria se necesita hacerlo con tres apuntadores
razon por la cual nuevamente tu solucion no sirve y se ratifica el punto nro 2.
4- Tu simulacion permite acceder a las coordenadas del vector de esta manera:Código: Textlo cual solo simula una matriz pero en ningun momento es tal, simplemente es un vector unidimensional.
cout << setw(5) << a[L*M*i + M*j + k];
si fuese una matriz, INCLUSO CREADA DINAMICAMENTE se accederia asi:
a[L][M][K]
que es como se observa en el link que he posteado, aunque solo se hace con matrices bidimensionales.
http://teleportmedia.com/foro/viewtopic.php?t=223 (http://teleportmedia.com/foro/viewtopic.php?t=223)Bueno gracias,de momento,voy a mirar de nuevo,el codigo q me dices de la matriz bidimensional,y una vez lo haya hecho te lo mando,para qe me digas si está bien.Para mi es muy importante conseguir hacer esta practica,y me gustaria mucho aprender,por eso estoy contenta desde que me apunté a este foro.Muchas gracias,por tu consejo,en cuanto lo tenga te lo mando.
revisa el link por favor..
solo si entiendes como hacer una matriz bidimensional dinamicamente podras intentar hacer una de tres dimeniones..
si aprendes y entiendes lo que esta en el link hacer en 3 dimensiones es pan comido.
Te podria hacer todo el codigo yo, y te garantizo que no me tardaria mas de 15 minutos siendo exagerado, pero no acostumbro a hacerlo, es mejor que aprendas con tu esfuerzo, porque si te dan todo el codigo hecho te garantizo que no aprenderas nada. :smartass:
ok..Hola juan,seria algo parecido,a esto:
por cierto que el codigo que colocaste antes no sirve.
vas mal :(
memset sirve para llenar un area de memoria con repeticiones de nu valor especifico.
mejor has un pequeño ejercicio con lo del vector bidimencional que te coloque en el post de teleport media y maneja solo alumnos y cursos...
una vez lo tengas hecho ampliale la funcionalidad a 3 dimensiones incluyendo materias.
fijate en el codigo del post.. va uno tras otro solo que lo separe para explicar cada parte.
sigue intentandolo animo!!!
Si queres el vector inicializado de esa forma podrias utilizar directamente cmalloc.Perdona, pero te insisto que la practica es en lenguaje C, con lo cual, no me vale en C++. De todos modos muchsa gracias.
int ***M;
int i, j;
int tamaño;
M=(int ***) malloc (tamaño);
for(i=0; i< tamaño; i++)
M=(int **) malloc(tamaño);
for(i=0; i< tamaño; i++)
for(j=0; j< tamaño; j++)
M[j]= (int *) malloc(tamaño);
necesito tu ayuda porfis y te lo agradecere muchoHola juank necesito tu ayuda sobre un programa de encriptacion de archivos, sabes se me esta dificultando el hacerlo ya que jamas habia hecho un programa sobre eso espero tu me puedas ayudar. :comp:
Hola la forma de hacr la matriz de 3 dimensiones seria algo asiGracias por tu respuesta, eres muy amable, me es de gran ayuda. Y ahora para acceder a ella, como lo haria?. Porque verás se trata de una matriz tridimensional que gestiona la calificacion de los alumnos que están en tres cursos lectivos, la primera dimensión se refiere a los alumnos(numero identificativo de los alumnos), la segunda representa el curso en el que están (1 a 3), y la tecera representa una asignatura concreta de las 5 posibles. Entonces me piden obtener la califiaciónd e cada alumnos, en cada curso y por cada asignatura.Citarint ***M;
int i, j;
int tamaño;
M=(int ***) malloc (tamaño);
for(i=0; i< tamaño; i++)
M=(int **) malloc(tamaño);
for(i=0; i< tamaño; i++)
for(j=0; j< tamaño; j++)
M[j]= (int *) malloc(tamaño);
y asi obtienes una matriz de tres dimensiones de tipo entero.
espero que te sirva.
HolaMuchas gracias, por todo lo que me stás ayudando, pero pasando a float, lo que me dijiste, la manera de reservar la matriz podria ser esta?.
float ***M;
int i, j, k;
int tamaño;
la forma de pedir memoria seria asiCódigo: Text
**M=(int *)malloc(sizeof(float)*i); for(j=0;j<i;j++) { *M[j]=(int *)malloc(sizeof(int)*d[j].numero_anyo); for(k=0;k<d[j].numero_anyo;k++) M[j][k]=(int*)malloc(sizeof(int)*5); }
donde i es la cantidad de alumnos
y para liberar la memoria seriaCódigo: Text
for(j=0;j<i;j++) { for(k=0;k<d[j].numero_anyo;k++) free(M[j][k]); free(*M[j]); } free(**M);
y para ver la nota de algun alumno
seria algo asi:
M[0][0][0]//la nota de la primera asignatura del primer periodo del primer alumno
M[5][2][3]//la nota de la cuarta asignatura del tercer periodo del sexto alumno
espero que esto te aclara algunas dudas
cualquier cosa estoy para servirte........
float ***M;
**M=(float *)malloc(sizeof(float)*i);
for(j=0;j<i;j++)
{
*M[j]=(float *)malloc(sizeof(float)*3);
for(k=0;k<d[j].numero_anyo;k++)
M[j][k]=(float*)malloc(sizeof(float)*5);
}
Gracias por tu ayuda eres un cielo.Citarfloat ***M;
**M=(float *)malloc(sizeof(float)*i);
for(j=0;j<i;j++)
{
*M[j]=(float *)malloc(sizeof(float)*3);
for(k=0;k<d[j].numero_anyo;k++)
M[j][k]=(float*)malloc(sizeof(float)*5);
}
i es la cantidad de alumnos
asi obtendrias una una matriz de M[3][5]
si fuesen 10 alumnos la matriz seria M[10][3][5]
espero que me entiendas, pones los * donde estan los que te mando yo....
espero que te sirva
Hola aqui estoy de nuevo, he tardado en contestarte, porque he estado muy liada con los examenes, veras aqui tengo el codigo entero de todo lo que tu me dijiste, pero no me compila bien.Por favor, si puedes ayudarme, necesito esta practica, para mi examen, tengo que comprenderla bien, y saberla hacer, y estoy super apurada.Porque me resulta de muy dificil comprension.Cita de: "Zholo"Gracias por tu ayuda eres un cielo.Citarfloat ***M;
**M=(float *)malloc(sizeof(float)*i);
for(j=0;j<i;j++)
{
*M[j]=(float *)malloc(sizeof(float)*3);
for(k=0;k<d[j].numero_anyo;k++)
M[j][k]=(float*)malloc(sizeof(float)*5);
}
i es la cantidad de alumnos
asi obtendrias una una matriz de M[3][5]
si fuesen 10 alumnos la matriz seria M[10][3][5]
espero que me entiendas, pones los * donde estan los que te mando yo....
espero que te sirva
Me está sirviendo de mucho.
Saludos Mercedes