Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: angelica24 en 20 Julio 2018, 23:01 PM

Título: ayuda con codigo (struct y arreglos)
Publicado por: angelica24 en 20 Julio 2018, 23:01 PM
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() {
}
Título: Re: ayuda con codigo (struct y arreglos)
Publicado por: engel lex en 20 Julio 2018, 23:09 PM
Hola modifiqué tu código con etiquetas GeSHi para que fuera más legible...



es bueno que empiezes indicando que errores te da
Título: Re: ayuda con codigo (struct y arreglos)
Publicado por: angelica24 en 21 Julio 2018, 00:04 AM
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
Título: Re: ayuda con codigo (struct y arreglos)
Publicado por: engel lex en 21 Julio 2018, 00:13 AM
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