Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda


eduardo azevedo

Pergunta

Nesse codigo, de um prontuario medico é necessario pedir uma data de ocorrencia, mas ele nunca pede e pula pro proximo cadastro. Como q eu ajeito? alguém pf

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

struct registro {
char nome[40];
char endereco[50];
char situacao[100];
char tratamento[150];
char data[20];
int idade;
char status;
}reg;
FILE *fp;

int main(void){

char opcao[2], op;
do{
do{
system("cls");
printf("\t\n\t Escolha uma das opcoes\n\n");
printf("\n\t Incluir paciente");
printf("\n\t [a] Alterar cadastro");
printf("\n\t [e] Excluir cadastro");
printf("\n\t [c] Consultar situacao ");
printf("\n\t [l] Listar");
printf("\n\t Sair");
printf("\n\n\n\t Opcao: \n");
gets(opcao);

op = tolower(*opcao);
}
while( !strchr("iaecls",op) );

switch(op){
case 'i':
incluir();
break;
case 'a':
alterar();
break;
case 'e':
excluir();
break;
case 'c':
consultar();
break;
case 'l':
listar();
break;
case 's':
exit(0);
}
}
while(1);
}

void abrir(char tipo[3]){
if((fp=fopen("paciente.txt", tipo))==NULL){
printf("\n O arquivo não pode ser aberto.\n");
getch();
exit(1);
}
}

void incluir(void){ /* função para gravar no arquivo */
abrir("ab+");
fseek(fp,0L, SEEK_END); /* le o arquivo do inicio ao fim */


do{
printf("\n Digite o nome do paciente ou digite FIM para sair:\n\n");
gets(reg.nome);

if ((strcmp(reg.nome,"fim")!=0)&&(strcmp(reg.nome,"FIM")!=0)){ /* vai comparar se tem os nomes cadastrados */
printf("\n Informe o endereco:"); gets(reg.endereco);
printf("\n Situacao do paciente:"); gets(reg.situacao);
printf("\n Tratamento adequado:"); gets(reg.tratamento);
printf("\n Idade:"); scanf("%d", &reg.idade);
printf("\n Data de Ocorrencia(dd mm aaaa):"); gets(reg.data);
reg.status='1'; /* conta quantos protocolos existem */
if(fwrite(&reg, sizeof(struct registro), 1, fp) != 1){ /* confere se gravou */
printf("\n Erro na gravacao.");
getch();
}
else{
printf("\n Cadastro concluido.\n\n");}
}
}while((strcmp(reg.nome,"fim")!=0)&&(strcmp(reg.nome,"FIM")!=0));
fclose(fp);
}

int busca (void){ /* função de busca */
int achou=-1,posicao=0;
char nomep[40];
abrir("rb");
printf("\n Digite o nome do paciente:");
gets(nomep);
rewind(fp); /* volta pro inicio do arquivo */
while((!feof(fp))&&(achou==-1)){
fread(&reg, sizeof(struct registro), 1, fp);
if (!feof(fp)){
if (strcmp(nomep, reg.nome)==0){
if (reg.status=='0')
{posicao=-2;}
achou=1;
}
else{posicao++;}
}
else{posicao=-1;}
}
if (achou==-1)
{posicao=-1;}
fclose(fp);
return(posicao);
}

void consultar(void){
int pos;
pos=busca();
if(pos==-1){
printf("\nPaciente inexistente.");
getch();
}
else if(pos==-2){
printf("\nPaciente inexistente.");
getch();
}
else{
abrir("rb+");
fseek(fp,pos*sizeof(struct registro),SEEK_SET); /* percorre toda a extrutura */
fread(&reg, sizeof(struct registro), 1, fp); /* le se tiver achado */
printf("\nSituacao do paciente:%s: %s",reg.nome,reg.situacao);
getch();
}
fclose(fp);
}

void alterar(void){
int pos;
pos=busca();
if (pos==-1){
printf("\nPaciente inexistente.");
getch();
}
else if(pos==-2){
printf("\nPaciente inexistente.");
getch();
}
else{
abrir("rb+");
fseek(fp,pos*sizeof(struct registro),SEEK_CUR);
fread(&reg, sizeof(struct registro), 1, fp);
printf("\nAlterar situacao do paciente:%s",reg.nome);

printf("\nSituacao do paciente: %s",reg.situacao);
getch();

printf("\nNova situacao do paciente: ");
gets(reg.situacao);

printf("\nTratamento adequado: %s",reg.tratamento);
getch();

printf("\nNovo tratamento: ");
gets(reg.tratamento);


reg.status='1';
fseek(fp,pos*sizeof(struct registro),SEEK_SET);
if(fwrite(&reg, sizeof(struct registro),1, fp)!=1){
printf("\nErro no cadastro.");
}
else{
printf("\nCadastro atualizado.");
getch();
}
}
fclose(fp);
}

void listar(void) {
int cont=0;
abrir("rb");
fseek(fp, 0L, SEEK_SET);
fread(&reg, sizeof(struct registro),1, fp);
do{
if (reg.status!='0'){
printf("\nNome do paciente: %s",reg.nome);
printf("\nEndereco: %s",reg.endereco);
printf("\nSituacao do paciente: %s",reg.situacao);
printf("\nTratamento Adequado: %s",reg.tratamento);
printf("\nIdade: %d", reg.idade);
printf("\nData de Ocorrencia: %s",reg.data);
cont++;
printf("\n");
}
fread(&reg, sizeof(struct registro),1, fp);
}while(!feof(fp));
printf("\n#Numero de pacientes=%d",cont);
getch();
}
void excluir(void){
int pos;
pos=busca();
if(pos==-1){
printf("\nPaciente não encontrado.");
getch();
}
else{
if(pos==-2){
printf("\nPaciente excluido.");
getch();
}
else{
abrir("rb+");
fseek(fp, pos*sizeof(struct registro), SEEK_SET);
fread(&reg, sizeof(struct registro), 1, fp);
printf("\nNome: %s",reg.nome);
printf("\nEndereco: %s",reg.endereco);
printf("\nSituacao: %s",reg.situacao);
printf("\nTratamento Adequado: %s",reg.tratamento);
printf("\n Idade: %d", reg.idade);
printf("\nData de Ocorrencia: %s",reg.data);
printf("\nDigite qualquer tecla para excluir o registro do paciente --> %s",reg.nome,(pos+1));
getch();
reg.status='0';
fseek(fp, pos*sizeof(struct registro), SEEK_SET);
if(fwrite(&reg, sizeof(struct registro), 1, fp)!=1){
printf("\nErro no cadastro.");
getch();
}
else{
printf("\nExclusao concluida.");
getch();
}
}
}
fclose(fp);
}

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Quando o usuário digita algo para o programa, essas informações ficam armazenadas em um buffer de entrada (stdin).

O programa fará a leitura desse buffer para obter as informações utilizadas pelo programa.

A tecla ENTER (quebra de linha) também é uma informação.

Porém, quando utiliza a função "scanf()", ocorre a leitura dessa informação, excluindo o ENTER.

Esse ENTER será lido na função seguinte ("gets(reg.data)"), fazendo com que ela passe direto.

Uma forma de remover o ENTER do buffer, é utilizar o "%*c", como apresentei no post anterior.

Link para o comentário
Compartilhar em outros sites

  • 0

Testei o código acima, corrigindo apenas a máscara do "scanf()" e funcionou.

O único erro que encontrei foi:

printf("\nDigite qualquer tecla para excluir o registro do paciente --> %s",reg.nome,(pos+1));
Que deveria ser:

printf("\nDigite qualquer tecla para excluir o registro do paciente --> %s",reg.nome);

Segue o código exato que usei (mudei a função "main()" para o final, para sumir os "warning: Implicit declaration of function"

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

struct registro
{
    char nome[40];
    char endereco[50];
    char situacao[100];
    char tratamento[150];
    char data[20];
    int idade;
    char status;
} reg;
FILE *fp;

void abrir(char tipo[3])
{
    if((fp=fopen("paciente.txt", tipo))==NULL)
    {
        printf("\n O arquivo não pode ser aberto.\n");
        getch();
        exit(1);
    }
}

void incluir(void)  /* função para gravar no arquivo */
{
    abrir("ab+");
    fseek(fp,0L, SEEK_END); /* le o arquivo do inicio ao fim */


    do
    {
        printf("\n Digite o nome do paciente ou digite FIM para sair:\n\n");
        gets(reg.nome);

        if ((strcmp(reg.nome,"fim")!=0)&&(strcmp(reg.nome,"FIM")!=0))  /* vai comparar se tem os nomes já cadastrados */
        {
            printf("\n Informe o endereco:");
            gets(reg.endereco);
            printf("\n Situacao do paciente:");
            gets(reg.situacao);
            printf("\n Tratamento adequado:");
            gets(reg.tratamento);
            printf("\n Idade:");
            scanf("%d%*c", &reg.idade);
            printf("\n Data de Ocorrencia(dd mm aaaa):");
            gets(reg.data);
            reg.status='1'; /* conta quantos protocolos existem */
            if(fwrite(&reg, sizeof(struct registro), 1, fp) != 1)  /* confere se gravou */
            {
                printf("\n Erro na gravacao.");
                getch();
            }
            else
            {
                printf("\n Cadastro concluido.\n\n");
            }
        }
    }
    while((strcmp(reg.nome,"fim")!=0)&&(strcmp(reg.nome,"FIM")!=0));
    fclose(fp);
}

int busca (void)  /* função de busca */
{
    int achou=-1,posicao=0;
    char nomep[40];
    abrir("rb");
    printf("\n Digite o nome do paciente:");
    gets(nomep);
    rewind(fp); /* volta pro inicio do arquivo */
    while((!feof(fp))&&(achou==-1))
    {
        fread(&reg, sizeof(struct registro), 1, fp);
        if (!feof(fp))
        {
            if (strcmp(nomep, reg.nome)==0)
            {
                if (reg.status=='0')
                {
                    posicao=-2;
                }
                achou=1;
            }
            else
            {
                posicao++;
            }
        }
        else
        {
            posicao=-1;
        }
    }
    if (achou==-1)
    {
        posicao=-1;
    }
    fclose(fp);
    return(posicao);
}

void consultar(void)
{
    int pos;
    pos=busca();
    if(pos==-1)
    {
        printf("\nPaciente inexistente.");
        getch();
    }
    else
        if(pos==-2)
        {
            printf("\nPaciente inexistente.");
            getch();
        }
        else
        {
            abrir("rb+");
            fseek(fp,pos*sizeof(struct registro),SEEK_SET); /* percorre toda a extrutura */
            fread(&reg, sizeof(struct registro), 1, fp); /* le se tiver achado */
            printf("\nSituacao do paciente:%s: %s",reg.nome,reg.situacao);
            getch();
        }
    fclose(fp);
}

void alterar(void)
{
    int pos;
    pos=busca();
    if (pos==-1)
    {
        printf("\nPaciente inexistente.");
        getch();
    }
    else
        if(pos==-2)
        {
            printf("\nPaciente inexistente.");
            getch();
        }
        else
        {
            abrir("rb+");
            fseek(fp,pos*sizeof(struct registro),SEEK_CUR);
            fread(&reg, sizeof(struct registro), 1, fp);
            printf("\nAlterar situacao do paciente:%s",reg.nome);

            printf("\nSituacao do paciente: %s",reg.situacao);
            getch();

            printf("\nNova situacao do paciente: ");
            gets(reg.situacao);

            printf("\nTratamento adequado: %s",reg.tratamento);
            getch();

            printf("\nNovo tratamento: ");
            gets(reg.tratamento);


            reg.status='1';
            fseek(fp,pos*sizeof(struct registro),SEEK_SET);
            if(fwrite(&reg, sizeof(struct registro),1, fp)!=1)
            {
                printf("\nErro no cadastro.");
            }
            else
            {
                printf("\nCadastro atualizado.");
                getch();
            }
        }
    fclose(fp);
}

void listar(void)
{
    int cont=0;
    abrir("rb");
    fseek(fp, 0L, SEEK_SET);
    fread(&reg, sizeof(struct registro),1, fp);
    do
    {
        if (reg.status!='0')
        {
            printf("\nNome do paciente: %s",reg.nome);
            printf("\nEndereco: %s",reg.endereco);
            printf("\nSituacao do paciente: %s",reg.situacao);
            printf("\nTratamento Adequado: %s",reg.tratamento);
            printf("\nIdade: %d", reg.idade);
            printf("\nData de Ocorrencia: %s",reg.data);
            cont++;
            printf("\n");
        }
        fread(&reg, sizeof(struct registro),1, fp);
    }
    while(!feof(fp));
    printf("\n#Numero de pacientes=%d",cont);
    getch();
}
void excluir(void)
{
    int pos;
    pos=busca();
    if(pos==-1)
    {
        printf("\nPaciente não encontrado.");
        getch();
    }
    else
    {
        if(pos==-2)
        {
            printf("\nPaciente excluido.");
            getch();
        }
        else
        {
            abrir("rb+");
            fseek(fp, pos*sizeof(struct registro), SEEK_SET);
            fread(&reg, sizeof(struct registro), 1, fp);
            printf("\nNome: %s",reg.nome);
            printf("\nEndereco: %s",reg.endereco);
            printf("\nSituacao: %s",reg.situacao);
            printf("\nTratamento Adequado: %s",reg.tratamento);
            printf("\n Idade: %d", reg.idade);
            printf("\nData de Ocorrencia: %s",reg.data);
            printf("\nDigite qualquer tecla para excluir o registro do paciente --> %s",reg.nome);
            getch();
            reg.status='0';
            fseek(fp, pos*sizeof(struct registro), SEEK_SET);
            if(fwrite(&reg, sizeof(struct registro), 1, fp)!=1)
            {
                printf("\nErro no cadastro.");
                getch();
            }
            else
            {
                printf("\nExclusao concluida.");
                getch();
            }
        }
    }
    fclose(fp);
}

int main(void)
{

    char opcao[2], op;
    do
    {
        do
        {
            system("cls");
            printf("\t\n\t Escolha uma das opcoes\n\n");
            printf("\n\t [i] Incluir paciente");
            printf("\n\t [a] Alterar cadastro");
            printf("\n\t [e] Excluir cadastro");
            printf("\n\t [c] Consultar situacao ");
            printf("\n\t [l] Listar");
            printf("\n\t [s] Sair");
            printf("\n\n\n\t Opcao: \n");
            gets(opcao);

            op = tolower(*opcao);
        }
        while( !strchr("iaecls",op) );

        switch(op)
        {
            case 'i':
                incluir();
                break;
            case 'a':
                alterar();
                break;
            case 'e':
                excluir();
                break;
            case 'c':
                consultar();
                break;
            case 'l':
                listar();
                break;
            case 's':
                exit(0);
        }
    }
    while(1);
}

Editado por ScreenBlack
Link para o comentário
Compartilhar em outros sites

  • 0

Eu dei uma ajeitada no codigo para coisas necessarias, mas um problema é que sempre que se cria um cadastro e exclui, se cadastrar o mesmo nome e tentar exclui-lo ele mostra como já excluido. Teria alguma maneira de ajeitar isso? so se realmente for simples.

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

struct registro{
char nome[40];
char endereco[50];
char situacao[100];
char tratamento[150];
int dia;
int mes;
int ano;
int idade;
char status;
} reg;
FILE *fp;

void abrir(char tipo[3]){

if((fp=fopen("Pacientes.txt", tipo))==NULL) {
printf("\n O arquivo não pode ser aberto.\n");
getch();
exit(1);
}
}

void incluir(void){ /* função para gravar no arquivo */

abrir("ab+");
fseek(fp,0L, SEEK_END); /* le o arquivo do inicio ao fim */

do{
printf("\n Digite o nome do paciente ou digite FIM para sair:\n\n");
gets(reg.nome);

if ((strcmp(reg.nome,"fim")!=0)&&(strcmp(reg.nome,"FIM")!=0)){ /* vai comparar se tem os nomes já cadastrados */
printf("\n Informe o endereco:");
gets(reg.endereco);
printf("\n Idade:");
scanf("%d%*c", &reg.idade);
printf("\n Situacao do paciente:");
gets(reg.situacao);
printf("\n Tratamento adequado:");
gets(reg.tratamento);
do{
printf("\n Data de Ocorrencia(dd mm aaaa):");
scanf("%d%*c %d%*c %d%*c", &reg.dia, &reg.mes, &reg.ano);
}while(reg.ano<=1900 || reg.ano>=2100 || reg.mes<1 || reg.mes>12 || reg.dia<1 || reg.dia>31);
reg.status='1'; /* conta quantos protocolos existem */
if(fwrite(&reg, sizeof(struct registro), 1, fp) != 1){ /* confere se gravou */
printf("\n Erro na gravacao.");
getch();
}
else{
printf("\n Cadastro concluido.\n\n");
}
}
}
while((strcmp(reg.nome,"fim")!=0)&&(strcmp(reg.nome,"FIM")!=0));
fclose(fp);
}

int busca (void){ /* função de busca */

int achou=-1,posicao=0;
char nomep[40];
abrir("rb");
printf("\n Digite o nome do(a) paciente:");
gets(nomep);
rewind(fp); /* volta pro inicio do arquivo */
while((!feof(fp))&&(achou==-1)){
fread(&reg, sizeof(struct registro), 1, fp);
if (!feof(fp)){
if (strcmp(nomep, reg.nome)==0){
if (reg.status=='0'){
posicao=-2;
}
achou=1;
}
else{
posicao++;
}
}
else{
posicao=-1;
}
}
if (achou==-1){
posicao=-1;
}
fclose(fp);
return(posicao);
}

void consultar(void){

int pos;
pos=busca();
if(pos==-1){
printf("\nPaciente inexistente.");
getch();
}
else
if(pos==-2){
printf("\nPaciente inexistente.");
getch();
}
else{
abrir("rb+");
fseek(fp,pos*sizeof(struct registro),SEEK_SET); /* percorre toda a extrutura */
fread(&reg, sizeof(struct registro), 1, fp); /* le se tiver achado */
printf("\nSituacao do(a) paciente %s: %s",reg.nome,reg.situacao);
printf("\nTratamento adequado: %s",reg.tratamento);
printf("\nData de Ocorrencia: %d %d %d", reg.dia, reg.mes, reg.ano);
getch();
}
fclose(fp);
}

void alterar(void){

int pos;
pos=busca();
if (pos==-1){
printf("\nPaciente inexistente.");
getch();
}
else
if(pos==-2){
printf("\nPaciente inexistente.");
getch();
}
else{
abrir("rb+");
fseek(fp,pos*sizeof(struct registro),SEEK_CUR);
fread(&reg, sizeof(struct registro), 1, fp);
printf("\nAlterar situacao do(a) paciente:%s",reg.nome);

printf("\nSituacao do(a) paciente: %s",reg.situacao);
getch();

printf("\nNova situacao do(a) paciente: ");
gets(reg.situacao);

printf("\nTratamento adequado: %s",reg.tratamento);
getch();

printf("\nNovo tratamento: ");
gets(reg.tratamento);

do{
printf("\nNova Data de Ocorrencia(dd mm aaaa):");
scanf("%d%*c %d%*c %d%*c", &reg.dia, &reg.mes, &reg.ano);
}while(reg.ano<=1900 || reg.ano>=2100 || reg.mes<1 || reg.mes>12 || reg.dia<1 || reg.dia>31);

reg.status='1';
fseek(fp,pos*sizeof(struct registro),SEEK_SET);
if(fwrite(&reg, sizeof(struct registro),1, fp)!=1){
printf("\nErro no cadastro.");
}
else{
printf("\nCadastro atualizado.");
getch();
}
}
fclose(fp);
}

void listar(void){

int cont=0;
abrir("rb");
fseek(fp, 0L, SEEK_SET);
fread(&reg, sizeof(struct registro),1, fp);
do{
if (reg.status!='0'){
printf("\nNome do(a) paciente: %s",reg.nome);
printf("\nEndereco: %s",reg.endereco);
printf("\nIdade: %d", reg.idade);
printf("\nSituacao do(a) paciente: %s",reg.situacao);
printf("\nTratamento Adequado: %s",reg.tratamento);
printf("\nData de Ocorrencia: %d %d %d",reg.dia, reg.mes, reg.ano);
cont++;
printf("\n");
}
fread(&reg, sizeof(struct registro),1, fp);
}
while(!feof(fp));
printf("\n#Numero de pacientes=%d",cont);
getch();
}
void excluir(void){

int pos;
pos=busca();
if(pos==-1){
printf("\nPaciente não encontrado.");
getch();
}
else{
if(pos==-2){
printf("\nPaciente excluido.");
getch();
}
else{
abrir("rb+");
fseek(fp, pos*sizeof(struct registro), SEEK_SET);
fread(&reg, sizeof(struct registro), 1, fp);
printf("\nNome: %s",reg.nome);
printf("\nEndereco: %s",reg.endereco);
printf("\nIdade: %d", reg.idade);
printf("\nSituacao: %s",reg.situacao);
printf("\nTratamento Adequado: %s",reg.tratamento);
printf("\nData de Ocorrencia: %d %d %d",reg.dia, reg.mes, reg.ano);
printf("\nDigite qualquer tecla para excluir o registro do paciente --> %s",reg.nome);
getch();
reg.status='0';
fseek(fp, pos*sizeof(struct registro), SEEK_SET);
if(fwrite(&reg, sizeof(struct registro), 1, fp)!=1){
printf("\nErro no cadastro.");
getch();
}
else{
printf("\nExclusao concluida.");
getch();
}
}
}
fclose(fp);
}

int main(void){

char opcao[2], op;
do{
do{
system("cls");
printf("\t\n\t Escolha uma das opcoes\n\n");
printf("\n\t Incluir paciente");
printf("\n\t [a] Alterar cadastro");
printf("\n\t [e] Excluir cadastro");
printf("\n\t [c] Consultar situacao ");
printf("\n\t [l] Listar");
printf("\n\t Sair");
printf("\n\n\n\t Opcao: \n");
gets(opcao);

op = tolower(*opcao);
}
while( !strchr("iaecls",op) );

switch(op){
case 'i':
incluir();
break;
case 'a':
alterar();
break;
case 'e':
excluir();
break;
case 'c':
consultar();
break;
case 'l':
listar();
break;
case 's':
exit(0);
}
}
while(1);
}

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...