Você está na página 1de 79

// Rafael Braz Menezes Cabral

//types.h

#ifndef ESTRUTURAS

#define ESTRUTURAS

#define TRUE 1

#define FALSE 0

int manha = 0, tarde = 0;

typedef struct cliente {

char cpf[11];

char nome[100];

char tel[15];

char email[50];

int status;

} tcliente;

typedef struct medicos {

char crm[8];

char nome[100];

int especialidade;

int horarios[2][5];

char tel[15];

char email[50];

int status;

} tmedicos;

typedef struct consulta {

char cpf[11];

char crm[8];
char data_consulta[20];

int turno;

tcliente *paciente_manha[10];

tcliente *paciente_tarde[10];

int status; // -1 = cancelado, 0 = em espera, 1 = concluído

}tconsulta;

typedef struct no {

char cpf[11];

char nome[100];

char tel[15];

char email[50];

int pos;

struct no *esq;

struct no *dir;

}tno;

typedef struct no_med {

char crm[8];

char nome[100];

int especialidade;

int horarios[2][5];

char tel[15];

char email[50];

int pos;

struct no_med *esq;

struct no_med *dir;

}tno_med;

typedef struct noqueue{

tcliente *fila_de_espera;
struct fila *prox;

}tnoqueue;

typedef struct descritor{

tnoqueue *inicio, *fim;

}tdescritor;

typedef tdescritor *Queue;

typedef struct noStack {

tno * info;

tno_med * info_med;

struct noStack *prox;

}NoStack;

typedef NoStack * Stack;

Queue *m, *t;

#endif

//moduloclientes.h

#include <stdio.h>

#include "types.h"

int buscar_no_indice(tno * raiz, char cpf[]);

tcliente retorna_cliente(tno *raiz, FILE * arq, char cpf[]);

void inserir(FILE *arq, tno **raiz, char cpf[]);


void alterar_arvore(FILE * arq, tno *raiz, char cpf[]);

void remover_arvore(tno **raiz, char cpf[]);

int validar_cpf(char str[]);

int validar_nome(char str[]);

int validar_telefone(char str[]);

int validar_email(char str[]);

void cadastro(char cpf[], FILE * arq, tno *raiz);

void alterar(FILE * arq, char cpf[], tno *raiz);

void exibir(tno * raiz, char cpf[]);

void remover(FILE * arq, char cpf[], tno *raiz);

int consultar_por_nome(FILE * arq, char nome[]);

//modulomedicos.h

#include <stdio.h>

#include "types.h"

int buscar_no_indice_medicos(tno_med * raiz, char crm[]);

int validar_crm(char str[]);

tmedicos retorna_medico(tno_med *raiz, FILE * arq, char crm[]);

void inserir_med(FILE *arq, tno_med **raiz, char crm[]);

void cadastro_medico(char crm[], FILE * arq, tno_med *raiz);

void procura_especialidade(FILE * arq, int esp);

void consultar_nome(FILE * arq, char nome[]);

tno_med * maior_med(tno_med *raiz);

void remover_no_med(tno_med **raiz);

void remover_indice_med(tno_med **raiz, char crm[]);

void remover_med(FILE * arq, char crm[], tno_med *raiz);

void alterar_indice_med(FILE * arq, tno_med *raiz, char crm[]);


void alterar_medico(FILE * arq, char crm[], tno_med *raiz);

//moduloconsultas.h

#include <stdio.h>

#include "types.h"

int valida_numero(char *str);

int valida_data(char *str);

int valida_dia(char *str);

void marcar_consulta(FILE * arq_cliente, FILE * arq_medico, FILE * arq_consulta, tno ** raiz_cliente,


tno_med ** raiz_medico, char cpf[], char crm[]);

void consultar_pacientes(FILE * arq, char crm[], char data[], int turno);

void consultar_medicos(FILE * arq_consulta, char cpf[], tno_med *raiz, FILE *arq_medicos);

void desmarcar_consultas(FILE * arq_consulta, char cpf[], char crm[]);

//incializar-encerrar.h

#include <stdio.h>

#include "types.h"

FILE * criarArquivo(char nome_arq[]);

void montar_indice_clientes(FILE * arq, tno ** raiz);

void montar_indice_medicos(FILE * arq, tno_med ** raiz);

int verificar(FILE *arq_consulta);

void limpar_indice_clientes(tno **raiz);

void limpar_indice_medicos(tno_med **raiz);

void manutencao_clientes(FILE * arq);

void manutencao_medicos(FILE * arq);


void manutencao_consulta(FILE * arq);

//Queue.h

#include <stdio.h>

#include "types.h"

Queue createqueue ();

void enqueue_manha (Queue *m, tcliente *c);

void enqueue_tarde (Queue *t, tcliente *c);

tcliente *dequeue_manha (Queue *m);

tcliente *dequeue_tarde (Queue *t);

int isempty_manha (Queue m);

int isempty_tarde (Queue t);

void destroy (Queue *q);

//Stack.h

#include <stdio.h>

#include "types.h"

void createStack(Stack *s);

void push(Stack *s, tno * c);

void push_med(Stack *s, tno_med * m);

tno * pop(Stack *s);

tno_med * pop_med(Stack *s);

int isEmpty(Stack s);


//moduloclientes.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

#include "types.h"

int buscar_no_indice(tno * raiz, char cpf[]){

int pos = -1;

tno * aux;

aux = raiz;

while(1){

if (raiz == NULL){

return -1;

if (strcmp(raiz -> cpf, cpf) == 0){

pos++;

return pos;

} else if (strcmp(raiz -> cpf, cpf) > 0){

pos++;

aux = aux -> dir;

} else {

pos++;

aux = aux -> esq;

tcliente retorna_cliente(tno *raiz, FILE * arq, char cpf[]) {

tcliente c;
int status, pos = buscar_no_indice(raiz, cpf);

if (pos > -1){

fseek(arq, pos * sizeof(tcliente), 0);

status = fread(&c, sizeof(tcliente), 1, arq);

return c;

void inserir(FILE *arq, tno **raiz, char cpf[]) {

tcliente c;

if (*raiz == NULL) {

*raiz = (tno *)malloc(sizeof(tno));

c = retorna_cliente(*raiz,arq, cpf);

strcpy((*raiz)->cpf, cpf);

strcpy((*raiz)->nome, c.nome);

strcpy((*raiz)->tel, c.tel);

strcpy((*raiz)->email, c.email);

(*raiz)->pos = buscar_no_indice(raiz, cpf);

(*raiz)->esq = NULL;

(*raiz)->dir = NULL;

} else {

if (strcmp(cpf, (*raiz)->cpf) < 0) {

inserir(arq, &((*raiz)->esq), cpf);

} else {

inserir(arq, &((*raiz)->dir), cpf);

int validar_cpf(char str[]){

int i, j, digito1 = 0, digito2 = 0;


if(strlen(str) != 11)

return 0;

else if((strcmp(str,"00000000000") == 0) || (strcmp(str,"11111111111") == 0) ||


(strcmp(str,"22222222222") == 0) || (strcmp(str,"33333333333") == 0) ||
(strcmp(str,"44444444444") == 0) || (strcmp(str,"55555555555") == 0) ||
(strcmp(str,"66666666666") == 0) || (strcmp(str,"77777777777") == 0) ||
(strcmp(str,"88888888888") == 0) || (strcmp(str,"99999999999") == 0))

return 0;

else{ //digito 1

for(i = 0, j = 10; i < strlen(str)-2; i++, j--) //multiplica os números de 10 a 2 e soma os resultados
dentro de digito1

digito1 += (str[i]-48) * j;

digito1 %= 11;

if(digito1 < 2)

digito1 = 0;

else

digito1 = 11 - digito1;

if((str[9]-48) != digito1)

return 0; //se o digito 1 não for o mesmo que o da validação CPF é inválido

else{//digito 2

for(i = 0, j = 11; i < strlen(str)-1; i++, j--) //multiplica os números de 11 a 2 e soma os


resultados dentro de digito2

digito2 += (str[i]-48) * j;

digito2 %= 11;

if(digito2 < 2)

digito2 = 0;

else

digito2 = 11 - digito2;

if((str[10]-48) != digito2)

return 0; //se o digito 2 não for o mesmo que o da validação CPF é inválido

return 1; //é válido


}

int validar_nome(char str[]) {

int i, tam = strlen(str);

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

if (isalpha(str[i]) == 0 && isspace(str[i]) == 0) {

return 0; //não é válido

if (isalpha(str[0]) != 0) { //formatar maiusculas e minusculas

str[0] = toupper(str[0]);

for (i = 1; i < tam - 1; i++) {

str[i] = toupper(str[i]);

for (i = 1; i < tam - 1; i++) {

if (isalpha(str[i - 1]) != 0) {

str[i] = tolower(str[i]);

for (i = 1; i < tam - 1; i++) { //formatar espaços em excesso

if (isspace(str[i]) != 0 && isspace(str[i + 1]) != 0) {

str[i + 1] = 8; //backspace

return 1; //é válido

int validar_telefone(char str[]) {

int i, tam = strlen(str);

if (tam > 15) {


return 0; //não é válido

for (i = 0; i < 14; i++) {

if (isdigit(str[i]) == 0) {

return 0; //não é válido

return 1; //é válido

int validar_email(char str[]) {

int i, tam = strlen(str), qtd_arroba = 0, flag_letra = 0, flag_digito = 0, flag_ponto = 0,


flag_underscore = 0, flag_dash = 0, flag_arroba = 0;

for (i = 0; i < tam; i++) {

if (isalpha(str[i]) != 0) {

flag_letra = 1;

if (isdigit(str[i]) != 0) {

flag_digito = 1;

if (str[i] == '.') {

flag_ponto = 1;

if (str[i] == '_') {

flag_underscore = 1;

if (str[i] == '-') {

flag_dash = 1;

if (str[i] == '@') {

qtd_arroba++;
if (qtd_arroba >= 2) {

flag_arroba = 0;

break;

else {

flag_arroba = 1;

if (flag_letra == 1 && flag_digito == 1 && flag_ponto == 1 && flag_underscore == 1 && flag_dash


== 1 && flag_arroba == 1) {

return 1; //é válido

else {

return 0; //não é válido

void cadastro(char cpf[], FILE * arq, tno *raiz) {

tcliente c;

int status;

int pos = buscar_no_indice(raiz, cpf);

if (pos > -1) {

printf("Esse CPF ja esta cadastrado\n");

} else {

fseek(arq, 0, 2);

strcpy(c.cpf, cpf);

do {

printf("Digite o nome desse cliente: \n");

fgets(c.nome, 99, stdin);


} while (validar_nome(c.nome) == 0);

do {

printf("Digite o telefone desse cliente: \n");

fgets(c.tel, 14, stdin);

} while (validar_telefone(c.tel) == 0);

do {

printf("Digite o email desse cliente: \n");

fgets(c.email, 49, stdin);

} while (validar_email(c.email) == 0);

c.status = 1;

status = fwrite(&c, sizeof(tcliente), 1, arq);

if (status != 1) {

printf("Erro de gravacao \n");

else {

printf("Cliente cadastrado com sucesso \n");

inserir(arq, &raiz, cpf);

void alterar_indice(FILE * arq, tno *raiz, char cpf[]) {

int status;

tcliente c;

c = retorna_cliente(raiz, arq, cpf);

tno * aux;

if (buscar_no_indice(raiz, cpf) == -1) {

printf("Cliente nao encontrado\n");

} else {

aux = raiz;

aux -> pos = buscar_no_indice(aux,cpf);


strcpy(aux->nome, c.nome);

strcpy(aux->email, c.email);

strcpy(aux->tel, c.tel);

void alterar(FILE * arq, char cpf[], tno *raiz) {

tcliente c;

int pos = buscar_no_indice(raiz, cpf), status;

char escolha;

if (pos == -1) {

printf("Cliente nao encontrado\n");

} else {

fseek(arq, pos * sizeof(tcliente), 0);

status = fread(&c, sizeof(tcliente), 1, arq);

if (status != 1){

printf("Erro de leitura\n");

} else {

do {

printf("O que você deseja alterar?\n");

printf("1.Nome\n");

printf("2.Email\n");

printf("3.Telefone\n");

printf("4.Continuar o programa\n");

escolha = getche();

switch (escolha) {

case '1':

do {

printf("Informe o novo nome: \n");

fgets(c.nome, 99, stdin);

} while (validar_nome(c.nome) == 0);


break;

case '2':

do {

printf("Informe o novo email: \n");

fgets(c.email, 49, stdin);

} while (validar_email(c.email) == 0);

break;

case '3':

do {

printf("Informe o novo telefone: \n");

fgets(c.tel, 14, stdin);

} while (validar_telefone(c.tel) == 0);

break;

case '4':

break;

} while (escolha != '4');

fseek(arq, -sizeof(tcliente), 1);

status = fwrite(&c, sizeof(tcliente), 1, arq);

if (status != 1) {

printf("Erro de gravacao \n");

} else {

printf("Aluno alterado com sucesso \n");

alterar_indice(arq, raiz, cpf);

void exibir(tno * raiz, char cpf[]) {

tcliente c;
tno * aux = buscar_no_indice(raiz, cpf);

if (aux == NULL) {

printf("Cliente nao encontrado\n");

else {

printf("Nome:\n");

puts(aux->nome);

printf("\n");

printf("Telefone:\n");

puts(aux->tel);

printf("\n");

printf("Email:\n");

puts(aux->email);

tno * maior(tno *raiz) {

tno * aux;

aux = raiz;

if (aux->dir == NULL) {

raiz = raiz->esq;

return aux;

else {

return maior(raiz->dir);

void remover_no(tno **raiz) {

tno * aux;

aux = *raiz;
if ((*raiz)->esq == NULL && (*raiz)->dir == NULL)

*raiz = NULL;

else if ((*raiz)->esq == NULL)

*raiz = (*raiz)->dir;

else if ((*raiz)->dir == NULL)

*raiz = (*raiz)->esq;

else {

aux = maior((*raiz)->esq);

strcpy((*raiz)->cpf, aux->cpf);

free(aux);

void remover_indice(tno **raiz, char cpf[]) {

tcliente c;

if (*raiz == NULL) {

printf("Arvore Vazia\n");

else if (strcmp(cpf, (*raiz)->cpf) == 0) {

remover_no(&(*raiz));

else {

if (strcmp(cpf, (*raiz)->cpf) < 0) {

remover_indice(&((*raiz)->esq), cpf);

else {

remover_indice(&((*raiz)->dir), cpf);

}
void remover(FILE * arq, char cpf[], tno *raiz) {

tcliente c;

int pos = buscar_no_indice(raiz, cpf), status;

if (pos == -1) {

printf("Cliente nao encontrado\n");

else {

fseek(arq, pos * sizeof(tcliente), 0);

status = fread(&c, sizeof(tcliente), 1, arq);

if (status != 1)

printf("Erro de leitura \n");

else {

c.status = 0;

fseek(arq, -sizeof(tcliente), 1);

status = fwrite(&c, sizeof(tcliente), 1, arq);

if (status != 1) {

printf("Erro de gravacao \n");

else {

printf("Cliente removido com sucesso \n");

remover_indice(&raiz, cpf);

int consultar_por_nome(FILE * arq, char nome[]) {

int status, pos = -1;

tcliente c;

fseek(arq, 0, 0);

while (1) {
status = fread(&c, sizeof(tcliente), 1, arq);

if (status != 1) {

if (!feof(arq)) {

return -2; // erro de leitura

else {

return -1; // não achou

else {

pos++;

if (c.status == 1 && strcmp(c.nome, nome) == 0) {

return pos;

//modulomedicos.c

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include "moduloclientes.h"

#include <conio.h>

#include "types.h"

int buscar_no_indice_medicos(tno_med * raiz, char crm[]){

int pos = -1;

tno_med * aux;
aux = raiz;

while(1){

if (raiz == NULL){

return -1;

if (strcmp(raiz -> crm, crm) == 0){

pos++;

return pos;

} else if (strcmp(raiz -> crm, crm) > 0){

pos++;

aux = aux -> dir;

} else {

pos++;

aux = aux -> esq;

int validar_crm(char str[]){

int i, tam = strlen(str);

if (isdigit(str[0]) == 0) {

return 0; //não é válido

} else {

str[0] = toupper(str[0]);

if (isdigit(str[1]) == 0) {

return 0; //não é válido

} else {

str[1] = toupper(str[1]);

for (i = 2; i < tam - 1; i++) {


if (isdigit(str[1]) == 0) {

return 0;

return 1;

tmedicos retorna_medico(tno_med *raiz, FILE * arq, char crm[]) {

tmedicos c;

int status, pos = buscar_no_indice_medicos(raiz, crm);

if (pos > -1){

fseek(arq, pos * sizeof(tmedicos), 0);

status = fread(&c, sizeof(tmedicos), 1, arq);

return c;

void inserir_med(FILE *arq, tno_med **raiz, char crm[]) {

int i, j;

tmedicos c;

if (*raiz == NULL) {

*raiz = (tno_med *)malloc(sizeof(tno_med));

c = retorna_medico(raiz, arq, crm);

strcpy((*raiz)->crm, crm);

strcpy((*raiz)->nome, c.nome);

strcpy((*raiz)->tel, c.tel);

strcpy((*raiz)->email, c.email);

(*raiz) ->especialidade = c.especialidade;

for(i = 0; i < 2; i++){

for(j = 0; j < 5; j++){

(*raiz) -> horarios[i][j] = c.horarios[i][j];


}

(*raiz)->pos = buscar_no_indice_medicos(raiz, crm);

(*raiz)->esq = NULL;

(*raiz)->dir = NULL;

} else {

if (strcmp(crm, (*raiz)->crm) < 0) {

inserir(arq, &((*raiz)->esq), crm);

} else {

inserir(arq, &((*raiz)->dir), crm);

void cadastro_medico(char crm[], FILE * arq, tno_med *raiz) {

tmedicos c;

int status, pos = buscar_no_indice_medicos(raiz, crm), i, j;

if (pos > -1) {

printf("Esse CRM ja esta cadastrado\n");

} else {

fseek(arq, 0, 2);

strcpy(c.crm, crm);

do {

printf("Digite o nome desse medico: \n");

fgets(c.nome, 99, stdin);

} while (validar_nome(c.nome) == 0);

do {

printf("Digite o telefone desse medico: \n");

fgets(c.tel, 14, stdin);

} while (validar_telefone(c.tel) == 0);

do {
printf("Digite o email desse medico: \n");

fgets(c.email, 49, stdin);

} while (validar_email(c.email) == 0);

do{

printf("Escolha a especialidade desse medico:\n");

printf("1- Acupuntura\n");

printf("2- Alergia e Imunologia\n");

printf("3- Anestesiologia\n");

printf("4- Angiologia\n");

printf("5- Cancerologia (Oncologia)\n");

printf("6- Cardiologia\n");

printf("7- Cirurgia Cardiovascular\n");

printf("8- Cirurgia da Mao\n");

printf("9- Cirurgia de Cabeca e Pescoco\n");

printf("10- Cirurgia do Aparelho Digestivo\n");

printf("11- Cirurgia Geral\n");

printf("12- Cirurgia Pediatrica\n");

printf("13- Cirurgia Plastica\n");

printf("14- Cirurgia Toracica\n");

printf("15- Cirurgia Vascular\n");

printf("16- Clinica Medica (Medicina interna)\n");

printf("17- Coloproctologia\n");

printf("18- Dermatologia\n");

printf("19- Endocrinologia e Metabologia\n");

printf("20- Endoscopia\n");

printf("21- Gastroenterologia\n");

printf("22- Genetica medica\n");

printf("23- Geriatria\n");

printf("24- Ginecologia e Obstetricia\n");

printf("25- Hematologia e Hemoterapia\n");

printf("26- Homeopatia\n");
printf("27- Infectologia\n");

printf("28- Mastologia\n");

printf("29- Medicina de Familia e Comunidade\n");

printf("30- Medicina de Emergência\n");

printf("31- Medicina do Trabalho\n");

printf("32- Medicina do Trafego\n");

printf("33- Medicina Esportiva\n");

printf("34- Medicina Fisica e Reabilitacao\n");

printf("35- Medicina Intensiva\n");

printf("36- Medicina Legal e Pericia Medica (ou medicina forense)\n");

printf("37- Medicina Nuclear\n");

printf("38- Medicina Preventiva e Social\n");

printf("39- Nefrologia\n");

printf("40- Neurocirurgia\n");

printf("41- Neurologia\n");

printf("42- Nutrologia\n");

printf("43- Obstetricia\n");

printf("44- Oftalmologia\n");

printf("45- Ortopedia e Traumatologia\n");

printf("46- Otorrinolaringologia\n");

printf("47- Patologia\n");

printf("48- Patologia Clínica/Medicina laboratorial\n");

printf("49- Pediatria\n");

printf("50- Pneumologia\n");

printf("51- Psiquiatria\n");

printf("52- Radiologia e Diagnóstico por Imagem\n");

printf("53- Radioterapia\n");

printf("54- Reumatologia\n");

printf("55- Urologia\n");

scanf("%d", &c.especialidade);

} while (c.especialidade > 55 || c.especialidade < 1);


printf("Preencha a tabela de horarios desse medico:\n1 = Atende\n0 = Nao atende\n\n");

for(i=0; i < 2; i++){

for(j=0; j < 5; j++){

if(j == 0 && i == 0){

printf("Segunda de manha\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 1 && i == 0){

printf("Terca de manha\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 2 && i == 0){

printf("Quarta de manha\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 3 && i == 0){

printf("Quinta de manha\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 4 && i == 0){

printf("Sexta de manha\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 0 && i == 1){

printf("Segunda de tarde\n");

do{
scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 1 && i == 1){

printf("Terca de tarde\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 2 && i == 1){

printf("Quarta de tarde\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 3 && i == 1){

printf("Quinta de tarde\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 4 && i == 1){

printf("Sexta de tarde\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

c.status = 1;

status = fwrite(&c, sizeof(tmedicos), 1, arq);

if (status != 1) {

printf("Erro de gravacao \n");

else {
printf("Cliente cadastrado com sucesso \n");

inserir_med(arq, &raiz, crm);

void procura_especialidade(FILE * arq, int esp) {

int status, i, j;

tmedicos c;

fseek(arq, 0, 0);

while (1) {

status = fread(&c, sizeof(tmedicos), 1, arq);

if (status != 1) {

if (!feof(arq)) {

return -2; // erro de leitura

else {

return -1; // não achou

else {

if (c.status == 1 && c.especialidade == esp) {

printf("CRM: ");

puts(c.crm);

printf("\n");

printf("Nome: ");

puts(c.nome);

printf("\n");

printf("Especialidade: ");

printf("%d", c.especialidade);

printf("\n");
printf("Tabela de horarios:\n");

for (i = 0; i < 2; i++) {

for (j = 0; j < 5; j++){

printf("%.2f ", c.horarios[i][j]);

printf("\n");

void consultar_nome(FILE * arq, char nome[]) {

int status, pos = -1;

tmedicos c;

fseek(arq, 0, 0);

while (1) {

status = fread(&c, sizeof(tmedicos), 1, arq);

if (status != 1) {

if (!feof(arq)) {

return -2; // erro de leitura

else {

return -1; // não achou

else {

pos++;

if (c.status == 1 && strcmp(c.nome, nome) == 0) {

printf("CRM: ");

puts(c.crm);
printf("\n");

printf("Especialidade: ");

printf("%d", c.especialidade);

printf("\n");

printf("Turnos:\n");

printf("Segunda:\n");

if (c.horarios[0][0] == 1 && c.horarios[1][0] == 1){

printf("Manha e tarde\n");

} else if (c.horarios[0][0] == 0 && c.horarios[1][0] == 1){

printf("Tarde\n");

} else if (c.horarios[0][0] == 1 && c.horarios[1][0] == 0){

printf("Manha\n");

} else {

printf("Nao atende nesse dia\n");

printf("Terca:\n");

if (c.horarios[0][1] == 1 && c.horarios[1][1] == 1){

printf("Manha e tarde\n");

} else if (c.horarios[0][1] == 0 && c.horarios[1][1] == 1){

printf("Tarde\n");

} else if (c.horarios[0][1] == 1 && c.horarios[1][1] == 0){

printf("Manha\n");

} else {

printf("Nao atende nesse dia\n");

printf("Quarta:\n");

if (c.horarios[0][2] == 1 && c.horarios[1][2] == 1){

printf("Manha e tarde\n");

} else if (c.horarios[0][2] == 0 && c.horarios[1][2] == 1){

printf("Tarde\n");

} else if (c.horarios[0][2] == 1 && c.horarios[1][2] == 0){


printf("Manha\n");

} else {

printf("Nao atende nesse dia\n");

printf("Quinta:\n");

if (c.horarios[0][3] == 1 && c.horarios[1][3] == 1){

printf("Manha e tarde\n");

} else if (c.horarios[0][3] == 0 && c.horarios[1][3] == 1){

printf("Tarde\n");

} else if (c.horarios[0][3] == 1 && c.horarios[1][3] == 0){

printf("Manha\n");

} else {

printf("Nao atende nesse dia\n");

printf("Sexta:\n");

if (c.horarios[0][4] == 1 && c.horarios[1][4] == 1){

printf("Manha e tarde\n");

} else if (c.horarios[0][4] == 0 && c.horarios[1][4] == 1){

printf("Tarde\n");

} else if (c.horarios[0][4] == 1 && c.horarios[1][4] == 0){

printf("Manha\n");

} else {

printf("Nao atende nesse dia\n");

break;

tno_med * maior_med(tno_med *raiz) {


tno_med * aux;

aux = raiz;

if (aux->dir == NULL) {

raiz = raiz->esq;

return aux;

else {

return maior_med(raiz->dir);

void remover_no_med(tno_med **raiz) {

tno_med * aux;

aux = *raiz;

if ((*raiz)->esq == NULL && (*raiz)->dir == NULL)

*raiz = NULL;

else if ((*raiz)->esq == NULL)

*raiz = (*raiz)->dir;

else if ((*raiz)->dir == NULL)

*raiz = (*raiz)->esq;

else {

aux = maior_med((*raiz)->esq);

strcpy((*raiz)->crm, aux->crm);

free(aux);

void remover_indice_med(tno_med **raiz, char crm[]) {

tmedicos c;

if (*raiz == NULL) {

printf("Arvore Vazia\n");
}

else if (strcmp(crm, (*raiz)->crm) == 0) {

remover_no_med(&(*raiz));

else {

if (strcmp(crm, (*raiz)->crm) < 0) {

remover_indice_med(&((*raiz)->esq), crm);

else {

remover_indice_med(&((*raiz)->dir), crm);

void remover_med(FILE * arq, char crm[], tno_med *raiz) {

tmedicos c;

int pos = buscar_no_indice_medicos(raiz, crm), status;

if (pos == -1) {

printf("Medico nao encontrado\n");

} else {

fseek(arq, pos * sizeof(tmedicos), 0);

status = fread(&c, sizeof(tmedicos), 1, arq);

if (status != 1){

printf("Erro de leitura \n");

}else {

c.status = 0;

fseek(arq, -sizeof(tmedicos), 1);

status = fwrite(&c, sizeof(tmedicos), 1, arq);

if (status != 1) {

printf("Erro de gravacao \n");

}
else {

printf("Medico removido com sucesso \n");

remover_indice_med(&raiz, crm);

void alterar_indice_med(FILE * arq, tno_med *raiz, char crm[]) {

int status, i, j;

tmedicos c = retorna_medico(raiz, arq, crm);

tno_med * aux;

if (buscar_no_indice_medicos(raiz, crm) == -1) {

printf("Medico nao encontrado\n");

} else {

aux = raiz;

aux -> pos = buscar_no_indice_medicos(aux,crm);

strcpy(aux->nome, c.nome);

strcpy(aux->especialidade, c.especialidade);

for(i = 0 ; i < 2 ; i++){

for(j = 0 ; j < 5 ; j++){

aux -> horarios[i][j] = c.horarios[i][j];

void alterar_medico(FILE * arq, char crm[], tno_med *raiz) {

tmedicos c;

int pos = buscar_no_indice_medicos(raiz, crm), status, i, j;

char escolha;
if (pos == -1) {

printf("Medico nao encontrado\n");

} else {

fseek(arq, pos * sizeof(tmedicos), 0);

status = fread(&c, sizeof(tmedicos), 1, arq);

if (status != 1){

printf("Erro de leitura\n");

} else {

do {

printf("O que você deseja alterar?\n");

printf("1.Nome\n");

printf("2.Especialidade\n");

printf("3.Tabela de horarios\n");

printf("4.Continuar o programa\n");

escolha = getche();

switch (escolha) {

case '1':

do {

printf("Informe o novo nome desse medico: \n");

fgets(c.nome, 99, stdin);

} while (validar_nome(c.nome) == 0);

break;

case '2':

do {

printf("Informe a nova especialidade desse medico:\n");

printf("1- Acupuntura\n");

printf("2- Alergia e Imunologia\n");

printf("3- Anestesiologia\n");

printf("4- Angiologia\n");

printf("5- Cancerologia (Oncologia)\n");

printf("6- Cardiologia\n");
printf("7- Cirurgia Cardiovascular\n");

printf("8- Cirurgia da Mao\n");

printf("9- Cirurgia de Cabeca e Pescoco\n");

printf("10- Cirurgia do Aparelho Digestivo\n");

printf("11- Cirurgia Geral\n");

printf("12- Cirurgia Pediatrica\n");

printf("13- Cirurgia Plastica\n");

printf("14- Cirurgia Toracica\n");

printf("15- Cirurgia Vascular\n");

printf("16- Clinica Medica (Medicina interna)\n");

printf("17- Coloproctologia\n");

printf("18- Dermatologia\n");

printf("19- Endocrinologia e Metabologia\n");

printf("20- Endoscopia\n");

printf("21- Gastroenterologia\n");

printf("22- Genetica medica\n");

printf("23- Geriatria\n");

printf("24- Ginecologia e Obstetricia\n");

printf("25- Hematologia e Hemoterapia\n");

printf("26- Homeopatia\n");

printf("27- Infectologia\n");

printf("28- Mastologia\n");

printf("29- Medicina de Familia e Comunidade\n");

printf("30- Medicina de Emergência\n");

printf("31- Medicina do Trabalho\n");

printf("32- Medicina do Trafego\n");

printf("33- Medicina Esportiva\n");

printf("34- Medicina Fisica e Reabilitacao\n");

printf("35- Medicina Intensiva\n");

printf("36- Medicina Legal e Pericia Medica (ou medicina forense)\n");

printf("37- Medicina Nuclear\n");


printf("38- Medicina Preventiva e Social\n");

printf("39- Nefrologia\n");

printf("40- Neurocirurgia\n");

printf("41- Neurologia\n");

printf("42- Nutrologia\n");

printf("43- Obstetricia\n");

printf("44- Oftalmologia\n");

printf("45- Ortopedia e Traumatologia\n");

printf("46- Otorrinolaringologia\n");

printf("47- Patologia\n");

printf("48- Patologia Clínica/Medicina laboratorial\n");

printf("49- Pediatria\n");

printf("50- Pneumologia\n");

printf("51- Psiquiatria\n");

printf("52- Radiologia e Diagnóstico por Imagem\n");

printf("53- Radioterapia\n");

printf("54- Reumatologia\n");

printf("55- Urologia\n");

scanf("%d", &c.especialidade);

} while (c.especialidade > 55 || c.especialidade < 1);

break;

case '3':

printf("Preencha a nova tabela de horarios desse medico:\n1 = Atende\n0 = Nao


atende\n\n");

for(i=0; i < 2; i++){

for(j=0; j < 5; j++){

if(j == 0 && i == 0){

printf("Segunda de manha\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);


} else if(j == 1 && i == 0){

printf("Terca de manha\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 2 && i == 0){

printf("Quarta de manha\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 3 && i == 0){

printf("Quinta de manha\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 4 && i == 0){

printf("Sexta de manha\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 0 && i == 1){

printf("Segunda de tarde\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 1 && i == 1){

printf("Terca de tarde\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 2 && i == 1){


printf("Quarta de tarde\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 3 && i == 1){

printf("Quinta de tarde\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

} else if(j == 4 && i == 1){

printf("Sexta de tarde\n");

do{

scanf("%d", &c.horarios[i][j]);

} while (c.horarios[i][j] > 1 || c.horarios[i][j] < 0);

case '4':

break;

} while (escolha != '4');

fseek(arq, -sizeof(tmedicos), 1);

status = fwrite(&c, sizeof(tmedicos), 1, arq);

if (status != 1) {

printf("Erro de gravacao \n");

} else {

printf("Medico alterado com sucesso \n");

alterar_indice_med(arq, raiz, crm);

}
}

//moduloconsultas.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

#include "moduloclientes.h"

#include "modulomedicos.h"

#include "Queue.h"

#include "types.h"

int valida_numero(char *str) {

int i;

for (i = 0; str[i] != '\0'; i++){

if (str[i] != '/' && !isdigit(str[i])){

return 0;

return 1;

int valida_data(char *str){

int i = 0, v = valida_numero(*str);

long data[3];

const char delimitador[2] = "/";

char *token = strtok(str, delimitador);

const char substring[3] = "//";

if (strstr(str, substring) != NULL){


return 0;

if (v != 1){

return 0;

while (token != NULL){

data[i++] = strtol(token, NULL, 10);

token = strtok(NULL, delimitador);

if(data[1] > 12 || data[1] < 1){

return 0;

if(data[0] > 31 || data[0] < 1){

return 0;

if (data[1] == 4 || data[1] == 6 || data[1] == 9 || data[1] == 11 && data[0] > 30){

return 0;

if (data[2] % 4 == 0 && (data[2] % 400 == 0 || data[2] % 100 != 0)){

if (data[0] > 29 && data[1] == 2){

return 0;

} else {

if (data[0] > 28 && data[1] == 2){

return 0;

return 1;

int valida_dia(char *str){


int DiasDoAno, Dias31, AnosBiss, i = 0;

long int Anos, NumDias;

long data[3];

const char delimitador[2] = "/";

char *token = strtok(str, delimitador);

while (token != NULL){

data[i++] = strtol(token, NULL, 10);

token = strtok(NULL, delimitador);

if (data[1] < 9){

Dias31 = data[1] / 2;

}else{

Dias31 = ( data[1] + 1 ) / 2;

DiasDoAno = 30 * ( data[1] - 1 ) + data[0] + Dias31;

if ( data[1] >= 2 ){

if (data[2] % 4 == 0 && (data[2] % 400 == 0 || data[2] % 100 != 0)){

DiasDoAno = DiasDoAno - 1;

} else {

DiasDoAno = DiasDoAno - 2;

AnosBiss = data[2] / 4 - 400 - ( data[2] / 100 - 16 ) + ( data[2] / 400 - 4 ) + 1;

if (data[2] == 1600){

NumDias = DiasDoAno;

} else {

NumDias = Anos * 365 + DiasDoAno + AnosBiss;

switch ( NumDias % 7 ){

case 1: return -2; //sábado

case 2: return -1; //domingo


case 3: return 0; //segunda-feira

case 4: return 1; //terça-feira

case 5: return 2; //quarta-feira

case 6: return 3; //quinta-feira

case 7: return 4; //sexta-feira

default: return -3; // dia inválido

void marcar_consulta(FILE * arq_cliente, FILE * arq_medico, FILE * arq_consulta, tno ** raiz_cliente,


tno_med ** raiz_medico, char cpf[], char crm[]) {

char data[20];

int op, dia, t, status, cliente = buscar_no_indice(raiz_cliente, cpf), medico =


buscar_no_indice_medicos(raiz_medico, crm), poscliente = buscar_no_indice(raiz_cliente, cpf),
posmedicos = buscar_no_indice_medicos(raiz_medico, crm);

tcliente a;

tmedicos d;

tconsulta m;

if (poscliente >= 0) {

a = retorna_cliente(raiz_cliente, arq_cliente, cpf);

else {

printf("Cliente nao encontado\n");

return;

if (posmedicos >= 0) {

d = retorna_medico(raiz_medico,arq_medico, crm);

else {

printf("Medico nao encontado\n");

return;

}
do{

printf("Digite uma data valida para a consulta (dd/mm/aaaa):\n");

fgets(data, 19, stdin);

}while(valida_data(&data) == 0);

dia = valida_dia(&data);

do{

printf("Digite um turno para a consulta\n1-Manha\n2-Tarde\n");

scanf("%d", &t);

}while(t > 2 || t < 1);

if(dia == 0){

if(d.horarios[0][0] == 0 && d.horarios[1][0] == 0){

printf("Esse medico esta indisponivel nesse dia\n");

} else {

printf("Medico disponivel para esse dia\n");

if(t == 1){

if(d.horarios[0][0] == 0){

printf("Esse medico esta indisponivel nesse horario\n");

} else {

printf("Medico disponivel para esse horario\n");

if(manha >= 9){

printf("Nao ha mais vagas disponiveis para marcar consulta. Deseja entrar em uma fila
de espera?\n1-Sim\n2-Nao\n");

do{

scanf("%d", &op);

}while(op < 1 || op > 2);

if(op == 1){

enqueue_manha(&m, &a);

printf("Insercao na fila efetuada com sucesso\n");

} else {

fseek(arq_consulta, 0, 2);
strcpy(m.cpf, cpf);

strcpy(m.crm, crm);

strcpy(m.data_consulta, data);

m.turno = t;

m.status = 0;

m.paciente_manha[manha] = &a;

manha++;

status = fwrite(&m, sizeof(tconsulta), 1, arq_consulta);

if (status != 1) {

printf("Erro de gravacao\n");

else {

printf("Consulta marcada com sucesso \n");

} else if (t == 2){

if(d.horarios[1][0] == 0){

printf("Esse medico esta indisponivel nesse horario\n");

} else {

printf("Medico disponivel para esse horario\n");

if(tarde >= 9){

printf("Nao ha mais vagas disponiveis para marcar consulta. Deseja entrar em uma fila
de espera?\n1-Sim\n2-Nao\n");

do{

scanf("%d", &op);

}while(op < 1 || op > 2);

if(op == 1){

enqueue_tarde(&t, &a);

printf("Insercao na fila efetuada com sucesso\n");

}
} else {

fseek(arq_consulta, 0, 2);

strcpy(m.cpf, cpf);

strcpy(m.crm, crm);

strcpy(m.data_consulta, data);

m.turno = t;

m.status = 0;

m.paciente_tarde[tarde] = &a;

tarde++;

status = fwrite(&m, sizeof(tconsulta), 1, arq_consulta);

if (status != 1) {

printf("Erro de gravacao\n");

else {

printf("Consulta marcada com sucesso \n");

} else if (dia == 1){

if(d.horarios[0][1] == 0 && d.horarios[1][1] == 0){

printf("Esse medico esta indisponivel nesse dia\n");

} else {

printf("Medico disponivel para esse dia\n");

if(t == 1){

if(d.horarios[0][1] == 0){

printf("Esse medico esta indisponivel nesse horario\n");

} else {

printf("Medico disponivel para esse horario\n");

if(manha >= 9){


printf("Nao ha mais vagas disponiveis para marcar consulta. Deseja entrar em uma fila
de espera?\n1-Sim\n2-Nao\n");

do{

scanf("%d", &op);

}while(op < 1 || op > 2);

if(op == 1){

enqueue_manha(&m, &a);

printf("Insercao na fila efetuada com sucesso\n");

} else {

fseek(arq_consulta, 0, 2);

strcpy(m.cpf, cpf);

strcpy(m.crm, crm);

strcpy(m.data_consulta, data);

m.turno = t;

m.status = 0;

m.paciente_manha[manha] = &a;

manha++;

status = fwrite(&m, sizeof(tconsulta), 1, arq_consulta);

if (status != 1) {

printf("Erro de gravacao\n");

else {

printf("Consulta marcada com sucesso \n");

} else if (t == 2){

if(d.horarios[1][1] == 0){

printf("Esse medico esta indisponivel nesse horario\n");

} else {
printf("Medico disponivel para esse horario\n");

if(tarde >= 9){

printf("Nao ha mais vagas disponiveis para marcar consulta. Deseja entrar em uma fila
de espera?\n1-Sim\n2-Nao\n");

do{

scanf("%d", &op);

}while(op < 1 || op > 2);

if(op == 1){

enqueue_tarde(&t, &a);

printf("Insercao na fila efetuada com sucesso\n");

} else {

fseek(arq_consulta, 0, 2);

strcpy(m.cpf, cpf);

strcpy(m.crm, crm);

strcpy(m.data_consulta, data);

m.turno = t;

m.status = 0;

m.paciente_tarde[tarde] = &a;

tarde++;

status = fwrite(&m, sizeof(tconsulta), 1, arq_consulta);

if (status != 1) {

printf("Erro de gravacao\n");

else {

printf("Consulta marcada com sucesso \n");

}
} else if (dia == 2){

if(d.horarios[0][2] == 0 && d.horarios[1][2] == 0){

printf("Esse medico esta indisponivel nesse dia\n");

} else {

printf("Medico disponivel para esse dia\n");

if(t == 1){

if(d.horarios[0][2] == 0){

printf("Esse medico esta indisponivel nesse horario\n");

} else {

printf("Medico disponivel para esse horario\n");

if(manha >= 9){

printf("Nao ha mais vagas disponiveis para marcar consulta. Deseja entrar em uma fila
de espera?\n1-Sim\n2-Nao\n");

do{

scanf("%d", &op);

}while(op < 1 || op > 2);

if(op == 1){

enqueue_manha(&m, &a);

printf("Insercao na fila efetuada com sucesso\n");

} else {

fseek(arq_consulta, 0, 2);

strcpy(m.cpf, cpf);

strcpy(m.crm, crm);

strcpy(m.data_consulta, data);

m.turno = t;

m.status = 0;

m.paciente_manha[manha] = &a;

manha++;

status = fwrite(&m, sizeof(tconsulta), 1, arq_consulta);

if (status != 1) {
printf("Erro de gravacao\n");

else {

printf("Consulta marcada com sucesso \n");

} else if (t == 2){

if(d.horarios[1][2] == 0){

printf("Esse medico esta indisponivel nesse horario\n");

} else {

printf("Medico disponivel para esse horario\n");

if(tarde >= 9){

printf("Nao ha mais vagas disponiveis para marcar consulta. Deseja entrar em uma fila
de espera?\n1-Sim\n2-Nao\n");

do{

scanf("%d", &op);

}while(op < 1 || op > 2);

if(op == 1){

enqueue_tarde(&t, &a);

printf("Insercao na fila efetuada com sucesso\n");

} else {

fseek(arq_consulta, 0, 2);

strcpy(m.cpf, cpf);

strcpy(m.crm, crm);

strcpy(m.data_consulta, data);

m.turno = t;

m.status = 0;

m.paciente_tarde[tarde] = &a;

tarde++;
status = fwrite(&m, sizeof(tconsulta), 1, arq_consulta);

if (status != 1) {

printf("Erro de gravacao\n");

else {

printf("Consulta marcada com sucesso \n");

} else if (dia == 3){

if(d.horarios[0][3] == 0 && d.horarios[1][3] == 0){

printf("Esse medico esta indisponivel nesse dia\n");

} else {

printf("Medico disponivel para esse dia\n");

if(t == 1){

if(d.horarios[0][3] == 0){

printf("Esse medico esta indisponivel nesse horario\n");

} else {

printf("Medico disponivel para esse horario\n");

if(manha >= 9){

printf("Nao ha mais vagas disponiveis para marcar consulta. Deseja entrar em uma fila
de espera?\n1-Sim\n2-Nao\n");

do{

scanf("%d", &op);

}while(op < 1 || op > 2);

if(op == 1){

enqueue_manha(&m, &a);

printf("Insercao na fila efetuada com sucesso\n");

}
} else {

fseek(arq_consulta, 0, 2);

strcpy(m.cpf, cpf);

strcpy(m.crm, crm);

strcpy(m.data_consulta, data);

m.turno = t;

m.status = 0;

m.paciente_manha[manha] = &a;

manha++;

status = fwrite(&m, sizeof(tconsulta), 1, arq_consulta);

if (status != 1) {

printf("Erro de gravacao\n");

else {

printf("Consulta marcada com sucesso \n");

} else if (t == 2){

if(d.horarios[1][3] == 0){

printf("Esse medico esta indisponivel nesse horario\n");

} else {

printf("Medico disponivel para esse horario\n");

if(tarde >= 9){

printf("Nao ha mais vagas disponiveis para marcar consulta. Deseja entrar em uma fila
de espera?\n1-Sim\n2-Nao\n");

do{

scanf("%d", &op);

}while(op < 1 || op > 2);

if(op == 1){

enqueue_tarde(&t, &a);
printf("Insercao na fila efetuada com sucesso\n");

} else {

fseek(arq_consulta, 0, 2);

strcpy(m.cpf, cpf);

strcpy(m.crm, crm);

strcpy(m.data_consulta, data);

m.turno = t;

m.status = 0;

m.paciente_tarde[tarde] = &a;

tarde++;

status = fwrite(&m, sizeof(tconsulta), 1, arq_consulta);

if (status != 1) {

printf("Erro de gravacao\n");

else {

printf("Consulta marcada com sucesso \n");

} else if (dia == 4){

if(d.horarios[0][4] == 0 && d.horarios[1][4] == 0){

printf("Esse medico esta indisponivel nesse dia\n");

} else {

printf("Medico disponivel para esse dia\n");

if(t == 1){

if(d.horarios[0][4] == 0){

printf("Esse medico esta indisponivel nesse horario\n");

} else {
printf("Medico disponivel para esse horario\n");

if(manha >= 9){

printf("Nao ha mais vagas disponiveis para marcar consulta. Deseja entrar em uma fila
de espera?\n1-Sim\n2-Nao\n");

do{

scanf("%d", &op);

}while(op < 1 || op > 2);

if(op == 1){

enqueue_manha(&m, &a);

printf("Insercao na fila efetuada com sucesso\n");

} else {

fseek(arq_consulta, 0, 2);

strcpy(m.cpf, cpf);

strcpy(m.crm, crm);

strcpy(m.data_consulta, data);

m.turno = t;

m.status = 0;

m.paciente_manha[manha] = &a;

manha++;

status = fwrite(&m, sizeof(tconsulta), 1, arq_consulta);

if (status != 1) {

printf("Erro de gravacao\n");

else {

printf("Consulta marcada com sucesso \n");

} else if (t == 2){

if(d.horarios[1][4] == 0){
printf("Esse medico esta indisponivel nesse horario\n");

} else {

printf("Medico disponivel para esse horario\n");

if(tarde >= 9){

printf("Nao ha mais vagas disponiveis para marcar consulta. Deseja entrar em uma fila
de espera?\n1-Sim\n2-Nao\n");

do{

scanf("%d", &op);

}while(op < 1 || op > 2);

if(op == 1){

enqueue_tarde(&t, &a);

printf("Insercao na fila efetuada com sucesso\n");

} else {

fseek(arq_consulta, 0, 2);

strcpy(m.cpf, cpf);

strcpy(m.crm, crm);

strcpy(m.data_consulta, data);

m.turno = t;

m.status = 0;

m.paciente_tarde[tarde] = &a;

tarde++;

status = fwrite(&m, sizeof(tconsulta), 1, arq_consulta);

if (status != 1) {

printf("Erro de gravacao\n");

else {

printf("Consulta marcada com sucesso \n");

}
}

} else if (dia == -2 || dia == -1){

printf("Os medicos estao indisponiveis em finais de semana\n");

} else{

printf("Dia invalido\n");

void consultar_pacientes(FILE * arq, char crm[], char data[], int turno) {

int status, i;

tconsulta c;

fseek(arq, 0, 0);

while (1) {

status = fread(&c, sizeof(tconsulta), 1, arq);

if (status != 1) {

if (!feof(arq)) {

return -2; // erro de leitura

} else {

return -1; // não achou

} else {

if (c.status == 0 && strcmp(c.crm, crm) == 0 && strcmp(c.data_consulta, data) == 0 &&


c.turno == turno ){

for(i = 0; i < 10; i++){

if(turno == 1){

puts(c.paciente_manha[i]->nome);

printf("\n");

} else {

puts(c.paciente_tarde[i]->nome);

printf("\n");
}

break;

void consultar_medicos(FILE * arq_consulta, char cpf[], tno_med *raiz, FILE *arq_medicos) {

int status;

tmedicos m;

tconsulta c;

fseek(arq_consulta, 0, 0);

while (1) {

status = fread(&c, sizeof(tconsulta), 1, arq_consulta);

if (status != 1) {

if (!feof(arq_consulta)) {

return -2; // erro de leitura

} else {

return -1; // não achou

} else {

if (c.status == 0 && strcmp(c.cpf, cpf) == 0){

m = retorna_medico(raiz, arq_medicos, c.crm);

puts(m.nome);

printf("\n");

puts(m.crm);

printf("\n");

printf("%d", m.especialidade);

puts(c.data_consulta);

printf("%d", c.turno);
}

if(feof(arq_consulta)){

break;

void desmarcar_consultas(FILE * arq, char cpf[], char crm[]) {

int status;

tconsulta c;

fseek(arq, 0, 0);

while (1) {

status = fread(&c, sizeof(tconsulta), 1, arq);

if (status != 1) {

if (!feof(arq)) {

return -2; // erro de leitura

} else {

return -1; // não achou

} else {

if (c.status == 0 && strcmp(c.cpf, cpf) == 0 && strcmp(c.crm, crm) == 0){

c.status = -1;

if(c.turno == 1){

if(isempty_manha(m) == FALSE){

c.paciente_manha[manha] = dequeue_manha(m);

fseek(arq, -sizeof(tconsulta), 1);

status = fwrite(&c, sizeof(tconsulta), 1, arq);

if (status != 1) {

printf("Erro de gravacao\n");

} else {
printf("Consulta desmarcada com sucesso\n");

} else{

manha--;

fseek(arq, -sizeof(tconsulta), 1);

status = fwrite(&c, sizeof(tconsulta), 1, arq);

if (status != 1) {

printf("Erro de gravacao\n");

} else {

printf("Consulta desmarcada com sucesso\n");

}else if(isempty_tarde(t) == FALSE){

c.paciente_tarde[tarde] = dequeue_manha(t);

fseek(arq, -sizeof(tconsulta), 1);

status = fwrite(&c, sizeof(tconsulta), 1, arq);

if (status != 1) {

printf("Erro de gravacao\n");

} else {

printf("Consulta desmarcada com sucesso\n");

} else {

tarde--;

fseek(arq, -sizeof(tconsulta), 1);

status = fwrite(&c, sizeof(tconsulta), 1, arq);

if (status != 1) {

printf("Erro de gravacao\n");

else {

printf("Consulta desmarcada com sucesso\n");

}
}

return;

//incializar-encerrar.c

#include "types.h"

#include "Queue.h"

#include "Stack.h"

#include "moduloclientes.h"

#include "modulomedicos.h"

#include "moduloconsultas.h"

#include <stdio.h>

#include <string.h>

#include <time.h>

#include <stdlib.h>

FILE * criarArquivo(char nome[]) {

FILE * arq;

arq = fopen(nome, "r+b");

if (arq == NULL) {

arq = fopen(nome, "w+b");

if (arq == NULL) {

printf("Erro ao tentar criar o arquivo %s\n\n",nome);

printf("Arquivo %s criado com sucesso\n\n", nome);


}

printf("Arquivo %s aberto com sucesso\n\n",nome);

return arq;

void montar_indice_clientes(FILE * arq, tno ** raiz) {

tcliente c;

int status;

fseek(arq, 0, 0);

while (1) {

status = fread(&c, sizeof(tcliente), 1, arq);

if (status != 1) {

if (!feof(arq))

printf("Erro de leitura\n");

break;

else {

if (c.status == 1) {

inserir(arq, raiz, c.cpf);

void montar_indice_medicos(FILE * arq, tno_med ** raiz) {

tmedicos m;

int status;

fseek(arq, 0, 0);

while (1) {

status = fread(&m, sizeof(tmedicos), 1, arq);

if (status != 1) {
if (!feof(arq))

printf("Erro de leitura\n");

break;

else {

if (m.status == 1) {

inserir_med(arq, raiz, m.crm);

int verificar(FILE *arq_consulta){

tconsulta c;

char data[9];

int status;

_strdate(data);

fseek(arq_consulta, 0, 0);

while (1) {

status = fread(&c, sizeof(tconsulta), 1, arq_consulta);

if (status != 1) {

if (!feof(arq_consulta)) {

return -2; // erro de leitura

} else {

return -1; // não achou

} else {

if (c.status == 0 && strcmp(c.data_consulta, data) <= 0){

c.status = 1;

if(c.turno == 1){

if(isempty_manha(m) == FALSE){
c.paciente_manha[manha] = dequeue_manha(m);

fseek(arq_consulta, -sizeof(tconsulta), 1);

status = fwrite(&c, sizeof(tconsulta), 1, arq_consulta);

if (status != 1) {

printf("Erro de gravacao\n");

} else {

printf("Consulta concluida com sucesso\n");

} else{

manha--;

fseek(arq_consulta, -sizeof(tconsulta), 1);

status = fwrite(&c, sizeof(tconsulta), 1, arq_consulta);

if (status != 1) {

printf("Erro de gravacao\n");

} else {

printf("Consulta concluida com sucesso\n");

} else if(isempty_tarde(t) == FALSE){

c.paciente_manha[manha] = dequeue_manha(m);

fseek(arq_consulta, -sizeof(tconsulta), 1);

status = fwrite(&c, sizeof(tconsulta), 1, arq_consulta);

if (status != 1) {

printf("Erro de gravacao\n");

} else {

printf("Consulta concluida com sucesso\n");

} else {

tarde--;

fseek(arq_consulta, -sizeof(tconsulta), 1);

status = fwrite(&c, sizeof(tconsulta), 1, arq_consulta);


if (status != 1) {

printf("Erro de gravacao\n");

else {

printf("Consulta concluida com sucesso\n");

break;

void limpar_indice_clientes(tno **raiz) {

tno *aux, *aux2;

Stack pilha;

if (*raiz == NULL) {

printf("Arvore vazia\n");

else {

createStack(&pilha);

aux = *raiz;

while (aux != NULL || isEmpty(pilha) == FALSE) {

if (aux != NULL) {

push(&pilha, aux);

aux = aux->esq;

else {

if (isEmpty(pilha) == FALSE) {

aux = pop(&pilha);

aux2 = aux;
aux = aux->dir;

free(aux2);

*raiz = NULL;

void limpar_indice_medicos(tno_med **raiz) {

tno_med *aux, *aux2;

Stack pilha;

if (*raiz == NULL) {

printf("Arvore vazia\n");

else {

createStack(&pilha);

aux = *raiz;

while (aux != NULL || isEmpty(pilha) == FALSE) {

if (aux != NULL) {

push_med(&pilha, aux);

aux = aux->esq;

else {

if (isEmpty(pilha) == FALSE) {

aux = pop_med(&pilha);

aux2 = aux;

aux = aux->dir;

free(aux2);

}
}

*raiz = NULL;

void manutencao_clientes(FILE * arq) {

int status;

tcliente c;

FILE * aux;

aux = fopen("auxiliar", "w+b");

if (aux == NULL) {

printf("Erro ao executar o processo de manutenção do arquivo\n");

fclose(arq);

else {

fseek(arq, 0, 0);

while (1) {

status = fread(&c, sizeof(tcliente), 1, arq);

if (status != 1) {

if (!feof(arq)) {

printf("Erro ao executar o processo de manutencao do arquivo\n");

fclose(arq);

fclose(aux);

remove("auxiliar");

return;

else {

break;

else {
if (c.status == 1) {

status = fwrite(&c, sizeof(tcliente), 1, aux);

if (status != 1) {

printf("Erro ao executar o processo de manutenção do arquivo\n");

fclose(arq);

fclose(aux);

remove("auxiliar");

return;

fclose(arq);

fclose(aux);

remove("clientes.dat");

rename("auxiliar", "clientes.dat");

void manutencao_medicos(FILE * arq) {

int status;

tmedicos m;

FILE * aux;

aux = fopen("auxiliar", "w+b");

if (aux == NULL) {

printf("Erro ao executar o processo de manutencao do arquivo\n");

fclose(arq);

else {

fseek(arq, 0, 0);

while (1) {
status = fread(&m, sizeof(tmedicos), 1, arq);

if (status != 1) {

if (!feof(arq)) {

printf("Erro ao executar o processo de manutenção do arquivo\n");

fclose(arq);

fclose(aux);

remove("auxiliar");

return;

else {

break;

else {

if (m.status == 1) {

status = fwrite(&m, sizeof(tmedicos), 1, aux);

if (status != 1) {

printf("Erro ao executar o processo de manutenção do arquivo\n");

fclose(arq);

fclose(aux);

remove("auxiliar");

return;

fclose(arq);

fclose(aux);

remove("medicos.dat");

rename("auxiliar", "medicos.dat");

}
}

void manutencao_consulta(FILE * arq) {

int status;

tconsulta c;

FILE * aux;

aux = fopen("auxiliar", "w+b");

if (aux == NULL) {

printf("Erro ao executar o processo de manutencao do arquivo\n");

fclose(arq);

else {

fseek(arq, 0, 0);

while (1) {

status = fread(&c, sizeof(tconsulta), 1, arq);

if (status != 1) {

if (!feof(arq)) {

printf("Erro ao executar o processo de manutenção do arquivo\n");

fclose(arq);

fclose(aux);

remove("auxiliar");

return;

else {

break;

else {

if (c.status == 1) {

status = fwrite(&c, sizeof(tconsulta), 1, aux);

if (status != 1) {
printf("Erro ao executar o processo de manutenção do arquivo\n");

fclose(arq);

fclose(aux);

remove("auxiliar");

return;

fclose(arq);

fclose(aux);

remove("consultas.dat");

rename("auxiliar", "consultas.dat");

//Queue.c

#include "types.h"

#include <stdio.h>

Queue createqueue (){

tdescritor *aux;

aux = (tdescritor*)malloc(sizeof(tdescritor));

aux -> inicio = NULL;

aux -> fim = NULL;

return aux;

void enqueue_manha (Queue *m, tcliente *c){


tnoqueue *novo;

novo = (tnoqueue*)malloc(sizeof(tnoqueue));

novo -> fila_de_espera = c;

novo -> prox = NULL;

if((*m) -> inicio == NULL){

(*m) -> inicio = novo;

(*m) -> fim = novo;

} else {

(*m) -> fim -> prox = novo;

(*m) -> fim = novo;

void enqueue_tarde (Queue *t, tcliente *c){

tnoqueue *novo;

novo = (tnoqueue*)malloc(sizeof(tnoqueue));

novo -> fila_de_espera = c;

novo -> prox = NULL;

if((*t) -> inicio == NULL){

(*t) -> inicio = novo;

(*t) -> fim = novo;

} else {

(*t) -> fim -> prox = novo;

(*t) -> fim = novo;

tcliente *dequeue_manha (Queue *m){

tcliente *c;

tnoqueue *aux;

aux = (*m) -> inicio;


(*m) -> inicio = aux -> prox;

if((*m) -> inicio == NULL){

(*m) -> fim == NULL;

c = aux ->fila_de_espera;

free(aux);

return c;

tcliente *dequeue_tarde (Queue *t){

tcliente *c;

tnoqueue *aux;

aux = (*t) -> inicio;

(*t) -> inicio = aux -> prox;

if((*t) -> inicio == NULL){

(*t) -> fim == NULL;

c = aux ->fila_de_espera;

free(aux);

return c;

int isempty_manha (Queue m){

if(m -> inicio == NULL){

return TRUE;

} else {

return FALSE;

}
int isempty_tarde (Queue t){

if(t -> inicio == NULL){

return TRUE;

} else {

return FALSE;

//Stack.c

#include "types.h"

#include <stdio.h>

#include <stdlib.h>

void createStack(Stack *s) {

*s = NULL;

void push(Stack *s, tno * c) {

NoStack *novo;

novo = (NoStack *)malloc(sizeof(NoStack));

novo->info = c;

novo->prox = *s;

*s = novo;

void push_med(Stack *s, tno_med * m) {

NoStack *novo;

novo = (NoStack *)malloc(sizeof(NoStack));

novo->info_med = m;
novo->prox = *s;

*s = novo;

tno * pop(Stack *s) {

NoStack * aux;

tno * del;

aux = *s;

*s = (*s)->prox;

del = aux->info;

free(aux);

return del;

tno_med * pop_med(Stack *s) {

NoStack * aux;

tno_med * del;

aux = *s;

*s = (*s)->prox;

del = aux->info_med;

free(aux);

return del;

int isEmpty(Stack s) {

if (s == NULL) {

return TRUE;

else {

return FALSE;

}
}

//main.c

#include "moduloclientes.h"

#include "modulomedicos.h"

#include "moduloconsultas.h"

#include "incializar-encerrar.h"

#include "types.h"

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <string.h>

int main( ){

FILE *clientes, *medicos, *consultas;

tno * indice_clientes = NULL;

tno_med * indice_medicos = NULL;

char data[20], nome[100], cpf[11], crm[8], arq_clientes_nome[] = "clientes.dat",


arq_medicos_nome[] = "medicos.dat", arq_consultas_nome[] = "consultas.dat";

int op, op2, esp, turno;

clientes = criarArquivo(arq_clientes_nome);

medicos = criarArquivo(arq_medicos_nome);

consultas = criarArquivo(arq_consultas_nome);

montar_indice_clientes(clientes, &indice_clientes);

montar_indice_medicos(medicos, &indice_medicos);

do {

printf("\t\t\tMenu Principal\n\n");

printf("Qual modulo deseja acessar?\n");

printf("1.Clientes\n");
printf("2.Medicos\n");

printf("3.Consultas\n");

printf("4.Sair do programa\n");

scanf("%d", &op); fflush(stdin);

if(op == 1){

printf("\n");

printf("1.Cadastrar\n");

printf("2.Alterar\n");

printf("3.Exibir\n");

printf("4.Remover\n");

scanf("%d",&op2);fflush(stdin);

if (op2 == 1){

do{

printf("Informe o cpf para ser cadastrado\n");

fgets(cpf, 10, stdin);

}while (validar_cpf(cpf) == 0);

cadastro(cpf,clientes,indice_clientes);

} else if (op2 == 2){

do {

printf("Informe o cpf do cliente a ser alterado\n");

fgets(cpf, 10, stdin);

} while (validar_cpf(cpf) == 0);

alterar(clientes, cpf, indice_clientes);

} else if (op2 == 3){

do {

printf("Informe o cpf do cliente a ser exibido\n");

fgets(cpf, 10, stdin);

} while (validar_cpf(cpf) == 0);

exibir(indice_clientes, cpf);

} else if (op2 == 4){

do{
printf("Informe o cpf do cliente a ser removido do cadastro\n");

fgets(cpf, 10, stdin);

} while (validar_cpf(cpf) == 0);

remover(clientes, cpf, indice_clientes);

} else {

printf("Opcao Invalida\n");

} else if (op == 2){

printf("\n");

printf("1.Cadastrar\n");

printf("2.Alterar\n");

printf("3.Consultar por especialidade\n");

printf("4.Consultar por nome\n");

printf("5.Remover\n");

scanf("%d", &op2); fflush(stdin);

if(op2 == 1){

do{

printf("Informe o crm para ser cadastrado\n");

fgets(crm, 7, stdin);

} while (validar_crm(crm) == 0);

cadastro_medico(crm, medicos, indice_medicos);

} else if (op2 == 2){

do{

printf("Informe o crm do medico a ser alterado\n");

fgets(crm, 7, stdin);

} while (validar_crm(crm) == 0);

} else if (op2 == 3){

do{

printf("Digite o numero da especialidade do medico\n");

scanf("%d", &esp); fflush(stdin);

} while (esp < 1 || esp > 55);


procura_especialidade(medicos, esp);

} else if (op2 == 4){

do{

printf("Digite o nome do medico\n");

fgets(nome, 99, stdin);

}while(validar_nome(nome) == 0);

consultar_nome(medicos, nome);

} else if (op2 == 5){

do{

printf("Digite o crm do medico a ser removido\n");

fgets(crm, 7, stdin);

} while (validar_crm(crm) == 0);

remover_med(medicos, crm, indice_medicos);

} else if (op == 3){

printf("\n");

printf("1.Marcar consulta\n");

printf("2.Consultar pacientes de um medico\n");

printf("3.Consultar consultas de um paciente\n");

printf("4.Desmarcar consulta\n");

scanf("%d",&op2);fflush(stdin);

if(op2 == 1){

do {

printf("Informe o cpf do cliente\n");

fgets(cpf, 10, stdin);

} while (validar_cpf(cpf) == 0);

do{

printf("Informe o crm do medico\n");

fgets(crm, 7, stdin);

} while (validar_crm(crm) == 0);

marcar_consulta(clientes, medicos, consultas, indice_clientes, indice_medicos, cpf, crm);


} else if (op2 == 2){

do{

printf("Informe o crm do medico\n");

fgets(crm, 7, stdin);

} while (validar_crm(crm) == 0);

do{

printf("Informe a data das consultas (dd/mm/aaaa)\n");

fgets(data, 19, stdin);

}while(valida_data(data) == 0);

do{

printf("Digite o turno\n1-Manha\n2-Tarde\n");

scanf("%d", &turno); fflush(stdin);

}while(turno < 1 || turno > 2);

consultar_pacientes(consultas,crm,data,turno);

} else if (op2 == 3){

do {

printf("Informe o cpf do cliente\n");

fgets(cpf, 10, stdin);

} while (validar_cpf(cpf) == 0);

consultar_medicos(consultas, cpf, indice_medicos, medicos);

} else if (op2 == 4){

do{

printf("Informe o cpf do cliente\n");

fgets(cpf, 10, stdin);

} while (validar_cpf(cpf) == 0);

do{

printf("Informe o crm do medico\n");

fgets(crm, 7, stdin);

} while (validar_crm(crm) == 0);

desmarcar_consultas(consultas, cpf, crm);

} else {
printf("Opcao invalida\n");

verificar(consultas);

}while(op != 4);

limpar_indice_clientes(indice_clientes);

limpar_indice_medicos(indice_medicos);

manutencao_clientes(clientes);

manutencao_medicos(medicos);

manutencao_consulta(consultas);

return 0;

Você também pode gostar