Você está na página 1de 6

Alunos:

Matheus de Souza da Fonseca (Matrícula - 1230114114)


Camilla Carolina Rodrigues Soares (Matrícula - 1230102765)

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

// Definição da estrutura de pacientes


struct Paciente {
char nome[100];
char tipo_sanguineo[100];
int idade;
};

// Função para comparar dois pacientes por nome


int compararPorNome(const void *a, const void *b) {
return strcmp(((struct Paciente *)a)->nome, ((struct Paciente *)b)->nome);
}

// Função para cadastrar um paciente no arquivo binário


void cadastrarPaciente() {
struct Paciente paciente;
FILE *arquivo;

arquivo = fopen("pacientes.bin", "ab");


if (arquivo == NULL) {
printf("Erro ao abrir o arquivo.\n");
return;
}

printf("Digite o nome do paciente: ");


scanf(" %[^\n]s", paciente.nome);
printf("Digite o tipo sanguineo do paciente: ");
scanf(" %[^\n]s", paciente.tipo_sanguineo);
printf("Digite a idade do paciente: ");
scanf("%d", &paciente.idade);

fwrite(&paciente, sizeof(struct Paciente), 1, arquivo);

fclose(arquivo);
}

// Função para imprimir todos os pacientes cadastrados


void imprimirPaciente() {
struct Paciente paciente;
FILE *arquivo;

arquivo = fopen("pacientes.bin", "rb");


if (arquivo == NULL) {
printf("Erro ao abrir o arquivo.\n");
return;
}

printf("Pacientes cadastrados:\n");
while (fread(&paciente, sizeof(struct Paciente), 1, arquivo) == 1) {
printf("Nome: %s\nTipo Sanguineo: %s\nIdade: %d\n\n", paciente.nome,
paciente.tipo_sanguineo, paciente.idade);
}

fclose(arquivo);
}

// Função para buscar um paciente por nome usando busca ternária


void buscarPacientePorNome(const char *termo_busca) {
struct Paciente paciente;
FILE *arquivo;

arquivo = fopen("pacientes.bin", "rb");


if (arquivo == NULL) {
printf("Erro ao abrir o arquivo.\n");
return;
}

fseek(arquivo, 0, SEEK_END);
long tamanho = ftell(arquivo);
long inicio = 0;
long fim = tamanho / sizeof(struct Paciente) - 1;

while (inicio <= fim) {


long terco1 = inicio + (fim - inicio) / 3;
long terco2 = inicio + 2 * (fim - inicio) / 3;

fseek(arquivo, terco1 * sizeof(struct Paciente), SEEK_SET);


fread(&paciente, sizeof(struct Paciente), 1, arquivo);
int comp1 = strcmp(paciente.nome, termo_busca);

fseek(arquivo, terco2 * sizeof(struct Paciente), SEEK_SET);


fread(&paciente, sizeof(struct Paciente), 1, arquivo);
int comp2 = strcmp(paciente.nome, termo_busca);

if (comp1 == 0) {
printf("Paciente encontrado:\n");
printf("Nome: %s\nTipo Sanguineo: %s\nIdade: %d\n\n", paciente.nome,
paciente.tipo_sanguineo, paciente.idade);
fclose(arquivo);
return;
} else if (comp1 > 0) {
fim = terco1 - 1;
} else if (comp2 == 0) {
printf("Paciente encontrado:\n");
printf("Nome: %s\nTipo Sanguineo: %s\nIdade: %d\n\n", paciente.nome,
paciente.tipo_sanguineo, paciente.idade);
fclose(arquivo);
return;
} else if (comp2 > 0) {
inicio = terco1 + 1;
fim = terco2 - 1;
} else {
inicio = terco2 + 1;
}
}

printf("Paciente não encontrado.\n");


fclose(arquivo);
}
// Função para buscar um paciente por nome
void buscarPaciente() {
char termo_busca[100];
printf("Digite o nome do paciente que deseja buscar: ");
scanf(" %[^\n]s", termo_busca);
buscarPacientePorNome(termo_busca);
}

// Função para editar dados de um paciente


void editarPaciente() {
struct Paciente paciente;
FILE *arquivo, *temp;
char termo_busca[100];
int encontrado = 0;

arquivo = fopen("pacientes.bin", "r+b");


temp = fopen("temp.bin", "wb");

if (arquivo == NULL || temp == NULL) {


printf("Erro ao abrir o arquivo.\n");
return;
}

printf("Digite o nome do paciente que deseja editar: ");


scanf(" %[^\n]s", termo_busca);

while (fread(&paciente, sizeof(struct Paciente), 1, arquivo) == 1) {


if (strcmp(paciente.nome, termo_busca) == 0) {
encontrado = 1;
printf("Digite o novo nome do paciente: ");
scanf(" %[^\n]s", paciente.nome);
printf("Digite o novo tipo sanguineo do paciente: ");
scanf(" %[^\n]s", paciente.tipo_sanguineo);
printf("Digite a nova idade: ");
scanf("%d", &paciente.idade);
}

fwrite(&paciente, sizeof(struct Paciente), 1, temp);


}

fclose(arquivo);
fclose(temp);

remove("pacientes.bin");
rename("temp.bin", "pacientes.bin");

if (!encontrado) {
printf("Paciente não encontrado.\n");
} else {
printf("Paciente editado com sucesso.\n");
}
}

// Função para deletar um paciente


void deletarPaciente() {
struct Paciente paciente;
FILE *arquivo, *temp;
char termo_busca[100];
int encontrado = 0;

arquivo = fopen("pacientes.bin", "rb");


temp = fopen("temp.bin", "wb");

if (arquivo == NULL || temp == NULL) {


printf("Erro ao abrir o arquivo.\n");
return;
}

printf("Digite o nome do paciente que deseja deletar: ");


scanf(" %[^\n]s", termo_busca);

while (fread(&paciente, sizeof(struct Paciente), 1, arquivo) == 1) {


if (strcmp(paciente.nome, termo_busca) != 0) {
fwrite(&paciente, sizeof(struct Paciente), 1, temp);
} else {encontrado= 1;
}
}

fclose(arquivo);
fclose(temp);

remove("pacientes.bin");
rename("temp.bin", "pacientes.bin");

if (!encontrado) {
printf("Paciente não encontrado.\n");
} else {
printf("Paciente removido com sucesso.\n");
}
}

// Função para ordenar os pacientes por nome


void ordenarPacientes() {
struct Paciente pacientes[100];
struct Paciente temp;
FILE *arquivo;
int quantidade_pacientes;

arquivo = fopen("pacientes.bin", "rb");


if (arquivo == NULL) {
printf("Erro ao abrir o arquivo.\n");
return;
}

fseek(arquivo, 0, SEEK_END);
long tamanho = ftell(arquivo);
quantidade_pacientes = tamanho / sizeof(struct Paciente);

fseek(arquivo, 0, SEEK_SET);
for (int i = 0; i < quantidade_pacientes; i++) {
fread(&pacientes[i], sizeof(struct Paciente), 1, arquivo);
}

fclose(arquivo);

for (int i = 0; i < quantidade_pacientes - 1; i++) {


for (int j = 0; j < quantidade_pacientes - i - 1; j++) {
if (strcmp(pacientes[j].nome, pacientes[j + 1].nome) > 0) {
temp = pacientes[j];
pacientes[j] = pacientes[j + 1];
pacientes[j + 1] = temp;
}
}
}

arquivo = fopen("pacientes.bin", "wb");


for (int i = 0; i < quantidade_pacientes; i++) {
fwrite(&pacientes[i], sizeof(struct Paciente), 1, arquivo);
}

fclose(arquivo);
}

// Função principal
int main() {

int opcao;

do {
printf("\nMenu:\n");
printf("1. Cadastrar Pacientes\n");
printf("2. Imprimir Pacientes Cadastrados\n");
printf("3. Buscar Paciente\n");
printf("4. Editar Paciente\n");
printf("5. Deletar Paciente\n");
printf("6. Ordenar Pacientes\n");
printf("0. Sair\n");
printf("Escolha uma opção: ");
scanf("%d", &opcao);

switch (opcao) {
case 1:
cadastrarPaciente();
break;
case 2:
imprimirPaciente();
break;
case 3:
buscarPaciente();
break;
case 4:
editarPaciente();
break;
case 5:
deletarPaciente();
break;
case 6:
ordenarPacientes();
break;
case 0:
printf("Saindo do programa.\n");
break;
default:
printf("Opção inválida.\n");
}
} while (opcao != 0);
return 0;
}

Você também pode gostar