Dev - C++ - [Consulta]]Estructura dinamica usando punteros

 
Vista:
sin imagen de perfil

[Consulta]]Estructura dinamica usando punteros

Publicado por fernando (5 intervenciones) el 06/12/2014 03:20:54
Hola que tal chicos tengo una duda, no me esta andando el programa como lo estoy tratando de hacer, tengo estas dos estructuras: esto seria como una agenda para el profesor, donde èl carga su nombre,apellido, nombre de materia y cantidad de alumnos (y en base a esto son la cantidad de "estructuras alumnos" que tiene guardarse en la memoria),
typedef struct alumnos
{ char nombre[15];
char apellido[15],estado;
int dni;
float notas[3],promedio;


};
typedef struct agenda
{char nombre[15];
char apellido [15];
char materia[50];
alumnos registro[];
};
trate de hacer un puntero de tipo alumnos *pt; y dsp de inicializarlo pt=alumnos registro; para luego pedir un numero entero N y decir pt=new alumnos [N]; pero no me funca, estoy haciendo algo mal y no me doy cuenta, espero alguna respuesta, saludos y desde ya gracias!, cualquier cosa les adjunto el .cpp
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

[Consulta]]Estructura dinamica usando punteros

Publicado por vangodp (287 intervenciones) el 06/12/2014 15:02:06
Eso es lo que buscas?
http://codepad.org/IJZWFV5n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
//#include <exception>
#include <new>          // std::bad_alloc
#include <windows.h>
using namespace std;
 
struct Alumnos {
    char nombre[15];
    char apellido[15], estado;
    int dni;
    float notas[3], promedio;
};
 
//agenda para el profesor
struct Agenda {
    char nombre[15];
    char apellido [15];
    char materia[50];
    //alumnos registro[]; <-Esto esta mal. Debes indicar siempre un tamaño si no lo haces de forma dinamica.
};
 
int main () {
    Agenda *pAgenda = NULL; //Eso declara el puntero
    int N = 2;  // N lo pides aqui. Yo lo puse 2 solo para probar
 
    try { //control de errores
        pAgenda = new Agenda[N];
 
    } catch ( std::bad_alloc& ba ) { //si hay un error obtenemos el error
        cout << "Imposible asignar espacio. Error: " << ba.what() << endl; //avisamos el error
        exit ( -1 );                   // salimos con error
    }
    //si pasamos de aqui ya tenemos la memoria asignada
 
    //probamos guardar cosas
    strcpy(pAgenda[0].nombre, "Charlie");
    strcpy(pAgenda[1].nombre, "Pepe");
 
    //y probamos imprimir
    cout << pAgenda[0].nombre << endl;
    cout << pAgenda[1].nombre << endl;
 
    delete[] pAgenda; // muy importante para no haber fugas de memoria
    pAgenda = NULL;  // Buena practica es establecer el puntero a nulo para que no apunte a la direccion ninguna para no cometer errores. Es opcional
 
    cin.ignore();
    return 0;
}
Es bueno leer estos enlaces:
http://www.zator.com/Cpp/E4_9_20.htm
http://www.zator.com/Cpp/E4_9_20c.htm
http://www.cplusplus.com/reference/new/bad_alloc/
http://www.cplusplus.com/reference/new/operator%20new%5B%5D/
http://c.conclase.net/curso/?cap=013b

Si necesitas algo mas sigue preguntando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

[Consulta]]Estructura dinamica usando punteros

Publicado por fernando (5 intervenciones) el 06/12/2014 17:08:28
Hola que tal, gracias por responder, lo que busco es que la estructura alumnos sea el arreglo digamos, vos hiciste arreglo de estructura a la de tipo "agenda", yo necesito que la cantidad digamos se guarde en la de agenda , como que quede en la estructura profesor : nombre,apellido.su curso, y la cantidad de alumnos, luego en la estructura de alumnos se van a cargar los datos de c/u teniendo en cuenta esa cantidad de alumnos, y la estructura de alumnos està dentro de la de agenda, por eso se me habia ocurrido
agenda {
alumnos registro[] // esto decis que no es valido usando memoria dinamica??
}
no se si me explico??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

[Consulta]]Estructura dinamica usando punteros

Publicado por vangodp (287 intervenciones) el 06/12/2014 19:34:35
A ver si es eso. ¿Necesitas que el arreglo de tipo Alumnos que esta dentro de agenda sea reservado dinamicamente con N alumnos? Eso es lo que he entendido.
Si es correcto lo que dije antes aqui va:
http://codepad.org/y6YdFU0Z
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
//#include <exception>
#include <new>          // std::bad_alloc
#include <windows.h>
using namespace std;
 
struct Alumnos {
    char nombre[15];
    char apellido[15], estado;
    int dni;
    float notas[3], promedio;
};
 
//agenda para el profesor
struct Agenda {
    char nombre[15];
    char apellido [15];
    char materia[50];
    Alumnos * registro;
};
 
int main () {
    Agenda agenda;
    int N = 2;
 
    try { //control de errores
        agenda.registro = new Alumnos[N];
 
    } catch ( std::bad_alloc& ba ) { //si hay un error obtenemos el error
        cout << "Imposible asignar espacio. Error: " << ba.what() << endl; //avisamos el error
        exit ( -1 );                   // salimos con error
    }
    //si pasamos de aqui ya tenemos la memoria asignada
 
    //probamos guardar cosas
    strcpy(agenda.registro[0].nombre, "Charlie");
    strcpy(agenda.registro[1].nombre, "Pepe");
 
    //y probamos imprimir
    cout << agenda.registro[0].nombre << endl;
    cout << agenda.registro[1].nombre << endl;
 
    delete[] agenda.registro; // muy importante para no haber fugas de memoria
    agenda.registro = NULL;  // Buena practica es establecer el puntero a nulo para que no apunte a la direccion ninguna para no cometer errores. Es opcional
 
    cin.ignore();
    return 0;
}
Si no es eso sigue preguntando XDD
http://stackoverflow.com/questions/8104946/dynamic-array-in-structure-with-consecutive-memory
http://stackoverflow.com/questions/21717677/initialize-dynamic-array-in-structure
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

[Consulta]]Estructura dinamica usando punteros

Publicado por fernando (5 intervenciones) el 06/12/2014 21:07:30
La parte de cargar datos dinàmicamente quedo de 10!! pero ahora el tema està al solicitar ordenar los datos, por apellido, por dni (eso andaba antes y ahora no) , estoy seguro que es porque el puntero queda en la ultima posición y no vuelve al principio para poder ordenar y entonces crashea el programa, probe poniendo libreta.registro = NULL, pero no funca, como hago para dejarlo en la posicion 0 de la estructura??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

[Consulta]]Estructura dinamica usando punteros

Publicado por vangodp (287 intervenciones) el 07/12/2014 04:12:58
a ver... Con lo ultimo, he creado un objeto tipo Agenda. Este objeto esta en la pila ya que no lo he creado de forma dinamica en el heap.
Como bien sabemos...Lo que tenemos dentro de agenda es un puntero que apunta a un objeto tipo Agenda que luego mas tarde es que hacemos que apunte a un arreglo de objetos del tipo Alumnos que es de N numeros.

Entonces tengo una sola agenda con un puntero tipo Alumnos que apunta a un arreglo de Alumnos que esta almacenado en el heap.
Realmente los alumnos no estan en la estructura, si no que lo que tenemos es una sola variable que apunta a una direccion en otra parte de la memoria.

Cuando hacemos agenda.registro[0].nombre estoy entrando en la unica agenda, accediendo a registro que esta almacenado en otra parte(en el heap) y accediendo a los N numeros de registro atravez del puntero.
debes jugar con agenda.registro[0], agenda.registro[1]... Dentro de cada agenda.registro[posicion] tenemos un juego de de variables del tipo Alumnos, char nombre[15], char apellido[15], estado, int dni, float notas[3], promedio.

si quieres ordenar los datos de los alumnos.
//para el primer objeto del tipo Alumno que esta en agenda
agenda.registro[0].nombre
agenda.registro[0].apellido
agenda.registro[0].dnin
agenda.registro[0].notas
agenda.registro[0].promedio

//para el segundo
agenda.registro[1].nombre
agenda.registro[1].apellido
agenda.registro[1].dnin
agenda.registro[1].notas
agenda.registro[1].promedio

....

es comparar agenda.registro[0].nombre con agenda.registro[1].nombre y el que sea menor ponerlo arriba a la hora de mostrar.

Cuanto a como hacerlo me temo que en eso no te puedo ayudar mucho, ya que no suelo hacer muchas listas ordenadas.

Buscar metodos de ordenamiento. Aqui tienes ejemplos de metodos de ordenamiento: https://saforas.wordpress.com/2008/01/06/metodos-de-ordenamiento-hecho-en-c/

Si usaras la clase vector en vez de un arreglo... Tiene un metodo de ordenamiento muy a mano: http://www.cplusplus.com/articles/NhA0RXSz/

Te dejo algo echo. Pero tiene algunos peros.
Debes o bien usar la primera letra en mayuscula o bien en minuscula. Si compara Marcus comp con marcus no son iguales y una va estar primero siempre.
Haga algun sistema que mire la primera letra si es mayuscula y las demas minusculas y avise el usuario para que introduzca un nombre valido antes de guardar.

http://codepad.org/mekYAdU6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <new>          // std::bad_alloc
using namespace std;
 
struct Alumnos {
    char nombre[15];
    char apellido[15], estado;
    int dni;
    float notas[3], promedio;
};
 
//agenda para el profesor
struct Agenda {
    char nombre[15];
    char apellido [15];
    char materia[50];
    Alumnos * registro;
};
 
int main () {
    Agenda agenda;
    int N = 10;
    Alumnos aux;
    try { //control de errores
        agenda.registro = new Alumnos[N];
 
    } catch ( std::bad_alloc& ba ) { //si hay un error obtenemos el error
        cout << "Imposible asignar espacio. Error: " << ba.what() << endl; //avisamos el error
        exit ( -1 );                   // salimos con error
    }
    //si pasamos de aqui ya tenemos la memoria asignada
 
    //probamos guardar 10 nombres para ordenarlos
    strcpy(agenda.registro[0].nombre, "Pepe");
    strcpy(agenda.registro[1].nombre, "Charlie");
    strcpy(agenda.registro[2].nombre, "Manuel");
    strcpy(agenda.registro[3].nombre, "Elena");
    strcpy(agenda.registro[4].nombre, "Wilian");
    strcpy(agenda.registro[5].nombre, "Marcus");
    strcpy(agenda.registro[6].nombre, "Samantha");
    strcpy(agenda.registro[7].nombre, "Flavia");
    strcpy(agenda.registro[8].nombre, "Ramirez");
    strcpy(agenda.registro[9].nombre, "Raul");
 
 
    int i;
    //Mostramos desordenados        
    cout << "\n\n Desordenados.\n\n";
    for ( i = 0; i < N; i++ )
        cout << "Nombre: " << agenda.registro[i].nombre+0 << endl;
 
    //Ordenamos los nombres      
    for ( i = 0; i < N; i++ ){
        for ( int j = i + 1; j < N; j++ ){
            // si la primera cadena es mayor que la segunda hacemos un cambio
            if ( strcoll ( agenda.registro[i].nombre, agenda.registro[j].nombre ) > 0 ) {  //strcoll() compara primero caracter de ambas cadenas. Si son iguales continua al segundo caracter de ambas cadenas, y lo repite hasta que uno de los 2 sea menor que otro, o hasta llegar al final y encontrar el caracter nul. strcoll ( 1ºcadena, 2ºcadena ) Valor de retorne es 0 si son iguales, un numero mayor si la primera cadena es mayor o un numero menor que cero que indica que la mayor es la segunda cadena  
                strcpy ( aux.nombre, agenda.registro[i].nombre );
 
                strcpy ( agenda.registro[i].nombre, agenda.registro[j].nombre );
                strcpy ( agenda.registro[j].nombre, aux.nombre );
            }
        }
    }
 
    //Mostramos ordenados    
    cout << "\n\n Ordenados.\n\n";
    for ( i = 0; i < N; i++ )
        cout << "Nombre: " << agenda.registro[i].nombre+0 << endl;
 
 
    //Liberamos memoria
    delete[] agenda.registro; // muy importante para no haber fugas de memoria
    agenda.registro = NULL;  // Buena practica es establecer el puntero a nulo para que no apunte a la direccion ninguna para no cometer errores. Es opcional
 
    cin.ignore();
    return 0;
}

Si necesitas saber mas sobre strcoll: http://www.cplusplus.com/reference/cstring/strcoll/
Al pie de la pagina tienes 2 o 3 funciones mas que a lo mejor te sirven para algo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

[Consulta]]Estructura dinamica usando punteros

Publicado por fernando (5 intervenciones) el 07/12/2014 07:31:48
Hola que tal, el ordenamiento ya lo tenia yo y andaba lo mas bien, usando burbujeo mejorado, en eso no tengo problema, el tema esta en que ahora al usar punteros cuando termino de cargar los datos, el puntero queda apuntando a la ultima posicion y a la hora de ordenar imprime basura porque el puntero no empieza desde el inicio, me faltaria poner el puntero devuelta en la posicion 0
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

[Consulta]]Estructura dinamica usando punteros

Publicado por vangodp (287 intervenciones) el 07/12/2014 12:50:21
Sin ver tu código no va ser posible ayudarte. No se a que puntero te refieres.
Pega el codigo al codepad y te echare un ojo. Comentalo y ponla aqui.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

[Consulta]]Estructura dinamica usando punteros

Publicado por fernando (5 intervenciones) el 07/12/2014 18:31:28
ah okas acà te dejo el.rar con el archivo .cpp adentro, espero que me entiendas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

[Consulta]]Estructura dinamica usando punteros

Publicado por vangodp (287 intervenciones) el 12/12/2014 06:38:16
si... Perdona la tardanza, no vi el mensaje.
Efectivamente, el puntero apunta a la estructura que estaba cargada en la memoria. El caso es que cuando abres el programa la estructura ya no esta en esa parte de la memoria que apuntada el puntero.
Lo mejor sera crear un objeto dentro de la estructura misma y forzar que se guarde en el fichero como parte de la misma estructura.
Voy a ver que solución le damos a eso. Ya te aviso si encuentro el modo correcto y aun estés interesado en hacerlo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

[Consulta]]Estructura dinamica usando punteros

Publicado por fernando (1 intervención) el 12/12/2014 23:37:01
dale perfecto , espero respuesta entonces
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar