Ir ao conteúdo

Posts recomendados

Postado

Olá boa tarde preciso criar uma função para gravar em arquivo (como registro e modo binário) o CRM de um medico o seu nome e sua especialidade (preciso utilizar structs e o CRM não pode se repetir) não estou entendo como vou fazer a função de não repetir os números de CRM. Obrigado

  • Curtir 1
Postado
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>

//protótipo das funções
int menu();
void cadastrar();
void listar();
void consultar();

//criação da struct
typedef struct
{
	char cpf[15], nome[41];
	float credito; 
} cliente;

//função principal
main()
{
	int resp;
	do
	{
		resp = menu();
		switch(resp)
		{
			case 1 : cadastrar();
			break;
			//case 2 : listar();
			break;
			case 3 : consultar();
			break;
			case 0 : exit(0); 
			default:
				{
					printf("\nOpcao invalida...\n");
					system("pause");
				}
		}
	} while (resp !=0);
}

//função cadastrar()
void cadastrar()
{
	//declaração das variáveis locais
	cliente cadcliente;
	char resposta;
	
	//declaração ponteiro do arquivo
	FILE *pontarq;
	
	//abrir o arquivo para escrita no modo binário (ab)
	pontarq = fopen("cadastrocli.txt", "ab");
		
	//estrutura de repetição da entrada de dados
	do
	{
		system("cls");
		printf("Informe o CPF do cliente: ");
		fflush(stdin);
		scanf("%14[^\n]", cadcliente.cpf);
		printf("Informe o nome do cliente: ");
		fflush(stdin);
		scanf("%40[^\n]", cadcliente.nome);
		printf("Informe o valor do credito: ");
		scanf("%f", &cadcliente.credito);
		
		//gravar as informações no arquivo
		fwrite(&cadcliente, sizeof(cadcliente),1,pontarq);
		
		printf("Cadastrar outro cliente <S/N>");
		resposta = getche();
		
	} while(toupper(resposta)=='S');
	
	//fechar o arquivo
	fclose(pontarq);
}

//função menu()
int menu()
{
	//declaração da variável
	int opcao;
	system("cls");
	printf("1-Cadastrar\n2-Listar\n3-Consultar\n0-Sair\n");
	printf("Opcao?: ");
	scanf("%i", &opcao);
	
	return opcao;
}

//função consultar()
void consultar()
{
	//variáveis locais
	cliente cadcliente;
	char chave[41];
	int flag = 0;
	
	//ponteiro para o arquivo
	FILE *pontarq;
	
	//abrir o arquivo para leitura modo binário
	if((pontarq=fopen("cadastrocli.txt", "rb"))==NULL)
	{
		printf("\nErro na abertura do arquivo ou nao ha registros\n");
	}
	else
	{
		system("cls");
		printf("Informe o nome a consultar: ");
		fflush(stdin);
		scanf("%40[^\n]", chave);
		
		//estrutura de repetição para ler o arquivo e comparar com a chave
		while((fread(&cadcliente, sizeof(cadcliente), 1, pontarq))==1)
		{
			if(strcmp(strupr(chave),strupr(cadcliente.nome))==0)
			{
				printf("CPF: %s", cadcliente.cpf);
				printf("\nNome: %s", cadcliente.nome);
				printf("\nCredito: %.2f\n", cadcliente.credito);
				
				//mostrar flag para 1 - encontrou
				flag = 1;
			}
		}
		if(flag == 0)
			printf("\nCliente nao cadastrado...\n");
		
		//fechar o arquivo
		fclose(pontarq);
	}
	system("pause");
}

Tem esse cadastro de CPF o nome e o credito mais eu não queria que repetisse tipo por exemplo o CPF eu n sei como q eu posso estar fazendo isso

  • Obrigado 1
Postado

Faça o simples:

  • crie um vetor dessas estruturas para os dados 
  • ao iniciar o programa veja se tem já um arquivo com dados anteriores e leia para dentro do vetor
  • na execução do programa use só o vetor
  • ao final regrave o arquivo com os dados

Na hora de inserir, se achar importante, pode inserir por alguma ordem, como o CRM ou o nome

  • Curtir 2
Postado

@lucky8981    para compara você pode pesquisar no arquivo e verificar se esse dado já foi cadastrado ,  usando a função strcmp , que compara string's ,  mas trabalhar com arquivo é muito difícil ,  então melhor pegar os dados que estão no arquivo , logo no início do programa e colocar nas struct , e para isso você precisa criar um vetor de struct ,  e em cada posição desse vetor armazena um conjunto de dados que foi cadastrado , e no final do programa salva tudo que está na struct gravando ela no arquivo , e existe muitos outros modos de fazer isso , e seu código com essa função de comparar os dados inseridos pelo usuário e ver se são repetidos ou não , pode assim   :

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iomanip>
#include <vector>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#define getch() _getch();
//protótipo das funções
int menu();
int cadastrar(int);
void listar(int);
void consultar(int);
void grava_tudo_no_arquivo(int);
int pega_dados_do_arquivo(int);
//criação da struct
typedef struct
{
	char cpf[15], nome[41],
	     titulo_eleitor[20],
	     certif_militar[20];
    float credito;
} cliente;
cliente cadcliente[100];
//função principal

int main()
{
    int resp,contador = pega_dados_do_arquivo(0);
    do
    {
        resp = menu();
        switch( resp )
        {
        case 1 :
            contador = cadastrar(contador);
            break;
        case 2 :
            listar(contador);
            break;
        case 3 :
            consultar(contador);
            break;
        case 0 :
            grava_tudo_no_arquivo(contador);
            exit(0);
        default:
            printf("\nOpcao invalida...\n");
            system("pause");
        }
    } while ( resp != 0 );
    return 16;
}
//função cadastrar()
int cadastrar(int contador)
{
    //declaração das variáveis locais
    char resposta;
    int ax;
	do
	{
	    LabeL_1: // pode ser qualquer nome
        system("cls");
        printf("Informe o CPF do cliente: ");
        fflush(stdin);
        scanf("%14[^\n]", cadcliente[contador].cpf);//o contador aponta para a posição do vetor de struct ou typedef
        printf("Informe o nome do cliente: ");
        fflush(stdin);
        scanf("%40[^\n]", cadcliente[contador].nome);
        printf("Informe o valor do credito: ");
        scanf("%f", &cadcliente[contador].credito);

		ax = 0;//começa pesquisar da posição zero , a primeira no vetor
        while( ax < contador )
        {
            if( strcmp( cadcliente[ax].cpf,cadcliente[contador].cpf ) == 0 )
            {
                printf("ja tem um cpf com esse numero , digite cpf nome credito novamente   TecLe");
                getch();
                goto LabeL_1; // comando em desuso , mas func
            }
            ax++;
        }
        contador++;
		printf("Cadastrar outro cliente <S/N>");
		resposta = getche();

	} while(toupper(resposta)=='S');
	return contador;
}
//função menu()
int menu()
{
	//declaração da variável
	int opcao;
	system("cls");
	printf(" 0 - Sair\n");
	printf(" 1 - Cadastrar\n");
	printf(" 2 - Listar\n");
	printf(" 3 - Consultar\n");
	printf("     Opcao ? : ");
	scanf("%i", &opcao);

	return opcao;
}

//função consultar()
void consultar(int contador)
{
    //variáveis locais
    cliente cadcliente;
    char chave[41];
    int flag = 0;

    //ponteiro para o arquivo
    FILE *pontarq;

    //abrir o arquivo para leitura modo binário
    if((pontarq=fopen("cadastrocli.txt", "rb"))==NULL)
    {
        printf("\nErro na abertura do arquivo ou nao ha registros\n");
    }
    else
    {
        system("cls");
        printf("Informe o nome a consultar: ");
        fflush(stdin);
        scanf("%40[^\n]", chave);

        //estrutura de repetição para ler o arquivo e comparar com a chave
        while((fread(&cadcliente, sizeof(cadcliente), 1, pontarq))==1)
        {
            if(strcmp(strupr(chave),strupr(cadcliente.nome))==0)
            {
                printf("CPF: %s", cadcliente.cpf);
                printf("\nNome: %s", cadcliente.nome);
                printf("\nCredito: %.2f\n", cadcliente.credito);

                //mostrar flag para 1 - encontrou
                flag = 1;
            }
        }
        if(flag == 0)
            printf("\nCliente nao cadastrado...\n");

        //fechar o arquivo
        fclose(pontarq);
    }
    system("pause");
}
void listar(int contador)
{
    int j,i;
    for(j=0;j<contador; j++)
    {
        printf("CPF -------: %s\n"    ,cadcliente[j].cpf    );
        printf("NOME ------: %s\n"    ,cadcliente[j].nome   );
        printf("CREDITO ---: %.2f\n\n",cadcliente[j].credito);
    }
    printf("    TecLe !");
    getch();
}
void grava_tudo_no_arquivo(int contador)
{
    int j;
    FILE *pontarq;
    pontarq = fopen("cadastrocli.bin", "wb");// cria resete e abre o arquivo para gravar desde o início dele
    for(j=0; j<contador; j++)
        fwrite(&cadcliente[j], sizeof(cadcliente),1,pontarq);
    fclose(pontarq);
}
int pega_dados_do_arquivo(int contador)
{
    FILE *pontarq;
    pontarq = fopen("cadastrocli.bin", "rb");
    if(pontarq == NULL )return 0;
    printf("Dados já cadastrados e que estão gravados no Arquivo\n");
    while( fread( &cadcliente[contador], sizeof(cadcliente), 1, pontarq ) == 1 )
    {
        printf("CPF -------: %s\n"    ,cadcliente[contador].cpf    );
        printf("NOME ------: %s\n"    ,cadcliente[contador].nome   );
        printf("CREDITO ---: %.2f\n\n",cadcliente[contador].credito);
        contador++;
    }
    fclose(pontarq);
    printf("    Tecle !");
    getch();
    return contador;
}

 

  • Obrigado 1
Postado

@devair1010 cara muito obrigado estou tentando passar em ordem alfabetica mais ta listando somente 1 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iomanip>
#include <vector>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#define getch() _getch();
//protótipo das funções
int menu();
int cadastrar(int);
void listar(int);
void consultar(int);
void grava_tudo_no_arquivo(int);
int pega_dados_do_arquivo(int);
//criação da struct
typedef struct
{
	char crm[15], nome[41],
	     titulo_eleitor[20],
	     certif_militar[20];
    float credito;
} cliente;
cliente cadcliente[100];
//função principal

int main()
{
    int resp,contador = pega_dados_do_arquivo(0);
    do
    {
        resp = menu();
        switch( resp )
        {
        case 1 :
            contador = cadastrar(contador);
            break;
        case 2 :
            listar(contador);
            break;
        case 3 :
            consultar(contador);
            break;
        case 0 :
            grava_tudo_no_arquivo(contador);
            exit(0);
        default:
            printf("\nOpcao invalida...\n");
            system("pause");
        }
    } while ( resp != 0 );
    return 16;
}
//função cadastrar()
int cadastrar(int contador)
{
    //declaração das variáveis locais
    char resposta;
    int ax;
	do
	{
	    LabeL_1: // pode ser qualquer nome
        system("cls");
        printf("Informe o crm do cliente: ");
        fflush(stdin);
        scanf("%14[^\n]", cadcliente[contador].crm);//o contador aponta para a posição do vetor de struct ou typedef
        printf("Informe o nome do cliente: ");
        fflush(stdin);
        scanf("%40[^\n]", cadcliente[contador].nome);
        printf("Informe o valor do credito: ");
        scanf("%f", &cadcliente[contador].credito);

		ax = 0;//começa pesquisar da posição zero , a primeira no vetor
        while( ax < contador )
        {
            if( strcmp( cadcliente[ax].crm,cadcliente[contador].crm ) == 0 )
            {
                printf("ja tem um crm com esse numero , digite crm nome credito novamente   TecLe");
                getch();
                goto LabeL_1; // comando em desuso , mas func
            }
            ax++;
        }
        contador++;
		printf("Cadastrar outro cliente <S/N>");
		resposta = getche();

	} while(toupper(resposta)=='S');
	return contador;
}
//função menu()
int menu()
{
	//declaração da variável
	int opcao;
	system("cls");
	printf(" 0 - Sair\n");
	printf(" 1 - Cadastrar\n");
	printf(" 2 - Listar\n");
	printf(" 3 - Consultar\n");
	printf("     Opcao ? : ");
	scanf("%i", &opcao);

	return opcao;
}

//função consultar()
void consultar(int contador)
{
    //variáveis locais
    cliente cadcliente;
    char chave[41];
    int flag = 0;

    //ponteiro para o arquivo
    FILE *pontarq;

    //abrir o arquivo para leitura modo binário
    if((pontarq=fopen("cadastrocli.txt", "rb"))==NULL)
    {
        printf("\nErro na abertura do arquivo ou nao ha registros\n");
    }
    else
    {
        system("cls");
        printf("Informe o nome a consultar: ");
        fflush(stdin);
        scanf("%40[^\n]", chave);

        //estrutura de repetição para ler o arquivo e comparar com a chave
        while((fread(&cadcliente, sizeof(cadcliente), 1, pontarq))==1)
        {
            if(strcmp(strupr(chave),strupr(cadcliente.nome))==0)
            {
                printf("crm: %s", cadcliente.crm);
                printf("\nNome: %s", cadcliente.nome);
                printf("\nCredito: %.2f\n", cadcliente.credito);

                //mostrar flag para 1 - encontrou
                flag = 1;
            }
        }
        if(flag == 0)
            printf("\nCliente nao cadastrado...\n");

        //fechar o arquivo
        fclose(pontarq);
    }
    system("pause");
}
void listar(int contador)
{
    int j,i;
    for(j=0;j<contador; j++)
    {
        printf("crm -------: %s\n"    ,cadcliente[j].crm    );
        printf("NOME ------: %s\n"    ,cadcliente[j].nome   );
        printf("CREDITO ---: %.2f\n\n",cadcliente[j].credito);
    }
    fflush(stdin);
    printf("\nPessoas em ordem alfabetica:\n");
	for(i=1; i<contador; i++){
        for(j=i+1;j<contador;j++){
	        if(strcoll(cadcliente[i].nome , cadcliente[j].nome) > 0 ){
                cadcliente[0]=cadcliente[i];
                cadcliente[i]=cadcliente[j];
                cadcliente[j]=cadcliente[0];
                fflush(stdin);
	        }
        }
	}
	for(i=0;i<contador;i++){
        printf("NOME: %s\n",cadcliente[i].nome);
        fflush(stdin);
	}
    printf("Aperte qualquer Tecla");
    getch();
}
void grava_tudo_no_arquivo(int contador)
{
    int j;
    FILE *pontarq;
    pontarq = fopen("cadastrocli.bin", "wb");// cria resete e abre o arquivo para gravar desde o início dele
    for(j=0; j<contador; j++)
        fwrite(&cadcliente[j], sizeof(cadcliente),1,pontarq);
    fclose(pontarq);
}
int pega_dados_do_arquivo(int contador)
{
    FILE *pontarq;
    pontarq = fopen("cadastrocli.bin", "rb");
    if(pontarq == NULL )return 0;
    printf("Dados já cadastrados e que estão gravados no Arquivo\n");
    while( fread( &cadcliente[contador], sizeof(cadcliente), 1, pontarq ) == 1 )
    {
        printf("crm -------: %s\n"    ,cadcliente[contador].crm    );
        printf("NOME ------: %s\n"    ,cadcliente[contador].nome   );
        printf("CREDITO ---: %.2f\n\n",cadcliente[contador].credito);
        contador++;
    }
    fclose(pontarq);
    printf("    Tecle !");
    getch();
    return contador;
}

 

  • Obrigado 1
Postado

@lucky8981         para colocar em ordem alfabética , você está usando essa função strcoll , mas ela não costuma funcionar bem , não , melhor usar a strcmp , e assim estará em ordem pela primeira letra do nome , e se quiser realmente em ordem de todas as letras precisa algumas linhas de código a mais , e outra coisa é que você está usando a posição zero do vetor e essa posição está sendo usada , e ao modificar seu conteúdo vai deletar o que for armazenado ali   então use o fim do vetor ,  que é a posição 99 , ou envie o valor 1 no inicio para a função

 

pega_dados_do_arquivo (1);  

 

, assim na hora de cadastrar vai começar armazenar a partir da segunda posição , ficando livre a posição zero .

  • Curtir 1
  • Confuso 1
Postado
1 hora atrás, devair1010 disse:

função strcoll , mas ela não costuma funcionar bem , não , melhor usar a strcmp , e assim estará em ordem pela primeira letra do nome , e se quiser realmente em ordem de todas as letras precisa algumas linhas de código a mais , e outra coisa é que você está usando a posição zero do vetor e essa posição está sendo usada , e ao modificar seu conteúdo vai deletar o que for armazenado ali   então use o fim do vetor ,  que é a posição 99 , ou envie o valor 1 no inicio para a função

 

@devair1010 funções não tem costume. strcoll() funciona perfeitamente e tem exatamente o mesmo comportamento de strcmp(). A diferença é que strcoll() considera o locale definido para o programa. Se você chamar set_locale() ou usar qualquer mecanismo para definir o locale() os novos valores serão considerados na comparação e isso vai afetar a comparação de strings que tenham por exemplo caracteres acentuados.

 

nenhuma delas classifica em ordem alfabética ou pela primeira letra. Elas apenas comparam duas strings e retornam algo negativo, 0 ou algo positivo conforme a primeira string seja menor, igual ou maior que a segunda em ordem alfabética. Nenhuma das strings é alterada

 

  • Obrigado 2
  • Confuso 1
Postado
1 hora atrás, arfneto disse:

Elas apenas comparam duas strings e retornam algo negativo, 0 ou algo positivo conforme a primeira string seja menor, igual ou maior que a segunda em ordem alfabética. Nenhuma das strings é alterada

 

Na dúvida, teste.

 

Veja a saída

 

[locale original: 'C']
Comparando 'maçã' e 'mata'
para  strcmp() 'maçã' > 'mata' 
para strcoll() 'maçã' > 'mata' 

[Usando locale 'Portuguese_Brazil.1252']
Comparando 'maçã' e 'mata'
para  strcmp() 'maçã' > 'mata'
para strcoll() 'maçã' < 'mata' 

 

Deste programa
 

 #include <locale.h>
 #include <stdio.h>
 #include <string.h>
 #include <windows.h>

 int main(void)
{
    const char* str0 = "maçã";
    const char* str1 = "mata";
    char linha[80];
    char* local = &linha[0];
    const char* ordem[] = { "<", "=", ">" };

    SetConsoleOutputCP(65001);

    local = setlocale(LC_COLLATE, NULL); 
    printf( "[locale original: '%s']\n", local );
    printf( "Comparando '%s' e '%s'\n", str0, str1 );

    int i = strcmp(str0, str1) + 1;
    int j = strcoll(str0,str1) + 1;

    printf( "para  strcmp() '%s' %s '%s' \n", str0, ordem[i], str1 );
    printf( "para strcoll() '%s' %s '%s' \n", str0, ordem[j], str1 );

    local = setlocale(LC_COLLATE, "Portuguese"); 
    printf( "\n[Usando locale '%s']\n", local );
    printf( "Comparando '%s' e '%s'\n", str0, str1 );

    i = strcmp(str0, str1) + 1;
    j = strcoll(str0,str1) + 1;

    printf( "para  strcmp() '%s' %s '%s' \n", str0, ordem[i], str1 );
    printf( "para strcoll() '%s' %s '%s' \n", str0, ordem[j], str1 );

    return 0;

 

Que é um programa de 10 linhas duplicadas...

 

E entenda que em português "maçã" vem antes de "mata" e assim é o que retorna strcoll() para português. Mas para en_US por exemplo ou para o padrão C 't' vem antes de 'ç' e então se usar strcmp() e o texto tiver letras com acento vai ter resultados inesperados

 

Mas não é um problema de "costume" @devair1010 Ou é, na verdade, já que são configurações regionais.

 

 

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!