online compiler and debugger for c/c++

code. compile. run. debug. share.
Source Code   
Language
/* 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

Compiling Program...

Command line arguments:
Standard Input: Interactive Console Text

                

                

Program is not being debugged. Click "Debug" button to start program in debug mode.

#FunctionFile:Line
VariableValue
RegisterValue
ExpressionValue