Faça um programa que inicialmente os seguintes dados dos livros do acervo de uma biblioteca: código, quantidade de exemplares existentes e quantidade de exemplares emprestados. A seguir, o programa irá permitir que sejam efetuadas várias consultas da seguinte forma: o usuário informa o código do livro que deseja pedir emprestado e obtém como resposta:
a) busca: busca binária. Recebe como parâmetro um vetor de struct já preenchido e um código a ser procurado no vetor. Esta função irá retornar -1, caso o produto não seja encontrado ou a posição onde ele foi encontrado.
b) leitura: recebe como parâmetro um vetor de struct a ser preenchido. Esta função irá ler os dados de cada livro do acervo da biblioteca, armazenando-os no vetor de struct. Considere que existem no máximo 10000 livros diferentes no acervo da biblioteca.
i) Livro inexistente (caso não seja encontrado)
ii) Livro não disponível para empréstimo
iii) Livro disponível para empréstimo.
Término das consultas: código do livro que deseja pedir emprestado
=0. Faça as seguintes funções:

Passo 1

O problema pede para armazenar dados de até 10000 livros (cada um com código, quantidade de exemplares existentes e quantidade já emprestada), fazer buscas por código usando busca binária e responder às tentativas de empréstimo:
  • se o código não existe → “Livro inexistente”
  • se existe, mas nenhum exemplar disponível → “Livro não disponível para empréstimo”
  • se existe e há exemplar livre → incrementar emprestados e mostrar “Livro disponível para empréstimo”
    A consulta termina quando o usuário digita código 0. Vamos precisar de uma struct para livro, de uma função leitura que preenche o vetor (assumindo que os registros vêm já ordenados por código) e de uma função busca que retorna o índice ou -1.

Passo 2

Definimos a struct e os protótipos:
#include <stdio.h>
#define MAX 10000

typedef struct {
    int codigo;
    int existentes;
    int emprestados;
} Livro;

/* lê n livros (já ordenados por código) e retorna n */
int leitura(Livro vet[]);

/* busca binária em vet[0..n-1] pelo código; retorna índice ou -1 */
int busca(Livro vet[], int n, int codigo);

Passo 3

Implementamos a função leitura. Vamos ler primeiro um inteiro n com a quantidade de livros e depois, em um laço, cada tripla (codigo, existentes, emprestados):
int leitura(Livro vet[]) {
    int n, i;
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d %d %d",
              &vet[i].codigo,
              &vet[i].existentes,
              &vet[i].emprestados);
    }
    return n;
}

Passo 4

Implementamos a busca binária em vet[0..n-1]. Como o vetor está ordenado por codigo, repetimos até ini > fim:
int busca(Livro vet[], int n, int codigo) {
    int ini = 0, fim = n - 1, meio;
    while (ini <= fim) {
        meio = (ini + fim) / 2;
        if (vet[meio].codigo == codigo) {
            return meio;
        } else if (vet[meio].codigo < codigo) {
            ini = meio + 1;
        } else {
            fim = meio - 1;
        }
    }
    return -1;
}

Passo 5

No main, chamamos leitura para preencher o vetor, depois repetimos lendo cod até cod==0, fazemos a busca e tratamos os três casos:
int main() {
    Livro acervo[MAX];
    int n = leitura(acervo);
    int cod, pos;
    while (1) {
        scanf("%d", &cod);
        if (cod == 0) break;
        pos = busca(acervo, n, cod);
        if (pos < 0) {
            printf("Livro inexistente\n");
        } else if (acervo[pos].emprestados >= acervo[pos].existentes) {
            printf("Livro não disponível para empréstimo\n");
        } else {
            acervo[pos].emprestados++;
            printf("Livro disponível para empréstimo\n");
        }
    }
    return 0;
}

Resposta

#include <stdio.h>
#define MAX 10000

typedef struct {
    int codigo;
    int existentes;
    int emprestados;
} Livro;

int leitura(Livro vet[]) {
    int n, i;
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d %d %d",
              &vet[i].codigo,
              &vet[i].existentes,
              &vet[i].emprestados);
    }
    return n;
}

int busca(Livro vet[], int n, int codigo) {
    int ini = 0, fim = n - 1, meio;
    while (ini <= fim) {
        meio = (ini + fim) / 2;
        if (vet[meio].codigo == codigo) {
            return meio;
        } else if (vet[meio].codigo < codigo) {
            ini = meio + 1;
        } else {
            fim = meio - 1;
        }
    }
    return -1;
}

int main() {
    Livro acervo[MAX];
    int n = leitura(acervo);
    int cod, pos;
    while (1) {
        scanf("%d", &cod);
        if (cod == 0) break;
        pos = busca(acervo, n, cod);
        if (pos < 0) {
            printf("Livro inexistente\n");
        } else if (acervo[pos].emprestados >= acervo[pos].existentes) {
            printf("Livro não disponível para empréstimo\n");
        } else {
            acervo[pos].emprestados++;
            printf("Livro disponível para empréstimo\n");
        }
    }
    return 0;
}

Exercícios relacionados