Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi problema em algoritmo no delphi


Posts recomendados

Ola estou tem um pouco de problemas com meu algoritmo no delphi,se alguém puder me ajudar,agradeço.

Meu problema é o seguinte,tenho um exerco para fazer e to encontrando problemas,quando eu compilo meu codigo ele não mostra a frase 'ACESSO NEGADO' mesmo eu errando propozitalmente,tipo ele fica preso no acesso permitido,acho q é a forma com q eu atribuir o valor a vriavel senha.se alguem poder ajudar.

 

 

<var login:string;
     senha:integer;
     prepara:string;
begin
    Writeln('LOGIN:');
    Readln(login);
    Writeln('SENHA:');
    readln(senha);
    login:= prepara;
    senha:= (123456789);
        if (login = prepara) and (senha = 123456789) then
        Writeln('ACESSO PERMITIDO')>
        else
           begin
          Writeln('ACESSO NEGADO');
          end;
          readln;


end.>
 

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

acredito que a variável do tipo integer só vá até 32 768.

longint vai até 2 147 483 647.

Corrigindo isso e outro erros de sintaxe:

var login:string;
     senha: longint;
   
begin
    Writeln('LOGIN:');
    Readln(login);
    Writeln('SENHA:');
    readln(senha);
    
    if (login = 'prepara') and (senha = 123456789) then
    Writeln('ACESSO PERMITIDO')
    else  Writeln('ACESSO NEGADO');
    readln;


end.

 

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

Em 14/10/2019 às 16:29, Flávio Pedroza disse:

acredito que a variável do tipo integer só vá até 32 768.

longint vai até 2 147 483 647.

Corrigindo isso e outro erros de sintaxe:


var login:string;
     senha: longint;
   
begin
    Writeln('LOGIN:');
    Readln(login);
    Writeln('SENHA:');
    readln(senha);
    
    if (login = 'prepara') and (senha = 123456789) then
    Writeln('ACESSO PERMITIDO')
    else  Writeln('ACESSO NEGADO');
    readln;


end.

 

integer vai de -2.147.483.647 até +2.147.483.647...

 

você não inicializou a variável "prepara" e está passando ela pro login, e depois, está praticamente verificando se ela é igual a ela mesma...

 


   login:= prepara;

    senha:= (123456789);

    if (login = prepara) and (senha = 123456789) then

após inicializar a variável:


 var login:string;
     senha:integer;
     prepara:string;
begin
    login := 'admin';

    Writeln('LOGIN:');
    Readln(prepara);
    Writeln('SENHA:');
    readln(senha);
        if (login = prepara) and (senha = 123456789) then
        Writeln('ACESSO PERMITIDO')
        else
        Writeln('ACESSO NEGADO');


    readln;
end.

 

 

 

 

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

@Fazzioni Recomendo utilizar os dois campos de nome e senha como strings.

Program Loga;
uses
  Crt;
  
const
  T_NOME=10;
  T_SENHA=16;
  
type
  TDados=record
    nome:string[T_NOME];
    senha:string[T_SENHA];
  end;
  
var
  login:TDados;
  
begin
    writeln('Digite o nome de usuario.');
    readln(login.nome);
    writeln('Digite a senha do usuario.');
    readln(login.senha);
    if (login.nome='carlos')and (login.senha='333gg') then
        writeln('Usuario logado.')
    else
        writeln('usuario ou senha invalidos.');
    readkey;
end.

 

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

@KXSY  não gosto de engessar meus códigos, mas concordo que nessas situações de aprendizável é preferível.

Quando olhei para a senha, pensei na possibilidade de não tratar como password e sim como um acesso ao usar, por exemplo, um CPF que 9 números são suficientes, assim, nessa situação, cada senha eu gastaria 4 bytes para armazenar, enquanto que usando 16 caracteres eu gastaria, no mínimo, daquela forma, 16 byts. Logo, por esse prisma, eu diminuiria não só em 4x o espaço necessário para armazenar mas também o processamento no momento de utilizar milhares de registros...

 

Link para o comentário
Compartilhar em outros sites

Em 21/10/2019 às 11:04, Fazzioni disse:

Quando olhei para a senha, pensei na possibilidade de não tratar como password e sim como um acesso ao usar, por exemplo, um CPF que 9 números são suficientes,

Agora digamos que você está escrevendo um programa para pessoas que nunca usaram um computador, a pessoa vai lá e coloca o CPF 08784666-42, então só por causa de uma meia riscada ("-" sinal de subtração) a pessoa receberia uma mensagem de erro (ou algo semelhante).

 

Então resumindo, cabe ao programador prever o usuário e não o contrario.

 

Em 21/10/2019 às 11:04, Fazzioni disse:

por exemplo, um CPF que 9 números são suficientes, assim, nessa situação, cada senha eu gastaria 4 bytes para armazenar, enquanto que usando 16 caracteres eu gastaria, no mínimo, daquela forma, 16 byts. Logo, por esse prisma, eu diminuiria não só em 4x o espaço necessário para armazenar mas também o processamento no momento de utilizar milhares de registros...

Isso eu não me preocupo, porque eu não estou programando para commodore amiga e sim para IBM PCs compatíveis.

Quando foi a ultima vez que você viu um computador com 512Mb de memoria ram ou 2Gbs de HD, eu posso te falar que pra mim já faz 7 anos e o computador era meu (Esse mesmo eu joguei no lixo).

 

Em 21/10/2019 às 11:04, Fazzioni disse:

cada senha eu gastaria 4 bytes para armazenar

Isso não e totalmente verdade, porque em plataformas 16 bits (que já está em desuso) você utilizaria 2 bytes, 32 bits 4 bytes e em 64 bits utilizaria 8 bytes que já daria para guardar 8 caracteres.

 

somando a quantidade de dados que o sistema utilizaria caso mil pessoas tivessem se cadastrado no modo que eu mostrei daria (10*1000)+(16*1000)=26000bytes ou 0,026Mbs uma quantia irrisória para os dias de hoje.

 

recomendo olhar isso aqui Tamanho de um inteiro no FreePascal. 

Em 21/10/2019 às 11:04, Fazzioni disse:

@KXSY  não gosto de engessar meus códigos, mas concordo que nessas situações de aprendizável é preferível.

Não acho que esteja engessado, e sim organizado.

Imagine de novo os mil usuários se logando no sistema, com o seu algorítimo seria meio difícil modificar para atender mil logins, agora por outro lado o meu com poucas modificações já daria para atender uma grande quantidade de logins.

Program Loga;
uses
  Crt;
  
const
  T_NOME=10;
  T_SENHA=16;
  
type
  TDados=record
    nome:string[T_NOME];
    senha:string[T_SENHA];
  end;
  
var
  usuario:TDados;
  login:TDados=(
    nome:'Jonas';
    senha:'4395wwrw';
  );

procedure PegaLogin(var usr:TDados);
begin
    writeln('Digite o nome de usuario');
    readln(usr.nome);
    writeln('Digite a senha do usuario');
    readln(usr.senha);
end;

function Loga(const usr,reg:TDados):boolean;
begin
    if (usr.nome=reg.nome)AND(login.senha=reg.senha) then
        loga:=TRUE
    else
        loga:=FALSE;
end;

begin
    PegaLogin(usuario);
    if Loga(usuario,login) then
        writeln('Usuario logado.')
    else
        writeln('Usuario invalido.');
    readkey;
end.

Uma pequena demonstração de como expandir o algorítimo, eu não estou tão bom quanto eu era antes em pascal então um sistema que pode cadastrar mil pessoas em pascal eu vou ficar devendo.

 

Mas em C eu tenho um aqui

Spoiler

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

/* Constantes */
#define N_LOGINS "LOGFUNC.DAT"

#define T_NOME 10
#define T_SENHA 17

#define T_ID 3
#define ID_N "CF"

/* Tipos */
typedef struct
{
  char id[T_ID];
  unsigned char versao;
  unsigned short q_funcionarios;
}TCabecalho;

typedef struct
{
  char nome[T_NOME];
  char senha[T_SENHA];
}TFuncionario;

typedef struct lista
{
  TFuncionario funcionario;
  struct lista *anterior;
}TLista;

int main(void)
{
  FILE *logins;
  TFuncionario *funcionarios;
  TFuncionario logado;
  TCabecalho cab={ID_N,1,0};
  TLista *l=NULL;
  int cont=0,opcao;
  logins=fopen(N_LOGINS,"rb+");
  if(!logins)
  {
    printf("\nNão há banco de dados.\n");
    printf("\nEntão um novo banco de dados sera criado.\n");
    logins=fopen(N_LOGINS,"wb+");
    if(!logins)
    {
      perror("\nNão foi possivel criar o arquivo.\n");
      return(-1);
    }
    do 
    {
      printf("\n1:Criar novo usuario\n");
      printf("2:sair do cadastro:\t");
      scanf("%i",&opcao);
      getchar();
      if(opcao==1)
      {
        TLista *aux;
        TFuncionario f;
        printf("\nDigite o nome do usuario:\t");
        scanf("%[^\n]%*c",f.nome);
        printf("\nDigite a senha do usuario:\t");
        scanf("%[^\n]%*c",f.senha);
        cont++;
        if(!l)
        {
          aux=malloc(sizeof(TLista));
          if(!aux)
            return(-1);
          aux->anterior=l;
          l=aux;
          aux->funcionario=f;
        }
        else
        {
          aux=malloc(sizeof(TLista));
          if(!aux)
            return(-1);
          aux->anterior=l;
          aux->funcionario=f;
          l=aux;
        }
      }
      else if(cont>=1)
        opcao=0;
      else
      {
        printf("\nTem que haver pelo menos um usuario cadastrado.\n\n");
      }
    }while(opcao);
    cab.q_funcionarios=cont;
    fwrite(&cab,sizeof(TCabecalho),1,logins);
    while(l)
    {
      TLista *d;
      d=l->anterior;
      fwrite(&l->funcionario,sizeof(TFuncionario),1,logins);
      free(l);
      l=d;
    }
    fclose(logins);
    printf("\nReinicie o programa para usar....\n");
    getchar();
    return(0);
  }
  fread(&cab,sizeof(TCabecalho),1,logins);
  if(strcmp(cab.id,ID_N))
  {
    char tecla;
    printf("\nArquivo de logins invalido\n\n");
    printf("\nDeseja apagar o arquivo antigo\nS/N:\t");
    scanf("%c",&tecla);
    getchar();
    if(toupper(tecla)=='S')
    {
      fclose(logins);
      remove(N_LOGINS);
      printf("\nO arquivo foi apagado.\n");
      return(0);
    }
  }
  funcionarios=malloc(sizeof(TFuncionario)*cab.q_funcionarios);
  if(!funcionarios)
  {
    perror("\nnão foi possivel reservar memoria do sistema.\n");
    fclose(logins);
    return(-1);
  }
  for(cont=0; cont<cab.q_funcionarios; cont++)
    fread(&funcionarios[cont],sizeof(TFuncionario),1,logins);
  do
  {
    printf("\nDigite o nome de usuario:\t");
    scanf("%[^\n]%*c",logado.nome);
    printf("\nDigite a senha do usuario:\t");
    scanf("%[^\n]%*c",logado.senha);
    opcao=1;
    for(cont=0; cont<cab.q_funcionarios&&opcao; cont++)
    {
      if((!strcmp(logado.nome,funcionarios[cont].nome))&&(!strcmp(logado.senha,funcionarios[cont].senha)))
        opcao=0;
    }
    if(opcao)
      printf("\nUsuario ou senha invalidos\n");
    else
      printf("\nUsuario logado.\n");
  }while(opcao);
  free(funcionarios);
  fclose(logins);
  return(0);
}

Nesse aqui pode cadastra a quantidade de pessoas que você quiser!

 

Link para o comentário
Compartilhar em outros sites

21 horas atrás, KXSY disse:

Agora digamos que você está escrevendo um programa para pessoas que nunca usaram um computador, a pessoa vai lá e coloca o CPF 08784666-42, então só por causa de uma meia riscada ("-" sinal de subtração) a pessoa receberia uma mensagem de erro (ou algo semelhante).

 

Então resumindo, cabe ao programador prever o usuário e não o contrario.

  @KXSY O objetivo desse fórum acredito que não é fazer o tema de casa, dessa forma, é evidente a necessidade de tratar as exceções, inclusive, em seu código, veja que você obriga o usuário a digitar a primeira letra maiúscula no exemplo de 'Jonas':

 

21 horas atrás, KXSY disse:

 


function Loga(const usr,reg:TDados):boolean;
begin
    if (usr.nome=reg.nome)AND(login.senha=reg.senha) then
        loga:=TRUE
    else
        loga:=FALSE;
end;

 

 

 

21 horas atrás, KXSY disse:

(10*1000)+(16*1000)=26000bytes ou 0,026Mbs uma quantia irrisória para os dias de hoje.

cuidado com a nomenclatura, subentende-se Mb como megabits e MB como megabytes.

 

criar um aplicativo para dezenas de pessoas é totalmente diferente de um para milhões, não precisa ir muito longe, facilmente, encontra-se um android com a memória interna cheia... trocar de hardware? é uma opção!

 

Link para o comentário
Compartilhar em outros sites

Em 23/10/2019 às 14:44, Fazzioni disse:

veja que você obriga o usuário a digitar a primeira letra maiúscula no exemplo de 'Jonas':

Eu sou usuário da vertente Un*x então isso e normal para mim.

No meu desktop eu utilizo debian buster

24_10_2019_16_28_19.thumb.png.983ffbbbde3dced283da1a4104844cb2.png

então para você e estranho utilizar nomes sensíveis ao caso (case-sensitive), mas para mim e uma coisa bem comum.

 

Em 23/10/2019 às 14:44, Fazzioni disse:

criar um aplicativo para dezenas de pessoas é totalmente diferente de um para milhões, não precisa ir muito longe, facilmente, encontra-se um android com a memória interna cheia... trocar de hardware? é uma opção!

Reclame com o google, que com um simples hello world com a própria api java do android fica entorno de 5MB.

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