Programación General > C/C++
Funcion Alta, estructuras.
nicksynm:
Holas,
Quise hacer una funcion alta para ingresar datos en el vector de estruturas pero no funciona, cuando uso la opcion 1 se va todo al ca-ra-jo. Y me quema la cabeza no saber que esta mal.
Pd: El programa no esta completo, si se finjan en el menu voy a extenderlo.
#include <stdio.h>
#include <string.h>
#pragma warning (disable:4996)
#define MAX 100
#define CANT 1000
typedef struct {
char nyap [MAX];
int doc;
struct {
int dia;
int mes;
int anio;
}fecha;
}treg;
int menu();
void opcion(int opc,int cant,treg agenda, FILE *arch);
void alta (treg agenda,int cant);
int main (){
FILE *arch;
treg agenda[CANT];
int opc=0, cant=0;
opc=menu(void);
opcion(opc,cant,agenda[CANT],arch);
return 0;
}
int menu (){
int op;
printf("nnn1- Alta personasn2- Baja personasn3- Verificar si el primer nombre es capicuan4- Imprimir datos personan5- Guardar persona en un archivon6- Modificar personan7- Ordenar por Apellidon8- SalirnnElija la Opcion desada:n");
scanf("%d",&op);
return op;
}
void opcion(int opc,int cant,treg agenda, FILE *arch){
while(opc!=8){
if(opc==1){
alta(agenda,cant);
}
opc=menu();
}
}
void alta (treg agenda, int cant){
int i;
while(cant<CANT || i!=-1){
puts("Nombre y Apellido:n");
gets(agenda.nyap);
printf("Numero de documento:n");
scanf("%d",agenda.doc);
printf("Fecha de Nacimiento:n");
printf("dia:n");
scanf("%d",agenda.fecha.dia);
printf("mes:n");
scanf("%d",agenda.fecha.mes);
printf("anio:n");
scanf("%d",agenda.fecha.anio);
printf("Presione 1 para continuar, o -1 para finalizarn");
scanf("%d",&i);
cant=cant+1;
}
}
betopin:
Varias cosas
1) Defines
--- Código: C ---int menu(); e invocas
--- Código: C ---opc=menu(void); Ese void sobra
2)En cuanto a tu funcion Opcion y el manejo de estructuras anidadas
Tu dices
--- Código: C --- void opcion(int opc,int cant,treg agenda, FILE *arch); int main (){ FILE *arch; treg agenda[CANT]; int opc=0, cant=0; opc=menu(); opcion(opc,cant,agenda[CANT],arch); return 0;}
tu estas aclarando que la variable principal del anidamiento de estructuras es agenda[cant] y luego invocas a opcion.
Aca tienes un primer error. Tu no puedes pasar un arreglo de estructuras atraves de una funcion de esa forma. Necesitas valerte de punteros.
Tu funcion podrias definirla asi
--- Código: C ---void opcion(int opc,int cant,treg *agenda, FILE *arch);
Y al invocar puedes hacer
--- Código: C ---opcion(opc,cant,&agenda[0],arch); ó opcion(opc,cant,agenda,arch); , da igual
3) Para el caso de la funcion alta pasa algo similar
Pero ya que estas trabajando con funciones anidades (desde opcion invocas a alta), aca tendras que redefinir tu funcion usando ahora otro puntero, pero esta ves doble.
Tu funcion podrias definirla asi
--- Código: C ---void alta (treg **agenda,int cant);
E invocarla asi
--- Código: C ---alta(&agenda,cant);
Y para capturar los datos puedes manipular este puntero doble como una simple matriz...en donde la fila 0 corresponde a toda la informacion de las estructuras anidadas y cada columna el indice de agenda, que asumo para eso usas la variable cant
Puedes entonces capturar tus datos asi:
En el caso de los campos de la estructura principal
--- Código: C ---puts("Nombre y Apellido:n"); gets(agenda[0][cant].nyap);
Y en el caso de os campos de la estructura anidada haces
--- Código: C ---printf("dia:n"); scanf("%d",&agenda[0][cant].fecha.dia);
Cuidado al capturar datos...debes tener presente el simbolo & cada que captures datos diferentes a cadenas de caracteres. Ese era otro error.
Realizando estas correcciones el codigo seria el siguiente
--- Código: C ---#include <stdio.h>#include <string.h>#define MAX 100#define CANT 1000 typedef struct { char nyap [MAX]; int doc; struct { int dia; int mes; int anio; }fecha;}treg; int menu();void opcion(int opc,int cant,treg *agenda, FILE *arch);void alta (treg **agenda,int cant);int main (){ FILE *arch; treg agenda[CANT]; int opc=0, cant=0; opc=menu(); opcion(opc,cant,agenda,arch); return 0;}int menu (){ int op; printf("nnn1- Alta personasn2- Baja personasn3- Verificar si el primer nombre es capicuan4- Imprimir datos personan5- Guardar persona en un archivon6- Modificar personan7- Ordenar por Apellidon8- SalirnnElija la Opcion desada:n"); scanf("%d",&op); return op; }void opcion(int opc,int cant,treg *agenda, FILE *arch){ while(opc!=8) { if(opc==1) { alta(&agenda,cant); } opc=menu(); }} void alta (treg **agenda, int cant){ int i; while(cant<CANT || i!=-1) { puts("Nombre y Apellido:n"); gets(agenda[0][cant].nyap); printf("Numero de documento:n"); scanf("%d",&agenda[0][cant].doc); printf("Fecha de Nacimiento:n"); printf("dia:n"); scanf("%d",&agenda[0][cant].fecha.dia); printf("mes:n"); scanf("%d",&agenda[0][cant].fecha.mes); printf("anio:n"); scanf("%d",&agenda[0][cant].fecha.anio); printf("Presione 1 para continuar, o -1 para finalizarn"); scanf("%d",&i); cant=cant+1; }}
Con esto compila perfectamente...la logica del codigo te la dejo a vos
S2
betopin:
Se me pasó otra cosa....cuidado con el uso de gets y el manejo del buffer de entrada de datos. Al realizar la captura de datos en la funcion Alta quiza necesites un getchar antes de capturar el nombre y el apellido....esto con el fin de liberar el buffer y no se te salte el codigo a solicitarte el documento
S2
Luciano9:
--- Código: C ---#include <stdio.h>#include <string.h>#pragma warning (disable:4996)#define MAX 100#define CANT 1000 typedef struct treg{int dia;int mes;int anio;char nyap [MAX];int doc; }; int menu();void opcion(int opc,int cant,treg agenda, FILE *arch);void alta (treg agenda,int cant); int main (){FILE *arch;treg agenda[5];int opc=0, cant=0; opc=menu(); opcion(opc,cant,agenda[CANT],arch); return 0;} int menu (){int op; printf("nnn1- Alta personasn2- Baja personasn3- Verificar si el primer nombre es capicuan4- Imprimir datos personan5- Guardar persona en un archivon6- Modificar personan7- Ordenar por Apellidon8- SalirnnElija la Opcion desada:n"); scanf("%d",&op); return op;} void opcion(int op,int cant,treg agenda, FILE *arch){ while(op!=8){ if(op==1){ alta(agenda,cant); }op=menu();} }void alta (treg agenda, int cant){int i; while(cant<CANT || i!=-1){ puts("Nombre y Apellido:n"); gets(agenda.nyap); printf("Numero de documento:n"); scanf("%d",agenda.doc); printf("Fecha de Nacimiento:n"); printf("dia:n"); scanf("%d",agenda.dia); printf("mes:n"); scanf("%d",agenda.mes); printf("anio:n"); scanf("%d",agenda.anio); printf("Presione 1 para continuar, o -1 para finalizarn"); scanf("%d",&i); cant=cant+1; } } Si te fijas, ahí compila... pero de todas formas la lógica no está funcionando muy bien que digamos.
No entiendo muy bien tu programa y no tengo mucho tiempo ahora, pero te doy un consejo. Identá bien las cosas y comentá un poco que hacen tus funciones ya que sino hay que ser un dios para entender lo que vos quisiste pensar!
Saludos espero que te sirva, ahora fijate como arreglarlo :P
betopin:
--- Cita de: "Luciano9" ---Si te fijas, ahí compila... pero de todas formas la lógica no está funcionando muy bien que digamos.
No entiendo muy bien tu programa y no tengo mucho tiempo ahora, pero te doy un consejo. Identá bien las cosas y comentá un poco que hacen tus funciones ya que sino hay que ser un dios para entender lo que vos quisiste pensar!
Saludos espero que te sirva, ahora fijate como arreglarlo :P
--- Fin de la cita ---
Creo que no leiste nada de lo que puse antes, jejeje....yo creo que si esta claro lo que quiere hacer...quiza lo que hace cansino el codigo es el uso de tantas funciones para algo que no da pa tanto y el hecho de que dentro de funciones llame a otras
S2
Navegación
[#] Página Siguiente
Ir a la versión completa