Ir ao conteúdo
  • Cadastre-se

Qual a diferença entre READ e READLN ???


Posts recomendados

  • Membro VIP

Olá,

Eu estou perguntando e eu mesmo tentarei começar a responder...

De cara!!!

Fica a dica básica:

"NUNCA USE READ(); SÓ USE READLN();"

Pessoal, eu sempre recomendei usar ReadLN e nunca Read (sem o ln), mas nunca, pelo menos que lembre, dei uma boa explicação do motivo. Agora vou tentar dar uma luz para gente.

Pela minha prática do uso do Pascal, observei que alguns programas davam problemas devido ao uso do Read (sem o ln). Não tinha nenhum motivo aparente. Todo código estava "claramente" correto, tudo visto certinho, mas na hora de rodar dava o famoso "pau". Futucando futucando observei que só alterando de Read para ReadLN o programa voltava a funcionar normalmente. Daí em diante SEMPRE usei ReadLN e excluir o Read do meu dicionário. Com o tempo descobri qual a diferença entre um e outro, mas quase que não utilizava o segundo devido a utilidade dele, ou seja, pouco programas necessitaram do uso do Read e acabei esquecendo da sua utilidade... entretanto, continuei com a "vibe" de só utilizar o ReadLN, já que são aparentimente iguais, para quê vou utilizar um que pode dar problema???

Aqui no fórum é comum encontrar código com o bendito Read, e sempre que podia dava a dica de NÃO USAR READ, SOMENTE READLN, mas de certo modo não explicava direito.

Como não lembrava (já tinha visto antes) da funcionalidade do Read, resolvi pesquisar na net a algum tempo... já vi livro dizendo que é igual ao ln do Write... cuidado, não tem nada a ver!!! (em relação a escrita e leitura do console).

O LN do WriteLN serve basicamente como "pular uma linha", acredito eu que "LN" venha de "Line", ou seja, como se desse um "ENTER" !!! - Imprime o texto e vai pro início da próxima, sem o ln vai continuar onde parou... Experimentem trocar um ReadLN por um Read! A linha vai deixar de descer??? NÃO !!! Não vai!!! (ou vai?)

Vamos lá

Resumidamente o que sei sobre eles é:

ReadLN = Pega todos os caracteres digitados do console, armazena o que consegue e descarta o resto.

Read = Pega SOMENTE o que cabe na variável e deixa o resto para o próximo Read ou ReadLN. Detalhe, enquanto não encontrar outro ReadLN (com LN) o Pascal NÃO VAI MAIS LER CARACTERES PELO CONSOLE, ou seja, não vai mais deixar o usuário digitar nada!!! Ele vai indo consumindo o que foi digitado ou não!!!

PS: A dica continua.. ou seja, quem sabe mais ou menos pra que ser o Read use-o para sua utilidade, caso contráio só use READLN.

Façam seus testes e comententem aqui por favor.

Abraços

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

realmente, talvez o read funciona como o buffer do teclado como no C eu acho, nunca fui atrás disso, uma vez até você corrigiu um código meu por ter usado o read, mas foi falta de atenção minha pois só uso o readln. Mas uma coisa é certa, usem o read apenas para leitura de arquivos binários beleza!

abraço cara!

Link para o comentário
Compartilhar em outros sites

  • mês depois...
  • Membro VIP

Olá!

Desculpem a demora para postar neste tópico, estive um pouco atarefado ultimamente..

Infelizmente não costumo programar com pascal puro, porém pesquisei a respeito para poder dar-lhes uma resposta sobre esta questão.

Tanto o read quanto o readln só pegam os valores que cabem em suas variaveis, obvio, não tem como pegar além da capacidade sem dar pau.

A diferença básica entre eles não é sobre descer a linha ou não (afinal, como já observado, ambos vão para a proxima linha) e sim como eles tratam a linha que foi entrada.

Como você mesmo já observou, o read vai pegar o que "couber em sua variável", e o próximo read vai pegar o que couber da mesma linha.

Já o readln vai pegar o que "couber em sua variável", e descartar o resto, passando pra próxima linha.

Seguindo o exemplo de um site (leia fonte mais a seguir), imaginem o seguinte programa:

 
program READ;
	var     numb1, numb2 : integer;
	begin
	        writeln('Entre com dois numeros separados por um espaço');
	        read( numb1 );
	        read( numb2 );
	        writeln;
	        writeln('Numb1: ', numb1 , '   Numb2: ', numb2 )
	end.

Se o usuário entrasse, com apenas uma linha, assim:

237 64

Ele pegaria o possível pra primeira variável (237, já que é um inteiro e inteiro não aceita espaço. Sendo assim o fim da variavel) atribuindo-o ao "Numb1" e pegaria também o possível para a segunda variável (64, já que é o resto) atribuindo-o ao "Numb2". Exibindo normalmente:

Numb1: 237 Numb2: 64..

Agora, se no mesmo programa, colocassemos readln:

 
program READ;
	var     numb1, numb2 : integer;
	begin
	        writeln('Entre com dois numeros separados por um espaço');
	        readln( numb1 );
	        readln( numb2 );
	        writeln;
	        writeln('Numb1: ', numb1 , '   Numb2: ', numb2 )
	end.

E o usuário entrasse a mesma coisa:

237 64

Ele iria pegar o possível para a primeira variável (237, novamente somente até o espaço já que um espaço não é um numero inteiro) e DESCARTARIA O RESTO. Pulando para a próxima linha para pegar o "Numb2"..

Vejam outro exemplo:

Tenhamos o seguinte programa:

 
program READ;
	var     a,b,c:char;
	begin
	        writeln('Entre com dois valores');
	        readln(a);
	        read(b);
            read(c);
	        writeln;
	        Writeln(a);
	        Writeln(;
	        Writeln(c);
	end.

Se o usuário entrasse, por exemplo:

Clube

Hardware

O Readln pegaria o que cabe nele (por ser char, cabe apenas um char): C. E descartaria o resto (lube) pulando para a próxima linha.

O primeiro Read pegaria o que cabe nele (1 char): H, mas continuaria na linha. O segundo read pegaria o que cabe nele (1 char) que vem logo após: a.

Mas também pude perceber uma coisa.. por (como ja dito) não trabalhar com pascal puro, utilizo o Pascalzim para ajudar a galera aqui no fórum. Como sabemos, o Pascalzim não é um compilador "profissional" e não suporta diversas utilidades. No Pascalzim, o uso de Read ou ReadLN se torna aparentemente IGUAL. Já em outros compiladores, não sei informar. Mas a diferença entre read e readln é a dita acima.

Qualquer dúvida é só postar!

Fontes:

http://www.cmpe.boun.edu.tr/~say/c150/pascal/basicio.htm (inglês)

http://www.hkbu.edu.hk/~bba_ism/ISM2110/pas011.htm (inglês)

Abraços!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
kelson.23 disse:

realmente, talvez o read funciona como o buffer do teclado como no C eu acho, nunca fui atrás disso, uma vez até você corrigiu um código meu por ter usado o read, mas foi falta de atenção minha pois só uso o readln. Mas uma coisa é certa, usem o read apenas para leitura de arquivos binários beleza!

abraço cara!

Mog.Lucas disse:

Olá!

Desculpem a demora para postar neste tópico, estive um pouco atarefado ultimamente..

Infelizmente não costumo programar com pascal puro, porém pesquisei a respeito para poder dar-lhes uma resposta sobre esta questão.

Tanto o read quanto o readln só pegam os valores que cabem em suas variaveis, obvio, não tem como pegar além da capacidade sem dar pau.

A diferença básica entre eles não é sobre descer a linha ou não (afinal, como já observado, ambos vão para a proxima linha) e sim como eles tratam a linha que foi entrada.

Como você mesmo já observou, o read vai pegar o que "couber em sua variável", e o próximo read vai pegar o que couber da mesma linha.

Já o readln vai pegar o que "couber em sua variável", e descartar o resto, passando pra próxima linha.

Seguindo o exemplo de um site (leia fonte mais a seguir), imaginem o seguinte programa:


var numb1, numb2 : integer;
begin
writeln('Entre com dois numeros separados por um espaço');
read( numb1 );
read( numb2 );
writeln;
writeln('Numb1: ', numb1 , ' Numb2: ', numb2 )
end.

program READ;

Se o usuário entrasse, com apenas uma linha, assim:

237 64

Ele pegaria o possível pra primeira variável (237, já que é um inteiro e inteiro não aceita espaço. Sendo assim o fim da variavel) atribuindo-o ao "Numb1" e pegaria também o possível para a segunda variável (64, já que é o resto) atribuindo-o ao "Numb2". Exibindo normalmente:

Numb1: 237 Numb2: 64..

Agora, se no mesmo programa, colocassemos readln:


var numb1, numb2 : integer;
begin
writeln('Entre com dois numeros separados por um espaço');
readln( numb1 );
readln( numb2 );
writeln;
writeln('Numb1: ', numb1 , ' Numb2: ', numb2 )
end.

program READ;

E o usuário entrasse a mesma coisa:

237 64

Ele iria pegar o possível para a primeira variável (237, novamente somente até o espaço já que um espaço não é um numero inteiro) e DESCARTARIA O RESTO. Pulando para a próxima linha para pegar o "Numb2"..

Vejam outro exemplo:

Tenhamos o seguinte programa:


var a,b,c:char;
begin
writeln('Entre com dois valores');
readln( a );
read( b );
read( c);
writeln;
Writeln(a );
Writeln(b );
Writeln(c );
end.

program READ;

Se o usuário entrasse, por exemplo:

Clube

Hardware

O Readln pegaria o que cabe nele (por ser char, cabe apenas um char): C. E descartaria o resto (lube) pulando para a próxima linha.

O primeiro Read pegaria o que cabe nele (1 char): H, mas continuaria na linha. O segundo read pegaria o que cabe nele (1 char) que vem logo após: a.

Mas também pude perceber uma coisa.. por (como ja dito) não trabalhar com pascal puro, utilizo o Pascalzim para ajudar a galera aqui no fórum. Como sabemos, o Pascalzim não é um compilador "profissional" e não suporta diversas utilidades. No Pascalzim, o uso de Read ou ReadLN se torna aparentemente IGUAL. Já em outros compiladores, não sei informar. Mas a diferença entre read e readln é a dita acima.

Qualquer dúvida é só postar!

Fontes:

http://www.cmpe.boun.edu.tr/~say/c150/pascal/basicio.htm (inglês)

http://www.hkbu.edu.hk/~bba_ism/ISM2110/pas011.htm (inglês)

Abraços!

Olá,

Valeu Mog.Lucas por essas outras informações.

Só como dica pro pessoal: na dúvida usem sempre o readln, assim como também comentou kelson.23.

A não ser, obviamente, que queira justamente aproveitar destas características do read ^_^, mas se não for o caso é bom usar o readln, até para evitar possíveis conflitos com outros compiladores.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 2 meses depois...
  • 2 semanas depois...
  • 6 anos depois...

procurem em um site americano a diferencia e lá dizia que é  o comando Read pode ler variáveis em sequencia do tipo

 

READ(a,b,c) LEIA(a  então, B então C)

 

diferente do READLN que só  pode ler uma variavel por vez 

 

se quiser ver o site ta ai em baixo

 

http://borlandpascal.wikia.com/wiki/READ_and_READLN

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...
  • Membro VIP

O tópico está a algum tempo parado, mas vou tentar complementar:

 

Em 08/06/2010 às 14:25, viniciusbmatos disse:

Pelo que percebi, usar


read(x);
read(y);

é o mesmo que


readln(x,y);

Está correto? Corrijam-me se estiver errado.

A grosso modo: não. Não é mesma coisa.

 

Creio que:

read(x);
read(y);

Seja o mesmo que:

read(x,y);

Daí seguindo as características do que já foi citado nas outras postagens e também o que é citado no link.

 

Para o read:

Citação

the user has two two possibilities of inputting of the variables:

  • inputing the first, then ENTER, then inputing the second, then ENTER again and inputing the third, then ENTER again
  • inputing the first, leaving a space, inputing the second, then leaving another space, then inputing the third, then pressing ENTER

Ou seja:

Citação

o usuário tem duas possibilidades de entrada das variáveis:

  • introduzindo o primeiro, depois ENTER, depois entrando o segundo, depois ENTER novamente e entrando o terceiro, então ENTER novamente
  • inserindo o primeiro, deixando um espaço, entrando o segundo, depois deixando outro espaço, depois entrando o terceiro e pressionando ENTER

 

Resumindo: a princípio, a diferença está em usar o ln ou não. Usar junto ou váris comandos separados não faz diferença.

 

 

 

Em 18/06/2010 às 11:54, Maykon WN disse:

cara faz tempo que não programa em pascal mas acho que o read não pula linha e o readln

Como já comentado, não seria essa característica. Basta dá uma olhada nos comentários anteriores. Esse foi basicamente o motivo para criar esse tópico e tentarmos esclarecer sobre o tema e ver que não é isso.

 

 

 

 

Em 27/09/2016 às 12:56, Augusto G rocha disse:

procurem em um site americano a diferencia e lá dizia que é  o comando Read pode ler variáveis em sequencia do tipo

 

READ(a,b,c) LEIA(a  então, B então C)

 

diferente do READLN que só  pode ler uma variavel por vez 

 

se quiser ver o site ta ai em baixo

Como já sugere mais a cima, o readln também pode. Algo como:

 

readln(a,b,c);

Reforçando: creio eu que não tem diferença entre ler um a um (um read ou readln para cada variável) ou usar de uma vez com um único comando, este último serviria apenas para simplificar, ou seja, o que faz diferença é ter ln ou não... separado ou junto seria basicamente estética.

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