Ir ao conteúdo
  • Cadastre-se

C Sistema para impedir repetição de cadastros com o mesmo nome


SamuraiOcidental
Ir à solução Resolvido por Asrety,

Posts recomendados

Boa noite, estou tendo dificuldades na realização de um exercício, nele se pede para criar um código em C, em que cadastre o nome de 5 pessoas e salve em um arquivo, mas que nenhum deles pode ter o nome repetido.
Estou com dificuldades nesse final, alguém poderia dar uma força?

Agradeço desde já.

Link para o comentário
Compartilhar em outros sites

Esse problema tem algumas diferentes formas de se resolver, um meio fácil seria concatenar o nome da pessoa a um nome de arquivo comum, por exemplo cadastro_joao, cadastro_maria, isso pode ser feito sem dores usando a função strcat() (de string.h) que concatena duas strings, com resultado do strcat tu abre / cria um arquivo com a string resultante, o problema dessa solução é que dois nomes iguais podem gerar arquivos iguais, sendo uma outra opção incrementar um contador interno (salvo em outro arquivo) e adicionar ele no nome do arquivo, depois disso incremente-o.

Links para ajudar com strcat:
http://www.cplusplus.com/reference/cstring/strcat/

Link para o comentário
Compartilhar em outros sites

Faça um for para preencher os 5, e a cada leitura de nome, compare com os nomes já inseridos, e só aceite a leitura até que seja diferente dos outros nomes, e por fim escreva tudo no arquivo, isso também é uma forma de se resolver. Caso ainda não consiga realizar este exercício, poste o seu código para que a comunidade possa ajudar você melhor. Boa sorte!

Link para o comentário
Compartilhar em outros sites

Esse é o meu código, @Asrety @Felipe Electronic esse exercício é de um menu de um jogo, onde o usuário colocará seu login(nickUser), seu nome de personagem(nickChar) e sua senha.

 

Já tentei de várias formas fazer, mas ele ainda continua aceitando que o usuário cadastre personagens com nome repetidos, gostaria de uma ajuda para essa estrutura..

 

Obrigado desde já!

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

int main(void)
{
	setlocale (LC_ALL,"Portuguese");
	
	struct Player 
	{
		char nickUser[20]; 
		char nickChar[20]; 
		char senha[20];    
		char confirmaSenha[20]; 
	}; struct Player players[5];
	
	int count;
	int qntdPlayer;
	
	printf("\n\nPor favor, Informe quantos jogadores serão cadastrados(Limite de 5 jogadores): ");
	scanf("%d", &qntdPlayer);
	if (qntdPlayer > 0 && qntdPlayer <= 5) 
	{
	
		for (count = 0; count < qntdPlayer; count++)
		{
			system("cls"); 
			fflush(stdin);
			
			printf("Nome do Usuário:");
			gets(players[count].nickUser);
			printf("\nMuito bem, você usará esse nome para realizar o login no jogo!\nLogin: %s\n", players[count].nickUser);
			
			printf("Pressione qualquer tecla para continuar.");
			getch(); 
			system("cls");
			
			printf("Nome do Personagem:");
			gets(players[count].nickChar);
			printf("\nPerfeito, é assim que seus amigos o reconhecerão!\nNick: %s\n", players[count].nickChar);
			
			printf("Senha: ");
			gets(players[count].senha); 
			printf("Repita a senha para que ocorra a confirmação.\n\nConfirmação de Senha:");
			gets(players[count].confirmaSenha); 
			
			do 
			{
				if (strcmp (players[count].senha, players[count].confirmaSenha)) 
				{
					printf("Algo deu errado, as senhas não são iguais, por favor, tente mais uma vez\n");
					printf("Tome cuidado com a sua senha, ela é muito importante!\n\n");
					printf("Confirmação de Senha:");
					gets(players[count].confirmaSenha); 
				}
				else 
				{
					printf("\nMais uma etapa concluida com louvor!\n"); 
				}
			}while (strcmp (players[count].senha, players[count].confirmaSenha)); 	
			printf("\nPressione qualquer tecla para continuar.");
			getch(); 
			system("cls"); 		

		}
		FILE *Pfile; 
		Pfile = fopen("texto.txt", "w"); 
		if (Pfile == NULL) 
		{
			printf("Erro na abertura do arquivo.");
			exit(0); 
		}
		for (count = 0; count < qntdPlayer; count++) 
		{
			fprintf(Pfile, "\nNome: %s\n",players[count].nickUser);
			fprintf(Pfile, "Personagem: %s\n",players[count].nickChar);
			fprintf(Pfile, "Senha: %s\n",players[count].senha);
		}
		fclose(Pfile);
	}
	else
	{
		printf("Só pode inserir até 5 pessoas");
		return 0; 
	}
}
Link para o comentário
Compartilhar em outros sites

  • Solução

Olá, @SamuraiOcidental, utilizando a sua tentativa como base, fiz um código que acredito que possa te ajudar, mas lembrando : pode possuir falhas e maneiras mais fáceis para chegar a está resolução.

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

typedef struct{

    char nickUser[20];
    char nickChar[20];
    char senha[20];
    char confirmaSenha[20];

}Player;

int compararNickUser(Player aux[], int tam){

    int i;

    for(i = 0; i<tam; i++)
        if(strcmp(aux[i].nickUser, aux[tam].nickUser) == 0){
            printf("\n\nUsuario %s Não Disponível...\n", aux[tam].nickUser);
            printf("\nInforme outro usuario: ");
            fflush(stdin);
            scanf("%[^\n]", aux[tam].nickUser);
            return 0;
        }

    system("cls");

    return 1;
}

int compararSenha(char string1[], char string2[]){

    if(strcmp(string1, string2) != 0){
        printf("Algo deu errado, as senhas não são iguais, por favor, tente mais uma vez\n");
        printf("Tome cuidado com a sua senha, ela é muito importante!\n\n");
        printf("Confirmação de Senha:");
        fflush(stdin);
        scanf("%[^\n]", string2);
        return 0;
    }

    system("cls");

    return 1;
}

int main(){

	int count, qntdPlayer;
	Player players[5];
	char stringaux[20];
    FILE *Pfile;

	setlocale (LC_ALL,"Portuguese");

	printf("\n\nPor favor, Informe quantos jogadores serão cadastrados(Limite de 5 jogadores): ");
	scanf("%d", &qntdPlayer);

	if (qntdPlayer < 1 || qntdPlayer > 5){
		printf("\nNúmero de Cadastros Inválido!\n");
		return 0;
	}

    for (count = 0; count < qntdPlayer; count++){

        system("cls");
        printf("Nome do Usuário:");
        fflush(stdin);
        scanf("%[^\n]", players[count].nickUser);
        while(compararNickUser(players, count)!=1);
        printf("\nMuito bem, você usará esse nome para realizar o login no jogo!\nLogin: %s\n", players[count].nickUser);
        system("pause");
        system("cls");

        printf("Nome do Personagem:");
        fflush(stdin);
        scanf("%[^\n]", players[count].nickChar);
        printf("\nPerfeito, é assim que seus amigos o reconhecerão!\nNick: %s\n", players[count].nickChar);
        system("pause");
        system("cls");

        printf("Senha: ");
        fflush(stdin);
        scanf("%[^\n]", players[count].senha);
        printf("Repita a senha para que ocorra a confirmação.\n\nConfirmação de Senha: ");
        fflush(stdin);
        scanf("%[^\n]", players[count].confirmaSenha);
        while(compararSenha(players[count].senha, players[count].confirmaSenha) != 1);
        printf("\nMais uma etapa concluida com louvor!\n\n");
        system("pause");
        system("cls");

    }

    Pfile = fopen("texto.txt", "w");

    if (Pfile == NULL){
        printf("Erro na abertura do arquivo.");
        exit(0);
    }

    for (count = 0; count < qntdPlayer; count++)
        fprintf(Pfile, "\n\nNome: %s\nPersonagem: %s\nSenha: %s\n\n",players[count].nickUser, players[count].nickChar, players[count].senha);

    fclose(Pfile);

    return 0;
}

A lógica que utilizei pra resolver foi a seguinte : o usuário irá informar o nickuser, e logo após isso é chamada a função comparaNickUser dentro de um laço while, e ao entrar nessa função, é feito a comparação com o nickuser que o usuário escolheu, com todo o resto, e caso encontre um igual, será informado os dados novamente e retornará 0 para ser feito outra comparação.

while(compararNickUser(players, count)!=1);

Logo, só irá sair desse while quando o usuário informar um nickuser diferente de todos, ao contrario irá ficar chamando até a condição do while ser satisfeita( que no caso é quando entrar na função e não passar pelo if de igualdade, retornando 1 direto).

 

E acabei fazendo outra função para compara a confirmação de senha, que utiliza a mesma lógica da função que acabei de explicar, e para seu código ficar completo só falta fazer a comparação nos nomes dos personagens, mas essa parte irei deixar para você tentar.

 

Reforçando o que disse no começo: pode ter erros, pois não testei direito, e também pode haver meios mais fáceis, enfim, espero que isso possa te ajudar em algo!

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

Sobre a senha:

 

1#

A confirmação de senha geralmente é apenas um mecanismo para a interface garantir que o usuário digitou a senha que quer corretamente.

 

22 horas atrás, SamuraiOcidental disse:

typedef struct{

    char nickUser[20];
    char nickChar[20];
    char senha[20];
    char confirmaSenha[20];

}Player;

 

Nesse caso, o programa está armazenando a mesma informação duas vezes... vejam, se o próprio programa confirma que as duas informações são iguais, para que armazenar duas vezes a mesma coisa?

 

O que poderia fazer? Apenas retirem esse atributo confirmarSenha da struct. Para confirmar a senha, declararia uma variável auxiliar. Por exemplo:

        char confirmaSenha[20];
        scanf("%[^\n]", confirmaSenha);        
        while(compararSenha(players[count].senha, confirmaSenha) != 1);

 

 

 

2#

Ao digitar a confirmação da senha errada, o programa está solicitando a digitação da confirmação da senha novamente, só que, com citado no 1#, o objetivo seria confirmar que digitou uma senha corretamente, logo, deveria solicitar novamente a senha inicial. Entendem? se a confirmação não deu certo, ele precisa digitar uma nova senha e a sua confirmação ("nova" no sentido de digitar novamente, pode ser a mesma).

 

A confirmação da senha é parecida com a confirmação do e-mail. As vezes o usuário digita algo errado, aí, alguns sistemas costumam pedir para confirmar o e-mail, pois, as chances de também digitar errado na confirmação é menor, daí, se não são iguais, é porque digitou algo errado... desta forma, sendo necessário digitar novamente o e-mail e a sua confirmação.

 

obs.: no caso de alguns contextos, como páginas da internet, o usuário tem acesso a cada campo com o mouse, ou seja, lá ele tem a possibilidade de ler e ver se o e-mail inicial está certo e poder editar ou não. Já no C, seu programa não dá essa oportunidade, daí, se digitou a senha inicial errada, teria que descobrir o que digitou para conseguir confirmar (em vez de digitar uma nova dupla)

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!