Ir ao conteúdo

Pascal_Definir Valor Máximo de Dados a Serem Armazenados em Uma Variável???


JosimarBG2009

Posts recomendados

Postado

Queria saber como posso definir o valor máximo, seja o tipo de dado um, inteiro, string, entre outros.

Exe.:


program qualquer;

uses crt;

var
a,b,c:integer;
palavra:string;

begin

writeln(' Digite os números:');
read(a);read(;readln(c);
writeln(' Digite a palavra');
read(palavra);

end.

Quando o usuário digitasse o valor para a variável "a", exemplo 555, a mesma deviria armazenar 55 e saltar para o próximo campo correspondente a variável "b" que por sua vez armazenaria 5.

Espero ter sido bem claro, e queria saber também se é possível fazer o mesmo com os típos de dados, string, word, byte ...

desde já agradeço.

Postado

Ola.

Para definir o tamanho de uma String basta declarar assim: Palavra:String[4] desta forma sua variável "palavra" vai aceitar apenas 4 caracteres, detalhe, por default String é de 255 no Pascal.

Se entendi bem, seu problema está na entrada (digitação) que o usuário fará, neste caso, o seu problema é um pouco maior, isto se você estiver usando o modo texto como mostra seu código.

Para resolver terá que criar algumas funçoes que permitam isto, dê uma pesquisada sobre a função window(x,y,x1,y1) do Pascal e junto com algumas funções default.

Apostila Pascal

A melhor solução será criar uma Unit para que futuramente você consiga usar em outras aplicações.

Espero ter ajudado, boa sorte.

  • Membro VIP
Postado

Queria saber como posso definir o valor máximo, seja o tipo de dado um, inteiro, string, entre outros.

Exe.:


program qualquer;

uses crt;

var
a,b,c:integer;
palavra:string;

begin

writeln(' Digite os números:');
read(a);read(B);readln(c);
writeln(' Digite a palavra');
read(palavra);

end.


Quando o usuário digitasse o valor para a variável "a", exemplo 555, a mesma deviria armazenar 55 e saltar para o próximo campo correspondente a variável "b" que por sua vez armazenaria 5.

Espero ter sido bem claro, e queria saber também se é possível fazer o mesmo com os típos de dados, string, word, byte ...

desde já agradeço.

Olá

3 formas de resolver

1) Usando o comando Read(sem ln) + String[X]

2) Usando o ReadKey para ler tecla por tecla

3) Ler os três em uma só e repassar para o outro

A forma mais simples é a primeira.

Veja

program ler_dados;

var
a :string[2];
b :string[1];

begin
Writeln('Digite um valor com 3 ou mais caracteres');
Read(a); {read = ler até quando pode e joga o resto para o
proximo read ou readln}
ReadLN(; {readln = ler tudo e só armazena o que cabe, e descarta o resto}
WriteLN;
WriteLN('a = ',a);
WriteLN('b = ',;
ReadLN; {dah um pause antes que feche}
end.

:lol:

Neste exemplo acima o cara pode digitar quantos números (ou caracteres) quiser (até 255), e ao pressionar ENTER a variável "a" vai pegar o que ela pode, e deixar para o próximo Read ou ReadLN, no "b" ele vai pegar o que pode e descartar o resto (joga fora).

Se você quiser que SOMENTE digite 3 valores, ai você terá que implementar o 2º modo.

PS: Para ler com o ReadKey: a:=ReadKey; (se "a" for um char) ou a[x]:=ReadKey; (se "a" for uma String - X=posição do caractere, ou seja, de 1 até o tamanho da string). Observe que ReadKey só ler "char" !!!

Qualquer coisa é só postar!!!

Postado

Legal, as dicas são boas, mas ainda não é o q eu espero para solucionar esse problema.

Vou tentar exemplificar.

Imagine um programinha para inserir a data, que ficasse mais ou menos nesse formato na tela:

writln(' data __/ __/ __');

{resultado => " data __/ __/ __" na tela do programa }

{ Usando o "gotoxy(..,..);" para ler para as variáveis, dia, mes e ano... }

gotoxy(8,1);read(dia);

gotoxy(12,1);read(mes);

gotoxy(16,1);read(ano);

Até aí tudo bem... mas eu queria que quando fosse digitado, por exemplo, os dois caracteres referentes ao dia, sem que fosse necessário teclar <enter>, a leitura para a próxima variável, avançasse para o próximo campo referente ao "mes"...

  • Membro VIP
Postado

Legal, as dicas são boas, mas ainda não é o q eu espero para solucionar esse problema.

Vou tentar exemplificar.

Imagine um programinha para inserir a data, que ficasse mais ou menos nesse formato na tela:

writln(' data __/ __/ __');

{resultado => " data __/ __/ __" na tela do programa }

{ Usando o "gotoxy(..,..);" para ler para as variáveis, dia, mes e ano... }

gotoxy(8,1);read(dia);

gotoxy(12,1);read(mes);

gotoxy(16,1);read(ano);

Até aí tudo bem... mas eu queria que quando fosse digitado, por exemplo, os dois caracteres referentes ao dia, sem que fosse necessário teclar <enter>, a leitura para a próxima variável, avançasse para o próximo campo referente ao "mes"...

Olá JosimarBG2009,

Por que você não perguntou logo da segunda forma??? :lol:

De certo modo eu cheguei a dar a dica:

PS: Para ler com o ReadKey: a:=ReadKey; (se "a" for um char) ou a[x]:=ReadKey; (se "a" for uma String - X=posição do caractere, ou seja, de 1 até o tamanho da string). Observe que ReadKey só ler "char" !!!

, de qualquer forma um exemplo abaixo de como pode ficar..

(*
Forum Clube do Hardware - 23/02/2010

Exemplo de programa que faz leitura de Datas
*)
program lerData;
uses
CRT;

var
tecla :char; {tecla digitada}
dia,
mes :String[2];
ano :String[4];
i :Byte; {usado nos 'for'}

BEGIN
TextColor(15); {cor do texto}
TextBackGround(0); {cor do fundo}
ClrScr; {limpa a tela}

{imprime a base}
WriteLN(' Data __/__/____');

{obs.: Where = posicao atual do cursor, X para coluna e Y para linha}
{ler o dia}
GotoXY(07,WhereY-1);
for i:=1 to 2 do
begin
tecla:=Readkey;
Write(tecla);
dia:=dia+tecla;
end;

{ler o mes}
GotoXY(WhereX+1,WhereY);
for i:=1 to 2 do
begin
tecla:=Readkey;
Write(tecla);
mes:=mes+tecla;
end;

{ler o ano}
GotoXY(WhereX+1,WhereY);
for i:=1 to 4 do
begin
tecla:=Readkey;
Write(tecla);
ano:=ano+tecla;
end;

WriteLN; {pula uma linha}
WriteLN;
TextColor(14);
WriteLN('Dada digitada: ',dia,'/',mes,'/',ano);
TextColor(15);
WriteLN;
Write('Pressione qualquer tecla para finalizar');
ReadKey; {dah um pause antes de fechar}
END.

OBS.: Alguns coisas ainda podem ser melhoradas.

1) Usar um DateTime (da unit DOS) em vez de String;

2) Implementar o "BackSpace" para apagar os números;

3) Permitir somente que digite números;

4) Etc...

Qualquer coisa é só postar

Postado
Olá JosimarBG2009,

Por que você não perguntou logo da segunda forma??? :lol:

De certo modo eu cheguei a dar a dica: , de qualquer forma um exemplo abaixo de como pode ficar..

(*
Forum Clube do Hardware - 23/02/2010

Exemplo de programa que faz leitura de Datas
*)
program lerData;
uses
CRT;

var
tecla :char; {tecla digitada}
dia,
mes :String[2];
ano :String[4];
i :Byte; {usado nos 'for'}

BEGIN
TextColor(15); {cor do texto}
TextBackGround(0); {cor do fundo}
ClrScr; {limpa a tela}

{imprime a base}
WriteLN(' Data __/__/____');

{obs.: Where = posicao atual do cursor, X para coluna e Y para linha}
{ler o dia}
GotoXY(07,WhereY-1);
for i:=1 to 2 do
begin
tecla:=Readkey;
Write(tecla);
dia:=dia+tecla;
end;

{ler o mes}
GotoXY(WhereX+1,WhereY);
for i:=1 to 2 do
begin
tecla:=Readkey;
Write(tecla);
mes:=mes+tecla;
end;

{ler o ano}
GotoXY(WhereX+1,WhereY);
for i:=1 to 4 do
begin
tecla:=Readkey;
Write(tecla);
ano:=ano+tecla;
end;

WriteLN; {pula uma linha}
WriteLN;
TextColor(14);
WriteLN('Dada digitada: ',dia,'/',mes,'/',ano);
TextColor(15);
WriteLN;
Write('Pressione qualquer tecla para finalizar');
ReadKey; {dah um pause antes de fechar}
END.

OBS.: Alguns coisas ainda podem ser melhoradas.

Qualquer coisa é só postar

:lol:

Muito bom,!!! É, eu acho que fui eu que não captei a ideia antes.

É uma boa solução, e eu compreendi a lógica que foi apresentada.

Eu uso a data do sistema implementando a unit DOS, e facilita muito...

Mas a minha dúvida do momento, (pois outras virão é claro) era essa.

valeu mesmo, e qualquer coisa eu posto.

  • Membro VIP
Postado
:lol:

Muito bom,!!! É, eu acho que fui eu que não captei a ideia antes.

É uma boa solução, e eu compreendi a lógica que foi apresentada.

Eu uso a data do sistema implementando a unit DOS, e facilita muito...

Mas a minha dúvida do momento, (pois outras virão é claro) era essa.

valeu mesmo, e qualquer coisa eu posto.

Olá JosimarBG2009,

Se precisar de uma forcinha para integrar as funções da unit DOS com essa leitura estamos a disposição, assim como implementar essa questão do "backspace", observe que nesta versão postada anteriormente, não é possível apagar as letras digitadas, ou seja, digitou errado fica errado.

O QUE PROPONHO VOCÊ IMPLEMENTAR

1) Usar DateTime (unit DOS) para armazenar as datas;

Basta converter os campos lidos de String para Integer e jogar nos campos correspondentes no DateTime. (obs.: DateTime usa Word, mas na prática Integer vai funcionar também, já que são valores baixos)

2) Implementar "BACKSPACE" e ler somente número.

No caso implementar quando o usuário digitar BACKSPACE o programas deve retirar a última tecla digitada e também apagar na tela, ou seja, quando se ler por ReadKey ele NÃO IMPRIME NA TELA, quem faz isso é o programa, daí para apagar é da mesma forma, terá que colocar novamente o "_"... ^_^ e para só ler número basta, por exemplo, verificar se foi número ou não..

ex.:

if (tecla in [0,1,2,3,4,5,6,7,8,9]) then

Se precisar de ajuda é só postar.

PS: Se a gente implementar uma boa funcionalidade para leitura, comparações, etc, de datas, depois também podemos colocar na UNIT que estamos implementando aqui no Fórum.

Abraços

Postado

Só facilitando uma coisinha :)

ex.:

if (tecla in [0,1,2,3,4,5,6,7,8,9]) then

para:


if (tecla in [0..9]) then

Assim explica logo para todos um modo fácil de verificar se um número inteiro faz parte de um conjunto de inteiros de (x) a (n).

abraços!

Postado

Legal essa Unit do forum, eu já estou dando uma olhadinha nela.

Quem sabe eu não crio alguma coisa interessante aí também; você sabe, uma ideia puxa uma outra.

Se alguém pergunta: Quantas vezes você errou???

O cara pessimista vai dar um número de erros como resposta.

Já o otimista vai dizer: Eu não errei, apenas descobri formas de como não fazer...

Essa fraze não é minha, apenas foi adaptada por mim.

valeu, e obrigado pela atenção...

  • Membro VIP
Postado
:confused:

Cara, me surgiu mais uma dúvida.

E para converter caracteres para Inteiro, real, entre outros tipos de dados???

Alguns compiladores possuem os comando StrtoInt e InttoSrt, mas como eu desconheço esses comando vou passar os que eu sei.

Para converter de String para Integer ou Real pode se usar o comando VAL

var
texto :string;
numero :real;
code :integer; {codigo de retorno que informa se foi sucesso ou nao a o-
peracao de conversao}

begin

writeln('Digite o numero a ser convertido');
readln(texto);

val(texto,numero,code);

writeln('Texto : ',texto);
writeln('Codigo : ',code);
writeln('Numero : ',numero:0:2);
readln;

end.

Para converter de Integer ou Real para String

var
texto :string;
numero :real;

begin

writeln('Digite o numero a ser convertido');
readln(numero);

str(numero:0:2,texto);
[COLOR="Red"](*
obs.: Como se trata de um numero real, no Pascal o numero vem em notacao
cientifica, dai se quiser pegar só um numero de casa decimais espe-
cifico pode utilizar desta formatacao: "varival:x:y" onde x=numero de
casas reservadas a esquerda e y=numero de casas decimais...
Detalhe: na pratica só vai fazer diferenca os numeros decimais.
Para numeros intereiros nao precisara desta formatacao :x:y....
*)[/COLOR]

writeln('Numero : ',numero:0:2);
writeln('Texto : ',texto);
readln;

end.

Qualquer coisa é só postar

Abraços

Postado

Cara, acho que já ta ficando chato eu e minhas perguntas, mas...

Será que você poderia dar uns bons exemplos do uso da funssão "Keypressed;"?

Eu sei que ela retorna um valor bolleano, mas eu tava pensando em usa-la da seguinte forma:

Se tal tecla for pressionada faça isso...

Tipo um comando condicional.

Eu tentei usar sintaxe de ponto mas não tenho ideia de como é essa lógica.

  • Membro VIP
Postado
Cara, acho que já ta ficando chato eu e minhas perguntas, mas...

Será que você poderia dar uns bons exemplos do uso da funssão "Keypressed;"?

Eu sei que ela retorna um valor bolleano, mas eu tava pensando em usa-la da seguinte forma:

Se tal tecla for pressionada faça isso...

Tipo um comando condicional.

Eu tentei usar sintaxe de ponto mas não tenho ideia de como é essa lógica.

Olá,

SOBRE FAZER VÁRIAS PERGUNTAS

Cara, acho que já ta ficando chato eu e minhas perguntas, mas...

Jamais... pelo contrário, estamos aqui para isso... Pode ficar à vontade.

Eu só não sei se podemos responder mais de uma vez no mesmo dia, e também estou achando que estamos falando de muitas coisas no mesmo tópico.

Acho que o mais correto é você criar um novo tópico com essa dúvida sobre Keypressed. (para não misturar muito os assuntos)

EM RELAÇÃO AO USO DO KEYPRESSED

Aqui no fórum já tem alguns exemplos do uso desse comando. Experimente dá uma pesquisadinha pela palavra "Keypressed"... Lembre-se de usar a "pesquisa avançada" e marcar, em "pesquisar no fórum", a sub-pasta "Pascal/Delphi" que está em "Software".

Para adiantar o lado eu já criei um novo tópico...

Link

http://forum.clubedohardware.com.br/exemplos-uso-comando/781620

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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!