Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Inscripcion Matrices dinamicas

Estas en el tema de Inscripcion Matrices dinamicas en el foro de C/C++ en Foros del Web. Saludos, Tengo el siguiente Codigo, el problema es que no funciona!... No se si sera la forma en la cual inicializo las matrices o las ...
  #1 (permalink)  
Antiguo 03/12/2011, 08:26
 
Fecha de Ingreso: enero-2011
Mensajes: 33
Antigüedad: 13 años, 10 meses
Puntos: 0
Inscripcion Matrices dinamicas

Saludos, Tengo el siguiente Codigo, el problema es que no funciona!... No se si sera la forma en la cual inicializo las matrices o las aumento, espero me ayuden, Saludos!


Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio2.h>
  4. #define p printf
  5. #define s scanf
  6.  
  7. int i,cont=0,op,j=0;
  8. char opc='N';
  9.  
  10.  
  11. struct primaria{
  12. char** nomalu;
  13. char** nompa;
  14. char** cedula;
  15. char** telefono;
  16. char* sexo;
  17. }pri;


Código C:
Ver original
  1. void inscripcion(){
  2. do{
  3. clrscr();
  4. gotoxy(20,1);p("Inscripciones del Colegio Santa maria");
  5. gotoxy(20,2);p("Donde la grandeza se siente\n\n");
  6. fflush(stdin);
  7. p("Introduzca nombre del alumno:\n");
  8. gets(pri.nomalu[cont]);
  9. fflush(stdin);
  10. p("Introduzca nombre del Representante:\n");
  11. gets(pri.nompa[cont]);
  12. fflush(stdin);
  13. p("Introduzca Cedula:\n");
  14. gets(pri.cedula[cont]);
  15. fflush(stdin);
  16. p("Introduzca Telefono:\n");
  17. gets(pri.telefono[cont]);
  18. fflush(stdin);
  19. p("Sexo del representado[M/F]\n");
  20. pri.sexo[cont]=toupper(getchar());
  21. fflush(stdin);
  22. aumentar();
  23. p("Realizar Otra Inscripcion?[S/N]\n");
  24. opc=toupper(getch());
  25. }while(opc=='S');
  26. cont++;
  27. main();
  28. }

Código C:
Ver original
  1. void ver(){
  2. clrscr();
  3. for(i=0;i<cont;i++){
  4. p("Nombre: %s\nNombre Del representante: %s\nCedula: %s\nTelefono: %s\nSexo: %c\n\n", pri.nomalu[i],pri.nompa[i],pri.cedula[i],pri.telefono[i],pri.sexo[i]);
  5. }
  6. }

Código C:
Ver original
  1. void inicializar(){
  2. for(i=0;i<2;i++){
  3. pri.nomalu=(char*)malloc(2*sizeof(char));
  4. pri.nomalu[i]=(char*)malloc(20*sizeof(char));
  5. pri.nompa=(char*)malloc(2*sizeof(char));
  6. pri.nompa[i] = (char *) malloc(20*sizeof(char));
  7. pri.cedula=(char*)malloc(2*sizeof(char));
  8. pri.cedula[i] = (char *) malloc(2*sizeof(char));
  9. pri.telefono=(char*)malloc(20*sizeof(char));
  10. pri.telefono[i] = (char *) malloc(20*sizeof(char));
  11. pri.sexo=(char*)malloc(2*sizeof(char));
  12. }}
Código C:
Ver original
  1. aumentar(){
  2. j++;
  3. pri.nomalu=(char*)realloc(pri.nomalu,1*sizeof(char));
  4. pri.nomalu[j]=(char*)malloc(20*sizeof(char));
  5. pri.nompa=(char*)realloc(pri.nompa,1*sizeof(char));
  6. pri.nompa[j] = (char *) malloc(20*sizeof(char));
  7. pri.cedula=(char*)realloc(pri.cedula,1*sizeof(char));
  8. pri.cedula[j] = (char *) malloc(20*sizeof(char));
  9. pri.telefono=(char*)realloc(pri.telefono,1*sizeof(char));
  10. pri.telefono[j] = (char *) malloc(20*sizeof(char));
  11. pri.sexo=(char*)realloc(pri.sexo,1*sizeof(char));
  12. }


Código C:
Ver original
  1. main(){
  2. clrscr();
  3. inicializar();
  4.     do{
  5. gotoxy(20,1);p("Bienvenido Al colegio Santa maria");
  6. gotoxy(20,2);p("EsperemoInscripcion Matrices dinamicass tenga un grandiso dia");
  7. gotoxy(20,6);p("1. Realizar Inscripcion");
  8. gotoxy(20,7);p("2. Ver Alumnos Inscritos");
  9. gotoxy(20,8);p("3. Salir");
  10. gotoxy(20,9);p("Opcion:   ");
  11.  
  12. s("%d", &op);
  13. switch(op){
  14.     case 1:{
  15.     inscripcion();
  16.     }break;
  17.     case 2:{
  18.     ver();
  19.     }break;
  20. }
  21.  
  22.  
  23. }while(op=!3);
  24. }
  #2 (permalink)  
Antiguo 03/12/2011, 13:24
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: Inscripcion Matrices dinamicas

¡Tienes un lio montado!


Si defines una variable como char ** luego no puedes asignarlo un puntero a char *, tiene que ser a char**.

Para definir una matriz multidimensional tienes que hacerlo así:


Código C++:
Ver original
  1. char ** matriz = (char **)malloc(NUMERO_FILAS*sizeof(char *));
  2. int contador=0;
  3. for( contador=0;contador<NUMERO_FILAS;contador++){
  4. matriz[contador] = (char*)malloc(NUMERO_COLUMNAS*sizeof(char));
  5. }

Fíjate que en como está creada la matriz, en la primera instrucción declaras un array de NUMERO_FILAS punteros (son punteros a char, es decir, char *).
  #3 (permalink)  
Antiguo 03/12/2011, 20:25
 
Fecha de Ingreso: enero-2011
Mensajes: 33
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Inscripcion Matrices dinamicas

Creo q entendi... En ese caso la funcion nueva para inicializar seria Asi:

Código C:
Ver original
  1. void inicializar(){
  2. pri.nomalu=(char**)malloc(filas*sizeof(char*));
  3. for(i=0;i<filas;i++){
  4. pri.nomalu[i]=(char*)malloc(columnas*sizeof(char));
  5. }
  6. pri.nompa=(char**)malloc(filas*sizeof(char*));
  7. for(i=0;i<filas;i++){
  8. pri.nompa[i] =(char *) malloc(columnas*sizeof(char));
  9. }
  10. pri.cedula=(char**)malloc(filas*sizeof(char*));
  11. for(i=0;i<filas;i++){
  12. pri.cedula[i] = (char *) malloc(columnas*sizeof(char));
  13. }
  14. pri.telefono=(char**)malloc(filas*sizeof(char*));
  15. for(i=0;i<filas;i++){
  16. pri.telefono[i] = (char *) malloc(columnas*sizeof(char));
  17. }
  18. pri.sexo=(char*)malloc(columnas*sizeof(char*));
  19. }

No me da error y el programa corre, me deja introducir los datos, pero a la hora de visualizarlos me sale cualquier Simbolo ASCII Aleatorio, me apuntarias en donde me equivoco?
  #4 (permalink)  
Antiguo 04/12/2011, 05:15
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: Inscripcion Matrices dinamicas

Primero, no has creado bien la matriz de sexo, sería:

Código C++:
Ver original
  1. pri.sexo=(char*)malloc(filas*sizeof(char));

Fíjate en el sizeof, se realiza sobre char, no sobre char * y tienes que poner filas, no columnas,

El problema creo que puede ser que no estás haciendo bien la asignación de memoria.

En el caso que tu quieres hacer (que es tener un array de cadenas de caracteres), filas se refiere al número de cadenas que tienes y columnas, al tamaño máximo de esas cadenas. Si no lo estás haciendo así está mal. Como en el código no especificas que es filas y que es columnas no te puedo decir si lo estás haciendo bien.

También podría ser que te estuviese saliendo de la memoria asignada al leer un dato (cuando usas gets, este no tiene en cuenta si lo que lee cabe dentro de la memoria reservada, y puede llegar a escribir en partes de la memoria que no han sido reservadas).

Podrían ser más cosas, pero primero mira lo que te indico arriba.

Saludos.
  #5 (permalink)  
Antiguo 04/12/2011, 07:11
 
Fecha de Ingreso: enero-2011
Mensajes: 33
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Inscripcion Matrices dinamicas

Vuelvo a postear mi codigo


Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio2.h>
  4. #define p printf
  5. #define s scanf
  6.  
  7. int i,cont=0,op,j=0,filas=30,columnas=30;
  8. char opc='N';
  9.  
  10.  
  11. struct primaria{
  12. char **nomalu;
  13. char** nompa;
  14. char** cedula;
  15. char** telefono;
  16. char* sexo;
  17. }pri;


Código C:
Ver original
  1. void inscripcion(){
  2. do{
  3. clrscr();
  4. gotoxy(20,1);p("Inscripciones del Colegio Santa maria");
  5. gotoxy(20,2);p("Donde la grandeza se siente\n\n");
  6. fflush(stdin);
  7. p("Introduzca nombre del alumno:\n");
  8. gets(pri.nomalu[cont]);
  9. fflush(stdin);
  10. p("Introduzca nombre del Representante:\n");
  11. gets(pri.nompa[cont]);
  12. fflush(stdin);
  13. p("Introduzca Cedula:\n");
  14. gets(pri.cedula[cont]);
  15. fflush(stdin);
  16. p("Introduzca Telefono:\n");
  17. gets(pri.telefono[cont]);
  18. fflush(stdin);
  19. p("Realizar Otra Inscripcion?[S/N]\n");
  20. opc=toupper(getch());
  21. cont++;
  22. }while(opc=='S');
  23. main();
  24. }

Código C:
Ver original
  1. void ver(){
  2. clrscr();
  3. for(i=0;i<cont;i++){
  4. p("Nombre: %s\nNombre Del representante: %s\nCedula: %s\nTelefono: %s\nSexo: %c\n\n", pri.nomalu[i],pri.nompa[i],pri.cedula[i],pri.telefono[i],pri.sexo[i]);
  5. }
  6. }

Código C:
Ver original
  1. void inicializar(){
  2. pri.nomalu=(char**)malloc(filas*sizeof(char*));
  3. for(i=0;i<filas;i++){
  4. pri.nomalu[i]=(char**)malloc(columnas*sizeof(char));
  5. }
  6. pri.nompa=(char**)malloc(filas*sizeof(char*));
  7. for(i=0;i<filas;i++){
  8. pri.nompa[i] =(char *) malloc(columnas*sizeof(char));
  9. }
  10. pri.cedula=(char**)malloc(filas*sizeof(char*));
  11. for(i=0;i<filas;i++){
  12. pri.cedula[i] = (char *) malloc(columnas*sizeof(char));
  13. }
  14. pri.telefono=(char**)malloc(filas*sizeof(char*));
  15. for(i=0;i<filas;i++){
  16. pri.telefono[i] = (char *) malloc(columnas*sizeof(char));
  17. }
  18. pri.sexo=(char*)malloc(filas*sizeof(char));
  19. }


Código C:
Ver original
  1. main(){
  2. clrscr();
  3. inicializar();
  4.     do{
  5. gotoxy(20,1);p("Bienvenido Al colegio Santa maria");
  6. gotoxy(20,2);p("EsperemoInscripcion Matrices dinamicass tenga un grandiso dia");
  7. gotoxy(20,6);p("1. Realizar Inscripcion");
  8. gotoxy(20,7);p("2. Ver Alumnos Inscritos");
  9. gotoxy(20,8);p("3. Salir");
  10. gotoxy(20,9);p("Opcion:   ");
  11.  
  12. s("%d", &op);
  13. switch(op){
  14.     case 1:{
  15.     inscripcion();
  16.     }break;
  17.     case 2:{
  18.     ver();
  19.     }break;
  20. }
  21.  
  22.  
  23. }while(op=!3);
  24. }

Esto es lo que me enseña a la hora de Mostrar los nombres:
  #6 (permalink)  
Antiguo 07/12/2011, 16:22
 
Fecha de Ingreso: enero-2011
Mensajes: 33
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Inscripcion Matrices dinamicas

Nadie que me Eche una Mano?...
Saludos!

Etiquetas: dinamicas, funcion, inscripcion, matrices, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 09:58.