Considere que você é um freelancer desenvolvedor de sistemas desktop. Para iniciar seu portfólio, você decide testar uma ideia de sistema para bibliotecas. Assim, você resolve que criará um programa como Prova de Conceito para validar suas ideias e também para poder mostrar para seus possíveis clientes. Dessa forma, seu programa, em versão beta (versão de testes), deverá permitir armazenar o cadastro de, no máximo, 5 (cinco) livros por vez (por execução do programa).
Para cada livro, a aplicação deverá armazenar as seguintes informações:
* Um código único, gerado automaticamente pelo sistema;
* O nome dos autores da obra;
* O nome da obra;
* O nome da editora.
O programa deverá apresentar um menu de opções ao usuário:
1 – Inserir um novo cadastro: ao selecionar essa opção, o usuário deverá ser capaz de informar todos os dados de um livro. A saber: seu nome, os autores, e o nome da editora; o código do cadastro não deve ser informado pelo usuário pois o programa deve gerar automaticamente. Caso o programa já tenha armazenado o número máximo de livros (cinco), deverá ser exibida uma mensagem de erro: “Sistema de cadastro lotado. Não é possível armazenar mais informações!”. O código de um cadastro deve ser preenchido automaticamente pelo sistema e o usuário não deve ter a opção de alterar esse código. É importante salientar que para cada cadastro, deve-se ter um código distinto, ou seja, não deve ser possível que existam dois cadastros com o mesmo código, ao mesmo tempo;
2 – Mostrar todos os cadastros: ao selecionar essa opção, o programa deverá imprimir, na tela, para cada livro, seu código, seu nome, os autores e a editora. Essa opção deverá mostrar na tela apenas os dados de livros que foram cadastrados. Caso seja impressa alguma outra informação sobressalente, ou caso faltem informações previamente cadastradas, será considerado um erro de programação. Caso nenhum cliente tenha sido cadastrado, antes de tentar executar essa opção (2 - Mostrar todos os cadastros), o programa deve exibir a mensagem “Lista vazia!”;
0 – Encerrar: o programa deve ser encerrado se, e somente se, o usuário escolher essa opção.
Observações importantes:
Sempre que o usuário desejar executar as opção 1 ou 2 (exceto 0), o programa deve realizar o que é pedido no enunciado e, logo após isso, o programa deve retornar ao menu, dando ao usuário a possibilidade de executar novamente alguma das opções listadas no menu.
Caso o usuário escolha uma opção que não conste no menu, o programa deverá exibir uma mensagem de erro como, por exemplo, “Erro: opção inválida!”; retornando ao menu logo em seguida. Caso contrário, o programa não deverá imprimir essa mensagem de erro, ou seja, se o usuário tentar executar as opções 0, 1 ou 2, o programa não entra em estado de erro.
A sua atividade MAPA deve ser entregue em um arquivo de código-fonte em linguagem C (extensão .c ou .cpp).
Algumas funções que serão úteis durante o desenvolvimento do programa:
* system(“pause”) – chamada de sistema que “pausa” o programa e o faz aguardar pelo usuário;
* system(“cls”) – chamada de sistema que limpa os caracteres que foram impressos na tela anteriormente;
* fflush(stdin) – limpar o buffer do teclado. Essa função deve sempre ser utilizada após ter utilizado alguma função de entrada de dados como o scanf(), gets(), etc. Isso se dá pois em algumas situações o buffer do teclado mantém “lixo de memória”, prejudicando a próxima operação de entrada do programa.
Respostas
Olá, como devemos armazenar várias informações para um único objeto é recomendável fazer uso de struct.
A struct é uma variável especial que contém diversas outras variáveis normalmente de tipos diferentes, ou seja, podemos criar uma struct para livro e nela armazenar o código (inteiro), nome dos autores, obra e editora (strings), pois todas essas variáveis são referentes à variável livro apesar de possuírem tipos diferentes. As variáveis internas contidas pela struct são denominadas membros da struct.
Como o código funcionará com base na opção escolhida em um menu, utilizaremos o switch ... case. Poderíamos utilizar vários ifs aninhados, mas o switch tornará o código mais elegante e eficiente. O switch testará vários casos com base na opção escolhida e executará as linhas dentro do caso considerado verdadeiro.
Queremos que esse menu apareça mais de uma vez e, por isso, estaremos colocando o switch dentro de um laço de repetição, o while.
Utilizaremos também a função fgets pois ela limita o buffer de leitura, evitando que trabalhemos com lixo, assim não precisaremos utilizar a fflush.
Como a opção do menu é só um caractere, utilizaremos a getchar.
Lembrando que o \n significa uma quebra de linha.
Quanto a limpeza da tela, caso você utilize o windows (como eu) deverá utilizar o system ("cls"), como está implementado no código. Porém, se for utilizar esse código no linux, deverá ser system ("clear").
A implementação do que foi explicado aqui se encontra abaixo:
struct Livro {
int codigo;
char nomeobra[100];
char nomeeditora[100];
};
int main() {
struct Livro lista[5];
int opcao = -1;
int tamanho_lista = 0;
while(opcao != 0) {
system("clear || cls");
printf("Escolha uma opção: \n\n
1- Inserir um novo cadastro \n
2- Mostrar todos os cadastros \n
0- Encerrar programa \n\n");
scanf("%d", &opcao);
getchar( );
switch (opcao) {
case 1:
system("cls");
if (tamanho_lista < 5) {
printf ("Digite o nome do livro: ");
fgets (lista[tamanho_lista].nomeobra, 100, stdin);
printf ("Digite o nome da editora: ");
fget s(lista[tamanho_lista].nomeeditora, 100, stdin);
lista [tamanho_lista].codigo = tamanho_lista + 1;
printf ("Livro inserido. Pressione qualquer tecla para continuar");
getchar();
tamanho_lista++;
} else {
printf("A lista está cheia. Pressione qualquer tecla para continuar");
getchar( );
}
break;
case 2:
system("cls");
if (tamanho_lista == 0) {
printf("Lista vazia. Pressione qualquer tecla para continuar");
getchar( );
break;
}
for (int i = 0; i < tamanho_lista; i++) {
printf ("Livro %d \nNome: %sEditora: %s\n", lista[i].codigo, lista[i].nomeobra, lista[i].nomeeditora);
}
printf ("Pressione qualquer tecla para continuar");
getchar( );
break;
case 0:
printf ("Programa encerrado!\n");
return 0;
default:
printf("Opção inválida. Tente novamente.\nPressione qualquer tecla para continuar\n");
getchar( );
break;
}
}
return 0;
}
Espero ter ajudado.