Ir ao conteúdo

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


Ir à solução Resolvido por Asrety,

Posts recomendados

Postado

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

Postado

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/

Postado

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!

Postado

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; 
	}
}
  • Solução
Postado

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
  • Membro VIP
Postado

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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!