/* CRUD 2026-1 Para estudo do aluno... */
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "funcoes.h"
#include "pessoa.h"
#include "repositoriopessoa.h"
#include "persistirpessoa.h"
#include "app.h"
#include "pessoacrud.h"
int main(void) {
repositorioPessoa_t repositorioPessoas = criarRepositorioPessoa();
carregarRepositorioPessoa(&repositorioPessoas);
unsigned char opcaoPrincipal;
do {
opcaoPrincipal = menuPrincipal();
switch (opcaoPrincipal) {
case 1: { // Pessoas
unsigned char opcaoPessoa;
do {
opcaoPessoa = menuPessoa();
switch (opcaoPessoa) {
case 1:
limparTela();
listarRepositorioPessoas(repositorioPessoas);
pausa();
break;
case 2:
limparTela();
cadastrarPessoa(&repositorioPessoas);
break;
case 3:
limparTela();
alterarPessoa(&repositorioPessoas);
break;
case 4:
excluirPessoa(&repositorioPessoas);
break;
case 5:
limparTela();
if (!salvarRepositorioPessoa(repositorioPessoas)) {
printf("Erro ao salvar repositório!");
pausa();
break;
}
printf("\nRepositório salvo com sucesso!");
pausa();
break;
case 6:
limparTela();
carregarRepositorioPessoa(&repositorioPessoas);
printf("\nRepositório carregado com sucesso!");
pausa();
break;
case 7:
//salvarRepositorioPessoa(repositorioPessoas);
break;
}
} while (opcaoPessoa != 7);
}
break;
// mais opções do menu pra outros crus aqui!!!
case 2: // Sair
fim();
return 0;
}
} while (opcaoPrincipal != 2);
return 0;
}
#ifndef FUNCOES_H // proteção contra múltiplas inclusões
#define FUNCOES_H
//prototipos de funcoes top-down
void limparBuffer(void);
void cabecalho (char *);
void limparTela();
void pausa();
void fim();
#endif
#include "funcoes.h"
#include <stdio.h>
//corpo de funções
void limparBuffer (void) {
while (getchar() != '\n');
}
void cabecalho (char *oQue){
printf ("\n%s\n", oQue);
};
void fim(){
printf ("\n%s\n", "Fim de execucao!");
};
void limparTela() {
/* system("clear"); //ou
ANSI
033[2J = limpa a tela.
033[H = move o cursor para o canto superior esquerdo.
*/
printf("\033[2J\033[H");
}
void pausa() {
limparBuffer();
printf("\nPressione ENTER para continuar...");
getchar();
}
#ifndef PESSOA_H // proteção contra múltiplas inclusões
#define PESSOA_H
#define TAM_NOME 50
typedef struct pessoa {
//padding
unsigned long int idCpf; //*id da entidade
unsigned short int idade;
unsigned short int cadastroAtivo;
char nome [TAM_NOME];
} pessoa_t;
pessoa_t criarPessoa (unsigned long int cpf, char nome[TAM_NOME], unsigned short int idade);
void apresentarPessoa (pessoa_t pessoa);
#endif
#ifndef REPOSITORIOPESSOA_H // proteção contra múltiplas inclusões
#define REPOSITORIOPESSOA_H
#include "pessoa.h"
#define TAM 100
typedef struct repositorioPessoa {
//padding
pessoa_t pessoas [TAM];
unsigned short int indiceInsercao;
} repositorioPessoa_t;
repositorioPessoa_t criarRepositorioPessoa();
void listarRepositorioPessoas(repositorioPessoa_t repositorio);
void exibirPessoaPorIndice (unsigned short int indice, repositorioPessoa_t repositorio);
int excluirCadastroPessoa (unsigned long int cpf, repositorioPessoa_t *pessoas);
short int retornarIndicePorCpfPessoa (unsigned long int cpf, repositorioPessoa_t pessoas);
void ativarInativarCadastroPessoa (pessoa_t *pessoa, int situacaoCadastro);
int inserirPessoaNoRepositorio (pessoa_t pessoa, repositorioPessoa_t *repositorio);
int isRepositorioPessoaCheio (repositorioPessoa_t repositorio);
int isRepositorioVazio (repositorioPessoa_t repositorio);
int isCpfJaExistente (unsigned long int cpf, repositorioPessoa_t repositorio);
int alterarCpfPessoaNoIndice (unsigned short int indice, unsigned long int cpf, repositorioPessoa_t *repositorio);
int alterarNomePessoaNoIndice (unsigned short int indice, char nome[TAM_NOME], repositorioPessoa_t *repositorio);
int alterarIdadePessoaNoIndice (unsigned short int indice, unsigned short int idade, repositorioPessoa_t *repositorio);
#endif
#include "pessoa.h"
#include <stdio.h>
#include <string.h>
pessoa_t criarPessoa (unsigned long int cpf, char nome[TAM_NOME], unsigned short int idade){
pessoa_t pessoa = {
.idCpf = cpf,
.idade = idade,
.cadastroAtivo = 1
};
strcpy(pessoa.nome, nome);
return pessoa;
}
void apresentarPessoa (pessoa_t pessoa){
printf ("\nCpf: %li, Nome: %s, Idade: %d", pessoa.idCpf, pessoa.nome, pessoa.idade);
}
#include "pessoa.h"
#include "repositoriopessoa.h"
#include <stdio.h>
#include <string.h>
repositorioPessoa_t criarRepositorioPessoa(){
repositorioPessoa_t repositorio;
repositorio.indiceInsercao = 0;
return repositorio;
}
int isRepositorioVazio (repositorioPessoa_t repositorio) {
return repositorio.indiceInsercao == 0;
}
void listarRepositorioPessoas(repositorioPessoa_t repositorio) {
//SELECT * FROM PESSOAS
//Guardian clause
if (isRepositorioVazio(repositorio)){
printf ("\nRepositório Vazio!");
//Early return
return;
}
//Happy path
for (unsigned short int i ; i < repositorio.indiceInsercao; i++){
if (repositorio.pessoas[i].cadastroAtivo == 1) {
apresentarPessoa (repositorio.pessoas[i]);
}
}
}
short int retornarIndicePorCpfPessoa (unsigned long int cpf, repositorioPessoa_t repositorio){
//varredura O(n)
for (unsigned short int i = 0; i < repositorio.indiceInsercao; i++) {
if (cpf == repositorio.pessoas[i].idCpf &&
repositorio.pessoas[i].cadastroAtivo == 1) {
return i;
}
}
return -1;
}
int isCpfJaExistente (unsigned long int cpf, repositorioPessoa_t repositorio){
//varredura O(n)
for (unsigned short int i = 0; i < repositorio.indiceInsercao; i++) {
if (cpf == repositorio.pessoas[i].idCpf &&
repositorio.pessoas[i].cadastroAtivo) {
return 1;
}
}
return 0;
}
void exibirPessoaPorIndice (unsigned short int indice, repositorioPessoa_t repositorio){
if (!isRepositorioVazio(repositorio)) {
apresentarPessoa (repositorio.pessoas[indice]);
}
}
void ativarInativarCadastroPessoa (pessoa_t *pessoa, int situacaoCadastro){
pessoa->cadastroAtivo = situacaoCadastro;
}
int excluirCadastroPessoa (unsigned long int cpf, repositorioPessoa_t *repositorio){
//DELETE FROM PESSOAS WHERE CPF = :CPF
short int indicePessoa = retornarIndicePorCpfPessoa (cpf, *repositorio);
//fail first
if (indicePessoa == -1) {
return 0;
}
ativarInativarCadastroPessoa (&repositorio->pessoas[indicePessoa], 0);
return 1;
}
int isRepositorioPessoaCheio (repositorioPessoa_t repositorio){
return repositorio.indiceInsercao == TAM;
}
int inserirPessoaNoRepositorio (pessoa_t pessoa, repositorioPessoa_t *repositorio){
//INSERT INTO PESSOAS (IDCPF, IDADE, NOME, CADASTROATIVO = "S") VALUES
//(:IDCPF, :IDADE, :NOME, CADASTROATIVO = "S")
if (isRepositorioPessoaCheio(*repositorio)){
return 0;
}
repositorio->pessoas[repositorio->indiceInsercao] = pessoa;
repositorio->indiceInsercao++;
return 1;
}
int alterarCpfPessoaNoIndice (unsigned short int indice, unsigned long int cpf, repositorioPessoa_t *repositorio){
//UPDATE PESSOAS SET CPF = :CPF WHERE PESSOAS.ID = :ID
repositorio->pessoas[indice].idCpf = cpf;
return 1;
}
int alterarNomePessoaNoIndice (unsigned short int indice, char nome[TAM_NOME], repositorioPessoa_t *repositorio){
strcpy (repositorio->pessoas[indice].nome, nome);
return 1;
}
int alterarIdadePessoaNoIndice (unsigned short int indice, unsigned short int idade, repositorioPessoa_t *repositorio){
repositorio->pessoas[indice].idade = idade;
return 1;
}
#ifndef PERSISTIRPESSOA_H
#define PERSISTIRPESSOA_H
#include "repositoriopessoa.h"
#define ARQUIVO_PESSOAS "pessoas.dat"
int salvarRepositorioPessoa(repositorioPessoa_t repositorio);
int carregarRepositorioPessoa(repositorioPessoa_t *repositorio);
#endif
#include "persistirpessoa.h"
#include "repositoriopessoa.h"
#include "pessoa.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int salvarRepositorioPessoa(repositorioPessoa_t repositorio) {
FILE *arquivo = fopen(ARQUIVO_PESSOAS, "wb"); //recria o arquivo
if (arquivo == NULL) {
return 0;
}
printf ("\nSalvando: ");
for (unsigned short int i = 0; i < repositorio.indiceInsercao; i++) {
if (repositorio.pessoas[i].cadastroAtivo == 0) {
continue;
}
fwrite(&repositorio.pessoas[i], sizeof(pessoa_t), 1, arquivo);
apresentarPessoa (repositorio.pessoas[i]);
}
fclose(arquivo);
return 1;
}
int carregarRepositorioPessoa(repositorioPessoa_t *repositorio) {
FILE *arquivo = fopen(ARQUIVO_PESSOAS, "rb"); //modo de leitura, ver ab,rb e wb
if (arquivo == NULL) {
return 0;
}
*repositorio = criarRepositorioPessoa();
pessoa_t pessoa;
printf("\nRecuperando: ");
while (fread(&pessoa, sizeof(pessoa_t), 1, arquivo) == 1) {
repositorio->pessoas[repositorio->indiceInsercao] = pessoa;
repositorio->indiceInsercao++;
apresentarPessoa(pessoa);
}
fclose(arquivo);
return 1;
}
#ifndef APP_H // proteção contra múltiplas inclusões
#define APP_H
#include "pessoa.h"
#include "repositoriopessoa.h"
// menus
unsigned char menuPrincipal();
unsigned char menuPessoa();
unsigned char menuAlterarPessoa (long int indiceExibirPessoa, repositorioPessoa_t repositorio);
// genéricos
void montarMenu(const char *titulo, const char *opcoes[], int qtdOpcoes);
unsigned char opcaoMenu(unsigned short int inicio, unsigned short int fim);
#endif
#include "app.h"
#include <stdio.h>
#include "funcoes.h"
unsigned char menuPrincipal() {
const char *opcoes[] = {
"Pessoas",
"Sair"
};
montarMenu("Menu Principal", opcoes, 2);
return opcaoMenu(1, 2);
}
void montarMenu(const char *titulo, const char *opcoes[], int qtdOpcoes) {
limparTela();
cabecalho((char *)titulo);
printf ("\n");
for (int i = 0; i < qtdOpcoes; i++) {
printf("%d - %s\n", i + 1, opcoes[i]);
}
printf("\n");
}
unsigned char menuPessoa() {
const char *opcoesMenu[] = {
"Listar",
"Cadastrar",
"Atualizar",
"Excluir",
"Gravar",
"Recuperar",
"Sair"
};
montarMenu("CRUD Pessoa!", opcoesMenu, 7);
return opcaoMenu(1, 7);
}
unsigned char menuAlterarPessoa (long int indiceExibirPessoa, repositorioPessoa_t repositorio) {
exibirPessoaPorIndice(indiceExibirPessoa, repositorio);
const char *opcoesAlterar[] = {
"Cpf",
"Nome",
"Idade",
"Voltar"
};
montarMenu("Qual informação alterar:", opcoesAlterar, 4);
return opcaoMenu(1, 4);
}
unsigned char opcaoMenu(unsigned short int inicio, unsigned short int fim){
unsigned char retornoScanf = 0, opcao;
do {
printf ("\n\nQual a sua opção: ");
//se há falha return 0
retornoScanf = (scanf ("%hhu", &opcao)); // lê inteiro e guarda em unsigned char
if (retornoScanf == 0){
printf ("Erro de entrada, digite um inteiro, tente novamente!");
limparBuffer();
}
if (opcao < inicio || opcao > fim) {
printf ("Erro de opção escolha entre os itens de menu!");
limparBuffer();
}
} while (retornoScanf == 0 && (opcao < inicio || opcao > fim));
return opcao;
}
#ifndef PESSOACRUD_H // proteção contra múltiplas inclusões
#define PESSOACRUD_H
#include "pessoa.h"
#include "repositoriopessoa.h"
// entradas
int pedirCpf(unsigned long int *cpf, repositorioPessoa_t repositorio);
int pedirIdade(unsigned short int *idade);
int pedirNome(char nome[TAM_NOME]);
// ações CRUD
void cadastrarPessoa(repositorioPessoa_t *repositorio);
void alterarPessoa(repositorioPessoa_t *repositorio);
void excluirPessoa(repositorioPessoa_t *repositorio);
//Persistência
void carregarRepositorio (repositorioPessoa_t *repositorio);
#endif
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "funcoes.h"
#include "pessoa.h"
#include "repositoriopessoa.h"
#include "persistirpessoa.h"
#include "app.h"
#include "pessoacrud.h"
int pedirCpf(unsigned long int *cpf, repositorioPessoa_t repositorio){
printf ("Insira o cpf: ");
scanf ("%ld", cpf); //sem &
if (isCpfJaExistente (*cpf, repositorio)) {
printf ("\nCpf já existente, não pode haver duplicação de chave Cpf!");
pausa();
return 0;
}
return 1;
}
int pedirIdade(unsigned short int *idade) {
unsigned short int valor;
int retornoScanf;
printf("Insira a idade: ");
retornoScanf = scanf("%hu", &valor);
limparBuffer();
if (retornoScanf != 1) {
return 0;
}
if (valor == 0 || valor > 120) {
return 0;
}
*idade = valor;
return 1;
}
int pedirNome(char nome[TAM_NOME]) {
printf("Insira o nome: ");
limparBuffer();
if (fgets(nome, TAM_NOME, stdin) == NULL) {
return 0;
}
// remove o '\n' que o fgets pode deixar
unsigned short int len = strlen(nome);
if (len > 0 && nome[len - 1] == '\n') {
nome[len - 1] = '\0';
len--;
}
if (len == 0) {
return 0; // inválido: string vazia
}
return 1; // válido
}
void cadastrarPessoa(repositorioPessoa_t *repositorio) {
if (isRepositorioPessoaCheio(*repositorio)) {
printf("\nRepositório cheio!!!");
pausa();
return;
}
unsigned long int cpf;
unsigned short int idade;
char nome[TAM_NOME];
pessoa_t pessoa;
if (!pedirCpf(&cpf, *repositorio)) return;
if (!pedirNome(nome)) {
printf("\nNome inválido!");
pausa();
return;
}
if (!pedirIdade(&idade)) {
printf("\nIdade inválida!");
pausa();
return;
}
pessoa = criarPessoa(cpf, nome, idade);
if (!inserirPessoaNoRepositorio(pessoa, repositorio)) {
printf("\nNão foi possível inserir a pessoa no cadastro!");
pausa();
return;
}
apresentarPessoa(pessoa);
pausa();
}
void alterarPessoa(repositorioPessoa_t *repositorio) {
if (isRepositorioVazio(*repositorio)) {
printf("Repositorio vazio!");
pausa();
return;
}
unsigned long int cpfAlterar;
printf("Informe o cpf do cadastro da pessoa para alterar: ");
scanf("%ld", &cpfAlterar);
short int indiceAlterar = retornarIndicePorCpfPessoa(cpfAlterar, *repositorio);
if (indiceAlterar == -1) {
printf("Cpf não encontrado para atualizar dados!");
pausa();
return;
}
unsigned char opcaoAlterar = menuAlterarPessoa (indiceAlterar, *repositorio);
switch (opcaoAlterar) {
case 1: {
unsigned long int cpf;
if (!pedirCpf(&cpf, *repositorio)) return;
alterarCpfPessoaNoIndice(indiceAlterar, cpf, repositorio);
} break;
case 2: {
char nome[TAM_NOME];
if (!pedirNome(nome)) {
printf("\nNome inválido!");
pausa();
return;
}
alterarNomePessoaNoIndice(indiceAlterar, nome, repositorio);
} break;
case 3: {
unsigned short int idade;
if (!pedirIdade(&idade)) {
printf("\nIdade inválida!");
pausa();
return;
}
alterarIdadePessoaNoIndice(indiceAlterar, idade, repositorio);
} break;
}
pausa();
}
void excluirPessoa(repositorioPessoa_t *repositorio) {
if (isRepositorioVazio(*repositorio)) {
printf("Repositorio vazio!");
pausa();
return;
}
unsigned long int cpfExcluir;
limparTela();
printf("Informe o cpf do cadastro da pessoa para excluir: ");
scanf("%ld", &cpfExcluir);
if (!excluirCadastroPessoa(cpfExcluir, repositorio)) {
printf("Falha na exclusão ou cpf não localizado!");
pausa();
return;
}
printf("Exclusão concluída com sucesso!");
pausa();
}
void carregarRepositorio (repositorioPessoa_t *repositorio) {
if (!carregarRepositorioPessoa(repositorio)) {
printf("Erro ao carregar repositório!");
pausa();
}
}
)ç 321321