Saltar a contenido

Librer铆a b谩sica

Ejercicio de recapitulaci贸n

Soluci贸n al ejercicio de consolidaci贸n en LibrosIO. Contenidos relacionado con el programa:

El programa est谩 constitu铆do por dos archivos fuente (librosLab.c, util.c) y dos de cabecera (Libros.h y util.h). El ejecutable se obtendr谩 compilando y montando por separado (se recomienda escribir las 贸rdenes en un script bash)
En librosLab.c reside la funci贸n main desde la cual se invocan tres ejemplos:

  1. ej1Libros declara un libro, lo inicializa y lo muestra en pantalla
  2. ej2Libros inicializa y muestra libros invocando, respectivamente, las funciones iniLibro() y verLibro() en util.c para lo cual es necesario pasar un puntero al libro como argumento
  3. ej3Libros declara un array de 5 libros que inicializa y muestra como en el caso anterior

La figura siguiente muestra el resultado de la ejecuci贸n correspondiente a cada uno de los casos de prueba

LabLibros.png

Cabeceras del programa (.h)

Libros.h
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
/*
 * Libros.h
 *
 *  Created on: 29/11/2015
 *      Author: santiago
 *
 * Ver: https://www.tutorialspoint.com/cprogramming/c_structures.htm
 */

typedef struct Libros {
   int isbn;
   char titulo[50];
   char autor[50];
   char descripcion[100];
} Libro;

typedef Libro *ptrLibro;
util.h
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
/*
 * util.h
 *
 *  Created on: 29/11/2015
 *      Author: santiago
 */

#include "Libros.h"

void iniLibro (ptrLibro miLibro, int isbn, char *titulo, char *autor, char *descripcion);
void verLibro (ptrLibro miLibro);

C贸digo fuente (.c)

util.c
 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
/*
 * util.c
 *
 *  Created on: 29/11/2015
 *      Author: santiago
 */

#include <stdio.h>
#include <string.h>

#include "util.h"

/*
 * Definiciones. Cada funci贸n con su c贸digo
 */

/*
 * Inicializar el libro apuntado por miLibro. La memoria correspondiente se habr谩 reservado externamente
 * Como miLibro es un puntero se utiliza '->'
 */
void iniLibro (ptrLibro miLibro, int isbn, char *titulo, char *autor, char *descripcion) {

    miLibro->isbn = isbn;
    strcpy(miLibro->titulo, titulo);
    strcpy(miLibro->autor, autor);
    strcpy(miLibro->descripcion, descripcion);

}

/*
 * Visualizar el libro apuntado por miLibro. Nunca debe ser null
 */
void verLibro (ptrLibro miLibro) {

    printf("\tISBN: %d; T铆tulo: %s; Autor: %s; Descripci贸n: %s; miLibro: %p\n",
           miLibro->isbn, miLibro->autor, miLibro->titulo, miLibro->descripcion, (void *) miLibro);
}
librosLab.c
  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
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
 ============================================================================
 Name        : LibrosLab.c
 Author      : Santiago
 Version     :
 Description : C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "util.h"

/*
 * Ej1: declaraci贸n y definici贸n b谩sica
 */
void ej1Libros(void) {
    Libro ejLibro1;                 /* Se declaran un libro (Libro es un tipo struct) */

    printf("ej1Libros:\n");
    printf("----------\n");
    /* Inicializa ejLibro1 campo por campo. Usa '.' */
    ejLibro1.isbn = 56470887;
    strcpy(ejLibro1.titulo, "Programaci贸n en C");
    strcpy(ejLibro1.autor, "Pepito Grillo");
    strcpy(ejLibro1.descripcion, "Buena gu铆a de introducci贸n al C");

    /* Visualiza ejLibro1 campo por campo */
    printf("\tISBN del libro: %d\n", ejLibro1.isbn);
    printf("\tT铆tulo del libro: %s\n", ejLibro1.titulo);
    printf("\tAutor del libro: %s\n", ejLibro1.autor);
    printf("\tDescripci贸n del libro: %s\n", ejLibro1.descripcion);
}

/*
 * Ej2: Pasando punteros ptrLibro como argumentos de verLibro() e iniLIbro()
 */
void ej2Libros(void) {
    Libro ejLibro2;                 /* Se declaran un libro (Libro es un tipo struct) */
    ptrLibro dirLibro = &ejLibro2;  /* Se declara e inicializa dirLibro que apunta a ejLibro2 */

    memset(dirLibro, '\0', sizeof(Libro));    /* Inicializar siempre */

    printf("ej2Libros (1/2):\n");
    printf("----------------\n");

    verLibro(dirLibro);             /* Se invoca dirLibro pasando la direcci贸n (puntero) de ejLibro2 */

    printf("\nej2Libros (2/2):\n");
    printf("----------------\n");
    /* Como antes pero para inicializar */
    iniLibro(dirLibro, 123456, "Programaci贸n en Java", "Pepito Grillo", "Buena gu铆a de introducci贸n a Java");
    verLibro(dirLibro);
}

/*
 * Ej3: Array de 5 libros
 */
void ej3Libros(void) {
    Libro biblio[5];                /* Array de 5 libros */
    ptrLibro dirLibro = biblio;     /* Puntero a los libros en la biblio */
    char tit[10], aut[10], des[10];
    int i;

    memset(biblio, '\0', 5 * sizeof(Libro));  /* Inicializar siempre */

    printf("ej3Libros (1/2):\n");
    printf("----------------\n");


    for(i = 0; i < 5; i++)
        verLibro(biblio+i);             /* Se invoca verLibro pasando la direcci贸n (puntero) */

    printf("\nej3Libros (2/2):\n");
    printf("----------------\n");
    for(i = 0; i < 5; i++) {
        memset(tit, '\0', 10);
        sprintf(tit, "T铆t #%d", i+1);
        memset(aut, '\0', 10);
        sprintf(aut, "Aut #%d", i+1);
        memset(des, '\0', 10);
        sprintf(des, "Des #%d", i+1);
        iniLibro(dirLibro+i, i+1, tit, aut, des);
        verLibro(dirLibro+i);
    }
    printf("--- Libro #3 ---\n");
    verLibro(dirLibro+2);
    printf("--- Equivalente:\n");
    printf("\tISBN: %d; T铆tulo: %s; Autor: %s; Descripci贸n: %s\n",
            biblio[2].isbn, biblio[2].titulo, (dirLibro+2)->autor, (biblio+2)->descripcion);
}

int main(int argc, char * argv[]) {
    if (argc == 2) {
        switch(argv[1][0]) {
        case '1':
            ej1Libros();
            break;
        case '2':
            ej2Libros();
            break;
        case '3':
            ej3Libros();
            break;
        default:
            printf("Par谩metro incorrecto. No hace nada\n");
        }
    }
    else
        printf("Par谩metros incorrectos. No hace nada\n");
    return 0;
}