Ir ao conteúdo
  • Cadastre-se

C dificuldade em completar um exercício


Posts recomendados

725309461_WhatsAppImage2021-05-04at21_27_11.thumb.jpeg.1d112c9cca3af14f693c5e16a2c178b4.jpeg

Estou na parte 2 (Alterar senha) e não consigo dar continuidade, sou estudante, e comecei a aprender agora em C, se alguém puder me ajudar fiaria muito grato.

Segue condigo onde parei (else if):

#include <stdio.h>
#include <stdlib.h>
#define cls system("cls");
void delay();
#include <string.h>
int main(){
    int codigo, senha=100932, ret, senhan, senha1;
    char nome[7]={"helio"},nome2[7];  
    do{
        cls
        printf("Para prosseguir escolha uma das tres opcaos.\n");
        printf("(1) login\n");
        printf("(2) alterar senha\n");
        printf("(3) sair.\n");
        scanf("%d", &codigo);
    }while(codigo < 1 || codigo > 3);
 	  
	    if(codigo == 1){
        do{
            cls
            printf("Informe o nome de login: ");
            scanf("%s",nome);
            ret = strcmp(nome,nome2);
            if(ret = 0){
                printf("Acesso negado \nInforme o nome de login:\n");
                delay();
            }
        }while( ret );
        printf("Informe a senha: ");    
        while(scanf ("%d", &senha1), senha1!=senha){ 
            printf("Acesso negado \nInforme a senha: ");
        }
        printf("Acesso Permitido.");
        return main();
    }else if( codigo == 2){
    	printf("Digite a senha atual: \n");
    	while(scanf ("%d", &senha1), senha1!=senha){ 
            printf("Acesso negado \n");
            return main();
        }
        printf("Digite a nova senha: \n");
        scanf("%d", senhan);
        
        strcpy(senha,senhan);
        printf("A nova senha eh: %d \n" senha);
	}
    return 0;
}
void delay() 
{
    for(int i=0; i<60000; i++)  
        for(int i=0; i<20000; i++);
}

 

 

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

Oih @Helio Junnior Sartor Dalmolin a função strdcpy que tenta usar para copiar senha nova em senha é apropriada somente para "stings" (tipo composto de alguns primitivos char) e não serve nesse caso, especificamente. 

 

Entendo que senha nova e senha são definidas/declaradas do tipo inteiro (tipo primitivo int) e nesse caso é atribuição direta e com operador de atribuição (=). Como você é iniciante, talvez não tenho sido claro suficiente até agora, ainda assim, tente resolver só com essa explicação.

 

 

2 horas atrás, Helio Junnior Sartor Dalmolin disse:

printf("Digite a nova senha: \n");

scanf("%d", senhan);

Falta o operador (&)! O conhecido por "endereço de", ele é a única maneira que as funções têm para acessar e modificar valores entre elas de espaço local para espaço local, acessando a variável lá onde ela se encontra na memória do computador, por essa razão "endereço de" existe.

 

2 horas atrás, Helio Junnior Sartor Dalmolin disse:

printf("A nova senha eh: %d \n" senha);

Faltou a vírgula que separa os parâmetros reais: "A nova senha eh: %d \n", senha

 

 

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

Olá @Helio Junnior Sartor Dalmolin, mano eu vi aqui que seu código possui alguns erros, por exemplo:

 

image.png.5822e9179cbfada39877d7d57ae89bb3.png

Na linha 24 você deixou de usar o "&" junto da variável para informar ao computador onde você quer que ele armazene o valor recebido pelo usuário, interessante isso pois na linha 17 você não esquece de usar:

 

image.png.b3c5aa9bff5b1fb43de8d9fab8dc5fac.png

Precisa prestar um pouco mais de atenção.

O mesmo ocorre na linha 45:

 

image.png.32e5714c366939d0005129eaf7f257c4.png

Como o mauro_b havia dito

32 minutos atrás, mauro_b disse:

a função strdcpy que tenta usar para copiar senha nova em senha é apropriada somente para "stings" (tipo composto de alguns char)

 Então é provável que isso não de certo:

image.png.b48b562240c22b505b59a4bc0867eabd.png

Sabendo que a variável senha e senhan foram declaradas como inteiras:

image.png.cb7cea353d517db0fa2c8d645304d466.png

Na linha 48 esta faltando uma virgula entre o texto que quer ser exibido pelo printf e a variável: 

image.png.ee6c5d8b55671eb8fbb0d26771c3bcf0.png 

 

2 horas atrás, Helio Junnior Sartor Dalmolin disse:

Estou na parte 2 (Alterar senha) e não consigo dar continuidade, sou estudante, e comecei a aprender agora em C, se alguém puder me ajudar fiaria muito grato.

 

Em relação a segunda parte, vejo que você já tem total capacidade para dar continuidade ao exercício,só precisa de um empurrãozinho.

Vamos lá, no enunciado pede-se para verificar se a senha atual esta correta para só então alterar a senha com uma nova, você poderia pedir a senha atual ao usuário e depois disso verificar com um if se ela é a mesma que foi declarada no inicio do código image.png.c325cf9cc99285b93a99b68c96c4ad07.png  caso ela não seja igual você pode printar na tela uma mensagem de erro ao usuário, caso contrario é só você armazenar o novo valor informado na variável senha.

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

2 minutos atrás, thefill disse:

image.png.5822e9179cbfada39877d7d57ae89bb3.png

Na linha 24 você deixou de usar o "&" junto da variável para informar ao computador onde você quer que ele armazene o valor recebido pelo usuário, interessante isso pois na linha 17 você não esquece de usar:

 

image.png.b3c5aa9bff5b1fb43de8d9fab8dc5fac.png

Precisa prestar um pouco mais de atenção.

`nome` é uma string, não precisa do &, eu postei sobre isso ontem aqui:

E é mais conveniente usar fgets() para ler strings.

Link para o comentário
Compartilhar em outros sites

@Helio Junnior Sartor Dalmolin Se criar uma função para retornar a opção do menu, acho que deixa o código mais simples de controlar e voltar ao menu principal. E com o retorno da função você pode usar a opção escolhida nos ifs e no while,

 

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

int menu(){
    int opcao;
    int n;
    do{
        printf("%s",
            "1) Login\n"
            "2) Alterar Senha\n"
            "3) Sair\n: "
        );
        scanf("%d%*c", &n);
        opcao = (n >= 1 && n <= 3);
        if(!opcao){
            printf("** OPCAO INVALIDA **\n");
        }
    }while(!opcao);
    return n;
}

int main(){
    int opcao;
    do{
        opcao = menu();
    }while(opcao != 3);
    return 0;
}

 

Assim vai sair do loop principal com a opção 3 e nas outras continua no menu. Após a entrada de umas das opções (1 ou 2) só falta colocar as operações da entrada de login e alteração de senha,

 

do{
    opcao = menu();
    if(opcao == 1){
            
    }
    if(opcao == 2){
        
    }
...

 

Para login e senha poderia usar apenas strings para comparar com strncmp após a entrada com a função fgets,

int main(){
    char login[20] = "login";
    char senha[20] = "12345";
...

 

Testando a entrada,

...
printf("Login: ");
fgets(nlogin, 20, stdin);
printf("Senha: ");
fgets(nsenha, 20, stdin);
iguais =
    !strncmp(login, nlogin, strlen(login)) && 
    !strncmp(senha, nsenha, strlen(senha));
}while(!iguais);
printf("** ACESSO LIBERADO **\n");

 

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

Está seguindo pelo caminho mais difícil.

 

Sabe o que é uma função porque tem uma no programa.

 

Curiosamente a única função que tem no programa não faz nada, exceto contar loucamente até 1,2 milhão para gastar um tempo, delay(). 

 

Sugiro escrever funções que façam algo. E para não fazer nada não é esperto usar um loop que fica contando. Você usa o sistema e pede um alerta, usando Sleep() ou algo similar. 

 

Não é correto usar o sistema ativamente para não fazer nada...

 

Seu programa tinha muitos erros. Poste o programa como está agora. E TESTE SEMPRE o retorno de scanf(). Não tem um manual? Uma apostila?

 

Não use um int para senha. É muito mais fácil ler apenas strings e deixar a senha com um certo número de dígitos e pronto. Qual a vantagem de usar int e não por exemplo char[8]? Não se opera com senhas. Apenas compara ou criptografa...

  • Curtir 1
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...