vsilvanf Posted September 26, 2013 at 06:45 PM Report #526155 Posted September 26, 2013 at 06:45 PM (edited) Fala galera...sou novo em pascal e preciso de uma ajuda para desenvolver o seguinte programa. Um programa em Pascal que leia um arquivo do tipo string (apenas palavras), exiba o conteúdo do arquivo em tela, e logo depois inverta as linhas, e por fim inverta também os caracteres de cada linha. Por exemplo: Escrever o Arquivo Original em tela: Linha A Linha B Linha C Logo Depois Inverter as linhas: Linha C Linha B Linha A E por fim inverter as linhas e as palavras: C ahniL B ahniL A ahniL Cheguei até aqui: Type Palavra = string[60]; Arquivo = File of Palavra; Var Dados : Arquivo; Imprimir o arquivo original: assign(Texto, 'c:\1.txt'); reset(Texto); while not eof(Texto) do begin read(Texto, Linha); writeln(Linha); end; Para imprimir as linhas ao contrario tentei assim(Mas não consegui, o programa nem roda, compila mas dá erro e não roda): assign(Texto, 'c:\1.txt'); reset(Texto); for i:=filesize(Texto) downto 1 do begin seek(Texto, i); read(Texto,Linha); writeln(Linha); end; Para inverter as linhas e palavras não consegui nada, pq nem consegui inverter as linhas. PS: Utilizo o Dev-Pascal. Obrigado Galera. Edited September 26, 2013 at 07:15 PM by thoga31 GeSHi
thoga31 Posted September 26, 2013 at 07:29 PM Report #526169 Posted September 26, 2013 at 07:29 PM Bem-vindo. Não chega dizer que tens um erro, deves dizer exactamente qual é o erro que estás a obter. Estás a obter erro pois não se pode usar readln e writeln com ficheiros binários, como estás a tentar fazer (File Of). Tens a certeza que deves fazer um file of string? Não será um text? Knowledge is free!
nunopicado Posted September 26, 2013 at 07:31 PM Report #526170 Posted September 26, 2013 at 07:31 PM Para começar, uma coisa a perceberes: O Assign só se usa uma vez para cada variável de ficheiro. No inicio do programa fazes o Assign e depois é só usar o ficheiro, não voltas a atribuir nada. Depois, há muitas formas de fazer o que pretendes. A mais simples será por ventura, usar um array. Lês todo o ficheiro para um Array, e memorizas quantas frases tens ao todo (vais incrementando um contador a cada leitura do ficheiro). Convém que leias o ficheiro com o Readln, e não com o Read. Caso contrário, ele vai assumir que as palavras são separadas a cada 60 caracteres (tamanho do registo que lhe indicas) e não a cada nova linha. Tendo todas as palavras no array, depois é só usar o FOR (com a característica DOWNTO em vez de TO) para tudo o resto. Um FOR DOWNTO DO para leres o ARRAY do fim para o principio, e escreveres as linhas no ecrã. Depois, outro FOR DOWNTO DO para leres as palavras de forma invertida (usa o LENGTH para saberes o tamanho das palavras). Tens a certeza que deves fazer um file of string? Não será um text? Há compiladores que não têm o TEXT, e nesse caso é File of String. Não sei se é o caso, que mal testei o Dev-Pascal, mas é possível! "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
thoga31 Posted September 26, 2013 at 07:35 PM Report #526173 Posted September 26, 2013 at 07:35 PM O Dev-Pascal usa uma versão antiga do Free Pascal, mas a última versão dele (descontinuada) tem suporte a text. Eu tenho na versão 2.6.0 do FPC e não consigo utilizar readln nem writeln com ficheiros binários. Tive de utilizar métodos alternativos. Knowledge is free!
nunopicado Posted September 26, 2013 at 08:04 PM Report #526176 Posted September 26, 2013 at 08:04 PM O Dev-Pascal usa uma versão antiga do Free Pascal, mas a última versão dele (descontinuada) tem suporte a text. Eu tenho na versão 2.6.0 do FPC e não consigo utilizar readln nem writeln com ficheiros binários. Tive de utilizar métodos alternativos. Ficheiros binários? "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
thoga31 Posted September 26, 2013 at 08:16 PM Report #526180 Posted September 26, 2013 at 08:16 PM Estas designações podiam ser uniformizadas, mas enfim. Ficheiro binário ou ficheiro tipado ou um ficheiro declarado com file of tipo. 😉 Knowledge is free!
vsilvanf Posted September 26, 2013 at 08:37 PM Author Report #526185 Posted September 26, 2013 at 08:37 PM (edited) Boa tarde thoga31 obrigado a ajuda. Na hora de compilar com o dev pascal não da erro não, ae coloco executar e abre a tela do prompt e ja fecha automaticamente, como se chegasse em uma determinada linha e achasse um erro de execução(por testes acho que é quando chega no seek). Para ler uso o read e não o readln(pq ja tentei usar e da erro mesmo). So uso o writeln para escrever a variavel linha, que esta definida como string. E infelizmente tem que ser com arquivo tipado mesmo, pois pedem que seja (preferiria o tipo text também). Abraços. Edited September 26, 2013 at 08:39 PM by vsilvanf
nunopicado Posted September 26, 2013 at 08:38 PM Report #526186 Posted September 26, 2013 at 08:38 PM Boa tarde Stack Overflow obrigado a ajuda. Stack Overflow? "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
thoga31 Posted September 26, 2013 at 08:41 PM Report #526188 Posted September 26, 2013 at 08:41 PM O nosso @nunopicado anda enferrujado 😄 Não se pode utilizar readln e writeln com ficheiro binários, apenas se pode utilizar read e write uma vez que, num ficheiro destes, não há noção de New Line. @vsilvanf, coloca o código inteiro para podermos ver o que pode estar a correr mal. Knowledge is free!
vsilvanf Posted September 26, 2013 at 08:42 PM Author Report #526189 Posted September 26, 2013 at 08:42 PM Boa tarde nunopicado, obrigado a ajuda também. Com relação ao Assign entendi o que você disse. Não entendi a parte do Readln, você quer dizer ler o texto usando o Readln e não o read? Mas não dá erro ? Testei aqui e não consegui. E quanto ao array você diz que cada linha que eu ler, gravar em um array, e apos gravado no array ler ele de traz para frente e invertendo os caracteres? Bom acho que vou realizar uns testes com essa dica, e volto a retornar pro forum. Abraços.
thoga31 Posted September 26, 2013 at 08:49 PM Report #526190 Posted September 26, 2013 at 08:49 PM (edited) A ideia do seek é boa e mais eficiente, a meu ver. Tens é um problema: seek é zero-based, o que significa que, para te posicionares no último elemento do ficheiro, tens de fazer isto: seek(ficheiro, FileSize(ficheiro) - 1); Aposto que é aqui que te ocorre o erro, não é preciso tanta volta com arrays. Edited September 26, 2013 at 08:49 PM by thoga31 1 Report Knowledge is free!
nunopicado Posted September 26, 2013 at 08:57 PM Report #526191 Posted September 26, 2013 at 08:57 PM O Readln funciona em TEXT. Em File Of efectivamente não. Já lá vão uns valentes anos desde que usei isto para ler ficheiros (TStringList, o meu grande amor! lol) "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
vsilvanf Posted September 26, 2013 at 09:11 PM Author Report #526195 Posted September 26, 2013 at 09:11 PM (edited) Thoga31 Também achei que o erro era do seek, mas tentei como você disse(segue abaixo) só que imprimi na ordem normal, não inverte as linhas não. assign(Dados, 'c:\1.txt'); reset(Dados); for i:=(filesize(Dados)- 1) downto 0 do begin seek(Dados, i); read(Dados,PalavraLida); writeln(PalavraLida); end; To quase partindo para o array mesmo :/ Edited September 26, 2013 at 09:19 PM by nunopicado Adicionada linguagem GeShi
thoga31 Posted September 26, 2013 at 09:36 PM Report #526197 Posted September 26, 2013 at 09:36 PM Acho que esse código está correcto. Se agora houver problemas, será noutra parte. Knowledge is free!
passarito Posted September 26, 2013 at 09:47 PM Report #526199 Posted September 26, 2013 at 09:47 PM Boas, Sim o array será mais fácil, mas penso que objectivo é trabalhares os ficheiros. O código está correcto, para verificares, altera o writeln para writeln(i,' - ',palavralida); isto vai-te indicar o número da posição do ficheiro para a qual ele escreve a linha
pwseo Posted September 27, 2013 at 04:21 PM Report #526347 Posted September 27, 2013 at 04:21 PM vsilvanf, Por vezes parece-me que tens dificuldade em explicar o que pretendes fazer -- tenho sérias dúvidas relativamente a ser necessário utilizar um file of string, por exemplo. Continuando, quando queremos ler strings de um ficheiro, utilizamos o tipo de dados text (ou textfile) que nos permite utilizar as readln e writeln sem termos que nos preocupar nós mesmos com os caracteres de mudança de linha. Utilizar seek em ficheiros de texto não é exequível, uma vez que não é possível determinar onde começa a linha seguinte (ou anterior) sem ler todos os caracteres até lá. Essa técnica funciona para estruturas de dados com tamanho bem definido. Claro que se a nossa definição de linha for string[60], então podemos utilizar seek, mas se for esse o caso, todo o exercício acaba por me parecer inútil. Por isso, encorajo-te a investigar a solução já mencionada: crias uma array de strings, para a qual lês o conteúdo do ficheiro em questão. Posteriormente modificas o conteúdo dessa array ao teu gosto, invertendo primeiro a ordem das strings, e depois a ordem dos próprios caracteres.
vsilvanf Posted September 27, 2013 at 05:46 PM Author Report #526380 Posted September 27, 2013 at 05:46 PM Pessoal Fiz das 2 formas utilizando os array e utilizando o arquivo. Queria Agradecer a ajuda de todo mundo ae. Obrigadão
thoga31 Posted September 27, 2013 at 07:59 PM Report #526393 Posted September 27, 2013 at 07:59 PM Podias colocar aqui as tuas soluções para referência futura 😉 Knowledge is free!
Suelen Passos Posted November 10, 2013 at 11:58 AM Report #532698 Posted November 10, 2013 at 11:58 AM (edited) program inverte(input{teclado}, output{tela}, dados{e/s}); type Palavra = string[30]; ArqDePalavras = file of Palavra; procedure mostrar(var a{e}: ArqDePalavras); var reg: Palavra; pos: integer; begin reset(a); pos:= 0; while not eof(a) do begin read(a, reg); writeln(output, 'Registro ', pos:2, ': ', reg); pos:= pos+1; end; writeln(output); close(a); end; function invertePalavra(pal{e}: Palavra): Palavra; begin if pal='' then invertePalavra:='' else invertePalavra:= invertePalavra(copy(pal, 2, length(pal)))+pal[1]; end; procedure trocar(var a{e/s}: ArqDePalavras; x{e},y{e}: integer); var registro, temp: Palavra; begin seek(a,x); read(a, registro); seek(a,y); read(a, temp); seek(a,y); write(a, invertePalavra(registro)); seek(a,x); write(a, invertePalavra(temp)); end; procedure inverter(var a{e/s}: ArqDePalavras); var atual: integer; begin reset(a); for atual:= 0 to (filesize(a)-1) div 2 do begin trocar(a, atual, filesize(a)-1-atual); end; close(a); end; procedure produzAleatorio(var a{e/s}: ArqDePalavras); var posicao, letra: integer; gerada: Palavra; begin rewrite(a); for posicao:= 0 to random(10)+1 do begin gerada:= ''; for letra:= 1 to random(25)+1 do gerada:= gerada+chr(65+random(10)); write(a, gerada); end; close(a); end; var dados: ArqDePalavras; nome: string; begin write(output, 'Nome do arquivo: '); readln(input, nome); assign(dados, nome); randomize; {para teste - nao cobrado} produzAleatorio(dados); {para testar - nao cobrado}; mostrar(dados); inverter(dados); mostrar(dados); readln(input); end. Edited November 10, 2013 at 12:29 PM by nunopicado Adicionada linguagem GeShi
thoga31 Posted November 10, 2013 at 03:09 PM Report #532709 Posted November 10, 2013 at 03:09 PM (edited) Uma vez que o membro @vsilvanf não teve a amabilidade de fornecer a solução, fica esta para referência futura. Obrigado, @Suelen Passos. (Nota: ao contrário do outro tópico, neste caso a colocação do código é aceitável uma vez que o OP do tópico desertou sem partilhar a solução que encontrou 😉 ) Edited November 10, 2013 at 03:10 PM by thoga31 Knowledge is free!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now