hola, espero que me puedan ayudar, tengo que hacer un catalogo de libros con arreglos y struct, ya llevo algo pero cuando lo quiero probar me salen muchos errores, espero que me puedan ayudar
#include <stdio.h>
#include <stdlib.h>
struct tlibro{
char titulo[50];
char autor[50];
char editorial[30];
int no_edicion;
int anio_edicion;
char clasificacion[30];
long ISBN;
};
int i;
int opcion, n;
int main(int argc, char** argv) {
tlibro arreglo[100];
do {
opcion = menu();
switch (opcion) {
case 1: crear(arreglo, n);
break;case 2: eliminar();
break;
case 3: modificar();
break;
case 2: visualizar(arreglo, n);
break;
case 3: buscar(arreglo, n);
break;
default: printf("Esa opcion no existe\n");
}
}while(opcion!=6);
return (EXIT_SUCCESS);
}
void menu(int o){
printf("Seleccione una opcion:\n");
printf("1.-Generar un nuevo registro de libro\n");
printf("2.-Eliminar un registro de libro\n");
printf("3.-Modificar un registro de libro\n");
printf("4.-Visualizar todos los registros de libro\n");
printf("5.-Buscar un registro de libro(por ISBN)\n");
printf("6.-Terminar\n");
scanf("%d", &opcion);
}
void crear(tlibro libros[], int indice) {
for (i = 0; i < 100; i++) {
printf("Proporcione el titulo del libro: \n");
scanf("%[^n]", &libros[i].titulo);
printf("Proporcione el(los) nombre(s) del(los) autor(es)\n");
scanf("%[^n]", &libros[i].autor);
printf("Proporcione la editorial\n");
scanf("%[^n]", &libros[i].editorial);
printf("Proporcione el numero de edicion\n");
scanf("%d", &libros[i].no_edicion);
printf("Proporcione el año de edicion\n");
scanf("%d", &libros[i].anio_edicion);
printf("Proporcione la clasificacion(LCC)\n");
scanf("%[^n]", &libros[i].clasificacion);
printf("Proporcione el registro del libro(ISBN)\n");
scanf("%d", &libros[i].ISBN);
}
}
void visualizar(tlibro libros[], int indice) {
int j=0;
for(j=0; j<indice; j++){
printf("Libro %d:\n", j+1);
printf("%s\n", libros[j].titulo);
printf("%s\n", libros[j].autor);
printf("%s\n", libros[j].editorial);
printf("%d\n", libros[j].no_edicion);
printf("%d\n", libros[j].anio_edicion);
printf("%s\n", libros[j].clasificacion);
printf("%d\n", libros[j].ISBN);
}
}
void buscar(tlibro libros[], int indice) {
int i;
long ISBN;
printf("Indique el ISBN del libro a buscar: ");
scanf("%d", &ISBN);
for(i=0; i<indice; i++){
if(ISBN==libros[i].ISBN){
printf("Se encontro el libro cuyos datos son:\n");
printf("%s", libros[i].titulo);
printf("%s", libros[i].autor);
printf("%s", libros[i].editorial);
printf("%d", libros[i].no_edicion);
printf("%d", libros[i].anio_edicion);
printf("%s", libros[i].clasificacion);
printf("%d", libros[i].ISBN);
}
}
}
void eliminar() {
}
void modificar() {
}
Hola modifiqué tu código con etiquetas GeSHi para que fuera más legible...
es bueno que empiezes indicando que errores te da
Estos son los mensajes que genera:
ProgramaHector.c:29:18: warning: implicit declaration of function 'menu' is invalid in C99 [-Wimplicit-function-declaration]
opcion = menu();
^
ProgramaHector.c:31:21: warning: implicit declaration of function 'crear' is invalid in C99 [-Wimplicit-function-declaration]
case 1: crear(arreglo, n);
^
ProgramaHector.c:39:21: warning: implicit declaration of function 'visualizar' is invalid in C99 [-Wimplicit-function-declaration]
case 2: visualizar(arreglo, n);
^
ProgramaHector.c:41:21: warning: implicit declaration of function 'buscar' is invalid in C99 [-Wimplicit-function-declaration]
case 3: buscar(arreglo, n);
^
ProgramaHector.c:53:6: error: conflicting types for 'menu'
void menu(){
^
ProgramaHector.c:29:18: note: previous implicit declaration is here
opcion = menu();
^
ProgramaHector.c:68:6: error: conflicting types for 'crear'
void crear(struct tlibro libros[], int indice) {
^
ProgramaHector.c:31:21: note: previous implicit declaration is here
case 1: crear(arreglo, n);
^
ProgramaHector.c:72:21: warning: format specifies type 'char *' but the argument has type 'char (*)[50]' [-Wformat]
scanf("%s", &libros[i].titulo);
~~ ^~~~~~~~~~~~~~~~~
ProgramaHector.c:74:21: warning: format specifies type 'char *' but the argument has type 'char (*)[50]' [-Wformat]
scanf("%s", &libros[i].autor);
~~ ^~~~~~~~~~~~~~~~
ProgramaHector.c:76:21: warning: format specifies type 'char *' but the argument has type 'char (*)[30]' [-Wformat]
scanf("%s", &libros[i].editorial);
~~ ^~~~~~~~~~~~~~~~~~~~
ProgramaHector.c:82:21: warning: format specifies type 'char *' but the argument has type 'char (*)[30]' [-Wformat]
scanf("%s", &libros[i].clasificacion);
~~ ^~~~~~~~~~~~~~~~~~~~~~~~
ProgramaHector.c:84:21: warning: format specifies type 'int *' but the argument has type 'long *' [-Wformat]
scanf("%d", &libros[i].ISBN);
~~ ^~~~~~~~~~~~~~~
%ld
ProgramaHector.c:96:6: error: conflicting types for 'visualizar'
void visualizar(struct tlibro libros[], int indice) {
^
ProgramaHector.c:39:21: note: previous implicit declaration is here
case 2: visualizar(arreglo, n);
^
ProgramaHector.c:108:24: warning: format specifies type 'int' but the argument has type 'long' [-Wformat]
printf("%d\n", libros[j].ISBN);
~~ ^~~~~~~~~~~~~~
%ld
ProgramaHector.c:115:6: error: conflicting types for 'buscar'
void buscar(struct tlibro libros[], int indice) {
^
ProgramaHector.c:41:21: note: previous implicit declaration is here
case 3: buscar(arreglo, n);
^
ProgramaHector.c:121:17: warning: format specifies type 'int *' but the argument has type 'long *' [-Wformat]
scanf("%d", &ISBN);
~~ ^~~~~
%ld
ProgramaHector.c:132:26: warning: format specifies type 'int' but the argument has type 'long' [-Wformat]
printf("%d", libros[i].ISBN);
~~ ^~~~~~~~~~~~~~
%ld
los errores Wformat los puedes ignorar mientras aprendes....
warning: implicit declaration of function 'menu' is invalid in C99 [-Wimplicit-function-declaration]
opcion = menu();
los primeros 4 son relacionados a la forma en que C lee el codigo... cuando lee el codigo imagina un cursor bajando linea a linea...
cuando llega a la linea 25
opcion = menu();
dará un error porque nunca ha leído ninguna función llamada "menu()"...
esto se resuelve de una de las 2 formas... o pones las declaraciones de las funciones antes de donde la vas a usar... o creas prototipos...
los prototipos es basicamente antes de main colocas la declaración de la funcion
void menu(int o);
así si el contenido y terminado en ";"
el siguiente error
ProgramaHector.c:53:6: error: conflicting types for 'menu'
void menu(){
^
ProgramaHector.c:29:18: note: previous implicit declaration is here
opcion = menu();
linea 25
opcion = menu();
y si vemos la linea 18
int opcion, n;
sin embargo menú
void menu(int o)
es decir, no hay coherencia... void no tiene retorno, sin embargo en linea 25 le dijiste a opción que tomara su valor de menú... error por donde se vea...
lo mismo con las otras funciones
probablemente una de las cosas más importante de programar es aprender a leer los errores